我的目标是创建一个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/

10-13 03:21