ALSA PCM回调有哪些限制?

Tom*_*est 5 c concurrency asynchronous callback alsa

我正在Linux下编写一个程序,该程序同时使用ALSA(连接到自定义设备)进行回放和记录。我想将异步回调体系结构用于读取和写入数据。

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

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

非常感谢您可以带给人们的任何见解。

Per*_*rry 3

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

我曾拼命尝试在几个异步应用程序中使用 ALSA。它是如此的有缺陷,文档很少,而且很难使用,经过几天的努力,我最终放弃了。

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

回想起来,ALSA 令人惊讶地过于复杂、设计过度、有缺陷、文档不完善、与设计者事先没有想到的 I/O 复用技术不兼容等等。——我很难理解为什么它最终成为 Linux 的标准系统,而其他 Unix 操作系统上也有更简单、更好的设计。

  • 仅仅因为您必须使用 ALSA 驱动程序并不意味着您必须使用 ALSA API——您可以使用 OSS 兼容层作为您的 API,而不是使用 ALSA API。我就是做这个的。 (2认同)