Commit acef5672 authored by David Reid's avatar David Reid

WASAPI: Fix an error with device enumeration.

There are two problems with this:

 * The pInfo buffer is being accessed when set to NULL
 * The count is not getting set correctly when pInfo = NULL
parent e3e1ab19
...@@ -3076,47 +3076,54 @@ static mal_result mal_enumerate_devices__wasapi(mal_context* pContext, mal_devic ...@@ -3076,47 +3076,54 @@ static mal_result mal_enumerate_devices__wasapi(mal_context* pContext, mal_devic
return mal_context_post_error(pContext, NULL, "[WASAPI] Failed to get device count.", MAL_NO_DEVICE); return mal_context_post_error(pContext, NULL, "[WASAPI] Failed to get device count.", MAL_NO_DEVICE);
} }
for (mal_uint32 iDevice = 0; iDevice < infoSize && iDevice < count; ++iDevice) { for (mal_uint32 iDevice = 0; iDevice < count; ++iDevice) {
mal_zero_object(pInfo); if (pInfo != NULL) {
if (infoSize > 0) {
mal_zero_object(pInfo);
IMMDevice* pDevice; IMMDevice* pDevice;
hr = IMMDeviceCollection_Item(pDeviceCollection, iDevice, &pDevice); hr = IMMDeviceCollection_Item(pDeviceCollection, iDevice, &pDevice);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
// ID. // ID.
LPWSTR id; LPWSTR id;
hr = IMMDevice_GetId(pDevice, &id); hr = IMMDevice_GetId(pDevice, &id);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
size_t idlen = wcslen(id); size_t idlen = wcslen(id);
if (idlen+sizeof(wchar_t) > sizeof(pInfo->id.wasapi)) { if (idlen+sizeof(wchar_t) > sizeof(pInfo->id.wasapi)) {
mal_CoTaskMemFree(pContext, id); mal_CoTaskMemFree(pContext, id);
mal_assert(MAL_FALSE); // NOTE: If this is triggered, please report it. It means the format of the ID must haved change and is too long to fit in our fixed sized buffer. mal_assert(MAL_FALSE); // NOTE: If this is triggered, please report it. It means the format of the ID must haved change and is too long to fit in our fixed sized buffer.
continue; continue;
} }
memcpy(pInfo->id.wasapi, id, idlen * sizeof(wchar_t)); memcpy(pInfo->id.wasapi, id, idlen * sizeof(wchar_t));
pInfo->id.wasapi[idlen] = '\0'; pInfo->id.wasapi[idlen] = '\0';
mal_CoTaskMemFree(pContext, id); mal_CoTaskMemFree(pContext, id);
} }
// Description / Friendly Name. // Description / Friendly Name.
IPropertyStore *pProperties; IPropertyStore *pProperties;
hr = IMMDevice_OpenPropertyStore(pDevice, STGM_READ, &pProperties); hr = IMMDevice_OpenPropertyStore(pDevice, STGM_READ, &pProperties);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
PROPVARIANT varName; PROPVARIANT varName;
PropVariantInit(&varName); PropVariantInit(&varName);
hr = IPropertyStore_GetValue(pProperties, g_malPKEY_Device_FriendlyName, &varName); hr = IPropertyStore_GetValue(pProperties, g_malPKEY_Device_FriendlyName, &varName);
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
WideCharToMultiByte(CP_UTF8, 0, varName.pwszVal, -1, pInfo->name, sizeof(pInfo->name), 0, FALSE); WideCharToMultiByte(CP_UTF8, 0, varName.pwszVal, -1, pInfo->name, sizeof(pInfo->name), 0, FALSE);
mal_PropVariantClear(pContext, &varName); mal_PropVariantClear(pContext, &varName);
}
IPropertyStore_Release(pProperties);
}
} }
IPropertyStore_Release(pProperties); pInfo += 1;
infoSize -= 1;
*pCount += 1;
} }
} else {
*pCount += 1;
} }
pInfo += 1;
*pCount += 1;
} }
IMMDeviceCollection_Release(pDeviceCollection); IMMDeviceCollection_Release(pDeviceCollection);
...@@ -10217,6 +10224,7 @@ void mal_pcm_f32_to_s32(int* pOut, const float* pIn, unsigned int count) ...@@ -10217,6 +10224,7 @@ void mal_pcm_f32_to_s32(int* pOut, const float* pIn, unsigned int count)
// which is by design. // which is by design.
// - ALSA: Add support for excluding the "null" device using the alsa.excludeNullDevice context config variable. // - ALSA: Add support for excluding the "null" device using the alsa.excludeNullDevice context config variable.
// - ALSA: Fix a bug with channel mapping which causes an assertion to fail. // - ALSA: Fix a bug with channel mapping which causes an assertion to fail.
// - WASAPI: Fix device enumeration when passing NULL to the pInfo parameter.
// //
// v0.4 - 2017-11-05 // v0.4 - 2017-11-05
// - API CHANGE: The log callback is now per-context rather than per-device and as is thus now passed to // - API CHANGE: The log callback is now per-context rather than per-device and as is thus now passed to
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment