diff options
author | Eric Laurent <elaurent@google.com> | 2009-08-03 08:47:26 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2009-08-03 08:52:07 -0700 |
commit | c5993470d22166e714bf9db8dfe608c66c2c7fac (patch) | |
tree | 246cbfc8592c7866a8ce9fa10b0b09de663309ca /libaudio | |
parent | 4a301310720c49b4c931dc52ab37e79a92591d89 (diff) | |
download | msm7k-c5993470d22166e714bf9db8dfe608c66c2c7fac.tar.gz |
Fix issue 2029923: DTMF tones not always routed to BT SCO.
Switch DTMF stream from/to A2DP output to/from hardware output when changing call state even if DTMF stream is
not active.
Diffstat (limited to 'libaudio')
-rw-r--r-- | libaudio/AudioPolicyManager.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/libaudio/AudioPolicyManager.cpp b/libaudio/AudioPolicyManager.cpp index 15c62ba..eae3ef1 100644 --- a/libaudio/AudioPolicyManager.cpp +++ b/libaudio/AudioPolicyManager.cpp @@ -488,15 +488,14 @@ void AudioPolicyManager::setPhoneState(int state) } else if (mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_MEDIA)){ newDevice = getDeviceForStrategy(STRATEGY_MEDIA); } - else if (mA2dpOutput != 0) { + + if (mA2dpOutput != 0) { // If entering or exiting in call state, switch DTMF streams to/from A2DP output // if necessary uint32_t newDtmfDevice = getDeviceForStrategy(STRATEGY_DTMF); if (state == AudioSystem::MODE_IN_CALL) { - if (mOutputs.valueFor(mA2dpOutput)->isUsedByStrategy(STRATEGY_DTMF) && - AudioSystem::isA2dpDevice((AudioSystem::audio_devices)oldDtmfDevice) && + if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)oldDtmfDevice) && !AudioSystem::isA2dpDevice((AudioSystem::audio_devices)newDtmfDevice)) { - newDevice = newDtmfDevice; for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) { if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_DTMF) { mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, mHardwareOutput); @@ -504,10 +503,12 @@ void AudioPolicyManager::setPhoneState(int state) mOutputs.valueFor(mA2dpOutput)->mRefCount[i]); } } + if (newDevice == 0 && mOutputs.valueFor(mA2dpOutput)->isUsedByStrategy(STRATEGY_DTMF)) { + newDevice = newDtmfDevice; + } } } else { - if (mOutputs.valueFor(mHardwareOutput)->isUsedByStrategy(STRATEGY_DTMF) && - !AudioSystem::isA2dpDevice((AudioSystem::audio_devices)oldDtmfDevice) && + if (!AudioSystem::isA2dpDevice((AudioSystem::audio_devices)oldDtmfDevice) && AudioSystem::isA2dpDevice((AudioSystem::audio_devices)newDtmfDevice)) { for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) { if (getStrategy((AudioSystem::stream_type)i) == STRATEGY_DTMF) { |