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/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 12 #include "media/audio/audio_input_proxy.h" |
12 #include "media/audio/audio_output_dispatcher_impl.h" | 13 #include "media/audio/audio_output_dispatcher_impl.h" |
13 #include "media/audio/audio_output_proxy.h" | 14 #include "media/audio/audio_output_proxy.h" |
14 #include "media/audio/audio_output_resampler.h" | 15 #include "media/audio/audio_output_resampler.h" |
15 #include "media/audio/fake_audio_input_stream.h" | 16 #include "media/audio/fake_audio_input_stream.h" |
16 #include "media/audio/fake_audio_output_stream.h" | 17 #include "media/audio/fake_audio_output_stream.h" |
17 #include "media/base/media_switches.h" | 18 #include "media/base/media_switches.h" |
18 | 19 |
19 namespace media { | 20 namespace media { |
20 | 21 |
21 static const int kStreamCloseDelaySeconds = 5; | 22 static const int kStreamCloseDelaySeconds = 5; |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 << num_input_streams_ | 197 << num_input_streams_ |
197 << " exceed the max allowed number " << max_num_input_streams_; | 198 << " exceed the max allowed number " << max_num_input_streams_; |
198 return NULL; | 199 return NULL; |
199 } | 200 } |
200 | 201 |
201 AudioInputStream* stream; | 202 AudioInputStream* stream; |
202 switch (params.format()) { | 203 switch (params.format()) { |
203 case AudioParameters::AUDIO_PCM_LINEAR: | 204 case AudioParameters::AUDIO_PCM_LINEAR: |
204 stream = MakeLinearInputStream(params, device_id); | 205 stream = MakeLinearInputStream(params, device_id); |
205 break; | 206 break; |
206 case AudioParameters::AUDIO_PCM_LOW_LATENCY: | 207 case AudioParameters::AUDIO_PCM_LOW_LATENCY: { |
207 stream = MakeLowLatencyInputStream(params, device_id); | 208 const AudioParameters hardware_params = |
| 209 GetSupportedInputHardwareParameters(device_id, params); |
| 210 input_proxies_.push_back( |
| 211 new AudioInputProxy(this, params, hardware_params, device_id)); |
| 212 stream = static_cast<AudioInputStream*>(input_proxies_.back()); |
208 break; | 213 break; |
| 214 } |
209 case AudioParameters::AUDIO_FAKE: | 215 case AudioParameters::AUDIO_FAKE: |
210 stream = FakeAudioInputStream::MakeFakeStream(this, params); | 216 stream = FakeAudioInputStream::MakeFakeStream(this, params); |
211 break; | 217 break; |
212 default: | 218 default: |
213 stream = NULL; | 219 stream = NULL; |
214 break; | 220 break; |
215 } | 221 } |
216 | 222 |
217 if (stream) { | 223 if (stream) { |
218 ++num_input_streams_; | 224 ++num_input_streams_; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 task_runner_->PostTask(FROM_HERE, base::Bind( | 333 task_runner_->PostTask(FROM_HERE, base::Bind( |
328 &AudioManagerBase::ShutdownOnAudioThread, base::Unretained(this))); | 334 &AudioManagerBase::ShutdownOnAudioThread, base::Unretained(this))); |
329 } | 335 } |
330 | 336 |
331 // Stop() will wait for any posted messages to be processed first. | 337 // Stop() will wait for any posted messages to be processed first. |
332 audio_thread_.Stop(); | 338 audio_thread_.Stop(); |
333 } | 339 } |
334 | 340 |
335 void AudioManagerBase::ShutdownOnAudioThread() { | 341 void AudioManagerBase::ShutdownOnAudioThread() { |
336 DCHECK(task_runner_->BelongsToCurrentThread()); | 342 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 343 DCHECK(input_proxies_.empty()); |
337 while (!output_dispatchers_.empty()) { | 344 while (!output_dispatchers_.empty()) { |
338 output_dispatchers_.back()->dispatcher->Shutdown(); | 345 output_dispatchers_.back()->dispatcher->Shutdown(); |
339 output_dispatchers_.pop_back(); | 346 output_dispatchers_.pop_back(); |
340 } | 347 } |
| 348 |
| 349 while (!input_proxies_.empty()) |
| 350 input_proxies_.pop_back(); |
341 } | 351 } |
342 | 352 |
343 void AudioManagerBase::AddOutputDeviceChangeListener( | 353 void AudioManagerBase::AddOutputDeviceChangeListener( |
344 AudioDeviceListener* listener) { | 354 AudioDeviceListener* listener) { |
345 DCHECK(task_runner_->BelongsToCurrentThread()); | 355 DCHECK(task_runner_->BelongsToCurrentThread()); |
346 output_listeners_.AddObserver(listener); | 356 output_listeners_.AddObserver(listener); |
347 } | 357 } |
348 | 358 |
349 void AudioManagerBase::RemoveOutputDeviceChangeListener( | 359 void AudioManagerBase::RemoveOutputDeviceChangeListener( |
350 AudioDeviceListener* listener) { | 360 AudioDeviceListener* listener) { |
(...skipping 13 matching lines...) Expand all Loading... |
364 } | 374 } |
365 | 375 |
366 AudioParameters AudioManagerBase::GetOutputStreamParameters( | 376 AudioParameters AudioManagerBase::GetOutputStreamParameters( |
367 const std::string& device_id) { | 377 const std::string& device_id) { |
368 return GetPreferredOutputStreamParameters(device_id, | 378 return GetPreferredOutputStreamParameters(device_id, |
369 AudioParameters()); | 379 AudioParameters()); |
370 } | 380 } |
371 | 381 |
372 AudioParameters AudioManagerBase::GetInputStreamParameters( | 382 AudioParameters AudioManagerBase::GetInputStreamParameters( |
373 const std::string& device_id) { | 383 const std::string& device_id) { |
374 NOTREACHED(); | 384 return GetPreferredInputStreamParameters(device_id, |
375 return AudioParameters(); | 385 AudioParameters()); |
376 } | 386 } |
377 | 387 |
378 std::string AudioManagerBase::GetAssociatedOutputDeviceID( | 388 std::string AudioManagerBase::GetAssociatedOutputDeviceID( |
379 const std::string& input_device_id) { | 389 const std::string& input_device_id) { |
380 return ""; | 390 return ""; |
381 } | 391 } |
382 | 392 |
383 std::string AudioManagerBase::GetDefaultOutputDeviceID() { | 393 std::string AudioManagerBase::GetDefaultOutputDeviceID() { |
384 return ""; | 394 return ""; |
385 } | 395 } |
386 | 396 |
387 int AudioManagerBase::GetUserBufferSize() { | 397 int AudioManagerBase::GetUserBufferSize() { |
388 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 398 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
389 int buffer_size = 0; | 399 int buffer_size = 0; |
390 std::string buffer_size_str(cmd_line->GetSwitchValueASCII( | 400 std::string buffer_size_str(cmd_line->GetSwitchValueASCII( |
391 switches::kAudioBufferSize)); | 401 switches::kAudioBufferSize)); |
392 if (base::StringToInt(buffer_size_str, &buffer_size) && buffer_size > 0) | 402 if (base::StringToInt(buffer_size_str, &buffer_size) && buffer_size > 0) |
393 return buffer_size; | 403 return buffer_size; |
394 | 404 |
395 return 0; | 405 return 0; |
396 } | 406 } |
397 | 407 |
398 scoped_ptr<AudioLog> AudioManagerBase::CreateAudioLog( | 408 scoped_ptr<AudioLog> AudioManagerBase::CreateAudioLog( |
399 AudioLogFactory::AudioComponent component) { | 409 AudioLogFactory::AudioComponent component) { |
400 return audio_log_factory_->CreateAudioLog(component); | 410 return audio_log_factory_->CreateAudioLog(component); |
401 } | 411 } |
402 | 412 |
| 413 AudioParameters AudioManagerBase::GetSupportedInputHardwareParameters( |
| 414 const std::string& device_id, const AudioParameters& preferred_params) { |
| 415 // Delete all the idle input proxy streams. |
| 416 for (AudioInputProxies::iterator iter = input_proxies_.begin(); |
| 417 iter != input_proxies_.end();) { |
| 418 if ((*iter)->is_idle()) |
| 419 input_proxies_.erase(iter++); |
| 420 else |
| 421 ++iter; |
| 422 } |
| 423 |
| 424 //#if defined(OS_MACOSX) |
| 425 // Find out if the existing streams using different format to open |
| 426 // the device, if there is any, we should force all the existing streams and |
| 427 // the new stream to use the native hardware parameters. |
| 428 AudioParameters use_native_params; |
| 429 for (AudioInputProxies::iterator iter = input_proxies_.begin(); |
| 430 iter != input_proxies_.end(); ++iter) { |
| 431 if ((*iter)->device_id() == device_id && |
| 432 (*iter)->input_parameters() != preferred_params) { |
| 433 if (!use_native_params.IsValid()) { |
| 434 use_native_params = GetInputStreamParameters(device_id); |
| 435 DCHECK(use_native_params.IsValid()); |
| 436 } |
| 437 |
| 438 (*iter)->MaybeRestartStream(use_native_params); |
| 439 } |
| 440 } |
| 441 |
| 442 if (use_native_params.IsValid()) |
| 443 return use_native_params; |
| 444 //#endif |
| 445 |
| 446 return preferred_params; |
| 447 } |
| 448 |
403 } // namespace media | 449 } // namespace media |
OLD | NEW |