Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93788a1d authored by Andy Hung's avatar Andy Hung Committed by Automerger Merge Worker
Browse files

Merge "Effect: benchmark the effect process" into tm-dev am: dc484054 am: 35d0cea7

parents 3c37c2db 35d0cea7
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ cc_defaults {
    ],
    ],


    shared_libs: [
    shared_libs: [
        "libaudioutils",
        "libbase",
        "libbase",
        "libcutils",
        "libcutils",
        "libeffects",
        "libeffects",
@@ -48,6 +49,7 @@ cc_defaults {
        "libeffects_headers",
        "libeffects_headers",
        "libhardware_headers",
        "libhardware_headers",
        "libmedia_headers",
        "libmedia_headers",
        "libmediautils_headers",
    ],
    ],
}
}


+26 −16
Original line number Original line Diff line number Diff line
@@ -22,13 +22,11 @@
#include "Effect.h"
#include "Effect.h"
#include "common/all-versions/default/EffectMap.h"
#include "common/all-versions/default/EffectMap.h"


#include <memory.h>

#define ATRACE_TAG ATRACE_TAG_AUDIO
#define ATRACE_TAG ATRACE_TAG_AUDIO

#include <HidlUtils.h>
#include <HidlUtils.h>
#include <android/log.h>
#include <android/log.h>
#include <media/EffectsFactoryApi.h>
#include <media/EffectsFactoryApi.h>
#include <mediautils/ScopedStatistics.h>
#include <util/EffectUtils.h>
#include <util/EffectUtils.h>
#include <utils/Trace.h>
#include <utils/Trace.h>


@@ -49,12 +47,17 @@ using ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION::implementati


namespace {
namespace {


#define SCOPED_STATS()                                                       \
    ::android::mediautils::ScopedStatistics scopedStatistics {               \
        std::string("EffectHal::").append(__func__), mEffectHal->mStatistics \
    }

class ProcessThread : public Thread {
class ProcessThread : public Thread {
   public:
   public:
    // ProcessThread's lifespan never exceeds Effect's lifespan.
    // ProcessThread's lifespan never exceeds Effect's lifespan.
     ProcessThread(std::atomic<bool>* stop, effect_handle_t effect,
     ProcessThread(std::atomic<bool>* stop, effect_handle_t effect,
                   std::atomic<audio_buffer_t*>* inBuffer, std::atomic<audio_buffer_t*>* outBuffer,
                   std::atomic<audio_buffer_t*>* inBuffer, std::atomic<audio_buffer_t*>* outBuffer,
                  Effect::StatusMQ* statusMQ, EventFlag* efGroup)
                   Effect::StatusMQ* statusMQ, EventFlag* efGroup, Effect* effectHal)
         : Thread(false /*canCallJava*/),
         : Thread(false /*canCallJava*/),
           mStop(stop),
           mStop(stop),
           mEffect(effect),
           mEffect(effect),
@@ -62,7 +65,8 @@ class ProcessThread : public Thread {
           mInBuffer(inBuffer),
           mInBuffer(inBuffer),
           mOutBuffer(outBuffer),
           mOutBuffer(outBuffer),
           mStatusMQ(statusMQ),
           mStatusMQ(statusMQ),
          mEfGroup(efGroup) {}
           mEfGroup(efGroup),
           mEffectHal(effectHal) {}
     virtual ~ProcessThread() {}
     virtual ~ProcessThread() {}


   private:
   private:
@@ -73,6 +77,7 @@ class ProcessThread : public Thread {
    std::atomic<audio_buffer_t*>* mOutBuffer;
    std::atomic<audio_buffer_t*>* mOutBuffer;
    Effect::StatusMQ* mStatusMQ;
    Effect::StatusMQ* mStatusMQ;
    EventFlag* mEfGroup;
    EventFlag* mEfGroup;
    Effect* const mEffectHal;


    bool threadLoop() override;
    bool threadLoop() override;
};
};
@@ -102,6 +107,9 @@ bool ProcessThread::threadLoop() {
            audio_buffer_t* outBuffer =
            audio_buffer_t* outBuffer =
                std::atomic_load_explicit(mOutBuffer, std::memory_order_relaxed);
                std::atomic_load_explicit(mOutBuffer, std::memory_order_relaxed);
            if (inBuffer != nullptr && outBuffer != nullptr) {
            if (inBuffer != nullptr && outBuffer != nullptr) {
                // Time this effect process
                SCOPED_STATS();

                if (efState & static_cast<uint32_t>(MessageQueueFlagBits::REQUEST_PROCESS)) {
                if (efState & static_cast<uint32_t>(MessageQueueFlagBits::REQUEST_PROCESS)) {
                    processResult = (*mEffect)->process(mEffect, inBuffer, outBuffer);
                    processResult = (*mEffect)->process(mEffect, inBuffer, outBuffer);
                } else {
                } else {
@@ -359,7 +367,7 @@ Return<void> Effect::prepareForProcessing(prepareForProcessing_cb _hidl_cb) {


    // Create and launch the thread.
    // Create and launch the thread.
    mProcessThread = new ProcessThread(&mStopProcessThread, mHandle, &mHalInBufferPtr,
    mProcessThread = new ProcessThread(&mStopProcessThread, mHandle, &mHalInBufferPtr,
                                       &mHalOutBufferPtr, tempStatusMQ.get(), mEfGroup);
                                       &mHalOutBufferPtr, tempStatusMQ.get(), mEfGroup, this);
    status = mProcessThread->run("effect", PRIORITY_URGENT_AUDIO);
    status = mProcessThread->run("effect", PRIORITY_URGENT_AUDIO);
    if (status != OK) {
    if (status != OK) {
        ALOGW("failed to start effect processing thread: %s", strerror(-status));
        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) {
    if (fd.getNativeHandle() != nullptr && fd->numFds == 1) {
        uint32_t cmdData = fd->data[0];
        uint32_t cmdData = fd->data[0];
        (void)sendCommand(EFFECT_CMD_DUMP, "DUMP", sizeof(cmdData), &cmdData);
        (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();
    return Void();
}
}
+6 −1
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@
#include <fmq/MessageQueue.h>
#include <fmq/MessageQueue.h>
#include <hidl/MQDescriptor.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include <hidl/Status.h>
#include <mediautils/MethodStatistics.h>
#include <utils/Thread.h>
#include <utils/Thread.h>


#include <hardware/audio_effect.h>
#include <hardware/audio_effect.h>
@@ -169,6 +170,10 @@ struct Effect : public IEffect {
    Result setParameterImpl(uint32_t paramSize, const void* paramData, uint32_t valueSize,
    Result setParameterImpl(uint32_t paramSize, const void* paramData, uint32_t valueSize,
                            const void* valueData);
                            const void* valueData);


    // process execution statistics
    const std::shared_ptr<mediautils::MethodStatistics<std::string>> mStatistics =
            std::make_shared<mediautils::MethodStatistics<std::string>>();

  private:
  private:
    friend struct VirtualizerEffect;  // for getParameterImpl
    friend struct VirtualizerEffect;  // for getParameterImpl
    friend struct VisualizerEffect;   // to allow executing commands
    friend struct VisualizerEffect;   // to allow executing commands