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

Commit bd7b7177 authored by Andreas Huber's avatar Andreas Huber
Browse files

Avoid a race condition while signaling audio EOS/seek complete by acquiring the lock.

Change-Id: Idfea452ff661b264e013fe515bcd2a2762bd959c
related-to-bug: 4193552
parent 94baecca
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ bool StagefrightPlayer::isPlaying() {
}

status_t StagefrightPlayer::seekTo(int msec) {
    LOGV("seekTo");
    LOGV("seekTo %.2f secs", msec / 1E3);

    status_t err = mPlayer->seekTo((int64_t)msec * 1000);

+19 −4
Original line number Diff line number Diff line
@@ -311,6 +311,10 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
        return size;
    }

    bool postSeekComplete = false;
    bool postEOS = false;
    int64_t postEOSDelayUs = 0;

    size_t size_done = 0;
    size_t size_remaining = size;
    while (size_remaining > 0) {
@@ -337,7 +341,7 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {

                mSeeking = false;
                if (mObserver) {
                    mObserver->postAudioSeekComplete();
                    postSeekComplete = true;
                }
            }
        }
@@ -389,7 +393,8 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
                         numFramesPendingPlayout,
                         timeToCompletionUs, timeToCompletionUs / 1E6);

                    mObserver->postAudioEOS(timeToCompletionUs + mLatencyUs);
                    postEOS = true;
                    postEOSDelayUs = timeToCompletionUs + mLatencyUs;
                }

                mReachedEOS = true;
@@ -433,8 +438,18 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
        size_remaining -= copy;
    }

    {
        Mutex::Autolock autoLock(mLock);
        mNumFramesPlayed += size_done / mFrameSize;
    }

    if (postEOS) {
        mObserver->postAudioEOS(postEOSDelayUs);
    }

    if (postSeekComplete) {
        mObserver->postAudioSeekComplete();
    }

    return size_done;
}
+2 −0
Original line number Diff line number Diff line
@@ -1859,10 +1859,12 @@ uint32_t AwesomePlayer::flags() const {
}

void AwesomePlayer::postAudioEOS(int64_t delayUs) {
    Mutex::Autolock autoLock(mLock);
    postCheckAudioStatusEvent_l(delayUs);
}

void AwesomePlayer::postAudioSeekComplete() {
    Mutex::Autolock autoLock(mLock);
    postCheckAudioStatusEvent_l(0 /* delayUs */);
}