【技術乾貨】原來ARM+Linux音訊方案如此簡單!

武漢永珍奧科發表於2022-07-13

  嵌入式產品開發中經常遇到音訊的輸入輸出問題,如何為其新增“喇叭”、“麥克風”裝置呢?本文將簡單介紹ARM+Linux產品中的音訊解決方案。

  我們先認識下I2S(Inter-IC Sound)匯流排。I2S又稱積體電路內建音訊匯流排,該匯流排專門用於音訊裝置之間的資料傳輸,廣泛應用於各種多媒體系統。它採用了沿獨立的導線傳輸時鐘與資料訊號的設計,透過將資料和時鐘訊號分離,有效避免因時差誘發的失真。

  以HDG2L-IoT評估套件為例,RZ/G2L處理器提供至少一路I2S匯流排,透過該匯流排與音訊編解碼晶片(IC型號WM8960)連線,用於提供高質量的錄音播音功能。音訊模組的硬體部署如下所示。

 

HDG2L-IoT音訊介面

圖1  HDG2L-IoT音訊介面

  G2L核心板與WM8960的音訊通訊引腳如下所示:

音訊通訊引腳


  在Linux系統的音訊編解碼驅動中,透過I2C通訊介面與音訊IC通訊,把音訊IC內的各個功能暫存器抽象成音訊控制元件,這樣使用者即可在User空間內直接調整IC內的引數。I2S音訊引腳,則是數字訊號傳送、接收的通道。

播音時,音訊IC接收到數字訊號後則轉換為模擬訊號傳送出去,錄音時,音訊IC把收到的音訊模擬量轉換為數字量,傳送給處理器。

  ALSA是linux的主流音訊體系結構,它包含核心驅動集合, API 庫和工具對 Linux 聲音進行支援,應用程式只要呼叫alsa-lib提供的API,即可以完成對底層音訊硬體的控制。

  Linux透過alsa庫以及alsa工具管理音訊IC的控制元件,透過“amixer controls”列出當前系統內的音訊控制項: 


音訊控制項


  音訊功能的關鍵控制元件資訊如下所示。(錄音通道、播音通道、耳機音量大小、喇叭音量大小)。


音訊功能的關鍵控制元件資訊


  在開發板下,執行aplay程式可以對音訊播放進行測試。在測試前,需要將耳機插入開發板的耳機插孔中。

為測試基於I2S的音訊輸出介面,在命令列下執行如下命令:

5.jpg

  其中2.wav為需要播放的音訊檔案,且此處假定2.wav位於/home/root/audios目錄下。

在進行音訊播放時,對於基於I2S的音訊輸出介面,可以使用amixer程式對音量進行調節。使用amixer程式對耳機播放音量進行調節的命令列格式為:

6.jpg

  其音量值取值範圍在0~127之間,127表明最大音量。例如要將音量設定為100,可在命令列下執行如下命令:

7.jpg

  將揚聲器接入HDG2L-IOT開發板的左右聲道插座中,在播放音訊前可先設定揚聲器播放音量以及總音量,然後播放音訊檔案:


8.jpg


  錄音功能需設定錄音控制元件的引數,如下所示。

9.jpg

  用arecord命令錄音並儲存為“/tmp/t.wav”,然後用aplay命令回放進行驗證。

10.jpg


  由於當前的麥克風輸出訊號僅接到了音訊處理的Left端作為輸入,所以播放錄音檔案時僅左聲道有輸出,若希望將麥克風輸出訊號同時記錄在左右聲道可做如下設定:

11.jpg

  將“ADC Data Output Select”設定為1,其值含義為“Left Data = Left ADC;  Right Data = Left ADC”。

  由上可知,音訊編解碼晶片在Linux系統中以控制元件的形式存在,內部的引數一般只記錄在記憶體中,當系統掉電時,修改的引數就會消失,所以需要儲存和恢復指令將上次的引數儲存在配置檔案中。

  alsa的配置檔案為:/var/lib/alsa/asound.state

  控制元件修改後的寫入操作如下所示。

12.jpg

  控制元件恢復引數的操作如下所示(注:重啟板子後會自動讀取配置檔案)。

13.jpg


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009145/viewspace-2905536/,如需轉載,請註明出處,否則將追究法律責任。

相關文章