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