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);
}
Beispiel #3
0
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;
}
Beispiel #4
0
//-----------------------------------------------------------------------------
// 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;
}
Beispiel #5
0
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);
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}
Beispiel #8
0
//-----------------------------------------------------------------------------
// 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;
}
Beispiel #9
0
// 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;
}
Beispiel #10
0
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;
}
Beispiel #11
0
// 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;
}
Beispiel #12
0
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);
}