當前位置:編程學習大全網 - 編程語言 - 在linux下如何進行放音和錄音

在linux下如何進行放音和錄音

錄音:mic接到codec,經過adc變成數字信號,經過待續2中ac97等接口存儲到cpu的fifo中,經過待續1中的dma傳輸存儲到內存,經過待續3中alsa_lib中snd_pcm_readi接口傳給錄音軟件,經過編碼,進而形成音頻文件。

放音:播放軟件將音頻文件解碼,並通過待續3中snd_pcm_writei接口逐漸傳遞到和dma相關的內存,經過待續2中dma傳遞給cpu的fifo,再經過ac97等接口傳遞給dac,最後傳給連接在codec上的speaker。

心得:

1.ac97數據傳輸頗復雜,分時復用,cpu端fifo和codec端adc/dac關系要對應好。比如,cpu端的pcm left fifo占用slot3,那麽adc只有配置成slot3才能把數據傳遞給它,如果配置成slot6,那就傳給cpu的mic in fifo了。錄音單聲道通常選擇slot6,錄音雙聲道通常兩個adc分別選擇slot3和slot4。

2.wav音頻文件大小計算:要測試錄音是否丟禎,就必然要計算文件大小,通常的方法是:根據錄音時間,用公式:錄音時間(單位s)x采樣率x(采樣位數/8)x通道數。比如,錄音時間5秒,采樣率8kHz,位數16位,通道數1,那麽5x8000x(16/8)x1=80k,實際的wav文件大小稍大於80k就對了。還有壹種計算文件大小的方法:通常音頻系統要用dma,也會用到dma中斷,可以在dma中斷中打印計數,次數xdma中斷周期字節就行了。

3.數據交換的大小問題:待續1中DMA傳輸必須和FIFO的特性匹配:若FIFO位寬是16位,深度是16,並且半滿時向DMA發出請求(握手),則鏈表式DMA必須配置成傳輸位寬16位,1次突發16字節,才能保證不丟失位數和數據個數。待續2中cpu端FIFO位數要和codec端adc/dac采樣位數匹配,i2s/pcm接口可以配置成壹樣的值,比如16位,ac97接口復雜壹點,cpu端不用配置,那麽采樣位數是多少呢?若cpu端fifo壹個聲道位寬16位,codec端adc/dac位寬18位,ac97通道20位,則傳輸到fifo端就被截取到有效的16位,整體采樣位數16位,adc/dac的性能沒有充分發揮而已。待續3中snd_pcm_readi、snd_pcm_writei函數第三個參數表示讀寫數據的大小,單位是禎,不是字節。雙聲道16位格式壹禎大小為4字節

  • 上一篇:匠人精神讀後感範文三篇
  • 下一篇:壹款APP該怎麽制作
  • copyright 2024編程學習大全網