#include <windows.h>
#include <commdlg.h>
#include <streams.h>
#include <initguid.h>
#include "CHKSoundFilter.h"
#include "Dsound.h"
#include "DataPool.h"
#include <stdio.h>
// {D1CAA534-F570-443f-B52F-8AC68FC3015F}
DEFINE_GUID(CLSID_HKSoundRender,
0xd1caa534, 0xf570, 0x443f, 0xb5, 0x2f, 0x8a, 0xc6, 0x8f, 0xc3, 0x1, 0x5f);
const AMOVIESETUP_MEDIATYPE sudPinTypes =
{
&MEDIATYPE_NULL,
&MEDIASUBTYPE_NULL
};
const AMOVIESETUP_PIN sudPins =
{
L"Input",
FALSE,
FALSE,
FALSE,
FALSE,
&CLSID_NULL,
L"Output",
1,
&sudPinTypes
};
const AMOVIESETUP_FILTER sudRender =
{
&CLSID_HKSoundRender,
L"HKSoundRender",
MERIT_DO_NOT_USE,
1,
&sudPins
};
CFactoryTemplate g_Templates[] =
{
L"HKSoundRender",
&CLSID_HKSoundRender,
CHKSoundFilter::CreateInstance,
NULL,
&sudRender
};
STDAPI DllRegisterServer()
{
return AMovieDllRegisterServer2(TRUE);
} // DllRegisterServer
//
// DllUnregisterServer
//
STDAPI DllUnregisterServer()
{
return AMovieDllRegisterServer2(FALSE);
} // DllUnregisterServer
//
// DllEntryPoint
//
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD dwReason,
LPVOID lpReserved)
{
return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
}
int g_cTemplates = 1;
CUnknown * WINAPI CHKSoundFilter::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr)
{
ASSERT(phr);
CUnknown * punk = new CHKSoundFilter( lpunk,phr );
if( punk == NULL )
{
if( phr )
{
*phr = E_OUTOFMEMORY;
}
}
return punk;
}
CHKSoundFilter::CHKSoundFilter(LPUNKNOWN pUnk, HRESULT *phr)
:CBaseFilter( NAME("HKSoundFilter"),pUnk,&m_Lock,CLSID_HKSoundRender )
,m_pInputPin(NULL)
,m_pPool(NULL)
,m_pDevice(NULL)
,m_pDSBuffer(NULL)
,m_dwNotifySize(4608)
,m_dwDSBufferSize(23040)
,m_hWnd( NULL )
,m_hEvent(NULL)
,m_bSetFormat(FALSE)
,m_dwNextPlayOffset(0)
,m_bDSPlaying(FALSE)
{
m_pInputPin = new CSoundInputPin( pUnk,this,&m_Lock,phr );
m_pPool = new CDataPool();
if( m_pInputPin == NULL || m_pPool == NULL )
{
exit( 1 );
}
memset(&m_wFormat,0,sizeof(WAVEFORMATEX));
memset( &m_NotifyArry,0,sizeof(m_NotifyArry) );
}
CBasePin* CHKSoundFilter::GetPin(int nIndext)
{
if( nIndext == 0 )
{
if( m_pInputPin != NULL )
{
return m_pInputPin;
}
}
return NULL;
}
int CHKSoundFilter::GetPinCount()
{
return 1;
}
STDMETHODIMP CHKSoundFilter::Stop()
{
CAutoLock lock( &m_Lock );
//在这里添加额外代码
if( m_pDSBuffer != NULL )
{
m_pDSBuffer->Stop();
}
return CBaseFilter::Stop();
}
STDMETHODIMP CHKSoundFilter::Run(REFERENCE_TIME tStart)
{
CAutoLock lock( &m_Lock );
//在这里添加额外代码
SetupDirectSound();
PlayDirectSound();
return CBaseFilter::Run(tStart);
}
STDMETHODIMP CHKSoundFilter::Pause()
{
CAutoLock lock( &m_Lock );
//在这里添加额外代码
return CBaseFilter::Pause();
}
CHKSoundFilter::~CHKSoundFilter()
{
if( m_pInputPin != NULL )
{
delete m_pInputPin;
m_pInputPin = NULL;
}
if( m_pPool != NULL )
{
delete m_pPool;
m_pPool = NULL;
}
}
HRESULT CHKSoundFilter::CreateDirectSoundDevice()
{
if( FAILED( DirectSoundCreate8( NULL,&m_pDevice,NULL ) ) )
{
return S_FALSE;
}
if( m_hWnd != NULL )
{
if( FAILED( m_pDevice->SetCooperativeLevel(m_hWnd,DSSCL_PRIORITY) ) )
{
return S_FALSE;
}
return S_OK;
}
return S_FALSE;
}
HRESULT CHKSoundFilter::InitBufferNotify()
{
LPDIRECTSOUNDNOTIFY8 pNotify = NULL;
if( m_pDSBuffer == NULL )
{
return S_FALSE;
}
m_pDSBuffer->QueryInterface(IID_IDirectSoundNotify8,(void**)&pNotify);
{
m_hEvent = CreateEvent( NULL,FALSE,FALSE,NULL );
for(int i = 0;i< EVENTNUMBERS;i++)
{
m_NotifyArry[i].dwOffset = m_dwNotifySize*i;
m_NotifyArry[i].hEventNotify = m_hEvent;
}
HRESULT hr = pNotify->SetNotificationPositions( EVENTNUMBERS,m_NotifyArry );
pNotify->Release();
return hr;
}
return S_FALSE;
//LPDIRECTSOUNDNOTIFY8 lpDsNotify;
////DSBPOSITIONNOTIFY PositionNotify;
//HRESULT hr;
//if (SUCCEEDED(
// hr = m_pDSBuffer->QueryInterface(IID_IDirectSoundNotify,
// (LPVOID*)&lpDsNotify)))
//{
// m_hEvent = CreateEvent( NULL,FALSE,FALSE,NULL );
//for(int i = 0;i< EVENTNUMBERS;i++)
//{
// m_NotifyArry[i].dwOffset = m_dwNotifySize*i;
// m_NotifyArry[i].hEventNotify = m_hEvent;
//}
// // PositionNotify.dwOffset = DSBPN_OFFSETSTOP;
// //PositionNotify.hEventNotify = hMyEvent;
// hr = lpDsNotify->SetNotificationPositions(EVENTNUMBERS, m_NotifyArry);
// lpDsNotify->Release();
//}
//return hr;
}
void CHKSoundFilter::SetSoundFormat( const WAVEFORMATEX &pFormat )
{
memset( &m_wFormat,0,sizeof(WAVEFORMATEX) );
memcpy( &m_wFormat,&pFormat,sizeof(WAVEFORMATEX) );
m_bSetFormat = TRUE;
}
HRESULT CHKSoundFilter::CreateSecondlyBuffer()
{
//if(!m_bSetFormat)
//{
// return S_FALSE;
//}
//DSBUFFERDESC dsbdesc;
////LPDIRECTSOUNDBUFFER pDsb = NULL;
//memset( &dsbdesc,0,sizeof(DSBUFFERDESC) );
//dsbdesc.dwSize = sizeof( DSBUFFERDESC );
//dsbdesc.dwFlags = DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME;
//dsbdesc.dwBufferBytes = m_dwDSBufferSize;
//dsbdesc.lpwfxFormat = &m_wFormat;
//if(m_pDevice != NULL)
//{
// IDirectSoundBuffer* pDsb = NULL;
// HRESULT hr = m_pDevice->CreateSoundBuffer( &dsbdesc ,&pDsb,NULL );
// {
// HRESULT hr = pDsb->QueryInterface( IID_IDirectSoundBuffer8,(void**)m_pDSBuffer );
// pDsb->Release();
// return hr;
// }
// return S_OK;
//}
WAVEFORMATEX wfx;
DSBUFFERDESC dsbdesc;
LPDIRECTSOUNDBUFFER pDsb = NULL;
HRESULT hr;
// Set up WAV format structure.
memset(&wfx, 0, sizeof(WAVEFORMATEX));
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 2;
wfx.nSamplesPerSec = 44100;
wfx.nBlockAlign = 4;
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
wfx.wBitsPerSample = 16;
// Set up DSBUFFERDESC structure.
memset(&dsbdesc, 0, sizeof(DSBUFFERDESC));
dsbdesc.dwSize = sizeof(DSBUFFERDESC);
dsbdesc.dwFlags = DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME |
DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPOSITIONNOTIFY |
DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
dsbdesc.dwBufferBytes = m_dwDSBufferSize;
dsbdesc.lpwfxFormat = &wfx;
// Create buffer.
hr = m_pDevice->CreateSoundBuffer(&dsbdesc, &pDsb, NULL);
if (SUCCEEDED(hr))
{
hr = pDsb->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID*) &m_pDSBuffer);
pDsb->Release();
}
return S_OK;
}
HRESULT CHKSoundFilter::SetupDirectSound()
{
HRESULT hr = CreateDirectSoundDevice();
if(SUCCEEDED(hr))
{
WAVEFORMATEX wFormat;
memset( &wFormat,0,sizeof(WAVEFORMATEX) );
wFormat.cbSize = sizeof(WAVEFORMATEX);
wFormat.wFormatTag = WAVE_FORMAT_PCM;
wFormat.nChannels = 2;
wFormat.nSamplesPerSec = 44100;
wFormat.nBlockAlign = 4;
wFormat.nAvgBytesPerSec = m_wFormat.nSamplesPerSec * m_wFormat.nBlockAlign;
wFormat.wBitsPerSample = 16;
SetSoundFormat( wFormat );
hr = CreateSecondlyBuffer();
if( SUCCEEDED(hr) )
{
hr = InitBufferNotify();
}
return hr;
}
return S_FALSE;
}
STDMETHODIMP CHKSoundFilter::SetWnd( HWND hWnd )
{
m_hWnd = hWnd;
return S_OK;
}
STDMETHODIMP CHKSoundFilter::NonDelegatingQueryInterface( const IID &riid,void ** ppv )
{
CheckPointer(ppv,E_POINTER);
if(riid == IID_IStreamInterface)
{
return GetInterface( (IStreamInterface*)this,ppv );
}
else
{
return CBaseFilter::NonDelegatingQueryInterface(riid,ppv);
}
}
STDMETHODIMP CHKSoundFilter::Get_Memoryaddr(BYTE **pData)
{
return S_OK;
}
STDMETHODIMP CHKSoundFilter::Get_MemoryLength( int &nLen )
{
return S_OK;
}
void CHKSoundFilter::ReadDataFromBuffer()
{
LPVOID lpvPtr1;
评论5