我的目标是创建一个DirectShow过滤器,将音频样本传递到我的游戏。现在,它将WaveFormatEx结构中的一些数据成员保存到私有变量中。我的界面类中有访问器函数,主机应用可以调用该访问器函数。问题是,当我调用这些函数时,我总是得到零(初始化值)。
成员变量是在我重写的CTransInPlace :: CheckInputType()中设置的,并且(使用消息框)这些值很有意义。这是代码:
HRESULT CDrunkenFilter::CheckInputType(const CMediaType *pmt)
{
CheckPointer(pmt, E_POINTER);
if (pmt->majortype != MEDIATYPE_Audio)
return VFW_E_TYPE_NOT_ACCEPTED;
if (pmt->subtype != MEDIASUBTYPE_PCM)
return VFW_E_TYPE_NOT_ACCEPTED;
if (pmt->formattype != FORMAT_WaveFormatEx)
return VFW_E_TYPE_NOT_ACCEPTED;
WAVEFORMATEX *wfx = (WAVEFORMATEX*)pmt->Format();
m_channels = wfx->nChannels;
m_blockSize = wfx->nBlockAlign;
m_bitRate = wfx->wBitsPerSample;
m_sampleRate = wfx->nSamplesPerSec;
stringstream ss;
ss << "channels " << m_channels << "\n";
ss << "blocksize " << m_blockSize << "\n";
ss << "bitrate " << m_bitRate << "\n";
ss << "samplerate " << m_sampleRate;
int len = MultiByteToWideChar(0, 0, ss.str().c_str(), -1, NULL, 0);
WCHAR *str = new WCHAR[len];
MultiByteToWideChar(0, 0, ss.str().c_str(), -1, str, len);
MessageBox(NULL, str, NULL, NULL);
delete [] str;
return NOERROR;
}
在GraphEdit和我的主机应用程序中创建图形时,这些值是正确的。但是,当我调用访问器函数时,我总是得到零。我的访问者都具有相同的基本定义:
STDMETHODIMP CDrunkenFilter::GetSampleRate(DWORD *ptr)
{
(*ptr) = m_sampleRate;
return NOERROR;
}
我知道我正在传递指向这些函数的有效指针。
我不知道我在做什么错...可能只是另一种研究不够充分的案例。如果您能指出正确的方向,请随时发布!
最佳答案
我用CoCreateInstance错误地创建了过滤器AND接口。
我将接口创建更改为filter-> QueryInterface,现在一切正常。
关于c++ - 自定义DirectShow过滤器:难以将变量传递给主机应用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5125701/