Define a device parameter struct:
struct ChooseDeviceParam
{
IMFActivate **ppDevices; // Array of IMFActivate pointers.
UINT32 count; // Number of elements in the array.
UINT32 selection; // Selected device, by array index.
};
HRESULT hr = S_OK;
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
{
hr = MFStartup(MF_VERSION);
}
ChooseDeviceParam param = { 0 };
IMFAttributes *pAttributes = NULL;
// Initialize an attribute store to specify enumeration parameters.
HRESULT hr = MFCreateAttributes(&pAttributes, 1);
if (SUCCEEDED(hr))
{
// Ask for source type = video or audio capture devices.
hr = pAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID
);
//hr = pAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
// MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
// );
if (SUCCEEDED(hr))
{
// Enumerate devices.
hr = MFEnumDeviceSources(pAttributes, ¶m.ppDevices, ¶m.count);
if (SUCCEEDED(hr))
{
for (DWORD i = 0; i < param.count; i++)
{
WCHAR *szFriendlyName = NULL;
hr = param.ppDevices[i]->GetAllocatedString(
MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME,
&szFriendlyName,
NULL
);
if (FAILED(hr))
{
break;
}
CoTaskMemFree(szFriendlyName);
}
}
}
}
MFShutdown();
CoUninitialize();