ALSA PCM 回调都有哪些限制?

Posted

技术标签:

【中文标题】ALSA PCM 回调都有哪些限制?【英文标题】:What are the restrictions on an ALSA PCM callback?ALSA PCM 回调有哪些限制? 【发布时间】:2012-03-18 10:57:02 【问题描述】:

我正在 Linux 下编写一个程序,该程序使用 ALSA(连接到自定义设备)同时利用播放和记录。我想使用异步回调架构来读写​​数据。

但是,我无法获得任何有关我在回调中被允许执行的操作的限制的信息。具体来说,我必须是异步安全的吗?如果是这样,这似乎严重限制了可以做的事情,因为除其他外,我不应该引用任何全局变量,这使得例如从执行主线程填充的缓冲区读取或写入变得相当困难到一个缓冲区,该缓冲区随后被保存到回调之外的文件中。

我可以在 ALSA 回调中使用任何 C 并发构造来协调全局变量与主线程的使用吗?例如,我可以使用 POSIX 信号量吗?我是否可以保证 ALSA 回调相对于主线程是原子的(我知道它对其他 ALSA 回调不是原子的)?

非常感谢人们对此提出的任何见解。

【问题讨论】:

只是为了让您知道,这里有一个链接描述了为什么使用这些 API 可能不是一个好主意。 0pointer.de/blog/projects/guide-to-sound-apis.html 谢谢!信息量很大。可悲的是,它是针对第三方设备的,所以我坚持使用 ALSA。 但是你还在坚持使用异步 API 吗? 不,但我在主循环中遇到文件 I/O 阻塞太久的问题,导致缓冲区欠载,所以我想我会在主循环中使用异步回调来解决它fflush 上的档位。正如我刚刚发现的那样,通过 NFS 对文件进行 fflush 甚至会导致 ALSA 回调延迟 200 毫秒,所以aynch 可能根本救不了我…… 【参考方案1】:

我不知道这个答案是否会被人们认为对 ALSA 过于消极,但无论如何我都会给出。

我拼命地尝试在几个异步应用程序中使用 ALSA。它非常有缺陷,文档记录不完善且难以使用,经过几天的努力使我最终放弃了。

我最终使用了 ALSA OSS 仿真层并简单地为声音设备打开一个 fd 并使用 libevent 作为一种异步回调的方式。这个解决方案对我来说非常有效,我对结果非常满意——我已经使用了一段时间了。

回想起来,ALSA 过于复杂、过度设计、漏洞百出、文档记录不充分、与设计者事先没有想到的 I/O 多路复用技术不兼容等等——我很难理解为什么它最终会成为Linux 系统中的标准,而在其他 Unix 操作系统上可以使用更简单和更好的设计。

【讨论】:

感谢您的回答。不幸的是,非 ALSA 解决方案不是一种选择(我使用 ALSA 作为多通道设备的接口,该设备包含带有 ALSA 设备驱动程序的 DAC/ADC)。 您必须使用 ALSA 驱动程序并不意味着您必须使用 ALSA API——您可以使用 OSS 兼容层作为您的 API,而不是使用 ALSA API。我就是这么做的。 哦!我没有意识到这一点。我马上查一下。谢谢。 在某些 linux 平台上,顺便说一句,这可能需要将 ALSA OSS 兼容性模块加载到您的内核中,但默认情况下它通常是可用的。

以上是关于ALSA PCM 回调都有哪些限制?的主要内容,如果未能解决你的问题,请参考以下文章

Linux ALSA驱动之三:PCM创建流程源码分析(基于Linux 5.18)

使用 Apollo+Vue:“更新”回调都有哪些参数?

Linux ALSA驱动之三:PCM创建流程源码分析(基于Linux 5.18)

Linux ALSA驱动之三:PCM创建流程源码分析(基于Linux 5.18)

ALSA driver--PCM

ALSA:snd_pcm_writei 返回 EAGAIN