ALSA PCM调用的语义

时间:2013-11-06 01:04:16

标签: c linux audio capture alsa

您好我正在编写一个必须同时从三个输入设备捕获的程序(在这种情况下,它是三个相同的USB网络摄像头)。

首先,ALSA不是基于熟悉的UNIX范例“一切都是文件”所以我不能使用常规poll(3)调用;知道数据流应该在所有设备中保持稳定,现在我做的事情如下:

while(!stop)
  for(i = 0; i < input_device_count; i++)
  {
    snd_pcm_readi(handle[i], buffer, frames);
    write(fd_out[i], buffer, size);
  }

此代码遍历每个设备并从中读取,将结果写入先前打开的文件。它有效,但我怀疑有更好的方法来做到这一点,也使用mmap,所以我不必再从内核空间复制到用户和内核。

暂时让我们假设三个输入保持同步;上述代码仍不能保证我将同时开始从三个设备开始录制。有办法保证吗?实际上,snd_pcm_prepare()和snd_pcm_start()等调用的语义是什么?现在我没有使用它们,我只是直接去snd_pcm_readi()。

我试图搜索代码示例,但我没有找到任何与多个捕获同时有关的内容。任何提示都将不胜感激!

1 个答案:

答案 0 :(得分:2)

ALSA基于熟悉的UNIX范例“一切都是文件”;所以要处理多个设备,你应该使用poll(3)。

有多个ALSA插件在多个文件之上实现,因此每个PCM设备可能有多个句柄。 为每个设备调用snd_pcm_poll_descriptors_count以了解您需要多少pollfd个结构,然后调用snd_pcm_poll_descriptors以获取文件句柄和相应的event位。

在您的循环中,在致电poll后,您不得直接阅读pollfd结构中的vales,而是致电snd_pcm_poll_descriptors_revents将其翻译回来。


要确保多个设备同时启动,请致电snd_pcm_link。 但是,这并不能保证设备以相同的速度运行。