一、Android 13音頻代碼結構
1、framework:
android/frameworks/base
1.AudioManager.java :音頻管理器,音量調節、音量UI、設置和獲取參數等控制流的對外API
2.AudioService.java :音頻系統服務(java層),音量調節、音量UI、音頻設備插拔等控制流的具體實現
3.AudioSystem.java :音頻控制的入口,是native層對上服務的接口
android/frameworks/av
1.AudioFlinger.cpp :音頻系統的核心一,承擔音頻數據流AudioTrack和AudioRecord的混音、重采、輸送等責任
2.AudioPolicyService.cpp :音頻系統的核心二,負責音頻策略,包含Audio HAL的加載,音頻路由的選擇等
2、HAL
android/hardware/aw/audio/ :AudioFlinger與音頻驅動之間的對接層,匹配android系統與硬件的關鍵層
3、整體框圖
其中運行在AudioServer進程中的AudioFlinger和AudioPolicyService,以及運行在SystemServer進程中的AudioService這三個模塊是Android音頻子系統的核心
(1)播放
通過C++類AudioTrack將音頻數據寫入AudioTrack和AudioFlinger都能訪問的共享內存中,該共享內存由audio_track_cblk_t管理。AudioFlinger在接收到數據后,調過自己的播放線程輸出
(2)錄音:
硬件設備采集PCM數據,AudioFlinger使用AudioStreamIn將數據讀取到共享內存,AudioRecord則從共享內存中在讀取這些數據。
HAL----->AudioFlinger------->共享內存------>AudioRecord
二、ASoC音頻驅動構成
1、ASoC音頻驅動由三部分構成:platform,codec,machine
(1)Machine :
????????單獨的 Platform 和 Codec 驅動是不能工作的,它必須由 Machine 驅動把它們結合在一起才能完成整個設備的音頻處理工作。
Machine :可以理解為對開發板的抽象,開發板可能包括多個聲卡,對應Machine部分包含多個link。
dai_link:machine驅動中定義的音頻數據鏈路,它指定用到的cpu_dai、codec_dai
(2)Platform:
????????它包含了該 SoC 平臺的音頻 DMA 和音頻接口的配置和控制(I2S,PCM 等等);一般不包含與板子或 codec 相關的代碼。
????????在具體實現上,ASoC又把Platform驅動分為兩個部分:snd_soc_platform_driver和snd_soc_dai_driver。其中,platform_driver負責管理音頻數據,把音頻數據通過dma或其他操作傳送至cpu dai中,dai_driver則主要完成cpu一側的dai的參數配置,同時也會通過一定的途徑把必要的dma等參數與snd_soc_platform_driver進行交互。
cpu dai:在嵌入式系統里面通常指CPU的I2S、PCM總線控制器,負責將音頻數據從I2S tx FIFO搬運到CODEC(回放的情形,錄制則方向相反)。cpu_dai通過snd_soc_register_dai()來注冊。
(3)Codec:
????????它包含了一些音頻的控件 (Controls),音頻接口,DAMP(動態音頻電源管理)的定義和某些 Codec IO 功能。為了 保證硬件無關性,任何特定于平臺和機器的代碼都要移到 Platform 和 Machine 驅動中。
2、PCM數據流
回放
錄音
3、ASoC音頻驅動注冊流程
?主要步驟為下述部分:
4、 ALSA設備文件結構??
contro1C0 ------> ? ? ? ? ? ? ?用于聲卡的控制,例如通道選擇,混音,麥克風的控制等。pcmC0D0c ------> ? ? ? ? ? ? ?用于錄音的pcm設備pcmC0D0p ------> ? ? ? ? ? ? ?用于播放的pcm設備seq ?????? ------> ? ? ? ? ? ? ?音序器timer?????? ------> ? ? ? ? ? ? ? 定時器
? ? ? ? 其中,C0D0代表的是聲卡0中的設備0,pcmC0D0c最后一個c代表capture,pcmC0D0p最后一個p代表playback,這些都是alsa-driver中的命名規則。