| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // MSVC++ requires this to be set before any other includes to get M_PI. | 5 // MSVC++ requires this to be set before any other includes to get M_PI. |
| 6 #define _USE_MATH_DEFINES | 6 #define _USE_MATH_DEFINES |
| 7 | 7 |
| 8 #include "media/base/audio_converter.h" | 8 #include "media/base/audio_converter.h" |
| 9 | 9 |
| 10 #include <stddef.h> | 10 #include <stddef.h> |
| 11 | 11 |
| 12 #include <cmath> | 12 #include <cmath> |
| 13 #include <memory> | 13 #include <memory> |
| 14 | 14 |
| 15 #include "base/macros.h" | 15 #include "base/macros.h" |
| 16 #include "base/memory/scoped_vector.h" | 16 #include "base/memory/scoped_vector.h" |
| 17 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
| 18 #include "media/base/audio_timestamp_helper.h" |
| 18 #include "media/base/fake_audio_render_callback.h" | 19 #include "media/base/fake_audio_render_callback.h" |
| 19 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 22 |
| 22 namespace media { | 23 namespace media { |
| 23 | 24 |
| 24 // Parameters which control the many input case tests. | 25 // Parameters which control the many input case tests. |
| 25 static const int kConvertInputs = 8; | 26 static const int kConvertInputs = 8; |
| 26 static const int kConvertCycles = 3; | 27 static const int kConvertCycles = 3; |
| 27 | 28 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 52 | 53 |
| 53 converter_.reset(new AudioConverter( | 54 converter_.reset(new AudioConverter( |
| 54 input_parameters_, output_parameters_, false)); | 55 input_parameters_, output_parameters_, false)); |
| 55 | 56 |
| 56 audio_bus_ = AudioBus::Create(output_parameters_); | 57 audio_bus_ = AudioBus::Create(output_parameters_); |
| 57 expected_audio_bus_ = AudioBus::Create(output_parameters_); | 58 expected_audio_bus_ = AudioBus::Create(output_parameters_); |
| 58 | 59 |
| 59 // Allocate one callback for generating expected results. | 60 // Allocate one callback for generating expected results. |
| 60 double step = kSineCycles / static_cast<double>( | 61 double step = kSineCycles / static_cast<double>( |
| 61 output_parameters_.frames_per_buffer()); | 62 output_parameters_.frames_per_buffer()); |
| 62 expected_callback_.reset(new FakeAudioRenderCallback(step)); | 63 expected_callback_.reset(new FakeAudioRenderCallback(step, kSampleRate)); |
| 63 } | 64 } |
| 64 | 65 |
| 65 // Creates |count| input callbacks to be used for conversion testing. | 66 // Creates |count| input callbacks to be used for conversion testing. |
| 66 void InitializeInputs(int count) { | 67 void InitializeInputs(int count) { |
| 67 // Setup FakeAudioRenderCallback step to compensate for resampling. | 68 // Setup FakeAudioRenderCallback step to compensate for resampling. |
| 68 double scale_factor = input_parameters_.sample_rate() / | 69 double scale_factor = input_parameters_.sample_rate() / |
| 69 static_cast<double>(output_parameters_.sample_rate()); | 70 static_cast<double>(output_parameters_.sample_rate()); |
| 70 double step = kSineCycles / (scale_factor * | 71 double step = kSineCycles / (scale_factor * |
| 71 static_cast<double>(output_parameters_.frames_per_buffer())); | 72 static_cast<double>(output_parameters_.frames_per_buffer())); |
| 72 | 73 |
| 73 for (int i = 0; i < count; ++i) { | 74 for (int i = 0; i < count; ++i) { |
| 74 fake_callbacks_.push_back(new FakeAudioRenderCallback(step)); | 75 fake_callbacks_.push_back(new FakeAudioRenderCallback(step, kSampleRate)); |
| 75 converter_->AddInput(fake_callbacks_[i]); | 76 converter_->AddInput(fake_callbacks_[i]); |
| 76 } | 77 } |
| 77 } | 78 } |
| 78 | 79 |
| 79 // Resets all input callbacks to a pristine state. | 80 // Resets all input callbacks to a pristine state. |
| 80 void Reset() { | 81 void Reset() { |
| 81 converter_->Reset(); | 82 converter_->Reset(); |
| 82 for (size_t i = 0; i < fake_callbacks_.size(); ++i) | 83 for (size_t i = 0; i < fake_callbacks_.size(); ++i) |
| 83 fake_callbacks_[i]->reset(); | 84 fake_callbacks_[i]->reset(); |
| 84 expected_callback_->reset(); | 85 expected_callback_->reset(); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 AudioParameters input_parameters(AudioParameters::AUDIO_PCM_LINEAR, | 206 AudioParameters input_parameters(AudioParameters::AUDIO_PCM_LINEAR, |
| 206 CHANNEL_LAYOUT_DISCRETE, kSampleRate, | 207 CHANNEL_LAYOUT_DISCRETE, kSampleRate, |
| 207 kBitsPerChannel, kLowLatencyBufferSize); | 208 kBitsPerChannel, kLowLatencyBufferSize); |
| 208 input_parameters.set_channels_for_discrete(10); | 209 input_parameters.set_channels_for_discrete(10); |
| 209 AudioParameters output_parameters(AudioParameters::AUDIO_PCM_LINEAR, | 210 AudioParameters output_parameters(AudioParameters::AUDIO_PCM_LINEAR, |
| 210 CHANNEL_LAYOUT_DISCRETE, kSampleRate * 2, | 211 CHANNEL_LAYOUT_DISCRETE, kSampleRate * 2, |
| 211 kBitsPerChannel, kHighLatencyBufferSize); | 212 kBitsPerChannel, kHighLatencyBufferSize); |
| 212 output_parameters.set_channels_for_discrete(5); | 213 output_parameters.set_channels_for_discrete(5); |
| 213 | 214 |
| 214 AudioConverter converter(input_parameters, output_parameters, false); | 215 AudioConverter converter(input_parameters, output_parameters, false); |
| 215 FakeAudioRenderCallback callback(0.2); | 216 FakeAudioRenderCallback callback(0.2, kSampleRate); |
| 216 std::unique_ptr<AudioBus> audio_bus = AudioBus::Create(output_parameters); | 217 std::unique_ptr<AudioBus> audio_bus = AudioBus::Create(output_parameters); |
| 217 converter.AddInput(&callback); | 218 converter.AddInput(&callback); |
| 218 converter.Convert(audio_bus.get()); | 219 converter.Convert(audio_bus.get()); |
| 219 | 220 |
| 220 // double input_sample_rate = input_parameters.sample_rate(); | 221 // double input_sample_rate = input_parameters.sample_rate(); |
| 221 // int fill_count = | 222 // int fill_count = |
| 222 // (output_parameters.frames_per_buffer() * input_sample_rate / | 223 // (output_parameters.frames_per_buffer() * input_sample_rate / |
| 223 // output_parameters.sample_rate()) / | 224 // output_parameters.sample_rate()) / |
| 224 // input_parameters.frames_per_buffer(); | 225 // input_parameters.frames_per_buffer(); |
| 225 // | 226 // |
| 226 // This magic number is the accumulated MultiChannelResampler delay after | 227 // This magic number is the accumulated MultiChannelResampler delay after |
| 227 // |fill_count| (4) callbacks to provide input. The number of frames delayed | 228 // |fill_count| (4) callbacks to provide input. The number of frames delayed |
| 228 // is an implementation detail of the SincResampler chunk size (480 for the | 229 // is an implementation detail of the SincResampler chunk size (480 for the |
| 229 // first two callbacks, 512 for the last two callbacks). See | 230 // first two callbacks, 512 for the last two callbacks). See |
| 230 // SincResampler.ChunkSize(). | 231 // SincResampler.ChunkSize(). |
| 231 int kExpectedDelay = 992; | 232 int kExpectedDelay = 992; |
| 232 | 233 auto expected_delay = |
| 233 EXPECT_EQ(kExpectedDelay, callback.last_frames_delayed()); | 234 AudioTimestampHelper::FramesToTime(kExpectedDelay, kSampleRate); |
| 235 EXPECT_EQ(expected_delay, callback.last_delay()); |
| 234 EXPECT_EQ(input_parameters.channels(), callback.last_channel_count()); | 236 EXPECT_EQ(input_parameters.channels(), callback.last_channel_count()); |
| 235 } | 237 } |
| 236 | 238 |
| 237 TEST_P(AudioConverterTest, ArbitraryOutputRequestSize) { | 239 TEST_P(AudioConverterTest, ArbitraryOutputRequestSize) { |
| 238 // Resize output bus to be half of |output_parameters_|'s frames_per_buffer(). | 240 // Resize output bus to be half of |output_parameters_|'s frames_per_buffer(). |
| 239 audio_bus_ = AudioBus::Create(output_parameters_.channels(), | 241 audio_bus_ = AudioBus::Create(output_parameters_.channels(), |
| 240 output_parameters_.frames_per_buffer() / 2); | 242 output_parameters_.frames_per_buffer() / 2); |
| 241 RunTest(1); | 243 RunTest(1); |
| 242 } | 244 } |
| 243 | 245 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 259 // No resampling. No channel mixing. | 261 // No resampling. No channel mixing. |
| 260 std::tr1::make_tuple(44100, 44100, CHANNEL_LAYOUT_STEREO, 0.00000048), | 262 std::tr1::make_tuple(44100, 44100, CHANNEL_LAYOUT_STEREO, 0.00000048), |
| 261 | 263 |
| 262 // Upsampling. Channel upmixing. | 264 // Upsampling. Channel upmixing. |
| 263 std::tr1::make_tuple(44100, 48000, CHANNEL_LAYOUT_QUAD, 0.033), | 265 std::tr1::make_tuple(44100, 48000, CHANNEL_LAYOUT_QUAD, 0.033), |
| 264 | 266 |
| 265 // Downsampling. Channel downmixing. | 267 // Downsampling. Channel downmixing. |
| 266 std::tr1::make_tuple(48000, 41000, CHANNEL_LAYOUT_MONO, 0.042))); | 268 std::tr1::make_tuple(48000, 41000, CHANNEL_LAYOUT_MONO, 0.042))); |
| 267 | 269 |
| 268 } // namespace media | 270 } // namespace media |
| OLD | NEW |