TimeCheck: Track audio Hidl hwbinder calls
DeviceHalHidl, StreamInHalHidl, StreamOutHalHidl
Test: adb shell dumpsys media.audio_flinger
Bug: 219958414
Change-Id: I3ff630983bdca6c8fd9ba9868e831cb063afdadc
diff --git a/media/libaudiohal/impl/StreamHalHidl.cpp b/media/libaudiohal/impl/StreamHalHidl.cpp
index 8ba0f72..77c2da0 100644
--- a/media/libaudiohal/impl/StreamHalHidl.cpp
+++ b/media/libaudiohal/impl/StreamHalHidl.cpp
@@ -22,6 +22,7 @@
#include <media/AudioParameter.h>
#include <mediautils/memory.h>
#include <mediautils/SchedulingPolicyService.h>
+#include <mediautils/TimeCheck.h>
#include <utils/Log.h>
#include PATH(android/hardware/audio/CORE_TYPES_FILE_VERSION/IStreamOutCallback.h)
@@ -45,8 +46,11 @@
using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION;
using namespace ::android::hardware::audio::CORE_TYPES_CPP_VERSION;
-StreamHalHidl::StreamHalHidl(IStream *stream)
- : ConversionHelperHidl("Stream"),
+#define TIME_CHECK() auto TimeCheck = \
+ mediautils::makeTimeCheckStatsForClassMethod(getClassName(), __func__)
+
+StreamHalHidl::StreamHalHidl(std::string_view className, IStream *stream)
+ : ConversionHelperHidl(className),
mStream(stream),
mHalThreadPriority(HAL_THREAD_PRIORITY_DEFAULT),
mCachedBufferSize(0){
@@ -67,6 +71,7 @@
}
status_t StreamHalHidl::getBufferSize(size_t *size) {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
status_t status = processReturn("getBufferSize", mStream->getBufferSize(), size);
if (status == OK) {
@@ -76,6 +81,7 @@
}
status_t StreamHalHidl::getAudioProperties(audio_config_base_t *configBase) {
+ TIME_CHECK();
*configBase = AUDIO_CONFIG_BASE_INITIALIZER;
if (!mStream) return NO_INIT;
#if MAJOR_VERSION <= 6
@@ -105,6 +111,7 @@
}
status_t StreamHalHidl::setParameters(const String8& kvPairs) {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
hidl_vec<ParameterValue> hidlParams;
status_t status = parametersFromHal(kvPairs, &hidlParams);
@@ -114,6 +121,7 @@
}
status_t StreamHalHidl::getParameters(const String8& keys, String8 *values) {
+ TIME_CHECK();
values->clear();
if (!mStream) return NO_INIT;
hidl_vec<hidl_string> hidlKeys;
@@ -134,21 +142,25 @@
}
status_t StreamHalHidl::addEffect(sp<EffectHalInterface> effect) {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
return processReturn("addEffect", mStream->addEffect(effect->effectId()));
}
status_t StreamHalHidl::removeEffect(sp<EffectHalInterface> effect) {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
return processReturn("removeEffect", mStream->removeEffect(effect->effectId()));
}
status_t StreamHalHidl::standby() {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
return processReturn("standby", mStream->standby());
}
status_t StreamHalHidl::dump(int fd, const Vector<String16>& args) {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
native_handle_t* hidlHandle = native_handle_create(1, 0);
hidlHandle->data[0] = fd;
@@ -173,17 +185,20 @@
}
status_t StreamHalHidl::start() {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
return processReturn("start", mStream->start());
}
status_t StreamHalHidl::stop() {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
return processReturn("stop", mStream->stop());
}
status_t StreamHalHidl::createMmapBuffer(int32_t minSizeFrames,
struct audio_mmap_buffer_info *info) {
+ TIME_CHECK();
Result retval;
Return<void> ret = mStream->createMmapBuffer(
minSizeFrames,
@@ -216,6 +231,7 @@
}
status_t StreamHalHidl::getMmapPosition(struct audio_mmap_position *position) {
+ TIME_CHECK();
Result retval;
Return<void> ret = mStream->getMmapPosition(
[&](Result r, const MmapPosition& hidlPosition) {
@@ -244,7 +260,7 @@
status_t StreamHalHidl::getHalPid(pid_t *pid) {
using ::android::hidl::base::V1_0::DebugInfo;
using ::android::hidl::manager::V1_0::IServiceManager;
-
+ TIME_CHECK();
DebugInfo debugInfo;
auto ret = mStream->getDebugInfo([&] (const auto &info) {
debugInfo = info;
@@ -275,6 +291,7 @@
status_t StreamHalHidl::legacyCreateAudioPatch(const struct audio_port_config& port,
std::optional<audio_source_t> source,
audio_devices_t type) {
+ TIME_CHECK();
LOG_ALWAYS_FATAL_IF(port.type != AUDIO_PORT_TYPE_DEVICE, "port type must be device");
unique_malloced_ptr<char> address;
if (strcmp(port.ext.device.address, "") != 0) {
@@ -293,6 +310,7 @@
}
status_t StreamHalHidl::legacyReleaseAudioPatch() {
+ TIME_CHECK();
AudioParameter param;
param.addInt(String8(AudioParameter::keyRouting), 0);
return setParameters(param.toString());
@@ -352,7 +370,8 @@
StreamOutHalHidl::StreamOutHalHidl(
const sp<::android::hardware::audio::CPP_VERSION::IStreamOut>& stream)
- : StreamHalHidl(stream.get()), mStream(stream), mWriterClient(0), mEfGroup(nullptr) {
+ : StreamHalHidl("StreamOutHalHidl", stream.get())
+ , mStream(stream), mWriterClient(0), mEfGroup(nullptr) {
}
StreamOutHalHidl::~StreamOutHalHidl() {
@@ -376,11 +395,13 @@
}
status_t StreamOutHalHidl::getFrameSize(size_t *size) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("getFrameSize", mStream->getFrameSize(), size);
}
status_t StreamOutHalHidl::getLatency(uint32_t *latency) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
if (mWriterClient == gettid() && mCommandMQ) {
return callWriterThread(
@@ -394,12 +415,14 @@
}
status_t StreamOutHalHidl::setVolume(float left, float right) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("setVolume", mStream->setVolume(left, right));
}
#if MAJOR_VERSION == 2
status_t StreamOutHalHidl::selectPresentation(int presentationId, int programId) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
std::vector<ParameterValue> parameters;
String8 halParameters;
@@ -410,6 +433,7 @@
}
#elif MAJOR_VERSION >= 4
status_t StreamOutHalHidl::selectPresentation(int presentationId, int programId) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("selectPresentation",
mStream->selectPresentation(presentationId, programId));
@@ -417,6 +441,7 @@
#endif
status_t StreamOutHalHidl::write(const void *buffer, size_t bytes, size_t *written) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
*written = 0;
@@ -562,6 +587,7 @@
}
status_t StreamOutHalHidl::getRenderPosition(uint32_t *dspFrames) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
Result retval;
Return<void> ret = mStream->getRenderPosition(
@@ -575,6 +601,7 @@
}
status_t StreamOutHalHidl::getNextWriteTimestamp(int64_t *timestamp) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
Result retval;
Return<void> ret = mStream->getNextWriteTimestamp(
@@ -588,6 +615,7 @@
}
status_t StreamOutHalHidl::setCallback(wp<StreamOutHalInterfaceCallback> callback) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
status_t status = processReturn(
"setCallback", mStream->setCallback(new StreamOutCallback(this)));
@@ -598,6 +626,7 @@
}
status_t StreamOutHalHidl::supportsPauseAndResume(bool *supportsPause, bool *supportsResume) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
Return<void> ret = mStream->supportsPauseAndResume(
[&](bool p, bool r) {
@@ -608,32 +637,38 @@
}
status_t StreamOutHalHidl::pause() {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("pause", mStream->pause());
}
status_t StreamOutHalHidl::resume() {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("pause", mStream->resume());
}
status_t StreamOutHalHidl::supportsDrain(bool *supportsDrain) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("supportsDrain", mStream->supportsDrain(), supportsDrain);
}
status_t StreamOutHalHidl::drain(bool earlyNotify) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn(
"drain", mStream->drain(earlyNotify ? AudioDrain::EARLY_NOTIFY : AudioDrain::ALL));
}
status_t StreamOutHalHidl::flush() {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("pause", mStream->flush());
}
status_t StreamOutHalHidl::getPresentationPosition(uint64_t *frames, struct timespec *timestamp) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
if (mWriterClient == gettid() && mCommandMQ) {
return callWriterThread(
@@ -667,6 +702,7 @@
#elif MAJOR_VERSION >= 4
status_t StreamOutHalHidl::updateSourceMetadata(
const StreamOutHalInterface::SourceMetadata& sourceMetadata) {
+ TIME_CHECK();
#if MAJOR_VERSION == 4
::android::hardware::audio::CORE_TYPES_CPP_VERSION::SourceMetadata hidlMetadata;
#else
@@ -717,6 +753,7 @@
#else
status_t StreamOutHalHidl::getDualMonoMode(audio_dual_mono_mode_t* mode) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
Result retval;
Return<void> ret = mStream->getDualMonoMode(
@@ -730,12 +767,14 @@
}
status_t StreamOutHalHidl::setDualMonoMode(audio_dual_mono_mode_t mode) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn(
"setDualMonoMode", mStream->setDualMonoMode(static_cast<DualMonoMode>(mode)));
}
status_t StreamOutHalHidl::getAudioDescriptionMixLevel(float* leveldB) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
Result retval;
Return<void> ret = mStream->getAudioDescriptionMixLevel(
@@ -749,12 +788,14 @@
}
status_t StreamOutHalHidl::setAudioDescriptionMixLevel(float leveldB) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn(
"setAudioDescriptionMixLevel", mStream->setAudioDescriptionMixLevel(leveldB));
}
status_t StreamOutHalHidl::getPlaybackRateParameters(audio_playback_rate_t* playbackRate) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
Result retval;
Return<void> ret = mStream->getPlaybackRateParameters(
@@ -775,6 +816,7 @@
}
status_t StreamOutHalHidl::setPlaybackRateParameters(const audio_playback_rate_t& playbackRate) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn(
"setPlaybackRateParameters", mStream->setPlaybackRateParameters(
@@ -809,6 +851,7 @@
status_t StreamOutHalHidl::setEventCallback(
const sp<StreamOutHalInterfaceEventCallback>& callback) {
+ TIME_CHECK();
if (mStream == nullptr) return NO_INIT;
mEventCallback = callback;
status_t status = processReturn(
@@ -823,12 +866,14 @@
using hardware::audio::V7_1::LatencyMode;
status_t StreamOutHalHidl::setLatencyMode(audio_latency_mode_t mode) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn(
"setLatencyMode", mStream->setLatencyMode(static_cast<LatencyMode>(mode)));
};
status_t StreamOutHalHidl::getRecommendedLatencyModes(std::vector<audio_latency_mode_t> *modes) {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
Result retval;
Return<void> ret = mStream->getRecommendedLatencyModes(
@@ -869,6 +914,7 @@
status_t StreamOutHalHidl::setLatencyModeCallback(
const sp<StreamOutHalInterfaceLatencyModeCallback>& callback) {
+ TIME_CHECK();
if (mStream == nullptr) return NO_INIT;
mLatencyModeCallback = callback;
@@ -940,7 +986,8 @@
StreamInHalHidl::StreamInHalHidl(
const sp<::android::hardware::audio::CORE_TYPES_CPP_VERSION::IStreamIn>& stream)
- : StreamHalHidl(stream.get()), mStream(stream), mReaderClient(0), mEfGroup(nullptr) {
+ : StreamHalHidl("StreamInHalHidl", stream.get())
+ , mStream(stream), mReaderClient(0), mEfGroup(nullptr) {
}
StreamInHalHidl::~StreamInHalHidl() {
@@ -953,16 +1000,19 @@
}
status_t StreamInHalHidl::getFrameSize(size_t *size) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("getFrameSize", mStream->getFrameSize(), size);
}
status_t StreamInHalHidl::setGain(float gain) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("setGain", mStream->setGain(gain));
}
status_t StreamInHalHidl::read(void *buffer, size_t bytes, size_t *read) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
*read = 0;
@@ -1090,11 +1140,13 @@
}
status_t StreamInHalHidl::getInputFramesLost(uint32_t *framesLost) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
return processReturn("getInputFramesLost", mStream->getInputFramesLost(), framesLost);
}
status_t StreamInHalHidl::getCapturePosition(int64_t *frames, int64_t *time) {
+ TIME_CHECK();
if (mStream == 0) return NO_INIT;
if (mReaderClient == gettid() && mCommandMQ) {
ReadParameters params;
@@ -1134,6 +1186,7 @@
#elif MAJOR_VERSION >= 4
status_t StreamInHalHidl::getActiveMicrophones(
std::vector<media::MicrophoneInfo> *microphonesInfo) {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
Result retval;
Return<void> ret = mStream->getActiveMicrophones(
@@ -1152,6 +1205,7 @@
status_t StreamInHalHidl::updateSinkMetadata(const
StreamInHalInterface::SinkMetadata& sinkMetadata) {
+ TIME_CHECK();
#if MAJOR_VERSION == 4
::android::hardware::audio::CORE_TYPES_CPP_VERSION::SinkMetadata hidlMetadata;
#else
@@ -1179,12 +1233,14 @@
}
#else
status_t StreamInHalHidl::setPreferredMicrophoneDirection(audio_microphone_direction_t direction) {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
return processReturn("setPreferredMicrophoneDirection",
mStream->setMicrophoneDirection(static_cast<MicrophoneDirection>(direction)));
}
status_t StreamInHalHidl::setPreferredMicrophoneFieldDimension(float zoom) {
+ TIME_CHECK();
if (!mStream) return NO_INIT;
return processReturn("setPreferredMicrophoneFieldDimension",
mStream->setMicrophoneFieldDimension(zoom));