OSDN Git Service

Change definition of warmup period
authorGlenn Kasten <gkasten@google.com>
Wed, 13 Jun 2012 21:59:07 +0000 (14:59 -0700)
committerGlenn Kasten <gkasten@google.com>
Fri, 15 Jun 2012 21:53:31 +0000 (14:53 -0700)
Previously, warmup was considered done as soon as any write() took
more than 0.5 nominal cycle time.  In practice, this was always the
first write() that turned on power to the output path, and it didn't
accurately account for filling the full kernel buffer queue, or for
buffering in the HAL sample rate conversion.

Now warmup is considered done when a write() _after_ the first write
takes more than 0.5 nominal cycle time.

This will throttle the initial pull rate after coming out of standby.
When combined with another change to throttle the pull rate for
devices with HAL sample rate conversion, it may help reduce some of the
notification glitches.  The only downside is that it will increase the
warmup time a bit.

Bug: 650831766508466607056
Change-Id: I39f324c5195578170a55308e9601d3a1b41db3e0

services/audioflinger/FastMixer.cpp

index 2c5d751..7652132 100644 (file)
@@ -33,6 +33,7 @@
 
 #define FAST_HOT_IDLE_NS     1000000L   // 1 ms: time to sleep while hot idling
 #define FAST_DEFAULT_NS    999999999L   // ~1 sec: default time to sleep
+#define MIN_WARMUP_CYCLES          2    // minimum number of loop cycles to wait for warmup
 #define MAX_WARMUP_CYCLES         10    // maximum number of loop cycles to wait for warmup
 
 namespace android {
@@ -454,7 +455,7 @@ bool FastMixer::threadLoop()
                 // To avoid an initial underrun on fast tracks after exiting standby,
                 // do not start pulling data from tracks and mixing until warmup is complete.
                 // Warmup is considered complete after the earlier of:
-                //      first successful single write() that blocks for more than warmupNs
+                //      MIN_WARMUP_CYCLES write() attempts and last one blocks for at least warmupNs
                 //      MAX_WARMUP_CYCLES write() attempts.
                 // This is overly conservative, but to get better accuracy requires a new HAL API.
                 if (!isWarm && attemptedWrite) {
@@ -465,7 +466,7 @@ bool FastMixer::threadLoop()
                         measuredWarmupTs.tv_nsec -= 1000000000;
                     }
                     ++warmupCycles;
-                    if ((attemptedWrite && nsec > warmupNs) ||
+                    if ((nsec > warmupNs && warmupCycles >= MIN_WARMUP_CYCLES) ||
                             (warmupCycles >= MAX_WARMUP_CYCLES)) {
                         isWarm = true;
                         dumpState->mMeasuredWarmupTs = measuredWarmupTs;
@@ -504,6 +505,7 @@ bool FastMixer::threadLoop()
                 }
               }
 #ifdef FAST_MIXER_STATISTICS
+              if (isWarm) {
                 // advance the FIFO queue bounds
                 size_t i = bounds & (FastMixerDumpState::kSamplingN - 1);
                 bounds = (bounds & 0xFFFF0000) | ((bounds + 1) & 0xFFFF);
@@ -560,6 +562,7 @@ bool FastMixer::threadLoop()
                 ATRACE_INT("cycle_ms", monotonicNs / 1000000);
                 ATRACE_INT("load_us", loadNs / 1000);
 #endif
+              }
 #endif
             } else {
                 // first time through the loop