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

Commit ace86038 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Haptic Generator : Modify HapticScale param to be a list" am: 92a771e4 am: 0f52b114

parents 7911af74 0f52b114
Loading
Loading
Loading
Loading
+28 −24
Original line number Diff line number Diff line
@@ -22,6 +22,23 @@ package {
    default_applicable_licenses: ["frameworks_av_license"],
}

cc_defaults {
    name : "hapticgeneratordefaults",
    srcs: [
        "Processors.cpp",
    ],
    shared_libs: [
        "libaudioutils",
        "libbase",
        "liblog",
        "libutils",
        "libvibratorutils",
    ],
    header_libs: [
        "libaudioeffects",
    ],
}

cc_library_shared {
    name: "libhapticgenerator",

@@ -29,7 +46,10 @@ cc_library_shared {

    srcs: [
        "EffectHapticGenerator.cpp",
        "Processors.cpp",
    ],

    defaults: [
        "hapticgeneratordefaults",
    ],

    cflags: [
@@ -43,45 +63,29 @@ cc_library_shared {
        "-fvisibility=hidden",
    ],

    shared_libs: [
        "libaudioutils",
        "libbase",
        "liblog",
        "libutils",
        "libvibratorutils",
    ],

    relative_install_path: "soundfx",

    header_libs: [
        "libaudioeffects",
    ],
}

cc_library_shared {
    name: "libhapticgeneratoraidl",

    srcs: [
        "aidl/EffectHapticGenerator.cpp",
        "aidl/HapticGeneratorContext.cpp",
        "Processors.cpp",
        ":effectCommonFile",
    ],

    defaults: [
        "aidlaudioservice_defaults",
        "latest_android_hardware_audio_effect_ndk_shared",
        "latest_android_media_audio_common_types_ndk_shared",
        "hapticgeneratordefaults",
    ],
    header_libs: [
        "libaudioeffects",
        "libhardware_headers"
    ],
    shared_libs: [
        "libbase",
        "libaudioutils",
        "libcutils",
        "liblog",
        "libvibratorutils",

    cflags: [
        "-Wthread-safety",
    ],

    visibility: [
        "//hardware/interfaces/audio/aidl/default",
    ],
+4 −4
Original line number Diff line number Diff line
@@ -99,8 +99,8 @@ ndk::ScopedAStatus HapticGeneratorImpl::setParameterSpecific(const Parameter::Sp
    auto tag = hgParam.getTag();

    switch (tag) {
        case HapticGenerator::hapticScale: {
            RETURN_IF(mContext->setHgHapticScale(hgParam.get<HapticGenerator::hapticScale>()) !=
        case HapticGenerator::hapticScales: {
            RETURN_IF(mContext->setHgHapticScales(hgParam.get<HapticGenerator::hapticScales>()) !=
                              RetCode::SUCCESS,
                      EX_ILLEGAL_ARGUMENT, "setHapticScaleFailed");
            return ndk::ScopedAStatus::ok();
@@ -143,8 +143,8 @@ ndk::ScopedAStatus HapticGeneratorImpl::getParameterHapticGenerator(const Haptic

    HapticGenerator hgParam;
    switch (tag) {
        case HapticGenerator::hapticScale: {
            hgParam.set<HapticGenerator::hapticScale>(mContext->getHgHapticScale());
        case HapticGenerator::hapticScales: {
            hgParam.set<HapticGenerator::hapticScales>(mContext->getHgHapticScales());
            break;
        }
        case HapticGenerator::vibratorInfo: {
+39 −17
Original line number Diff line number Diff line
@@ -66,32 +66,51 @@ void HapticGeneratorContext::reset() {
    }
}

RetCode HapticGeneratorContext::setHgHapticScale(const HapticGenerator::HapticScale& hapticScale) {
    mParams.mHapticScale = hapticScale;
    if (hapticScale.scale == HapticGenerator::VibratorScale::MUTE) {
        mParams.mHapticScales.erase(hapticScale.id);
    } else {
        mParams.mHapticScales.emplace(hapticScale.id, hapticScale.scale);
RetCode HapticGeneratorContext::setHgHapticScales(
        const std::vector<HapticGenerator::HapticScale> hapticScales) {
    std::lock_guard lg(mMutex);
    for (auto hapticScale : hapticScales) {
        mParams.mHapticScales.insert_or_assign(hapticScale.id, hapticScale.scale);
    }
    mParams.mMaxVibratorScale = hapticScale.scale;
    mParams.mMaxVibratorScale = HapticGenerator::VibratorScale::MUTE;
    for (const auto& [id, vibratorScale] : mParams.mHapticScales) {
        mParams.mMaxVibratorScale = std::max(mParams.mMaxVibratorScale, vibratorScale);
    }
    return RetCode::SUCCESS;
}

HapticGenerator::VibratorInformation HapticGeneratorContext::getHgVibratorInformation() {
    std::lock_guard lg(mMutex);
    return mParams.mVibratorInfo;
}

std::vector<HapticGenerator::HapticScale> HapticGeneratorContext::getHgHapticScales() {
    std::vector<HapticGenerator::HapticScale> result;
    std::lock_guard lg(mMutex);
    for (const auto& [id, vibratorScale] : mParams.mHapticScales) {
        result.push_back({id, vibratorScale});
    }
    return result;
}

RetCode HapticGeneratorContext::setHgVibratorInformation(
        const HapticGenerator::VibratorInformation& vibratorInfo) {
    {
        std::lock_guard lg(mMutex);
        mParams.mVibratorInfo = vibratorInfo;

        if (mProcessorsRecord.bpf != nullptr) {
        mProcessorsRecord.bpf->setCoefficients(::android::audio_effect::haptic_generator::bpfCoefs(
            mProcessorsRecord.bpf->setCoefficients(
                    ::android::audio_effect::haptic_generator::bpfCoefs(
                            mParams.mVibratorInfo.resonantFrequencyHz, DEFAULT_BPF_Q, mSampleRate));
        }
        if (mProcessorsRecord.bsf != nullptr) {
        mProcessorsRecord.bsf->setCoefficients(::android::audio_effect::haptic_generator::bsfCoefs(
                mParams.mVibratorInfo.resonantFrequencyHz, mParams.mVibratorInfo.qFactor,
                mParams.mVibratorInfo.qFactor / 2.0f, mSampleRate));
            mProcessorsRecord.bsf->setCoefficients(
                    ::android::audio_effect::haptic_generator::bsfCoefs(
                            mParams.mVibratorInfo.resonantFrequencyHz,
                            mParams.mVibratorInfo.qFactor, mParams.mVibratorInfo.qFactor / 2.0f,
                            mSampleRate));
        }
    }
    configure();
    return RetCode::SUCCESS;
@@ -126,6 +145,7 @@ IEffect::Status HapticGeneratorContext::lvmProcess(float* in, float* out, int sa
        return status;
    }

    std::lock_guard lg(mMutex);
    if (mParams.mMaxVibratorScale == HapticGenerator::VibratorScale::MUTE) {
        // Haptic channels are muted, not need to generate haptic data.
        return {STATUS_OK, samples, samples};
@@ -168,6 +188,7 @@ IEffect::Status HapticGeneratorContext::lvmProcess(float* in, float* out, int sa

void HapticGeneratorContext::init_params(media::audio::common::AudioChannelLayout inputChMask,
                                         media::audio::common::AudioChannelLayout outputChMask) {
    std::lock_guard lg(mMutex);
    mParams.mMaxVibratorScale = HapticGenerator::VibratorScale::MUTE;
    mParams.mVibratorInfo.resonantFrequencyHz = DEFAULT_RESONANT_FREQUENCY;
    mParams.mVibratorInfo.qFactor = DEFAULT_BSF_ZERO_Q;
@@ -215,6 +236,7 @@ void HapticGeneratorContext::addBiquadFilter(std::shared_ptr<HapticBiquadFilter>
 * Build haptic generator processing chain.
 */
void HapticGeneratorContext::buildProcessingChain() {
    std::lock_guard lg(mMutex);
    const size_t channelCount = mParams.mHapticChannelCount;
    float highPassCornerFrequency = 50.0f;
    auto hpf = ::android::audio_effect::haptic_generator::createHPF2(highPassCornerFrequency,
+6 −6
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#pragma once

#include <android-base/thread_annotations.h>
#include <vibrator/ExternalVibrationUtils.h>
#include <map>

@@ -68,13 +69,11 @@ class HapticGeneratorContext final : public EffectContext {
    RetCode disable();
    void reset();

    RetCode setHgHapticScale(const HapticGenerator::HapticScale& hapticScale);
    HapticGenerator::HapticScale getHgHapticScale() const { return mParams.mHapticScale; }
    RetCode setHgHapticScales(const std::vector<HapticGenerator::HapticScale> hapticScales);
    std::vector<HapticGenerator::HapticScale> getHgHapticScales();

    RetCode setHgVibratorInformation(const HapticGenerator::VibratorInformation& vibratorInfo);
    HapticGenerator::VibratorInformation getHgVibratorInformation() const {
        return mParams.mVibratorInfo;
    }
    HapticGenerator::VibratorInformation getHgVibratorInformation();

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

@@ -89,8 +88,9 @@ class HapticGeneratorContext final : public EffectContext {
    static constexpr float DEFAULT_DISTORTION_INPUT_GAIN = 0.3f;
    static constexpr float DEFAULT_DISTORTION_CUBE_THRESHOLD = 0.1f;

    std::mutex mMutex;
    HapticGeneratorState mState;
    HapticGeneratorParam mParams;
    HapticGeneratorParam mParams GUARDED_BY(mMutex);
    int mSampleRate;
    int mFrameCount = 0;