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无效。

问列位大大,我的思路是否有问题?抑或,代码在哪里出问题了?
...全文
159 4 打赏 收藏 举报
写回复
用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创作助手写篇文章吧