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