Merge "Haptic Generator : Modify HapticScale param to be a list" am: 92a771e454 am: 0f52b1144e am: ace86038c0
Original change: https://android-review.googlesource.com/c/platform/frameworks/av/+/2366809
Change-Id: I1c67d9921ec56a516af506c7d5c2fb31cba7fcdd
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/media/libeffects/hapticgenerator/Android.bp b/media/libeffects/hapticgenerator/Android.bp
index 02a94d1..07ba492 100644
--- a/media/libeffects/hapticgenerator/Android.bp
+++ b/media/libeffects/hapticgenerator/Android.bp
@@ -22,6 +22,23 @@
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 @@
srcs: [
"EffectHapticGenerator.cpp",
- "Processors.cpp",
+ ],
+
+ defaults: [
+ "hapticgeneratordefaults",
],
cflags: [
@@ -43,45 +63,29 @@
"-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"
+
+ cflags: [
+ "-Wthread-safety",
],
- shared_libs: [
- "libbase",
- "libaudioutils",
- "libcutils",
- "liblog",
- "libvibratorutils",
- ],
+
visibility: [
"//hardware/interfaces/audio/aidl/default",
],
diff --git a/media/libeffects/hapticgenerator/aidl/EffectHapticGenerator.cpp b/media/libeffects/hapticgenerator/aidl/EffectHapticGenerator.cpp
index 16fc230..7e22482 100644
--- a/media/libeffects/hapticgenerator/aidl/EffectHapticGenerator.cpp
+++ b/media/libeffects/hapticgenerator/aidl/EffectHapticGenerator.cpp
@@ -99,8 +99,8 @@
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 @@
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: {
diff --git a/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp b/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp
index 5a32dc2..64f51c3 100644
--- a/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp
+++ b/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp
@@ -66,32 +66,51 @@
}
}
-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) {
- mParams.mVibratorInfo = vibratorInfo;
+ {
+ std::lock_guard lg(mMutex);
+ mParams.mVibratorInfo = vibratorInfo;
- if (mProcessorsRecord.bpf != nullptr) {
- 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));
+ if (mProcessorsRecord.bpf != nullptr) {
+ 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));
+ }
}
configure();
return RetCode::SUCCESS;
@@ -126,6 +145,7 @@
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 @@
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 @@
* 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,
diff --git a/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h b/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h
index f16e2a4..dc43feb 100644
--- a/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h
+++ b/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h
@@ -16,6 +16,7 @@
#pragma once
+#include <android-base/thread_annotations.h>
#include <vibrator/ExternalVibrationUtils.h>
#include <map>
@@ -68,13 +69,11 @@
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 @@
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;