diff options
author | Andy Hung <hunga@google.com> | 2022-04-26 18:37:36 -0700 |
---|---|---|
committer | Andy Hung <hunga@google.com> | 2022-05-04 13:14:55 -0700 |
commit | 502f9d017a581bb296e26e5983a9351f6aba4ee8 (patch) | |
tree | 59f28080b3c4a5c105e384c21d56bc2f32a98276 /audio | |
parent | dd890b58457734d44e4e2af87fb1343d2348689e (diff) |
Effect: benchmark the effect process
Required for Spatializer tuning.
Test: adb shell dumpsys media.audio_flinger
Bug: 228862341
Change-Id: I59f3b35c9cdd1e45e9afc79cbf9aac30a5decd67
Diffstat (limited to 'audio')
-rw-r--r-- | audio/effect/all-versions/default/Android.bp | 2 | ||||
-rw-r--r-- | audio/effect/all-versions/default/Effect.cpp | 42 | ||||
-rw-r--r-- | audio/effect/all-versions/default/Effect.h | 7 |
3 files changed, 34 insertions, 17 deletions
diff --git a/audio/effect/all-versions/default/Android.bp b/audio/effect/all-versions/default/Android.bp index 1e01ffb377..a3c3ed6882 100644 --- a/audio/effect/all-versions/default/Android.bp +++ b/audio/effect/all-versions/default/Android.bp @@ -30,6 +30,7 @@ cc_defaults { ], shared_libs: [ + "libaudioutils", "libbase", "libcutils", "libeffects", @@ -48,6 +49,7 @@ cc_defaults { "libeffects_headers", "libhardware_headers", "libmedia_headers", + "libmediautils_headers", ], } diff --git a/audio/effect/all-versions/default/Effect.cpp b/audio/effect/all-versions/default/Effect.cpp index 49f6bf2ece..3baafc9343 100644 --- a/audio/effect/all-versions/default/Effect.cpp +++ b/audio/effect/all-versions/default/Effect.cpp @@ -22,13 +22,11 @@ #include "Effect.h" #include "common/all-versions/default/EffectMap.h" -#include <memory.h> - #define ATRACE_TAG ATRACE_TAG_AUDIO - #include <HidlUtils.h> #include <android/log.h> #include <media/EffectsFactoryApi.h> +#include <mediautils/ScopedStatistics.h> #include <util/EffectUtils.h> #include <utils/Trace.h> @@ -49,21 +47,27 @@ using ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION::implementati namespace { +#define SCOPED_STATS() \ + ::android::mediautils::ScopedStatistics scopedStatistics { \ + std::string("EffectHal::").append(__func__), mEffectHal->mStatistics \ + } + class ProcessThread : public Thread { public: // ProcessThread's lifespan never exceeds Effect's lifespan. - ProcessThread(std::atomic<bool>* stop, effect_handle_t effect, - std::atomic<audio_buffer_t*>* inBuffer, std::atomic<audio_buffer_t*>* outBuffer, - Effect::StatusMQ* statusMQ, EventFlag* efGroup) - : Thread(false /*canCallJava*/), - mStop(stop), - mEffect(effect), - mHasProcessReverse((*mEffect)->process_reverse != NULL), - mInBuffer(inBuffer), - mOutBuffer(outBuffer), - mStatusMQ(statusMQ), - mEfGroup(efGroup) {} - virtual ~ProcessThread() {} + ProcessThread(std::atomic<bool>* stop, effect_handle_t effect, + std::atomic<audio_buffer_t*>* inBuffer, std::atomic<audio_buffer_t*>* outBuffer, + Effect::StatusMQ* statusMQ, EventFlag* efGroup, Effect* effectHal) + : Thread(false /*canCallJava*/), + mStop(stop), + mEffect(effect), + mHasProcessReverse((*mEffect)->process_reverse != NULL), + mInBuffer(inBuffer), + mOutBuffer(outBuffer), + mStatusMQ(statusMQ), + mEfGroup(efGroup), + mEffectHal(effectHal) {} + virtual ~ProcessThread() {} private: std::atomic<bool>* mStop; @@ -73,6 +77,7 @@ class ProcessThread : public Thread { std::atomic<audio_buffer_t*>* mOutBuffer; Effect::StatusMQ* mStatusMQ; EventFlag* mEfGroup; + Effect* const mEffectHal; bool threadLoop() override; }; @@ -102,6 +107,9 @@ bool ProcessThread::threadLoop() { audio_buffer_t* outBuffer = std::atomic_load_explicit(mOutBuffer, std::memory_order_relaxed); if (inBuffer != nullptr && outBuffer != nullptr) { + // Time this effect process + SCOPED_STATS(); + if (efState & static_cast<uint32_t>(MessageQueueFlagBits::REQUEST_PROCESS)) { processResult = (*mEffect)->process(mEffect, inBuffer, outBuffer); } else { @@ -359,7 +367,7 @@ Return<void> Effect::prepareForProcessing(prepareForProcessing_cb _hidl_cb) { // Create and launch the thread. mProcessThread = new ProcessThread(&mStopProcessThread, mHandle, &mHalInBufferPtr, - &mHalOutBufferPtr, tempStatusMQ.get(), mEfGroup); + &mHalOutBufferPtr, tempStatusMQ.get(), mEfGroup, this); status = mProcessThread->run("effect", PRIORITY_URGENT_AUDIO); if (status != OK) { ALOGW("failed to start effect processing thread: %s", strerror(-status)); @@ -749,6 +757,8 @@ Return<void> Effect::debug(const hidl_handle& fd, const hidl_vec<hidl_string>& / if (fd.getNativeHandle() != nullptr && fd->numFds == 1) { uint32_t cmdData = fd->data[0]; (void)sendCommand(EFFECT_CMD_DUMP, "DUMP", sizeof(cmdData), &cmdData); + const std::string s = mStatistics->dump(); + if (s.size() != 0) write(cmdData, s.c_str(), s.size()); } return Void(); } diff --git a/audio/effect/all-versions/default/Effect.h b/audio/effect/all-versions/default/Effect.h index f9a6796e8f..011544d760 100644 --- a/audio/effect/all-versions/default/Effect.h +++ b/audio/effect/all-versions/default/Effect.h @@ -29,6 +29,7 @@ #include <fmq/MessageQueue.h> #include <hidl/MQDescriptor.h> #include <hidl/Status.h> +#include <mediautils/MethodStatistics.h> #include <utils/Thread.h> #include <hardware/audio_effect.h> @@ -169,7 +170,11 @@ struct Effect : public IEffect { Result setParameterImpl(uint32_t paramSize, const void* paramData, uint32_t valueSize, const void* valueData); - private: + // process execution statistics + const std::shared_ptr<mediautils::MethodStatistics<std::string>> mStatistics = + std::make_shared<mediautils::MethodStatistics<std::string>>(); + + private: friend struct VirtualizerEffect; // for getParameterImpl friend struct VisualizerEffect; // to allow executing commands |