AudioResampler: Add downsampling filter response test

Test: resampler_tests
Bug: 123920996
Change-Id: I835ec033bd1fc6fd6905e32c660c779fafb853cb
diff --git a/media/libaudioprocessing/tests/resampler_tests.cpp b/media/libaudioprocessing/tests/resampler_tests.cpp
index e1623f7..8292291 100644
--- a/media/libaudioprocessing/tests/resampler_tests.cpp
+++ b/media/libaudioprocessing/tests/resampler_tests.cpp
@@ -246,7 +246,8 @@
 }
 
 void testFilterResponse(
-        size_t channels, unsigned inputFreq, unsigned outputFreq)
+        size_t channels, unsigned inputFreq, unsigned outputFreq,
+        android::AudioResampler::src_quality quality = android::AudioResampler::DYN_HIGH_QUALITY)
 {
     // create resampler
     using ResamplerType = android::AudioResamplerDyn<float, float, float>;
@@ -256,7 +257,7 @@
                             AUDIO_FORMAT_PCM_FLOAT,
                             channels,
                             outputFreq,
-                            android::AudioResampler::DYN_HIGH_QUALITY)));
+                            quality)));
     rdyn->setSampleRate(inputFreq);
 
     // get design parameters
@@ -268,17 +269,20 @@
     const double attenuation = rdyn->getFilterAttenuation();
     const double stopbandDb = rdyn->getStopbandAttenuationDb();
     const double passbandDb = rdyn->getPassbandRippleDb();
-    const double fp = fcr - tbw / 2;
-    const double fs = fcr + tbw / 2;
+    const double fp = fcr - tbw * 0.5;
+    const double fs = fcr + tbw * 0.5;
+    const double idealfs = inputFreq <= outputFreq
+        ? 0.5                            // upsample
+        : 0.5 * outputFreq  / inputFreq; // downsample
 
-    printf("inputFreq:%d outputFreq:%d design"
+    printf("inputFreq:%d outputFreq:%d design quality %d"
             " phases:%d halfLength:%d"
-            " fcr:%lf fp:%lf fs:%lf tbw:%lf"
+            " fcr:%lf fp:%lf fs:%lf tbw:%lf fcrp:%lf"
             " attenuation:%lf stopRipple:%.lf passRipple:%lf"
             "\n",
-            inputFreq, outputFreq,
+            inputFreq, outputFreq, quality,
             phases, halfLength,
-            fcr, fp, fs, tbw,
+            fcr, fp, fs, tbw, fcr * 100. / idealfs,
             attenuation, stopbandDb, passbandDb);
 
     // verify design parameters
@@ -541,8 +545,36 @@
     }
 }
 
-TEST(audioflinger_resampler, filterresponse) {
-    std::vector<int> inSampleRates{
+// Selected downsampling responses for various frequencies relating to hearing aid.
+TEST(audioflinger_resampler, downsamplingresponse) {
+    static constexpr android::AudioResampler::src_quality qualities[] = {
+        android::AudioResampler::DYN_LOW_QUALITY,
+        android::AudioResampler::DYN_MED_QUALITY,
+        android::AudioResampler::DYN_HIGH_QUALITY,
+    };
+    static constexpr int inSampleRates[] = {
+        32000,
+        44100,
+        48000,
+    };
+    static constexpr int outSampleRates[] = {
+        16000,
+        24000,
+    };
+
+    for (auto quality : qualities) {
+        for (int outSampleRate : outSampleRates) {
+            for (int inSampleRate : inSampleRates) {
+                testFilterResponse(2 /* channels */, inSampleRate, outSampleRate, quality);
+            }
+        }
+    }
+}
+
+// General responses for typical output device scenarios - 44.1, 48, 96 kHz
+// (48, 96 are part of the same resampler generation family).
+TEST(audioflinger_resampler, generalresponse) {
+    static constexpr int inSampleRates[] = {
         8000,
         11025,
         12000,
@@ -557,7 +589,8 @@
         176400,
         192000,
     };
-    std::vector<int> outSampleRates{
+    static constexpr int outSampleRates[] = {
+        44100,
         48000,
         96000,
     };