Android audio系统服务
一、audioservice、audiomanager和audiosystem的关系
由图可知:
· AudioService继承自IAudioService.Stub。IAudioService.Stub类很明显是通过IAudioService.aidl自动生成的。AudioService位于Bn端。
· AudioManager拥有AudioService的Bp端,是AudioService在客户端的一个代理。几乎所有客户端对AudioManager进行的请求,最终都会交由AudioService实现。
· AudioService的功能实现依赖AudioSystem类,AudioSystem无法实例化,它是java层到native层的代理。AudioService将通过它与AudioPolicyService以及AudioFlinger进行交互。
二、audioflinger与audiopolicyservices的关系
Android音频系统的两大服务,一个服务是AudioPolicyService,另一个服务是audioflinger。这两大服务都在系统启动时有MediaSever加载,加载的代码位于:frameworks/base/media/mediaserver/main_mediaserver.cpp。
AudioFinger是Audio系统的工作引擎,管理者系统中输入输出音频流,并承担音频数据混音,以及读写Audio硬件等工作以实现数据的输入输出功能。AudioPolicyService是Audio系统策略控制中心,具体负责掌管系统中声音设备的选择和切换,音量控制等功能。而真正去执行选择和切换或者音量控制的动作是在AudioPolicyManager中进行的。
- AudioFlinger向下访问AudioHardware,实现输出音频数据,控制音频参数。同时,AudioFlinger向上通过IAudioFinger接口提供服务。AudioFlinger的相关代码主要在:frameworks/av/audioflinger/
- 具体audioflinger详细介绍参考:https://blog.****.net/droidphone/article/details/5951999
- audioflinger类内容及介绍:https://www.cnblogs.com/andriod-html5/archive/2011/08/15/2539563.html
-
AudioPolicyService主要完成以下任务:
- JAVA应用层通过JNI,经由IAudioPolicyService接口,访问AudioPolicyService提供的服务
- 输入输出设备的连接状态
- 系统的音频策略(strategy)的切换
- 音量/音频参数的设置
-
具体audiopolicy详细介绍参考:https://blog.****.net/droidphone/article/details/5949280
三、audiosystem
1、白手起家,没有父类。
2、定义了一堆枚举,包括stream类型,音频格式,音频channel等。
3、函数get_audio_flinger中,会获取AudioFlinger,然后创建一个AudioFlingerClient对象,并调用AudioFlinger的函数registerClient注册该AudioFlingerClient。
4、接下来,函数的实现,基本上都是通过调用AudioFlingerClient的函数来实现的。
包括(列的不全):
muteMicrophone
isMicrophoneMuted
setMasterVolume
setMasterMute
getMasterVolume
getMasterMute
setStreamVolume
setStreamMute
getStreamVolume
getStreamMute
setMode
isStreamActive
setParameters
getParameters
setVoiceVolume
5、函数get_audio_policy_service中获取AudioPolicyService,然后创建一个AudioPolicyServiceClient对象,并调用AudioPolicyService函数linkToDeath完成关联。
6、接下来一部分函数是通过调用AudioPolicyService的函数来实现的。
setDeviceConnectionState
getDeviceConnectionState
setPhoneState
setRingerMode
setForceUse
getForceUse
getOutput
startOutput
stopOutput
releaseOutput
getInput
startInput
stopInput
releaseInput
initStreamVolume
setStreamVolumeIndex
getOutputForEffect
registerEffect
unregisterEffect
7、接下来是对状态的判断以及一些辅助函数。