android audio arch

时间:2024-04-05 20:39:16

come from : https://blog.csdn.net/qianxuedegushi/article/details/79297866 

android audio arch

ALSA System on Chip(ASoC)驱动将一个audio子系统分成四个部分:
Machine driver, Platform driver, CPU driver以及Codec driver。
 

Machine 驱动 :
将平台,CPU以及codec驱动绑定在一块
实现在kernel/sound/soc/msm/<chipset.c>


定义前端FE和后端BE,DAI(digital audio interface) links
platform 驱动:
包括了平台相关的音频数据流的传输和路由的控制
被区分成FE和BE两个平台驱动

FE :

Audio -例化PCM播放和采集,将播放的pcm数据从用户空间传递给DSP,采集是逆过程高通使用ASM接口,实现于kernel/sound/soc/msm-pcm-q6.c

提供了ALSA SoC framework需要的FE PCM设备信息,由平台驱动提供的ASoC framework和音频路由表可以指示PCM 播放/采集。
FE CPU DAI实现于kernel/sound/soc/msm/msm-dai-fe.c

Voice-初始化和销毁语音电话建立,实现与kernel/sound/soc/msm-pcm-voice-v2.c
VoIP-初始化和销毁MVS接口在DSP和用户空间互传数据。kernel/sound/soc/msm-pcm-voip-v2.c
Compress offload-Compress offload 播放数据传输到DSP。kernel/sound/soc/msm-compress-q6-v2.c

BE :

根据初始化的PCM播放和采集配置DSP AFE模块对应的audio 音频端口

定义了BE CPU DAI实现于kernel/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c

Routing-audio 通路选择,kernel/sound/soc/msm-pcm-routing-v2.c

 

CPU driver :

分为FE和BE CPU驱动

Codec 驱动 User Spcace Moudles :
Audio Hardware Abstraction Layer(AHAL)使用tinyalsa将Audioflinger调用映射到ASoC驱动
tinyalsa -kernel Asoc驱动接口,AHAL使用,提供了stream和设备管理需要的基本PCM和Mixer控制API
Audio Route-该模块从XML文件读取ALSA mixer控制器,并根据AHAL设置mixer控制器。
Multimedia framework-stagefright   1) 使用标准音频格式的播放和采集;2)和编解码库以及OpenMAX IL组件通信,实现音频编解码
Audio service  1) 运行时服务,由system server启动,server manager管理; 2) 注册intents,当接收到来自不同应用(HDMI,Bluetooth)的信息后通知Audio系统
Audio Flinger   1) 通过libaudio,蓝牙A2DP管理所有音频输入/输出设备,2) 将多个audio stream合成单一PCM,混合的output输出源被路由给输出设备 3) music stream播放的音量控制
Audio Policy Manager(APM) 1) 定义了多个音频源并发的管理策略,管理各种输入/输出设备接口mic,speaker,headphone,headset,a2dp,bluetooth sco  2) 设置场景(电话,音乐,系统音,通知) 3) 基于stream模式选择和定义合适的路由策略.定义了音频类型(语音,播放,ring)在何种设备上播放(Bluetooth ,speaker,headset). 4)管理每一个stream的音量.

Audio Output Stream and  Volume Control :

android audio arch

缺省的音频输出(primary output)使用AudioFlinger中的Mixer线程,音量和音效将在Flinger中使用
Lowlatency输出使用Audioflinger中的快速mixer,音量控制在Flinger中
Compress offload播放使用audio flinger中的compress offload线程,音量和音效在DSP中。

Voip播放在Audioflinger中的mixerthread,  volume 和echo cancelation 由DSP完成。

 

设备和流管理 :

android audio arch

 

Frontend DAI :

  • 对用户空间作为PCM设备可见
  • 可以将Audio路由到多个BE DAI
  • Routing 由用户空间mixer 控制
  • PCM由ALSA直接控制
  • 定义于 msm-dai-fe.c                      

static struct snd_soc_dai_driver msm_fe_dais[]={  
  .playback = {  
     .stream_name = "Multimedia1 Playback",  
     .aif_name = "MM_DL1",  
     .rates  
...  
  }    

}  

当front DAI使能时,AIF将会被使能。

用户空间和audio相关的代码用于调试和定制化:

 

msm8974 – Contains the audio Hardware Abstraction Layer (HAL)-related code  
  
<APSS_BUILD>/external/tinyalsa/ – Contains the code related to tinymix, tinyplay, and tinycap  
  
<APSS_BUILD>/hardware/qcom/audio/mm-audio – Contains the implementation of QTI OMX components for the audio encoder and decoders  
  
<APSS_BUILD>/frameworks/av/media/libstagefright/ – Contains the source code for Google’s Stagefright implementation  
  
<APSS_BUILD>/frameworks/av/media/libmediaplayerservice/nuplayer - Contains the source code for Google’s nuplayer implementation  
  
<APSS_BUILD>/frameworks/av/services/audioflinger/ – Contains the source code for AudioFlinger that manages audio streams from the user space  
  
<APSS_BUILD>/vendor/qcom/proprietary/mm-audio/ – Contains the code related to the Audio Calibration Database (ACDB) driver, parsers for DTS and AC3, surround sound, SVA, etc.  
  
<APSS_BUILD>/external/bluetooth/bluedroid/ – Contains the code related to Bluetooth® (BT) A2DP used in a QTI platform  
  
<APSS_BUILD>/external/bluetooth/bluedroid/audio_a2dp_hw/ – Contains the A2DP audio HAL implementation  
  
<APSS_BUILD>/hardware/libhardware/modules/usbaudio/ – Contains the USB HAL implementation for a USB dock use case  
  
<APSS_BUILD>/hardware/qcom/audio/hal/audio_extn/:  
  
audio_extn.c – Implements the wrapper function for audio extension features, such as FM, Dolby, Compress capture, HFP, SVA (listen), speaker protection, SSR, USB audio over headset  
  
usb.c – Contains the HAL implementation for USB playback and record over the headset  
  
compress_capture.c – Contains the HAL implementation for Compress capture  
  
dolby.c – Contains the HAL implementation for the Dolby postprocessing feature  
  
fm.c – Contains the HAL implementation for the FM playback and recording feature  
  
hfp.c – Contains the HAL implementation for the hands-free profile feature where the MSM™ chipset can be used as as a BT headset device  
  
listen.c – Contains the HAL implementation for the Snapdragon™ Voice Activation (SVA) feature  
  
spkr_protection.c – Contains the HAL implementation for the speaker protection feature  
  
ssr.c – Contains the HAL implementation for the surround sound recording feature  
  
<APSS_BUILD>/vendor/qcom/proprietary/wfd/mm/source/framework/src/ – Contains the Wi-Fi Display (WFD) frameworks-related code; WFDMMSourceAudioSource.cpp configures the RT Proxy port via ALSA APIs and gets the PCM data from the audio layer  
  
<APSS_BUILD>/system/core/include/system/ – Contains audio.h and audio_policy.h that contain enum definitions and inline functions used all over the code for audio in the user space  
  

<APSS_BUILD>/frameworks/base/media/java/android/media/ – Contains .java files for audio that expose APIs that can be called by Android™ applications written in Java  

 

内核空间代码 :
<APSS_BUILD>/kernel/sound/soc/msm/ – Contains the msm8994.c machine driver  
  
<APSS_BUILD>/kernel/sound/soc/msm/qdsp6v2 – Contains the source code for the platform drivers, Frontend (FE), and Backend (BE) DAI driver, QDSP drivers for AFE, ADM, and ASM, voice driver, etc.  
  
<APSS_BUILD>/kernel/sound/soc/soc-*.c – All the soc-*.c files provide information on the ALSA SOC framework  
  
<APSS_BUILD>/kernel/drivers/slimbus/ – Contains the source for the SLIMbus driver  
  
<APSS_BUILD>/kernel/arch/arm/mach-msm/qdsp6v2/ – Contains the drivers for DSP-based encoders and decoders, code for the ADSP loader, APR driver, Ion memory driver, and other utility files  
  
<APSS_BUILD>//LINUX/android/kernel/arch/arm/boot/dts – Contains msm8994-*.dtsi files that contain MSM8994-specific information;board-specific information on the MSM8994;GPIO management ; audio-related customization is available in files such as msm8994.dtsi, msm8994-mtp.dtsi, and msm8994-cdp.dtsi  
  
<APSS_BUILD>/LINUX/android//kernel/sound/soc/codecs/ – Contains the source code for the codec driver for WCD9330; codec driver-related source files are wcd9330.c, wcd9xxx-mbhc.c, wcd9xxx-resmgr.c, wcd9xxx-common.c, etc.  
  
<APSS_BUILD>//LINUX/android/kernel/drivers/mfd/ – Contains the source code for the codec driver; wcd9xxx-core.c, wcd9xxx-slimslave.c, and wcd9xxx-irq.c are the codec driver-related files