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

Commit 1627e36b authored by Shunkai Yao's avatar Shunkai Yao
Browse files

Add effect proxy shared capability and parameters clamping

Flag: EXEMPT bugfix
Bug: 369537834
Test: Youtube Music with effect enable/disable on Pixel
Test: dumpsys media.audio_flinger
Change-Id: I9578bc6691952dfb18ee80d4bc4e8f235c5d44a8
parent 65881cf0
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@

#include <fmq/AidlMessageQueue.h>
#include <system/audio_aidl_utils.h>
#include <system/audio_effects/aidl_effects_utils.h>
#include <utils/Log.h>

#include "EffectProxy.h"
@@ -41,7 +42,8 @@ namespace android::effect {

EffectProxy::EffectProxy(const AudioUuid& uuid, const std::vector<Descriptor>& descriptors,
                         const std::shared_ptr<IFactory>& factory)
    : mDescriptorCommon(buildDescriptorCommon(uuid, descriptors)),
    : mSharedCapability(buildDescriptorCapability(descriptors)),
      mDescriptorCommon(buildDescriptorCommon(uuid, descriptors)),
      mSubEffects(
              [](const std::vector<Descriptor>& descs, const std::shared_ptr<IFactory>& factory) {
                  std::vector<SubEffect> subEffects;
@@ -163,6 +165,7 @@ ndk::ScopedAStatus EffectProxy::close() {

ndk::ScopedAStatus EffectProxy::getDescriptor(Descriptor* desc) {
    *desc = mSubEffects[mActiveSubIdx].descriptor;
    desc->capability = mSharedCapability;
    desc->common = mDescriptorCommon;
    return ndk::ScopedAStatus::ok();
}
@@ -182,6 +185,7 @@ ndk::ScopedAStatus EffectProxy::buildDescriptor(const AudioUuid& uuid,
    }

    desc->common = buildDescriptorCommon(uuid, subEffectDescs);
    desc->capability = buildDescriptorCapability(subEffectDescs);
    return ndk::ScopedAStatus::ok();
}

@@ -216,6 +220,20 @@ Descriptor::Common EffectProxy::buildDescriptorCommon(
    return swCommon;
}

// Build a shared Descriptor capability with all sub-effects.
Capability EffectProxy::buildDescriptorCapability(const std::vector<Descriptor>& subEffectDescs) {
    std::optional<Capability> cap = subEffectDescs[0].capability;
    for (size_t i = 1; i < subEffectDescs.size(); i++) {
        cap = findSharedCapability(cap.value(), subEffectDescs[i].capability);
        if (!cap) {
            ALOGE("%s failed to find the shared capability at %zu", __func__, i);
            return subEffectDescs[0].capability;
        }
    }

    return cap.value();
}

// Handle with active sub-effect first, only send to other sub-effects when success
ndk::ScopedAStatus EffectProxy::command(CommandId id) {
    return runWithActiveSubEffectThenOthers(
@@ -323,6 +341,8 @@ std::string EffectProxy::toString(size_t level) const {
    prefixSpace += " ";
    base::StringAppendF(&ss, "%sDescriptorCommon: %s\n", prefixSpace.c_str(),
                        mDescriptorCommon.toString().c_str());
    base::StringAppendF(&ss, "%sDescriptorCapability: %s\n", prefixSpace.c_str(),
                        mSharedCapability.toString().c_str());
    base::StringAppendF(&ss, "%sActiveSubIdx: %zu\n", prefixSpace.c_str(), mActiveSubIdx);
    base::StringAppendF(&ss, "%sAllSubEffects:\n", prefixSpace.c_str());
    for (size_t i = 0; i < mSubEffects.size(); i++) {
+7 −0
Original line number Diff line number Diff line
@@ -108,6 +108,8 @@ class EffectProxy final : public ::aidl::android::hardware::audio::effect::BnEff
    std::string toString(size_t indent = 0) const;

  private:
    // The shared capability of all sub-effects
    const ::aidl::android::hardware::audio::effect::Capability mSharedCapability;
    // Proxy descriptor common part, copy from one sub-effect, and update the implementation UUID to
    // proxy UUID, proxy descriptor capability part comes from the active sub-effect capability
    const ::aidl::android::hardware::audio::effect::Descriptor::Common mDescriptorCommon;
@@ -146,6 +148,11 @@ class EffectProxy final : public ::aidl::android::hardware::audio::effect::BnEff
            const std::vector<::aidl::android::hardware::audio::effect::Descriptor>&
                    subEffectDescs);

    // build a shared capability with all sub-effect descriptors
    static ::aidl::android::hardware::audio::effect::Capability buildDescriptorCapability(
            const std::vector<::aidl::android::hardware::audio::effect::Descriptor>&
                    subEffectDescs);

    // close and release all sub-effects
    ~EffectProxy();
};
+11 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <media/AidlConversionNdk.h>
#include <media/AidlConversionEffect.h>
#include <system/audio_effect.h>
#include <system/audio_effects/aidl_effects_utils.h>
#include <system/audio_effects/effect_dynamicsprocessing.h>
#include <Utils.h>
#include <utils/Log.h>
@@ -38,8 +39,10 @@ using ::aidl::android::convertIntegral;
using ::aidl::android::getParameterSpecificField;
using ::aidl::android::aidl_utils::statusTFromBinderStatus;
using ::aidl::android::hardware::audio::effect::Capability;
using ::aidl::android::hardware::audio::effect::clampParameter;
using ::aidl::android::hardware::audio::effect::DynamicsProcessing;
using ::aidl::android::hardware::audio::effect::Parameter;
using ::aidl::android::hardware::audio::effect::Range;
using ::aidl::android::hardware::audio::effect::toString;
using ::aidl::android::hardware::audio::effect::VendorExtension;
using ::android::status_t;
@@ -126,7 +129,14 @@ status_t AidlConversionDp::setParameter(EffectParamReader& param) {
        }
    }

    return statusTFromBinderStatus(mEffect->setParameter(aidlParam));
    std::optional<Parameter> clamped =
            clampParameter<Range::dynamicsProcessing, Parameter::Specific::dynamicsProcessing>(
                    aidlParam, getDescriptor().capability);
    if (!clamped) {
        ALOGE("%s failed to clamp parameters: %s", __func__, aidlParam.toString().c_str());
        return BAD_VALUE;
    }
    return statusTFromBinderStatus(mEffect->setParameter(clamped.value()));
}

status_t AidlConversionDp::getParameter(EffectParamWriter& param) {