123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- #ifndef _DXI_H_
- #define _DXI_H_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- #include <DeferZeroFill.h>
- // DirectX automation helper
- #include "MediaParams.h"
- ////////////////////////////////////////////////////////////////////////////////
- struct AudioBuffer
- {
- long cSamp; // number of samples in the buffer
- long lOffset; // offset into the data to process
- IMediaSample* pms; // the raw IMediaSample for this buffer
- AudioBuffer() : cSamp(0), lOffset(0), pms(NULL) {}
- //----------------------------------------------------------------------------
- // Get a pointer to the audio samples, zero-filling if necesssary
- float* GetPointer()
- {
- // Get the raw-pointer
- BYTE* pb = NULL;
- pms->GetPointer( &pb );
- // We cannot defer the zero fill any longer!
- if (bZero)
- {
- IDeferZeroFill* pdzf;
- if (SUCCEEDED( pms->QueryInterface( IID_IDeferZeroFill, (void**)&pdzf ) ))
- {
- // IDeferZeroFill will have taken care of the zero-fill for us, by
- // virtue of our calling IMediaSample::GetPointer. Nothing more to do.
- pdzf->Release();
- }
- else
- {
- // No IDeferZeroFill is available. We must zero-fill the hard way.
- memset( pb, 0, cSamp * sizeof(float) );
- }
- bZero = FALSE;
- }
- return reinterpret_cast<float*>( pb + lOffset );
- }
- //----------------------------------------------------------------------------
- // Allow buffers to be tagged as being all zeroes, without actually filling
- // any data until someone asks for the buffer pointer
- BOOL GetZerofill() const { return bZero; }
- void SetZerofill( BOOL bZerofill )
- {
- bZero = bZerofill;
- IDeferZeroFill* pdzf;
- if (SUCCEEDED( pms->QueryInterface( IID_IDeferZeroFill, (void**)&pdzf ) ))
- {
- pdzf->put_NeedsZerofill( bZero );
- pdzf->Release();
- }
- }
- private:
- BOOL bZero;
- };
- ////////////////////////////////////////////////////////////////////////////////
- class CDXi : public CCritSec
- {
- public:
- virtual HRESULT Initialize() = 0;
- virtual HRESULT IsValidInputFormat( const WAVEFORMATEX* pwfx ) const = 0;
- virtual HRESULT IsValidOutputFormat( const WAVEFORMATEX* pwfx ) const = 0;
- virtual HRESULT IsValidTransform( const WAVEFORMATEX* pwfxIn, const WAVEFORMATEX* pwfxOut ) const = 0;
- virtual HRESULT SuggestOutputFormat( WAVEFORMATEX* pwfx ) const = 0;
- virtual const WAVEFORMATEX* GetInputFormat() const { return &m_wfxIn; }
- virtual const WAVEFORMATEX* GetOutputFormat() const { return &m_wfxOut; }
- virtual HRESULT Process( LONGLONG llSampAudioTimestamp,
- AudioBuffer* pbufIn,
- AudioBuffer* pbufOut ) = 0;
- virtual HRESULT AllocateResources() = 0;
- virtual HRESULT FreeResources() = 0;
- virtual int PersistGetSize() const = 0;
- virtual HRESULT PersistLoad( IStream* pStream ) = 0;
- virtual HRESULT PersistSave( IStream* pStream ) = 0;
- protected:
- WAVEFORMATEX m_wfxIn;
- WAVEFORMATEX m_wfxOut;
- CMediaParams* m_pMediaParams;
- float GetParamValue( DWORD dwParam ) const
- {
- return m_pMediaParams->GetParamEnvelope( dwParam ).GetCurrentValue();
- }
- HRESULT GetParamDeltas( DWORD dwParam, double* pdDelta1, double* pdDelta2 ) const
- {
- return m_pMediaParams->GetParamEnvelope( dwParam ).GetCurrentDeltas( pdDelta1, pdDelta2 );
- }
- };
- ////////////////////////////////////////////////////////////////////////////////
- #endif //_DXI_H_
|