gpt4 book ai didi

c - ALSA PCM调用的语义

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:36 25 4
gpt4 key购买 nike

您好,我正在编写一个程序,它必须同时从三个输入设备(在这种情况下,它是三个相同的 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()。

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

最佳答案

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

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

在你的循环中,在调用poll 之后,你不能直接读取pollfd 结构中的值,而是调用snd_pcm_poll_descriptors_revents。将它们翻译回来。


要保证多个设备同时启动,调用snd_pcm_link .但是,这并不能保证设备将以相同的速度运行。

关于c - ALSA PCM调用的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19802162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com