Loading services/audioflinger/Threads.cpp +10 −5 Original line number Diff line number Diff line Loading @@ -4083,6 +4083,10 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep track->mRetryCount = kMaxTrackRetriesDirect; mActiveTrack = t; mixerStatus = MIXER_TRACKS_READY; if (usesHwAvSync() && mHwPaused) { doHwResume = true; mHwPaused = false; } } } else { // clear effect chain input buffer if the last active track started underruns Loading Loading @@ -4111,9 +4115,6 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep track->mState = TrackBase::STOPPED; } if (track->isStopped()) { if (track->mState == TrackBase::FLUSHED) { flushHw_l(); } track->reset(); } tracksToRemove->add(track); Loading @@ -4130,6 +4131,10 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep android_atomic_or(CBLK_DISABLED, &cblk->mFlags); } else if (last) { mixerStatus = MIXER_TRACKS_ENABLED; if (usesHwAvSync() && !mHwPaused && !mStandby) { doHwPause = true; mHwPaused = true; } } } } Loading Loading @@ -4192,7 +4197,7 @@ void AudioFlinger::DirectOutputThread::threadLoop_mix() void AudioFlinger::DirectOutputThread::threadLoop_sleepTime() { // do not write to HAL when paused if (mHwPaused) { if (mHwPaused || (usesHwAvSync() && mStandby)) { sleepTime = idleSleepTime; return; } Loading Loading @@ -4237,7 +4242,7 @@ bool AudioFlinger::DirectOutputThread::shouldStandby_l() trackPaused = mTracks[mTracks.size() - 1]->isPaused(); } return !mStandby && !trackPaused; return !mStandby && !(trackPaused || (usesHwAvSync() && mHwPaused)); } // getTrackName_l() must be called with ThreadBase::mLock held Loading services/audioflinger/Threads.h +3 −0 Original line number Diff line number Diff line Loading @@ -710,6 +710,9 @@ protected: audio_patch_handle_t *handle); virtual status_t releaseAudioPatch_l(const audio_patch_handle_t handle); bool usesHwAvSync() const { return (mType == DIRECT) && (mOutput != NULL) && (mOutput->flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC); } private: friend class AudioFlinger; // for numerous Loading Loading
services/audioflinger/Threads.cpp +10 −5 Original line number Diff line number Diff line Loading @@ -4083,6 +4083,10 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep track->mRetryCount = kMaxTrackRetriesDirect; mActiveTrack = t; mixerStatus = MIXER_TRACKS_READY; if (usesHwAvSync() && mHwPaused) { doHwResume = true; mHwPaused = false; } } } else { // clear effect chain input buffer if the last active track started underruns Loading Loading @@ -4111,9 +4115,6 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep track->mState = TrackBase::STOPPED; } if (track->isStopped()) { if (track->mState == TrackBase::FLUSHED) { flushHw_l(); } track->reset(); } tracksToRemove->add(track); Loading @@ -4130,6 +4131,10 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep android_atomic_or(CBLK_DISABLED, &cblk->mFlags); } else if (last) { mixerStatus = MIXER_TRACKS_ENABLED; if (usesHwAvSync() && !mHwPaused && !mStandby) { doHwPause = true; mHwPaused = true; } } } } Loading Loading @@ -4192,7 +4197,7 @@ void AudioFlinger::DirectOutputThread::threadLoop_mix() void AudioFlinger::DirectOutputThread::threadLoop_sleepTime() { // do not write to HAL when paused if (mHwPaused) { if (mHwPaused || (usesHwAvSync() && mStandby)) { sleepTime = idleSleepTime; return; } Loading Loading @@ -4237,7 +4242,7 @@ bool AudioFlinger::DirectOutputThread::shouldStandby_l() trackPaused = mTracks[mTracks.size() - 1]->isPaused(); } return !mStandby && !trackPaused; return !mStandby && !(trackPaused || (usesHwAvSync() && mHwPaused)); } // getTrackName_l() must be called with ThreadBase::mLock held Loading
services/audioflinger/Threads.h +3 −0 Original line number Diff line number Diff line Loading @@ -710,6 +710,9 @@ protected: audio_patch_handle_t *handle); virtual status_t releaseAudioPatch_l(const audio_patch_handle_t handle); bool usesHwAvSync() const { return (mType == DIRECT) && (mOutput != NULL) && (mOutput->flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC); } private: friend class AudioFlinger; // for numerous Loading