Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(144)

Side by Side Diff: media/audio/fake_audio_input_stream.cc

Issue 831693004: Added WebRTC audio quality test using fake device; improved fake device (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include "media/audio/fake_audio_input_stream.h" 5 #include "media/audio/fake_audio_input_stream.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/files/file.h" 9 #include "base/files/file.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 // Opens |wav_filename|, reads it and loads it as a wav file. This function will 59 // Opens |wav_filename|, reads it and loads it as a wav file. This function will
60 // bluntly trigger CHECKs if we can't read the file or if it's malformed. The 60 // bluntly trigger CHECKs if we can't read the file or if it's malformed. The
61 // caller takes ownership of the returned data. The size of the data is stored 61 // caller takes ownership of the returned data. The size of the data is stored
62 // in |read_length|. 62 // in |read_length|.
63 scoped_ptr<uint8[]> ReadWavFile(const base::FilePath& wav_filename, 63 scoped_ptr<uint8[]> ReadWavFile(const base::FilePath& wav_filename,
64 size_t* file_length) { 64 size_t* file_length) {
65 base::File wav_file( 65 base::File wav_file(
66 wav_filename, base::File::FLAG_OPEN | base::File::FLAG_READ); 66 wav_filename, base::File::FLAG_OPEN | base::File::FLAG_READ);
67 if (!wav_file.IsValid()) { 67 if (!wav_file.IsValid()) {
68 CHECK(false) << "Failed to read " << wav_filename.value() << " as input to " 68 CHECK(false) << "Failed to read " << wav_filename.value() << " as input to "
69 << "the fake device."; 69 << "the fake device.";
70 return nullptr; 70 return nullptr;
71 } 71 }
72 72
73 size_t wav_file_length = wav_file.GetLength(); 73 size_t wav_file_length = wav_file.GetLength();
74 CHECK_GT(wav_file_length, 0u)
75 << "Input file to fake device is empty: " << wav_filename.value();
74 76
75 uint8* wav_file_data = new uint8[wav_file_length]; 77 uint8* wav_file_data = new uint8[wav_file_length];
76 size_t read_bytes = wav_file.Read(0, reinterpret_cast<char*>(wav_file_data), 78 size_t read_bytes = wav_file.Read(0, reinterpret_cast<char*>(wav_file_data),
77 wav_file_length); 79 wav_file_length);
78 if (read_bytes != wav_file_length) { 80 if (read_bytes != wav_file_length) {
79 CHECK(false) << "Failed to read all bytes of " << wav_filename.value(); 81 CHECK(false) << "Failed to read all bytes of " << wav_filename.value();
80 return nullptr; 82 return nullptr;
81 } 83 }
82 *file_length = wav_file_length; 84 *file_length = wav_file_length;
83 return scoped_ptr<uint8[]>(wav_file_data); 85 return scoped_ptr<uint8[]>(wav_file_data);
84 } 86 }
85 87
86 // Opens |wav_filename|, reads it and loads it as a Wav file. This function will 88 // Opens |wav_filename|, reads it and loads it as a Wav file. This function will
87 // bluntly trigger CHECKs if the file doesn't have the sampling frequency, bits 89 // bluntly trigger CHECKs if we can't read the file or if it's malformed.
88 // per sample or number of channels as specified in |expected_params|. We also
89 // trigger CHECKs if we can't read the file or if it's malformed.
90 scoped_ptr<media::WavAudioHandler> CreateWavAudioHandler( 90 scoped_ptr<media::WavAudioHandler> CreateWavAudioHandler(
91 const base::FilePath& wav_filename, const uint8* wav_file_data, 91 const base::FilePath& wav_filename, const uint8* wav_file_data,
92 size_t wav_file_length, const AudioParameters& expected_params) { 92 size_t wav_file_length, const AudioParameters& expected_params) {
93 base::StringPiece wav_data(reinterpret_cast<const char*>(wav_file_data), 93 base::StringPiece wav_data(reinterpret_cast<const char*>(wav_file_data),
94 wav_file_length); 94 wav_file_length);
95 scoped_ptr<media::WavAudioHandler> wav_audio_handler( 95 scoped_ptr<media::WavAudioHandler> wav_audio_handler(
96 new media::WavAudioHandler(wav_data)); 96 new media::WavAudioHandler(wav_data));
97
98 // Ensure the input file matches what the audio bus wants, otherwise bail out.
99 CHECK_EQ(wav_audio_handler->params().channels(),
100 expected_params.channels())
101 << "Failed to read " << wav_filename.value() << " to fake device.";
102 CHECK_EQ(wav_audio_handler->params().sample_rate(),
103 expected_params.sample_rate())
104 << "Failed to read " << wav_filename.value() << " to fake device.";
105 CHECK_EQ(wav_audio_handler->params().bits_per_sample(),
106 expected_params.bits_per_sample())
107 << "Failed to read " << wav_filename.value() << " to fake device.";
108
109 return wav_audio_handler.Pass(); 97 return wav_audio_handler.Pass();
110 } 98 }
111 99
112 static base::LazyInstance<BeepContext> g_beep_context = 100 static base::LazyInstance<BeepContext> g_beep_context =
113 LAZY_INSTANCE_INITIALIZER; 101 LAZY_INSTANCE_INITIALIZER;
114 102
115 } // namespace 103 } // namespace
116 104
117 AudioInputStream* FakeAudioInputStream::MakeFakeStream( 105 AudioInputStream* FakeAudioInputStream::MakeFakeStream(
118 AudioManagerBase* manager, 106 AudioManagerBase* manager,
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 void FakeAudioInputStream::OpenInFileMode(const base::FilePath& wav_filename) { 189 void FakeAudioInputStream::OpenInFileMode(const base::FilePath& wav_filename) {
202 CHECK(!wav_filename.empty()) 190 CHECK(!wav_filename.empty())
203 << "You must pass the file to use as argument to --" 191 << "You must pass the file to use as argument to --"
204 << switches::kUseFileForFakeAudioCapture << "."; 192 << switches::kUseFileForFakeAudioCapture << ".";
205 193
206 // Read the file, and put its data in a scoped_ptr so it gets deleted later. 194 // Read the file, and put its data in a scoped_ptr so it gets deleted later.
207 size_t file_length = 0; 195 size_t file_length = 0;
208 wav_file_data_ = ReadWavFile(wav_filename, &file_length); 196 wav_file_data_ = ReadWavFile(wav_filename, &file_length);
209 wav_audio_handler_ = CreateWavAudioHandler( 197 wav_audio_handler_ = CreateWavAudioHandler(
210 wav_filename, wav_file_data_.get(), file_length, params_); 198 wav_filename, wav_file_data_.get(), file_length, params_);
199
200 // Hook us up so we pull in data from the file into the converter. We need to
201 // modify the wav file's audio parameters since we'll be reading small slices
202 // of it at a time and not the whole thing (like 10 ms at a time).
203 AudioParameters file_audio_slice(
204 wav_audio_handler_->params().format(),
205 wav_audio_handler_->params().channel_layout(),
206 wav_audio_handler_->params().sample_rate(),
207 wav_audio_handler_->params().bits_per_sample(),
208 params_.frames_per_buffer());
209
210 file_audio_converter_.reset(
211 new AudioConverter(file_audio_slice, params_, false));
212 file_audio_converter_->AddInput(this);
211 } 213 }
212 214
213 bool FakeAudioInputStream::PlayingFromFile() { 215 bool FakeAudioInputStream::PlayingFromFile() {
214 return wav_audio_handler_.get() != nullptr; 216 return wav_audio_handler_.get() != nullptr;
215 } 217 }
216 218
217 void FakeAudioInputStream::PlayFile() { 219 void FakeAudioInputStream::PlayFile() {
218 // Stop playing if we've played out the whole file. 220 // Stop playing if we've played out the whole file.
219 if (wav_audio_handler_->AtEnd(wav_file_read_pos_)) 221 if (wav_audio_handler_->AtEnd(wav_file_read_pos_))
220 return; 222 return;
221 223
222 // Unfilled frames will be zeroed by CopyTo. 224 file_audio_converter_->Convert(audio_bus_.get());
223 size_t bytes_written;
224 wav_audio_handler_->CopyTo(audio_bus_.get(), wav_file_read_pos_,
225 &bytes_written);
226 wav_file_read_pos_ += bytes_written;
227 callback_->OnData(this, audio_bus_.get(), buffer_size_, 1.0); 225 callback_->OnData(this, audio_bus_.get(), buffer_size_, 1.0);
228 } 226 }
229 227
230 void FakeAudioInputStream::PlayBeep() { 228 void FakeAudioInputStream::PlayBeep() {
231 // Accumulate the time from the last beep. 229 // Accumulate the time from the last beep.
232 interval_from_last_beep_ += TimeTicks::Now() - last_callback_time_; 230 interval_from_last_beep_ += TimeTicks::Now() - last_callback_time_;
233 231
234 memset(buffer_.get(), 0, buffer_size_); 232 memset(buffer_.get(), 0, buffer_size_);
235 bool should_beep = false; 233 bool should_beep = false;
236 { 234 {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 bool FakeAudioInputStream::GetAutomaticGainControl() { 312 bool FakeAudioInputStream::GetAutomaticGainControl() {
315 return false; 313 return false;
316 } 314 }
317 315
318 // static 316 // static
319 void FakeAudioInputStream::BeepOnce() { 317 void FakeAudioInputStream::BeepOnce() {
320 BeepContext* beep_context = g_beep_context.Pointer(); 318 BeepContext* beep_context = g_beep_context.Pointer();
321 beep_context->SetBeepOnce(true); 319 beep_context->SetBeepOnce(true);
322 } 320 }
323 321
322 double FakeAudioInputStream::ProvideInput(AudioBus* audio_bus_into_converter,
323 base::TimeDelta buffer_delay) {
324 // Unfilled frames will be zeroed by CopyTo.
325 size_t bytes_written;
326 wav_audio_handler_->CopyTo(audio_bus_into_converter, wav_file_read_pos_,
327 &bytes_written);
328 wav_file_read_pos_ += bytes_written;
329 return 1.0;
330 };
331
324 } // namespace media 332 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698