AudioPolicyService 和 AudioPolicyManager
来源:互联网 发布:上海网络安全员培训 编辑:程序博客网 时间:2024/05/17 01:48
引言
AudioPolicyService是Android音频系统的两大服务之一,另一个服务是AudioFlinger,这两大服务都在系统启动时有MediaSever加载,加载的代码位于:frameworks/base/media/mediaserver/main_mediaserver.cpp。AudioFlinger主要负责管理音频数据处理以及和硬件抽象层相关的工作。本文主要介绍AudioPolicyService。
AudioPolicyService
AudioPolicyService主要完成以下任务:
- JAVA应用层通过JNI,经由IAudioPolicyService接口,访问AudioPolicyService提供的服务
- 输入输出设备的连接状态
- 系统的音频策略(strategy)的切换
- 音量/音频参数的设置
AudioPolicyService的构成
进一步说明:
1. AudioPolicyService继承了IAudioPolicyService接口,这样AudioPolicyService就可以基于Android的Binder机制,向外部提供服务;
2. AudioPolicyService同时也继承了AudioPolicyClientInterface类,他有一个AudioPolicyInterface类的成员指针mpPolicyManager,实际上就是指向了AudioPolicyManager;
3.AudioPolicyManager类继承了AudioPolicyInterface类以便向AudioPolicyService提供服务,反过来同时还有一个AudioPolicyClientInterface指针,该指针在构造函数中被初始化,指向了AudioPolicyService,实际上,AudioPolicyService是通过成员指针mpPolicyManager访问AudioPolicyManager,而AudioPolicyManager则通过AudioPolicyClientInterface(mpClientInterface)访问AudioPolicyService;
4. AudioPolicyService有一个内部线程类AudioCommandThread,顾名思义,所有的命令(音量控制,输入、输出的切换等)最终都会在该线程中排队执行;
AudioPolicyManager
AudioPolicyService的很大一部分管理工作都是在AudioPolicyManager中完成的。包括音量管理,音频策略(strategy)管理,输入输出设备管理。
输入输出设备管理
音频系统为音频设备定义了一个枚举:AudioSystem::audio_devices,例如:DEVICE_OUT_SPEAKER,DEVICE_OUT_WIRED_HEADPHONE,DEVICE_OUT_BLUETOOTH_A2DP,DEVICE_IN_BUILTIN_MIC,DEVICE_IN_VOICE_CALL等等,每一个枚举值其实对应一个32bit整数的某一个位,所以这些值是可以进行位或操作的,例如我希望同时打开扬声器和耳机,那么可以这样:
- newDevice = DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADPHONE;
- setOutputDevice(mHardwareOutput, newDevice);
AudioPolicyManager中有两个成员变量:mAvailableOutputDevices和mAvailableInputDevices,他们记录了当前可用的输入和输出设备,当系统检测到耳机或者蓝牙已连接好时,会调用AudioPolicyManager的成员函数:
- status_t AudioPolicyManager::setDeviceConnectionState(AudioSystem::audio_devices device,
- AudioSystem::device_connection_state state,
- const char *device_address)
该函数根据传入的device值和state(DEVICE_STATE_AVAILABLE/DEVICE_STATE_UNAVAILABLE)设置mAvailableOutputDevices或者mAvailableInputDevices,然后选择相应的输入或者输出设备。
其他一些相关的函数:
- setForceUse() 设置某种场合强制使用某一设备,例如setForceUse(FOR_MEDIA, FORCE_SPEAKER)会在播放音乐时打开扬声器
- startOutput()/stopOutput()
- startInput()/stopInput()
音量管理
AudioPolicyManager提供了一下几个与音量相关的函数:
- initStreamVolume(AudioSystem::stream_type stream, int indexMin, int indexMax)
- setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
- getStreamVolumeIndex(AudioSystem::stream_type stream)
由此可见,电话铃声可以有7个级别的音量,而音乐则可以有15个音量级别,java的代码通过jni,最后调用AudioPolicyManager的initStreamVolume(),把这个数组的内容传入AudioPolicyManager中,这样AudioPolicyManager也就记住了每一个音频流的音量级别。应用程序可以调用setStreamVolumeIndex设置各个音频流的音量级别,setStreamVolumeIndex会把这个整数的音量级别转化为适合人耳的对数级别,然后通过AudioPolicyService的AudioCommandThread,最终会将设置应用到AudioFlinger的相应的Track中。
AudioCommandThread
这是AudioPolicyService中的一个线程,主要用于处理音频设置相关的命令。包括:
- START_TONE
- STOP_TONE
- SET_VOLUME
- SET_PARAMETERS
- SET_VOICE_VOLUME
每种命令的参数有相应的包装:
- class ToneData
- class VolumeData
- class ParametersData
- class VoiceVolumeData
START_TONE/STOP_TONE:播放电话系统中常用的特殊音调,例如:TONE_DTMF_0,TONE_SUP_BUSY等等。
SET_VOLUME:最终会调用AudioFlinger进行音量设置
SET_VOICE_VOLUME:最终会调用AudioFlinger进行电话音量设置
SET_PARAMETERS:通过一个KeyValuePairs形式的字符串进行参数设置,KeyValuePairs的格式可以这样:
- "sampling_rate=44100"
- "channels=2"
- "sampling_rate=44100;channels=2" // 组合形式
这些KeyValuePairs可以通过AudioPolicyService的成员函数setParameters()传入。
经典收藏
转自:
http://blog.csdn.net/DroidPhone/archive/2010/10/18/5949280.aspx
- AudioPolicyService 和 AudioPolicyManager
- AudioPolicyService 和 AudioPolicyManager
- AudioPolicyService 和 AudioPolicyManager
- Android AudioPolicyService和AudioPolicyManager
- Android AudioPolicyService和AudioPolicyManager
- AudioPolicyService 和 AudioPolicyManager
- Android AudioPolicyService和AudioPolicyManager .
- Android AudioPolicyService和AudioPolicyManager .
- AudioPolicyService 和 AudioPolicyManager
- android 音频管理:AudioPolicyService 和 AudioPolicyManager
- android 音频管理:AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager
- Asp.net中Application Session Cookie ViewState Cache Hidden 区别
- 4.1 String类和StringBuffer类
- 继承
- Excel文件上传实例
- 4.2.1 集合类Vetor类和Enumeration接口
- AudioPolicyService 和 AudioPolicyManager
- 4.2.2集合类 Collection接口和 Iterator接口
- 4.2.3Collection Set ArrayList接口的区别
- 4.2.4集合Hashtable类
- 随想之性能指标数据
- MFC通过ADO连接SQL SERVER数据库
- 一颗老鼠坏了一锅汤
- Android Property System
- gj