簡單的ARM+Linux音訊方案

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

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

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

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

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

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

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

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

簡單的ARM+Linux音訊方案簡單的ARM+Linux音訊方案

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

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

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

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

alsactl store

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

alsactl restore

原文來自:


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

相關文章