| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |