summaryrefslogtreecommitdiffstats
path: root/libs/audioflinger/A2dpAudioInterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/audioflinger/A2dpAudioInterface.cpp')
-rw-r--r--libs/audioflinger/A2dpAudioInterface.cpp50
1 files changed, 39 insertions, 11 deletions
diff --git a/libs/audioflinger/A2dpAudioInterface.cpp b/libs/audioflinger/A2dpAudioInterface.cpp
index 2974e32..b6d5078 100644
--- a/libs/audioflinger/A2dpAudioInterface.cpp
+++ b/libs/audioflinger/A2dpAudioInterface.cpp
@@ -92,16 +92,15 @@ status_t A2dpAudioInterface::getMicMute(bool* state)
status_t A2dpAudioInterface::setParameter(const char *key, const char *value)
{
LOGD("setParameter %s,%s\n", key, value);
-
+
if (!key || !value)
return -EINVAL;
-
- if (strcmp(key, "a2dp_sink_address") == 0) {
+
+ if (strcmp(key, "a2dp_sink_address") == 0) {
return mOutput->setAddress(value);
}
- if (strcmp(key, "bluetooth_enabled") == 0 &&
- strcmp(value, "false") == 0) {
- return mOutput->close();
+ if (strcmp(key, "bluetooth_enabled") == 0) {
+ mOutput->setBluetoothEnabled(strcmp(value, "true") == 0);
}
return 0;
@@ -130,7 +129,10 @@ status_t A2dpAudioInterface::dump(int fd, const Vector<String16>& args)
// ----------------------------------------------------------------------------
A2dpAudioInterface::A2dpAudioStreamOut::A2dpAudioStreamOut() :
- mFd(-1), mStandby(true), mStartCount(0), mRetryCount(0), mData(NULL)
+ 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)
{
// use any address by default
strcpy(mA2dpAddress, "00:00:00:00:00:00");
@@ -162,14 +164,21 @@ A2dpAudioInterface::A2dpAudioStreamOut::~A2dpAudioStreamOut()
}
ssize_t A2dpAudioInterface::A2dpAudioStreamOut::write(const void* buffer, size_t bytes)
-{
+{
Mutex::Autolock lock(mLock);
size_t remaining = bytes;
- status_t status = init();
+ status_t status = -1;
+
+ if (!mBluetoothEnabled) {
+ LOGW("A2dpAudioStreamOut::write(), but bluetooth disabled");
+ goto Error;
+ }
+
+ status = init();
if (status < 0)
goto Error;
-
+
while (remaining > 0) {
status = a2dp_write(mData, buffer, remaining);
if (status <= 0) {
@@ -181,7 +190,7 @@ ssize_t A2dpAudioInterface::A2dpAudioStreamOut::write(const void* buffer, size_t
}
mStandby = false;
-
+
return bytes;
Error:
@@ -235,8 +244,27 @@ status_t A2dpAudioInterface::A2dpAudioStreamOut::setAddress(const char* address)
return NO_ERROR;
}
+status_t A2dpAudioInterface::A2dpAudioStreamOut::setBluetoothEnabled(bool enabled)
+{
+ LOGD("setBluetoothEnabled %d", enabled);
+
+ Mutex::Autolock lock(mLock);
+
+ mBluetoothEnabled = enabled;
+ if (!enabled) {
+ return close_l();
+ }
+ return NO_ERROR;
+}
+
status_t A2dpAudioInterface::A2dpAudioStreamOut::close()
{
+ Mutex::Autolock lock(mLock);
+ return close_l();
+}
+
+status_t A2dpAudioInterface::A2dpAudioStreamOut::close_l()
+{
if (mData) {
a2dp_cleanup(mData);
mData = NULL;