DirectShow的几段代码问题
现在我要控制多声卡输出,思路已经有了,代码也找到相似的
但是有点疑问,先贴代码如下:
----------------------------------------------------
BOOL CDSPlayer::RenderFile(const char * inFile)
{
if ( mGraph )
{
if ( !Stop () ) return FALSE;
if ( mAudioFilter )
{
mGraph->RemoveFilter ( mAudioFilter );
mAudioFilter->Release ();
mAudioFilter = NULL;
}
WCHAR wsz[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, inFile, -1, wsz, MAX_PATH);
if (SUCCEEDED(mGraph->RenderFile(wsz, NULL)))//
{
mAudioFilter = FindFilters ( inFile ); //
m_csMediaFileName = inFile;
SetNotifyWindow ( m_hWndNotify );
SetDisplayWindow ( m_hWndDisplay );
return TRUE;
return ( mAudioFilter != NULL );
}
}
return FALSE;
}
IBaseFilter* CDSPlayer::FindFilters ( const char *szFilterName )
{
if( !mGraph ) return NULL;
IEnumFilters *pFilters = NULL;
if ( FAILED(mGraph->EnumFilters(&pFilters)))
return NULL;
IBaseFilter *pFilter = NULL, *pFilter_Find = NULL;
ULONG n = 0;
while ( pFilters->Next(1, &pFilter, &n) == S_OK )
{
FILTER_INFO info;
if ( FAILED(pFilter->QueryFilterInfo(&info)) )
{
TRACE ( "Filter [%x] -- failed QueryFilterInfo\n", pFilter );
}
else
{
CString csAchName = info.achName;
TRACE ( "%s\n", csAchName );
if ( csAchName.Find ( szFilterName, 0 ) >= 0 )
{
pFilter_Find = pFilter;
}
else
{
pFilter->Release();
}
}
}
pFilters->Release();
return pFilter_Find;
}
----------------------------------------------------
问题如下:
该两个函数代码经测试没有问题,但是本人有疑问:
RenderFile(const char * inFile)是将指定的文件输出到声卡上
问题1:
mAudioFilter = FindFilters ( inFile ); //
m_csMediaFileName = inFile;
这里是找到真正播放这个文件的Filter,保存到mAudioFilter中,为什么能做到这个呢?通过的文件名关联?系统是如何分配的?
问题2:
在IBaseFilter* CDSPlayer::FindFilters ( const char *szFilterName )中
里面有一个遍历,取每个Filter的信息,然后看看里面的信息是否有播放的文件名,如果有,则把该Filter置为当前的Filter,也即播放当前文件的Filter,这里的理解应该没有问题吧?
在这里我有一个问题,我既然可以选择声卡,那根据声卡的,选择的Filter,应该当时就能确定,应该可以不用这一步,是不是?我直接可以改进的,选择声卡后,对应的Filter即可确定。
另外:在BOOL CDSPlayer::RenderFile(const char * inFile)中,没有看到具体用找到的Filter来播放,那选择岂不是无意义?
望各位高手指点一下,谢谢!