blob: 41e1373c2aaecc543cf058256dd148a5c678059d [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "garnet/bin/media/audio_core/mixer/test/audio_result.h"
#include "garnet/bin/media/audio_core/mixer/test/mixer_tests_shared.h"
#include "gtest/gtest.h"
namespace media::audio::test {
//
// These test functions, run after all other details tests have executed,
// producing a digest of the various audio fidelity measurements made.
//
TEST(Recap, FreqResp) {
printf("\n Frequency Response");
printf("\n (in dB, with prior results)");
printf("\n\n Point resampler\n ");
printf(" No SRC 96k->48k");
uint32_t num_freqs;
if (FrequencySet::UseFullFrequencySet) {
printf(" 88.2k->48k 44.1k->48k");
printf(" 24k->48k Micro-SRC");
num_freqs = FrequencySet::kReferenceFreqs.size();
} else {
num_freqs = FrequencySet::kSummaryIdxs.size();
}
for (uint32_t idx = 0; idx < num_freqs; ++idx) {
uint32_t freq = FrequencySet::UseFullFrequencySet
? idx
: FrequencySet::kSummaryIdxs[idx];
printf("\n %6u Hz", FrequencySet::kRefFreqsTranslated[freq]);
if (AudioResult::kPrevFreqRespPointUnity[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespPointUnity[freq],
AudioResult::kPrevFreqRespPointUnity[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevFreqRespPointDown1[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespPointDown1[freq],
AudioResult::kPrevFreqRespPointDown1[freq]);
} else {
printf(" ");
}
if (FrequencySet::UseFullFrequencySet) {
if (AudioResult::kPrevFreqRespPointDown2[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespPointDown2[freq],
AudioResult::kPrevFreqRespPointDown2[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevFreqRespPointUp1[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespPointUp1[freq],
AudioResult::kPrevFreqRespPointUp1[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevFreqRespPointUp2[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespPointUp2[freq],
AudioResult::kPrevFreqRespPointUp2[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevFreqRespPointMicro[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespPointMicro[freq],
AudioResult::kPrevFreqRespPointMicro[freq]);
}
}
}
printf("\n\n Linear resampler\n ");
if (FrequencySet::UseFullFrequencySet) {
printf(" No SRC 96k->48k");
}
printf(" 88.2k->48k 44.1k->48k");
if (FrequencySet::UseFullFrequencySet) {
printf(" 24k->48k Micro-SRC");
}
for (uint32_t idx = 0; idx < num_freqs; ++idx) {
uint32_t freq = FrequencySet::UseFullFrequencySet
? idx
: FrequencySet::kSummaryIdxs[idx];
printf("\n %6u Hz", FrequencySet::kRefFreqsTranslated[freq]);
if (FrequencySet::UseFullFrequencySet) {
if (AudioResult::kPrevFreqRespLinearUnity[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespLinearUnity[freq],
AudioResult::kPrevFreqRespLinearUnity[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevFreqRespLinearDown1[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespLinearDown1[freq],
AudioResult::kPrevFreqRespLinearDown1[freq]);
} else {
printf(" ");
}
}
if (AudioResult::kPrevFreqRespLinearDown2[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespLinearDown2[freq],
AudioResult::kPrevFreqRespLinearDown2[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevFreqRespLinearUp1[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespLinearUp1[freq],
AudioResult::kPrevFreqRespLinearUp1[freq]);
} else {
printf(" ");
}
if (FrequencySet::UseFullFrequencySet) {
if (AudioResult::kPrevFreqRespLinearUp2[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespLinearUp2[freq],
AudioResult::kPrevFreqRespLinearUp2[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevFreqRespLinearMicro[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %9.6lf (%9.6lf)", AudioResult::FreqRespLinearMicro[freq],
AudioResult::kPrevFreqRespLinearMicro[freq]);
} else {
printf(" ");
}
}
}
printf("\n\n");
}
TEST(Recap, SINAD) {
printf("\n Signal-to-Noise-and-Distortion (SINAD)");
printf("\n (in dB, with prior results)");
printf("\n\n Point resampler\n ");
printf(" No SRC 96k->48k ");
uint32_t num_freqs;
if (FrequencySet::UseFullFrequencySet) {
printf(" 88.2k->48k 44.1k->48k ");
printf(" 24k->48k Micro-SRC");
num_freqs = FrequencySet::kReferenceFreqs.size();
} else {
num_freqs = FrequencySet::kSummaryIdxs.size();
}
for (uint32_t idx = 0; idx < num_freqs; ++idx) {
uint32_t freq = FrequencySet::UseFullFrequencySet
? idx
: FrequencySet::kSummaryIdxs[idx];
printf("\n %8u Hz ", FrequencySet::kRefFreqsTranslated[freq]);
if (AudioResult::kPrevSinadPointUnity[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadPointUnity[freq],
AudioResult::kPrevSinadPointUnity[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevSinadPointDown1[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadPointDown1[freq],
AudioResult::kPrevSinadPointDown1[freq]);
} else {
printf(" ");
}
if (FrequencySet::UseFullFrequencySet) {
if (AudioResult::kPrevSinadPointDown2[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadPointDown2[freq],
AudioResult::kPrevSinadPointDown2[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevSinadPointUp1[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadPointUp1[freq],
AudioResult::kPrevSinadPointUp1[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevSinadPointUp2[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadPointUp2[freq],
AudioResult::kPrevSinadPointUp2[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevSinadPointMicro[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadPointMicro[freq],
AudioResult::kPrevSinadPointMicro[freq]);
}
}
}
printf("\n\n Linear resampler\n ");
if (FrequencySet::UseFullFrequencySet) {
printf(" No SRC 96k->48k ");
}
printf(" 88.2k->48k 44.1k->48k");
if (FrequencySet::UseFullFrequencySet) {
printf(" 24k->48k Micro-SRC");
}
for (uint32_t idx = 0; idx < num_freqs; ++idx) {
uint32_t freq = FrequencySet::UseFullFrequencySet
? idx
: FrequencySet::kSummaryIdxs[idx];
printf("\n %8u Hz ", FrequencySet::kRefFreqsTranslated[freq]);
if (FrequencySet::UseFullFrequencySet) {
if (AudioResult::kPrevSinadLinearUnity[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadLinearUnity[freq],
AudioResult::kPrevSinadLinearUnity[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevSinadLinearDown1[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadLinearDown1[freq],
AudioResult::kPrevSinadLinearDown1[freq]);
} else {
printf(" ");
}
}
if (AudioResult::kPrevSinadLinearDown2[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadLinearDown2[freq],
AudioResult::kPrevSinadLinearDown2[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevSinadLinearUp1[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadLinearUp1[freq],
AudioResult::kPrevSinadLinearUp1[freq]);
} else {
printf(" ");
}
if (FrequencySet::UseFullFrequencySet) {
if (AudioResult::kPrevSinadLinearUp2[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadLinearUp2[freq],
AudioResult::kPrevSinadLinearUp2[freq]);
} else {
printf(" ");
}
if (AudioResult::kPrevSinadLinearMicro[freq] !=
-std::numeric_limits<double>::infinity()) {
printf(" %6.2lf (%6.2lf)", AudioResult::SinadLinearMicro[freq],
AudioResult::kPrevSinadLinearMicro[freq]);
}
}
}
printf("\n\n");
}
//
// Display our baseline noise floor measurements, in decibels below full-scale
//
// 'Source' noise floor is the demonstrated best-case background noise when
// accepting audio (from an AudioRenderer or audio Input device, for example).
// 'Output' noise floor is the demonstrated best-case background noise when
// emitting audio (to an audio Output device or AudioCapturer, for example).
TEST(Recap, NoiseFloor) {
printf("\n Best-case noise-floor");
printf("\n (in dB, with prior results)");
printf("\n\n Sources");
printf(
"\n\t 8-bit 16-bit 24-bit Float");
printf(
"\n\t %5.2lf (%5.2lf) %5.2lf (%5.2lf) %6.2lf (%6.2lf) %6.2lf "
"(%6.2lf)",
AudioResult::FloorSource8, AudioResult::kPrevFloorSource8,
AudioResult::FloorSource16, AudioResult::kPrevFloorSource16,
AudioResult::FloorSource24, AudioResult::kPrevFloorSource24,
AudioResult::FloorSourceFloat, AudioResult::kPrevFloorSourceFloat);
printf("\n\n Mix Floor");
printf("\n\t 8-bit 16-bit 24-bit ");
printf(" Float Stereo->Mono");
printf(
"\n\t %5.2lf (%5.2lf) %5.2lf (%5.2lf) %6.2lf (%6.2lf) %6.2lf "
"(%6.2lf) %6.2lf (%6.2lf)",
AudioResult::FloorMix8, AudioResult::kPrevFloorMix8,
AudioResult::FloorMix16, AudioResult::kPrevFloorMix16,
AudioResult::FloorMix24, AudioResult::kPrevFloorMix24,
AudioResult::FloorMixFloat, AudioResult::kPrevFloorMixFloat,
AudioResult::FloorStereoMono, AudioResult::kPrevFloorStereoMono);
printf("\n\n Outputs");
printf(
"\n\t 8-bit 16-bit 24-bit Float");
printf(
"\n\t %5.2lf (%5.2lf) %5.2lf (%5.2lf) %6.2lf (%6.2lf) %6.2lf "
"(%6.2lf)",
AudioResult::FloorOutput8, AudioResult::kPrevFloorOutput8,
AudioResult::FloorOutput16, AudioResult::kPrevFloorOutput16,
AudioResult::FloorOutput24, AudioResult::kPrevFloorOutput24,
AudioResult::FloorOutputFloat, AudioResult::kPrevFloorOutputFloat);
printf("\n\n");
}
//
// Display our gain sensitivity and dynamic range, in decibels
//
TEST(Recap, DynamicRange) {
printf("\n Dynamic Range");
printf("\n (in dB, with prior results)");
printf("\n\n Input Gain Mixed Result Usable Range\n");
printf("\n %9.6lf %10.6lf ( > %9.6lf) %6.2lf (%5.2lf)",
AudioResult::kMaxGainDbNonUnity, AudioResult::LevelEpsilonDown,
AudioResult::kPrevLevelEpsilonDown, AudioResult::SinadEpsilonDown,
AudioResult::kPrevSinadEpsilonDown);
printf("\n -30.0000 %8.4lf (+/- %6.4lf ) %6.2lf (%5.2lf)",
AudioResult::Level30Down, AudioResult::kPrevDynRangeTolerance,
AudioResult::Sinad30Down, AudioResult::kPrevSinad30Down);
printf("\n -60.0000 %8.4lf (+/- %6.4lf ) %6.2lf (%5.2lf)",
AudioResult::Level60Down, AudioResult::kPrevDynRangeTolerance,
AudioResult::Sinad60Down, AudioResult::kPrevSinad60Down);
printf("\n -90.0000 %8.4lf (+/- %6.4lf ) %6.2lf (%5.2lf)",
AudioResult::Level90Down, AudioResult::kPrevDynRangeTolerance,
AudioResult::Sinad90Down, AudioResult::kPrevSinad90Down);
printf("\n\n");
}
} // namespace media::audio::test