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

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

Issue 1453233002: Improve input handling for WaveAudioHandler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Update FileSource Created 5 years, 1 month 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 // MSVC++ requires this to be set before any other includes to get M_PI. 4 // MSVC++ requires this to be set before any other includes to get M_PI.
5 #define _USE_MATH_DEFINES 5 #define _USE_MATH_DEFINES
6 #include <cmath> 6 #include <cmath>
7 7
8 #include "media/audio/simple_sources.h" 8 #include "media/audio/simple_sources.h"
9 9
10 #include <algorithm> 10 #include <algorithm>
11 11
12 #include "base/files/file.h" 12 #include "base/files/file.h"
13 #include "base/lazy_instance.h" 13 #include "base/lazy_instance.h"
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "media/audio/sounds/wav_audio_handler.h" 15 #include "media/audio/sounds/wav_audio_handler.h"
16 #include "media/base/audio_bus.h" 16 #include "media/base/audio_bus.h"
17 17
18 namespace media { 18 namespace media {
19 19
20 // Opens |wav_filename|, reads it and loads it as a wav file. This function will 20 // Opens |wav_filename|, reads it and loads it as a wav file. This function will
21 // return a null pointer if we can't read the file or if it's malformed. The 21 // return a null pointer if we can't read the file or if it's malformed. The
22 // caller takes ownership of the returned data. The size of the data is stored 22 // caller takes ownership of the returned data. The size of the data is stored
23 // in |read_length|. 23 // in |read_length|.
24 static scoped_ptr<uint8[]> ReadWavFile(const base::FilePath& wav_filename, 24 bool ReadWavFile(base::StringPiece* data_out,
25 size_t* file_length) { 25 const base::FilePath& wav_filename) {
26 DCHECK(data_out);
26 base::File wav_file( 27 base::File wav_file(
27 wav_filename, base::File::FLAG_OPEN | base::File::FLAG_READ); 28 wav_filename, base::File::FLAG_OPEN | base::File::FLAG_READ);
28 if (!wav_file.IsValid()) { 29 if (!wav_file.IsValid()) {
29 LOG(ERROR) << "Failed to read " << wav_filename.value() 30 LOG(ERROR) << "Failed to read " << wav_filename.value()
30 << " as input to the fake device."; 31 << " as input to the fake device.";
31 return nullptr; 32 return false;
32 } 33 }
33 34
34 size_t wav_file_length = wav_file.GetLength(); 35 size_t wav_file_length = wav_file.GetLength();
35 if (wav_file_length == 0u) { 36 if (wav_file_length == 0u) {
36 LOG(ERROR) << "Input file to fake device is empty: " 37 LOG(ERROR) << "Input file to fake device is empty: "
37 << wav_filename.value(); 38 << wav_filename.value();
38 return nullptr; 39 return false;
39 } 40 }
40 41
41 uint8* wav_file_data = new uint8[wav_file_length]; 42 scoped_ptr<char> data = make_scoped_ptr(new char[wav_file_length]);
42 size_t read_bytes = wav_file.Read(0, reinterpret_cast<char*>(wav_file_data), 43 size_t read_bytes = wav_file.Read(0, data.get(), wav_file_length);
43 wav_file_length);
44 if (read_bytes != wav_file_length) { 44 if (read_bytes != wav_file_length) {
45 LOG(ERROR) << "Failed to read all bytes of " << wav_filename.value(); 45 LOG(ERROR) << "Failed to read all bytes of " << wav_filename.value();
46 return nullptr; 46 return false;
47 } 47 }
48 *file_length = wav_file_length; 48 data_out->set(data.release(), wav_file_length);
tommi (sloooow) - chröme 2015/11/20 09:45:23 how is this memory freed?
DaleCurtis 2015/11/20 17:31:39 Drive by, StringPiece does not make a copy of the
tommi (sloooow) - chröme 2015/11/20 18:01:27 At the moment I don't think this is ever freed act
slan 2015/11/20 18:09:36 Thanks, Dale. This was a case of me not understand
49 return scoped_ptr<uint8[]>(wav_file_data); 49 return true;
50 }
51
52 // Opens |wav_filename|, reads it and loads it as a wav file. This function will
53 // bluntly trigger CHECKs if we can't read the file or if it's malformed.
54 static scoped_ptr<WavAudioHandler> CreateWavAudioHandler(
55 const base::FilePath& wav_filename, const uint8* wav_file_data,
56 size_t wav_file_length, const AudioParameters& expected_params) {
57 base::StringPiece wav_data(reinterpret_cast<const char*>(wav_file_data),
58 wav_file_length);
59 scoped_ptr<WavAudioHandler> wav_audio_handler(new WavAudioHandler(wav_data));
60 return wav_audio_handler.Pass();
61 } 50 }
62 51
63 // These values are based on experiments for local-to-local 52 // These values are based on experiments for local-to-local
64 // PeerConnection to demonstrate audio/video synchronization. 53 // PeerConnection to demonstrate audio/video synchronization.
65 static const int kBeepDurationMilliseconds = 20; 54 static const int kBeepDurationMilliseconds = 20;
66 static const int kBeepFrequency = 400; 55 static const int kBeepFrequency = 400;
67 56
68 // Intervals between two automatic beeps. 57 // Intervals between two automatic beeps.
69 static const int kAutomaticBeepIntervalInMs = 500; 58 static const int kAutomaticBeepIntervalInMs = 500;
70 59
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 154
166 FileSource::~FileSource() { 155 FileSource::~FileSource() {
167 } 156 }
168 157
169 void FileSource::LoadWavFile(const base::FilePath& path_to_wav_file) { 158 void FileSource::LoadWavFile(const base::FilePath& path_to_wav_file) {
170 // Don't try again if we already failed. 159 // Don't try again if we already failed.
171 if (load_failed_) 160 if (load_failed_)
172 return; 161 return;
173 162
174 // Read the file, and put its data in a scoped_ptr so it gets deleted later. 163 // Read the file, and put its data in a scoped_ptr so it gets deleted later.
175 size_t file_length = 0; 164 base::StringPiece data;
176 wav_file_data_ = ReadWavFile(path_to_wav_file, &file_length); 165 if (!ReadWavFile(&data, path_to_wav_file)) {
177 if (!wav_file_data_) {
178 load_failed_ = true; 166 load_failed_ = true;
179 return; 167 return;
180 } 168 }
181 169
182 wav_audio_handler_ = CreateWavAudioHandler( 170 // Attempt to create a handler with this data. If the data is invalid, return.
183 path_to_wav_file, wav_file_data_.get(), file_length, params_); 171 wav_audio_handler_ = WavAudioHandler::Create(data);
172 if (!wav_audio_handler_) {
173 LOG(ERROR) << "WAV data could be read but is not valid";
174 load_failed_ = true;
175 return;
176 }
184 177
185 // Hook us up so we pull in data from the file into the converter. We need to 178 // Hook us up so we pull in data from the file into the converter. We need to
186 // modify the wav file's audio parameters since we'll be reading small slices 179 // modify the wav file's audio parameters since we'll be reading small slices
187 // of it at a time and not the whole thing (like 10 ms at a time). 180 // of it at a time and not the whole thing (like 10 ms at a time).
188 AudioParameters file_audio_slice( 181 AudioParameters file_audio_slice(
189 AudioParameters::AUDIO_PCM_LOW_LATENCY, 182 AudioParameters::AUDIO_PCM_LOW_LATENCY,
190 GuessChannelLayout(wav_audio_handler_->num_channels()), 183 GuessChannelLayout(wav_audio_handler_->num_channels()),
191 wav_audio_handler_->sample_rate(), wav_audio_handler_->bits_per_sample(), 184 wav_audio_handler_->sample_rate(), wav_audio_handler_->bits_per_sample(),
192 params_.frames_per_buffer()); 185 params_.frames_per_buffer());
193 186
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 } 288 }
296 289
297 void BeepingSource::OnError(AudioOutputStream* stream) { 290 void BeepingSource::OnError(AudioOutputStream* stream) {
298 } 291 }
299 292
300 void BeepingSource::BeepOnce() { 293 void BeepingSource::BeepOnce() {
301 g_beep_context.Pointer()->SetBeepOnce(true); 294 g_beep_context.Pointer()->SetBeepOnce(true);
302 } 295 }
303 296
304 } // namespace media 297 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698