summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2012-05-31 14:27:14 -0700
committerEric Laurent <elaurent@google.com>2012-05-31 14:32:38 -0700
commitdf839841d2db4cb8e2acb10205b3942622b3e7a2 (patch)
tree183ce49d98a66d866aeed85e98da6709206074ac
parent83410a85993ad6f5f0c122036ff0bda42bf1d4f7 (diff)
Do not keep audio wake lock when apps underrun.
Do not automatically restart an AudioTrack after an underrun if the callback is executed but no data is written by the app. Bug 6541286. Change-Id: I11e7ab8dc968d7ff087058fec68f44490d3a7731
-rw-r--r--media/libmedia/AudioTrack.cpp38
1 files changed, 24 insertions, 14 deletions
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 5e6cd515..e2345320 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -1019,13 +1019,6 @@ create_new_track:
cblk->lock.unlock();
}
- // restart track if it was disabled by audioflinger due to previous underrun
- if (mActive && (cblk->flags & CBLK_DISABLED_MSK)) {
- android_atomic_and(~CBLK_DISABLED_ON, &cblk->flags);
- ALOGW("obtainBuffer() track %p disabled, restarting", this);
- mAudioTrack->start();
- }
-
cblk->waitTimeMs = 0;
if (framesReq > framesAvail) {
@@ -1057,6 +1050,14 @@ void AudioTrack::releaseBuffer(Buffer* audioBuffer)
{
AutoMutex lock(mLock);
mCblk->stepUser(audioBuffer->frameCount);
+ if (audioBuffer->frameCount > 0) {
+ // restart track if it was disabled by audioflinger due to previous underrun
+ if (mActive && (mCblk->flags & CBLK_DISABLED_MSK)) {
+ android_atomic_and(~CBLK_DISABLED_ON, &mCblk->flags);
+ ALOGW("releaseBuffer() track %p disabled, restarting", this);
+ mAudioTrack->start();
+ }
+ }
}
// -------------------------------------------------------------------------
@@ -1077,6 +1078,10 @@ ssize_t AudioTrack::write(const void* buffer, size_t userSize)
ALOGV("write %p: %d bytes, mActive=%d", this, userSize, mActive);
+ if (userSize == 0) {
+ return 0;
+ }
+
// acquire a strong reference on the IMemory and IAudioTrack so that they cannot be destroyed
// while we are accessing the cblk
mLock.lock();
@@ -1157,14 +1162,18 @@ status_t TimedAudioTrack::allocateTimedBuffer(size_t size, sp<IMemory>* buffer)
status_t TimedAudioTrack::queueTimedBuffer(const sp<IMemory>& buffer,
int64_t pts)
{
- // restart track if it was disabled by audioflinger due to previous underrun
- if (mActive && (mCblk->flags & CBLK_DISABLED_MSK)) {
- android_atomic_and(~CBLK_DISABLED_ON, &mCblk->flags);
- ALOGW("queueTimedBuffer() track %p disabled, restarting", this);
- mAudioTrack->start();
+ status_t status = mAudioTrack->queueTimedBuffer(buffer, pts);
+ {
+ AutoMutex lock(mLock);
+ // restart track if it was disabled by audioflinger due to previous underrun
+ if (buffer->size() != 0 && status == NO_ERROR &&
+ mActive && (mCblk->flags & CBLK_DISABLED_MSK)) {
+ android_atomic_and(~CBLK_DISABLED_ON, &mCblk->flags);
+ ALOGW("queueTimedBuffer() track %p disabled, restarting", this);
+ mAudioTrack->start();
+ }
}
-
- return mAudioTrack->queueTimedBuffer(buffer, pts);
+ return status;
}
status_t TimedAudioTrack::setMediaTimeTransform(const LinearTransform& xform,
@@ -1276,6 +1285,7 @@ bool AudioTrack::processAudioBuffer(const sp<AudioTrackThread>& thread)
usleep(WAIT_PERIOD_MS*1000);
break;
}
+
if (writtenSize > reqSize) writtenSize = reqSize;
if (mFormat == AUDIO_FORMAT_PCM_8_BIT && !(mFlags & AUDIO_OUTPUT_FLAG_DIRECT)) {