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

Side by Side Diff: content/renderer/media/audio_renderer_impl.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_renderer_impl.h" 5 #include "content/renderer/media/audio_renderer_impl.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 predicted_play_time = base::TimeDelta::FromMicroseconds( 46 predicted_play_time = base::TimeDelta::FromMicroseconds(
47 static_cast<int64>(ceil(predicted_play_time.InMicroseconds() * 47 static_cast<int64>(ceil(predicted_play_time.InMicroseconds() *
48 playback_rate))); 48 playback_rate)));
49 } 49 }
50 earliest_end_time_ = 50 earliest_end_time_ =
51 std::max(earliest_end_time_, 51 std::max(earliest_end_time_,
52 time_now + request_delay + predicted_play_time); 52 time_now + request_delay + predicted_play_time);
53 } 53 }
54 } 54 }
55 55
56 bool AudioRendererImpl::OnInitialize(int bits_per_channel, 56 bool AudioRendererImpl::OnInitialize(int bits_per_channel,
vrk (LEFT CHROMIUM) 2012/03/09 20:59:32 This should also probably be changed to use AudioP
scherkus (not reviewing) 2012/03/09 21:48:59 SGTM
57 ChannelLayout channel_layout, 57 ChannelLayout channel_layout,
58 int sample_rate) { 58 int sample_rate) {
59 // We use the AUDIO_PCM_LINEAR flag because AUDIO_PCM_LOW_LATENCY 59 // We use the AUDIO_PCM_LINEAR flag because AUDIO_PCM_LOW_LATENCY
60 // does not currently support all the sample-rates that we require. 60 // does not currently support all the sample-rates that we require.
61 // Please see: http://code.google.com/p/chromium/issues/detail?id=103627 61 // Please see: http://code.google.com/p/chromium/issues/detail?id=103627
62 // for more details. 62 // for more details.
63 audio_parameters_ = AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, 63 audio_parameters_.Reset(
64 channel_layout, 64 AudioParameters::AUDIO_PCM_LINEAR,
65 sample_rate, 65 channel_layout, sample_rate, bits_per_channel,
66 bits_per_channel, 66 audio_hardware::GetHighLatencyOutputBufferSize(sample_rate));
67 0);
68 67
69 bytes_per_second_ = audio_parameters_.GetBytesPerSecond(); 68 bytes_per_second_ = audio_parameters_.GetBytesPerSecond();
70 69
71 DCHECK(sink_.get()); 70 DCHECK(sink_.get());
72 71
73 if (!is_initialized_) { 72 if (!is_initialized_) {
74 sink_->Initialize( 73 sink_->Initialize(audio_parameters_, this);
75 audio_hardware::GetHighLatencyOutputBufferSize(sample_rate),
76 audio_parameters_.channels,
77 audio_parameters_.sample_rate,
78 audio_parameters_.format,
79 this);
80 74
81 sink_->Start(); 75 sink_->Start();
82 is_initialized_ = true; 76 is_initialized_ = true;
83 return true; 77 return true;
84 } 78 }
85 79
86 return false; 80 return false;
87 } 81 }
88 82
89 void AudioRendererImpl::OnStop() { 83 void AudioRendererImpl::OnStop() {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 base::TimeDelta request_delay = 180 base::TimeDelta request_delay =
187 base::TimeDelta::FromMilliseconds(audio_delay_milliseconds); 181 base::TimeDelta::FromMilliseconds(audio_delay_milliseconds);
188 182
189 // Finally we need to adjust the delay according to playback rate. 183 // Finally we need to adjust the delay according to playback rate.
190 if (GetPlaybackRate() != 1.0f) { 184 if (GetPlaybackRate() != 1.0f) {
191 request_delay = base::TimeDelta::FromMicroseconds( 185 request_delay = base::TimeDelta::FromMicroseconds(
192 static_cast<int64>(ceil(request_delay.InMicroseconds() * 186 static_cast<int64>(ceil(request_delay.InMicroseconds() *
193 GetPlaybackRate()))); 187 GetPlaybackRate())));
194 } 188 }
195 189
196 uint32 bytes_per_frame = 190 uint32 bytes_per_frame =
scherkus (not reviewing) 2012/03/09 21:48:59 isn't there a function on AudioParameters for this
vrk (LEFT CHROMIUM) 2012/03/16 18:30:41 There isn't, but while I'm here I can add one! Mos
197 audio_parameters_.bits_per_sample * audio_parameters_.channels / 8; 191 audio_parameters_.bits_per_sample() * audio_parameters_.channels() / 8;
198 192
199 const size_t buf_size = number_of_frames * bytes_per_frame; 193 const size_t buf_size = number_of_frames * bytes_per_frame;
200 scoped_array<uint8> buf(new uint8[buf_size]); 194 scoped_array<uint8> buf(new uint8[buf_size]);
201 195
202 uint32 frames_filled = FillBuffer(buf.get(), number_of_frames, request_delay); 196 uint32 frames_filled = FillBuffer(buf.get(), number_of_frames, request_delay);
203 uint32 bytes_filled = frames_filled * bytes_per_frame; 197 uint32 bytes_filled = frames_filled * bytes_per_frame;
204 DCHECK_LE(bytes_filled, buf_size); 198 DCHECK_LE(bytes_filled, buf_size);
205 UpdateEarliestEndTime(bytes_filled, request_delay, base::Time::Now()); 199 UpdateEarliestEndTime(bytes_filled, request_delay, base::Time::Now());
206 200
207 // Deinterleave each audio channel. 201 // Deinterleave each audio channel.
(...skipping 19 matching lines...) Expand all
227 221
228 void AudioRendererImpl::OnRenderError() { 222 void AudioRendererImpl::OnRenderError() {
229 host()->DisableAudioRenderer(); 223 host()->DisableAudioRenderer();
230 } 224 }
231 225
232 void AudioRendererImpl::OnRenderEndOfStream() { 226 void AudioRendererImpl::OnRenderEndOfStream() {
233 // TODO(enal): schedule callback instead of polling. 227 // TODO(enal): schedule callback instead of polling.
234 if (base::Time::Now() >= earliest_end_time_) 228 if (base::Time::Now() >= earliest_end_time_)
235 SignalEndOfStream(); 229 SignalEndOfStream();
236 } 230 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698