Merge "Do not keep audio wake lock when apps underrun." into jb-dev
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 5e6cd51..e234532 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -1019,13 +1019,6 @@
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 @@
{
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 @@
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::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 @@
usleep(WAIT_PERIOD_MS*1000);
break;
}
+
if (writtenSize > reqSize) writtenSize = reqSize;
if (mFormat == AUDIO_FORMAT_PCM_8_BIT && !(mFlags & AUDIO_OUTPUT_FLAG_DIRECT)) {