Loading media/libeffects/hapticgenerator/Android.bp +28 −24 Original line number Diff line number Diff line Loading @@ -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", Loading @@ -29,7 +46,10 @@ cc_library_shared { srcs: [ "EffectHapticGenerator.cpp", "Processors.cpp", ], defaults: [ "hapticgeneratordefaults", ], cflags: [ Loading @@ -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", ], Loading media/libeffects/hapticgenerator/aidl/EffectHapticGenerator.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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: { Loading media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp +39 −17 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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}; Loading Loading @@ -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; Loading Loading @@ -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, Loading media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h +6 −6 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include <android-base/thread_annotations.h> #include <vibrator/ExternalVibrationUtils.h> #include <map> Loading Loading @@ -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); Loading @@ -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; Loading Loading
media/libeffects/hapticgenerator/Android.bp +28 −24 Original line number Diff line number Diff line Loading @@ -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", Loading @@ -29,7 +46,10 @@ cc_library_shared { srcs: [ "EffectHapticGenerator.cpp", "Processors.cpp", ], defaults: [ "hapticgeneratordefaults", ], cflags: [ Loading @@ -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", ], Loading
media/libeffects/hapticgenerator/aidl/EffectHapticGenerator.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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: { Loading
media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp +39 −17 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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}; Loading Loading @@ -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; Loading Loading @@ -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, Loading
media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h +6 −6 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include <android-base/thread_annotations.h> #include <vibrator/ExternalVibrationUtils.h> #include <map> Loading Loading @@ -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); Loading @@ -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; Loading