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

Commit 8735d0dd authored by Zhou Song's avatar Zhou Song Committed by Andy Hung
Browse files

audio: return accurate frame count when track is flushed

To avoid track frames to be processed early before full filled,
when track is flushed, framesReady should return accurate
available frames to avoid putting track into ready state
too early, otherwise silence can be inserted as buffer is
insufficient which leads to audio glitch.

Bug: 166610318
Test: see bug, ringtone playback no regression.
Merged-In: I3b04999a29d85a91b54734514cfa93bc93f55c33
Change-Id: I3b04999a29d85a91b54734514cfa93bc93f55c33
parent 85f5f276
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -900,11 +900,8 @@ size_t AudioTrackServerProxy::framesReady()
    }
    audio_track_cblk_t* cblk = mCblk;

    int32_t flush = cblk->u.mStreaming.mFlush;
    if (flush != mFlush) {
        // FIXME should return an accurate value, but over-estimate is better than under-estimate
        return mFrameCount;
    }
    flushBufferIfNeeded();

    const int32_t rear = getRear();
    ssize_t filled = audio_utils::safe_sub_overflow(rear, cblk->u.mStreaming.mFront);
    // pipe should not already be overfull
+5 −0
Original line number Diff line number Diff line
@@ -1038,6 +1038,11 @@ status_t AudioFlinger::PlaybackThread::Track::start(AudioSystem::sync_event_t ev
        // initial state-stopping. next state-pausing.
        // What if resume is called ?

        if (state == FLUSHED) {
            // avoid underrun glitches when starting after flush
            reset();
        }

        if (state == PAUSED || state == PAUSING) {
            if (mResumeToStopping) {
                // happened we need to resume to STOPPING_1