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

Commit 7471478d authored by Shraddha Basantwani's avatar Shraddha Basantwani
Browse files

Audio : Add Remote Submix as supported device for effects

Rename BandGain variable to correctly reflect it's unit
Add initialisation of sample rate, channel mask and number of channels
Remove redundant methods and variables

Bug: 302036943
Test: atest audioeffect_analysis
Change-Id: I0918cdf20a221799b653a57ed4c3e11cb778c0cb
parent 273b25cd
Loading
Loading
Loading
Loading
+54 −32
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#define LOG_TAG "BundleContext"
#include <android-base/logging.h>
#include <audio_utils/power.h>
#include <media/AidlConversionCppNdk.h>
#include <Utils.h>

#include "BundleContext.h"
@@ -36,9 +37,10 @@ BundleContext::BundleContext(int statusDepth, const Parameter::Common& common,
              const lvm::BundleEffectType& type)
        : EffectContext(statusDepth, common), mType(type) {
    LOG(DEBUG) << __func__ << type;
    int channelCount = ::aidl::android::hardware::audio::common::getChannelCount(

    int inputChannelCount = ::aidl::android::hardware::audio::common::getChannelCount(
            common.input.base.channelMask);
    mSamplesPerSecond = common.input.base.sampleRate * channelCount;
    mSamplesPerSecond = common.input.base.sampleRate * inputChannelCount;
}

BundleContext::~BundleContext() {
@@ -50,9 +52,15 @@ RetCode BundleContext::init() {
    std::lock_guard lg(mMutex);
    // init with pre-defined preset NORMAL
    for (std::size_t i = 0; i < lvm::MAX_NUM_BANDS; i++) {
        mBandGainMdB[i] = lvm::kSoftPresets[0 /* normal */][i] * 100;
        mBandGainmB[i] = lvm::kSoftPresets[0 /* normal */][i] * 100;
    }

    // Initialise control params
    LVM_ControlParams_t controlParams;
    RetCode retStatus = initControlParameter(controlParams);
    RETURN_VALUE_IF(retStatus != RetCode::SUCCESS, RetCode::ERROR_ILLEGAL_PARAMETER,
                    " UnsupportedParams");

    // allocate lvm instance
    LVM_ReturnStatus_en status;
    LVM_InstParams_t params = {.BufferMode = LVM_UNMANAGED_BUFFERS,
@@ -63,8 +71,6 @@ RetCode BundleContext::init() {
    GOTO_IF_LVM_ERROR(status, deinit, "LVM_GetInstanceHandleFailed");

    // set control
    LVM_ControlParams_t controlParams;
    initControlParameter(controlParams);
    status = LVM_SetControlParameters(mInstance, &controlParams);
    GOTO_IF_LVM_ERROR(status, deinit, "LVM_SetControlParametersFailed");

@@ -227,8 +233,8 @@ RetCode BundleContext::limitLevel() {
        bool viEnabled = params.VirtualizerOperatingMode == LVM_MODE_ON;

        if (eqEnabled) {
            for (size_t i = 0; i < lvm::MAX_NUM_BANDS; i++) {
                float bandFactor = mBandGainMdB[i] / 1500.0;
            for (unsigned int i = 0; i < lvm::MAX_NUM_BANDS; i++) {
                float bandFactor = mBandGainmB[i] / 1500.0;
                float bandCoefficient = lvm::kBandEnergyCoefficient[i];
                float bandEnergy = bandFactor * bandCoefficient * bandCoefficient;
                if (bandEnergy > 0) energyContribution += bandEnergy;
@@ -236,9 +242,9 @@ RetCode BundleContext::limitLevel() {

            // cross EQ coefficients
            float bandFactorSum = 0;
            for (size_t i = 0; i < lvm::MAX_NUM_BANDS - 1; i++) {
                float bandFactor1 = mBandGainMdB[i] / 1500.0;
                float bandFactor2 = mBandGainMdB[i + 1] / 1500.0;
            for (unsigned int i = 0; i < lvm::MAX_NUM_BANDS - 1; i++) {
                float bandFactor1 = mBandGainmB[i] / 1500.0;
                float bandFactor2 = mBandGainmB[i + 1] / 1500.0;

                if (bandFactor1 > 0 && bandFactor2 > 0) {
                    float crossEnergy =
@@ -259,8 +265,8 @@ RetCode BundleContext::limitLevel() {
            energyContribution += boostFactor * boostCoefficient * boostCoefficient;

            if (eqEnabled) {
                for (size_t i = 0; i < lvm::MAX_NUM_BANDS; i++) {
                    float bandFactor = mBandGainMdB[i] / 1500.0;
                for (unsigned int i = 0; i < lvm::MAX_NUM_BANDS; i++) {
                    float bandFactor = mBandGainmB[i] / 1500.0;
                    float bandCrossCoefficient = lvm::kBassBoostEnergyCrossCoefficient[i];
                    float bandEnergy = boostFactor * bandFactor * bandCrossCoefficient;
                    if (bandEnergy > 0) energyBassBoost += bandEnergy;
@@ -312,7 +318,9 @@ bool BundleContext::isDeviceSupportedBassBoost(
            device != AudioDeviceDescription{AudioDeviceType::OUT_CARKIT,
                                             AudioDeviceDescription::CONNECTION_BT_SCO} &&
            device != AudioDeviceDescription{AudioDeviceType::OUT_SPEAKER,
                                             AudioDeviceDescription::CONNECTION_BT_A2DP}) {
                                             AudioDeviceDescription::CONNECTION_BT_A2DP} &&
            device != AudioDeviceDescription{AudioDeviceType::OUT_SUBMIX,
                                             AudioDeviceDescription::CONNECTION_VIRTUAL}) {
            return false;
        }
    }
@@ -329,7 +337,9 @@ bool BundleContext::isDeviceSupportedVirtualizer(
            device != AudioDeviceDescription{AudioDeviceType::OUT_HEADPHONE,
                                             AudioDeviceDescription::CONNECTION_BT_A2DP} &&
            device != AudioDeviceDescription{AudioDeviceType::OUT_HEADSET,
                                             AudioDeviceDescription::CONNECTION_USB}) {
                                             AudioDeviceDescription::CONNECTION_USB} &&
            device != AudioDeviceDescription{AudioDeviceType::OUT_SUBMIX,
                                             AudioDeviceDescription::CONNECTION_VIRTUAL}) {
            return false;
        }
    }
@@ -469,6 +479,7 @@ RetCode BundleContext::setEqualizerPreset(const std::size_t presetIdx) {
RetCode BundleContext::setEqualizerBandLevels(const std::vector<Equalizer::BandLevel>& bandLevels) {
    RETURN_VALUE_IF(bandLevels.size() > lvm::MAX_NUM_BANDS || bandLevels.empty(),
                    RetCode::ERROR_ILLEGAL_PARAMETER, "sizeExceedMax");

    RetCode ret = updateControlParameter(bandLevels);
    if (RetCode::SUCCESS == ret) {
        mCurPresetIdx = lvm::PRESET_CUSTOM;
@@ -483,15 +494,13 @@ std::vector<Equalizer::BandLevel> BundleContext::getEqualizerBandLevels() const
    std::vector<Equalizer::BandLevel> bandLevels;
    bandLevels.reserve(lvm::MAX_NUM_BANDS);
    for (std::size_t i = 0; i < lvm::MAX_NUM_BANDS; i++) {
        bandLevels.emplace_back(
                Equalizer::BandLevel{static_cast<int32_t>(i), mBandGainMdB[i]});
        bandLevels.emplace_back(Equalizer::BandLevel{static_cast<int32_t>(i), mBandGainmB[i]});
    }
    return bandLevels;
}

std::vector<int32_t> BundleContext::getEqualizerCenterFreqs() {
    std::vector<int32_t> freqs;

    LVM_ControlParams_t params;
    {
        std::lock_guard lg(mMutex);
@@ -518,7 +527,7 @@ RetCode BundleContext::updateControlParameter(const std::vector<Equalizer::BandL
    RETURN_VALUE_IF(!isBandLevelIndexInRange(bandLevels), RetCode::ERROR_ILLEGAL_PARAMETER,
                    "indexOutOfRange");

    std::array<int, lvm::MAX_NUM_BANDS> tempLevel(mBandGainMdB);
    std::array<int, lvm::MAX_NUM_BANDS> tempLevel(mBandGainmB);
    for (const auto& it : bandLevels) {
        tempLevel[it.index] = it.levelMb;
    }
@@ -539,8 +548,8 @@ RetCode BundleContext::updateControlParameter(const std::vector<Equalizer::BandL
        RETURN_VALUE_IF(LVM_SUCCESS != LVM_SetControlParameters(mInstance, &params),
                        RetCode::ERROR_EFFECT_LIB_ERROR, " setControlParamFailed");
    }
    mBandGainMdB = tempLevel;
    LOG(DEBUG) << __func__ << " update bandGain to " << ::android::internal::ToString(mBandGainMdB)
    mBandGainmB = tempLevel;
    LOG(DEBUG) << __func__ << " update bandGain to " << ::android::internal::ToString(mBandGainmB)
               << "mdB";

    return RetCode::SUCCESS;
@@ -618,11 +627,30 @@ RetCode BundleContext::setForcedDevice(
    return RetCode::SUCCESS;
}

void BundleContext::initControlParameter(LVM_ControlParams_t& params) const {
RetCode BundleContext::initControlParameter(LVM_ControlParams_t& params) const {
    int outputChannelCount = ::aidl::android::hardware::audio::common::getChannelCount(
            mCommon.output.base.channelMask);
    auto outputChannelMaskConv = aidl2legacy_AudioChannelLayout_audio_channel_mask_t(
            mCommon.output.base.channelMask, /*isInput*/ false);
    RETURN_VALUE_IF(!outputChannelMaskConv.ok(), RetCode::ERROR_ILLEGAL_PARAMETER,
                    " outputChannelMaskNotValid");

    params.NrChannels = outputChannelCount;
    params.ChMask = outputChannelMaskConv.value();
    params.SampleRate = lvmFsForSampleRate(mCommon.input.base.sampleRate);

    int inputChannelCount = ::aidl::android::hardware::audio::common::getChannelCount(
            mCommon.input.base.channelMask);
    if (inputChannelCount == 1) {
        params.SourceFormat = LVM_MONO;
    } else if (inputChannelCount == 2) {
        params.SourceFormat = LVM_STEREO;
    } else if (inputChannelCount > 2 && inputChannelCount <= LVM_MAX_CHANNELS) {
        params.SourceFormat = LVM_MULTICHANNEL;
    }

    /* General parameters */
    params.OperatingMode = LVM_MODE_ON;
    params.SampleRate = LVM_FS_44100;
    params.SourceFormat = LVM_STEREO;
    params.SpeakerType = LVM_HEADPHONES;

    /* Concert Sound parameters */
@@ -657,13 +685,7 @@ void BundleContext::initControlParameter(LVM_ControlParams_t& params) const {
    params.PSA_Enable = LVM_PSA_OFF;
    params.PSA_PeakDecayRate = LVM_PSA_SPEED_MEDIUM;

    /* TE Control parameters */
    params.TE_OperatingMode = LVM_TE_OFF;
    params.TE_EffectLevel = 0;

    params.NrChannels = audio_channel_count_from_out_mask(AUDIO_CHANNEL_OUT_STEREO);
    params.ChMask = AUDIO_CHANNEL_OUT_STEREO;
    params.SourceFormat = LVM_STEREO;
    return RetCode::SUCCESS;
}

void BundleContext::initHeadroomParameter(LVM_HeadroomParams_t& params) const {
@@ -832,13 +854,13 @@ IEffect::Status BundleContext::lvmProcess(float* in, float* out, int samples) {
            LOG(DEBUG) << "Effect_process() processing last frame";
        }
        mNumberEffectsCalled = 0;
        LVM_UINT16 frames = samples * sizeof(float) / frameSize;
        float* outTmp = (accumulate ? getWorkBuffer() : out);
        /* Process the samples */
        LVM_ReturnStatus_en lvmStatus;
        {
            std::lock_guard lg(mMutex);
            lvmStatus = LVM_Process(mInstance, in, outTmp, frames, 0);

            lvmStatus = LVM_Process(mInstance, in, outTmp, inputFrameCount, 0);
            if (lvmStatus != LVM_SUCCESS) {
                LOG(ERROR) << __func__ << lvmStatus;
                return {EX_UNSUPPORTED_OPERATION, 0, 0};
+2 −13
Original line number Diff line number Diff line
@@ -41,15 +41,6 @@ class BundleContext final : public EffectContext {
    RetCode disable();
    RetCode disableOperatingMode();

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

    void setChannelMask(const aidl::android::media::audio::common::AudioChannelLayout& chMask) {
        mChMask = chMask;
    }
    aidl::android::media::audio::common::AudioChannelLayout getChannelMask() const {
        return mChMask;
    }
    bool isDeviceSupportedBassBoost(
            const std::vector<aidl::android::media::audio::common::AudioDeviceDescription>&
                    devices);
@@ -105,9 +96,7 @@ class BundleContext final : public EffectContext {
    LVM_Handle_t mInstance GUARDED_BY(mMutex);

    aidl::android::media::audio::common::AudioDeviceDescription mVirtualizerForcedDevice;
    aidl::android::media::audio::common::AudioChannelLayout mChMask;

    int mSampleRate = LVM_FS_44100;
    int mSamplesPerSecond = 0;
    int mSamplesToExitCountEq = 0;
    int mSamplesToExitCountBb = 0;
@@ -129,7 +118,7 @@ class BundleContext final : public EffectContext {
    int mBassStrengthSaved = 0;
    // Equalizer
    int mCurPresetIdx = lvm::PRESET_CUSTOM; /* Current preset being used */
    std::array<int, lvm::MAX_NUM_BANDS> mBandGainMdB; /* band gain in millibels */
    std::array<int, lvm::MAX_NUM_BANDS> mBandGainmB; /* band gain in millibels */
    // Virtualizer
    int mVirtStrengthSaved = 0; /* Conversion between Get/Set */
    bool mVirtualizerTempDisabled = false;
@@ -139,7 +128,7 @@ class BundleContext final : public EffectContext {
    float mVolume = 0;
    bool mMuteEnabled = false; /* Must store as mute = -96dB level */

    void initControlParameter(LVM_ControlParams_t& params) const;
    RetCode initControlParameter(LVM_ControlParams_t& params) const;
    void initHeadroomParameter(LVM_HeadroomParams_t& params) const;
    RetCode limitLevel();
    static float VolToDb(float vol);
+5 −0
Original line number Diff line number Diff line
@@ -118,10 +118,15 @@ cc_library_shared {
        "libhardware_headers",
    ],
    shared_libs: [
        "libaudio_aidl_conversion_common_ndk",
        "libaudioutils",
        "libbinder",
        "liblog",
        "libstagefright_foundation",
    ],
    cflags: [
        "-Wthread-safety",
        "-DBACKEND_NDK",
    ],
    relative_install_path: "soundfx",
    visibility: [