6

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

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

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

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

4

1 回答 1

3

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

我拼命地尝试在几个异步应用程序中使用 ALSA。它是如此的错误,记录不充分且难以使用,经过几天的努力使我最终放弃了。

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

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

于 2012-02-28T23:54:57.327 回答