Index: media/audio/win/core_audio_util_win.cc |
diff --git a/media/audio/win/core_audio_util_win.cc b/media/audio/win/core_audio_util_win.cc |
index 51623955be189afc67c19644185c692b80edd06d..71e8d717f62f4ea2fb164167487a5efd35676644 100644 |
--- a/media/audio/win/core_audio_util_win.cc |
+++ b/media/audio/win/core_audio_util_win.cc |
@@ -230,6 +230,18 @@ ScopedComPtr<IMMDeviceEnumerator> CoreAudioUtil::CreateDeviceEnumerator() { |
ScopedComPtr<IMMDeviceEnumerator> device_enumerator; |
HRESULT hr = device_enumerator.CreateInstance(__uuidof(MMDeviceEnumerator), |
NULL, CLSCTX_INPROC_SERVER); |
+ if (hr == CO_E_NOTINITIALIZED) { |
+ LOG(ERROR) << "CoCreateInstance fails with CO_E_NOTINITIALIZED"; |
+ // We have seen crashes which indicates that this method can in fact |
+ // fail with CO_E_NOTINITIALIZED in combination with certain 3rd party |
+ // modules. Calling CoInitializeEx is an attempt to resolve the reported |
+ // issues. See http://crbug.com/378465 for details. |
+ hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); |
+ if (SUCCEEDED(hr)) { |
+ hr = device_enumerator.CreateInstance(__uuidof(MMDeviceEnumerator), |
+ NULL, CLSCTX_INPROC_SERVER); |
+ } |
+ } |
CHECK(SUCCEEDED(hr)); |
return device_enumerator; |
} |