显示windows的音频的输入输出设备

#include "stdafx.h"

/************************音频的输入输出设备**************************/

#include <Mmdeviceapi.h>
#include <Functiondiscoverykeys_devpkey.h>
#include <locale.h>

#define EXIT_ON_ERROR(hres)  
              if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk)  
              if ((punk) != NULL)  
                             { (punk)->Release(); (punk) = NULL; }

const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);

void PrintEndpointNames()
{
    HRESULT hr = S_OK;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDeviceCollection *pRenderCollection = NULL;
    IMMDeviceCollection *pCaptureCollection = NULL;
    IMMDevice *pEndpoint = NULL;
    IPropertyStore *pProps = NULL;
    LPWSTR pwszID = NULL;

    hr = CoCreateInstance(
        CLSID_MMDeviceEnumerator, NULL,
        CLSCTX_ALL, IID_IMMDeviceEnumerator,
        (void**)&pEnumerator);
    EXIT_ON_ERROR(hr)

        //switch eRender or eCapture
        hr = pEnumerator->EnumAudioEndpoints(
        eCapture, DEVICE_STATE_ACTIVE,
        &pRenderCollection);

    EXIT_ON_ERROR(hr)

        UINT  count;
    hr = pRenderCollection->GetCount(&count);

    EXIT_ON_ERROR(hr)

        if (count == 0)
        {
            printf("No endpoints found.
");
        }

    // Each loop prints the name of an endpoint device.
    for (ULONG i = 0; i < count; i++)
    {
        // Get pointer to endpoint number i.
        hr = pRenderCollection->Item(i, &pEndpoint);
        EXIT_ON_ERROR(hr)

            // Get the endpoint ID string.
            hr = pEndpoint->GetId(&pwszID);
        EXIT_ON_ERROR(hr)

            hr = pEndpoint->OpenPropertyStore(
            STGM_READ, &pProps);
        EXIT_ON_ERROR(hr)

            PROPVARIANT varName;
        // Initialize container for property value.
        PropVariantInit(&varName);

        // Get the endpoint's friendly-name property.
        hr = pProps->GetValue(
            PKEY_Device_FriendlyName, &varName);
        EXIT_ON_ERROR(hr)


            setlocale(LC_ALL, "chs");//中文宽字符输出
        // Print endpoint friendly name and endpoint ID.
        wprintf(L"Endpoint %d: "%s" ( %s )
",
            i, varName.pwszVal, pwszID);

        CoTaskMemFree(pwszID);
        pwszID = NULL;
        PropVariantClear(&varName);
        SAFE_RELEASE(pProps)
            SAFE_RELEASE(pEndpoint)
    }
    SAFE_RELEASE(pEnumerator)
        SAFE_RELEASE(pRenderCollection)
        return;

Exit:
    printf("Error!
");
    CoTaskMemFree(pwszID);
    SAFE_RELEASE(pEnumerator)
        SAFE_RELEASE(pRenderCollection)
        SAFE_RELEASE(pEndpoint)
        SAFE_RELEASE(pProps)
}

/************************音频的输入输出设备**************************/



int _tmain(int argc, _TCHAR* argv[])
{
    CoInitializeEx(NULL, COINIT_MULTITHREADED);

    PrintEndpointNames();

    getchar();

    return 0;
}
原文地址:https://www.cnblogs.com/poissonnotes/p/7462989.html