OSDN Git Service

Fix issue 2327064: Music played via line out is interrupted due to the phone call...
authorEric Laurent <elaurent@google.com>
Wed, 24 Feb 2010 19:51:43 +0000 (11:51 -0800)
committerEric Laurent <elaurent@google.com>
Wed, 24 Feb 2010 19:54:32 +0000 (11:54 -0800)
This is not a real fix for the issue but a change to make sure that the behavior is consistent regardless of
external condidions (WIFI ON or OFF, music started before call or not, A2DP device same as SCO device...).

As there is now way to guaranty good quality audio over both SCO and A2DP simultaneously, especially when WIFI is on, We will stick to this behavior:
When music is playing and we are docked to the desk dock and a call is answered with a BT SCO headset, A2DP output will be suspended.
If music is restarted during the call, it will appear muted to the user until the call is terminated.

libs/audioflinger/AudioPolicyManagerBase.cpp

index 42b6508..7b866c7 100644 (file)
@@ -82,8 +82,8 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(AudioSystem::audio_dev
                     // keep track of SCO device address
                     mScoDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN);
 #ifdef WITH_A2DP
-                    if ((mA2dpDeviceAddress == mScoDeviceAddress) &&
-                        (mPhoneState != AudioSystem::MODE_NORMAL)) {
+                    if (mA2dpOutput != 0 &&
+                        mPhoneState != AudioSystem::MODE_NORMAL) {
                         mpClientInterface->suspendOutput(mA2dpOutput);
                     }
 #endif
@@ -116,8 +116,8 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(AudioSystem::audio_dev
                 if (AudioSystem::isBluetoothScoDevice(device)) {
                     mScoDeviceAddress = "";
 #ifdef WITH_A2DP
-                    if ((mA2dpDeviceAddress == mScoDeviceAddress) &&
-                        (mPhoneState != AudioSystem::MODE_NORMAL)) {
+                    if (mA2dpOutput != 0 &&
+                        mPhoneState != AudioSystem::MODE_NORMAL) {
                         mpClientInterface->restoreOutput(mA2dpOutput);
                     }
 #endif
@@ -275,10 +275,8 @@ void AudioPolicyManagerBase::setPhoneState(int state)
     newDevice = getNewDevice(mHardwareOutput, false);
 #ifdef WITH_A2DP
     checkOutputForAllStrategies(newDevice);
-    // suspend A2DP output if SCO device address is the same as A2DP device address.
-    // no need to check that a SCO device is actually connected as mScoDeviceAddress == ""
-    // if none is connected and the test below will fail.
-    if (mA2dpDeviceAddress == mScoDeviceAddress) {
+    // suspend A2DP output if a SCO device is present.
+    if (mA2dpOutput != 0 && mScoDeviceAddress != "") {
         if (oldState == AudioSystem::MODE_NORMAL) {
             mpClientInterface->suspendOutput(mA2dpOutput);
         } else if (state == AudioSystem::MODE_NORMAL) {
@@ -1191,7 +1189,7 @@ status_t AudioPolicyManagerBase::handleA2dpConnection(AudioSystem::audio_devices
     }
     AudioOutputDescriptor *hwOutputDesc = mOutputs.valueFor(mHardwareOutput);
 
-    if (mA2dpDeviceAddress == mScoDeviceAddress) {
+    if (mScoDeviceAddress != "") {
         // It is normal to suspend twice if we are both in call,
         // and have the hardware audio output routed to BT SCO
         if (mPhoneState != AudioSystem::MODE_NORMAL) {
@@ -1556,9 +1554,9 @@ void AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, uint32_t
         usleep(outputDesc->mLatency*2*1000);
     }
 #ifdef WITH_A2DP
-    // suspend A2D output if SCO device is selected
+    // suspend A2DP output if SCO device is selected
     if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)device)) {
-         if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) {
+         if (mA2dpOutput != 0) {
              mpClientInterface->suspendOutput(mA2dpOutput);
          }
     }
@@ -1573,7 +1571,7 @@ void AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, uint32_t
 #ifdef WITH_A2DP
     // if disconnecting SCO device, restore A2DP output
     if (AudioSystem::isBluetoothScoDevice((AudioSystem::audio_devices)prevDevice)) {
-         if (mA2dpOutput && mScoDeviceAddress == mA2dpDeviceAddress) {
+         if (mA2dpOutput != 0) {
              LOGV("restore A2DP output");
              mpClientInterface->restoreOutput(mA2dpOutput);
          }