1. 程式人生 > >關於android audio路由策略的修改

關於android audio路由策略的修改

gets html 使用 fault 連接 buffer available ger 文件

關於android audio路由策略的修改

在工作時,往往有這樣一些需求:
1)希望針對不同的audio stream type(例如music、tts), 有輸出到不同的輸出設備(例如speaker、headset、BT、usb audio等)的需求,另外還有輸出設備的優先級的需求。例如AUX(headset) > BT > FMTX > speaker。即例如BT連接了,那麽音頻就輸出到BT,而不是FM發射。
2)針對不同的audio stream type和不同的輸出設備,有不同的輸出音量值。
3)針對不同的audio stream type、不同的輸出設備、不同的應用的audio track,同時播放時,有不同的音量的需求。例如TTS、導航音、music聲音同時輸出時,TTS聲音要提高,導航聲音要中間,音樂聲音要壓低。

4)如果接上,一般HDMI輸出是音頻和視頻同時輸出到HDMI外設的,如何做到HDMI只輸出視頻到HDMI外設,例如顯示屏,但音頻留在本地speaker播放呢?

這些問題,其實修改起來,不同的android版本涉及到不同的函數。

Android KK:

AudioPolicyManagerBase.cpp
AudioPolicyManagerBase.cpp::getDeviceForStrategy() 決定音頻路由策略。
MTK的 AudioMTKPolicyManager.cpp

Android L:

AudioPolicyManager.cpp
AudioPolicyManager::getDeviceForStrategy() 決定音頻路由策略。

MTK的:
AudioPolicyManager::computeVolume() ? computeCustomVolume() 計算音量
AudioALSAHardware.cpp ::GetAudioCommonData() ::GetAudioCustomVol()

Android M:

AudioPolicyManager.cpp
AudioPolicyManager::getDeviceForStrategy()
還有Engine.cpp ::getDeviceForStrategy() ::getStrategyForUsage() ::getOutputForAttr()等。 決定音頻路由策略。

frameworks/av/services/audioflinger/Threads.cpp
AudioFlinger::MixerThread::prepareTracks_l() 關於各個audio track輸出音量的混音控制最終接口。

Android O:

與Android M類似。

一定要註意Audio Policy相關的文件,這些是實現音頻路由策略的核心。

另外要理解audio的 output device和 available output device。
支持熱插拔的輸出設備(例如AUX headset、HDMI),靠的是WiredAccessoryManager.java文件實現的。註意閱讀這個代碼。

關於音量控制需要註意:
1)根據音效,有一個masterVolume
2)系統針對不同的stream type和不同輸出設備,不同的音量level,有一個表格,表明輸出的音量值,此值,有來算出。此音量作為系統控制音量。叫做typevolume
3)應用針對自己的audio track,有個track音量
混音時,這些音量的乘積作為該track的最終音量。
上面是android framework針對audio stream流的音量數字放大倍數。混音把多個AudioTrack混音到特定輸出設備的mixerbuffer中。
Android的混音線程mixerthread是針對不同的輸出設備,不同的stream type,不同的音頻參數(例如不同采樣頻率)來創建和維護的。

對應驅動和硬件codec,還有一個模擬PA放大倍數,這個針對“輸出設備”,上層通過Kcontrol調用驅動接口設置到硬件,具體看linux ALSA架構。

最終的效果是數字放大和模擬放大的綜合結果。

參考我自己的文檔:
《MTK 6753 audio V3架構(音量設置參數的傳入和使用部分–根據streamtype、output device的類型、volume index第幾格音量來設置)2.jpg》
《android audio架構mixerthread的問題.jpg》
《MTK 6753 android L audio 路由策略架構1(這種分層決定的策略也是個架構的好方法).jpg》
《MTK 6753 android L audio 路由策略架構2.jpg》
《關於android和ios的audio音量設置的區別問題.txt》
《MTK 6753 audio V3架構(音量設置參數的傳入和使用部分–根據streamtype、output device的類型、volume index第幾格音量來設置–是個好架構).jpg》
《MTK 6753 audio V3架構(mic部分,包括頻率轉換、格式轉換、音量增強Bes處理等)1.jpg》
《MTK 6753 audio V3架構 audio captue client的創建.jpg》
《audio左右聲道的排列和處理.docx》
《mtk audio codec2.jpg》
《關於MTK的nv中的audio參數.txt》
《MTK audio 雙mic錄音問題.txt》
《關於audio不同stream type的音源在不同輸出設備上播放輸出的問題.txt》
《audio concept 概念 i2s等 AEC回聲消除.docx》
《關於MTK audio policy(Android M 6755)路由策略.JPG》
《關於MTK audio tuning tool 設置的speaker、headphone等使用情景下的低通濾波器參數配置文件(audio_hcf_default.h、audio_acf_default.h)的代碼調用方式.txt》
《關於audio設計需要註意的.txt》
《MTK audio.txt》

關於Android audio的整體框架,後面我會整理出來。但需要的整理時間比較長。

另外我的相關培訓視頻請看:
歡迎觀看我發布的各個課程: https://edu.51cto.com/lecturer/8896847.html

另外我的免費的linux各種驅動開發課程如下:
https://edu.51cto.com/course/17138.html

關於android audio路由策略的修改