Add some info about monopipe depth
Log the size of the playback and record threads' monopipes
Bug: 196060611
Bug: 196071180
Test: adb shell dumpsys media.audio_flinger
Change-Id: Ica0d07ca8379842fe2136de330ec123de33b66ed
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 9665424..6a6181c 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -644,6 +644,7 @@
mIoJitterMs.reset();
mLatencyMs.reset();
mProcessTimeMs.reset();
+ mMonopipePipeDepthStats.reset();
mTimestampVerifier.discontinuity(mTimestampVerifier.DISCONTINUITY_MODE_CONTINUOUS);
sp<ConfigEvent> configEvent = (ConfigEvent *)new IoConfigEvent(event, pid, portId);
@@ -988,6 +989,12 @@
isOutput() ? "write" : "read",
mLatencyMs.toString().c_str());
}
+
+ if (mMonopipePipeDepthStats.getN() > 0) {
+ dprintf(fd, " Monopipe %s pipe depth stats: %s\n",
+ isOutput() ? "write" : "read",
+ mMonopipePipeDepthStats.toString().c_str());
+ }
}
void AudioFlinger::ThreadBase::dumpEffectChains_l(int fd, const Vector<String16>& args)
@@ -1917,6 +1924,12 @@
item->setDouble(MM_PREFIX "latencyMs.mean", mLatencyMs.getMean());
item->setDouble(MM_PREFIX "latencyMs.std", mLatencyMs.getStdDev());
}
+ if (mMonopipePipeDepthStats.getN() > 0) {
+ item->setDouble(MM_PREFIX "monopipePipeDepthStats.mean",
+ mMonopipePipeDepthStats.getMean());
+ item->setDouble(MM_PREFIX "monopipePipeDepthStats.std",
+ mMonopipePipeDepthStats.getStdDev());
+ }
item->selfrecord();
}
@@ -3972,6 +3985,18 @@
Mutex::Autolock _l(mLock);
mIoJitterMs.add(jitterMs);
mProcessTimeMs.add(processMs);
+
+ if (mPipeSink.get() != nullptr) {
+ // Using the Monopipe availableToWrite, we estimate the current
+ // buffer size.
+ MonoPipe* monoPipe = static_cast<MonoPipe*>(mPipeSink.get());
+ const ssize_t
+ availableToWrite = mPipeSink->availableToWrite();
+ const size_t pipeFrames = monoPipe->maxFrames();
+ const size_t
+ remainingFrames = pipeFrames - max(availableToWrite, 0);
+ mMonopipePipeDepthStats.add(remainingFrames);
+ }
}
// write blocked detection
@@ -7588,6 +7613,7 @@
const ssize_t availableToRead = mPipeSource->availableToRead();
if (availableToRead >= 0) {
+ mMonopipePipeDepthStats.add(availableToRead);
// PipeSource is the primary clock. It is up to the AudioRecord client to keep up.
LOG_ALWAYS_FATAL_IF((size_t)availableToRead > mPipeFramesP2,
"more frames to read than fifo size, %zd > %zu",