Click to See Complete Forum and Search --> : Grab Audio Stream with Directshow


Skynet
June 5th, 2006, 08:23 PM
Hi :wave:

Can someone tell me what wrong with that peace of code? I'm trying to grab an audio stream with ISampleGrabber but ut's fail on the GetCurrentBuffer (get size) call.

thanks, and sorry for the on "tagged" code.

---------------------------------------------------------------------------------------------
IGraphBuilder *m_pGraphBuilder;
IMediaControl *m_pMediaControl;
IMediaSeeking *m_pSeek;
IMediaEvent *m_pMediaEventEx;
IBaseFilter *m_pGrabberBaseFilter;
ISampleGrabber *m_pSampleGrabber;


bool CXWaveStream::Init(char *pszFile)
{

long lNbStream = 0;
int i;
WCHAR wszName[MAX_PATH + 1];
HRESULT hr;
AM_MEDIA_TYPE mt;

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&m_pGraphBuilder);
if( FAILED(hr) )
return false;

hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (LPVOID *)&m_pGrabberBaseFilter);
if( FAILED(hr) )
return false;

m_pGrabberBaseFilter->QueryInterface(IID_ISampleGrabber, (void**)&m_pSampleGrabber);
if( m_pSampleGrabber == NULL )
return false;

hr = m_pGraphBuilder->AddFilter(m_pGrabberBaseFilter, L"Grabber" );
if( FAILED(hr) )
return false;

MultiByteToWideChar(CP_ACP, 0, pszFile, -1, wszName, MAX_PATH + 1);
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
mt.formattype = FORMAT_WaveFormatEx;
hr = m_pSampleGrabber->SetMediaType( &mt );
if( FAILED(hr) )
return false;

hr = m_pGraphBuilder->RenderFile(wszName, NULL);
if( FAILED(hr) )
return false;

// Set up one-shot mode.
hr = m_pSampleGrabber->SetBufferSamples( TRUE );
if( FAILED(hr) )
return false;

/*hr = m_pSampleGrabber->SetOneShot( TRUE );
if( FAILED(hr) )
return false;*/


AM_MEDIA_TYPE MediaType;
ZeroMemory(&MediaType,sizeof(MediaType));
hr = m_pSampleGrabber->GetConnectedMediaType( &MediaType );
if( FAILED(hr) )
return false;

// Get a pointer to the video header.
m_pwfx = (WAVEFORMATEX*)MediaType.pbFormat;
if( m_pwfx == NULL )
return false;

// Copy the image into the buffer.
m_dwSize = 0;
hr = m_pSampleGrabber->GetCurrentBuffer(&m_dwSize, (long*)m_pWavBits);
if (FAILED(hr))
return false;
m_pWavBits = new BYTE[m_dwSize*4];
hr = m_pSampleGrabber->GetCurrentBuffer(&m_dwSize, (long*)m_pWavBits);