Android Audio Policy小记

本文深入探讨了Android系统中AudioPolicy模块的工作原理,包括策略文件的加载过程、AudioRecord创建时根据audio_source_t选择设备的策略,以及AudioTrack创建时根据stream type选择合适设备的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值