Index: media/audio/audio_manager_base.cc |
diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc |
index 3b36b106fa681659dc78b6e894a1965a7d93cae4..6d328af274cfffe8052b83be93f7f9d232de6281 100644 |
--- a/media/audio/audio_manager_base.cc |
+++ b/media/audio/audio_manager_base.cc |
@@ -9,6 +9,7 @@ |
#include "base/command_line.h" |
#include "base/strings/string_number_conversions.h" |
#include "build/build_config.h" |
+#include "media/audio/audio_input_proxy.h" |
#include "media/audio/audio_output_dispatcher_impl.h" |
#include "media/audio/audio_output_proxy.h" |
#include "media/audio/audio_output_resampler.h" |
@@ -203,9 +204,14 @@ AudioInputStream* AudioManagerBase::MakeAudioInputStream( |
case AudioParameters::AUDIO_PCM_LINEAR: |
stream = MakeLinearInputStream(params, device_id); |
break; |
- case AudioParameters::AUDIO_PCM_LOW_LATENCY: |
- stream = MakeLowLatencyInputStream(params, device_id); |
+ case AudioParameters::AUDIO_PCM_LOW_LATENCY: { |
+ const AudioParameters hardware_params = |
+ GetSupportedInputHardwareParameters(device_id, params); |
+ input_proxies_.push_back( |
+ new AudioInputProxy(this, params, hardware_params, device_id)); |
+ stream = static_cast<AudioInputStream*>(input_proxies_.back()); |
break; |
+ } |
case AudioParameters::AUDIO_FAKE: |
stream = FakeAudioInputStream::MakeFakeStream(this, params); |
break; |
@@ -334,10 +340,14 @@ void AudioManagerBase::Shutdown() { |
void AudioManagerBase::ShutdownOnAudioThread() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
+ DCHECK(input_proxies_.empty()); |
while (!output_dispatchers_.empty()) { |
output_dispatchers_.back()->dispatcher->Shutdown(); |
output_dispatchers_.pop_back(); |
} |
+ |
+ while (!input_proxies_.empty()) |
+ input_proxies_.pop_back(); |
} |
void AudioManagerBase::AddOutputDeviceChangeListener( |
@@ -371,8 +381,8 @@ AudioParameters AudioManagerBase::GetOutputStreamParameters( |
AudioParameters AudioManagerBase::GetInputStreamParameters( |
const std::string& device_id) { |
- NOTREACHED(); |
- return AudioParameters(); |
+ return GetPreferredInputStreamParameters(device_id, |
+ AudioParameters()); |
} |
std::string AudioManagerBase::GetAssociatedOutputDeviceID( |
@@ -400,4 +410,40 @@ scoped_ptr<AudioLog> AudioManagerBase::CreateAudioLog( |
return audio_log_factory_->CreateAudioLog(component); |
} |
+AudioParameters AudioManagerBase::GetSupportedInputHardwareParameters( |
+ const std::string& device_id, const AudioParameters& preferred_params) { |
+ // Delete all the idle input proxy streams. |
+ for (AudioInputProxies::iterator iter = input_proxies_.begin(); |
+ iter != input_proxies_.end();) { |
+ if ((*iter)->is_idle()) |
+ input_proxies_.erase(iter++); |
+ else |
+ ++iter; |
+ } |
+ |
+//#if defined(OS_MACOSX) |
+ // Find out if the existing streams using different format to open |
+ // the device, if there is any, we should force all the existing streams and |
+ // the new stream to use the native hardware parameters. |
+ AudioParameters use_native_params; |
+ for (AudioInputProxies::iterator iter = input_proxies_.begin(); |
+ iter != input_proxies_.end(); ++iter) { |
+ if ((*iter)->device_id() == device_id && |
+ (*iter)->input_parameters() != preferred_params) { |
+ if (!use_native_params.IsValid()) { |
+ use_native_params = GetInputStreamParameters(device_id); |
+ DCHECK(use_native_params.IsValid()); |
+ } |
+ |
+ (*iter)->MaybeRestartStream(use_native_params); |
+ } |
+ } |
+ |
+ if (use_native_params.IsValid()) |
+ return use_native_params; |
+//#endif |
+ |
+ return preferred_params; |
+} |
+ |
} // namespace media |