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

Commit 2049eaab authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add effect proxy shared capability and parameters clamping" into main

parents 1f99bd67 1627e36b
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) {