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

Commit 2a79c327 authored by Marco Nelissen's avatar Marco Nelissen
Browse files

Fix SoundPool lockup

NuPlayerDriver needs to update its internal state before calling
its listener, so that when the listener calls back into NuPlayerDriver,
NuPlayerDriver has the right state.

Bug: 14057920
Change-Id: I224882c427f5e3c9d4bf96c5d68075e235062401
parent d42173a4
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -287,8 +287,9 @@ status_t NuPlayerDriver::stop() {
            // fall through

        case STATE_PAUSED:
            mState = STATE_STOPPED;
            notifyListener_l(MEDIA_STOPPED);
            // fall through
            break;

        case STATE_PREPARED:
        case STATE_STOPPED:
@@ -314,6 +315,8 @@ status_t NuPlayerDriver::pause() {
            return OK;

        case STATE_RUNNING:
            setPauseStartedTimeIfNeeded();
            mState = STATE_PAUSED;
            notifyListener_l(MEDIA_PAUSED);
            mPlayer->pause();
            break;
@@ -322,9 +325,6 @@ status_t NuPlayerDriver::pause() {
            return INVALID_OPERATION;
    }

    setPauseStartedTimeIfNeeded();
    mState = STATE_PAUSED;

    return OK;
}

@@ -675,15 +675,17 @@ void NuPlayerDriver::notifyPrepareCompleted(status_t err) {
    mAsyncResult = err;

    if (err == OK) {
        // update state before notifying client, so that if client calls back into NuPlayerDriver
        // in response, NuPlayerDriver has the right state
        mState = STATE_PREPARED;
        if (mIsAsyncPrepare) {
            notifyListener_l(MEDIA_PREPARED);
        }
        mState = STATE_PREPARED;
    } else {
        mState = STATE_UNPREPARED;
        if (mIsAsyncPrepare) {
            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
        }
        mState = STATE_UNPREPARED;
    }

    mCondition.broadcast();