From 22cb204cbb9fadd0a909e0e918c0cb19c60da740 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Thu, 25 Aug 2011 16:47:23 -0700 Subject: [PATCH] Bug 4364249 Play position is 0 after flushing AudioTrack AudioTrack::stop() is not synchronous, so a stop() followed by flush(), which is synchronous, will not always report a playhead position of 0 after being called. This CL adds a flag to mark a track as flushed, and report the correct playhead position in this state. Bug 5217011 has been created to address the real issue in the future, where flush could be made synchronous, to properly address bug 4364249. Change-Id: Icf989d41a6bcd5985bb87764c287f3edb7e26d12 --- include/media/AudioTrack.h | 1 + media/libmedia/AudioTrack.cpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index df30e8c9f0d77..923518dd1ecd5 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -481,6 +481,7 @@ private: bool mMarkerReached; uint32_t mNewPosition; uint32_t mUpdatePeriod; + bool mFlushed; // FIXME will be made obsolete by making flush() synchronous uint32_t mFlags; int mSessionId; int mAuxEffectId; diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 3949c3936902a..cecedb517d645 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -259,6 +259,7 @@ status_t AudioTrack::set( mMarkerReached = false; mNewPosition = 0; mUpdatePeriod = 0; + mFlushed = false; mFlags = flags; AudioSystem::acquireAudioSessionId(mSessionId); @@ -337,6 +338,7 @@ void AudioTrack::start() audio_track_cblk_t* cblk = mCblk; if (mActive == 0) { + mFlushed = false; mActive = 1; mNewPosition = cblk->server + mUpdatePeriod; cblk->lock.lock(); @@ -437,6 +439,7 @@ void AudioTrack::flush_l() mUpdatePeriod = 0; if (!mActive) { + mFlushed = true; mAudioTrack->flush(); // Release AudioTrack callback thread in case it was waiting for new buffers // in AudioTrack::obtainBuffer() @@ -655,7 +658,7 @@ status_t AudioTrack::getPosition(uint32_t *position) { if (position == 0) return BAD_VALUE; AutoMutex lock(mLock); - *position = mCblk->server; + *position = mFlushed ? 0 : mCblk->server; return NO_ERROR; }