diff options
author | Eric Laurent <elaurent@google.com> | 2013-09-04 09:42:59 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2013-09-13 12:14:07 -0700 |
commit | 972a173d7d1de1a3b5a617aae3e2abb6e05ae02d (patch) | |
tree | f506c9ef80a8a31bfd58a254617fdecb26dbbcf5 /services | |
parent | 99bf6267f0a4e2c3153be49ced59ae164d55ea6d (diff) | |
download | frameworks_av-972a173d7d1de1a3b5a617aae3e2abb6e05ae02d.zip frameworks_av-972a173d7d1de1a3b5a617aae3e2abb6e05ae02d.tar.gz frameworks_av-972a173d7d1de1a3b5a617aae3e2abb6e05ae02d.tar.bz2 |
audioflinger: longer offload thread standby delay
- Increase offloaded output thread standby delay to 1 second
to allow transition between tracks with going to stanby
if reusing the same audio track (gapless)
- Make sure pause/flush/resume sequence is sent to the HAL
in the right order
- Fix format display in track dump
Bug: 8174034.
Change-Id: I43ef6f8fdbf7427e4eff6cc2d0665d7d1463ea8a
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/Threads.cpp | 29 | ||||
-rw-r--r-- | services/audioflinger/Tracks.cpp | 4 |
2 files changed, 24 insertions, 9 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 1b5a9a9..885f72e 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -109,6 +109,9 @@ static const uint32_t kMinNormalMixBufferSizeMs = 20; // maximum normal mix buffer size static const uint32_t kMaxNormalMixBufferSizeMs = 24; +// Offloaded output thread standby delay: allows track transition without going to standby +static const nsecs_t kOffloadStandbyDelayNs = seconds(1); + // Whether to use fast mixer static const enum { FastMixer_Never, // never initialize or use: for debugging only @@ -2137,13 +2140,11 @@ bool AudioFlinger::PlaybackThread::threadLoop() mWaitWorkCV.wait(mLock); ALOGV("async completion/wake"); acquireWakeLock_l(); + standbyTime = systemTime() + standbyDelay; + sleepTime = 0; if (exitPending()) { break; } - if (!mActiveTracks.size() && (systemTime() > standbyTime)) { - continue; - } - sleepTime = 0; } else if ((!mActiveTracks.size() && systemTime() > standbyTime) || isSuspended()) { // put audio hardware into standby after short delay @@ -3701,7 +3702,11 @@ void AudioFlinger::DirectOutputThread::cacheParameters_l() // use shorter standby delay as on normal output to release // hardware resources as soon as possible - standbyDelay = microseconds(activeSleepTime*2); + if (audio_is_linear_pcm(mFormat)) { + standbyDelay = microseconds(activeSleepTime*2); + } else { + standbyDelay = kOffloadStandbyDelayNs; + } } // ---------------------------------------------------------------------------- @@ -3837,6 +3842,9 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr size_t count = mActiveTracks.size(); mixer_state mixerStatus = MIXER_IDLE; + bool doHwPause = false; + bool doHwResume = false; + // find out which tracks need to be processed for (size_t i = 0; i < count; i++) { sp<Track> t = mActiveTracks[i].promote(); @@ -3868,7 +3876,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr track->setPaused(); if (last) { if (!mHwPaused) { - mOutput->stream->pause(mOutput->stream); + doHwPause = true; mHwPaused = true; } // If we were part way through writing the mixbuffer to @@ -3901,7 +3909,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr if (last) { if (mHwPaused) { - mOutput->stream->resume(mOutput->stream); + doHwResume = true; mHwPaused = false; // threadLoop_mix() will handle the case that we need to // resume an interrupted write @@ -3963,10 +3971,17 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr processVolume_l(track, last); } + // make sure the pause/flush/resume sequence is executed in the right order + if (doHwPause) { + mOutput->stream->pause(mOutput->stream); + } if (mFlushPending) { flushHw_l(); mFlushPending = false; } + if (doHwResume) { + mOutput->stream->resume(mOutput->stream); + } // remove all the tracks that need to be... removeTracks_l(*tracksToRemove); diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index 3a5dc35..3b1874e 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -402,7 +402,7 @@ void AudioFlinger::PlaybackThread::Track::destroy() /*static*/ void AudioFlinger::PlaybackThread::Track::appendDumpHeader(String8& result) { - result.append(" Name Client Type Fmt Chn mask Session fCount S F SRate " + result.append(" Name Client Type Fmt Chn mask Session fCount S F SRate " "L dB R dB Server Main buf Aux Buf Flags UndFrmCnt\n"); } @@ -467,7 +467,7 @@ void AudioFlinger::PlaybackThread::Track::dump(char* buffer, size_t size) nowInUnderrun = '?'; break; } - snprintf(&buffer[7], size-7, " %6u %4u %3u %08X %7u %6u %1c %1d %5u %5.2g %5.2g " + snprintf(&buffer[7], size-7, " %6u %4u %08X %08X %7u %6u %1c %1d %5u %5.2g %5.2g " "%08X %08X %08X 0x%03X %9u%c\n", (mClient == 0) ? getpid_cached : mClient->pid(), mStreamType, |