Пример #1
0
bool DShowAudioSource::load(const RString& path)
{
	mPath = path;
	HRESULT hr = S_OK;

	// Create the graph builder
	CComPtr<IGraphBuilder> pGraphBuilder;
	hr = pGraphBuilder.CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER);
    if(FAILED(hr)) 
		return false;

	// Create the sample grabber filter
	CComPtr<IBaseFilter> pSampleGrabberBaseFilter;
	hr = pSampleGrabberBaseFilter.CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER);
	if(FAILED(hr))
		return false;

	// Add the sample grabber filter to the graph
	hr = pGraphBuilder->AddFilter(pSampleGrabberBaseFilter, L"Sample Grabber");
	if(FAILED(hr))
		return false;

	// Get the Sample Grabber interface
	CComQIPtr<ISampleGrabber> pSampleGrabberFilter(pSampleGrabberBaseFilter);
	if(pSampleGrabberFilter == 0)
		return false;

	// Set the sample grabber's media type
	AM_MEDIA_TYPE mt;
	ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
	mt.majortype	= MEDIATYPE_Audio;
	mt.subtype = MEDIASUBTYPE_PCM;
	mt.formattype = FORMAT_WaveFormatEx;
	hr = pSampleGrabberFilter->SetMediaType(&mt);        
	if(FAILED(hr))
		return false;

	// Create the sample grabber callback
	mpSampleGrabberCallback.Attach(new SampleGrabberCallback(this));
	hr = pSampleGrabberFilter->SetCallback(mpSampleGrabberCallback, 1);
	if(FAILED(hr))
		return false;

	// Add the source filter to the graph
	WCHAR filename[MAX_PATH];
    MultiByteToWideChar(CP_ACP, 0,mPath.c_str(), -1, filename, MAX_PATH);
	CComPtr<IBaseFilter> pSourceFilter;
	hr = pGraphBuilder->AddSourceFilter(filename, L"Audio Source", &pSourceFilter);
	if(FAILED(hr)) 
		return false;

	// Create the NULL renderer.  We are only decoding
	CComPtr<IBaseFilter> pNullRenderer;
	hr = pNullRenderer.CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER);
	hr = pGraphBuilder->AddFilter(pNullRenderer, L"NULL Renderer");

	// Connect input to sample grabber
	hr = ConnectFilters(pGraphBuilder, pSourceFilter, pSampleGrabberBaseFilter);
	if(FAILED(hr))
		return false;

	// Connect sample grabber to NULL renderer
	hr = ConnectFilters(pGraphBuilder, pSampleGrabberBaseFilter, pNullRenderer);
	if(FAILED(hr))
		return false;

	// Get some useful interfaces
	mpMediaControl = pGraphBuilder;
	if(mpMediaControl == 0)
		return false;

	mpMediaEvent = pGraphBuilder;
	if(mpMediaEvent == 0)
		return false;

	mpMediaSeeking = pGraphBuilder;
	if(mpMediaSeeking == 0)
		return false;

	// Get the waveformatex structure
	pSampleGrabberFilter->GetConnectedMediaType(&mt);
    mpWaveFormatEx = reinterpret_cast<WAVEFORMATEX*>(mt.pbFormat);

	hr = mpMediaSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);
	if(FAILED(hr)) 
		return false;

	CComQIPtr<IMediaFilter> pMediaFilter(pGraphBuilder);
	pMediaFilter->SetSyncSource(0);

	mCurrentPosition = 0;
	mEOF = false;

	printf("# channels = %d\n", mpWaveFormatEx->nChannels);
	printf("Sample rate = %d\n", mpWaveFormatEx->nSamplesPerSec);

	return true;
}