diff options
author | Eric Laurent <elaurent@google.com> | 2015-05-26 13:49:58 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2015-05-26 23:37:14 +0000 |
commit | 5cff403679fc44c8293de81aed31c459c6129243 (patch) | |
tree | 6461ccb9f276df2f1f37b2e29381fd564f2e5f26 /services/audioflinger/Threads.cpp | |
parent | 4a95e69406aa2e9896d865962d6d947ebbdac6fc (diff) | |
download | frameworks_av-5cff403679fc44c8293de81aed31c459c6129243.zip frameworks_av-5cff403679fc44c8293de81aed31c459c6129243.tar.gz frameworks_av-5cff403679fc44c8293de81aed31c459c6129243.tar.bz2 |
audio flinger: pause direct output when underrunning
If a direct output supports pause, pause the stream
instead of placing it into standby when the audio track
underruns. This will avoid resetting the presented frame count
and preserve A/V sync.
Bug: 21437855.
Change-Id: I598346edb62a1864126acdb1d9a937c82eac2191
Diffstat (limited to 'services/audioflinger/Threads.cpp')
-rw-r--r-- | services/audioflinger/Threads.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 594ed05..d9b4249 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -4443,7 +4443,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep track->mRetryCount = kMaxTrackRetriesDirect; mActiveTrack = t; mixerStatus = MIXER_TRACKS_READY; - if (usesHwAvSync() && mHwPaused) { + if (mHwPaused) { doHwResume = true; mHwPaused = false; } @@ -4495,7 +4495,7 @@ 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) { + if (mHwSupportsPause && !mHwPaused && !mStandby) { doHwPause = true; mHwPaused = true; } @@ -4609,7 +4609,7 @@ bool AudioFlinger::DirectOutputThread::shouldStandby_l() mTracks[mTracks.size() - 1]->mState == TrackBase::IDLE; } - return !mStandby && !(trackPaused || (usesHwAvSync() && mHwPaused && !trackStopped)); + return !mStandby && !(trackPaused || (mHwPaused && !trackStopped)); } // getTrackName_l() must be called with ThreadBase::mLock held @@ -4715,10 +4715,10 @@ void AudioFlinger::DirectOutputThread::cacheParameters_l() // no delay on outputs with HW A/V sync if (usesHwAvSync()) { standbyDelay = 0; - } else if (audio_is_linear_pcm(mFormat)) { - standbyDelay = microseconds(activeSleepTime*2); - } else { + } else if ((mType == OFFLOAD) && !audio_is_linear_pcm(mFormat)) { standbyDelay = kOffloadStandbyDelayNs; + } else { + standbyDelay = microseconds(activeSleepTime*2); } } @@ -4898,7 +4898,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr if (track->isPausing()) { track->setPaused(); if (last) { - if (!mHwPaused) { + if (mHwSupportsPause && !mHwPaused) { doHwPause = true; mHwPaused = true; } |