// CCNMediaTerm.h : Declaration of the CCCNMediaTerm #ifndef __CCNMEDIATERM_H_ #define __CCNMEDIATERM_H_ #include "resource.h" // main symbols #include "CCNSMTCP.h" #include #include #include #include "../../Tracer/Tracer.h" #include #include #include "../MTC/WaveAudioSource.h" #include "../MTC/WaveAudioSink.h" #include "../MTC/RTPAudioSink.h" #include "../MTC/RTPAudioSource.h" #include "../MTC/FIRTransformer.h" #include "../MTC/PCM2G711Transformer.h" #include "../MTC/G7112PCMTransformer.h" #include "../MTC/Limiter.h" #include "../MTC/PCMMixer.h" #include "../MTC/ACMTransformer.h" #include "../MTC/PCMVolumeTransformer.h" #include "../MTC/WaveFileSource.h" #include "../MTC/TraceUser.h" #include "../MTC/WaveFormats.h" #include "../MTC/VoiceActivityDetector.h" #include "../MTC/RTPJitterBuffer.h" #include "../MTC/FixedSizeAudioBuffer.h" #include "../MTC/GenericRTP2PCMDecoder.h" #include "../MTC/PCMVolumeMaximizer.h" using namespace std; enum {STATE_STOPPED, STATE_STARTING, STATE_RUNNING, STATE_STOPPING}; ///////////////////////////////////////////////////////////////////////////// class RXParameters { public: RXParameters() { CompressionType = MillisecPacketSize = EchoCancellationValue = G723BitRate = UDPPortNumber = -1; } public: long CompressionType; long MillisecPacketSize; long EchoCancellationValue; long G723BitRate; long UDPPortNumber; }; class TXParameters { public: TXParameters() { CompressionType = MillisecPacketSize = PrecedenceValue = SilenceSuppression = G723BitRate = UDPPortNumber = -1; MaxFramesPerPacket = 0; strcpy(strHostName, ""); } public: long CompressionType; long MillisecPacketSize; long PrecedenceValue; long SilenceSuppression; unsigned short MaxFramesPerPacket; long G723BitRate; char strHostName[1025];; long UDPPortNumber; }; class FireEventThreadParams { public: unsigned long cookie; bool receiveSide; }; class CCCNMediaTerm; class FilePlay : public WaveFileSourceListener, public TraceUser { public: FilePlay(AudioSink *audioSink, int outputDuration, bool bTransmit); virtual ~FilePlay(); int LoadFile(const char *fileName); int PlayOnce(); int PlayInLoop(); int Start(); void Cleanup(); void CleanupImmediately(); int Stop(); int StopImmediately(); bool IsRunning(); int SetVolume(int volume); int GetVolume(); unsigned int GetCookie(); int Connect(AudioSink *audioSink); int Disconnect(); int SetOutputDuration(int outputDuration); int SetDestinationFormat(WAVEFORMATEX wfx); void FilePlayStarted(WaveFileSource *waveFileSource, char *waveFileName); void FilePlayStopped(WaveFileSource *waveFileSource, char *waveFileName); bool Transmitting(); int SetTraceLevel(); static int Initialize(CCCNMediaTerm *mediaTerm); static int Uninitialize(); private: static DWORD WINAPI FireEventThread(LPVOID params); private: WaveFileSource *waveFileSource; ACMTransformer *acmTransformer; PCMVolumeTransformer *pcmVolumeTransformer; AudioSink *audioSink; unsigned int cookie; bool bTransmit; CRITICAL_SECTION stateMutex; HANDLE stateChangedEvent; int currentState; static CCCNMediaTerm *mediaTerm; static int numOutstandingEvents; static CRITICAL_SECTION fireEventThreadMutex; static HANDLE fireEventThreadEvent; static bool closing; }; // CCCNMediaTerm class ATL_NO_VTABLE CCCNMediaTerm : public TraceUser, public CComObjectRootEx, public CComCoClass, public IConnectionPointContainerImpl, public ICCNMediaTerm, public CProxy_ICCNMediaTermEvents< CCCNMediaTerm > { public: CCCNMediaTerm() { initialized = false; tracer.SetSubFacilityName("MTC"); SetTraceLevel(); m_pUnkMarshaler = NULL; } ~CCCNMediaTerm() { UnInitialize(); } DECLARE_REGISTRY_RESOURCEID(IDR_CCNMEDIATERM) DECLARE_NOT_AGGREGATABLE(CCCNMediaTerm) DECLARE_GET_CONTROLLING_UNKNOWN() DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CCCNMediaTerm) COM_INTERFACE_ENTRY(ICCNMediaTerm) COM_INTERFACE_ENTRY(IConnectionPointContainer) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) END_COM_MAP() BEGIN_CONNECTION_POINT_MAP(CCCNMediaTerm) CONNECTION_POINT_ENTRY(IID__ICCNMediaTermEvents) END_CONNECTION_POINT_MAP() HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; // ICCNMediaTerm public: STDMETHOD(Initialize)(); STDMETHOD(UnInitialize)(); STDMETHOD(SetAudioReceivePort)(/*[in]*/ long nUDPPortNumber); STDMETHOD(SetAudioDestination)(/*[in]*/ BSTR strHostName, /*[in]*/ long nUDPortNumber); STDMETHOD(SetAudioCodecTX)(/*[in]*/ long CompressionType, /*[in]*/ long MillisecPacketSize, /*[in]*/ long PrecedenceValue, /*[in]*/ long SilenceSuppression, /*[in]*/ unsigned short MaxFramesPerPacket, /*[in]*/ long G723BitRate); STDMETHOD(SetAudioCodecRX)(/*[in]*/ long CompressionType, /*[in]*/ long MillisecPacketSize, /*[in]*/ long EchoCancellationValue, /*[in]*/ long G723BitRate); STDMETHOD(StartDtmfTone)(/*[in]*/ long cToneAsChar, /*[in]*/ long OnTime, /*[in]*/ long OffTime); STDMETHOD(StopDtmfTone)(); STDMETHOD(StopAudioReceive)(); STDMETHOD(StartAudioReceive)(); STDMETHOD(StopMicrophone)(); STDMETHOD(StartMicrophone)(); STDMETHOD(NetworkMonitor)(/*[in]*/ unsigned long Enable, /*[in]*/ unsigned long DurationMillisec); STDMETHOD(SetFilePlayVolume)(/*[in]*/ unsigned long cookie, /*[in]*/ unsigned long volume); STDMETHOD(SetMicrophoneVolume)(/*[in]*/ unsigned long deviceID, /*[in]*/ unsigned long volume); STDMETHOD(SetSpeakerVolume)(/*[in]*/ unsigned long deviceID, /*[in]*/ unsigned long volume); STDMETHOD(StopRX)(); STDMETHOD(StartRX)(/*[in]*/ unsigned long waveoutDeviceID); STDMETHOD(StopTX)(); STDMETHOD(StartTX)(/*[in]*/ unsigned long waveinDeviceID); STDMETHOD(StopPlayingFileRX)(/*[in]*/ unsigned long Cookie); STDMETHOD(StopPlayingFileTX)(/*[in]*/ unsigned long Cookie); STDMETHOD(StartPlayingFileRX)(/*[in]*/ BSTR Filename, /*[in]*/ unsigned long Mode, /*[in]*/ unsigned long waveoutDeviceID, /*[in]*/ unsigned long volume, /*[out]*/ long * Cookie); STDMETHOD(StartPlayingFileTX)(/*[in]*/ BSTR Filename, /*[in]*/ unsigned long Mode, /*[in]*/ unsigned long volume, /*[out]*/ long * Cookie); // CallBack Methods void FireEndOfFileRX(unsigned long cookie); void FireEndOfFileTX(unsigned long cookie); // Trace methods int SetTraceLevel(); void MessageHandler(); private: int StopAllFiles(bool transmitSide); int RemoveNonPlayingFiles(); HRESULT SetSystemMicrophoneVolume(unsigned long volume); bool SpeakerAvailable(); bool MicrophoneAvailable(); // variables WaveAudioSource *waveSource; WaveAudioSink *waveSink, *filePlayWaveSink; RTPAudioSink *rtpSink; RTPAudioSource *rtpSource; FIRTransformer *inputFIRTransformer; FIRTransformer *outputFIRTransformer; Limiter *limiter; G7112PCMTransformer *g7112PcmTransformer; PCM2G711Transformer *pcm2G711Transformer; PCMMixer *txPCMMixer, *rxPCMMixer; AudioTransformer *rxTransformer, *txTransformer; VoiceActivityDetector *voiceActivityDetector; RTPJitterBuffer *rtpJitterBuffer; FixedSizeAudioBuffer *fixedSizeAudioBuffer; GenericRTP2PCMDecoder *genericRTP2PCMDecoder; PCMVolumeMaximizer *pcmVolumeMaximizer; CRITICAL_SECTION filesPlayingMutex; bool initialized; bool btxVAD, btxPreEmphasis; bool brxPostEmphasis, brxVolumeLimit; bool brxRunning, btxRunning, bFilePlayRunning; int rxDuration, txDuration; map filesPlaying; FilePlay *extraFilePlay; unsigned int waveinDeviceID, waveoutDeviceID; RXParameters rxParameters; TXParameters txParameters; CCriticalSection Mutex; }; #endif //__CCNMEDIATERM_H_