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

Commit 4cc10153 authored by Shunkai Yao's avatar Shunkai Yao Committed by Gerrit Code Review
Browse files

Merge "AIDL: Update locking in EffectImpl"

parents cc5853e8 b870cd25
Loading
Loading
Loading
Loading
+73 −37
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
 * limitations under the License.
 */

#include <cstddef>
#define LOG_TAG "BundleContext"
#include <Utils.h>

@@ -23,8 +24,9 @@
namespace aidl::android::hardware::audio::effect {

RetCode BundleContext::init() {
    std::lock_guard lg(mMutex);
    // init with pre-defined preset NORMAL
    for (int i = 0; i < lvm::MAX_NUM_BANDS; i++) {
    for (std::size_t i = 0; i < lvm::MAX_NUM_BANDS; i++) {
        mBandGaindB[i] = lvm::kSoftPresets[0 /* normal */][i];
    }

@@ -57,6 +59,7 @@ deinit:
}

void BundleContext::deInit() {
    std::lock_guard lg(mMutex);
    if (mInstance) {
        LVM_DelInstanceHandle(&mInstance);
        mInstance = nullptr;
@@ -65,6 +68,8 @@ void BundleContext::deInit() {

RetCode BundleContext::enable() {
    LVM_ControlParams_t params;
    {
        std::lock_guard lg(mMutex);
        RETURN_VALUE_IF(LVM_SUCCESS != LVM_GetControlParameters(mInstance, &params),
                        RetCode::ERROR_EFFECT_LIB_ERROR, "failGetControlParams");
        if (mType == lvm::BundleEffectType::EQUALIZER) {
@@ -73,6 +78,7 @@ RetCode BundleContext::enable() {
        }
        RETURN_VALUE_IF(LVM_SUCCESS != LVM_SetControlParameters(mInstance, &params),
                        RetCode::ERROR_EFFECT_LIB_ERROR, "failSetControlParams");
    }
    mEnabled = true;
    // LvmEffect_limitLevel(pContext);
    return RetCode::SUCCESS;
@@ -80,6 +86,8 @@ RetCode BundleContext::enable() {

RetCode BundleContext::disable() {
    LVM_ControlParams_t params;
    {
        std::lock_guard lg(mMutex);
        RETURN_VALUE_IF(LVM_SUCCESS != LVM_GetControlParameters(mInstance, &params),
                        RetCode::ERROR_EFFECT_LIB_ERROR, "failGetControlParams");
        if (mType == lvm::BundleEffectType::EQUALIZER) {
@@ -88,6 +96,7 @@ RetCode BundleContext::disable() {
        }
        RETURN_VALUE_IF(LVM_SUCCESS != LVM_SetControlParameters(mInstance, &params),
                        RetCode::ERROR_EFFECT_LIB_ERROR, "failSetControlParams");
    }
    mEnabled = false;
    // LvmEffect_limitLevel(pContext);
    return RetCode::SUCCESS;
@@ -148,27 +157,29 @@ RetCode BundleContext::setVolumeStereo(const Parameter::VolumeStereo& volume) {
    // android::VolumeSetVolumeLevel(pContext, (int16_t)(maxdB * 100));
    LOG(DEBUG) << __func__ << " pandB: " << pandB << " maxdB " << maxdB;

    {
        std::lock_guard lg(mMutex);
        RETURN_VALUE_IF(LVM_SUCCESS != LVM_GetControlParameters(mInstance, &params),
                        RetCode::ERROR_EFFECT_LIB_ERROR, "");

        params.VC_Balance = pandB;

        RETURN_VALUE_IF(LVM_SUCCESS != LVM_SetControlParameters(mInstance, &params),
                        RetCode::ERROR_EFFECT_LIB_ERROR, "");

    }
    mVolumeStereo = volume;
    return RetCode::SUCCESS;
}

RetCode BundleContext::setEqualizerPreset(const int presetIdx) {
RetCode BundleContext::setEqualizerPreset(const std::size_t presetIdx) {
    if (presetIdx < 0 || presetIdx >= lvm::MAX_NUM_PRESETS) {
        return RetCode::ERROR_ILLEGAL_PARAMETER;
    }

    std::vector<Equalizer::BandLevel> bandLevels;
    bandLevels.reserve(lvm::MAX_NUM_BANDS);
    for (int i = 0; i < lvm::MAX_NUM_BANDS; i++) {
        bandLevels.emplace_back(Equalizer::BandLevel{i, lvm::kSoftPresets[presetIdx][i]});
    for (std::size_t i = 0; i < lvm::MAX_NUM_BANDS; i++) {
        bandLevels.emplace_back(
                Equalizer::BandLevel{static_cast<int32_t>(i), lvm::kSoftPresets[presetIdx][i]});
    }

    RetCode ret = updateControlParameter(bandLevels);
@@ -197,8 +208,8 @@ RetCode BundleContext::setEqualizerBandLevels(const std::vector<Equalizer::BandL
std::vector<Equalizer::BandLevel> BundleContext::getEqualizerBandLevels() const {
    std::vector<Equalizer::BandLevel> bandLevels;
    bandLevels.reserve(lvm::MAX_NUM_BANDS);
    for (int i = 0; i < lvm::MAX_NUM_BANDS; i++) {
        bandLevels.emplace_back(Equalizer::BandLevel{i, mBandGaindB[i]});
    for (std::size_t i = 0; i < lvm::MAX_NUM_BANDS; i++) {
        bandLevels.emplace_back(Equalizer::BandLevel{static_cast<int32_t>(i), mBandGaindB[i]});
    }
    return bandLevels;
}
@@ -221,10 +232,12 @@ RetCode BundleContext::updateControlParameter(const std::vector<Equalizer::BandL
    }

    LVM_ControlParams_t params;
    {
        std::lock_guard lg(mMutex);
        RETURN_VALUE_IF(LVM_SUCCESS != LVM_GetControlParameters(mInstance, &params),
                        RetCode::ERROR_EFFECT_LIB_ERROR, " getControlParamFailed");

    for (int i = 0; i < lvm::MAX_NUM_BANDS; i++) {
        for (std::size_t i = 0; i < lvm::MAX_NUM_BANDS; i++) {
            params.pEQNB_BandDefinition[i].Frequency = lvm::kPresetsFrequencies[i];
            params.pEQNB_BandDefinition[i].QFactor = lvm::kPresetsQFactors[i];
            params.pEQNB_BandDefinition[i].Gain = tempLevel[i];
@@ -232,6 +245,7 @@ RetCode BundleContext::updateControlParameter(const std::vector<Equalizer::BandL

        RETURN_VALUE_IF(LVM_SUCCESS != LVM_SetControlParameters(mInstance, &params),
                        RetCode::ERROR_EFFECT_LIB_ERROR, " setControlParamFailed");
    }
    mBandGaindB = tempLevel;
    LOG(INFO) << __func__ << " update bandGain to " << ::android::internal::ToString(mBandGaindB);

@@ -296,7 +310,7 @@ LVM_EQNB_BandDef_t *BundleContext::getDefaultEqualizerBandDefs() {
    static LVM_EQNB_BandDef_t* BandDefs = []() {
        static LVM_EQNB_BandDef_t tempDefs[lvm::MAX_NUM_BANDS];
        /* N-Band Equaliser parameters */
        for (int i = 0; i < lvm::MAX_NUM_BANDS; i++) {
        for (std::size_t i = 0; i < lvm::MAX_NUM_BANDS; i++) {
            tempDefs[i].Frequency = lvm::kPresetsFrequencies[i];
            tempDefs[i].QFactor = lvm::kPresetsQFactors[i];
            tempDefs[i].Gain = lvm::kSoftPresets[0/* normal */][i];
@@ -323,4 +337,26 @@ LVM_HeadroomBandDef_t *BundleContext::getDefaultEqualizerHeadroomBanDefs() {
    return HeadroomBandDef;
}

IEffect::Status BundleContext::lvmProcess(float* in, float* out, int samples) {
    IEffect::Status status = {EX_NULL_POINTER, 0, 0};

    auto frameSize = getInputFrameSize();
    RETURN_VALUE_IF(0== frameSize, status, "nullContext");

    LOG(DEBUG) << __func__ << " start processing";
    LVM_UINT16 frames = samples * sizeof(float) / frameSize;
    LVM_ReturnStatus_en lvmStatus;
    {
        std::lock_guard lg(mMutex);
        lvmStatus = LVM_Process(mInstance, in, out, frames, 0);
    }

    if (lvmStatus != LVM_SUCCESS) {
        LOG(ERROR) << __func__ << lvmStatus;
        return {EX_UNSUPPORTED_OPERATION, 0, 0};
    }
    LOG(DEBUG) << __func__ << " done processing";
    return {STATUS_OK, samples, samples};
}

}  // namespace aidl::android::hardware::audio::effect
+8 −5
Original line number Diff line number Diff line
@@ -17,7 +17,9 @@
#pragma once

#include <android-base/logging.h>
#include <android-base/thread_annotations.h>
#include <array>
#include <cstddef>

#include "BundleTypes.h"
#include "effect-impl/EffectContext.h"
@@ -43,8 +45,6 @@ class BundleContext final : public EffectContext {
    RetCode enable();
    RetCode disable();

    LVM_Handle_t getLvmInstance() const { return mInstance; }

    void setSampleRate (const int sampleRate) { mSampleRate = sampleRate; }
    int getSampleRate() const { return mSampleRate; }

@@ -55,18 +55,21 @@ class BundleContext final : public EffectContext {
        return mChMask;
    }

    RetCode setEqualizerPreset(const int presetIdx);
    RetCode setEqualizerPreset(const std::size_t presetIdx);
    int getEqualizerPreset() const { return mCurPresetIdx; }
    RetCode setEqualizerBandLevels(const std::vector<Equalizer::BandLevel>& bandLevels);
    std::vector<Equalizer::BandLevel> getEqualizerBandLevels() const;

    RetCode setVolumeStereo(const Parameter::VolumeStereo& volumeStereo) override;
    Parameter::VolumeStereo getVolumeStereo() override { return mVolumeStereo; };
    Parameter::VolumeStereo getVolumeStereo() override { return mVolumeStereo; }

    IEffect::Status lvmProcess(float* in, float* out, int samples);

  private:
    std::mutex mMutex;
    const lvm::BundleEffectType mType;
    bool mEnabled = false;
    LVM_Handle_t mInstance = nullptr;
    LVM_Handle_t mInstance GUARDED_BY(mMutex);

    aidl::android::media::audio::common::AudioDeviceDescription mVirtualizerForcedDevice;
    aidl::android::media::audio::common::AudioChannelLayout mChMask;
+32 −28
Original line number Diff line number Diff line
@@ -93,8 +93,8 @@ ndk::ScopedAStatus EffectBundleAidl::getDescriptor(Descriptor* _aidl_return) {
}

ndk::ScopedAStatus EffectBundleAidl::setParameterCommon(const Parameter& param) {
    std::lock_guard lg(mMutex);
    RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");

    auto tag = param.getTag();
    switch (tag) {
        case Parameter::common:
@@ -133,7 +133,7 @@ ndk::ScopedAStatus EffectBundleAidl::setParameterSpecific(const Parameter::Speci
    auto tag = specific.getTag();
    RETURN_IF(tag != Parameter::Specific::equalizer, EX_ILLEGAL_ARGUMENT,
              "specificParamNotSupported");
    RETURN_IF(mContext == nullptr, EX_NULL_POINTER , "nullContext");
    RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");

    auto& eq = specific.get<Parameter::Specific::equalizer>();
    auto eqTag = eq.getTag();
@@ -174,7 +174,6 @@ ndk::ScopedAStatus EffectBundleAidl::getParameterSpecific(const Parameter::Id& i

ndk::ScopedAStatus EffectBundleAidl::getParameterEqualizer(const Equalizer::Tag& tag,
                                                           Parameter::Specific* specific) {
    std::lock_guard lg(mMutex);
    RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
    Equalizer eqParam;
    switch (tag) {
@@ -200,12 +199,16 @@ ndk::ScopedAStatus EffectBundleAidl::getParameterEqualizer(const Equalizer::Tag&
std::shared_ptr<EffectContext> EffectBundleAidl::createContext(const Parameter::Common& common) {
    if (mContext) {
        LOG(DEBUG) << __func__ << " context already exist";
    } else {
        // GlobalSession is a singleton
        mContext = GlobalSession::getGlobalSession().createSession(mType, 1 /* statusFmqDepth */,
                                                                   common);
    }

    return mContext;
}

    // GlobalSession is a singleton
    mContext =
            GlobalSession::getGlobalSession().createSession(mType, 1 /* statusFmqDepth */, common);
std::shared_ptr<EffectContext> EffectBundleAidl::getContext() {
    return mContext;
}

@@ -217,29 +220,30 @@ RetCode EffectBundleAidl::releaseContext() {
    return RetCode::SUCCESS;
}

// Processing method running in EffectWorker thread.
IEffect::Status EffectBundleAidl::effectProcessImpl(float* in, float* out, int sampleToProcess) {
    LOG(DEBUG) << __func__ << " in " << in << " out " << out << " sample " << sampleToProcess;
    if (!mContext) {
        LOG(ERROR) << __func__ << " nullContext";
        return {EX_NULL_POINTER, 0, 0};
ndk::ScopedAStatus EffectBundleAidl::commandImpl(CommandId command) {
    RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
    switch (command) {
        case CommandId::START:
            mContext->enable();
            break;
        case CommandId::STOP:
            mContext->disable();
            break;
        case CommandId::RESET:
            mContext->disable();
            mContext->resetBuffer();
            break;
        default:
            LOG(ERROR) << __func__ << " commandId " << toString(command) << " not supported";
            return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
                                                                    "commandIdNotSupported");
    }

    auto frameSize = mContext->getInputFrameSize();
    if (0 == frameSize) {
        LOG(ERROR) << __func__ << " frameSizeIs0";
        return {EX_ILLEGAL_ARGUMENT, 0, 0};
    return ndk::ScopedAStatus::ok();
}

    LOG(DEBUG) << __func__ << " start processing";
    LVM_UINT16 frames = sampleToProcess * sizeof(float) / frameSize;
    LVM_ReturnStatus_en lvmStatus = LVM_Process(mContext->getLvmInstance(), in, out, frames, 0);
    if (lvmStatus != LVM_SUCCESS) {
        LOG(ERROR) << __func__ << lvmStatus;
        return {EX_UNSUPPORTED_OPERATION, 0, 0};
    }
    LOG(DEBUG) << __func__ << " done processing";
    return {STATUS_OK, sampleToProcess, sampleToProcess};
// Processing method running in EffectWorker thread.
IEffect::Status EffectBundleAidl::effectProcessImpl(float* in, float* out, int sampleToProcess) {
    return mContext->lvmProcess(in, out, sampleToProcess);
}

}  // namespace aidl::android::hardware::audio::effect
+7 −15
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@
#include <functional>
#include <map>
#include <memory>
#include <mutex>

#include <aidl/android/hardware/audio/effect/BnEffect.h>
#include <android-base/logging.h>
@@ -42,28 +41,21 @@ class EffectBundleAidl final : public EffectImpl {
    ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
    ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
                                            Parameter::Specific* specific) override;
    IEffect::Status effectProcessImpl(float *in, float *out, int process) override;

    std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
    std::shared_ptr<EffectContext> getContext() override;
    RetCode releaseContext() override;

    ndk::ScopedAStatus commandStart() override {
        mContext->enable();
        return ndk::ScopedAStatus::ok();
    }
    ndk::ScopedAStatus commandStop() override {
        mContext->disable();
        return ndk::ScopedAStatus::ok();
    }
    ndk::ScopedAStatus commandReset() override {
            mContext->disable();
            return ndk::ScopedAStatus::ok();
    }
    IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;

    ndk::ScopedAStatus commandImpl(CommandId command) override;

    std::string getEffectName() override { return "EqualizerBundle"; }

  private:
    std::shared_ptr<BundleContext> mContext;
    const Descriptor* mDescriptor;
    lvm::BundleEffectType mType = lvm::BundleEffectType::EQUALIZER;
    std::shared_ptr<BundleContext> mContext;

    IEffect::Status status(binder_status_t status, size_t consumed, size_t produced);
    ndk::ScopedAStatus getParameterEqualizer(const Equalizer::Tag& tag,
+5 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <unordered_map>

#include <android-base/logging.h>
#include <android-base/thread_annotations.h>

#include "BundleContext.h"
#include "BundleTypes.h"
@@ -40,7 +41,10 @@ class GlobalSession {
        return instance;
    }

    bool isSessionIdExist(int sessionId) const { return mSessionMap.count(sessionId); }
    bool isSessionIdExist(int sessionId) {
        std::lock_guard lg(mMutex);
        return mSessionMap.count(sessionId);
    }

    static bool findBundleTypeInList(std::vector<std::shared_ptr<BundleContext>>& list,
                                     const lvm::BundleEffectType& type, bool remove = false) {
Loading