2013-04-13 82 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流,請在單獨的線程中運行它們,或者使用非阻塞模式,以便相同的事件循環可以處理這兩個設備。

您需要在播放數據之前填充播放緩衝區,並且只有在捕獲緩衝區填滿之後才能讀取捕獲數據,因此總體延遲時間爲播放緩衝區大小加上捕獲週期大小加上任何硬件延遲和聲音傳播延遲。

相關問題