Disconnect不掉的pin,夜惊魂

springlie 2009-07-07 09:58:44
呵呵,标题套用了一句广播词,不知大家是否听过。

DirectShow中,在某个时间,想要Disconnect一个Graph中的所有filter的所有pin,并不想从Graph中remove任何东西。
我的思路是,遍历所有filter,遍历每个filter的所有pin。每个pin都检测其是否已连接,如果连接,则先Disconnect对端的pin,然后在Disconnect自己。方法如下:

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


其中的DisconnectFilters方法如下:
void CDXGraph::DisconnectFilters(IPin * inOutputPin)
{
if (mGraph && inOutputPin) mGraph->Disconnect(inOutputPin);
}


运行显示,所有的pin和filter都可以正确找到,但是只有最下游的filter上的pin可以正常Disconnect,其他的pin都Disconnect无效。

问列位大大,我的思路是否有问题?抑或,代码在哪里出问题了?
...全文
83 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wshcdr 2009-07-10
  • 打赏
  • 举报
回复
细节不记得咯
yangsh3002 2009-07-09
  • 打赏
  • 举报
回复
这个问题放到专题开发/技术/项目-多媒体/流媒体开发里面比较合适,以前弄过,现在就饭吃了,呵呵.
springlie 2009-07-09
  • 打赏
  • 举报
回复
自顶以等达人。
springlie 2009-07-08
  • 打赏
  • 举报
回复
自顶以等达人。

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧