From 11c04c984afa0b3eea351d7cd9a62daab0ec70ea Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Wed, 12 Aug 2009 05:49:58 -0700 Subject: [PATCH] Workaround for issue 2046783. Apparently the problem is caused by the fact that A2dpAudioStreamOut::standby() calls a2dp_stop() after the headset has been powered down. The workaround consists in indicating to A2DP audio hardware that a close request is pending and that stanby() must be bypassed. --- libs/audioflinger/A2dpAudioInterface.cpp | 14 ++++++++++++-- libs/audioflinger/A2dpAudioInterface.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/libs/audioflinger/A2dpAudioInterface.cpp b/libs/audioflinger/A2dpAudioInterface.cpp index 20db8a5ed..57a29f2dc 100644 --- a/libs/audioflinger/A2dpAudioInterface.cpp +++ b/libs/audioflinger/A2dpAudioInterface.cpp @@ -204,7 +204,7 @@ A2dpAudioInterface::A2dpAudioStreamOut::A2dpAudioStreamOut() : mFd(-1), mStandby(true), mStartCount(0), mRetryCount(0), mData(NULL), // assume BT enabled to start, this is safe because its only the // enabled->disabled transition we are worried about - mBluetoothEnabled(true), mDevice(0) + mBluetoothEnabled(true), mDevice(0), mClosing(false) { // use any address by default strcpy(mA2dpAddress, "00:00:00:00:00:00"); @@ -258,7 +258,7 @@ ssize_t A2dpAudioInterface::A2dpAudioStreamOut::write(const void* buffer, size_t size_t remaining = bytes; status_t status = -1; - if (!mBluetoothEnabled) { + if (!mBluetoothEnabled || mClosing) { LOGW("A2dpAudioStreamOut::write(), but bluetooth disabled"); goto Error; } @@ -307,6 +307,11 @@ status_t A2dpAudioInterface::A2dpAudioStreamOut::standby() { int result = 0; + if (mClosing) { + LOGV("Ignore standby, closing"); + return result; + } + Mutex::Autolock lock(mLock); if (!mStandby) { @@ -335,6 +340,11 @@ status_t A2dpAudioInterface::A2dpAudioStreamOut::setParameters(const String8& ke } param.remove(key); } + key = String8("closing"); + if (param.get(key, value) == NO_ERROR) { + mClosing = (value == "true"); + param.remove(key); + } key = AudioParameter::keyRouting; if (param.getInt(key, device) == NO_ERROR) { if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)device)) { diff --git a/libs/audioflinger/A2dpAudioInterface.h b/libs/audioflinger/A2dpAudioInterface.h index d6709e2f1..35a6e1188 100644 --- a/libs/audioflinger/A2dpAudioInterface.h +++ b/libs/audioflinger/A2dpAudioInterface.h @@ -112,6 +112,7 @@ private: Mutex mLock; bool mBluetoothEnabled; uint32_t mDevice; + bool mClosing; }; friend class A2dpAudioStreamOut;