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

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

Issue 8980008: Integrate HTMLMediaElement with Web Audio API's MediaElementAudioSourceNode (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 17 matching lines...) Expand all
28 // with the AUDIO_PCM_LINEAR flag. 28 // with the AUDIO_PCM_LINEAR flag.
29 const size_t kNominalBufferSize = 2048; 29 const size_t kNominalBufferSize = 2048;
30 30
31 if (sample_rate <= 48000) 31 if (sample_rate <= 48000)
32 return kNominalBufferSize; 32 return kNominalBufferSize;
33 else if (sample_rate <= 96000) 33 else if (sample_rate <= 96000)
34 return kNominalBufferSize * 2; 34 return kNominalBufferSize * 2;
35 return kNominalBufferSize * 4; 35 return kNominalBufferSize * 4;
36 } 36 }
37 37
38 AudioRendererImpl::AudioRendererImpl() 38 AudioRendererImpl::AudioRendererImpl(media::AudioRendererSink* sink)
39 : AudioRendererBase(), 39 : AudioRendererBase(),
40 bytes_per_second_(0), 40 bytes_per_second_(0),
41 stopped_(false) { 41 stopped_(false),
42 // We create the AudioDevice here because it must be created in the 42 sink_(sink),
43 // main thread. But we don't yet know the audio format (sample-rate, etc.) 43 is_initialized_(false) {
44 // at this point. Later, when OnInitialize() is called, we have
45 // the audio format information and call the AudioDevice::Initialize()
46 // method to fully initialize it.
47 audio_device_ = new AudioDevice();
48 } 44 }
49 45
50 AudioRendererImpl::~AudioRendererImpl() { 46 AudioRendererImpl::~AudioRendererImpl() {
51 } 47 }
52 48
53 base::TimeDelta AudioRendererImpl::ConvertToDuration(int bytes) { 49 base::TimeDelta AudioRendererImpl::ConvertToDuration(int bytes) {
54 if (bytes_per_second_) { 50 if (bytes_per_second_) {
55 return base::TimeDelta::FromMicroseconds( 51 return base::TimeDelta::FromMicroseconds(
56 base::Time::kMicrosecondsPerSecond * bytes / bytes_per_second_); 52 base::Time::kMicrosecondsPerSecond * bytes / bytes_per_second_);
57 } 53 }
(...skipping 25 matching lines...) Expand all
83 // Please see: http://code.google.com/p/chromium/issues/detail?id=103627 79 // Please see: http://code.google.com/p/chromium/issues/detail?id=103627
84 // for more details. 80 // for more details.
85 audio_parameters_ = AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, 81 audio_parameters_ = AudioParameters(AudioParameters::AUDIO_PCM_LINEAR,
86 channel_layout, 82 channel_layout,
87 sample_rate, 83 sample_rate,
88 bits_per_channel, 84 bits_per_channel,
89 0); 85 0);
90 86
91 bytes_per_second_ = audio_parameters_.GetBytesPerSecond(); 87 bytes_per_second_ = audio_parameters_.GetBytesPerSecond();
92 88
93 DCHECK(audio_device_.get()); 89 DCHECK(sink_.get());
94 90
95 if (!audio_device_->IsInitialized()) { 91 if (!is_initialized_) {
96 audio_device_->Initialize( 92 sink_->Initialize(
97 GetBufferSizeForSampleRate(sample_rate), 93 GetBufferSizeForSampleRate(sample_rate),
98 audio_parameters_.channels, 94 audio_parameters_.channels,
99 audio_parameters_.sample_rate, 95 audio_parameters_.sample_rate,
100 audio_parameters_.format, 96 audio_parameters_.format,
101 this); 97 this);
102 98
103 audio_device_->Start(); 99 sink_->Start();
100 is_initialized_ = true;
101 return true;
104 } 102 }
105 103
106 return true; 104 return false;
107 } 105 }
108 106
109 void AudioRendererImpl::OnStop() { 107 void AudioRendererImpl::OnStop() {
110 if (stopped_) 108 if (stopped_)
111 return; 109 return;
112 110
113 DCHECK(audio_device_.get()); 111 DCHECK(sink_.get());
114 audio_device_->Stop(); 112 sink_->Stop();
115 113
116 stopped_ = true; 114 stopped_ = true;
117 } 115 }
118 116
119 void AudioRendererImpl::SetPlaybackRate(float rate) { 117 void AudioRendererImpl::SetPlaybackRate(float rate) {
120 DCHECK_LE(0.0f, rate); 118 DCHECK_LE(0.0f, rate);
121 119
122 // Handle the case where we stopped due to IO message loop dying. 120 // Handle the case where we stopped due to IO message loop dying.
123 if (stopped_) { 121 if (stopped_) {
124 AudioRendererBase::SetPlaybackRate(rate); 122 AudioRendererBase::SetPlaybackRate(rate);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 if (GetPlaybackRate() != 0.0f) { 160 if (GetPlaybackRate() != 0.0f) {
163 DoPlay(); 161 DoPlay();
164 } else { 162 } else {
165 DoPause(); 163 DoPause();
166 } 164 }
167 } 165 }
168 166
169 void AudioRendererImpl::SetVolume(float volume) { 167 void AudioRendererImpl::SetVolume(float volume) {
170 if (stopped_) 168 if (stopped_)
171 return; 169 return;
172 DCHECK(audio_device_.get()); 170 DCHECK(sink_.get());
173 audio_device_->SetVolume(volume); 171 sink_->SetVolume(volume);
174 } 172 }
175 173
176 void AudioRendererImpl::DoPlay() { 174 void AudioRendererImpl::DoPlay() {
177 earliest_end_time_ = base::Time::Now(); 175 earliest_end_time_ = base::Time::Now();
178 DCHECK(audio_device_.get()); 176 DCHECK(sink_.get());
179 audio_device_->Play(); 177 sink_->Play();
180 } 178 }
181 179
182 void AudioRendererImpl::DoPause() { 180 void AudioRendererImpl::DoPause() {
183 DCHECK(audio_device_.get()); 181 DCHECK(sink_.get());
184 audio_device_->Pause(false); 182 sink_->Pause(false);
185 } 183 }
186 184
187 void AudioRendererImpl::DoSeek() { 185 void AudioRendererImpl::DoSeek() {
188 earliest_end_time_ = base::Time::Now(); 186 earliest_end_time_ = base::Time::Now();
189 187
190 // Pause and flush the stream when we seek to a new location. 188 // Pause and flush the stream when we seek to a new location.
191 DCHECK(audio_device_.get()); 189 DCHECK(sink_.get());
192 audio_device_->Pause(true); 190 sink_->Pause(true);
193 } 191 }
194 192
195 size_t AudioRendererImpl::Render(const std::vector<float*>& audio_data, 193 size_t AudioRendererImpl::Render(const std::vector<float*>& audio_data,
196 size_t number_of_frames, 194 size_t number_of_frames,
197 size_t audio_delay_milliseconds) { 195 size_t audio_delay_milliseconds) {
198 if (stopped_ || GetPlaybackRate() == 0.0f) { 196 if (stopped_ || GetPlaybackRate() == 0.0f) {
199 // Output silence if stopped. 197 // Output silence if stopped.
200 for (size_t i = 0; i < audio_data.size(); ++i) 198 for (size_t i = 0; i < audio_data.size(); ++i)
201 memset(audio_data[i], 0, sizeof(float) * number_of_frames); 199 memset(audio_data[i], 0, sizeof(float) * number_of_frames);
202 return 0; 200 return 0;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 // If FillBuffer() didn't give us enough data then zero out the remainder. 240 // If FillBuffer() didn't give us enough data then zero out the remainder.
243 if (filled_frames < number_of_frames) { 241 if (filled_frames < number_of_frames) {
244 int frames_to_zero = number_of_frames - filled_frames; 242 int frames_to_zero = number_of_frames - filled_frames;
245 memset(audio_data[channel_index] + filled_frames, 243 memset(audio_data[channel_index] + filled_frames,
246 0, 244 0,
247 sizeof(float) * frames_to_zero); 245 sizeof(float) * frames_to_zero);
248 } 246 }
249 } 247 }
250 return filled_frames; 248 return filled_frames;
251 } 249 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698