Media Foundation Programming--Enumerate the video or audio device

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, &param.ppDevices, &param.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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章