summaryrefslogtreecommitdiffstats
path: root/services/audioflinger
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2013-09-04 09:42:59 -0700
committerEric Laurent <elaurent@google.com>2013-09-13 12:14:07 -0700
commit972a173d7d1de1a3b5a617aae3e2abb6e05ae02d (patch)
treef506c9ef80a8a31bfd58a254617fdecb26dbbcf5 /services/audioflinger
parent99bf6267f0a4e2c3153be49ced59ae164d55ea6d (diff)
downloadframeworks_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/audioflinger')
-rw-r--r--services/audioflinger/Threads.cpp29
-rw-r--r--services/audioflinger/Tracks.cpp4
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,