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

Commit f5b1db11 authored by Ronghua Wu's avatar Ronghua Wu
Browse files

NuPlayer: add pause timeout event for offload audio.

Bug: 17375249
Change-Id: Ie59c6b372e9ad2aace3d1e27b9896d79de35d722
parent 4409ba46
Loading
Loading
Loading
Loading
+39 −1
Original line number Diff line number Diff line
@@ -30,6 +30,10 @@

namespace android {

// Maximum time in paused state when offloading audio decompression. When elapsed, the AudioSink
// is closed to allow the audio DSP to power down.
static const int64_t kOffloadPauseMaxUs = 60000000ll;

// static
const int64_t NuPlayer::Renderer::kMinPositionUpdateDelayUs = 100000ll;

@@ -59,7 +63,9 @@ NuPlayer::Renderer::Renderer(
      mVideoRenderingStartGeneration(0),
      mAudioRenderingStartGeneration(0),
      mLastPositionUpdateUs(-1ll),
      mVideoLateByUs(0ll) {
      mVideoLateByUs(0ll),
      mAudioOffloadPauseTimeoutGeneration(0),
      mAudioOffloadTornDown(false) {
}

NuPlayer::Renderer::~Renderer() {
@@ -243,6 +249,17 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
            break;
        }

        case kWhatAudioOffloadPauseTimeout:
        {
            int32_t generation;
            CHECK(msg->findInt32("generation", &generation));
            if (generation != mAudioOffloadPauseTimeoutGeneration) {
                break;
            }
            onAudioOffloadTearDown();
            break;
        }

        default:
            TRESPASS();
            break;
@@ -919,6 +936,7 @@ void NuPlayer::Renderer::onPause() {

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

    ALOGV("now paused audio queue has %d entries, video has %d entries",
@@ -931,6 +949,7 @@ void NuPlayer::Renderer::onResume() {
    }

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

@@ -1012,6 +1031,11 @@ int64_t NuPlayer::Renderer::getPlayedOutAudioDurationUs(int64_t nowUs) {
}

void NuPlayer::Renderer::onAudioOffloadTearDown() {
    if (mAudioOffloadTornDown) {
        return;
    }
    mAudioOffloadTornDown = true;

    int64_t firstAudioTimeUs;
    {
        Mutex::Autolock autoLock(mLock);
@@ -1030,5 +1054,19 @@ void NuPlayer::Renderer::onAudioOffloadTearDown() {
    notify->post();
}

void NuPlayer::Renderer::startAudioOffloadPauseTimeout() {
    if (offloadingAudio()) {
        sp<AMessage> msg = new AMessage(kWhatAudioOffloadPauseTimeout, id());
        msg->setInt32("generation", mAudioOffloadPauseTimeoutGeneration);
        msg->post(kOffloadPauseMaxUs);
    }
}

void NuPlayer::Renderer::cancelAudioOffloadPauseTimeout() {
    if (offloadingAudio()) {
        ++mAudioOffloadPauseTimeoutGeneration;
    }
}

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

protected:
@@ -127,6 +128,9 @@ private:
    int64_t mLastPositionUpdateUs;
    int64_t mVideoLateByUs;

    int32_t mAudioOffloadPauseTimeoutGeneration;
    bool mAudioOffloadTornDown;

    size_t fillAudioBuffer(void *buffer, size_t size);

    bool onDrainAudioQueue();
@@ -162,6 +166,9 @@ private:

    bool offloadingAudio() const { return (mFlags & FLAG_OFFLOAD_AUDIO) != 0; }

    void startAudioOffloadPauseTimeout();
    void cancelAudioOffloadPauseTimeout();

    DISALLOW_EVIL_CONSTRUCTORS(Renderer);
};