android 采集音频输出,Android系统分析之Audio音频流, 音频策略, 输出设备之间的关系...

本文深入分析了Android系统中AudioPolicyManagerBase如何根据音频流类型选择音频策略,并确定输出设备。主要关注AudioManager.STREAM_VOICE_CALL类型,涉及关键类如AudioPolicyManagerBase、AudioManager等,解释了强制使用输出设备对音频流路由的影响。
摘要由CSDN通过智能技术生成

音频流, 音频策略, 输出设备之间的关系

只针对 AudioManager.STREAM_VOICE_CALL 音频流类型进行分析

涉及到的类:

hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp

frameworks/base/media/java/android/media/AudioManager.java

frameworks/base/media/java/android/media/AudioService.java

frameworks/base/media/java/android/media/AudioSystem.java

涉及到的方法及执行顺序:

AudioPolicyManagerBase.getStrategy(AudioSystem::stream_type stream);

AudioPolicyManagerBase.getDeviceForStrategy(routing_strategy strategy, bool fromCache);

一. 通过音频流的类型获取对应的音频策略

AudioPolicyManagerBase.cpp:

AudioPolicyManagerBase::routing_strategy AudioPolicyManagerBase::getStrategy(AudioSystem::stream_type stream) {

// stream to strategy mapping

switch (stream) {

case AudioSystem::VOICE_CALL:

case AudioSystem::BLUETOOTH_SCO:

return STRATEGY_PHONE;

...

}

}

二. 通过音频策略获取到对应的输出设备

AudioPolicyManagerBase.cpp:

audio_devices_t AudioPolicyManagerBase::getDeviceForStrategy(routing_strategy strategy, bool fromCache) {

uint32_t device = AUDIO_DEVICE_NONE;

... // 省略

switch (strategy) {

... // 省略

case STRATEGY_PHONE:

// for phone strategy, we first consider the forced use and then the available devices by order

// of priority

switch (mForceUse[AudioSystem::FOR_COMMUNICATION]) { // 判断是否有设置在通讯过程中, 强制使用某种输出设备

case AudioSystem::FORCE_BT_SCO: // 强制使用蓝牙, 作为输出设备

if (!isInCall() || strategy != STRATEGY_DTMF) {

device = mAvailableOutputDevices & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT;<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值