OLD | NEW |
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 "media/audio/audio_manager_base.h" | 5 #include "media/audio/audio_manager_base.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/message_loop_proxy.h" | 10 #include "base/message_loop_proxy.h" |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 | 175 |
176 bool use_audio_output_resampler = | 176 bool use_audio_output_resampler = |
177 !CommandLine::ForCurrentProcess()->HasSwitch( | 177 !CommandLine::ForCurrentProcess()->HasSwitch( |
178 switches::kDisableAudioOutputResampler) && | 178 switches::kDisableAudioOutputResampler) && |
179 params.format() == AudioParameters::AUDIO_PCM_LOW_LATENCY; | 179 params.format() == AudioParameters::AUDIO_PCM_LOW_LATENCY; |
180 | 180 |
181 // If we're not using AudioOutputResampler our output parameters are the same | 181 // If we're not using AudioOutputResampler our output parameters are the same |
182 // as our input parameters. | 182 // as our input parameters. |
183 AudioParameters output_params = params; | 183 AudioParameters output_params = params; |
184 if (use_audio_output_resampler) { | 184 if (use_audio_output_resampler) { |
185 output_params = GetPreferredLowLatencyOutputStreamParameters(params); | 185 output_params = GetPreferredOutputStreamParameters(params); |
186 | 186 |
187 // Ensure we only pass on valid output parameters. | 187 // Ensure we only pass on valid output parameters. |
188 if (!output_params.IsValid()) { | 188 if (!output_params.IsValid()) { |
189 // We've received invalid audio output parameters, so switch to a mock | 189 // We've received invalid audio output parameters, so switch to a mock |
190 // output device based on the input parameters. This may happen if the OS | 190 // output device based on the input parameters. This may happen if the OS |
191 // provided us junk values for the hardware configuration. | 191 // provided us junk values for the hardware configuration. |
192 LOG(ERROR) << "Invalid audio output parameters received; using fake " | 192 LOG(ERROR) << "Invalid audio output parameters received; using fake " |
193 << "audio path. Channels: " << output_params.channels() << ", " | 193 << "audio path. Channels: " << output_params.channels() << ", " |
194 << "Sample Rate: " << output_params.sample_rate() << ", " | 194 << "Sample Rate: " << output_params.sample_rate() << ", " |
195 << "Bits Per Sample: " << output_params.bits_per_sample() | 195 << "Bits Per Sample: " << output_params.bits_per_sample() |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 // So, better crash now than later. | 310 // So, better crash now than later. |
311 DCHECK(dispatcher->HasOneRef()) << "AudioOutputProxies are still alive"; | 311 DCHECK(dispatcher->HasOneRef()) << "AudioOutputProxies are still alive"; |
312 dispatcher = NULL; | 312 dispatcher = NULL; |
313 } | 313 } |
314 } | 314 } |
315 | 315 |
316 output_dispatchers_.clear(); | 316 output_dispatchers_.clear(); |
317 #endif // defined(OS_IOS) | 317 #endif // defined(OS_IOS) |
318 } | 318 } |
319 | 319 |
320 AudioParameters AudioManagerBase::GetPreferredLowLatencyOutputStreamParameters( | |
321 const AudioParameters& input_params) { | |
322 #if defined(OS_IOS) | |
323 // IOS implements audio input only. | |
324 NOTIMPLEMENTED(); | |
325 return AudioParameters(); | |
326 #else | |
327 // TODO(dalecurtis): This should include bits per channel and channel layout | |
328 // eventually. | |
329 return AudioParameters( | |
330 AudioParameters::AUDIO_PCM_LOW_LATENCY, | |
331 input_params.channel_layout(), input_params.input_channels(), | |
332 GetAudioHardwareSampleRate(), 16, GetAudioHardwareBufferSize()); | |
333 #endif // defined(OS_IOS) | |
334 } | |
335 | |
336 void AudioManagerBase::AddOutputDeviceChangeListener( | 320 void AudioManagerBase::AddOutputDeviceChangeListener( |
337 AudioDeviceListener* listener) { | 321 AudioDeviceListener* listener) { |
338 DCHECK(message_loop_->BelongsToCurrentThread()); | 322 DCHECK(message_loop_->BelongsToCurrentThread()); |
339 output_listeners_.AddObserver(listener); | 323 output_listeners_.AddObserver(listener); |
340 } | 324 } |
341 | 325 |
342 void AudioManagerBase::RemoveOutputDeviceChangeListener( | 326 void AudioManagerBase::RemoveOutputDeviceChangeListener( |
343 AudioDeviceListener* listener) { | 327 AudioDeviceListener* listener) { |
344 DCHECK(message_loop_->BelongsToCurrentThread()); | 328 DCHECK(message_loop_->BelongsToCurrentThread()); |
345 output_listeners_.RemoveObserver(listener); | 329 output_listeners_.RemoveObserver(listener); |
346 } | 330 } |
347 | 331 |
348 void AudioManagerBase::NotifyAllOutputDeviceChangeListeners() { | 332 void AudioManagerBase::NotifyAllOutputDeviceChangeListeners() { |
349 DCHECK(message_loop_->BelongsToCurrentThread()); | 333 DCHECK(message_loop_->BelongsToCurrentThread()); |
350 DVLOG(1) << "Firing OnDeviceChange() notifications."; | 334 DVLOG(1) << "Firing OnDeviceChange() notifications."; |
351 FOR_EACH_OBSERVER(AudioDeviceListener, output_listeners_, OnDeviceChange()); | 335 FOR_EACH_OBSERVER(AudioDeviceListener, output_listeners_, OnDeviceChange()); |
352 } | 336 } |
353 | 337 |
| 338 AudioParameters AudioManagerBase::GetDefaultOutputStreamParameters() { |
| 339 return GetPreferredOutputStreamParameters(AudioParameters()); |
| 340 } |
| 341 |
| 342 AudioParameters AudioManagerBase::GetInputStreamParameters( |
| 343 const std::string& device_id) { |
| 344 NOTREACHED(); |
| 345 return AudioParameters(); |
| 346 } |
| 347 |
354 } // namespace media | 348 } // namespace media |
OLD | NEW |