|
// CCNMediaTerm.h : Declaration of the CCCNMediaTerm
|
|
#ifndef __CCNMEDIATERM_H_
|
#define __CCNMEDIATERM_H_
|
|
#include "resource.h" // main symbols
|
#include "CCNSMTCP.h"
|
#include <atlctl.h>
|
#include <afxmt.h>
|
#include <vector>
|
|
#include "../../Tracer/Tracer.h"
|
|
#include <mmsystem.h>
|
#include <map>
|
|
#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<CComMultiThreadModel>,
|
public CComCoClass<CCCNMediaTerm, &CLSID_CCNMediaTerm>,
|
public IConnectionPointContainerImpl<CCCNMediaTerm>,
|
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<IUnknown> 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<unsigned int, FilePlay *> filesPlaying;
|
FilePlay *extraFilePlay;
|
unsigned int waveinDeviceID, waveoutDeviceID;
|
RXParameters rxParameters;
|
TXParameters txParameters;
|
|
CCriticalSection Mutex;
|
};
|
|
#endif //__CCNMEDIATERM_H_
|