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

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

Merge "NuPlayer: add pause timeout event for offload audio." into lmp-dev

parents ad5447f6 f5b1db11
Loading
Loading
Loading
Loading
+39 −1
Original line number Diff line number Diff line
@@ -32,6 +32,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;

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

NuPlayer::Renderer::~Renderer() {
@@ -259,6 +265,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;
@@ -951,6 +968,7 @@ void NuPlayer::Renderer::onPause() {

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

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

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

@@ -1051,6 +1070,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);
@@ -1069,5 +1093,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
@@ -66,6 +66,7 @@ struct NuPlayer::Renderer : public AHandler {
        kWhatVideoRenderingStart = 'vdrd',
        kWhatMediaRenderingStart = 'mdrd',
        kWhatAudioOffloadTearDown = 'aOTD',
        kWhatAudioOffloadPauseTimeout = 'aOPT',
    };

protected:
@@ -132,6 +133,9 @@ private:
    int64_t mLastPositionUpdateUs;
    int64_t mVideoLateByUs;

    int32_t mAudioOffloadPauseTimeoutGeneration;
    bool mAudioOffloadTornDown;

    size_t fillAudioBuffer(void *buffer, size_t size);

    bool onDrainAudioQueue();
@@ -168,6 +172,9 @@ private:

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

    void startAudioOffloadPauseTimeout();
    void cancelAudioOffloadPauseTimeout();

    DISALLOW_EVIL_CONSTRUCTORS(Renderer);
};