Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22cb204c authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

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
parent 1fc756da
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
+4 −1
Original line number Diff line number Diff line
@@ -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;
}