0. 專用術語
1. 物理結構
2. 系統架構
本文基於Freescale IMX平臺Codec ALC5625爲例。
0. 專用術語
ASLA - Advanced Sound Linux Architecture
OSS - 以前的Linux音頻體系結構,被ASLA取代併兼容
Codec - Coder/Decoder
I2S/PCM/AC97 - Codec與CPU間音頻的通信協議/接口/總線
DAI - Digital Audio Interface 其實就是I2S/PCM/AC97
DAC - Digit to Analog Conversion
ADC - Analog to Digit Conversion
DSP - Digital Signal Processor
Mixer - 混音器,將來自不同通道的幾種音頻模擬信號混合成一種模擬信號
Mute - 消音,屏蔽信號通道
PCM - Pulse Code Modulation 一種從音頻模擬信號轉換成數字信號的技術,區別於PCM音頻通信協議
採樣頻率 - ADC的頻率,每秒採樣的次數,典型值如44.1KHZ
量化精度 - 比如24bit,就是將音頻模擬信號按照2的24次方進行等分
SSI - Serial Sound Interface
DAPM - Dynamic Audio Power Management
1. 物理結構
音頻編解碼器Codec 負責處理音頻信息,包括ADC,DAC,Mixer,DSP,輸入輸出以及音量控制等所有與音頻相關的功能。
Codec與處理器之間通過I2C總線 和 數字音頻接口DAI(IIS)進行通信。
I2C總線 - cpu通過它 實現對Codec寄存器數據的讀寫。
DAI(IIS) - 實現音頻數據在CPU和Codec間的通信。
以Codec作爲研究對象,它的輸入有Mic(Microphone),PhoneIn電話信號等,輸出有耳機HP(HeadPhone),揚聲器Speaker和PhoneOut電話信號。另外需要注意在Codec與CPU端間也有音頻數字信號的輸入輸出。
1) 播放音樂
2) 錄音
3) 電話
--- 打電話 --- --- 接聽---
4) 通過藍牙打電話
--- 打電話 --- --- 接聽---
2. 系統架構
Android的音頻系統擁有一個比較標準和健全的架構,從上層應用,java framework服務AudioMananger,本地服務AudioFlinger,抽象層AlsaHAL,本地庫,再調用external的Alsa-lib外部支持庫,最後到底層驅動的codec,可謂"五臟俱全"。
以系統啓動AuidoFlinger爲例,簡要窺探Alsa Sound的組織架構。
Java服務AudioManager作爲服務端,本地服務AudioFlinger作爲客戶端,兩者通過Binder機制交互。AudioFlinger對硬件功能的具體實現(比如setMode設置電話/藍牙/錄音等模式)交給硬件抽象層AlsaHAL完成。抽象層可以調用本地標準接口,比如mASLADevice->route,或者直接調用Alsa-lib庫去操作底層驅動。
Linux的音頻驅動結構相對複雜,源碼位於內核目錄下的/sound/soc/,其中/codec文件夾下存放與平臺無關的編解碼器驅動,/imx文件夾下存放於freescale imx平臺相關的音頻驅動,主要可分爲SSI驅動和DAI驅動。
以聲卡驅動的數據結構爲切入點分析,
1) struct snd_soc_codec - 由與平臺無關的codec驅動實現。
2) struct snd_soc_platform - 由與imx平臺相關的DAI驅動實現,主要實現了音頻數據的DMA傳輸功能。
3) struct snd_soc_dai_link - 將平臺相關的DAI與平臺無關的codec聯繫起來。