1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "media/audio/audio_power_monitor.h"
6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <limits>
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/time/time.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "media/base/audio_bus.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace media {
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const int kSampleRate = 48000;
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const int kFramesPerBuffer = 128;
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const int kTimeConstantMillis = 5;
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace {
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Container for each parameterized test's data (input and expected results).
23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass TestScenario {
24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public:
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  TestScenario(const float* data, int num_channels, int num_frames,
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch               float expected_power, bool expected_clipped)
27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      : expected_power_(expected_power), expected_clipped_(expected_clipped) {
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    CreatePopulatedBuffer(data, num_channels, num_frames);
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Copy constructor and assignment operator for ::testing::Values(...).
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  TestScenario(const TestScenario& other) { *this = other; }
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  TestScenario& operator=(const TestScenario& other) {
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    this->expected_power_ = other.expected_power_;
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    this->expected_clipped_ = other.expected_clipped_;
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    this->bus_ = AudioBus::Create(other.bus_->channels(), other.bus_->frames());
37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    other.bus_->CopyTo(this->bus_.get());
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return *this;
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Returns this TestScenario, but with a bad sample value placed in the middle
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // of channel 0.
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  TestScenario WithABadSample(float bad_value) const {
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    TestScenario result(*this);
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    result.bus_->channel(0)[result.bus_->frames() / 2] = bad_value;
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return result;
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const AudioBus& data() const {
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return *bus_;
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  float expected_power() const {
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return expected_power_;
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool expected_clipped() const {
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return expected_clipped_;
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch private:
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Creates an AudioBus, sized and populated with kFramesPerBuffer frames of
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // data.  The given test |data| is repeated to fill the buffer.
64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void CreatePopulatedBuffer(
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const float* data, int num_channels, int num_frames) {
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    bus_ = AudioBus::Create(num_channels, kFramesPerBuffer);
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    for (int ch = 0; ch < num_channels; ++ch) {
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      for (int frames = 0; frames < kFramesPerBuffer; frames += num_frames) {
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        const int num_to_copy = std::min(num_frames, kFramesPerBuffer - frames);
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        memcpy(bus_->channel(ch) + frames, data + num_frames * ch,
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch               sizeof(float) * num_to_copy);
72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      }
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  float expected_power_;
77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool expected_clipped_;
78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<AudioBus> bus_;
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
81a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Value printer for TestScenario.  Required to prevent Valgrind "access to
82a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// uninitialized memory" errors (http://crbug.com/263315).
83a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch::std::ostream& operator<<(::std::ostream& os, const TestScenario& ts) {
84a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return os << "{" << ts.data().channels() << "-channel signal} --> {"
85a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            << ts.expected_power() << " dBFS, "
86a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            << (ts.expected_clipped() ? "clipped" : "not clipped")
87a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch            << "}";
88a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
89a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// An observer that receives power measurements.  Each power measurement should
91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// should make progress towards the goal value.
92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass MeasurementObserver {
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public:
94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  MeasurementObserver(float goal_power_measurement, bool goal_clipped)
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      : goal_power_measurement_(goal_power_measurement),
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        goal_clipped_(goal_clipped), measurement_count_(0),
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        last_power_measurement_(AudioPowerMonitor::zero_power()),
98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        last_clipped_(false) {}
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int measurement_count() const {
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return measurement_count_;
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  float last_power_measurement() const {
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return last_power_measurement_;
106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool last_clipped() const {
109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return last_clipped_;
110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void OnPowerMeasured(float cur_power_measurement, bool clipped) {
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (measurement_count_ == 0) {
114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      measurements_should_increase_ =
115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          (cur_power_measurement < goal_power_measurement_);
116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    } else {
117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      SCOPED_TRACE(::testing::Message()
118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                   << "Power: goal=" << goal_power_measurement_
119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                   << "; last=" << last_power_measurement_
120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                   << "; cur=" << cur_power_measurement);
121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      if (last_power_measurement_ != goal_power_measurement_) {
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        if (measurements_should_increase_) {
124ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          EXPECT_LE(last_power_measurement_, cur_power_measurement)
125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch              << "Measurements should be monotonically increasing.";
126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        } else {
127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          EXPECT_GE(last_power_measurement_, cur_power_measurement)
128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch              << "Measurements should be monotonically decreasing.";
129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        }
130ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      } else {
131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        EXPECT_EQ(last_power_measurement_, cur_power_measurement)
132ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            << "Measurements are numerically unstable at goal value.";
133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      }
134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    last_power_measurement_ = cur_power_measurement;
137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    last_clipped_ = clipped;
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ++measurement_count_;
139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch private:
142ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const float goal_power_measurement_;
143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const bool goal_clipped_;
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int measurement_count_;
145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool measurements_should_increase_;
146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  float last_power_measurement_;
147ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool last_clipped_;
148ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(MeasurementObserver);
150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace
153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass AudioPowerMonitorTest : public ::testing::TestWithParam<TestScenario> {
155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public:
156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  AudioPowerMonitorTest()
157c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      : power_monitor_(kSampleRate,
158c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                       base::TimeDelta::FromMilliseconds(kTimeConstantMillis)) {
159c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  }
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void FeedAndCheckExpectedPowerIsMeasured(
162ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const AudioBus& bus, float power, bool clipped) {
163c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // Feed the AudioPowerMonitor, read measurements from it, and record them in
164c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    // MeasurementObserver.
165ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    static const int kNumFeedIters = 100;
166ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    MeasurementObserver observer(power, clipped);
167c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    for (int i = 0; i < kNumFeedIters; ++i) {
168c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      power_monitor_.Scan(bus, bus.frames());
169c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      const std::pair<float, bool>& reading =
170c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch          power_monitor_.ReadCurrentPowerAndClip();
171c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      observer.OnPowerMeasured(reading.first, reading.second);
172c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    }
173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
174ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // Check that the results recorded by the observer are the same whole-number
175ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // dBFS.
176ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(static_cast<int>(power),
177ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch              static_cast<int>(observer.last_power_measurement()));
178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(clipped, observer.last_clipped());
179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch private:
182ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  AudioPowerMonitor power_monitor_;
183ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(AudioPowerMonitorTest);
185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_P(AudioPowerMonitorTest, MeasuresPowerOfSignal) {
188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const TestScenario& scenario = GetParam();
189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<AudioBus> zeroed_bus =
191ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      AudioBus::Create(scenario.data().channels(), scenario.data().frames());
192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  zeroed_bus->Zero();
193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Send a "zero power" audio signal, then this scenario's audio signal, then
195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // the "zero power" audio signal again; testing that the power monitor
196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // measurements match expected values.
197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FeedAndCheckExpectedPowerIsMeasured(
198ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      *zeroed_bus, AudioPowerMonitor::zero_power(), false);
199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FeedAndCheckExpectedPowerIsMeasured(
200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      scenario.data(), scenario.expected_power(), scenario.expected_clipped());
201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FeedAndCheckExpectedPowerIsMeasured(
202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      *zeroed_bus, AudioPowerMonitor::zero_power(), false);
203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kMonoSilentNoise[] = {
206ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0.01f, -0.01f
207ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
208ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kMonoMaxAmplitude[] = {
210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  1.0f
211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kMonoMaxAmplitude2[] = {
214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  -1.0f, 1.0f
215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
217ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kMonoHalfMaxAmplitude[] = {
218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0.5f, -0.5f, 0.5f, -0.5f
219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
220ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kMonoAmplitudeClipped[] = {
222ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  2.0f, -2.0f
223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
225ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kMonoMaxAmplitudeWithClip[] = {
226ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  2.0f, 0.0, 0.0f, 0.0f
227ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kMonoMaxAmplitudeWithClip2[] = {
230ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  4.0f, 0.0, 0.0f, 0.0f
231ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
232ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
233ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kStereoSilentNoise[] = {
234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // left channel
235ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0.005f, -0.005f,
236ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // right channel
237ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0.005f, -0.005f
238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kStereoMaxAmplitude[] = {
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // left channel
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  1.0f, -1.0f,
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // right channel
244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  -1.0f, 1.0f
245ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
246ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
247ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kRightChannelMaxAmplitude[] = {
248ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // left channel
249ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0.0f, 0.0f, 0.0f, 0.0f,
250ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // right channel
251ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  -1.0f, 1.0f, -1.0f, 1.0f
252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
253ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
254ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kLeftChannelHalfMaxAmplitude[] = {
255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // left channel
256ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0.5f, -0.5f, 0.5f, -0.5f,
257ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // right channel
258ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0.0f, 0.0f, 0.0f, 0.0f,
259ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
260ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
261ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kStereoMixed[] = {
262ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // left channel
263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0.5f, -0.5f, 0.5f, -0.5f,
264ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // right channel
265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  -1.0f, 1.0f, -1.0f, 1.0f
266ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
267ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
268ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic const float kStereoMixed2[] = {
269ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // left channel
270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  1.0f, -1.0f, 0.75f, -0.75f, 0.5f, -0.5f, 0.25f, -0.25f,
271ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // right channel
272ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  0.25f, -0.25f, 0.5f, -0.5f, 0.75f, -0.75f, 1.0f, -1.0f
273ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
274ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
275ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochINSTANTIATE_TEST_CASE_P(
276ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    Scenarios, AudioPowerMonitorTest,
277ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ::testing::Values(
278ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kMonoSilentNoise, 1, 2, -40, false),
279ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kMonoMaxAmplitude, 1, 1,
280ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                      AudioPowerMonitor::max_power(), false),
281ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kMonoMaxAmplitude2, 1, 2,
282ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                      AudioPowerMonitor::max_power(), false),
283ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kMonoHalfMaxAmplitude, 1, 4, -6, false),
284ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kMonoAmplitudeClipped, 1, 2,
285ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                      AudioPowerMonitor::max_power(), true),
286ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kMonoMaxAmplitudeWithClip, 1, 4,
287ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                      AudioPowerMonitor::max_power(), true),
288ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kMonoMaxAmplitudeWithClip2, 1, 4,
289ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                      AudioPowerMonitor::max_power(), true),
290ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kMonoSilentNoise, 1, 2,
291c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                      AudioPowerMonitor::zero_power(), false).
292ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch             WithABadSample(std::numeric_limits<float>::infinity()),
293ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kMonoHalfMaxAmplitude, 1, 4,
294ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                      AudioPowerMonitor::zero_power(), false).
295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch             WithABadSample(std::numeric_limits<float>::quiet_NaN()),
296ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kStereoSilentNoise, 2, 2, -46, false),
297ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kStereoMaxAmplitude, 2, 2,
298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                      AudioPowerMonitor::max_power(), false),
299ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kRightChannelMaxAmplitude, 2, 4, -3, false),
300ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kLeftChannelHalfMaxAmplitude, 2, 4, -9, false),
301ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kStereoMixed, 2, 4, -2, false),
302ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch         TestScenario(kStereoMixed2, 2, 8, -3, false)));
303ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
304ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace media
305