@@ -26,50 +26,59 @@ static constexpr float HAPTIC_SCALE_VERY_LOW_RATIO = 2.0f / 3.0f;
2626static constexpr float HAPTIC_SCALE_LOW_RATIO = 3 .0f / 4 .0f ;
2727static constexpr float HAPTIC_MAX_AMPLITUDE_FLOAT = 1 .0f ;
2828
29- float getHapticScaleGamma (HapticScale scale ) {
30- switch (scale ) {
31- case HapticScale ::VERY_LOW:
29+ float getHapticScaleGamma (HapticLevel level ) {
30+ switch (level ) {
31+ case HapticLevel ::VERY_LOW:
3232 return 2 .0f ;
33- case HapticScale ::LOW:
33+ case HapticLevel ::LOW:
3434 return 1 .5f ;
35- case HapticScale ::HIGH:
35+ case HapticLevel ::HIGH:
3636 return 0 .5f ;
37- case HapticScale ::VERY_HIGH:
37+ case HapticLevel ::VERY_HIGH:
3838 return 0 .25f ;
3939 default :
4040 return 1 .0f ;
4141 }
4242}
4343
44- float getHapticMaxAmplitudeRatio (HapticScale scale ) {
45- switch (scale ) {
46- case HapticScale ::VERY_LOW:
44+ float getHapticMaxAmplitudeRatio (HapticLevel level ) {
45+ switch (level ) {
46+ case HapticLevel ::VERY_LOW:
4747 return HAPTIC_SCALE_VERY_LOW_RATIO;
48- case HapticScale ::LOW:
48+ case HapticLevel ::LOW:
4949 return HAPTIC_SCALE_LOW_RATIO;
50- case HapticScale ::NONE:
51- case HapticScale ::HIGH:
52- case HapticScale ::VERY_HIGH:
50+ case HapticLevel ::NONE:
51+ case HapticLevel ::HIGH:
52+ case HapticLevel ::VERY_HIGH:
5353 return 1 .0f ;
5454 default :
5555 return 0 .0f ;
5656 }
5757}
5858
5959void applyHapticScale (float * buffer, size_t length, HapticScale scale) {
60- if (scale == HapticScale::MUTE ) {
60+ if (scale. isScaleMute () ) {
6161 memset (buffer, 0 , length * sizeof (float ));
6262 return ;
6363 }
64- if (scale == HapticScale::NONE ) {
64+ if (scale. isScaleNone () ) {
6565 return ;
6666 }
67- float gamma = getHapticScaleGamma (scale);
68- float maxAmplitudeRatio = getHapticMaxAmplitudeRatio (scale);
67+ HapticLevel hapticLevel = scale.getLevel ();
68+ float adaptiveScaleFactor = scale.getAdaptiveScaleFactor ();
69+ float gamma = getHapticScaleGamma (hapticLevel);
70+ float maxAmplitudeRatio = getHapticMaxAmplitudeRatio (hapticLevel);
71+
6972 for (size_t i = 0 ; i < length; i++) {
70- float sign = buffer[i] >= 0 ? 1.0 : -1.0 ;
71- buffer[i] = powf (fabsf (buffer[i] / HAPTIC_MAX_AMPLITUDE_FLOAT), gamma)
72- * maxAmplitudeRatio * HAPTIC_MAX_AMPLITUDE_FLOAT * sign;
73+ if (hapticLevel != HapticLevel::NONE) {
74+ float sign = buffer[i] >= 0 ? 1.0 : -1.0 ;
75+ buffer[i] = powf (fabsf (buffer[i] / HAPTIC_MAX_AMPLITUDE_FLOAT), gamma)
76+ * maxAmplitudeRatio * HAPTIC_MAX_AMPLITUDE_FLOAT * sign;
77+ }
78+
79+ if (adaptiveScaleFactor != 1 .0f ) {
80+ buffer[i] *= adaptiveScaleFactor;
81+ }
7382 }
7483}
7584
@@ -89,13 +98,13 @@ void clipHapticData(float* buffer, size_t length, float limit) {
8998} // namespace
9099
91100bool isValidHapticScale (HapticScale scale) {
92- switch (scale) {
93- case HapticScale ::MUTE:
94- case HapticScale ::VERY_LOW:
95- case HapticScale ::LOW:
96- case HapticScale ::NONE:
97- case HapticScale ::HIGH:
98- case HapticScale ::VERY_HIGH:
101+ switch (scale. getLevel () ) {
102+ case HapticLevel ::MUTE:
103+ case HapticLevel ::VERY_LOW:
104+ case HapticLevel ::LOW:
105+ case HapticLevel ::NONE:
106+ case HapticLevel ::HIGH:
107+ case HapticLevel ::VERY_HIGH:
99108 return true ;
100109 }
101110 return false ;
0 commit comments