15,471
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#pragma comment(lib, "strmiids.lib")
HRESULT WINAPI FindFirstACapDevice(IBaseFilter** pCapDev)
{
HRESULT hr;
ATLASSERT(pCapDev);
*pCapDev = NULL;
// Prepare to enumerate capture device
CComPtr<IBindCtx> pBC;
if(FAILED(hr = CreateBindCtx(0, &pBC)))
return hr;
CComPtr<ICreateDevEnum> pCDE;
if(FAILED(hr = pCDE.CoCreateInstance(CLSID_SystemDeviceEnum)))
return hr;
CComPtr<IEnumMoniker> pEnumMoniker;
if(S_OK != (hr = pCDE->CreateClassEnumerator(CLSID_AudioInputDeviceCategory,
&pEnumMoniker.p, 0)))
return hr;
if(S_OK != (hr = pEnumMoniker->Reset()))
return hr;
// Enumerate the first available capture device
ULONG cFetched;
CComPtr<IMoniker> pMoniker;
if(S_OK != (hr = pEnumMoniker->Next(1, &pMoniker.p, &cFetched)))
return hr;
// Get device filter
if(FAILED(hr = pMoniker->BindToObject(pBC, NULL, IID_IBaseFilter, (void**)pCapDev)))
return hr;
return S_OK;
}
// {3C78B8E2-6C4D-11d1-ADE2-0000F8754B99}
static const GUID CLSID_WavDest =
{ 0x3c78b8e2, 0x6c4d, 0x11d1, { 0xad, 0xe2, 0x0, 0x0, 0xf8, 0x75, 0x4b, 0x99 } };
HRESULT WINAPI BuildACapGraph(IGraphBuilder** ppGraph, LPCWSTR pwszWavFileName)
{
HRESULT hr;
ATLASSERT(ppGraph);
ATLASSERT(pwszWavFileName);
*ppGraph = NULL;
// Get audio capture device object
CComPtr<IBaseFilter> pASrc;
if(FAILED(hr = FindFirstACapDevice(&pASrc)))
return hr;
// Create .WAV format creator
CComPtr<IBaseFilter> pWavDst;
if(FAILED(hr = pWavDst.CoCreateInstance(CLSID_WavDest)))
return hr;
// Create file writer
CComPtr<IBaseFilter> pFileWriter;
if(FAILED(hr = pFileWriter.CoCreateInstance(CLSID_FileWriter)))
return hr;
CComQIPtr<IFileSinkFilter> pFileSink = pFileWriter;
if(FAILED(hr = pFileSink->SetFileName(pwszWavFileName, NULL)))
return hr;
// Create filter graph and capture builder
CComPtr<IGraphBuilder> pGraph;
if(FAILED(hr = pGraph.CoCreateInstance(CLSID_FilterGraph)))
return hr;
CComPtr<ICaptureGraphBuilder2> pCapBuilder;
if(FAILED(hr = pCapBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2)))
return hr;
if(FAILED(hr = pCapBuilder->SetFiltergraph(pGraph)))
return hr;
// Connect
pGraph->AddFilter(pASrc, L"");
pGraph->AddFilter(pWavDst, L"");
pGraph->AddFilter(pFileWriter, L"");
if(FAILED(hr = pCapBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Audio,
pASrc, pWavDst, pFileWriter)))
return hr;
// Everything is ok, return the graph object to caller
pGraph.CopyTo(ppGraph);
return S_OK;
}
HRESULT WINAPI StartStopACap(IGraphBuilder* pGraph, BOOL bStart)
{
// Set graph to running status
CComQIPtr<IMediaControl> pCtrl = pGraph;
if(bStart)
pCtrl->Run();
else
pCtrl->Stop();
// Wait for the status changing
OAFilterState unused;
return pCtrl->GetState(INFINITE, &unused);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case ID_FILE_STARTSTOP:
if(!g_pGraph) // Not capturing, start capturing now
{
BuildACapGraph(&g_pGraph, L"c:\\test.wav");
StartStopACap(g_pGraph, TRUE);
}
else // Is capturing, stop it now
{
StartStopACap(g_pGraph, FALSE);
g_pGraph.Release();
}
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}