1. Android音频系统架构全景
Android音频系统采用分层设计,从应用层到内核驱动共包含六个关键层级。最上层是应用框架层,开发者通过android.media API与系统交互,比如使用AudioTrack播放PCM数据或通过AudioRecord采集麦克风输入。这些Java调用会通过JNI桥接进入原生层,在frameworks/av/media/libmedia中实现的核心C++类如AudioSystem负责参数校验和路由控制。
媒体服务器作为独立进程运行着音频系统的核心服务AudioFlinger和AudioPolicyService。前者管理所有音频流的混音和输出,后者制定路由策略决策。当应用创建AudioTrack时,会通过Binder IPC与这些服务通信,形成跨进程协作。HAL层作为抽象接口定义在hardware/libhardware/include/hardware/audio.h中,厂商需要实现如audio_hw_device这样的结构体,将标准操作映射到自家芯片的驱动指令。
2. 应用层到HAL的调用链路
当应用调用AudioTrack.write()时,数据会经由共享内存传递到AudioFlinger的PlaybackThread。以48kHz立体声为例,典型的音频缓冲区配置为1024帧(约21ms数据量)。在创建Track时,AudioFlinger会根据流类型(如MUSIC或ALARM)通过AudioPolicyManager查询输出设备(如扬声器或蓝牙耳机),这个过程涉及audio_policy_configuration.xml中预定义的策略规则。
HAL的open_output_stream()被调用时,需要配置符合AudioFlinger要求的参数:
cpp复制struct audio_config {
uint32_t sample_rate;
audio_channel_mask_t channel_mask;
audio_format_t format;
//...
};
厂商实现者需要在此处完成硬件编解码器初始化、DMA缓冲区分配等操作。在骁龙平台上,这可能涉及配置LPASS(低功耗音频子系统)的寄存器,而在Exynos芯片上则需要设置ABOX DS
