linux_sound_alsa_Android+alsa音訊系統中的幾個問題
從alsa的角度由下往上看:linux中有alsa驅動層,其中,/sound/core/pcm_native.c檔案中的snd_pcm_f_ops是alsa驅動層對alsa_lib層的介面;Android中有alsa_lib層(在donut/external/alsa_lib目錄下)和alsa應用層;
從Android的角度由下往上看:首先是cpp庫層,然後是框架層,最後是Java應用層。庫層分3個部分:首先是硬體介面層AudioHardwareInterface,其派生類負責呼叫alsa_lib介面,形成read、write等虛擬函式;其次是音訊環層AudioFlinger,利用多型的性質呼叫硬體介面層AudioHardwareInterface派生類的read、write等虛擬函式並最終管理read和write兩個執行緒。最後,是媒體錄音MediaRecorder和媒體播放層MediaPlayer。進入或啟用read/write執行緒,實現錄音放音功能。
2.Android中音訊配置檔案問題:
配置檔案/system/etc/asound.conf其實是alsa體系留的一手。alsa體系提供了這樣一種機制:應用層直接改變音訊codec的
暫存器,具體而言:linux驅動中建立snd_kcontrol_new控制結構,並關聯到codec暫存器,asound.conf檔案通過控制結構名字,
就能關聯到暫存器,從而改變暫存器的值。asound.conf檔案主要用來做Android音訊的路由控制:不同路由可以設定多個暫存器
的不同配置組合,形成不同的音訊通道,從而當路由改變時,底層codec通道隨之改變。
3.Android中音訊取樣頻率、通道數問題:
Android向下強制設定:播放時,雙聲道(立體聲),取樣頻率為44.1kHz,當SD卡中音訊檔案是單聲道或者頻率不是44.1kHz時,Android會自動處理,使得送給驅動的資料流是雙聲道44.1kHz。錄音時,單聲道,取樣頻率固定為8kHz,因為手機上生成的一般是amr或者3gpp壓縮格式,檔案要儘量小,便於彩信等應用的傳輸。對做音訊驅動的同志來說就很好了,只需要悉心配置好兩種頻率。
4.音訊無聲:
通用codec晶片wm9714、alc5620之類的都有迴環模式loopback,可以先用loopback模式把mic的錄音送到spk,有聲音說明
晶片大部分邏輯很正常;接著,應該調通控制介面,能讀寫codec暫存器;最後再除錯I2S、ac97等數字介面。
在dma中斷中新增列印可以讓資料流一目瞭然。
5.音訊效果不好:
通常是頻率問題,記住DAC、ADC的頻率必須設定好,他們一般由codec晶片中PLL分頻產生。有些晶片要求把ADC、DAC
等模組上電後,才能設定其頻率,否則無效,但是能寫入,這是極容易忽視的一個問題。削頂失真,調小音量可以解決。