gpt4 book ai didi

c++ - 自定义 DirectShow 过滤器 : difficulty passing variables to host app

转载 作者:行者123 更新时间:2023-11-28 08:23:03 26 4
gpt4 key购买 nike

我的目标是创建一个 DirectShow 过滤器,将音频样本传递到我的游戏中。现在,它将 WaveFormatEx 结构中的一些数据成员保存到私有(private)变量中。我的接口(interface)类中有主机应用程序可以调用的访问器函数。问题是,当我调用这些函数时,我总是得到零(初始化值)。

成员变量在我覆盖的 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 创建了过滤器和接口(interface)。

我将接口(interface)创建更改为 filter->QueryInterface,现在一切正常。

关于c++ - 自定义 DirectShow 过滤器 : difficulty passing variables to host app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5125701/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com