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

Commit 918ae2c0 authored by Dhanalakshmi Siddani's avatar Dhanalakshmi Siddani Committed by Steve Kondik
Browse files

audio: Support for compress offload recovery

- Add support for time stamp calculation on time stamp query
  failure during SSR for playback session

 CRs-Fixed: 683288

Change-Id: I08a5ea333732b76bb9df110d905daae074b7864b
parent 644eec25
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -355,9 +355,11 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {

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

                if (mAudioSink->getPosition(&numFramesPlayed) != OK) {
                    ALOGE("Error in time stamp query, return from here.\
                             Fillbuffer is called as part of session recreation");
                    break;
                }
                uint32_t numFramesPendingPlayout =
                    mNumFramesWritten - numFramesPlayed;

@@ -1294,6 +1296,7 @@ int64_t NuPlayer::Renderer::getPlayedOutAudioDurationUs(int64_t nowUs) {
    int64_t numFramesPlayedAt;
    AudioTimestamp ts;
    static const int64_t kStaleTimestamp100ms = 100000;
    int64_t durationUs;

    status_t res = mAudioSink->getTimestamp(ts);
    if (res == OK) {                 // case 1: mixing audio tracks and offloaded tracks.
@@ -1320,15 +1323,21 @@ int64_t NuPlayer::Renderer::getPlayedOutAudioDurationUs(int64_t nowUs) {
        //        numFramesPlayed, (long long)numFramesPlayedAt);
    } else {                         // case 3: transitory at new track or audio fast tracks.
        res = mAudioSink->getPosition(&numFramesPlayed);
        CHECK_EQ(res, (status_t)OK);
        if (res != OK) {
            //query to getPosition fails, use system clock to simulate render position
            getCurrentPosition(&durationUs);
            durationUs = durationUs - mAnchorTimeMediaUs;
            return durationUs;
        } else {
            numFramesPlayedAt = nowUs;
            numFramesPlayedAt += 1000LL * mAudioSink->latency() / 2; /* XXX */
        }
        //ALOGD("getPosition: %d %lld", numFramesPlayed, numFramesPlayedAt);
    }

    // TODO: remove the (int32_t) casting below as it may overflow at 12.4 hours.
    //CHECK_EQ(numFramesPlayed & (1 << 31), 0);  // can't be negative until 12.4 hrs, test
    int64_t durationUs = (int64_t)((int32_t)numFramesPlayed * 1000LL * mAudioSink->msecsPerFrame())
    durationUs = (int64_t)((int32_t)numFramesPlayed * 1000LL * mAudioSink->msecsPerFrame())
            + nowUs - numFramesPlayedAt;
    if (durationUs < 0) {
        // Occurs when numFramesPlayed position is very small and the following:
+2 −2

File changed.

Contains only whitespace changes.