Android Audio Policy小记

http://blog.csdn.net/ifloveelse/article/details/44097125


Android的Audio系统分为两大块,一块是audio的策略管理,即Audio Policy模块;一块是AudioFlinger模块,负责和Audio Hardware Module直接交互。

本文主要讲解Audio Policy模块的以下知识点:

1. audio policy策略文件的加载;

2. 创建AudioRecord的时候,如何根据intput source选择合适的device;

3. 创建AudioTrack的时候,如何根据output stream选择合适的device;


首先讲第一点。

audio policy策略文件即:/system/etc/audio_policy.conf 或者/vendor/etc/audio_policy.conf。在AudioPolicyManagerBase的构造函数中会加载和分析这个配置文件。

那么AudioPolicyManagerBase又是在何时构造的呢?


AudioPolicyService构造函数中会加载audio policy的HAL Module。AudioPolicyService与 audio policy module的组件图如下:


下面是一个audio_policy.conf文件的部分内容:

[plain]  view plain  copy
  1. audio_hw_modules {  
  2.   primary {  
  3.     outputs {  
  4.       primary {  
  5.         sampling_rates 44100  
  6.         channel_masks AUDIO_CHANNEL_OUT_STEREO  
  7.         formats AUDIO_FORMAT_PCM_16_BIT  
  8.         devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_AUX_DIGITAL  
  9.         flags AUDIO_OUTPUT_FLAG_PRIMARY  
  10.       }  
  11.       hdmi {  
  12.         sampling_rates dynamic  
  13.         channel_masks dynamic  
  14.         formats AUDIO_FORMAT_PCM_16_BIT  
  15.         devices AUDIO_DEVICE_OUT_AUX_DIGITAL  
  16.         flags AUDIO_OUTPUT_FLAG_DIRECT  
  17.       }  
  18.     }  
  19.     inputs {  
  20.       primary {  
  21.         sampling_rates 8000|11025|16000|22050|24000|32000|44100|48000  
  22.         channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO  
  23.         formats AUDIO_FORMAT_PCM_16_BIT  
  24.         devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_USB_DEVICE  
  25.       }  
  26.     }  
  27.   }  
  28.   
  29. }  

[plain]  view plain  copy
  1. audio_hw_modules节点表示系统中包含的audio hardware module。每个子节点都对应一个 hal so。比如primary对应着audio.primary.<device>.so。primary可以理解为一个audio interface。  
  2. 一个audio interface模块有输入模块和输入模块,在文件中的outputs和inputs中定义。primary 部分解析完毕后对应于抽象的class HwModule 。  


[cpp]  view plain  copy
  1. class HwModule {  
  2. public:  
  3.             HwModule(const char *name);  
  4.             ~HwModule();  
  5.   
  6.     void dump(int fd);  
  7.   
  8.     const char *const mName; // base name of the audio HW module (primary, a2dp ...)  
  9.     audio_module_handle_t mHandle;  
  10.     Vector <IOProfile *> mOutputProfiles; // output profiles exposed by this module  
  11.     Vector <IOProfile *> mInputProfiles;  // input profiles exposed by this module  
  12. };  

 
可见每个HwModule都有好多个输入模块和输出模块,输入输出模块的属性用IOProfile抽象。接着讲第二点,创建AudioRecord的时候,如何根据intput source选择合适的device。在创建AudioRecord的时候会指定一个参数:audio_source_t 
[cpp]  view plain  copy
  1. typedef enum {  
  2.     AUDIO_SOURCE_DEFAULT             = 0,  
  3.     AUDIO_SOURCE_MIC                 = 1,  
  4.     AUDIO_SOURCE_VOICE_UPLINK        = 2,  
  5.     AUDIO_SOURCE_VOICE_DOWNLINK      = 3,  
  6.     AUDIO_SOURCE_VOICE_CALL          = 4,  
  7.     AUDIO_SOURCE_CAMCORDER           = 5,  
  8.     AUDIO_SOURCE_VOICE_RECOGNITION   = 6,  
  9.     AUDIO_SOURCE_VOICE_COMMUNICATION = 7,  
  10.     AUDIO_SOURCE_REMOTE_SUBMIX       = 8, /* Source for the mix to be presented remotely.      */  
  11.                                           /* An example of remote presentation is Wifi Display */  
  12.                                           /*  where a dongle attached to a TV can be used to   */  
  13.                                           /*  play the mix captured by this audio source.      */  
  14.       
  15.     AUDIO_SOURCE_USB_DEVICE_1        = 9,  
  16.     AUDIO_SOURCE_USB_DEVICE_2        = 10,  
  17.   
  18.     AUDIO_SOURCE_CNT,  
  19.     AUDIO_SOURCE_MAX                 = AUDIO_SOURCE_CNT - 1,  
  20. } audio_source_t;  

根据不同的audio_source_t枚举值,AudioPolicyManagerBase会选择不同的Device录入音频数据。具体选择的策略在audio_io_handle_t AudioPolicyManagerBase::getInput
函数中实现。对于一个系统来说,可能有多个设备都可以录入音频数据,那个如何选择正确的设备,这就是getInput函数的职责。

 
第三个问题,创建AudioTrack的时候,如何根据output stream选择合适的device。这个可以从下面的图标中得知一二: 
 
通过AudioTrack的stream type,获得一个strategy,然后根据strategy获得一个device。然后根据device的属性,AudioPolicyManagerBase会为之匹配合适的audio_io_handle.对于一个audio hardware module来说,AudioFlinger加载完毕之后会为之分配一个handle:audio_module_handle_t。每一个audio_module_handle_t中创建的输入输出流都用audio_io_handle_t标识。每一个audio_io_handle_t背后是一个工作thread和与这个thread所绑定的stream。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
audiopolicy指的是音频策略,是指在计算机系统中对音频资源进行管理和控制的一种机制。它通过定义一系列规则和策略,决定音频设备的分配、使用、优先级等方面,以确保音频资源的合理利用和音频服务的高效运行。 audiopolicy具体负责的内容包括以下几个方面: 1. 音频设备管理:audiopolicy会监控计算机系统中的各种音频设备,如扬声器、麦克风等,对其进行管理和控制。它会检测设备的状态、连接状况等,并根据系统的需要进行设备的自动切换和配置。 2. 音频资源分配:audiopolicy会根据各个应用程序的需求和优先级,对音频资源进行分配。它可以确定哪个应用程序可以在某个时间段内占用音频设备,从而协调各应用程序之间的音频资源竞争。 3. 音频服务管理:audiopolicy会管理和监控各类音频服务,如播放器、通话、语音助手等。它会确保这些音频服务之间的合理协同和资源共享,避免冲突和互相干扰。 4. 音频优化和调节:audiopolicy可以对音频进行优化和调节,以提供更好的音频体验。它可以根据设备的特性和用户的喜好,对音频进行音量调节、音色调整等,以满足用户的需求。 总之,audiopolicy是计算机系统中的一个重要组成部分,它通过管理和控制音频资源,为用户提供高质量的音频服务,并确保各应用程序之间的音频资源竞争和协同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值