dshow枚举设备,声音回放...

 

HRESULT EnumerateAudioOutputFilters(IBaseFilter  ** pFilter)
{
    HRESULT hr;
    ULONG cFetched;
    ICreateDevEnum 
*pSysDevEnum = NULL;
    IEnumMoniker 
*pEnumCat = NULL;
    IMoniker 
*pMoniker = NULL;
    
char szDevName[MAX_PATH] = {0};

    
// 创建系统设备枚举COM对象.
    if (FAILED(hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, 
                                                IID_ICreateDevEnum, (
void **)&pSysDevEnum)))
    
{
        
return hr;
    }

    
    
// 创建音频输出设备枚举COM对象.
    if (FAILED(hr = pSysDevEnum->CreateClassEnumerator(CLSID_AudioRendererCategory, &pEnumCat, 0)))
    
{
        pSysDevEnum
->Release();
        
return hr;
    }

    
    
// 系统循环枚举音频输出设备表.
    while(pEnumCat->Next(1&pMoniker, &cFetched) == S_OK)
    
{
        IPropertyBag 
*pPropBag;
        VARIANT varName;

        varName.vt 
= VT_BSTR;

        
// 绑定设备属性到一个COM对象.
        if (FAILED(pMoniker->BindToStorage(00, IID_IPropertyBag, (void **)&pPropBag)))
        
{
            
goto FAILED_RET;
        }
            
        
        
// 读取属性中的设备名称项.
        if (FAILED(hr = pPropBag->Read(L"FriendlyName"&varName, 0)))
        
{
            pPropBag
->Release();
            
goto FAILED_RET;
        }
    
        
        WideCharToMultiByte(CP_ACP, 
0, varName.bstrVal, wcslen(varName.bstrVal), szDevName, MAX_PATH, NULL, NULL); 
        TRACE1(
"Audio Output Device: %s ", szDevName);

        
// 设置条件,绑定到过滤器.
        if (FAILED(hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)pFilter)))
        
{            
            pPropBag
->Release();
            pMoniker
->Release();
            
goto FAILED_RET;
        }
        
        
        SysFreeString(varName.bstrVal);
        pPropBag
->Release();
        pMoniker
->Release();
    }


FAILED_RET:
    pEnumCat
->Release();
    pSysDevEnum
->Release();

    
return hr;
}


HRESULT EnumerateAudioInputFilters(IBaseFilter 
** pFilter)
{
    HRESULT hr;
    ULONG cFetched;
    ICreateDevEnum 
*pSysDevEnum = NULL;
    IEnumMoniker 
*pEnumCat = NULL;
    IMoniker 
*pMoniker = NULL;
    
char szDevName[MAX_PATH] = {0};
        
    
// 创建系统设备枚举COM对象.
    if (FAILED(hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, 
                                                IID_ICreateDevEnum, (
void **)&pSysDevEnum)))
    
{
        
return hr;
    }

    
    
// 创建音频输出设备枚举COM对象.
    if (FAILED(hr = pSysDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pEnumCat, 0)))
    
{
        pSysDevEnum
->Release();
        
return hr;
    }

    
    
// 系统循环枚举音频输出设备表.
    while(pEnumCat->Next(1&pMoniker, &cFetched) == S_OK)
    
{
        IPropertyBag 
*pPropBag;
        VARIANT varName;
        
        varName.vt 
= VT_BSTR;
        
        
// 绑定设备属性到一个COM对象.
        if (FAILED(pMoniker->BindToStorage(00, IID_IPropertyBag, (void **)&pPropBag)))
        
{
            
goto FAILED_RET;
        }

        
        
// 读取属性中的设备名称项.
        if (FAILED(hr = pPropBag->Read(L"FriendlyName"&varName, 0)))
        
{
            pPropBag
->Release();
            
goto FAILED_RET;
        }

        
        WideCharToMultiByte(CP_ACP, 
0, varName.bstrVal, wcslen(varName.bstrVal), szDevName, MAX_PATH, NULL, NULL); 
        TRACE1(
"Audio Input Device: %s ", szDevName);
        
        
// 设置条件,绑定到过滤器.
        if (FAILED(hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)pFilter)))
        
{            
            pPropBag
->Release();
            pMoniker
->Release();
            
goto FAILED_RET;
        }
        
        
        SysFreeString(varName.bstrVal);
        pPropBag
->Release();
        pMoniker
->Release();
    }

    
FAILED_RET:
    pEnumCat
->Release();
    pSysDevEnum
->Release();
    
    
return hr;
}


int  main( int  argc,  char *  argv[])
{
    IGraphBuilder            
*pGraph;
    ICaptureGraphBuilder2    
*pBuilder;
    IMediaControl            
*pMediaControl;
    IMediaEvent                
*pEvent;
    IBaseFilter                
*pSrc;
    IBaseFilter                
*pDst;
    HRESULT                    hr;

    CoInitialize(NULL);

    
// 设置各接口.
    EnumerateAudioInputFilters(&pSrc);
    EnumerateAudioOutputFilters(
&pDst);
  
    
if (FAILED(hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph)))
    
{
        
return 1;
    }


    
if (FAILED(hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **)&pBuilder)))
    
{
        
return 2;
    }


    
if (FAILED(hr = pBuilder->SetFiltergraph(pGraph)))
    
{
        
return 3;
    }


    
if (FAILED(pGraph->AddFilter(pDst, L"Audio Renderers")))
    
{
        
return 4;
    }


    
if (FAILED(pGraph->AddFilter(pSrc, L"Audio Capture")))
    
{
        
return 5;
    }


    
if (FAILED(hr = pBuilder->RenderStream(
        
&PIN_CATEGORY_CAPTURE,  // Pin category
        &MEDIATYPE_Audio,       // Media type
        pSrc,                   // Capture filter
        NULL,                   // Compression filter (optional)
        NULL                    // Multiplexer or renderer filter
        )))
    
{
        
return 6;
    }


    pDst
->Release();
    pSrc
->Release();

    
// 查询接口.
    if (FAILED(hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl)))
    
{
        
return 7;
    }


    
if (FAILED(hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent)))
    
{
        
return 8;
    }


    
// 开始运行.
    if (FAILED(hr = pMediaControl->Run()))
    
{
        
return 9;
    }

    
    
// 等待完成. 
    long evCode;
    
if (FAILED(hr = pEvent->WaitForCompletion(INFINITE, &evCode)))
    
{
        
return 10;
    }

    
    
// 撤消.
    pMediaControl->Release();
    pEvent
->Release();
    pBuilder
->Release();
    pGraph
->Release();

    CoUninitialize();

    
return 0;
}

 

你可能感兴趣的:(程序笔记,null,path,audio,server)