// ACMTransformer.h: interface for the ACMTransformer class. // ////////////////////////////////////////////////////////////////////// #ifndef AFX_ACMTRANSFORMER_H__86E322E0_F705_4ED1_9572_2A65C9105F62__INCLUDED_ #define AFX_ACMTRANSFORMER_H__86E322E0_F705_4ED1_9572_2A65C9105F62__INCLUDED_ #include #include #include #include #include #include "AudioTransformer.h" #include "Parameters.h" #define ACMTRANSFORMER_NUM_STREAMHEADER 1 class ACMTransformer : public AudioTransformer { public: ACMTransformer(); virtual ~ACMTransformer(); SetSourceFormat(WAVEFORMATEX &wfxSource); SetDestinationFormat(WAVEFORMATEX &wfxDest); int TransformStarted(); int TransformStopped(); int SetOutputDuration(int millisecs); int FlushBuffer(); protected: virtual int TransformAudioSamples(std::vector > &data, AudioSample **ppAudioSample); virtual int SetTraceLevel(); int RenderAudioSamples(std::vector > &data); int GenerateData(AudioSample **ppAudioSample); private: ACMSTREAMHEADER *GetBuffer(); void ReleaseBuffer(ACMSTREAMHEADER *acmHdr); bool IsRunning(); void SetRunning(bool isRunning); int AddConvertedData(unsigned char *dataIn, int numBytes); static void CALLBACK ACMCallback(HACMSTREAM has, UINT uMsg, DWORD dwInstance, LPARAM lParam1, LPARAM lParam2); private: WAVEFORMATEX sourceFormat; WAVEFORMATEX destFormat; HACMSTREAM hACMStream; ACMSTREAMHEADER acmStreamHeader[ACMTRANSFORMER_NUM_STREAMHEADER]; unsigned char sourceBuffer[ACMTRANSFORMER_NUM_STREAMHEADER][ACMTRANSFORMER_MAX_SOURCEBUFFERSIZE]; unsigned char destBuffer[ACMTRANSFORMER_NUM_STREAMHEADER][ACMTRANSFORMER_MAX_DESTBUFFERSIZE]; std::queue outputQueue; std::list freeBuffers; CRITICAL_SECTION outputQueueMutex; CRITICAL_SECTION freeBuffersMutex; CRITICAL_SECTION stateMutex; CRITICAL_SECTION acmMutex; CRITICAL_SECTION queryStateMutex; HANDLE freeBuffersEvent; HANDLE outputEnqueueEvent; HANDLE outputDequeueEvent; int outputDuration; bool bRunning; }; #endif // !defined(AFX_ACMTRANSFORMER_H__86E322E0_F705_4ED1_9572_2A65C9105F62__INCLUDED_)