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

Commit c5f2ca78 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Audio : Add Remote Submix as supported device for effects" into main

parents 19420515 7471478d
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: [