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

Commit b408222b authored by Andreas Huber's avatar Andreas Huber
Browse files

Implement missing pause/resume support for NuPlayer.

Change-Id: Ia3f1ce521dd4b70e134ef03aa7c9db8e8d39a134
related-to-bug: 2368598
parent adde7faa
Loading
Loading
Loading
Loading
+16 −2
Original line number Original line Diff line number Diff line
@@ -92,11 +92,11 @@ void NuPlayer::start() {
}
}


void NuPlayer::pause() {
void NuPlayer::pause() {
    // XXX to be implemented
    (new AMessage(kWhatPause, id()))->post();
}
}


void NuPlayer::resume() {
void NuPlayer::resume() {
    // XXX to be implemented
    (new AMessage(kWhatResume, id()))->post();
}
}


void NuPlayer::resetAsync() {
void NuPlayer::resetAsync() {
@@ -430,6 +430,20 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
            break;
            break;
        }
        }


        case kWhatPause:
        {
            CHECK(mRenderer != NULL);
            mRenderer->pause();
            break;
        }

        case kWhatResume:
        {
            CHECK(mRenderer != NULL);
            mRenderer->resume();
            break;
        }

        default:
        default:
            TRESPASS();
            TRESPASS();
            break;
            break;
+2 −0
Original line number Original line Diff line number Diff line
@@ -75,6 +75,8 @@ private:
        kWhatRendererNotify,
        kWhatRendererNotify,
        kWhatReset,
        kWhatReset,
        kWhatSeek,
        kWhatSeek,
        kWhatPause,
        kWhatResume,
    };
    };


    wp<NuPlayerDriver> mDriver;
    wp<NuPlayerDriver> mDriver;
+58 −3
Original line number Original line Diff line number Diff line
@@ -42,7 +42,8 @@ NuPlayer::Renderer::Renderer(
      mFlushingVideo(false),
      mFlushingVideo(false),
      mHasAudio(mAudioSink != NULL),
      mHasAudio(mAudioSink != NULL),
      mHasVideo(true),
      mHasVideo(true),
      mSyncQueues(mHasAudio && mHasVideo) {
      mSyncQueues(mHasAudio && mHasVideo),
      mPaused(false) {
}
}


NuPlayer::Renderer::~Renderer() {
NuPlayer::Renderer::~Renderer() {
@@ -93,6 +94,14 @@ void NuPlayer::Renderer::signalTimeDiscontinuity() {
    mSyncQueues = mHasAudio && mHasVideo;
    mSyncQueues = mHasAudio && mHasVideo;
}
}


void NuPlayer::Renderer::pause() {
    (new AMessage(kWhatPause, id()))->post();
}

void NuPlayer::Renderer::resume() {
    (new AMessage(kWhatResume, id()))->post();
}

void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
    switch (msg->what()) {
    switch (msg->what()) {
        case kWhatDrainAudioQueue:
        case kWhatDrainAudioQueue:
@@ -151,6 +160,18 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
            break;
            break;
        }
        }


        case kWhatPause:
        {
            onPause();
            break;
        }

        case kWhatResume:
        {
            onResume();
            break;
        }

        default:
        default:
            TRESPASS();
            TRESPASS();
            break;
            break;
@@ -158,7 +179,7 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
}
}


void NuPlayer::Renderer::postDrainAudioQueue() {
void NuPlayer::Renderer::postDrainAudioQueue() {
    if (mDrainAudioQueuePending || mSyncQueues) {
    if (mDrainAudioQueuePending || mSyncQueues || mPaused) {
        return;
        return;
    }
    }


@@ -254,7 +275,7 @@ void NuPlayer::Renderer::onDrainAudioQueue() {
}
}


void NuPlayer::Renderer::postDrainVideoQueue() {
void NuPlayer::Renderer::postDrainVideoQueue() {
    if (mDrainVideoQueuePending || mSyncQueues) {
    if (mDrainVideoQueuePending || mSyncQueues || mPaused) {
        return;
        return;
    }
    }


@@ -528,5 +549,39 @@ void NuPlayer::Renderer::notifyPosition() {
    notify->post();
    notify->post();
}
}


void NuPlayer::Renderer::onPause() {
    CHECK(!mPaused);

    mDrainAudioQueuePending = false;
    ++mAudioQueueGeneration;

    mDrainVideoQueuePending = false;
    ++mVideoQueueGeneration;

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

    mPaused = true;
}

void NuPlayer::Renderer::onResume() {
    CHECK(mPaused);

    if (mHasAudio) {
        mAudioSink->start();
    }

    mPaused = false;

    if (!mAudioQueue.empty()) {
        postDrainAudioQueue();
    }

    if (!mVideoQueue.empty()) {
        postDrainVideoQueue();
    }
}

}  // namespace android
}  // namespace android
+9 −0
Original line number Original line Diff line number Diff line
@@ -41,6 +41,9 @@ struct NuPlayer::Renderer : public AHandler {


    void signalAudioSinkChanged();
    void signalAudioSinkChanged();


    void pause();
    void resume();

    enum {
    enum {
        kWhatEOS,
        kWhatEOS,
        kWhatFlushComplete,
        kWhatFlushComplete,
@@ -60,6 +63,8 @@ private:
        kWhatQueueEOS,
        kWhatQueueEOS,
        kWhatFlush,
        kWhatFlush,
        kWhatAudioSinkChanged,
        kWhatAudioSinkChanged,
        kWhatPause,
        kWhatResume,
    };
    };


    struct QueueEntry {
    struct QueueEntry {
@@ -91,6 +96,8 @@ private:
    bool mHasVideo;
    bool mHasVideo;
    bool mSyncQueues;
    bool mSyncQueues;


    bool mPaused;

    void onDrainAudioQueue();
    void onDrainAudioQueue();
    void postDrainAudioQueue();
    void postDrainAudioQueue();


@@ -101,6 +108,8 @@ private:
    void onQueueEOS(const sp<AMessage> &msg);
    void onQueueEOS(const sp<AMessage> &msg);
    void onFlush(const sp<AMessage> &msg);
    void onFlush(const sp<AMessage> &msg);
    void onAudioSinkChanged();
    void onAudioSinkChanged();
    void onPause();
    void onResume();


    void notifyEOS(bool audio);
    void notifyEOS(bool audio);
    void notifyFlushComplete(bool audio);
    void notifyFlushComplete(bool audio);