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.cpp49
1 files changed, 34 insertions, 15 deletions
diff --git a/libs/audioflinger/A2dpAudioInterface.cpp b/libs/audioflinger/A2dpAudioInterface.cpp
index d54795c..b2a8e96 100644
--- a/libs/audioflinger/A2dpAudioInterface.cpp
+++ b/libs/audioflinger/A2dpAudioInterface.cpp
@@ -79,11 +79,6 @@ AudioStreamIn* A2dpAudioInterface::openInputStream(
return NULL;
}
-status_t A2dpAudioInterface::standby()
-{
- return 0;
-}
-
status_t A2dpAudioInterface::setMicMute(bool state)
{
return 0;
@@ -123,8 +118,8 @@ status_t A2dpAudioInterface::dump(int fd, const Vector<String16>& args)
// ----------------------------------------------------------------------------
A2dpAudioInterface::A2dpAudioStreamOut::A2dpAudioStreamOut() :
- mFd(-1), mStartCount(0), mRetryCount(0), mData(NULL),
- mInitialized(false), mBufferRemaining(0)
+ mFd(-1), mStandby(false), mStartCount(0), mRetryCount(0), mData(NULL),
+ mInitialized(false)
{
}
@@ -155,26 +150,50 @@ A2dpAudioInterface::A2dpAudioStreamOut::~A2dpAudioStreamOut()
ssize_t A2dpAudioInterface::A2dpAudioStreamOut::write(const void* buffer, size_t bytes)
{
+ status_t status = NO_INIT;
+ size_t remaining = bytes;
+
if (!mInitialized) {
- int ret = a2dp_init("00:00:00:00:00:00", 44100, 2, &mData);
- if (ret)
- return ret;
+ status = a2dp_init("00:00:00:00:00:00", 44100, 2, &mData);
+ if (status < 0) {
+ LOGE("a2dp_init failed err: %d\n", status);
+ goto Error;
+ }
mInitialized = true;
}
- size_t remaining = bytes;
while (remaining > 0) {
- int written = a2dp_write(mData, buffer, remaining);
- remaining -= written;
- buffer = ((char *)buffer) + written;
+ status = a2dp_write(mData, buffer, remaining);
+ if (status <= 0) {
+ LOGE("a2dp_write failed err: %d\n", status);
+ goto Error;
+ }
+ remaining -= status;
+ buffer = ((char *)buffer) + status;
}
+
+ mStandby = false;
return bytes;
+
+Error:
+ // Simulate audio output timing in case of error
+ usleep(bytes * 1000000 / frameSize() / sampleRate());
+
+ return status;
}
status_t A2dpAudioInterface::A2dpAudioStreamOut::standby()
{
- return 0;
+ int result = 0;
+
+ if (!mStandby) {
+ result = a2dp_stop(mData);
+ if (result == 0)
+ mStandby = true;
+ }
+
+ return result;
}
status_t A2dpAudioInterface::A2dpAudioStreamOut::dump(int fd, const Vector<String16>& args)