0

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

alsa 文档指出snd_async_add_handler()

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

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

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

ALSA - 管理异步 IO

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

4

1 回答 1

0

snd_async_add_pcm_handler()是一个包装器snd_async_add_handler()并自动启用信号。

而且您不应该SND_PCM_ASYNC通话中snd_pcm_open()指定。

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

并且您的信号处理程序不得使用除异步信号安全函数列表中的函数之外的任何函数

于 2020-02-19T07:43:02.020 回答