summaryrefslogtreecommitdiffstats
path: root/services/audioflinger/FastThread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/audioflinger/FastThread.cpp')
-rw-r--r--services/audioflinger/FastThread.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/services/audioflinger/FastThread.cpp b/services/audioflinger/FastThread.cpp
index 3e12cca..b69cc85 100644
--- a/services/audioflinger/FastThread.cpp
+++ b/services/audioflinger/FastThread.cpp
@@ -29,7 +29,8 @@
#define FAST_DEFAULT_NS 999999999L // ~1 sec: default time to sleep
#define FAST_HOT_IDLE_NS 1000000L // 1 ms: time to sleep while hot idling
-#define MIN_WARMUP_CYCLES 2 // minimum number of loop cycles to wait for warmup
+#define MIN_WARMUP_CYCLES 2 // minimum number of consecutive in-range loop cycles
+ // to wait for warmup
#define MAX_WARMUP_CYCLES 10 // maximum number of loop cycles to wait for warmup
namespace android {
@@ -44,7 +45,8 @@ FastThread::FastThread() : Thread(false /*canCallJava*/),
underrunNs(0),
overrunNs(0),
forceNs(0),
- warmupNs(0),
+ warmupNsMin(0),
+ warmupNsMax(LONG_MAX),
// re-initialized to &dummyDumpState by subclass constructor
mDummyDumpState(NULL),
dumpState(NULL),
@@ -60,6 +62,7 @@ FastThread::FastThread() : Thread(false /*canCallJava*/),
isWarm(false),
/* measuredWarmupTs({0, 0}), */
warmupCycles(0),
+ warmupConsecutiveInRangeCycles(0),
// dummyLogWriter
logWriter(&dummyLogWriter),
timestampStatus(INVALID_OPERATION),
@@ -169,6 +172,7 @@ bool FastThread::threadLoop()
measuredWarmupTs.tv_sec = 0;
measuredWarmupTs.tv_nsec = 0;
warmupCycles = 0;
+ warmupConsecutiveInRangeCycles = 0;
sleepNs = -1;
coldGen = current->mColdGen;
#ifdef FAST_MIXER_STATISTICS
@@ -222,7 +226,8 @@ bool FastThread::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:
- // MIN_WARMUP_CYCLES write() attempts and last one blocks for at least warmupNs
+ // MIN_WARMUP_CYCLES consecutive in-range write() attempts,
+ // where "in-range" means warmupNsMin <= cycle time <= warmupNsMax
// MAX_WARMUP_CYCLES write() attempts.
// This is overly conservative, but to get better accuracy requires a new HAL API.
if (!isWarm && attemptedWrite) {
@@ -233,7 +238,14 @@ bool FastThread::threadLoop()
measuredWarmupTs.tv_nsec -= 1000000000;
}
++warmupCycles;
- if ((nsec > warmupNs && warmupCycles >= MIN_WARMUP_CYCLES) ||
+ if (warmupNsMin <= nsec && nsec <= warmupNsMax) {
+ ALOGV("warmup cycle %d in range: %.03f ms", warmupCycles, nsec * 1e-9);
+ ++warmupConsecutiveInRangeCycles;
+ } else {
+ ALOGV("warmup cycle %d out of range: %.03f ms", warmupCycles, nsec * 1e-9);
+ warmupConsecutiveInRangeCycles = 0;
+ }
+ if ((warmupConsecutiveInRangeCycles >= MIN_WARMUP_CYCLES) ||
(warmupCycles >= MAX_WARMUP_CYCLES)) {
isWarm = true;
dumpState->mMeasuredWarmupTs = measuredWarmupTs;