【发布时间】: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 可能根本救不了我……
标签: c asynchronous concurrency callback alsa