Merge "Add limit parameter to be applied to scaled audio haptic data" into sc-v2-dev am: 16d588f4df
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/15186130
Change-Id: I5d2fca79761487ccae6e491b53ce98e029cc68ba
diff --git a/libs/vibrator/ExternalVibrationUtils.cpp b/libs/vibrator/ExternalVibrationUtils.cpp
index 749c568..980b08b 100644
--- a/libs/vibrator/ExternalVibrationUtils.cpp
+++ b/libs/vibrator/ExternalVibrationUtils.cpp
@@ -56,6 +56,36 @@
}
}
+void applyHapticScale(float* buffer, size_t length, HapticScale scale) {
+ if (scale == HapticScale::MUTE) {
+ memset(buffer, 0, length * sizeof(float));
+ return;
+ }
+ if (scale == HapticScale::NONE) {
+ return;
+ }
+ float gamma = getHapticScaleGamma(scale);
+ float maxAmplitudeRatio = getHapticMaxAmplitudeRatio(scale);
+ for (size_t i = 0; i < length; i++) {
+ float sign = buffer[i] >= 0 ? 1.0 : -1.0;
+ buffer[i] = powf(fabsf(buffer[i] / HAPTIC_MAX_AMPLITUDE_FLOAT), gamma)
+ * maxAmplitudeRatio * HAPTIC_MAX_AMPLITUDE_FLOAT * sign;
+ }
+}
+
+void clipHapticData(float* buffer, size_t length, float limit) {
+ if (isnan(limit) || limit == 0) {
+ return;
+ }
+ limit = fabsf(limit);
+ for (size_t i = 0; i < length; i++) {
+ float sign = buffer[i] >= 0 ? 1.0 : -1.0;
+ if (fabsf(buffer[i]) > limit) {
+ buffer[i] = limit * sign;
+ }
+ }
+}
+
} // namespace
bool isValidHapticScale(HapticScale scale) {
@@ -71,21 +101,11 @@
return false;
}
-void scaleHapticData(float* buffer, size_t length, HapticScale scale) {
- if (!isValidHapticScale(scale) || scale == HapticScale::NONE) {
- return;
+void scaleHapticData(float* buffer, size_t length, HapticScale scale, float limit) {
+ if (isValidHapticScale(scale)) {
+ applyHapticScale(buffer, length, scale);
}
- if (scale == HapticScale::MUTE) {
- memset(buffer, 0, length * sizeof(float));
- return;
- }
- float gamma = getHapticScaleGamma(scale);
- float maxAmplitudeRatio = getHapticMaxAmplitudeRatio(scale);
- for (size_t i = 0; i < length; i++) {
- float sign = buffer[i] >= 0 ? 1.0 : -1.0;
- buffer[i] = powf(fabsf(buffer[i] / HAPTIC_MAX_AMPLITUDE_FLOAT), gamma)
- * maxAmplitudeRatio * HAPTIC_MAX_AMPLITUDE_FLOAT * sign;
- }
+ clipHapticData(buffer, length, limit);
}
} // namespace android::os
diff --git a/libs/vibrator/include/vibrator/ExternalVibrationUtils.h b/libs/vibrator/include/vibrator/ExternalVibrationUtils.h
index 20045d0..84357fc 100644
--- a/libs/vibrator/include/vibrator/ExternalVibrationUtils.h
+++ b/libs/vibrator/include/vibrator/ExternalVibrationUtils.h
@@ -32,7 +32,11 @@
bool isValidHapticScale(HapticScale scale);
-void scaleHapticData(float* buffer, size_t length, HapticScale scale);
+/* Scales the haptic data in given buffer using the selected HapticScale and ensuring no absolute
+ * value will be larger than the absolute of given limit.
+ * The limit will be ignored if it is NaN or zero.
+ */
+void scaleHapticData(float* buffer, size_t length, HapticScale scale, float limit);
} // namespace android::os