0

我正在尝试使用以下 ALSA API 录制刚刚向扬声器播放的内容:

snd_pcm_mmap_writei()
snd_pcm_mmap_readi()

这两个函数在同一个线程中被一个接一个地调用。writei() 函数快速返回(我相信它会在播放缓冲区可用时返回),而 readi() 会返回直到捕获指定的样本。但捕获的样本并不是刚刚播出的。我猜ALSA不是双工模式,也就是说,它必须先完成播放,然后开始录制,它没有任何意义,只是点击。扬声器仍能正确播放声音。

所有硬件/软件参数均已正确设置。如果我只做音频捕捉,我会得到一个很好的声波。PCM 句柄以正常模式(非非阻塞,非异步)打开。

有人对如何使这项工作提出建议吗?

4

1 回答 1

0

您不需要使用这些mmap功能;正常的writei/readi电话就足够了。

要同时处理两个 PCM 流,请在单独的线程中运行它们,或者使用非阻塞模式,以便同一个事件循环可以处理两个设备。

您需要在播放数据之前填充播放缓冲区,并且只有在填充了捕获缓冲区后才能读取捕获数据,因此总体延迟是播放缓冲区大小加上捕获周期大小加上任何硬件延迟和声音传播延迟.

于 2013-04-16T07:14:16.193 回答