목표는 오디오 샘플을 게임에 전달하는 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;
}
나는 이러한 기능에 유효한 포인터를 전달하고 있음을 알고 내 접근 모두 동일한 기본 정의를 공유 할 수 있습니다.
내가 뭘 잘못하고 있는지 잘 모르겠다. 아마도 충분히 연구하지 않은 또 다른 사례 일 것이다. 당신이 올바른 방향으로 나를 가리킬 수 있다면, 주저하지 말고 게시하십시오!
directshow 필터에서 메시지 상자를 쏘고 싶습니까? 대신 TRACE를 시도하십시오 ... –
GetSampleRate에 중단 점을 넣으려고 했습니까? 거기에서 필터 상태를 검사 할 수 있어야합니다. – Ralf
접근 자 함수의 중단 점은 변수를 0으로 표시하지만 :: Transform() 함수 내의 중단 점은 모두 정확합니다. – drunkmonkey