From 9eb548c0eea59390bdb9b76710c04ac1ae8c458e Mon Sep 17 00:00:00 2001 From: Aayush Soni Date: Tue, 22 Oct 2024 13:07:47 +0000 Subject: [PATCH] VisualizerTest: Improve testing for visualizer effect parameters Add tests for NORMALIZED and AS_PLAYED scaling mode parameters Bug: 305866207 Test: atest VtsHalVisualizerTargetTest Change-Id: If6fd9f552a1b1aa6193699d8e14685389c012832 --- audio/aidl/vts/Android.bp | 3 + audio/aidl/vts/EffectHelper.h | 11 +- audio/aidl/vts/VtsHalVisualizerTargetTest.cpp | 127 ++++++++++++++++-- 3 files changed, 127 insertions(+), 14 deletions(-) diff --git a/audio/aidl/vts/Android.bp b/audio/aidl/vts/Android.bp index cbd42c0610..467ad62fe3 100644 --- a/audio/aidl/vts/Android.bp +++ b/audio/aidl/vts/Android.bp @@ -166,6 +166,9 @@ cc_test { name: "VtsHalVisualizerTargetTest", defaults: ["VtsHalAudioEffectTargetTestDefaults"], srcs: ["VtsHalVisualizerTargetTest.cpp"], + shared_libs: [ + "libaudioutils", + ], } cc_test { diff --git a/audio/aidl/vts/EffectHelper.h b/audio/aidl/vts/EffectHelper.h index d71697520b..570eceffcb 100644 --- a/audio/aidl/vts/EffectHelper.h +++ b/audio/aidl/vts/EffectHelper.h @@ -375,7 +375,8 @@ class EffectHelper { std::vector& outputBuffer, const std::shared_ptr& effect, IEffect::OpenEffectReturn* openEffectReturn, - int version = -1, int times = 1) { + int version = -1, int times = 1, + bool callStopReset = true) { // Initialize AidlMessagequeues auto statusMQ = std::make_unique(openEffectReturn->statusMQ); ASSERT_TRUE(statusMQ->isValid()); @@ -401,10 +402,14 @@ class EffectHelper { } // Disable the process - ASSERT_NO_FATAL_FAILURE(command(effect, CommandId::STOP)); + if (callStopReset) { + ASSERT_NO_FATAL_FAILURE(command(effect, CommandId::STOP)); + } EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, outputBuffer)); - ASSERT_NO_FATAL_FAILURE(command(effect, CommandId::RESET)); + if (callStopReset) { + ASSERT_NO_FATAL_FAILURE(command(effect, CommandId::RESET)); + } } // Find FFT bin indices for testFrequencies and get bin center frequencies diff --git a/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp b/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp index a0e43bc37e..a9425213ee 100644 --- a/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp +++ b/audio/aidl/vts/VtsHalVisualizerTargetTest.cpp @@ -19,6 +19,7 @@ #define LOG_TAG "VtsHalVisualizerTest" #include #include +#include #include "EffectHelper.h" @@ -44,9 +45,8 @@ enum ParamName { PARAM_MEASUREMENT_MODE, PARAM_LATENCY, }; -using VisualizerParamTestParam = - std::tuple, Descriptor>, int, Visualizer::ScalingMode, - Visualizer::MeasurementMode, int>; +using VisualizerTestParam = std::tuple, Descriptor>, int, + Visualizer::ScalingMode, Visualizer::MeasurementMode, int>; class VisualizerTestHelper : public EffectHelper { public: @@ -139,10 +139,15 @@ class VisualizerTestHelper : public EffectHelper { {Visualizer::latencyMs, Visualizer::make(latency)}); } + static std::unordered_set getScalingModeValues() { + return {ndk::enum_range().begin(), + ndk::enum_range().end()}; + } + static constexpr long kInputFrameCount = 0x100, kOutputFrameCount = 0x100; const size_t mChannelCount = getChannelCount(AudioChannelLayout::make( - AudioChannelLayout::LAYOUT_STEREO)); + AudioChannelLayout::LAYOUT_MONO)); const size_t mBufferSizeInFrames = kInputFrameCount * mChannelCount; const int mCaptureSize; const int mLatency; @@ -161,7 +166,7 @@ class VisualizerTestHelper : public EffectHelper { void CleanUp() { mCommonTags.clear(); } }; -class VisualizerParamTest : public ::testing::TestWithParam, +class VisualizerParamTest : public ::testing::TestWithParam, public VisualizerTestHelper { public: VisualizerParamTest() @@ -181,11 +186,6 @@ class VisualizerParamTest : public ::testing::TestWithParam().begin(), ndk::enum_range().end()}; } - - static std::unordered_set getScalingModeValues() { - return {ndk::enum_range().begin(), - ndk::enum_range().end()}; - } }; TEST_P(VisualizerParamTest, SetAndGetCaptureSize) { @@ -237,6 +237,82 @@ TEST_P(VisualizerParamTest, testCaptureSampleBufferSizeAndOutput) { } } +class VisualizerDataTest : public ::testing::TestWithParam, + public VisualizerTestHelper { + public: + VisualizerDataTest() + : VisualizerTestHelper(std::get(GetParam()), + std::get(GetParam()), + std::get(GetParam()), + std::get(GetParam()), + std::get(GetParam())) {} + + void SetUp() override { SetUpVisualizer(); } + + void TearDown() override { TearDownVisualizer(); } +}; + +TEST_P(VisualizerDataTest, testScalingModeParameters) { + SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags); + + // This test holds true for the following range + static_assert(kMaxAudioSampleValue <= 1.0 && kMaxAudioSampleValue > 0.0, + "Valid range of kMaxAudioSample value for the test: (0.0, 1.0]"); + + constexpr float kPowerToleranceDb = 0.5; + + generateSineWave(std::vector{1000}, mInputBuffer, 1.0, mBufferSizeInFrames); + const float expectedPowerNormalized = audio_utils_compute_power_mono( + mInputBuffer.data(), AUDIO_FORMAT_PCM_FLOAT, mInputBuffer.size()); + + const std::vector testMaxAudioSampleValueList = { + 0.25 * kMaxAudioSampleValue, 0.5 * kMaxAudioSampleValue, 0.75 * kMaxAudioSampleValue, + kMaxAudioSampleValue}; + + Parameter::Id idCsb; + Visualizer::Id vsIdCsb; + vsIdCsb.set(Visualizer::captureSampleBuffer); + idCsb.set(vsIdCsb); + + for (float maxAudioSampleValue : testMaxAudioSampleValueList) { + bool allParamsValid = true; + ASSERT_NO_FATAL_FAILURE(addCaptureSizeParam(mCaptureSize)); + ASSERT_NO_FATAL_FAILURE(addScalingModeParam(mScalingMode)); + ASSERT_NO_FATAL_FAILURE(addLatencyParam(mLatency)); + ASSERT_NO_FATAL_FAILURE(SetAndGetParameters(&allParamsValid)); + + generateSineWave(std::vector{1000}, mInputBuffer, maxAudioSampleValue, + mBufferSizeInFrames); + + // The stop and reset calls to the effect are made towards the end in order to fetch the + // captureSampleBuffer values + ASSERT_NO_FATAL_FAILURE(processAndWriteToOutput(mInputBuffer, mOutputBuffer, mEffect, + &mOpenEffectReturn, mVersion, 1, false)); + if (allParamsValid) { + Parameter getParam; + EXPECT_STATUS(EX_NONE, mEffect->getParameter(idCsb, &getParam)) + << " with: " << idCsb.toString(); + std::vector captureBuffer = getParam.get() + .get() + .get(); + ASSERT_EQ((size_t)mCaptureSize, captureBuffer.size()); + + float currPowerCsb = audio_utils_compute_power_mono( + captureBuffer.data(), AUDIO_FORMAT_PCM_8_BIT, mCaptureSize); + + if (mScalingMode == Visualizer::ScalingMode::NORMALIZED) { + EXPECT_NEAR(currPowerCsb, expectedPowerNormalized, kPowerToleranceDb); + } else { + float powerI = audio_utils_compute_power_mono( + mInputBuffer.data(), AUDIO_FORMAT_PCM_FLOAT, mInputBuffer.size()); + EXPECT_NEAR(currPowerCsb, powerI, kPowerToleranceDb); + } + } + ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP)); + ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET)); + } +} + std::vector, Descriptor>> kDescPair; INSTANTIATE_TEST_SUITE_P( VisualizerParamTest, VisualizerParamTest, @@ -246,7 +322,7 @@ INSTANTIATE_TEST_SUITE_P( testing::ValuesIn(EffectHelper::getTestValueSet( kDescPair, EffectHelper::expandTestValueBasic)), - testing::ValuesIn(VisualizerParamTest::getScalingModeValues()), + testing::ValuesIn(VisualizerTestHelper::getScalingModeValues()), testing::ValuesIn(VisualizerParamTest::getMeasurementModeValues()), testing::ValuesIn(EffectHelper::getTestValueSet( @@ -270,6 +346,35 @@ INSTANTIATE_TEST_SUITE_P( GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VisualizerParamTest); +INSTANTIATE_TEST_SUITE_P( + VisualizerDataTest, VisualizerDataTest, + ::testing::Combine( + testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors( + IFactory::descriptor, getEffectTypeUuidVisualizer())), + testing::Values(128), // captureSize + testing::ValuesIn(VisualizerTestHelper::getScalingModeValues()), + testing::Values(Visualizer::MeasurementMode::PEAK_RMS), + testing::Values(0) // latency + ), + [](const testing::TestParamInfo& info) { + auto descriptor = std::get(info.param).second; + std::string captureSize = std::to_string(std::get(info.param)); + std::string scalingMode = aidl::android::hardware::audio::effect::toString( + std::get(info.param)); + std::string measurementMode = aidl::android::hardware::audio::effect::toString( + std::get(info.param)); + std::string latency = std::to_string(std::get(info.param)); + + std::string name = getPrefix(descriptor) + "_captureSize" + captureSize + + "_scalingMode" + scalingMode + "_measurementMode" + measurementMode + + "_latency" + latency; + std::replace_if( + name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_'); + return name; + }); + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VisualizerDataTest); + int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); ::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());