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

Commit d362ea17 authored by Ronghua Wu's avatar Ronghua Wu Committed by Android (Google) Code Review
Browse files

Merge "AudioPlayback: delay the post of EOS based on pending playout." into lmp-dev

parents 1754351d 5095d709
Loading
Loading
Loading
Loading
+17 −21
Original line number Original line Diff line number Diff line
@@ -410,8 +410,11 @@ bool NuPlayer::Renderer::onDrainAudioQueue() {


        if (entry->mBuffer == NULL) {
        if (entry->mBuffer == NULL) {
            // EOS
            // EOS

            int64_t postEOSDelayUs = 0;
            notifyEOS(true /* audio */, entry->mFinalResult);
            if (mAudioSink->needsTrailingPadding()) {
                postEOSDelayUs = getAudioPendingPlayoutUs() + 1000 * mAudioSink->latency();
            }
            notifyEOS(true /* audio */, entry->mFinalResult, postEOSDelayUs);


            mAudioQueue.erase(mAudioQueue.begin());
            mAudioQueue.erase(mAudioQueue.begin());
            entry = NULL;
            entry = NULL;
@@ -421,26 +424,11 @@ bool NuPlayer::Renderer::onDrainAudioQueue() {
        if (entry->mOffset == 0) {
        if (entry->mOffset == 0) {
            int64_t mediaTimeUs;
            int64_t mediaTimeUs;
            CHECK(entry->mBuffer->meta()->findInt64("timeUs", &mediaTimeUs));
            CHECK(entry->mBuffer->meta()->findInt64("timeUs", &mediaTimeUs));

            ALOGV("rendering audio at media time %.2f secs", mediaTimeUs / 1E6);
            ALOGV("rendering audio at media time %.2f secs", mediaTimeUs / 1E6);

            mAnchorTimeMediaUs = mediaTimeUs;
            mAnchorTimeMediaUs = mediaTimeUs;


            uint32_t numFramesPlayed;
            mAnchorTimeRealUs = ALooper::GetNowUs()
            CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK);
                    + getAudioPendingPlayoutUs() + 1000 * mAudioSink->latency() / 2;

            uint32_t numFramesPendingPlayout =
                mNumFramesWritten - numFramesPlayed;

            int64_t realTimeOffsetUs =
                (mAudioSink->latency() / 2  /* XXX */
                    + numFramesPendingPlayout
                        * mAudioSink->msecsPerFrame()) * 1000ll;

            // ALOGI("realTimeOffsetUs = %lld us", realTimeOffsetUs);

            mAnchorTimeRealUs =
                ALooper::GetNowUs() + realTimeOffsetUs;
        }
        }


        size_t copy = entry->mBuffer->size() - entry->mOffset;
        size_t copy = entry->mBuffer->size() - entry->mOffset;
@@ -494,6 +482,14 @@ bool NuPlayer::Renderer::onDrainAudioQueue() {
    return !mAudioQueue.empty();
    return !mAudioQueue.empty();
}
}


int64_t NuPlayer::Renderer::getAudioPendingPlayoutUs() {
    uint32_t numFramesPlayed;
    CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK);

    uint32_t numFramesPendingPlayout = mNumFramesWritten - numFramesPlayed;
    return numFramesPendingPlayout * mAudioSink->msecsPerFrame() * 1000;
}

void NuPlayer::Renderer::postDrainVideoQueue() {
void NuPlayer::Renderer::postDrainVideoQueue() {
    if (mDrainVideoQueuePending || mSyncQueues || mPaused) {
    if (mDrainVideoQueuePending || mSyncQueues || mPaused) {
        return;
        return;
@@ -607,12 +603,12 @@ void NuPlayer::Renderer::notifyVideoRenderingStart() {
    notify->post();
    notify->post();
}
}


void NuPlayer::Renderer::notifyEOS(bool audio, status_t finalResult) {
void NuPlayer::Renderer::notifyEOS(bool audio, status_t finalResult, int64_t delayUs) {
    sp<AMessage> notify = mNotify->dup();
    sp<AMessage> notify = mNotify->dup();
    notify->setInt32("what", kWhatEOS);
    notify->setInt32("what", kWhatEOS);
    notify->setInt32("audio", static_cast<int32_t>(audio));
    notify->setInt32("audio", static_cast<int32_t>(audio));
    notify->setInt32("finalResult", finalResult);
    notify->setInt32("finalResult", finalResult);
    notify->post();
    notify->post(delayUs);
}
}


void NuPlayer::Renderer::notifyAudioOffloadTearDown() {
void NuPlayer::Renderer::notifyAudioOffloadTearDown() {
+2 −1
Original line number Original line Diff line number Diff line
@@ -129,6 +129,7 @@ private:
    size_t fillAudioBuffer(void *buffer, size_t size);
    size_t fillAudioBuffer(void *buffer, size_t size);


    bool onDrainAudioQueue();
    bool onDrainAudioQueue();
    int64_t getAudioPendingPlayoutUs();
    void postDrainAudioQueue_l(int64_t delayUs = 0);
    void postDrainAudioQueue_l(int64_t delayUs = 0);


    void onDrainVideoQueue();
    void onDrainVideoQueue();
@@ -146,7 +147,7 @@ private:
    void onResume();
    void onResume();
    void onAudioOffloadTearDown();
    void onAudioOffloadTearDown();


    void notifyEOS(bool audio, status_t finalResult);
    void notifyEOS(bool audio, status_t finalResult, int64_t delayUs = 0);
    void notifyFlushComplete(bool audio);
    void notifyFlushComplete(bool audio);
    void notifyPosition();
    void notifyPosition();
    void notifyVideoLateBy(int64_t lateByUs);
    void notifyVideoLateBy(int64_t lateByUs);