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; }