Nikolay Sivov (@nsivov) commented about dlls/mf/sac.c:
- if (FAILED(hr = IMMDeviceCollection_GetCount(devices, &count)))
goto done;- sources = CoTaskMemAlloc(count * sizeof(*sources));
- for (i = 0; i < count; ++i)
- {
WCHAR symbolic_link[256];IPropertyStore *ps;IMMDevice *device;PROPVARIANT pv;WCHAR *str;if (FAILED(hr = create_activation_object(NULL, &audio_capture_activate_funcs, &sources[i])))goto done;++created_count;IMFActivate_SetGUID(sources[i], &MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, &MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID);
To handle failures in individual Set methods we have things like mediatype_set_guid() in mfplat, that take &hr argument to set error code appropriately without introducing more cleanup conditions.