在工作時(shí),往往有這樣一些需求:
1)希望針對不同的audio stream type(例如music、tts), 有輸出到不同的輸出設(shè)備(例如speaker、headset、BT、usb audio等)的需求,另外還有輸出設(shè)備的優(yōu)先級(jí)的需求。例如AUX(headset) > BT > FMTX > speaker。即例如BT連接了,那么音頻就輸出到BT,而不是FM發(fā)射。
2)針對不同的audio stream type和不同的輸出設(shè)備,有不同的輸出音量值。
3)針對不同的audio stream type、不同的輸出設(shè)備、不同的應(yīng)用的audio track,同時(shí)播放時(shí),有不同的音量的需求。例如TTS、導(dǎo)航音、music聲音同時(shí)輸出時(shí),TTS聲音要提高,導(dǎo)航聲音要中間,音樂聲音要壓低。
4)如果接上,一般HDMI輸出是音頻和視頻同時(shí)輸出到HDMI外設(shè)的,如何做到HDMI只輸出視頻到HDMI外設(shè),例如顯示屏,但音頻留在本地speaker播放呢?
創(chuàng)新互聯(lián)建站主營順城網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,順城h5小程序制作搭建,順城網(wǎng)站營銷推廣歡迎順城等地區(qū)企業(yè)咨詢
這些問題,其實(shí)修改起來,不同的android版本涉及到不同的函數(shù)。
Android KK:
AudioPolicyManagerBase.cpp
AudioPolicyManagerBase.cpp::getDeviceForStrategy() 決定音頻路由策略。
MTK的 AudioMTKPolicyManager.cpp
Android L:
AudioPolicyManager.cpp
AudioPolicyManager::getDeviceForStrategy() 決定音頻路由策略。
MTK的:
AudioPolicyManager::computeVolume() ? computeCustomVolume() 計(jì)算音量
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() 關(guān)于各個(gè)audio track輸出音量的混音控制最終接口。
Android O:
與Android M類似。
一定要注意Audio Policy相關(guān)的文件,這些是實(shí)現(xiàn)音頻路由策略的核心。
另外要理解audio的 output device和 available output device。
支持熱插拔的輸出設(shè)備(例如AUX headset、HDMI),靠的是WiredAccessoryManager.java文件實(shí)現(xiàn)的。注意閱讀這個(gè)代碼。
關(guān)于音量控制需要注意:
1)根據(jù)音效,有一個(gè)masterVolume
2)系統(tǒng)針對不同的stream type和不同輸出設(shè)備,不同的音量level,有一個(gè)表格,表明輸出的音量值,此值,有來算出。此音量作為系統(tǒng)控制音量。叫做typevolume
3)應(yīng)用針對自己的audio track,有個(gè)track音量
混音時(shí),這些音量的乘積作為該track的最終音量。
上面是android framework針對audio stream流的音量數(shù)字放大倍數(shù)。混音把多個(gè)AudioTrack混音到特定輸出設(shè)備的mixerbuffer中。
Android的混音線程mixerthread是針對不同的輸出設(shè)備,不同的stream type,不同的音頻參數(shù)(例如不同采樣頻率)來創(chuàng)建和維護(hù)的。
對應(yīng)驅(qū)動(dòng)和硬件codec,還有一個(gè)模擬PA放大倍數(shù),這個(gè)針對“輸出設(shè)備”,上層通過Kcontrol調(diào)用驅(qū)動(dòng)接口設(shè)置到硬件,具體看linux ALSA架構(gòu)。
最終的效果是數(shù)字放大和模擬放大的綜合結(jié)果。
參考我自己的文檔:
《MTK 6753 audio V3架構(gòu)(音量設(shè)置參數(shù)的傳入和使用部分–根據(jù)streamtype、output device的類型、volume index第幾格音量來設(shè)置)2.jpg》
《android audio架構(gòu)mixerthread的問題.jpg》
《MTK 6753 android L audio 路由策略架構(gòu)1(這種分層決定的策略也是個(gè)架構(gòu)的好方法).jpg》
《MTK 6753 android L audio 路由策略架構(gòu)2.jpg》
《關(guān)于android和ios的audio音量設(shè)置的區(qū)別問題.txt》
《MTK 6753 audio V3架構(gòu)(音量設(shè)置參數(shù)的傳入和使用部分–根據(jù)streamtype、output device的類型、volume index第幾格音量來設(shè)置–是個(gè)好架構(gòu)).jpg》
《MTK 6753 audio V3架構(gòu)(mic部分,包括頻率轉(zhuǎn)換、格式轉(zhuǎn)換、音量增強(qiáng)Bes處理等)1.jpg》
《MTK 6753 audio V3架構(gòu) audio captue client的創(chuàng)建.jpg》
《audio左右聲道的排列和處理.docx》
《mtk audio codec2.jpg》
《關(guān)于MTK的nv中的audio參數(shù).txt》
《MTK audio 雙mic錄音問題.txt》
《關(guān)于audio不同stream type的音源在不同輸出設(shè)備上播放輸出的問題.txt》
《audio concept 概念 i2s等 AEC回聲消除.docx》
《關(guān)于MTK audio policy(Android M 6755)路由策略.JPG》
《關(guān)于MTK audio tuning tool 設(shè)置的speaker、headphone等使用情景下的低通濾波器參數(shù)配置文件(audio_hcf_default.h、audio_acf_default.h)的代碼調(diào)用方式.txt》
《關(guān)于audio設(shè)計(jì)需要注意的.txt》
《MTK audio.txt》
關(guān)于Android audio的整體框架,后面我會(huì)整理出來。但需要的整理時(shí)間比較長。
另外我的相關(guān)培訓(xùn)視頻請看:
歡迎觀看我發(fā)布的各個(gè)課程: https://edu.51cto.com/lecturer/8896847.html
另外我的免費(fèi)的linux各種驅(qū)動(dòng)開發(fā)課程如下:
https://edu.51cto.com/course/17138.html
我的新的更多優(yōu)惠的打包課程鏈接如下:
https://edu.51cto.com/sd/0a9d4