Android 源码分析 - 声音 - Native层

本文深入探讨了Android的音频框架,包括libmedia库中的关键组件如AudioEffect、AudioRecord和AudioTrack,以及它们在音频处理、参数管理和缓存操作中的作用。此外,还介绍了AudioFlinger服务的内部工作机制,如线程管理、设备处理和电源管理。同时,提到了AudioPolicyService和AudioResampler的功能。最后,概述了mediaserver进程如何启动和管理这些服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

libmedia

        源代码位于:frameworks/av/media/libmedia。

类名

说明

AudioEffect

创建、控制音效引擎。封装IEffect接口,实际Effect对象由AudioFlinger创建。AudioEffect::EffectClient实现IEffectClient接口,处理Effect的回调。

AudioParameter

处理配置参数的工具类,内部保存一个字典。

AudioRecord

封装IAudioRecord接口,实际对象由AudioFlinger创建。AudioRecord:: AudioRecordThread生成回调事件并调用回调。

AudioSystem

提供静态方法调用AudioFlinger和AudioPolicyService的接口方法;注册AudioFlingerClient,接收回调用于在本地建立OutputDescriptor数据缓存。

AudioTrack

封装IAudioTrack接口,实际对象由AudioFlinger创建。AudioTrack:: AudioTrackThread生成回调事件并调用回调。

audio_track_cblk_t

维护客户、服务对共享缓存的使用情况,同步跨进程访问,需要创建在共享内存上。当由服务提供共享内存时,使用AudioTrackSharedStreaming维护读写指针,当客户提供共享内存时,使用AudioTrackSharedStatic维护。

AudioTrackSharedStreaming

通过两个位置标示客户端和服务端的读写位置。

AudioTrackSharedStatic

有一个仅包含一个StaticAudioTrackState元素的循环队列,客户端将循环播放请求通过该队列传给服务端。

Proxy

类体系封装对共享缓存的操作,Proxy为其子类保存共享缓存属性。

ClientProxy

继承Proxy,处理客户这边的缓存申请释放操作。

AudioTrackClientProxy

继承ClientProxy,增加了设置音量等逻辑。

StaticAudioTrackClientProxy

继承AudioTrackClientProxy,增加设置循环播放方式的接口。

AudioRecordClientProxy

简单继承了ClientProxy。

ServerProxy

继承Proxy,处理服务这边的缓存申请释放操作,实现缓存获取释放。

AudioTrackServerProxy

继承ServerProxy,增加了获取音量设置等逻辑。

StaticAudioTrackServerProxy

继承AudioTrackServerProxy,重新实现缓存申请释放操作,根据循环播放方式返回缓存。

ServerProxy

简单继承了ServerProxy。

libscheduling_policy

        设置调度优先级,好像没有什么地方使用。

        源代码位于:frameworks/av/services/audioflinger。涉及源文件:

  1. ISchedulingPolicyService.cpp
  2. SchedulingPolicyService.cpp

libaudioresampler

        源代码位于:frameworks/av/services/audioflinger。涉及源文件:

  1. AudioResampler.cpp.arm
  2. AudioResamplerCubic.cpp.arm
  3. AudioResamplerSinc.cpp.arm

libaudioflinger

        源代码位于:frameworks/av/services/audioflinger。

        AudioFlinger::ThreadBase定义一个基本的线程,主要功能有:

  1. 维护声音配置属性

        修改属性有:mSampleRate、mFrameCount、mChannelMask、mChannelCount、mFrameSize、mFormat。

  1. 提供配置线程同步机制

        使用mNewParameters保存配置参数,mWaitWorkCV通知内部线程,mParamStatus返回配置执行状态,mParamCond通知外部客户。

  1. 处理配置事件

        有IoConfigEvent、PrioConfigEvent两类事件。mConfigEvents用作线程内外中转队列,mWaitWorkCV用于同步唤醒,processConfigEvents执行。

  1. 维护声音设备

mStandby、mOutDevice、mInDevice(audio_devices_t)、mAudioSource

  1. 维护声音句柄和音效

mId(audio_io_handle_t)、mEffectChains、mSuspendedSessions。

  1. 电源管理

        申请释放POWERMANAGER_PARTIAL_WAKE_LOCK 锁,mWakeLockToken、mDeathRecipient。

        AudioFlinger::ThreadBase::TrackBase代表一个声音流,持有AudioFlinger::Client对象引用,

        AudioFlinger::ThreadBase::TrackBase实现ExtendedAudioBufferProvider接口

        AudioFlinger::PlaybackThread继承AudioFlinger::ThreadBase,管理多个Track(mTracks、mActiveTracks),其线程函数循环处理混音、音效、输出。

        AudioFlinger::AsyncCallbackThread辅助转发HAL的回调,当设置并且HAL支持异步输出时,AudioFlinger::PlaybackThread创建并管理AsyncCallbackThread。

mediaserver

        源代码位于:frameworks/av/media/mediaserver。

        mediaserver启动AudioFlinger、AudioPolicyService。

        服务名分别是“media.audio_flinger”、“media.audio_policy”。

frameworks/av/media/mediaserver/main_mediaserver.cpp:

-------------------------------------------------------------------------

AudioFlinger::instantiate();

MediaPlayerService::instantiate();

CameraService::instantiate();

AudioPolicyService::instantiate();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值