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 4bae7b93f44caa3cb516935d4d69162d48e3dd4a..addf8c72f32eca4bd5daff45c0538f6937455a62 100644 |
--- a/media/audio/win/core_audio_util_win.cc |
+++ b/media/audio/win/core_audio_util_win.cc |
@@ -76,6 +76,21 @@ bool LoadAudiosesDll() { |
return (LoadLibraryExW(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) != NULL); |
} |
+bool CanCreateDeviceEnumerator() { |
+ ScopedComPtr<IMMDeviceEnumerator> device_enumerator; |
+ HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), |
+ NULL, |
+ CLSCTX_INPROC_SERVER, |
+ __uuidof(IMMDeviceEnumerator), |
+ device_enumerator.ReceiveVoid()); |
+ |
+ // If we hit CO_E_NOTINITIALIZED, CoInitialize has not been called and it |
+ // must be called at least once for each thread that uses the COM library. |
+ CHECK_NE(hr, CO_E_NOTINITIALIZED); |
+ |
+ return SUCCEEDED(hr); |
+} |
+ |
bool CoreAudioUtil::IsSupported() { |
// Microsoft does not plan to make the Core Audio APIs available for use |
// with earlier versions of Windows, including Microsoft Windows Server 2003, |
@@ -90,7 +105,18 @@ bool CoreAudioUtil::IsSupported() { |
// See http://crbug.com/166397 why this extra step is required to guarantee |
// Core Audio support. |
static bool g_audioses_dll_available = LoadAudiosesDll(); |
- return g_audioses_dll_available; |
+ if (!g_audioses_dll_available) |
+ return false; |
+ |
+ // Being able to load the Audioses.dll does not seem to be sufficient for |
+ // all devices to guarantee Core Audio support. To be 100%, we also verify |
+ // that it is possible to a create the IMMDeviceEnumerator interface. If this |
+ // works as well we should be home free. |
+ static bool g_can_create_device_enumerator = CanCreateDeviceEnumerator(); |
+ LOG_IF(ERROR, !g_can_create_device_enumerator) |
+ << "Failed to create Core Audio device enumerator on thread with ID " |
+ << GetCurrentThreadId(); |
+ return g_can_create_device_enumerator; |
} |
base::TimeDelta CoreAudioUtil::RefererenceTimeToTimeDelta(REFERENCE_TIME time) { |
@@ -141,9 +167,8 @@ ScopedComPtr<IMMDeviceEnumerator> CoreAudioUtil::CreateDeviceEnumerator() { |
CLSCTX_INPROC_SERVER, |
__uuidof(IMMDeviceEnumerator), |
device_enumerator.ReceiveVoid()); |
- // CO_E_NOTINITIALIZED is the most likely reason for failure and if that |
- // happens we might as well die here. |
- CHECK(SUCCEEDED(hr)); |
DaleCurtis
2013/03/05 18:36:19
I was thinking you'd keep this CHECK() since we sh
henrika (OOO until Aug 14)
2013/03/05 18:58:51
I can fix that in a separate CL. OK?
|
+ LOG_IF(ERROR, FAILED(hr)) << "IMMDeviceEnumerator::CreateDeviceEnumerator: " |
+ << std::hex << hr; |
return device_enumerator; |
} |