3,248
社区成员




void CDXGraph::UnloadFilter()
{
HRESULT hr; ///< Temp
IBaseFilter * pFilter = NULL; ///< Temp
IEnumFilters * pIFilterEnum = NULL; ///< Filter enumerator
ULONG fetchCount = 0; ///< Indicate the number of elements retrieved
#ifdef _DEBUG
int refCountOfConnectedPin;
int refCountOfPin;
#endif
hr=mGraph->EnumFilters(&pIFilterEnum);
if(FAILED(hr)) return ;
pIFilterEnum->Reset();
// #Warning
/* // Maybe useful when there is a filename filter
char str_veido[] = {"Video Capture"};
char str_audio[] = {"Audio Capture"};*/
// #EndWarning
while(pIFilterEnum->Next(1,&pFilter,&fetchCount)==S_OK && fetchCount)
{
/* // Maybe useful when there is a filename filter
char szName[MAX_FILTER_NAME];
WideCharToMultiByte(CP_ACP, 0, filterInfo.achName, MAX_FILTER_NAME, szName, MAX_FILTER_NAME, 0, 0);
if((strcmp(szName,str_veido)==0)||(strcmp(szName,str_audio)==0))
{return;} */
IEnumPins *pIEnumPin = NULL; ///< Pin enumerator
IPin *pIPin = NULL; ///< Temp
hr = pFilter->EnumPins(&pIEnumPin);
if(SUCCEEDED(hr))
{
while(pIEnumPin->Next(1,&pIPin,&fetchCount)==S_OK && fetchCount)
{
IPin * connectedPin = NULL; ///< Temp
if(VFW_E_NOT_CONNECTED != pIPin->ConnectedTo(&connectedPin))
{
/* // Maybe useful when there is a filename filter
//PIN_INFO pinInfo;
//pIPin->QueryPinInfo(&pinInfo);
//pinInfo.pFilter */
// Disconnect relative pin
#ifdef _DEBUG
PIN_INFO pinInfo, connectedpinInfo;
FILTER_INFO connectedFilterInfo, filterInfo;
pIPin->QueryPinInfo(&pinInfo);
connectedPin->QueryPinInfo(&connectedpinInfo);
connectedpinInfo.pFilter->QueryFilterInfo(&connectedFilterInfo);
pFilter->QueryFilterInfo(&filterInfo);
#endif
// #Warning
// This method failed
// #EndWarning
DisconnectFilters(connectedPin);//-------------------------------
DisconnectFilters(pIPin);//--------------------------------------
#ifdef _DEBUG
refCountOfConnectedPin = connectedPin->Release();
pinInfo.pFilter->Release();
connectedpinInfo.pFilter->Release();
connectedFilterInfo.pGraph->Release();
filterInfo.pGraph->Release();
#else
connectedPin->Release();
#endif
}
#ifdef _DEBUG
refCountOfPin = pIPin->Release();
#else
pIPin->Release();
#endif
}
pIEnumPin->Release();
}
pFilter->Release();
}
pIFilterEnum->Release();
}
void CDXGraph::DisconnectFilters(IPin * inOutputPin)
{
if (mGraph && inOutputPin) mGraph->Disconnect(inOutputPin);
}