summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2015-01-07 15:57:49 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-01-07 15:57:49 +0000
commit69158e3e7b565a5ca131a2efaa9b76615ca80cbb (patch)
tree4dfbea14cb9503808fab3f532c1335d457142e40 /services
parent644afb88421ac0e71d526f9b6726404a90c7cccd (diff)
parent6ab33981d45cd69e683a143fec6530e66bd3e371 (diff)
downloadframeworks_av-69158e3e7b565a5ca131a2efaa9b76615ca80cbb.zip
frameworks_av-69158e3e7b565a5ca131a2efaa9b76615ca80cbb.tar.gz
frameworks_av-69158e3e7b565a5ca131a2efaa9b76615ca80cbb.tar.bz2
am 6ab33981: am 610255e8: Merge "audioflinger: pause HW A/V sync output when AudioTrack underruns" into lmp-mr1-dev
* commit '6ab33981d45cd69e683a143fec6530e66bd3e371': audioflinger: pause HW A/V sync output when AudioTrack underruns
Diffstat (limited to 'services')
-rw-r--r--services/audioflinger/Threads.cpp15
-rw-r--r--services/audioflinger/Threads.h3
2 files changed, 13 insertions, 5 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index d5bb0af..51025fe 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -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
@@ -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);
@@ -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;
+ }
}
}
}
@@ -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;
}
@@ -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
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index f5d0e27..1088843 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -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