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 Diff line number Diff line
@@ -410,8 +410,11 @@ bool NuPlayer::Renderer::onDrainAudioQueue() {

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

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

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

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

            mAnchorTimeMediaUs = mediaTimeUs;

            uint32_t numFramesPlayed;
            CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed), (status_t)OK);

            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;
            mAnchorTimeRealUs = ALooper::GetNowUs()
                    + getAudioPendingPlayoutUs() + 1000 * mAudioSink->latency() / 2;
        }

        size_t copy = entry->mBuffer->size() - entry->mOffset;
@@ -494,6 +482,14 @@ bool NuPlayer::Renderer::onDrainAudioQueue() {
    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() {
    if (mDrainVideoQueuePending || mSyncQueues || mPaused) {
        return;
@@ -607,12 +603,12 @@ void NuPlayer::Renderer::notifyVideoRenderingStart() {
    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();
    notify->setInt32("what", kWhatEOS);
    notify->setInt32("audio", static_cast<int32_t>(audio));
    notify->setInt32("finalResult", finalResult);
    notify->post();
    notify->post(delayUs);
}

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

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

    void onDrainVideoQueue();
@@ -146,7 +147,7 @@ private:
    void onResume();
    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 notifyPosition();
    void notifyVideoLateBy(int64_t lateByUs);