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中进行的。 

  1. JAVA应用层通过JNI,经由IAudioPolicyService接口,访问AudioPolicyService提供的服务
  2. 输入输出设备的连接状态
  3. 系统的音频策略(strategy)的切换
  4. 音量/音频参数的设置

三、audiosystem

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、接下来是对状态的判断以及一些辅助函数。

猜你喜欢

转载自blog.csdn.net/luhua187/article/details/88844673