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

Commit 9150392c authored by yucliu's avatar yucliu Committed by Yuchen Liu
Browse files

Start point for track sink frame map

When start the track, add current track sink frame info to mFrameMap. If
the HAL returns a position that is smaller than the first written frame,
the timestamp will be interpolated instead of using a larger value
(first written frame's position).

Bug: 238936281
Test: On device
Change-Id: Ib816b62a5724a0f48a449c2fdfdaa0b6936d710e
Merged-In: Ib816b62a5724a0f48a449c2fdfdaa0b6936d710e
(cherry picked from commit 6cfb5938)
parent bd8a242d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1172,7 +1172,7 @@ protected:
    volatile int32_t                mSuspended;

    int64_t                         mBytesWritten;
    int64_t                         mFramesWritten; // not reset on standby
    std::atomic<int64_t>            mFramesWritten; // not reset on standby
    int64_t                         mLastFramesWritten = -1; // track changes in timestamp
                                                             // server frames written.
    int64_t                         mSuspendedFrames; // not reset on standby
@@ -1386,6 +1386,7 @@ public:
    virtual     bool        hasFastMixer() const = 0;
    virtual     FastTrackUnderruns getFastTrackUnderruns(size_t fastIndex __unused) const
                                { FastTrackUnderruns dummy; return dummy; }
                const std::atomic<int64_t>& framesWritten() const { return mFramesWritten; }

protected:
                // accessed by both binder threads and within threadLoop(), lock on mutex needed
+13 −3
Original line number Diff line number Diff line
@@ -1094,12 +1094,22 @@ status_t AudioFlinger::PlaybackThread::Track::start(AudioSystem::sync_event_t ev
                    __func__, mId, (int)mThreadIoHandle);
        }

        // states to reset position info for non-offloaded/direct tracks
        if (!isOffloaded() && !isDirect()
        PlaybackThread *playbackThread = (PlaybackThread *)thread.get();

        // states to reset position info for pcm tracks
        if (audio_is_linear_pcm(mFormat)
                && (state == IDLE || state == STOPPED || state == FLUSHED)) {
            mFrameMap.reset();

            if (!isFastTrack() && (isDirect() || isOffloaded())) {
                // Start point of track -> sink frame map. If the HAL returns a
                // frame position smaller than the first written frame in
                // updateTrackFrameInfo, the timestamp can be interpolated
                // instead of using a larger value.
                mFrameMap.push(mAudioTrackServerProxy->framesReleased(),
                               playbackThread->framesWritten());
            }
        }
        PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
        if (isFastTrack()) {
            // refresh fast track underruns on start because that field is never cleared
            // by the fast mixer; furthermore, the same track can be recycled, i.e. start