ghy
Alejandro Acuña
2025-03-12 26319e4c5bfbee722c15b8e7ccca9b6127bb1cb8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
    
// 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_