Audio 即音頻, 也就是控制著手機中的各種聲音的輸出,比如說,音樂的播放,音量大小,按鍵音,插入耳機,聲音從耳機播放,連接藍牙,聲音從藍牙耳機中播放。還有壹些HiFi播放, offload播放,高清播放。
常見的問題如下:
POP音,漏音,聲音卡頓,耳機無法識別,還有壹些音頻通路等問題,還有壹些穩定性的問題如:ANR、CRASH、tombstone。還有壹些安全漏洞的問題(主要是核心庫那裏)。
回歸正題
-------華麗的分割線-------
audio分為? 應用層,fwk層,native fwk, hal層。
常見的文件有MediaPlayer.java、 AudioSystem.java、 AudioService.java、AudioManager.java 文件路徑(framework/base/media)
AudioFlinger.cpp、AudioTrack.cpp、 AudioPolicyManager.cpp、 Threads.cpp、Tracks.cpp、 Engine.cpp、 Audiosystem.cpp? 文件路徑(framework/av)
audio_hw.c? 文件路徑(vendor/)
java文件我在這裏就不過多的說了,沒啥好講的,主要說壹下c++文件吧。
AudioFlinger 是音頻策略的執行者, AudioPolicyManager是制作音頻策略的,AudioTrack是負責播放從上層傳過來的PCM數據,簡單的說就是負責播放的。?
audio_hw 是每個HAL層的文件,每個手機廠商自己定制的文件。當然Google也有。
壹般呢,我們處理音頻相關的問題呢,有壹些特定的套路,需要AP 側的log, 有時還需要kernel 的log,? 當然最主要的是需要音頻數據。也就是出現問題時,的聲音數據,讓我們可以快速的定位出現問題的位置。
簡單的說下播放壹首歌曲的流程:(以Android O 為例)
上層創建壹個MediaPlayer對象,然後調用NuPlayer框架(播放器),NuPlayer先將當前歌曲的文件信息讀取,采樣率,比特率,等之類的東西。然後開始調用audio decoder (音頻解碼器)? 將解碼出來的PCM數據傳給AudioTrack,? Audiotrack 會創建壹個Track,(每壹個播放都會創建壹個屬於自己的track,不用了就銷毀,最多可以同時創建32個),經過AudioFlinger重采樣之後,送到HAL層,HAL層在經過壹些混音,降噪之類的處理,將聲音送到Codec,然後送給硬件輸出,進行播放。
這個是壹個大概的播放流程,如果我們在播放過程中遇到了壹些問題,比如說是fwk層的問題,我們就在AudioTrack與AudioFlinger之間尋問題的原因。
比如說,播放無聲,我們需要看AudioPolicyManager中的壹些策略是不是將當前的track給mute了。或者是壹些其他的原因等。
這裏只是簡單的介紹下Audio,Audio算是壹個較為復雜的模塊,還需要好好的研究。