Index: media/audio/win/audio_device_listener_win.cc |
diff --git a/media/audio/win/audio_device_listener_win.cc b/media/audio/win/audio_device_listener_win.cc |
index 9312af62cc78b7d3239a10d306c79a6468a74284..78e84302896fc2c15649f06b769308fc2c2c8d35 100644 |
--- a/media/audio/win/audio_device_listener_win.cc |
+++ b/media/audio/win/audio_device_listener_win.cc |
@@ -7,6 +7,7 @@ |
#include <Audioclient.h> |
#include "base/logging.h" |
+#include "base/system_monitor/system_monitor.h" |
#include "base/utf_string_conversions.h" |
#include "base/win/scoped_co_mem.h" |
#include "base/win/windows_version.h" |
@@ -18,7 +19,8 @@ using base::win::ScopedCoMem; |
namespace media { |
AudioDeviceListenerWin::AudioDeviceListenerWin(const base::Closure& listener_cb) |
- : listener_cb_(listener_cb) { |
+ : listener_cb_(listener_cb), |
+ pending_capture_device_changed_(false) { |
CHECK(CoreAudioUtil::IsSupported()); |
ScopedComPtr<IMMDeviceEnumerator> device_enumerator( |
@@ -101,12 +103,24 @@ STDMETHODIMP AudioDeviceListenerWin::OnDeviceRemoved(LPCWSTR device_id) { |
STDMETHODIMP AudioDeviceListenerWin::OnDeviceStateChanged(LPCWSTR device_id, |
DWORD new_state) { |
+ if (!pending_capture_device_changed_) |
+ return S_OK; |
+ |
+ base::SystemMonitor* monitor = base::SystemMonitor::Get(); |
+ if (monitor) |
+ monitor->ProcessDevicesChanged(base::SystemMonitor::DEVTYPE_AUDIO_CAPTURE); |
+ |
+ pending_capture_device_changed_ = false; |
return S_OK; |
} |
STDMETHODIMP AudioDeviceListenerWin::OnDefaultDeviceChanged( |
EDataFlow flow, ERole role, LPCWSTR new_default_device_id) { |
- // Only listen for output device changes right now... |
+ if (role == eCapture) { |
+ pending_capture_device_changed_ = true; |
+ return S_OK; |
+ } |
+ |
if (flow != eConsole && role != eRender) |
return S_OK; |