blob: 3d8dd9cb5bb23b06fe0f2d29e9559416c94f8190 [file] [log] [blame]
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <android_os_vibrator.h>
#include <flag_macros.h>
#include <gtest/gtest.h>
#include <vibrator/ExternalVibrationUtils.h>
#include "test_utils.h"
#define FLAG_NS android::os::vibrator
using namespace android;
using namespace testing;
using HapticScale = os::HapticScale;
using HapticLevel = os::HapticLevel;
static constexpr float TEST_TOLERANCE = 1e-2f;
static constexpr size_t TEST_BUFFER_LENGTH = 4;
static float TEST_BUFFER[TEST_BUFFER_LENGTH] = { 1, -1, 0.5f, -0.2f };
class ExternalVibrationUtilsTest : public Test {
public:
void SetUp() override {
std::copy(std::begin(TEST_BUFFER), std::end(TEST_BUFFER), std::begin(mBuffer));
}
protected:
void scaleBuffer(HapticLevel hapticLevel) {
scaleBuffer(HapticScale(hapticLevel), 0 /* limit */);
}
void scaleBuffer(HapticLevel hapticLevel, float adaptiveScaleFactor) {
scaleBuffer(hapticLevel, adaptiveScaleFactor, 0 /* limit */);
}
void scaleBuffer(HapticLevel hapticLevel, float adaptiveScaleFactor, float limit) {
scaleBuffer(HapticScale(hapticLevel, adaptiveScaleFactor), limit);
}
void scaleBuffer(HapticScale hapticScale, float limit) {
std::copy(std::begin(TEST_BUFFER), std::end(TEST_BUFFER), std::begin(mBuffer));
os::scaleHapticData(&mBuffer[0], TEST_BUFFER_LENGTH, hapticScale, limit);
}
float mBuffer[TEST_BUFFER_LENGTH];
};
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestLegacyScaleMute,
REQUIRES_FLAGS_DISABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
float expected[TEST_BUFFER_LENGTH];
std::fill(std::begin(expected), std::end(expected), 0);
scaleBuffer(HapticLevel::MUTE);
EXPECT_FLOATS_NEARLY_EQ(expected, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestFixedScaleMute,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
float expected[TEST_BUFFER_LENGTH];
std::fill(std::begin(expected), std::end(expected), 0);
scaleBuffer(HapticLevel::MUTE);
EXPECT_FLOATS_NEARLY_EQ(expected, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestLegacyScaleNone,
REQUIRES_FLAGS_DISABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
float expected[TEST_BUFFER_LENGTH];
std::copy(std::begin(TEST_BUFFER), std::end(TEST_BUFFER), std::begin(expected));
scaleBuffer(HapticLevel::NONE);
EXPECT_FLOATS_NEARLY_EQ(expected, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestFixedScaleNone,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
float expected[TEST_BUFFER_LENGTH];
std::copy(std::begin(TEST_BUFFER), std::end(TEST_BUFFER), std::begin(expected));
scaleBuffer(HapticLevel::NONE);
EXPECT_FLOATS_NEARLY_EQ(expected, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestLegacyScaleToHapticLevel,
REQUIRES_FLAGS_DISABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
float expectedVeryHigh[TEST_BUFFER_LENGTH] = { 1, -1, 0.84f, -0.66f };
scaleBuffer(HapticLevel::VERY_HIGH);
EXPECT_FLOATS_NEARLY_EQ(expectedVeryHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
float expectedHigh[TEST_BUFFER_LENGTH] = { 1, -1, 0.7f, -0.44f };
scaleBuffer(HapticLevel::HIGH);
EXPECT_FLOATS_NEARLY_EQ(expectedHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
float expectedLow[TEST_BUFFER_LENGTH] = { 0.75f, -0.75f, 0.26f, -0.06f };
scaleBuffer(HapticLevel::LOW);
EXPECT_FLOATS_NEARLY_EQ(expectedLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
float expectedVeryLow[TEST_BUFFER_LENGTH] = { 0.66f, -0.66f, 0.16f, -0.02f };
scaleBuffer(HapticLevel::VERY_LOW);
EXPECT_FLOATS_NEARLY_EQ(expectedVeryLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestFixedScaleToHapticLevel,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
float expectedVeryHigh[TEST_BUFFER_LENGTH] = { 1, -1, 0.79f, -0.39f };
scaleBuffer(HapticLevel::VERY_HIGH);
EXPECT_FLOATS_NEARLY_EQ(expectedVeryHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
float expectedHigh[TEST_BUFFER_LENGTH] = { 1, -1, 0.62f, -0.27f };
scaleBuffer(HapticLevel::HIGH);
EXPECT_FLOATS_NEARLY_EQ(expectedHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
float expectedLow[TEST_BUFFER_LENGTH] = { 0.70f, -0.70f, 0.35f, -0.14f };
scaleBuffer(HapticLevel::LOW);
EXPECT_FLOATS_NEARLY_EQ(expectedLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
float expectedVeryLow[TEST_BUFFER_LENGTH] = { 0.45f, -0.45f, 0.22f, -0.09f };
scaleBuffer(HapticLevel::VERY_LOW);
EXPECT_FLOATS_NEARLY_EQ(expectedVeryLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestAdaptiveScaleFactorAppliedAfterLegacyScale,
REQUIRES_FLAGS_DISABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
// Haptic level scale up then adaptive scale down
float expectedVeryHigh[TEST_BUFFER_LENGTH] = { 0.2, -0.2, 0.16f, -0.13f };
scaleBuffer(HapticLevel::VERY_HIGH, 0.2f /* adaptiveScaleFactor */);
EXPECT_FLOATS_NEARLY_EQ(expectedVeryHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
// Haptic level scale up then adaptive scale up
float expectedHigh[TEST_BUFFER_LENGTH] = { 1.5f, -1.5f, 1.06f, -0.67f };
scaleBuffer(HapticLevel::HIGH, 1.5f /* adaptiveScaleFactor */);
EXPECT_FLOATS_NEARLY_EQ(expectedHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
// Haptic level scale down then adaptive scale down
float expectedLow[TEST_BUFFER_LENGTH] = { 0.45f, -0.45f, 0.15f, -0.04f };
scaleBuffer(HapticLevel::LOW, 0.6f /* adaptiveScaleFactor */);
EXPECT_FLOATS_NEARLY_EQ(expectedLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
// Haptic level scale down then adaptive scale up
float expectedVeryLow[TEST_BUFFER_LENGTH] = { 1.33f, -1.33f, 0.33f, -0.05f };
scaleBuffer(HapticLevel::VERY_LOW, 2 /* adaptiveScaleFactor */);
EXPECT_FLOATS_NEARLY_EQ(expectedVeryLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestAdaptiveScaleFactorAppliedAfterFixedScale,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
// Haptic level scale up then adaptive scale down
float expectedVeryHigh[TEST_BUFFER_LENGTH] = { 0.2, -0.2, 0.16f, -0.07f };
scaleBuffer(HapticLevel::VERY_HIGH, 0.2f /* adaptiveScaleFactor */);
EXPECT_FLOATS_NEARLY_EQ(expectedVeryHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
// Haptic level scale up then adaptive scale up
float expectedHigh[TEST_BUFFER_LENGTH] = { 1.5f, -1.5f, 0.93f, -0.41f };
scaleBuffer(HapticLevel::HIGH, 1.5f /* adaptiveScaleFactor */);
EXPECT_FLOATS_NEARLY_EQ(expectedHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
// Haptic level scale down then adaptive scale down
float expectedLow[TEST_BUFFER_LENGTH] = { 0.42f, -0.42f, 0.21f, -0.08f };
scaleBuffer(HapticLevel::LOW, 0.6f /* adaptiveScaleFactor */);
EXPECT_FLOATS_NEARLY_EQ(expectedLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
// Haptic level scale down then adaptive scale up
float expectedVeryLow[TEST_BUFFER_LENGTH] = { 0.91f, -0.91f, 0.45f, -0.18f };
scaleBuffer(HapticLevel::VERY_LOW, 2 /* adaptiveScaleFactor */);
EXPECT_FLOATS_NEARLY_EQ(expectedVeryLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestLimitAppliedAfterLegacyScale,
REQUIRES_FLAGS_DISABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
// Scaled = { 0.2, -0.2, 0.16f, -0.13f };
float expectedClippedVeryHigh[TEST_BUFFER_LENGTH] = { 0.15f, -0.15f, 0.15f, -0.13f };
scaleBuffer(HapticLevel::VERY_HIGH, 0.2f /* adaptiveScaleFactor */, 0.15f /* limit */);
EXPECT_FLOATS_NEARLY_EQ(expectedClippedVeryHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
// Scaled = { 1, -1, 0.5f, -0.2f };
float expectedClippedVeryLow[TEST_BUFFER_LENGTH] = { 0.7f, -0.7f, 0.33f, -0.05f };
scaleBuffer(HapticLevel::VERY_LOW, 2 /* adaptiveScaleFactor */, 0.7f /* limit */);
EXPECT_FLOATS_NEARLY_EQ(expectedClippedVeryLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}
TEST_F_WITH_FLAGS(
ExternalVibrationUtilsTest,
TestLimitAppliedAfterFixedScale,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(FLAG_NS, fix_audio_coupled_haptics_scaling))
) {
// Scaled = { 0.2, -0.2, 0.16f, -0.13f };
float expectedClippedVeryHigh[TEST_BUFFER_LENGTH] = { 0.15f, -0.15f, 0.15f, -0.07f };
scaleBuffer(HapticLevel::VERY_HIGH, 0.2f /* adaptiveScaleFactor */, 0.15f /* limit */);
EXPECT_FLOATS_NEARLY_EQ(expectedClippedVeryHigh, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
// Scaled = { 1, -1, 0.5f, -0.2f };
float expectedClippedVeryLow[TEST_BUFFER_LENGTH] = { 0.7f, -0.7f, 0.45f, -0.18f };
scaleBuffer(HapticLevel::VERY_LOW, 2 /* adaptiveScaleFactor */, 0.7f /* limit */);
EXPECT_FLOATS_NEARLY_EQ(expectedClippedVeryLow, mBuffer, TEST_BUFFER_LENGTH, TEST_TOLERANCE);
}