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

Commit 8a092d30 authored by Wei Jia's avatar Wei Jia
Browse files

NuPlayer: fix behavior of setPlaybackParams.

setPlaybackParams with zero speed is equivalent to pause().
setPlaybackParams with non-zero speed should start playback when player has
been prepared.
Bug: 29032949

Change-Id: Ib7738da653208f4fe5a8f1d7cf98b8479b3dc798
parent 596e81bc
Loading
Loading
Loading
Loading
+14 −2
Original line number Original line Diff line number Diff line
@@ -188,6 +188,7 @@ NuPlayer::NuPlayer(pid_t pid)
      mPlaybackSettings(AUDIO_PLAYBACK_RATE_DEFAULT),
      mPlaybackSettings(AUDIO_PLAYBACK_RATE_DEFAULT),
      mVideoFpsHint(-1.f),
      mVideoFpsHint(-1.f),
      mStarted(false),
      mStarted(false),
      mPrepared(false),
      mResetting(false),
      mResetting(false),
      mSourceStarted(false),
      mSourceStarted(false),
      mPaused(false),
      mPaused(false),
@@ -768,9 +769,17 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                    newRate.mSpeed = mPlaybackSettings.mSpeed;
                    newRate.mSpeed = mPlaybackSettings.mSpeed;
                    mPlaybackSettings = newRate;
                    mPlaybackSettings = newRate;
                } else { /* rate.mSpeed != 0.f */
                } else { /* rate.mSpeed != 0.f */
                    mPlaybackSettings = rate;
                    if (mStarted) {
                        // do not resume yet if the source is still buffering
                        if (!mPausedForBuffering) {
                            onResume();
                            onResume();
                        }
                    } else if (mPrepared) {
                        onStart();
                    }

                    mPausedByClient = false;
                    mPausedByClient = false;
                    mPlaybackSettings = rate;
                }
                }
            }
            }


@@ -2012,6 +2021,7 @@ void NuPlayer::performReset() {
    }
    }


    mStarted = false;
    mStarted = false;
    mPrepared = false;
    mResetting = false;
    mResetting = false;
    mSourceStarted = false;
    mSourceStarted = false;
}
}
@@ -2124,6 +2134,8 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
                        new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */,
                        new FlushDecoderAction(FLUSH_CMD_SHUTDOWN /* audio */,
                                               FLUSH_CMD_SHUTDOWN /* video */));
                                               FLUSH_CMD_SHUTDOWN /* video */));
                processDeferredActions();
                processDeferredActions();
            } else {
                mPrepared = true;
            }
            }


            sp<NuPlayerDriver> driver = mDriver.promote();
            sp<NuPlayerDriver> driver = mDriver.promote();
+1 −0
Original line number Original line Diff line number Diff line
@@ -198,6 +198,7 @@ private:
    AVSyncSettings mSyncSettings;
    AVSyncSettings mSyncSettings;
    float mVideoFpsHint;
    float mVideoFpsHint;
    bool mStarted;
    bool mStarted;
    bool mPrepared;
    bool mResetting;
    bool mResetting;
    bool mSourceStarted;
    bool mSourceStarted;


+8 −2
Original line number Original line Diff line number Diff line
@@ -243,7 +243,10 @@ status_t NuPlayerDriver::prepareAsync() {
status_t NuPlayerDriver::start() {
status_t NuPlayerDriver::start() {
    ALOGD("start(%p), state is %d, eos is %d", this, mState, mAtEOS);
    ALOGD("start(%p), state is %d, eos is %d", this, mState, mAtEOS);
    Mutex::Autolock autoLock(mLock);
    Mutex::Autolock autoLock(mLock);
    return start_l();
}


status_t NuPlayerDriver::start_l() {
    switch (mState) {
    switch (mState) {
        case STATE_UNPREPARED:
        case STATE_UNPREPARED:
        {
        {
@@ -357,8 +360,11 @@ status_t NuPlayerDriver::setPlaybackSettings(const AudioPlaybackRate &rate) {
        if (rate.mSpeed == 0.f && mState == STATE_RUNNING) {
        if (rate.mSpeed == 0.f && mState == STATE_RUNNING) {
            mState = STATE_PAUSED;
            mState = STATE_PAUSED;
            notifyListener_l(MEDIA_PAUSED);
            notifyListener_l(MEDIA_PAUSED);
        } else if (rate.mSpeed != 0.f && mState == STATE_PAUSED) {
        } else if (rate.mSpeed != 0.f
            mState = STATE_RUNNING;
                && (mState == STATE_PAUSED
                    || mState == STATE_STOPPED_AND_PREPARED
                    || mState == STATE_PREPARED)) {
            err = start_l();
        }
        }
    }
    }
    return err;
    return err;
+1 −0
Original line number Original line Diff line number Diff line
@@ -123,6 +123,7 @@ private:
    bool mAutoLoop;
    bool mAutoLoop;


    status_t prepare_l();
    status_t prepare_l();
    status_t start_l();
    void notifyListener_l(int msg, int ext1 = 0, int ext2 = 0, const Parcel *in = NULL);
    void notifyListener_l(int msg, int ext1 = 0, int ext2 = 0, const Parcel *in = NULL);


    DISALLOW_EVIL_CONSTRUCTORS(NuPlayerDriver);
    DISALLOW_EVIL_CONSTRUCTORS(NuPlayerDriver);