您好,登錄后才能下訂單哦!
在工作時(shí),往往有這樣一些需求:
1)希望針對(duì)不同的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)針對(duì)不同的audio stream type和不同的輸出設(shè)備,有不同的輸出音量值。
3)針對(duì)不同的audio stream type、不同的輸出設(shè)備、不同的應(yīng)用的audio track,同時(shí)播放時(shí),有不同的音量的需求。例如TTS、導(dǎo)航音、music聲音同時(shí)輸出時(shí),TTS聲音要提高,導(dǎo)航聲音要中間,音樂(lè)聲音要壓低。
4)如果接上,一般HDMI輸出是音頻和視頻同時(shí)輸出到HDMI外設(shè)的,如何做到HDMI只輸出視頻到HDMI外設(shè),例如顯示屏,但音頻留在本地speaker播放呢?
這些問(wèn)題,其實(shí)修改起來(lái),不同的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)針對(duì)不同的stream type和不同輸出設(shè)備,不同的音量level,有一個(gè)表格,表明輸出的音量值,此值,有來(lái)算出。此音量作為系統(tǒng)控制音量。叫做typevolume
3)應(yīng)用針對(duì)自己的audio track,有個(gè)track音量
混音時(shí),這些音量的乘積作為該track的最終音量。
上面是android framework針對(duì)audio stream流的音量數(shù)字放大倍數(shù)?;煲舭讯鄠€(gè)AudioTrack混音到特定輸出設(shè)備的mixerbuffer中。
Android的混音線程mixerthread是針對(duì)不同的輸出設(shè)備,不同的stream type,不同的音頻參數(shù)(例如不同采樣頻率)來(lái)創(chuàng)建和維護(hù)的。
對(duì)應(yīng)驅(qū)動(dòng)和硬件codec,還有一個(gè)模擬PA放大倍數(shù),這個(gè)針對(duì)“輸出設(shè)備”,上層通過(guò)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第幾格音量來(lái)設(shè)置)2.jpg》
《android audio架構(gòu)mixerthread的問(wèn)題.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ū)別問(wèn)題.txt》
《MTK 6753 audio V3架構(gòu)(音量設(shè)置參數(shù)的傳入和使用部分–根據(jù)streamtype、output device的類型、volume index第幾格音量來(lái)設(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錄音問(wèn)題.txt》
《關(guān)于audio不同stream type的音源在不同輸出設(shè)備上播放輸出的問(wèn)題.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ì)整理出來(lái)。但需要的整理時(shí)間比較長(zhǎng)。
另外我的相關(guān)培訓(xùn)視頻請(qǐng)看:
歡迎觀看我發(fā)布的各個(gè)課程: https://edu.51cto.com/lecturer/8896847.html
另外我的免費(fèi)的linux各種驅(qū)動(dòng)開(kāi)發(fā)課程如下:
https://edu.51cto.com/course/17138.html
我的新的更多優(yōu)惠的打包課程鏈接如下:
https://edu.51cto.com/sd/0a9d4
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。