Loading services/audioflinger/PlaybackTracks.h +5 −0 Original line number Diff line number Diff line Loading @@ -217,6 +217,10 @@ protected: void flushAck(); bool isResumePending(); void resumeAck(); // For direct or offloaded tracks ensure that the pause state is acknowledged // by the playback thread in case of an immediate flush. bool isPausePending() const { return mPauseHwPending; } void pauseAck(); void updateTrackFrameInfo(int64_t trackFramesReleased, int64_t sinkFramesWritten, uint32_t halSampleRate, const ExtendedTimestamp &timeStamp); Loading Loading @@ -312,6 +316,7 @@ private: sp<AudioTrackServerProxy> mAudioTrackServerProxy; bool mResumeToStopping; // track was paused in stopping state. bool mFlushHwPending; // track requests for thread flush bool mPauseHwPending = false; // direct/offload track request for thread pause audio_output_flags_t mFlags; // If the last track change was notified to the client with readAndClearHasChanged std::atomic_flag mChangeNotified = ATOMIC_FLAG_INIT; Loading services/audioflinger/Threads.cpp +18 −4 Original line number Diff line number Diff line Loading @@ -5825,8 +5825,15 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep sp<Track> l = mActiveTracks.getLatest(); bool last = l.get() == track; if (track->isPausePending()) { track->pauseAck(); // It is possible a track might have been flushed or stopped. // Other operations such as flush pending might occur on the next prepare. if (track->isPausing()) { track->setPaused(); } // Always perform pause, as an immediate flush will change // the pause state to be no longer isPausing(). if (mHwSupportsPause && last && !mHwPaused) { doHwPause = true; mHwPaused = true; Loading Loading @@ -6368,8 +6375,15 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr continue; } if (track->isPausePending()) { track->pauseAck(); // It is possible a track might have been flushed or stopped. // Other operations such as flush pending might occur on the next prepare. if (track->isPausing()) { track->setPaused(); } // Always perform pause if last, as an immediate flush will change // the pause state to be no longer isPausing(). if (last) { if (mHwSupportsPause && !mHwPaused) { doHwPause = true; Loading services/audioflinger/Tracks.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -1177,6 +1177,9 @@ void AudioFlinger::PlaybackThread::Track::pause() mState = PAUSING; ALOGV("%s(%d): ACTIVE/RESUMING => PAUSING on thread %d", __func__, mId, (int)mThreadIoHandle); if (isOffloadedOrDirect()) { mPauseHwPending = true; } playbackThread->broadcast_l(); break; Loading Loading @@ -1264,6 +1267,11 @@ void AudioFlinger::PlaybackThread::Track::flushAck() mFlushHwPending = false; } void AudioFlinger::PlaybackThread::Track::pauseAck() { mPauseHwPending = false; } void AudioFlinger::PlaybackThread::Track::reset() { // Do not reset twice to avoid discarding data written just after a flush and before Loading Loading
services/audioflinger/PlaybackTracks.h +5 −0 Original line number Diff line number Diff line Loading @@ -217,6 +217,10 @@ protected: void flushAck(); bool isResumePending(); void resumeAck(); // For direct or offloaded tracks ensure that the pause state is acknowledged // by the playback thread in case of an immediate flush. bool isPausePending() const { return mPauseHwPending; } void pauseAck(); void updateTrackFrameInfo(int64_t trackFramesReleased, int64_t sinkFramesWritten, uint32_t halSampleRate, const ExtendedTimestamp &timeStamp); Loading Loading @@ -312,6 +316,7 @@ private: sp<AudioTrackServerProxy> mAudioTrackServerProxy; bool mResumeToStopping; // track was paused in stopping state. bool mFlushHwPending; // track requests for thread flush bool mPauseHwPending = false; // direct/offload track request for thread pause audio_output_flags_t mFlags; // If the last track change was notified to the client with readAndClearHasChanged std::atomic_flag mChangeNotified = ATOMIC_FLAG_INIT; Loading
services/audioflinger/Threads.cpp +18 −4 Original line number Diff line number Diff line Loading @@ -5825,8 +5825,15 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep sp<Track> l = mActiveTracks.getLatest(); bool last = l.get() == track; if (track->isPausePending()) { track->pauseAck(); // It is possible a track might have been flushed or stopped. // Other operations such as flush pending might occur on the next prepare. if (track->isPausing()) { track->setPaused(); } // Always perform pause, as an immediate flush will change // the pause state to be no longer isPausing(). if (mHwSupportsPause && last && !mHwPaused) { doHwPause = true; mHwPaused = true; Loading Loading @@ -6368,8 +6375,15 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr continue; } if (track->isPausePending()) { track->pauseAck(); // It is possible a track might have been flushed or stopped. // Other operations such as flush pending might occur on the next prepare. if (track->isPausing()) { track->setPaused(); } // Always perform pause if last, as an immediate flush will change // the pause state to be no longer isPausing(). if (last) { if (mHwSupportsPause && !mHwPaused) { doHwPause = true; Loading
services/audioflinger/Tracks.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -1177,6 +1177,9 @@ void AudioFlinger::PlaybackThread::Track::pause() mState = PAUSING; ALOGV("%s(%d): ACTIVE/RESUMING => PAUSING on thread %d", __func__, mId, (int)mThreadIoHandle); if (isOffloadedOrDirect()) { mPauseHwPending = true; } playbackThread->broadcast_l(); break; Loading Loading @@ -1264,6 +1267,11 @@ void AudioFlinger::PlaybackThread::Track::flushAck() mFlushHwPending = false; } void AudioFlinger::PlaybackThread::Track::pauseAck() { mPauseHwPending = false; } void AudioFlinger::PlaybackThread::Track::reset() { // Do not reset twice to avoid discarding data written just after a flush and before Loading