本文主要介绍android上音频输出设备切换的代码流程
(此文部分内容参考自邓凡达老师的博客。感谢邓老师讲解)
上层程序要切换输出设备时,经过JNI调用,会调用AudioSystem::setForceUse
status_t AudioSystem::setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config)
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
return aps->setForceUse(usage, config);
}
接下来就是调用frameworks/av/services/audioflinger/AudioPolicyService.cpp的setForceUse()函数了;
status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
audio_policy_forced_cfg_t config)
{
Mutex::Autolock _l(mLock);
mpAudioPolicy->set_force_use(mpAudioPolicy, usage, config);
return NO_ERROR;
}
mpAudioPolicy->set_force_use实际上调用的是audio_policy_hal.cpp里面的ap_set_force_use。
static void ap_set_force_use(struct audio_policy *pol,
audio_policy_force_use_t usage,
audio_policy_forced_cfg_t config)
{
struct legacy_audio_policy *lap = to_lap(pol);
lap->apm->setForceUse((AudioSystem::force_use)usage,
(AudioSystem::forced_config)config);
}
继而调用AudioPolicyManagerBase::setForceUse