zoukankan      html  css  js  c++  java
  • 显示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;
    }
  • 相关阅读:
    (精华)将json数组和对象转换成List和Map(小龙哥和牛徳鹤的对话)
    优先队列底层实现是堆(heap)(操作系统进程调度)
    (透彻理解)最精锐代码::堆的三种基本操作新建-插入-删除
    (考研)读者写者问题(附代码)
    (考研)黑电吃苹果同步互斥问题(附代码)
    (考研)哲学家进餐问题(附代码)
    (考研)吸烟者问题(赋代码)
    (考研)PV操作和信号量
    01.第一章_C++ Primer学习笔记_开始
    C++学习笔记
  • 原文地址:https://www.cnblogs.com/poissonnotes/p/7462989.html
Copyright © 2011-2022 走看看