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

Commit cbaffcff authored by Lajos Molnar's avatar Lajos Molnar
Browse files

Add MEDIA_STARTED/PAUSED/STOPPED events to media players



This is needed for the MediaTimeProvider java interface, so it does not
continually poll for current media time.

Note: NuPlayer and AwesomePlayer do not correctly handle stop (pause
instead), so for those we will signal PAUSED.

Signed-off-by: default avatarLajos Molnar <lajos@google.com>
Change-Id: I3c61e1bda475f131323f475c18a42e3ec66c9ae1
Bug: 10326117
parent b8689b31
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -42,6 +42,9 @@ enum media_event_type {
    MEDIA_BUFFERING_UPDATE  = 3,
    MEDIA_BUFFERING_UPDATE  = 3,
    MEDIA_SEEK_COMPLETE     = 4,
    MEDIA_SEEK_COMPLETE     = 4,
    MEDIA_SET_VIDEO_SIZE    = 5,
    MEDIA_SET_VIDEO_SIZE    = 5,
    MEDIA_STARTED           = 6,
    MEDIA_PAUSED            = 7,
    MEDIA_STOPPED           = 8,
    MEDIA_TIMED_TEXT        = 99,
    MEDIA_TIMED_TEXT        = 99,
    MEDIA_ERROR             = 100,
    MEDIA_ERROR             = 100,
    MEDIA_INFO              = 200,
    MEDIA_INFO              = 200,
+6 −0
Original line number Original line Diff line number Diff line
@@ -220,6 +220,9 @@ status_t MidiFile::start()
    }
    }


    mRender = true;
    mRender = true;
    if (mState == EAS_STATE_PLAY) {
        sendEvent(MEDIA_STARTED);
    }


    // wake up render thread
    // wake up render thread
    ALOGV("  wakeup render thread");
    ALOGV("  wakeup render thread");
@@ -242,6 +245,7 @@ status_t MidiFile::stop()
        }
        }
    }
    }
    mPaused = false;
    mPaused = false;
    sendEvent(MEDIA_STOPPED);
    return NO_ERROR;
    return NO_ERROR;
}
}


@@ -279,6 +283,7 @@ status_t MidiFile::pause()
        return ERROR_EAS_FAILURE;
        return ERROR_EAS_FAILURE;
    }
    }
    mPaused = true;
    mPaused = true;
    sendEvent(MEDIA_PAUSED);
    return NO_ERROR;
    return NO_ERROR;
}
}


@@ -382,6 +387,7 @@ status_t MidiFile::reset()
status_t MidiFile::reset_nosync()
status_t MidiFile::reset_nosync()
{
{
    ALOGV("MidiFile::reset_nosync");
    ALOGV("MidiFile::reset_nosync");
    sendEvent(MEDIA_STOPPED);
    // close file
    // close file
    if (mEasHandle) {
    if (mEasHandle) {
        EAS_CloseFile(mEasData, mEasHandle);
        EAS_CloseFile(mEasData, mEasHandle);
+3 −0
Original line number Original line Diff line number Diff line
@@ -731,6 +731,9 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
                ALOGV("renderer %s flush completed.", audio ? "audio" : "video");
            } else if (what == Renderer::kWhatVideoRenderingStart) {
            } else if (what == Renderer::kWhatVideoRenderingStart) {
                notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0);
                notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0);
            } else if (what == Renderer::kWhatMediaRenderingStart) {
                ALOGV("media rendering started");
                notifyListener(MEDIA_STARTED, 0, 0);
            }
            }
            break;
            break;
        }
        }
+5 −0
Original line number Original line Diff line number Diff line
@@ -255,6 +255,7 @@ status_t NuPlayerDriver::pause() {
            return OK;
            return OK;


        case STATE_RUNNING:
        case STATE_RUNNING:
            notifyListener(MEDIA_PAUSED);
            mPlayer->pause();
            mPlayer->pause();
            break;
            break;


@@ -287,6 +288,8 @@ status_t NuPlayerDriver::seekTo(int msec) {
        case STATE_PAUSED:
        case STATE_PAUSED:
        {
        {
            mAtEOS = false;
            mAtEOS = false;
            // seeks can take a while, so we essentially paused
            notifyListener(MEDIA_PAUSED);
            mPlayer->seekToAsync(seekTimeUs);
            mPlayer->seekToAsync(seekTimeUs);
            break;
            break;
        }
        }
@@ -345,6 +348,8 @@ status_t NuPlayerDriver::reset() {
            break;
            break;
    }
    }


    notifyListener(MEDIA_STOPPED);

    mState = STATE_RESET_IN_PROGRESS;
    mState = STATE_RESET_IN_PROGRESS;
    mPlayer->resetAsync();
    mPlayer->resetAsync();


+30 −0
Original line number Original line Diff line number Diff line
@@ -50,6 +50,8 @@ NuPlayer::Renderer::Renderer(
      mSyncQueues(false),
      mSyncQueues(false),
      mPaused(false),
      mPaused(false),
      mVideoRenderingStarted(false),
      mVideoRenderingStarted(false),
      mVideoRenderingStartGeneration(0),
      mAudioRenderingStartGeneration(0),
      mLastPositionUpdateUs(-1ll),
      mLastPositionUpdateUs(-1ll),
      mVideoLateByUs(0ll) {
      mVideoLateByUs(0ll) {
}
}
@@ -220,6 +222,23 @@ void NuPlayer::Renderer::signalAudioSinkChanged() {
    (new AMessage(kWhatAudioSinkChanged, id()))->post();
    (new AMessage(kWhatAudioSinkChanged, id()))->post();
}
}


void NuPlayer::Renderer::prepareForMediaRenderingStart() {
    mAudioRenderingStartGeneration = mAudioQueueGeneration;
    mVideoRenderingStartGeneration = mVideoQueueGeneration;
}

void NuPlayer::Renderer::notifyIfMediaRenderingStarted() {
    if (mVideoRenderingStartGeneration == mVideoQueueGeneration &&
        mAudioRenderingStartGeneration == mAudioQueueGeneration) {
        mVideoRenderingStartGeneration = -1;
        mAudioRenderingStartGeneration = -1;

        sp<AMessage> notify = mNotify->dup();
        notify->setInt32("what", kWhatMediaRenderingStart);
        notify->post();
    }
}

bool NuPlayer::Renderer::onDrainAudioQueue() {
bool NuPlayer::Renderer::onDrainAudioQueue() {
    uint32_t numFramesPlayed;
    uint32_t numFramesPlayed;
    if (mAudioSink->getPosition(&numFramesPlayed) != OK) {
    if (mAudioSink->getPosition(&numFramesPlayed) != OK) {
@@ -299,6 +318,8 @@ bool NuPlayer::Renderer::onDrainAudioQueue() {
        numBytesAvailableToWrite -= copy;
        numBytesAvailableToWrite -= copy;
        size_t copiedFrames = copy / mAudioSink->frameSize();
        size_t copiedFrames = copy / mAudioSink->frameSize();
        mNumFramesWritten += copiedFrames;
        mNumFramesWritten += copiedFrames;

        notifyIfMediaRenderingStarted();
    }
    }


    notifyPosition();
    notifyPosition();
@@ -405,6 +426,8 @@ void NuPlayer::Renderer::onDrainVideoQueue() {
        notifyVideoRenderingStart();
        notifyVideoRenderingStart();
    }
    }


    notifyIfMediaRenderingStarted();

    notifyPosition();
    notifyPosition();
}
}


@@ -552,6 +575,7 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) {
    // is flushed.
    // is flushed.
    syncQueuesDone();
    syncQueuesDone();


    ALOGV("flushing %s", audio ? "audio" : "video");
    if (audio) {
    if (audio) {
        flushQueue(&mAudioQueue);
        flushQueue(&mAudioQueue);


@@ -560,6 +584,8 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) {


        mDrainAudioQueuePending = false;
        mDrainAudioQueuePending = false;
        ++mAudioQueueGeneration;
        ++mAudioQueueGeneration;

        prepareForMediaRenderingStart();
    } else {
    } else {
        flushQueue(&mVideoQueue);
        flushQueue(&mVideoQueue);


@@ -568,6 +594,8 @@ void NuPlayer::Renderer::onFlush(const sp<AMessage> &msg) {


        mDrainVideoQueuePending = false;
        mDrainVideoQueuePending = false;
        ++mVideoQueueGeneration;
        ++mVideoQueueGeneration;

        prepareForMediaRenderingStart();
    }
    }


    notifyFlushComplete(audio);
    notifyFlushComplete(audio);
@@ -658,6 +686,8 @@ void NuPlayer::Renderer::onPause() {
    mDrainVideoQueuePending = false;
    mDrainVideoQueuePending = false;
    ++mVideoQueueGeneration;
    ++mVideoQueueGeneration;


    prepareForMediaRenderingStart();

    if (mHasAudio) {
    if (mHasAudio) {
        mAudioSink->pause();
        mAudioSink->pause();
    }
    }
Loading