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

Side by Side Diff: content/renderer/media/audio_device.cc

Issue 9655018: Make AudioParameters a class instead of a struct (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix tests Created 8 years, 9 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 | Annotate | Revision Log
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 "content/renderer/media/audio_device.h" 5 #include "content/renderer/media/audio_device.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/threading/thread_restrictions.h" 9 #include "base/threading/thread_restrictions.h"
10 #include "base/time.h" 10 #include "base/time.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 AudioDevice::AudioDevice() 42 AudioDevice::AudioDevice()
43 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()), 43 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()),
44 callback_(NULL), 44 callback_(NULL),
45 volume_(1.0), 45 volume_(1.0),
46 stream_id_(0), 46 stream_id_(0),
47 play_on_start_(true), 47 play_on_start_(true),
48 is_started_(false) { 48 is_started_(false) {
49 filter_ = RenderThreadImpl::current()->audio_message_filter(); 49 filter_ = RenderThreadImpl::current()->audio_message_filter();
50 } 50 }
51 51
52 AudioDevice::AudioDevice(size_t buffer_size, 52 AudioDevice::AudioDevice(const AudioParameters& params,
53 int channels,
54 double sample_rate,
55 RenderCallback* callback) 53 RenderCallback* callback)
56 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()), 54 : ScopedLoopObserver(ChildProcess::current()->io_message_loop()),
57 callback_(NULL), 55 audio_parameters_(params),
56 callback_(callback),
58 volume_(1.0), 57 volume_(1.0),
59 stream_id_(0), 58 stream_id_(0),
60 play_on_start_(true), 59 play_on_start_(true),
61 is_started_(false) { 60 is_started_(false) {
62 filter_ = RenderThreadImpl::current()->audio_message_filter(); 61 filter_ = RenderThreadImpl::current()->audio_message_filter();
63 Initialize(buffer_size,
64 channels,
65 sample_rate,
66 AudioParameters::AUDIO_PCM_LOW_LATENCY,
67 callback);
68 } 62 }
69 63
70 void AudioDevice::Initialize(size_t buffer_size, 64 void AudioDevice::Initialize(const AudioParameters& params,
71 int channels,
72 double sample_rate,
73 AudioParameters::Format latency_format,
74 RenderCallback* callback) { 65 RenderCallback* callback) {
75 CHECK_EQ(0, stream_id_) << 66 CHECK_EQ(0, stream_id_) <<
76 "AudioDevice::Initialize() must be called before Start()"; 67 "AudioDevice::Initialize() must be called before Start()";
77 68
78 CHECK(!callback_); // Calling Initialize() twice? 69 CHECK(!callback_); // Calling Initialize() twice?
79 70
80 audio_parameters_.format = latency_format; 71 audio_parameters_ = params;
81 audio_parameters_.channels = channels;
82 audio_parameters_.sample_rate = static_cast<int>(sample_rate);
83 audio_parameters_.bits_per_sample = 16;
vrk (LEFT CHROMIUM) 2012/03/09 20:59:32 Notice that bits_per_sample was hardcoded to 16 fo
84 audio_parameters_.samples_per_packet = buffer_size;
85
86 callback_ = callback; 72 callback_ = callback;
87 } 73 }
88 74
89 AudioDevice::~AudioDevice() { 75 AudioDevice::~AudioDevice() {
90 // The current design requires that the user calls Stop() before deleting 76 // The current design requires that the user calls Stop() before deleting
91 // this class. 77 // this class.
92 CHECK_EQ(0, stream_id_); 78 CHECK_EQ(0, stream_id_);
93 } 79 }
94 80
95 void AudioDevice::Start() { 81 void AudioDevice::Start() {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 callback_->OnRenderError(); 188 callback_->OnRenderError();
203 } 189 }
204 } 190 }
205 191
206 void AudioDevice::OnStreamCreated( 192 void AudioDevice::OnStreamCreated(
207 base::SharedMemoryHandle handle, 193 base::SharedMemoryHandle handle,
208 base::SyncSocket::Handle socket_handle, 194 base::SyncSocket::Handle socket_handle,
209 uint32 length) { 195 uint32 length) {
210 DCHECK(message_loop()->BelongsToCurrentThread()); 196 DCHECK(message_loop()->BelongsToCurrentThread());
211 DCHECK_GE(length, 197 DCHECK_GE(length,
212 audio_parameters_.samples_per_packet * sizeof(int16) * 198 audio_parameters_.samples_per_packet() * sizeof(int16) *
213 audio_parameters_.channels); 199 audio_parameters_.channels());
214 #if defined(OS_WIN) 200 #if defined(OS_WIN)
215 DCHECK(handle); 201 DCHECK(handle);
216 DCHECK(socket_handle); 202 DCHECK(socket_handle);
217 #else 203 #else
218 DCHECK_GE(handle.fd, 0); 204 DCHECK_GE(handle.fd, 0);
219 DCHECK_GE(socket_handle, 0); 205 DCHECK_GE(socket_handle, 0);
220 #endif 206 #endif
221 207
222 // Takes care of the case when Stop() is called before OnStreamCreated(). 208 // Takes care of the case when Stop() is called before OnStreamCreated().
223 if (!stream_id_) { 209 if (!stream_id_) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 } 261 }
276 262
277 // Convert the number of pending bytes in the render buffer 263 // Convert the number of pending bytes in the render buffer
278 // into milliseconds. 264 // into milliseconds.
279 int audio_delay_milliseconds = pending_data / bytes_per_ms_; 265 int audio_delay_milliseconds = pending_data / bytes_per_ms_;
280 266
281 TRACE_EVENT0("audio", "AudioDevice::FireRenderCallback"); 267 TRACE_EVENT0("audio", "AudioDevice::FireRenderCallback");
282 268
283 // Update the audio-delay measurement then ask client to render audio. 269 // Update the audio-delay measurement then ask client to render audio.
284 size_t num_frames = render_callback_->Render(audio_data_, 270 size_t num_frames = render_callback_->Render(audio_data_,
285 audio_parameters_.samples_per_packet, audio_delay_milliseconds); 271 audio_parameters_.samples_per_packet(), audio_delay_milliseconds);
286 272
287 // Interleave, scale, and clip to int16. 273 // Interleave, scale, and clip to int16.
288 // TODO(crogers): avoid converting to integer here, and pass the data 274 // TODO(crogers): avoid converting to integer here, and pass the data
289 // to the browser process as float, so we don't lose precision for 275 // to the browser process as float, so we don't lose precision for
290 // audio hardware which has better than 16bit precision. 276 // audio hardware which has better than 16bit precision.
291 int16* data = reinterpret_cast<int16*>(shared_memory_.memory()); 277 int16* data = reinterpret_cast<int16*>(shared_memory_.memory());
292 media::InterleaveFloatToInt16(audio_data_, data, 278 media::InterleaveFloatToInt16(audio_data_, data,
293 audio_parameters_.samples_per_packet); 279 audio_parameters_.samples_per_packet());
294 280
295 // Let the host know we are done. 281 // Let the host know we are done.
296 media::SetActualDataSizeInBytes(&shared_memory_, memory_length_, 282 media::SetActualDataSizeInBytes(&shared_memory_, memory_length_,
297 num_frames * audio_parameters_.channels * sizeof(data[0])); 283 num_frames * audio_parameters_.channels() * sizeof(data[0]));
298 } 284 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698