⾳频系统⽅案
audio系统⼀硬件架构1 总体架构:
2 Pxa955与codec和BT的连接:
3 CP中的编解码模块和voice enhancement component:
4 ABU的部架构:
DMA传输分为两种模式:中断驱动传输和⾃动DMA传输。中断驱动传输是当数据请求条件满⾜时,产⽣中断,在中断处理函数⾥配置DMA,启动传输。
采⽤的是⾃动DMA数据传输。当数据从⽤户空间拷贝到核buffer后,当核buffer不为空时,配置ABU和DMA的参数,启动DMA,当ABU的SysRxFiFo中的数据⼩于播放⽔位线,即有空间从DMA接收数据时,产⽣DMA请求,DMA控制器获得数据请求后,启动传输。每传输完DMA的⼀个描述符后,产⽣⼀次中断,在中断函数中,更新ABU和核buffer 的指针状态,分配下⼀个DMA描述符缓冲区的地址。5 Codec的部架构:
Codec中的增益放⼤器
所⽤到的codec通路
LEVANTE_AnaMIC1_TO_PCM_L 通话时,MIC通路LEVANTE_AnaMIC1_LOUD_TO_PCM_L 通话免提时,MIC通路LEVANTE_AnaMIC2_TO_PCM_L 通话插⽿机时,MIC通路LEVANTE_PCM_L_TO_EAR_VIA_DAC1 通话时,听筒通路LEVANTE_PCM_L_TO_SPKR_VIA_DAC1 通话免提时,SPEAKER通路LEVANTE_PCM_L_TO_HS 通话插⽿机时,⽿机通路LEVANTE_I2S_TO_EAR_VIA_DAC1 ⽤听筒放⾳频的通路LEVANTE_I2S_TO_SPKR_VIA_DAC1 ⽤SPERKER放⾳频的通路LEVANTE_I2S_TO_HS ⽤⽿机放⾳频的通路LEVANTE_AnaMIC1_LOUD_TO_PCM_L_APPS APPS录⾳时,MIC通路
LEVANTE_AnaMIC2_TO_PCM_L_APPS 插着⽿机⽤APPS录⾳时,⽿机上的MIC通路LEVANTE_I2S_TO_SPKR_HS 插着⽿机,来电铃⾳通路⼆软件架构1架构图
2控制流和数据流的路径控制流:AP HiFi 播放/录⾳
Android audio system → Marvel HAL → ALSA Lib → Ctrl Plugin → Audio Server → AM → ACM → Levante Component →ALSA Lib → Levante Kernel Driver → Levante Audio HW CodecCP voice call 通路/⾳量控制
Android audio system → Marvell HAL → ALSA Lib → Ctrl Plugin → Audio Server → AM → ACM → Levante Component →ALSA Lib → Levante Kernel Driver → Levante Audio HW Codec
Android audio system → Marvell HAL → ALSA Lib → Ctrl Plugin → Audio Server → AM→ ACM → audio stub → Communication subsystemCP voice call MUTE 控制
Android RIL →Marvell Telephony →Audio Server →AM →ACM →audio stub →Communication subsystem数据流:AP HiFi 播放
Android audio system → Marvell HAL → ALSA Lib → ALSA core/ABU driver → Levante Audio HW CodecAP HiFi 录⾳
Levante Audio HW Codec →ALSA core/ABU driver →ALSA Lib →Marvell HAL →Android audio system
AP 向CP发送数据进⾏播放
Android audio system → Marvell HAL → ALSA Lib → PCM Plugin → Audio Server →AM → ACM → audio stub →Communication subsystemCP录⾳发送到AP
Communication subsystem→ audio stub→ ACM → AM → Audio Server → PCM Plugin →ALSA Lib → Marvell HAL → Androidaudio system3软件各功能块描述3.1 Marvell HAL3.1.1 功能
通过ALSA Lib连接Android audio system和Marvell 的硬件系统。从Android audio system获取⾳频路由通知,发送到Audio Server
从Android audio Apps获取⾳频数据,通过ALSA Lib发送到codec或者Communication subsystem。从ALSA Lib获取数据发送到Android audio Apps。3.1.2 代码位置
vendor/marvell/generic/libaudio/AudioHardware.cppvendor/marvell/saarbmg1/libaudiopath/AudioPath.c3.1.3 通路配置实例
通过以下函数来配置路由通知。
void enable_audio_path_for_device(uint32_t devices, unsigned char left, unsigned char right) voiddisable_audio_path_for_device(uint32_t devices)
void set_volume_for_device(uint32_t devices, unsigned char left, unsigned char right) 其中,enable_audio_path_for_device将参数device与结构数组audio_path_list[]中各个数组元素的device成员进⾏匹配,然后调⽤相匹配的数组元素的enable成员所指向的函数,⽐如enable_loud_speaker。