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

Commit 3a2956d1 authored by Wei Jia's avatar Wei Jia
Browse files

Fall back to s/w decoding when audio offloading fails.

Change-Id: Icde3d65c964b2a13fb1c6636adcce52ae048a3fb
parent ecc01ef0
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -754,6 +754,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                            offloadInfo.has_video = (mVideoDecoder != NULL);
                            offloadInfo.is_streaming = true;

                            ALOGV("try to open AudioSink in offload mode");
                            err = mAudioSink->open(
                                    sampleRate,
                                    numChannels,
@@ -793,6 +794,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {

                    if (!mOffloadAudio) {
                        flags &= ~AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD;
                        ALOGV("open AudioSink in NON-offload mode");
                        CHECK_EQ(mAudioSink->open(
                                    sampleRate,
                                    numChannels,
@@ -940,6 +942,21 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
            } else if (what == Renderer::kWhatMediaRenderingStart) {
                ALOGV("media rendering started");
                notifyListener(MEDIA_STARTED, 0, 0);
            } else if (what == Renderer::kWhatAudioOffloadTearDown) {
                ALOGV("Tear down audio offload, fall back to s/w path");
                int64_t positionUs;
                CHECK(msg->findInt64("positionUs", &positionUs));
                mAudioSink->close();
                mAudioDecoder.clear();
                mRenderer->flush(true /* audio */);
                if (mVideoDecoder != NULL) {
                    mRenderer->flush(false /* audio */);
                }
                mRenderer->signalDisableOffloadAudio();
                mOffloadAudio = false;

                performSeek(positionUs);
                instantiateDecoder(true /* audio */, &mAudioDecoder);
            }
            break;
        }
+28 −1
Original line number Diff line number Diff line
@@ -223,6 +223,12 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
            break;
        }

        case kWhatAudioOffloadTearDown:
        {
            onAudioOffloadTearDown();
            break;
        }

        default:
            TRESPASS();
            break;
@@ -294,7 +300,7 @@ size_t NuPlayer::Renderer::AudioSinkCallback(

        case MediaPlayerBase::AudioSink::CB_EVENT_TEAR_DOWN:
        {
            // TODO: send this to player.
            me->notifyAudioOffloadTearDown();
            break;
        }
    }
@@ -582,6 +588,10 @@ void NuPlayer::Renderer::notifyEOS(bool audio, status_t finalResult) {
    notify->post();
}

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

void NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) {
    int32_t audio;
    CHECK(msg->findInt32("audio", &audio));
@@ -814,6 +824,7 @@ void NuPlayer::Renderer::onAudioSinkChanged() {
void NuPlayer::Renderer::onDisableOffloadAudio() {
    Mutex::Autolock autoLock(mLock);
    mFlags &= ~FLAG_OFFLOAD_AUDIO;
    ++mAudioQueueGeneration;
}

void NuPlayer::Renderer::notifyPosition() {
@@ -880,5 +891,21 @@ void NuPlayer::Renderer::onResume() {
    }
}

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

    int64_t currentPositionUs = mFirstAudioTimeUs
            + (numFramesPlayed * mAudioSink->msecsPerFrame()) * 1000ll;

    mAudioSink->stop();
    mAudioSink->flush();

    sp<AMessage> notify = mNotify->dup();
    notify->setInt32("what", kWhatAudioOffloadTearDown);
    notify->setInt64("positionUs", currentPositionUs);
    notify->post();
}

}  // namespace android
+3 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ struct NuPlayer::Renderer : public AHandler {
        kWhatPosition            = 'posi',
        kWhatVideoRenderingStart = 'vdrd',
        kWhatMediaRenderingStart = 'mdrd',
        kWhatAudioOffloadTearDown = 'aOTD',
    };

protected:
@@ -143,12 +144,14 @@ private:
    void onDisableOffloadAudio();
    void onPause();
    void onResume();
    void onAudioOffloadTearDown();

    void notifyEOS(bool audio, status_t finalResult);
    void notifyFlushComplete(bool audio);
    void notifyPosition();
    void notifyVideoLateBy(int64_t lateByUs);
    void notifyVideoRenderingStart();
    void notifyAudioOffloadTearDown();

    void flushQueue(List<QueueEntry> *queue);
    bool dropBufferWhileFlushing(bool audio, const sp<AMessage> &msg);