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

Commit 406a18b5 authored by Andreas Huber's avatar Andreas Huber
Browse files

Implement legacy behaviour for MediaPlayer's behaviour of starting from the...

Implement legacy behaviour for MediaPlayer's behaviour of starting from the start of the media on a start() call instead of resuming at the current position, if previously reached the end of the stream. Also properly report number of frames played to audio flinger. Finally, delay spawing the queue thread until actually used.

related-to-bug: 2453220
parent 5706329c
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -1614,6 +1614,8 @@ void MediaPlayerService::AudioOutput::CallbackWrapper(
    size_t actualSize = (*me->mCallback)(
    size_t actualSize = (*me->mCallback)(
            me, buffer->raw, buffer->size, me->mCallbackCookie);
            me, buffer->raw, buffer->size, me->mCallbackCookie);


    buffer->size = actualSize;

    if (actualSize > 0) {
    if (actualSize > 0) {
        me->snoopWrite(buffer->raw, actualSize);
        me->snoopWrite(buffer->raw, actualSize);
    }
    }
+21 −6
Original line number Original line Diff line number Diff line
@@ -178,7 +178,8 @@ void AwesomeLocalRenderer::init(
}
}


AwesomePlayer::AwesomePlayer()
AwesomePlayer::AwesomePlayer()
    : mTimeSource(NULL),
    : mQueueStarted(false),
      mTimeSource(NULL),
      mVideoRendererIsPreview(false),
      mVideoRendererIsPreview(false),
      mAudioPlayer(NULL),
      mAudioPlayer(NULL),
      mFlags(0),
      mFlags(0),
@@ -201,13 +202,13 @@ AwesomePlayer::AwesomePlayer()


    mAudioStatusEventPending = false;
    mAudioStatusEventPending = false;


    mQueue.start();

    reset();
    reset();
}
}


AwesomePlayer::~AwesomePlayer() {
AwesomePlayer::~AwesomePlayer() {
    if (mQueueStarted) {
        mQueue.stop();
        mQueue.stop();
    }


    reset();
    reset();


@@ -443,6 +444,8 @@ void AwesomePlayer::onStreamDone() {
        notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
        notifyListener_l(MEDIA_PLAYBACK_COMPLETE);


        pause_l();
        pause_l();

        mFlags |= AT_EOS;
    }
    }
}
}


@@ -517,6 +520,12 @@ status_t AwesomePlayer::play_l() {


    postBufferingEvent_l();
    postBufferingEvent_l();


    if (mFlags & AT_EOS) {
        // Legacy behaviour, if a stream finishes playing and then
        // is started again, we play from the start...
        seekTo_l(0);
    }

    return OK;
    return OK;
}
}


@@ -651,6 +660,7 @@ status_t AwesomePlayer::seekTo(int64_t timeUs) {
status_t AwesomePlayer::seekTo_l(int64_t timeUs) {
status_t AwesomePlayer::seekTo_l(int64_t timeUs) {
    mSeeking = true;
    mSeeking = true;
    mSeekTimeUs = timeUs;
    mSeekTimeUs = timeUs;
    mFlags &= ~AT_EOS;


    seekAudioIfNecessary_l();
    seekAudioIfNecessary_l();


@@ -989,6 +999,11 @@ status_t AwesomePlayer::prepareAsync_l() {
        return UNKNOWN_ERROR;  // async prepare already pending
        return UNKNOWN_ERROR;  // async prepare already pending
    }
    }


    if (!mQueueStarted) {
        mQueue.start();
        mQueueStarted = true;
    }

    mFlags |= PREPARING;
    mFlags |= PREPARING;
    mAsyncPrepareEvent = new AwesomeEvent(
    mAsyncPrepareEvent = new AwesomeEvent(
            this, &AwesomePlayer::onPrepareAsyncEvent);
            this, &AwesomePlayer::onPrepareAsyncEvent);
@@ -1089,7 +1104,7 @@ status_t AwesomePlayer::suspend() {
    state->mUriHeaders = mUriHeaders;
    state->mUriHeaders = mUriHeaders;
    state->mFileSource = mFileSource;
    state->mFileSource = mFileSource;


    state->mFlags = mFlags & (PLAYING | LOOPING);
    state->mFlags = mFlags & (PLAYING | LOOPING | AT_EOS);
    getPosition_l(&state->mPositionUs);
    getPosition_l(&state->mPositionUs);


    if (mLastVideoBuffer) {
    if (mLastVideoBuffer) {
@@ -1150,7 +1165,7 @@ status_t AwesomePlayer::resume() {


    seekTo_l(state->mPositionUs);
    seekTo_l(state->mPositionUs);


    mFlags = state->mFlags & LOOPING;
    mFlags = state->mFlags & (LOOPING | AT_EOS);


    if (state->mLastVideoFrame && mISurface != NULL) {
    if (state->mLastVideoFrame && mISurface != NULL) {
        mVideoRenderer =
        mVideoRenderer =
+2 −0
Original line number Original line Diff line number Diff line
@@ -92,12 +92,14 @@ private:
        FIRST_FRAME = 4,
        FIRST_FRAME = 4,
        PREPARING   = 8,
        PREPARING   = 8,
        PREPARED    = 16,
        PREPARED    = 16,
        AT_EOS      = 32,
    };
    };


    mutable Mutex mLock;
    mutable Mutex mLock;


    OMXClient mClient;
    OMXClient mClient;
    TimedEventQueue mQueue;
    TimedEventQueue mQueue;
    bool mQueueStarted;
    wp<MediaPlayerBase> mListener;
    wp<MediaPlayerBase> mListener;


    sp<ISurface> mISurface;
    sp<ISurface> mISurface;