Android AudioPolicyService和AudioPolicyManager

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整数的某一个位,所以这些值是可以进行位或操作的,例如我希望同时打开扬声器和耳机,那么可以这样:

java代码:
  1. newDevice = DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADPHONE; 
  2. setOutputDevice(mHardwareOutput, newDevice);
复制代码

       AudioPolicyManager中有两个成员变量:mAvailableOutputDevices和 mAvailableInputDevices,他们记录了当前可用的输入和输出设备,当系统检测到耳机或者蓝牙已连接好时,会调用 AudioPolicyManager的成员函数:

java代码:
  1. status_t AudioPolicyManager::setDeviceConnectionState(AudioSystem::audio_devices device, 
  2. AudioSystem::device_connection_state state, 
  3. const char *device_address)
复制代码

       该函数根据传入的device值和 state(DEVICE_STATE_AVAILABLE/DEVICE_STATE_UNAVAILABLE)设置 mAvailableOutputDevices或者mAvailableInputDevices,然后选择相应的输入或者输出设备。

       其他一些相关的函数:

java代码:
  1. setForceUse() 
  2. //设置某种场合强制使用某一设备,例如setForceUse(FOR_MEDIA, FORCE_SPEAKER)会在播放音乐时打开扬声器 
  3. startOutput()/stopOutput() 
  4. startInput()/stopInput()
复制代码

        音量管理
       AudioPolicyManager提供了一下几个与音量相关的函数:

java代码:
  1. initStreamVolume(AudioSystem::stream_type stream, int indexMin, int indexMax) 
  2. setStreamVolumeIndex(AudioSystem::stream_type stream, int index) 
  3. getStreamVolumeIndex(AudioSystem::stream_type stream)
复制代码

       由此可见,电话铃声可以有7个级别的音量,而音乐则可以有15个音量级别,java的代码通过jni,最后调用 AudioPolicyManager的initStreamVolume(),把这个数组的内容传入AudioPolicyManager中,这样 AudioPolicyManager也就记住了每一个音频流的音量级别。应用程序可以调用setStreamVolumeIndex设置各个音频流的音量级别,setStreamVolumeIndex会把这个整数的音量级别转化为适合人耳的对数级别,然后通过AudioPolicyService的 AudioCommandThread,最终会将设置应用到AudioFlinger的相应的Track中。

转载于:https://my.oschina.net/mr81/blog/37263

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
audiopolicyservice是一个Android系统中的一个服务,它负责处理所有与音频相关的策略和操作。它属于系统核心服务之一,在音频通信控制中起到了重要作用。 audiopolicyservice的主要功能包括音频路由管理、音频设备切换、音频焦点管理和音频策略管理等。首先,它负责管理音频路由,通过监控音频设备的插拔情况、用户的操作以及应用程序的需求,来动态地选择合适的音频设备进行操作,并将音频数据传输到相应的设备上。 此外,audiopolicyservice还负责处理不同应用程序对音频焦点的请求。音频焦点是指在多个应用程序同时播放音频的情况下,系统根据优先级来确定哪个应用程序可以持续播放音频。通过音频焦点管理,audiopolicyservice可以确保最重要的应用程序能够获得优先的音频焦点,从而实现音频的顺利切换和管理。 最后,audiopolicyservice还有音频策略管理的功能。它可以根据系统的设置和用户的需求,动态地调整音频策略,包括音量控制、音效处理等。通过合理地管理音频策略,可以提供用户良好的音频体验,并且在不同的场景下实现自动切换和适应。 总的来说,audiopolicyservice是一个负责管理系统音频的重要服务。它通过实时地监控和控制音频设备、音频焦点和音频策略等,为用户提供了良好的音频使用体验,并且能够在不同的场景下自动切换和适应,从而提高了系统的稳定性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值