Audio 使用ALSA,如何用麦克风录制通过扬声器播放的内容?

Audio 使用ALSA,如何用麦克风录制通过扬声器播放的内容?,audio,capture,playback,pcm,alsa,Audio,Capture,Playback,Pcm,Alsa,我正在尝试使用以下ALSA API记录演讲者刚刚听到的内容: snd_pcm_mmap_writei() snd_pcm_mmap_readi() 两个函数在同一线程中逐个调用。writei()函数返回得很快(我相信它会在播放缓冲区可用时返回),而readi()会返回,直到捕获指定的样本为止。但捕获的样本并不是刚刚播放出来的。我猜ALSA不是在双工模式下,也就是说,它必须先完成播放,然后开始录制,这只记录了点击,没有任何意义。扬声器仍然正确地播放声音 所有硬件/软件参数设置正确。如果我只做音频

我正在尝试使用以下ALSA API记录演讲者刚刚听到的内容:

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

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


有人对如何进行这项工作提出了建议吗?

您不需要使用
mmap
功能;正常的
writei
/
readi
调用就足够了

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


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

您必须配置声音硬件,将声音从播放设备路由回捕获设备。你这样做了吗?我的目的是测试我的扬声器是否工作正常,所以我必须捕捉讲话中的声音。因此,从播放到捕获的环回并没有设置。为什么在同一个程序中执行此操作?你能不能只运行
aplay
arecord
?是的,aplay和arecord肯定能工作,但我需要让我的应用程序在运行时使用缓冲区来检测扬声器故障。我发现这两个ALSA API需要放在不同的线程中,以便同步它们,这仍然很难从声音播放的确切时刻捕获声音。