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