HRESULT __fastcall JoinFilterToChain(IGraphBuilder *pFilterGraph, IBaseFilter* Filter, IPin **LastPin) { HRESULT hr = S_OK; if(!pFilterGraph || !Filter || !LastPin) return E_POINTER; IPin* pFilterPinOut=NULL; IPin* pFilterPinIn=NULL; hr = GetUnconnectedPin(Filter, PINDIR_INPUT, &pFilterPinIn); if(SUCCEEDED(hr)) { hr=pFilterGraph->Connect(*LastPin, pFilterPinIn); pFilterPinIn->Release(); (*LastPin)->Release(); if(SUCCEEDED(hr)) { HRESULT hr2 = GetUnconnectedPin(Filter, PINDIR_OUTPUT, &pFilterPinOut); if(SUCCEEDED(hr2)) { (*LastPin)=pFilterPinOut; } else { (*LastPin)=NULL; } } else { pFilterGraph->RemoveFilter(Filter); } } return hr; }
HRESULT ConnectFilters(IGraphBuilder* aGraph, IBaseFilter* aOutputFilter, IBaseFilter* aInputFilter) { RefPtr<IPin> output = GetUnconnectedPin(aOutputFilter, PINDIR_OUTPUT); NS_ENSURE_TRUE(output, E_FAIL); RefPtr<IPin> input = GetUnconnectedPin(aInputFilter, PINDIR_INPUT); NS_ENSURE_TRUE(output, E_FAIL); return aGraph->Connect(output, input); }
HRESULT CTMReceiverGraph::ConnectFilters(CComPtr<IGraphBuilder> pGraph, CComPtr<IBaseFilter> pSrc, CComPtr<IBaseFilter> pDest, GUID MediaType) { if(pGraph == NULL || pSrc == NULL || pDest == NULL) return E_POINTER; CComPtr<IPin> pOut = 0; HRESULT hr = GetUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut, MediaType); if (FAILED(hr)) return hr; CComPtr<IPin> pIn = 0; hr = GetUnconnectedPin(pDest, PINDIR_INPUT, &pIn, MediaType); if (FAILED(hr)) return hr; hr = pGraph->Connect(pOut, pIn); return hr; }
//----------------------------------------------------------------------------- // RenderFilter // Renders the named output pin of the filter, or the first unconnected output if // no name is provided HRESULT CDSUtils::RenderFilter(IGraphBuilder* pGraph, IBaseFilter* pUpstream, wchar_t* pUpstreamPinName) { HRESULT hr = S_OK; if (pUpstream) { CComPtr<IPin> pIPinOutput = NULL; if (pUpstreamPinName) { hr = GetPin(pUpstream, pUpstreamPinName, &pIPinOutput); } else { hr = GetUnconnectedPin(pUpstream, PINDIR_OUTPUT, &pIPinOutput); } if (SUCCEEDED(hr)) { hr = pGraph->Render(pIPinOutput); } } else { hr = E_INVALIDARG; } return hr; }
BOOL ConnectFilters(IGraphBuilder* pGraphBuilder, IPin* pPinOut, IBaseFilter* pFilterDst) { if(!pGraphBuilder || !pPinOut || !pFilterDst) return FALSE; HRESULT hr = E_FAIL; #ifdef _DEBUG PIN_DIRECTION pinDir; hr = pPinOut->QueryDirection(&pinDir); if(FAILED(hr)) return FALSE; ASSERT(pinDir == PINDIR_OUTPUT); #endif IPin* pPinIn = NULL; if(!GetUnconnectedPin(pFilterDst,PINDIR_INPUT,&pPinIn)) { return FALSE; } hr = pGraphBuilder->Connect(pPinOut,pPinIn); pPinIn->Release(); return SUCCEEDED(hr); }
HRESULT ConnectFilters( IGraphBuilder *pGraph, // Filter Graph Manager. IPin *pOut, // Output pin on the upstream filter. IBaseFilter *pDest) // Downstream filter. { if ((pGraph == NULL) || (pOut == NULL) || (pDest == NULL)) { return E_POINTER; } #ifdef _DEBUG PIN_DIRECTION PinDir; pOut->QueryDirection(&PinDir); _ASSERTE(PinDir == PINDIR_OUTPUT); #endif // Find an input pin on the downstream filter. IPin *pIn = 0; HRESULT hr = GetUnconnectedPin(pDest, PINDIR_INPUT, &pIn); if (FAILED(hr)) { return hr; } // Try to connect them. hr = pGraph->Connect(pOut, pIn); pIn->Release(); return hr; }
HRESULT RecordGraph::ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest, GUID MediaType) { if(pGraph == NULL || pSrc == NULL || pDest == NULL) return E_POINTER; IPin *pOut = 0; HRESULT hr = GetUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut, MediaType); if (FAILED(hr)) return hr; IPin *pIn = 0; hr = GetUnconnectedPin(pDest, PINDIR_INPUT, &pIn, MediaType); if (FAILED(hr)) return hr; hr = pGraph->Connect(pOut, pIn); pOut->Release(); pIn->Release(); return hr; }
//----------------------------------------------------------------------------- // ConnectFiltersNamedPin // Connects two filters using the pin names, if no name is supplied the first // unconnected pin is used HRESULT CDSUtils::ConnectFilters(IGraphBuilder* pGraph, IBaseFilter* pUpstream, wchar_t* pUpstreamPinName, IBaseFilter* pDownstream, wchar_t* pDownstreamPinName) { HRESULT hr = S_OK; if (pUpstream && pDownstream) { // get the upstream output pin CComPtr<IPin> pIPinOutput = NULL; if (pUpstreamPinName) { hr = GetPin(pUpstream, pUpstreamPinName, &pIPinOutput); } else { hr = GetUnconnectedPin(pUpstream, PINDIR_OUTPUT, &pIPinOutput); } if (SUCCEEDED(hr)) { // get the downstream input pin CComPtr<IPin> pIPinInput = NULL; if (pDownstreamPinName) { hr = GetPin(pDownstream, pDownstreamPinName, &pIPinInput); } else { hr = GetUnconnectedPin(pDownstream, PINDIR_INPUT, &pIPinInput); } if (SUCCEEDED(hr)) { // connect the pins hr = pGraph->Connect(pIPinOutput, pIPinInput); } } } else { hr = E_INVALIDARG; } return hr; }
// Connect two filters together with the Filter Graph Manager. // Again, stolen from the DX9 SDK. // This is an overloaded version. HRESULT CBoxView::ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest) { if ((pGraph == NULL) || (pSrc == NULL) || (pDest == NULL)) { return E_POINTER; } // Find an output pin on the first filter. IPin *pOut = 0; HRESULT hr = GetUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut); if (FAILED(hr)) { return hr; } hr = ConnectFilters(pGraph, pOut, pDest); pOut->Release(); return hr; }
BOOL ConnectFilters(IGraphBuilder* pGraphBuilder, IBaseFilter* pFilterSrc, IBaseFilter* pFilterDst) { if(!pGraphBuilder || !pFilterSrc || !pFilterDst) return FALSE; IPin* pPinOut = NULL; if(!GetUnconnectedPin(pFilterSrc,PINDIR_OUTPUT,&pPinOut)) return FALSE; if(!ConnectFilters(pGraphBuilder,pPinOut,pFilterDst)) { pPinOut->Release(); return FALSE; } pPinOut->Release(); return TRUE; }
// Connect two filters together with the Filter Graph Manager, // Stolen from the DX9 SDK. // This is the base version. HRESULT CBoxView::ConnectFilters(IGraphBuilder *pGraph, // Filter Graph Manager. IPin *pOut, // Output pin on the upstream filter. IBaseFilter *pDest) // Downstream filter. { if ((pGraph == NULL) || (pOut == NULL) || (pDest == NULL)) { return E_POINTER; } // Find an input pin on the downstream filter. IPin *pIn = 0; HRESULT hr = GetUnconnectedPin(pDest, PINDIR_INPUT, &pIn); if (FAILED(hr)) { return hr; } // Try to connect them. hr = pGraph->Connect(pOut, pIn); pIn->Release(); return hr; }
BOOL CBoxView::APlaying() { if (m_pGraph == NULL) { return FALSE; } CComPtr<IBaseFilter> pAudioInputFilter; HRESULT hr = S_OK; //查找audio filter并加入graph hr = FindInputFilters((void**)&pAudioInputFilter, CLSID_AudioInputDeviceCategory); if (NULL == pAudioInputFilter) { TRACE(L"[SVC] CBoxView:: Could not create the Filter AudioInputFilter"); return FALSE; } CComPtr<IPin> pinIn; CComPtr<IAMAudioInputMixer> pPinMixer; GetUnconnectedPin(pAudioInputFilter, PINDIR_INPUT, &pinIn); hr = pinIn->QueryInterface(IID_IAMAudioInputMixer, (void **)&pPinMixer); if (SUCCEEDED(hr)) { hr = pPinMixer->put_Enable(TRUE); } hr = m_pGraph->AddFilter(pAudioInputFilter, L"ACapture"); //创建render filter并加入graph CComPtr <IBaseFilter> pAudioRenderer = NULL; hr = CoCreateInstance(CLSID_AudioRender, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void **)&pAudioRenderer); hr = m_pGraph->AddFilter(pAudioRenderer, L"Audio Renderer"); if (pAudioRenderer == NULL) { TRACE(L"[SVC] CBoxView:: Could not create the Filter AudioRenderer"); return FALSE; } //获取麦克风输出脚 CComPtr<IPin> pAudioOutput; CComPtr<IEnumPins> pEnum; pAudioInputFilter->EnumPins(&pEnum); hr = pEnum->Reset(); hr = pEnum->Next(1, &pAudioOutput, NULL); //设置麦克风输出脚 IAMStreamConfig *pCfg = NULL; hr = pAudioOutput->QueryInterface(IID_IAMStreamConfig, (void **)&pCfg); // Read current media type/format AM_MEDIA_TYPE *pmt = { 0 }; hr = pCfg->GetFormat(&pmt); WAVEFORMATEX *pWF = (WAVEFORMATEX *)pmt->pbFormat; // Release interfaces pCfg->Release(); //设置麦克风输出脚缓冲 IAMBufferNegotiation *pNeg; pAudioOutput->QueryInterface(IID_IAMBufferNegotiation, (void **)&pNeg); ALLOCATOR_PROPERTIES prop = { 0 }; prop.cbBuffer = pWF->nAvgBytesPerSec * 50 / 1000; prop.cBuffers = -1; prop.cbAlign = -1; prop.cbPrefix = -1; hr = pNeg->SuggestAllocatorProperties(&prop); pNeg->Release(); #if 0 //method 1:Render RUN hr = m_pCGB->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, pAudioInputFilter, NULL, NULL); #else //method 2:Connect RUN hr = ConnectFilters(m_pGraph, pAudioOutput, pAudioRenderer); #endif return FAILED(hr); }