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

Commit 28fbbc02 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:...

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

Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/2366809



Change-Id: I1c67d9921ec56a516af506c7d5c2fb31cba7fcdd
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents ed624a78 ace86038
Loading
Loading
Loading
Loading
+28 −24
Original line number Original line Diff line number Diff line
@@ -22,6 +22,23 @@ package {
    default_applicable_licenses: ["frameworks_av_license"],
    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 {
cc_library_shared {
    name: "libhapticgenerator",
    name: "libhapticgenerator",


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


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

    defaults: [
        "hapticgeneratordefaults",
    ],
    ],


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


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

    relative_install_path: "soundfx",
    relative_install_path: "soundfx",

    header_libs: [
        "libaudioeffects",
    ],
}
}


cc_library_shared {
cc_library_shared {
    name: "libhapticgeneratoraidl",
    name: "libhapticgeneratoraidl",

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

    defaults: [
    defaults: [
        "aidlaudioservice_defaults",
        "aidlaudioservice_defaults",
        "latest_android_hardware_audio_effect_ndk_shared",
        "latest_android_hardware_audio_effect_ndk_shared",
        "latest_android_media_audio_common_types_ndk_shared",
        "latest_android_media_audio_common_types_ndk_shared",
        "hapticgeneratordefaults",
    ],
    ],
    header_libs: [

        "libaudioeffects",
    cflags: [
        "libhardware_headers"
        "-Wthread-safety",
    ],
    shared_libs: [
        "libbase",
        "libaudioutils",
        "libcutils",
        "liblog",
        "libvibratorutils",
    ],
    ],

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


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


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


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


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


    std::lock_guard lg(mMutex);
    if (mParams.mMaxVibratorScale == HapticGenerator::VibratorScale::MUTE) {
    if (mParams.mMaxVibratorScale == HapticGenerator::VibratorScale::MUTE) {
        // Haptic channels are muted, not need to generate haptic data.
        // Haptic channels are muted, not need to generate haptic data.
        return {STATUS_OK, samples, samples};
        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,
void HapticGeneratorContext::init_params(media::audio::common::AudioChannelLayout inputChMask,
                                         media::audio::common::AudioChannelLayout outputChMask) {
                                         media::audio::common::AudioChannelLayout outputChMask) {
    std::lock_guard lg(mMutex);
    mParams.mMaxVibratorScale = HapticGenerator::VibratorScale::MUTE;
    mParams.mMaxVibratorScale = HapticGenerator::VibratorScale::MUTE;
    mParams.mVibratorInfo.resonantFrequencyHz = DEFAULT_RESONANT_FREQUENCY;
    mParams.mVibratorInfo.resonantFrequencyHz = DEFAULT_RESONANT_FREQUENCY;
    mParams.mVibratorInfo.qFactor = DEFAULT_BSF_ZERO_Q;
    mParams.mVibratorInfo.qFactor = DEFAULT_BSF_ZERO_Q;
@@ -215,6 +236,7 @@ void HapticGeneratorContext::addBiquadFilter(std::shared_ptr<HapticBiquadFilter>
 * Build haptic generator processing chain.
 * Build haptic generator processing chain.
 */
 */
void HapticGeneratorContext::buildProcessingChain() {
void HapticGeneratorContext::buildProcessingChain() {
    std::lock_guard lg(mMutex);
    const size_t channelCount = mParams.mHapticChannelCount;
    const size_t channelCount = mParams.mHapticChannelCount;
    float highPassCornerFrequency = 50.0f;
    float highPassCornerFrequency = 50.0f;
    auto hpf = ::android::audio_effect::haptic_generator::createHPF2(highPassCornerFrequency,
    auto hpf = ::android::audio_effect::haptic_generator::createHPF2(highPassCornerFrequency,
+6 −6
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


#pragma once
#pragma once


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


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


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


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


    IEffect::Status lvmProcess(float* in, float* out, int samples);
    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_INPUT_GAIN = 0.3f;
    static constexpr float DEFAULT_DISTORTION_CUBE_THRESHOLD = 0.1f;
    static constexpr float DEFAULT_DISTORTION_CUBE_THRESHOLD = 0.1f;


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