Windows Media Foundation 枚举音频设备

Windows Media Foundation Enumerate audio devices

我使用了 Microsoft MSDN 提供的教程来枚举音频设备。

枚举代码如下:

HRESULT CreateAudioDeviceSource(IMFMediaSource **ppSource)
{
    *ppSource = NULL;

    IMFMediaSource *pSource = NULL;
    IMFAttributes *pAttributes = NULL;
    IMFActivate **ppDevices = NULL;

    // Create an attribute store to specify the enumeration parameters.
    HRESULT hr = MFCreateAttributes(&pAttributes, 1);
    if (FAILED(hr))
    {
        goto done;
    }

    // Source type: audio capture devices
    hr = pAttributes->SetGUID(
        MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
        MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID
        );
    if (FAILED(hr))
    {
        goto done;
    }

    // Enumerate devices.
    UINT32 count;
    hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count);

    std::cout << count;



    if (FAILED(hr))
    {
        std::cout << "Enum Failed"; 
        goto done;
    }

    if (count == 0)
    {
        std::cout << "empty";
        hr = E_FAIL;
        goto done;
    }

    // Create the media source object.
    hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource));
    if (FAILED(hr))
    {
        goto done;
    }


    *ppSource = pSource;
    (*ppSource)->AddRef();

done:
    SafeRelease(&pAttributes);

    for (DWORD i = 0; i < count; i++)
    {
        SafeRelease(&ppDevices[i]);
    }
    CoTaskMemFree(ppDevices);
    SafeRelease(&pSource);
    return hr;
}

但是我调用枚举设备的函数失败了。我收到消息 "Enum Failed"。所以我不知道为什么会出现这个问题。

拜托,非常感谢!

参考:https://msdn.microsoft.com/en-us/library/dd317912(v=vs.85).aspx

示例代码 Windows Media Foundation 枚举音频设备,设备捕获 struct

struct CaptureDeviceParam
{
    /// <summary>
    /// The array of devices.
    /// </summary>
    IMFActivate **ppDevices;
    /// <summary>
    /// Device count.
    /// </summary>
    UINT32      count;
    /// <summary>
    /// Device selection.
    /// </summary>
    UINT32      selection;
};

enum设备方法。

        /// <summary>
        /// Get the audio capture devices.
        /// </summary>
        /// <param name="param">The capture device param.</param>
        void MediaCapture::GetAudioCaptureDevices(CaptureDeviceParam *param)
        {
            HRESULT hr = S_OK;
            IMFAttributes *pAttributes = NULL;

            // Initialize an attribute store to specify enumeration parameters.
            hr = MFCreateAttributes(&pAttributes, 1);

            // Ask for source type = audio capture devices
            if (SUCCEEDED(hr))
            {
                // Set the device attribute.
                hr = pAttributes->SetGUID(
                    MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
                    MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID
                );
            }

            // Enumerate devices.
            if (SUCCEEDED(hr))
            {
                // Enumerate the device list.
                hr = MFEnumDeviceSources(pAttributes, &(*param).ppDevices, &(*param).count);
            }

            // Safe release.
            SafeRelease(&pAttributes);
        }

GetAudioCaptureDevices是'MediaCapture'class中的静态方法,可以随时调用。