Add scale factor fields to HapticGenerator AIDL
Add support for haptic scale factors introduced to the HapticScale
parcelable defined at HapticGenerator.aidl.
Make sure the fields are forwarded to the os::HapticScale representation
to be used by ExternalVibratorUtils scaling function.
Bug: 356406324
Bug: 356406686
Flag: android.os.vibrator.haptics_scale_v2_enabled
Test: libvibrator_test
Change-Id: I310527f6a45f52e9dbe44090fc6102f3a69ebe23
diff --git a/media/libaudiohal/impl/effectsAidlConversion/AidlConversionHapticGenerator.cpp b/media/libaudiohal/impl/effectsAidlConversion/AidlConversionHapticGenerator.cpp
index bdee7b6..e87993a 100644
--- a/media/libaudiohal/impl/effectsAidlConversion/AidlConversionHapticGenerator.cpp
+++ b/media/libaudiohal/impl/effectsAidlConversion/AidlConversionHapticGenerator.cpp
@@ -52,12 +52,17 @@
switch (type) {
case HG_PARAM_HAPTIC_INTENSITY: {
int32_t id = 0, scale;
- if (OK != param.readFromValue(&id) || OK != param.readFromValue(&scale)) {
+ float scaleFactor, adaptiveScaleFactor;
+ if (OK != param.readFromValue(&id) || OK != param.readFromValue(&scale) ||
+ OK != param.readFromValue(&scaleFactor) ||
+ OK != param.readFromValue(&adaptiveScaleFactor)) {
ALOGE("%s invalid intensity %s", __func__, param.toString().c_str());
return BAD_VALUE;
}
- HapticGenerator::HapticScale hpScale(
- {.id = id, .scale = (HapticGenerator::VibratorScale)(scale)});
+ HapticGenerator::HapticScale hpScale({.id = id,
+ .scale = (HapticGenerator::VibratorScale)(scale),
+ .scaleFactor = scaleFactor,
+ .adaptiveScaleFactor = adaptiveScaleFactor});
aidlParam = MAKE_SPECIFIC_PARAMETER(HapticGenerator, hapticGenerator, hapticScales,
{hpScale});
break;
diff --git a/media/libeffects/hapticgenerator/EffectHapticGenerator.cpp b/media/libeffects/hapticgenerator/EffectHapticGenerator.cpp
index 0c7ea7f..258dca2 100644
--- a/media/libeffects/hapticgenerator/EffectHapticGenerator.cpp
+++ b/media/libeffects/hapticgenerator/EffectHapticGenerator.cpp
@@ -325,20 +325,25 @@
ALOGE("%s invalid haptic intensity param size %s", __func__, reader.toString().c_str());
return -EINVAL;
}
- int32_t paramId;
- os::HapticScale hapticScale;
- if (reader.readFromValue(¶mId) != OK || reader.readFromValue(&hapticScale) != OK) {
+ int32_t id, scaleLevel;
+ float scaleFactor, adaptiveScaleFactor;
+ if (reader.readFromValue(&id) != OK || reader.readFromValue(&scaleLevel) != OK ||
+ reader.readFromValue(&scaleFactor) != OK ||
+ reader.readFromValue(&adaptiveScaleFactor) != OK) {
ALOGE("%s error reading haptic intensity %s", __func__, reader.toString().c_str());
return -EINVAL;
}
+ os::HapticScale hapticScale(static_cast<os::HapticLevel>(scaleLevel), scaleFactor,
+ adaptiveScaleFactor);
ALOGD("Updating haptic scale, %s", hapticScale.toString().c_str());
if (hapticScale.isScaleMute()) {
- context->param.id2HapticScale.erase(paramId);
+ context->param.id2HapticScale.erase(id);
} else {
- context->param.id2HapticScale.emplace(paramId, hapticScale);
+ context->param.id2HapticScale.emplace(id, hapticScale);
}
context->param.maxHapticScale = hapticScale;
- for (const auto&[id, scale] : context->param.id2HapticScale) {
+ for (const auto&[_, scale] : context->param.id2HapticScale) {
+ // TODO(b/360314386): update to use new scale factors
if (scale.getLevel() > context->param.maxHapticScale.getLevel()) {
context->param.maxHapticScale = scale;
}
diff --git a/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp b/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp
index 6e9e216..535b886 100644
--- a/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp
+++ b/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.cpp
@@ -36,7 +36,7 @@
: EffectContext(statusDepth, common) {
mState = HAPTIC_GENERATOR_STATE_UNINITIALIZED;
- mParams.mMaxVibratorScale = HapticGenerator::VibratorScale::MUTE;
+ mParams.mMaxHapticScale = {.scale = HapticGenerator::VibratorScale::MUTE};
mParams.mVibratorInfo.resonantFrequencyHz = DEFAULT_RESONANT_FREQUENCY;
mParams.mVibratorInfo.qFactor = DEFAULT_BSF_ZERO_Q;
mParams.mVibratorInfo.maxAmplitude = 0.f;
@@ -87,13 +87,17 @@
RetCode HapticGeneratorContext::setHgHapticScales(
const std::vector<HapticGenerator::HapticScale>& hapticScales) {
for (auto hapticScale : hapticScales) {
- mParams.mHapticScales.insert_or_assign(hapticScale.id, hapticScale.scale);
+ mParams.mHapticScales.insert_or_assign(hapticScale.id, hapticScale);
}
- mParams.mMaxVibratorScale = HapticGenerator::VibratorScale::MUTE;
+ mParams.mMaxHapticScale = {.scale = HapticGenerator::VibratorScale::MUTE};
for (const auto& [id, vibratorScale] : mParams.mHapticScales) {
- mParams.mMaxVibratorScale = std::max(mParams.mMaxVibratorScale, vibratorScale);
+ // TODO(b/360314386): update to use new scale factors
+ if (vibratorScale.scale > mParams.mMaxHapticScale.scale) {
+ mParams.mMaxHapticScale = vibratorScale;
+ }
}
- LOG(INFO) << " HapticGenerator VibratorScale set to " << toString(mParams.mMaxVibratorScale);
+ LOG(INFO) << " HapticGenerator VibratorScale set to "
+ << toString(mParams.mMaxHapticScale.scale);
return RetCode::SUCCESS;
}
@@ -103,8 +107,8 @@
std::vector<HapticGenerator::HapticScale> HapticGeneratorContext::getHgHapticScales() const {
std::vector<HapticGenerator::HapticScale> result;
- for (const auto& [id, vibratorScale] : mParams.mHapticScales) {
- result.push_back({id, vibratorScale});
+ for (const auto& [_, hapticScale] : mParams.mHapticScales) {
+ result.push_back(hapticScale);
}
return result;
}
@@ -150,7 +154,7 @@
return status;
}
- if (mParams.mMaxVibratorScale == HapticGenerator::VibratorScale::MUTE) {
+ if (mParams.mMaxHapticScale.scale == HapticGenerator::VibratorScale::MUTE) {
// Haptic channels are muted, not need to generate haptic data.
return {STATUS_OK, samples, samples};
}
@@ -177,9 +181,10 @@
runProcessingChain(mInputBuffer.data(), mOutputBuffer.data(), mFrameCount);
::android::os::scaleHapticData(
hapticOutBuffer, hapticSampleCount,
- // TODO(b/356406686): add the new HapticScale fields to the AIDL interface.
::android::os::HapticScale(
- static_cast<::android::os::HapticLevel>(mParams.mMaxVibratorScale)),
+ static_cast<::android::os::HapticLevel>(mParams.mMaxHapticScale.scale),
+ mParams.mMaxHapticScale.scaleFactor,
+ mParams.mMaxHapticScale.adaptiveScaleFactor),
mParams.mVibratorInfo.maxAmplitude /* limit */);
// For haptic data, the haptic playback thread will copy the data from effect input
@@ -353,11 +358,12 @@
ss << "\t\t- mAudioChannelCount: " << param.mAudioChannelCount << '\n';
ss << "\t\t- mHapticChannelSource: " << param.mHapticChannelSource[0] << ", "
<< param.mHapticChannelSource[1] << '\n';
- ss << "\t\t- mMaxVibratorScale: " << ::android::internal::ToString(param.mMaxVibratorScale)
- << '\n';
+ ss << "\t\t- mMaxHapticScale: " << ::android::internal::ToString(param.mMaxHapticScale.scale)
+ << ", scaleFactor=" << param.mMaxHapticScale.scaleFactor
+ << ", adaptiveScaleFactor=" << param.mMaxHapticScale.adaptiveScaleFactor << '\n';
ss << "\t\t- mVibratorInfo: " << param.mVibratorInfo.toString() << '\n';
for (const auto& it : param.mHapticScales)
- ss << "\t\t\t" << it.first << ": " << toString(it.second) << '\n';
+ ss << "\t\t\t" << it.first << ": " << toString(it.second.scale) << '\n';
return ss.str();
}
diff --git a/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h b/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h
index cf38e47..37532f6 100644
--- a/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h
+++ b/media/libeffects/hapticgenerator/aidl/HapticGeneratorContext.h
@@ -41,9 +41,9 @@
int mHapticChannelCount;
int mAudioChannelCount;
- std::map<int, HapticGenerator::VibratorScale> mHapticScales;
+ std::map<int, HapticGenerator::HapticScale> mHapticScales;
// max intensity will be used to scale haptic data.
- HapticGenerator::VibratorScale mMaxVibratorScale;
+ HapticGenerator::HapticScale mMaxHapticScale;
HapticGenerator::VibratorInformation mVibratorInfo;
};
diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp
index ec8d135..6273570 100644
--- a/services/audioflinger/Effects.cpp
+++ b/services/audioflinger/Effects.cpp
@@ -1587,18 +1587,25 @@
return INVALID_OPERATION;
}
+ // Scale param fields
+ int32_t intensityParam = static_cast<int32_t>(HG_PARAM_HAPTIC_INTENSITY);
+ int32_t scaleLevel = static_cast<int32_t>(hapticScale.getLevel());
+ float scaleFactor = hapticScale.getScaleFactor();
+ float adaptiveScaleFactor = hapticScale.getAdaptiveScaleFactor();
+
size_t psize = sizeof(int32_t); // HG_PARAM_HAPTIC_INTENSITY
- size_t vsize = sizeof(int32_t) + sizeof(os::HapticScale); // id + hapticScale
+ size_t vsize = 2 * sizeof(int32_t) + 2 * sizeof(float); // id + scale fields
std::vector<uint8_t> request(sizeof(effect_param_t) + psize + vsize);
effect_param_t *effectParam = (effect_param_t*) request.data();
effectParam->psize = psize;
effectParam->vsize = vsize;
- int32_t intensityParam = static_cast<int32_t>(HG_PARAM_HAPTIC_INTENSITY);
EffectParamWriter writer(*effectParam);
writer.writeToParameter(&intensityParam);
writer.writeToValue(&id);
- writer.writeToValue(&hapticScale);
+ writer.writeToValue(&scaleLevel);
+ writer.writeToValue(&scaleFactor);
+ writer.writeToValue(&adaptiveScaleFactor);
writer.finishValueWrite();
std::vector<uint8_t> response;