AudioFlinger: Accumulate long term thread latency statistics.
This results in a more stable value.
Test: AudioFlinger dumpsys
Change-Id: I72f5e819076502328222b3bf6bdc761b8aad4a87
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 8a45fc2..8f181a4 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -842,6 +842,12 @@
mIoJitterMs.toString().c_str());
}
+ if (mLatencyMs.getN() > 0) {
+ dprintf(fd, " Threadloop %s latency stats: %s\n",
+ isOutput() ? "write" : "read",
+ mLatencyMs.toString().c_str());
+ }
+
if (locked) {
mLock.unlock();
}
@@ -3380,6 +3386,14 @@
}
}
}
+
+ if (audio_has_proportional_frames(mFormat)) {
+ const double latencyMs = mTimestamp.getOutputServerLatencyMs(mSampleRate);
+ if (latencyMs != 0.) { // note 0. means timestamp is empty.
+ mLatencyMs.add(latencyMs);
+ }
+ }
+
} // if (mType ... ) { // no indentation
#if 0
// logFormat example
@@ -5296,13 +5310,6 @@
dprintf(fd, " Master balance: %f (%s)\n", mMasterBalance.load(),
(hasFastMixer() ? std::to_string(mFastMixer->getMasterBalance())
: mBalance.toString()).c_str());
- const double latencyMs = mTimestamp.getOutputServerLatencyMs(mSampleRate);
- if (latencyMs != 0.) {
- dprintf(fd, " NormalMixer latency ms: %.2lf\n", latencyMs);
- } else {
- dprintf(fd, " NormalMixer latency ms: unavail\n");
- }
-
if (hasFastMixer()) {
dprintf(fd, " FastMixer thread %p tid=%d", mFastMixer.get(), mFastMixer->getTid());
@@ -7042,6 +7049,15 @@
mTimestampVerifier.error();
}
}
+
+ // From the timestamp, input read latency is negative output write latency.
+ const audio_input_flags_t flags = mInput != NULL ? mInput->flags : AUDIO_INPUT_FLAG_NONE;
+ const double latencyMs = RecordTrack::checkServerLatencySupported(mFormat, flags)
+ ? - mTimestamp.getOutputServerLatencyMs(mSampleRate) : 0.;
+ if (latencyMs != 0.) { // note 0. means timestamp is empty.
+ mLatencyMs.add(latencyMs);
+ }
+
// Use this to track timestamp information
// ALOGD("%s", mTimestamp.toString().c_str());
@@ -7734,14 +7750,6 @@
(void)input->stream->dump(fd);
}
- const double latencyMs = RecordTrack::checkServerLatencySupported(mFormat, flags)
- ? - mTimestamp.getOutputServerLatencyMs(mSampleRate) : 0.;
- if (latencyMs != 0.) {
- dprintf(fd, " NormalRecord latency ms: %.2lf\n", latencyMs);
- } else {
- dprintf(fd, " NormalRecord latency ms: unavail\n");
- }
-
dprintf(fd, " Fast capture thread: %s\n", hasFastCapture() ? "yes" : "no");
dprintf(fd, " Fast track available: %s\n", mFastTrackAvail ? "yes" : "no");