【问题标题】:ALSA async mode doesn't invoke callback functionALSA 异步模式不调用回调函数
【发布时间】:2020-02-18 20:51:03
【问题描述】:

我编写了一个简单的 C++ 包装器,表示基于 ALSA API 的 AudioStream。在我看来,使用异步模式非常方便。不幸的是,为异步模式注册的回调函数没有被调用。

snd_async_add_handler() 的 alsa 文档指出:

此函数将回调函数与给定文件相关联,并将此关联保存在 snd_async_handler_t 对象中。 每当为文件 fd 引发 SIGIO 信号时,将调用回调函数,其参数指向此函数返回的异步处理程序对象。 SIGIO 信号的 ALSA sigaction 处理程序自动将通知多路复用到已注册的异步回调。 但是,应用程序负责指示设备驱动程序生成 SIGIO 信号。 SIGIO 信号可能已被另一个信号替换,请参阅 snd_async_handler_get_signo。

尤其是粗体部分很有趣。这是否意味着用户必须以某种方式配置驱动程序才能生成这些 SIGIO?我猜 SIGIO 只是某种中断,所以必须启用驱动程序生成中断??? 我希望这是通过 hw_params 配置左右 ALSA 的责任。

我唯一能找到的是在下面的链接中,其中的答案表明 ASYNC 已被弃用,但是,从 ALSA 文档来看,这似乎不是真的。

ALSA - managing async IO

ALSA 文档供参考: https://www.alsa-project.org/alsa-doc/alsa-lib/group___global.html#gafd936c40505997bb659b74bd368636b8

【问题讨论】:

    标签: alsa libalsa


    【解决方案1】:

    snd_async_add_pcm_handler()snd_async_add_handler() 的包装器并自动启用信号。

    你应该snd_pcm_open()调用中指定SND_PCM_ASYNC

    而且你必须使用真正支持生成信号的设备。

    并且您的信号处理程序不得使用除list of async-signal-safe functions 之外的任何函数。

    【讨论】:

    • 感谢您的回答。那么当参数总是设置为 0 时,SNC_PCM_ASYNC 和 snd_pcm_open() 函数中的“mode”参数有什么意义呢?这有点令人困惑。我在嵌入式设备上,所以我假设一个设备也可以理解为负责音频的外围设备 - DAI 左右,对吧?
    • 我还尝试在无限循环中通过 snd_pcm_avail_update 读出可用帧的数量——因为异步回调没有运行——结果我总是得到 0。我希望得到一些合理的价值......
    猜你喜欢
    • 2012-03-01
    • 2017-11-27
    • 1970-01-01
    • 2017-06-08
    • 2015-01-22
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    相关资源
    最近更新 更多