2013-04-13 78 views
0

我想记录一下是刚打出来的扬声器使用以下ALSA的API:使用ALSA,如何使用麦克风录制它通过扬声器播放的内容?

snd_pcm_mmap_writei() 
snd_pcm_mmap_readi() 

这两个函数被调用一个在同一个线程未来。 writei()函数快速返回(我相信一旦播放缓冲区可用,它就会返回),而readi()返回,直到捕获指定的样本。但是捕获的样本不是刚刚发布的样本。我猜测ALSA不处于双工模式,即它必须先完成回放,然后开始记录,记录没有意义,但只是点击。扬声器仍能正确播放声音。

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

有人有建议如何使这项工作?

+0

您必须配置您的声音硬件才能将播放设备的声音传送回捕捉设备。你做了这个了吗? –

+0

我的目的是测试我的扬声器是否正常工作,所以我必须捕捉声音中的声音。因此,从回放到捕获的环回未设置。 –

+0

你为什么在同一个程序中这样做?你不能只运行'aplay'和'arecord'? –

回答

0

您不需要使用mmap函数;正常的writei/readi调用就足够了。

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

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

相关问题