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

Commit af11287b authored by Lajos Molnar's avatar Lajos Molnar Committed by Android (Google) Code Review
Browse files

Merge "NuPlayer: add support for proper stop" into lmp-dev

parents 97c7fa1b 4b75b867
Loading
Loading
Loading
Loading
+61 −3
Original line number Diff line number Diff line
@@ -167,6 +167,16 @@ status_t NuPlayerDriver::prepare_l() {
                mCondition.wait(mLock);
            }
            return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR;
        case STATE_STOPPED:
            // this is really just paused. handle as seek to start
            mAtEOS = false;
            mState = STATE_STOPPED_AND_PREPARING;
            mIsAsyncPrepare = false;
            mPlayer->seekToAsync(0);
            while (mState == STATE_STOPPED_AND_PREPARING) {
                mCondition.wait(mLock);
            }
            return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR;
        default:
            return INVALID_OPERATION;
    };
@@ -181,6 +191,13 @@ status_t NuPlayerDriver::prepareAsync() {
            mIsAsyncPrepare = true;
            mPlayer->prepareAsync();
            return OK;
        case STATE_STOPPED:
            // this is really just paused. handle as seek to start
            mAtEOS = false;
            mState = STATE_STOPPED_AND_PREPARING;
            mIsAsyncPrepare = true;
            mPlayer->seekToAsync(0);
            return OK;
        default:
            return INVALID_OPERATION;
    };
@@ -224,6 +241,7 @@ status_t NuPlayerDriver::start() {
            break;

        case STATE_PAUSED:
        case STATE_STOPPED_AND_PREPARED:
        {
            mPlayer->resume();
            break;
@@ -239,7 +257,29 @@ status_t NuPlayerDriver::start() {
}

status_t NuPlayerDriver::stop() {
    return pause();
    Mutex::Autolock autoLock(mLock);

    switch (mState) {
        case STATE_RUNNING:
            mPlayer->pause();
            // fall through

        case STATE_PAUSED:
            notifyListener(MEDIA_STOPPED);
            // fall through

        case STATE_PREPARED:
        case STATE_STOPPED:
        case STATE_STOPPED_AND_PREPARING:
        case STATE_STOPPED_AND_PREPARED:
            mState = STATE_STOPPED;
            break;

        default:
            return INVALID_OPERATION;
    }

    return OK;
}

status_t NuPlayerDriver::pause() {
@@ -348,7 +388,9 @@ status_t NuPlayerDriver::reset() {
            break;
    }

    if (mState != STATE_STOPPED) {
        notifyListener(MEDIA_STOPPED);
    }

    mState = STATE_RESET_IN_PROGRESS;
    mPlayer->resetAsync();
@@ -483,7 +525,23 @@ void NuPlayerDriver::notifyPosition(int64_t positionUs) {
}

void NuPlayerDriver::notifySeekComplete() {
    notifyListener(MEDIA_SEEK_COMPLETE);
    bool wasSeeking = true;
    {
        Mutex::Autolock autoLock(mLock);
        if (mState == STATE_STOPPED_AND_PREPARING) {
            wasSeeking = false;
            mState = STATE_STOPPED_AND_PREPARED;
            mCondition.broadcast();
            if (!mIsAsyncPrepare) {
                // if we are preparing synchronously, no need to notify listener
                return;
            }
        } else if (mState == STATE_STOPPED) {
            // no need to notify listener
            return;
        }
    }
    notifyListener(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED);
}

void NuPlayerDriver::notifyFrameStats(
+3 −0
Original line number Diff line number Diff line
@@ -86,6 +86,9 @@ private:
        STATE_RUNNING,
        STATE_PAUSED,
        STATE_RESET_IN_PROGRESS,
        STATE_STOPPED,                  // equivalent to PAUSED
        STATE_STOPPED_AND_PREPARING,    // equivalent to PAUSED, but seeking
        STATE_STOPPED_AND_PREPARED,     // equivalent to PAUSED, but seek complete
    };

    mutable Mutex mLock;