diff options
author | Eric Laurent <elaurent@google.com> | 2012-05-31 14:27:14 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2012-05-31 14:32:38 -0700 |
commit | df839841d2db4cb8e2acb10205b3942622b3e7a2 (patch) | |
tree | 183ce49d98a66d866aeed85e98da6709206074ac | |
parent | 83410a85993ad6f5f0c122036ff0bda42bf1d4f7 (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.cpp | 38 |
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)) { |