// 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
