2011-02-26 3 views
0

목표는 오디오 샘플을 게임에 전달하는 DirectShow 필터를 만드는 것입니다. 현재로서는 WaveFormatEx 구조의 일부 데이터 멤버를 전용 변수에 저장합니다. 호스트 응용 프로그램에서 호출 할 수있는 인터페이스 클래스에 접근 자 함수가 있습니다. 문제는, 내가이 함수들을 호출 할 때, 나는 항상 0 (초기화 된 값)을 얻는다.사용자 지정 DirectShow 필터 : 호스트 응용 프로그램에 변수를 전달할 때의 어려움

멤버 변수는 재정의 된 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 및 내 호스트 앱에서 그래프를 만들 때 값이 정확합니다. 그러나 접근 자 함수를 호출하면 항상 0이됩니다.

STDMETHODIMP CDrunkenFilter::GetSampleRate(DWORD *ptr) 
{ 
    (*ptr) = m_sampleRate; 
    return NOERROR; 
} 

나는 이러한 기능에 유효한 포인터를 전달하고 있음을 알고 내 접근 모두 동일한 기본 정의를 공유 할 수 있습니다.

내가 뭘 잘못하고 있는지 잘 모르겠다. 아마도 충분히 연구하지 않은 또 다른 사례 일 것이다. 당신이 올바른 방향으로 나를 가리킬 수 있다면, 주저하지 말고 게시하십시오!

+0

directshow 필터에서 메시지 상자를 쏘고 싶습니까? 대신 TRACE를 시도하십시오 ... –

+0

GetSampleRate에 중단 점을 넣으려고 했습니까? 거기에서 필터 상태를 검사 할 수 있어야합니다. – Ralf

+0

접근 자 함수의 중단 점은 변수를 0으로 표시하지만 :: Transform() 함수 내의 중단 점은 모두 정확합니다. – drunkmonkey

답변

1

필자는 CoCreateInstance와 필터 및 인터페이스를 잘못 만들고있었습니다.

인터페이스 작성을 filter-> QueryInterface로 변경 했으므로 이제는 모두 정상적으로 작동합니다.

관련 문제