1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include <math.h>
12 #include "webrtc/test/testsupport/fileutils.h"
13 #include "webrtc/voice_engine/test/win_test/WinTest.h"
14 #include "webrtc/voice_engine/test/win_test/WinTestDlg.h"
15 #include "webrtc/voice_engine/test/win_test/stdafx.h"
16 
17 #ifdef _DEBUG
18 #define new DEBUG_NEW
19 #endif
20 
21 using namespace webrtc;
22 
23 unsigned char key[30] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
24 
25 // Hack to convert char to TCHAR, using two buffers to be able to
26 // call twice in the same statement
27 TCHAR convertTemp1[256] = {0};
28 TCHAR convertTemp2[256] = {0};
29 bool convertBufferSwitch(false);
CharToTchar(const char * str,int len)30 TCHAR* CharToTchar(const char* str, int len)
31 {
32 #ifdef _UNICODE
33   TCHAR* temp = convertBufferSwitch ? convertTemp1 : convertTemp2;
34   convertBufferSwitch = !convertBufferSwitch;
35   memset(temp, 0, sizeof(convertTemp1));
36   MultiByteToWideChar(CP_UTF8, 0, str, len, temp, 256);
37   return temp;
38 #else
39   return str;
40 #endif
41 }
42 
43 // Hack to convert TCHAR to char
44 char convertTemp3[256] = {0};
TcharToChar(TCHAR * str,int len)45 char* TcharToChar(TCHAR* str, int len)
46 {
47 #ifdef _UNICODE
48   memset(convertTemp3, 0, sizeof(convertTemp3));
49   WideCharToMultiByte(CP_UTF8, 0, str, len, convertTemp3, 256, 0, 0);
50   return convertTemp3;
51 #else
52   return str;
53 #endif
54 }
55 
56 // ----------------------------------------------------------------------------
57 //    VoiceEngineObserver
58 // ----------------------------------------------------------------------------
59 
CallbackOnError(int channel,int errCode)60 void CWinTestDlg::CallbackOnError(int channel, int errCode)
61 {
62     _nErrorCallbacks++;
63 
64     CString str;
65     str.Format(_T("[#%d] CallbackOnError(channel=%d) => errCode = %d"), _nErrorCallbacks, channel, errCode);
66     if (errCode == VE_RECEIVE_PACKET_TIMEOUT)
67     {
68         str += _T(" <=> VE_RECEIVE_PACKET_TIMEOUT");
69     }
70     else if (errCode == VE_PACKET_RECEIPT_RESTARTED)
71     {
72         str += _T(" <=> VE_PACKET_RECEIPT_RESTARTED");
73     }
74     else if (errCode == VE_RUNTIME_PLAY_WARNING)
75     {
76         str += _T(" <=> VE_RUNTIME_PLAY_WARNING");
77     }
78     else if (errCode == VE_RUNTIME_REC_WARNING)
79     {
80         str += _T(" <=> VE_RUNTIME_REC_WARNING");
81     }
82     else if (errCode == VE_RUNTIME_PLAY_ERROR)
83     {
84         str += _T(" <=> VE_RUNTIME_PLAY_ERROR");
85     }
86     else if (errCode == VE_RUNTIME_REC_ERROR)
87     {
88         str += _T(" <=> VE_RUNTIME_REC_ERROR");
89     }
90     else if (errCode == VE_SATURATION_WARNING)
91     {
92         str += _T(" <=> VE_SATURATION_WARNING");
93     }
94     else if (errCode == VE_TYPING_NOISE_WARNING)
95     {
96         str += _T(" <=> VE_TYPING_NOISE_WARNING");
97     }
98     else if (errCode == VE_REC_DEVICE_REMOVED)
99     {
100         str += _T(" <=> VE_REC_DEVICE_REMOVED");
101     }
102     // AfxMessageBox((LPCTSTR)str, MB_OK);
103     SetDlgItemText(IDC_EDIT_ERROR_CALLBACK, (LPCTSTR)str);
104 }
105 
106 // ----------------------------------------------------------------------------
107 //    VoERTPObserver
108 // ----------------------------------------------------------------------------
109 
OnIncomingCSRCChanged(int channel,unsigned int CSRC,bool added)110 void CWinTestDlg::OnIncomingCSRCChanged(int channel, unsigned int CSRC, bool added)
111 {
112     CString str;
113     str.Format(_T("OnIncomingCSRCChanged(channel=%d) => CSRC=%u, added=%d"), channel, CSRC, added);
114     SetDlgItemText(IDC_EDIT_ERROR_CALLBACK, (LPCTSTR)str);
115 }
116 
OnIncomingSSRCChanged(int channel,unsigned int SSRC)117 void CWinTestDlg::OnIncomingSSRCChanged(int channel, unsigned int SSRC)
118 {
119     CString str;
120     str.Format(_T("OnIncomingSSRCChanged(channel=%d) => SSRC=%u"), channel, SSRC);
121     SetDlgItemText(IDC_EDIT_ERROR_CALLBACK, (LPCTSTR)str);
122 }
123 
124 // ----------------------------------------------------------------------------
125 //    Transport
126 // ----------------------------------------------------------------------------
127 
128 class MyTransport : public Transport
129 {
130 public:
131     MyTransport(VoENetwork* veNetwork);
132     int SendPacket(int channel, const void* data, size_t len) override;
133     int SendRTCPPacket(int channel, const void* data, size_t len) override;
134 
135 private:
136     VoENetwork* _veNetworkPtr;
137 };
138 
MyTransport(VoENetwork * veNetwork)139 MyTransport::MyTransport(VoENetwork* veNetwork) :
140     _veNetworkPtr(veNetwork)
141 {
142 }
143 
144 int
SendPacket(int channel,const void * data,size_t len)145 MyTransport::SendPacket(int channel, const void *data, size_t len)
146 {
147     _veNetworkPtr->ReceivedRTPPacket(channel, data, len);
148     return len;
149 }
150 
151 int
SendRTCPPacket(int channel,const void * data,size_t len)152 MyTransport::SendRTCPPacket(int channel, const void *data, size_t len)
153 {
154     _veNetworkPtr->ReceivedRTCPPacket(channel, data, len);
155     return len;
156 }
157 
158 // ----------------------------------------------------------------------------
159 //    VoEMediaProcess
160 // ----------------------------------------------------------------------------
161 
162 class MediaProcessImpl : public VoEMediaProcess
163 {
164 public:
165     MediaProcessImpl();
166     virtual void Process(int channel,
167                          ProcessingTypes type,
168                          int16_t audio_10ms[],
169                          int length,
170                          int samplingFreqHz,
171                          bool stereo);
172 };
173 
MediaProcessImpl()174 MediaProcessImpl::MediaProcessImpl()
175 {
176 }
177 
Process(int channel,ProcessingTypes type,int16_t audio_10ms[],int length,int samplingFreqHz,bool stereo)178 void MediaProcessImpl::Process(int channel,
179                                ProcessingTypes type,
180                                int16_t audio_10ms[],
181                                int length,
182                                int samplingFreqHz,
183                                bool stereo)
184 {
185     int x = rand() % 100;
186 
187     for (int i = 0; i < length; i++)
188     {
189         if (channel == -1)
190         {
191             if (type == kPlaybackAllChannelsMixed)
192             {
193                 // playout: scale up
194                 if (!stereo)
195                 {
196                     audio_10ms[i] = (audio_10ms[i] << 2);
197                 }
198                 else
199                 {
200                     audio_10ms[2*i] = (audio_10ms[2*i] << 2);
201                     audio_10ms[2*i+1] = (audio_10ms[2*i+1] << 2);
202                 }
203             }
204             else
205             {
206                 // recording: emulate packet loss by "dropping" 10% of the packets
207                 if (x >= 0 && x < 10)
208                 {
209                     if (!stereo)
210                     {
211                         audio_10ms[i] = 0;
212                     }
213                     else
214                     {
215                         audio_10ms[2*i] = 0;
216                         audio_10ms[2*i+1] = 0;
217                     }
218                 }
219             }
220         }
221         else
222         {
223             if (type == kPlaybackPerChannel)
224             {
225                 // playout: mute
226                 if (!stereo)
227                 {
228                     audio_10ms[i] = 0;
229                 }
230                 else
231                 {
232                     audio_10ms[2*i] = 0;
233                     audio_10ms[2*i+1] = 0;
234                 }
235             }
236             else
237             {
238                 // recording: emulate packet loss by "dropping" 50% of the packets
239                 if (x >= 0 && x < 50)
240                 {
241                     if (!stereo)
242                     {
243                         audio_10ms[i] = 0;
244                     }
245                     else
246                     {
247                         audio_10ms[2*i] = 0;
248                         audio_10ms[2*i+1] = 0;
249                     }
250                 }
251             }
252         }
253     }
254 }
255 
256 // ----------------------------------------------------------------------------
257 //    TelephoneEventObserver
258 // ----------------------------------------------------------------------------
259 
260 class TelephoneEventObserver: public VoETelephoneEventObserver
261 {
262 public:
263     TelephoneEventObserver(CWnd* editControlOut, CWnd* editControlIn);
264     virtual void OnReceivedTelephoneEventInband(int channel, int eventCode,
265                                                 bool endOfEvent);
266     virtual void OnReceivedTelephoneEventOutOfBand(int channel, int eventCode,
267                                                    bool endOfEvent);
268 private:
269     CWnd* _editControlOutPtr;
270     CWnd* _editControlInPtr;
271 };
272 
TelephoneEventObserver(CWnd * editControlOut,CWnd * editControlIn)273 TelephoneEventObserver::TelephoneEventObserver(CWnd* editControlOut, CWnd* editControlIn) :
274     _editControlOutPtr(editControlOut),
275     _editControlInPtr(editControlIn)
276 {
277 }
278 
OnReceivedTelephoneEventInband(int channel,int eventCode,bool endOfEvent)279 void TelephoneEventObserver::OnReceivedTelephoneEventInband(int channel,
280                                                             int eventCode,
281                                                             bool endOfEvent)
282 {
283     CString msg;
284     if (endOfEvent)
285     {
286         msg.AppendFormat(_T("%d [END]"), eventCode);
287         _editControlInPtr->SetWindowText((LPCTSTR)msg);
288     }
289     else
290     {
291         msg.AppendFormat(_T("%d [START]"), eventCode);
292         _editControlInPtr->SetWindowText((LPCTSTR)msg);
293     }
294 }
295 
OnReceivedTelephoneEventOutOfBand(int channel,int eventCode,bool endOfEvent)296 void TelephoneEventObserver::OnReceivedTelephoneEventOutOfBand(int channel,
297                                                                int eventCode,
298                                                                bool endOfEvent)
299 {
300     CString msg;
301     if (endOfEvent)
302     {
303         msg.AppendFormat(_T("%d [END]"), eventCode);
304         _editControlOutPtr->SetWindowText((LPCTSTR)msg);
305     }
306     else
307     {
308         msg.AppendFormat(_T("%d [START]"), eventCode);
309         _editControlOutPtr->SetWindowText((LPCTSTR)msg);
310     }
311 }
312 
313 // ----------------------------------------------------------------------------
314 //    RxVadCallback
315 // ----------------------------------------------------------------------------
316 
317 class RxCallback : public VoERxVadCallback
318 {
319 public:
RxCallback()320     RxCallback() : vad_decision(-1) {};
321 
OnRxVad(int,int vadDecision)322     virtual void OnRxVad(int , int vadDecision)
323     {
324         vad_decision = vadDecision;
325     }
326 
327     int vad_decision;
328 };
329 
330 // ----------------------------------------------------------------------------
331 //                                 CAboutDlg dialog
332 // ----------------------------------------------------------------------------
333 
334 class CAboutDlg : public CDialog
335 {
336 public:
337     CAboutDlg();
338 
339 // Dialog Data
340     enum { IDD = IDD_ABOUTBOX };
341 
342     protected:
343     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
344 
345 // Implementation
346 protected:
347     DECLARE_MESSAGE_MAP()
348 };
349 
CAboutDlg()350 CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
351 {
352 }
353 
DoDataExchange(CDataExchange * pDX)354 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
355 {
356     CDialog::DoDataExchange(pDX);
357 }
358 
359 BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
360 END_MESSAGE_MAP()
361 
362 // ----------------------------------------------------------------------------
363 //                               CTelephonyEvent dialog
364 // ----------------------------------------------------------------------------
365 
366 class CTelephonyEvent : public CDialog
367 {
368     DECLARE_DYNAMIC(CTelephonyEvent)
369 
370 public:
371     CTelephonyEvent(VoiceEngine* voiceEngine, int channel, CDialog* pParentDialog, CWnd* pParent = NULL);   // standard constructor
372     virtual ~CTelephonyEvent();
373 
374 // Dialog Data
375     enum { IDD = IDD_DTMF_DIALOG };
376 
377 protected:
378     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
379     virtual BOOL OnInitDialog();
380 
381     DECLARE_MESSAGE_MAP()
382 public:
383     afx_msg void OnBnClickedButton1();
384     afx_msg void OnBnClickedButton2();
385     afx_msg void OnBnClickedButton3();
386     afx_msg void OnBnClickedButton4();
387     afx_msg void OnBnClickedButton5();
388     afx_msg void OnBnClickedButton6();
389     afx_msg void OnBnClickedButton7();
390     afx_msg void OnBnClickedButton8();
391     afx_msg void OnBnClickedButton9();
392     afx_msg void OnBnClickedButton10();
393     afx_msg void OnBnClickedButton11();
394     afx_msg void OnBnClickedButton12();
395     afx_msg void OnBnClickedButtonA();
396     afx_msg void OnBnClickedButtonB();
397     afx_msg void OnBnClickedButtonC();
398     afx_msg void OnBnClickedButtonD();
399     afx_msg void OnBnClickedCheckDtmfPlayoutRx();
400     afx_msg void OnBnClickedCheckDtmfPlayTone();
401     afx_msg void OnBnClickedCheckStartStopMode();
402     afx_msg void OnBnClickedCheckEventInband();
403     afx_msg void OnBnClickedCheckDtmfFeedback();
404     afx_msg void OnBnClickedCheckDirectFeedback();
405     afx_msg void OnBnClickedRadioSingle();
406     afx_msg void OnBnClickedRadioMulti();
407     afx_msg void OnBnClickedRadioStartStop();
408     afx_msg void OnBnClickedButtonSetRxTelephonePt();
409     afx_msg void OnBnClickedButtonSetTxTelephonePt();
410     afx_msg void OnBnClickedButtonSendTelephoneEvent();
411     afx_msg void OnBnClickedCheckDetectInband();
412     afx_msg void OnBnClickedCheckDetectOutOfBand();
413     afx_msg void OnBnClickedCheckEventDetection();
414 
415 private:
416     void SendTelephoneEvent(unsigned char eventCode);
417 
418 private:
419     VoiceEngine*                _vePtr;
420     VoEBase*                    _veBasePtr;
421     VoEDtmf*                    _veDTMFPtr;
422     VoECodec*                   _veCodecPtr;
423     int                         _channel;
424     CString                     _strMsg;
425     CDialog*                    _parentDialogPtr;
426     TelephoneEventObserver*     _telephoneEventObserverPtr;
427     bool                        _PlayDtmfToneLocally;
428     bool                        _modeStartStop;
429     bool                        _modeSingle;
430     bool                        _modeSequence;
431     bool                        _playingDTMFTone;
432     bool                        _outOfBandEventDetection;
433     bool                        _inbandEventDetection;
434 };
435 
IMPLEMENT_DYNAMIC(CTelephonyEvent,CDialog)436 IMPLEMENT_DYNAMIC(CTelephonyEvent, CDialog)
437 
438 CTelephonyEvent::CTelephonyEvent(VoiceEngine* voiceEngine,
439                                  int channel,
440                                  CDialog* pParentDialog,
441                                  CWnd* pParent /*=NULL*/)
442     : _vePtr(voiceEngine),
443       _channel(channel),
444       _PlayDtmfToneLocally(false),
445       _modeStartStop(false),
446       _modeSingle(true),
447       _modeSequence(false),
448       _playingDTMFTone(false),
449       _outOfBandEventDetection(true),
450       _inbandEventDetection(false),
451       _parentDialogPtr(pParentDialog),
452       _telephoneEventObserverPtr(NULL),
453       CDialog(CTelephonyEvent::IDD, pParent)
454 {
455     _veBasePtr = VoEBase::GetInterface(_vePtr);
456     _veDTMFPtr = VoEDtmf::GetInterface(_vePtr);
457     _veCodecPtr = VoECodec::GetInterface(_vePtr);
458 }
459 
~CTelephonyEvent()460 CTelephonyEvent::~CTelephonyEvent()
461 {
462     _veDTMFPtr->Release();
463     _veCodecPtr->Release();
464     _veBasePtr->Release();
465 
466     if (_telephoneEventObserverPtr)
467     {
468         _veDTMFPtr->DeRegisterTelephoneEventDetection(_channel);
469         delete _telephoneEventObserverPtr;
470         _telephoneEventObserverPtr = NULL;
471     }
472 }
473 
DoDataExchange(CDataExchange * pDX)474 void CTelephonyEvent::DoDataExchange(CDataExchange* pDX)
475 {
476     CDialog::DoDataExchange(pDX);
477 }
478 
479 
BEGIN_MESSAGE_MAP(CTelephonyEvent,CDialog)480 BEGIN_MESSAGE_MAP(CTelephonyEvent, CDialog)
481     ON_BN_CLICKED(IDC_BUTTON_1, &CTelephonyEvent::OnBnClickedButton1)
482     ON_BN_CLICKED(IDC_BUTTON_2, &CTelephonyEvent::OnBnClickedButton2)
483     ON_BN_CLICKED(IDC_BUTTON_3, &CTelephonyEvent::OnBnClickedButton3)
484     ON_BN_CLICKED(IDC_BUTTON_4, &CTelephonyEvent::OnBnClickedButton4)
485     ON_BN_CLICKED(IDC_BUTTON_5, &CTelephonyEvent::OnBnClickedButton5)
486     ON_BN_CLICKED(IDC_BUTTON_6, &CTelephonyEvent::OnBnClickedButton6)
487     ON_BN_CLICKED(IDC_BUTTON_7, &CTelephonyEvent::OnBnClickedButton7)
488     ON_BN_CLICKED(IDC_BUTTON_8, &CTelephonyEvent::OnBnClickedButton8)
489     ON_BN_CLICKED(IDC_BUTTON_9, &CTelephonyEvent::OnBnClickedButton9)
490     ON_BN_CLICKED(IDC_BUTTON_10, &CTelephonyEvent::OnBnClickedButton10)
491     ON_BN_CLICKED(IDC_BUTTON_11, &CTelephonyEvent::OnBnClickedButton11)
492     ON_BN_CLICKED(IDC_BUTTON_12, &CTelephonyEvent::OnBnClickedButton12)
493     ON_BN_CLICKED(IDC_BUTTON_13, &CTelephonyEvent::OnBnClickedButtonA)
494     ON_BN_CLICKED(IDC_BUTTON_14, &CTelephonyEvent::OnBnClickedButtonB)
495     ON_BN_CLICKED(IDC_BUTTON_15, &CTelephonyEvent::OnBnClickedButtonC)
496     ON_BN_CLICKED(IDC_BUTTON_16, &CTelephonyEvent::OnBnClickedButtonD)
497     ON_BN_CLICKED(IDC_CHECK_DTMF_PLAYOUT_RX, &CTelephonyEvent::OnBnClickedCheckDtmfPlayoutRx)
498     ON_BN_CLICKED(IDC_CHECK_DTMF_PLAY_TONE, &CTelephonyEvent::OnBnClickedCheckDtmfPlayTone)
499     ON_BN_CLICKED(IDC_CHECK_EVENT_INBAND, &CTelephonyEvent::OnBnClickedCheckEventInband)
500     ON_BN_CLICKED(IDC_CHECK_DTMF_FEEDBACK, &CTelephonyEvent::OnBnClickedCheckDtmfFeedback)
501     ON_BN_CLICKED(IDC_CHECK_DIRECT_FEEDBACK, &CTelephonyEvent::OnBnClickedCheckDirectFeedback)
502     ON_BN_CLICKED(IDC_RADIO_SINGLE, &CTelephonyEvent::OnBnClickedRadioSingle)
503     ON_BN_CLICKED(IDC_RADIO_MULTI, &CTelephonyEvent::OnBnClickedRadioMulti)
504     ON_BN_CLICKED(IDC_RADIO_START_STOP, &CTelephonyEvent::OnBnClickedRadioStartStop)
505     ON_BN_CLICKED(IDC_BUTTON_SET_RX_TELEPHONE_PT, &CTelephonyEvent::OnBnClickedButtonSetRxTelephonePt)
506     ON_BN_CLICKED(IDC_BUTTON_SET_TX_TELEPHONE_PT, &CTelephonyEvent::OnBnClickedButtonSetTxTelephonePt)
507     ON_BN_CLICKED(IDC_BUTTON_SEND_TELEPHONE_EVENT, &CTelephonyEvent::OnBnClickedButtonSendTelephoneEvent)
508     ON_BN_CLICKED(IDC_CHECK_DETECT_INBAND, &CTelephonyEvent::OnBnClickedCheckDetectInband)
509     ON_BN_CLICKED(IDC_CHECK_DETECT_OUT_OF_BAND, &CTelephonyEvent::OnBnClickedCheckDetectOutOfBand)
510     ON_BN_CLICKED(IDC_CHECK_EVENT_DETECTION, &CTelephonyEvent::OnBnClickedCheckEventDetection)
511 END_MESSAGE_MAP()
512 
513 
514 // CTelephonyEvent message handlers
515 
516 BOOL CTelephonyEvent::OnInitDialog()
517 {
518     CDialog::OnInitDialog();
519 
520     CString str;
521     GetWindowText(str);
522     str.AppendFormat(_T(" [channel = %d]"), _channel);
523     SetWindowText(str);
524 
525     // Update dialog with latest playout state
526     bool enabled(false);
527     _veDTMFPtr->GetDtmfPlayoutStatus(_channel, enabled);
528     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_DTMF_PLAYOUT_RX);
529     button->SetCheck(enabled ? BST_CHECKED : BST_UNCHECKED);
530 
531     // Update dialog with latest feedback state
532     bool directFeedback(false);
533     _veDTMFPtr->GetDtmfFeedbackStatus(enabled, directFeedback);
534     button = (CButton*)GetDlgItem(IDC_CHECK_DTMF_FEEDBACK);
535     button->SetCheck(enabled ? BST_CHECKED : BST_UNCHECKED);
536     button = (CButton*)GetDlgItem(IDC_CHECK_DIRECT_FEEDBACK);
537     button->SetCheck(directFeedback ? BST_CHECKED : BST_UNCHECKED);
538 
539     // Default event length is 160 ms
540     SetDlgItemInt(IDC_EDIT_EVENT_LENGTH, 160);
541 
542     // Default event attenuation is 10 (<-> -10dBm0)
543     SetDlgItemInt(IDC_EDIT_EVENT_ATTENUATION, 10);
544 
545     // Current event-detection status
546     TelephoneEventDetectionMethods detectionMethod(kOutOfBand);
547     if (_veDTMFPtr->GetTelephoneEventDetectionStatus(_channel, enabled, detectionMethod) == 0)
548     {
549         // DTMF detection is supported
550         if (enabled)
551         {
552             button = (CButton*)GetDlgItem(IDC_CHECK_EVENT_DETECTION);
553             button->SetCheck(BST_CHECKED);
554         }
555         if (detectionMethod == kOutOfBand || detectionMethod == kInAndOutOfBand)
556         {
557             button = (CButton*)GetDlgItem(IDC_CHECK_DETECT_OUT_OF_BAND);
558             button->SetCheck(BST_CHECKED);
559         }
560         if (detectionMethod == kInBand || detectionMethod == kInAndOutOfBand)
561         {
562             button = (CButton*)GetDlgItem(IDC_CHECK_DETECT_INBAND);
563             button->SetCheck(BST_CHECKED);
564         }
565     }
566     else
567     {
568         // DTMF detection is not supported
569         GetDlgItem(IDC_CHECK_EVENT_DETECTION)->EnableWindow(FALSE);
570         GetDlgItem(IDC_CHECK_DETECT_OUT_OF_BAND)->EnableWindow(FALSE);
571         GetDlgItem(IDC_CHECK_DETECT_INBAND)->EnableWindow(FALSE);
572         GetDlgItem(IDC_EDIT_ON_EVENT_INBAND)->EnableWindow(FALSE);
573         GetDlgItem(IDC_EDIT_ON_EVENT_OUT_OF_BAND)->EnableWindow(FALSE);
574     }
575 
576     // Telephone-event PTs
577     unsigned char pt(0);
578     _veDTMFPtr->GetSendTelephoneEventPayloadType(_channel, pt);
579     SetDlgItemInt(IDC_EDIT_EVENT_TX_PT, pt);
580 
581     CodecInst codec;
582     strcpy_s(codec.plname, 32, "telephone-event"); codec.channels = 1; codec.plfreq = 8000;
583     _veCodecPtr->GetRecPayloadType(_channel, codec);
584     SetDlgItemInt(IDC_EDIT_EVENT_RX_PT, codec.pltype);
585 
586     if (_modeSingle)
587     {
588         ((CButton*)GetDlgItem(IDC_RADIO_SINGLE))->SetCheck(BST_CHECKED);
589     }
590     else if (_modeStartStop)
591     {
592         ((CButton*)GetDlgItem(IDC_RADIO_START_STOP))->SetCheck(BST_CHECKED);
593     }
594     else if (_modeSequence)
595     {
596         ((CButton*)GetDlgItem(IDC_RADIO_MULTI))->SetCheck(BST_CHECKED);
597     }
598 
599     return TRUE;  // return TRUE  unless you set the focus to a control
600 }
SendTelephoneEvent(unsigned char eventCode)601 void CTelephonyEvent::SendTelephoneEvent(unsigned char eventCode)
602 {
603     BOOL ret;
604     int lengthMs(0);
605     int attenuationDb(0);
606     bool outBand(false);
607     int res(0);
608 
609     // tone length
610     if (!_modeStartStop)
611     {
612         lengthMs = GetDlgItemInt(IDC_EDIT_EVENT_LENGTH, &ret);
613         if (ret == FALSE)
614         {
615             // use default length if edit field is empty
616             lengthMs = 160;
617         }
618     }
619 
620     // attenuation
621     attenuationDb = GetDlgItemInt(IDC_EDIT_EVENT_ATTENUATION, &ret);
622     if (ret == FALSE)
623     {
624         // use default length if edit field is empty
625         attenuationDb = 10;
626     }
627 
628     // out-band or in-band
629     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_EVENT_INBAND);
630     int check = button->GetCheck();
631     outBand = (check == BST_UNCHECKED);
632 
633     if (eventCode < 16)
634         SetDlgItemInt(IDC_EDIT_DTMF_EVENT, eventCode);
635 
636     if (_PlayDtmfToneLocally)
637     {
638         // --- PlayDtmfTone
639 
640         if (_modeSingle)
641         {
642             TEST2(_veDTMFPtr->PlayDtmfTone(eventCode, lengthMs, attenuationDb) == 0,
643                 _T("PlayDtmfTone(eventCode=%u, lengthMs=%d, attenuationDb=%d)"), eventCode, lengthMs, attenuationDb);
644         }
645         else if (_modeStartStop)
646         {
647             if (!_playingDTMFTone)
648             {
649                 TEST2((res = _veDTMFPtr->StartPlayingDtmfTone(eventCode, attenuationDb)) == 0,
650                     _T("StartPlayingDtmfTone(eventCode=%u, attenuationDb=%d)"), eventCode, attenuationDb);
651             }
652             else
653             {
654                 TEST2((res = _veDTMFPtr->StopPlayingDtmfTone()) == 0,
655                     _T("StopPlayingDTMFTone()"));
656             }
657             if (res == 0)
658                 _playingDTMFTone = !_playingDTMFTone;
659         }
660         else if (_modeSequence)
661         {
662             int nTones(1);
663             int sleepMs(0);
664             int lenMult(1);
665             if (eventCode == 1)
666             {
667                 nTones = 2;
668                 sleepMs = lengthMs;
669                 lenMult = 1;
670             }
671             else if (eventCode == 2)
672             {
673                 nTones = 2;
674                 sleepMs = lengthMs/2;
675                 lenMult = 2;
676             }
677             else if (eventCode == 3)
678             {
679                 nTones = 3;
680                 sleepMs = 0;
681                 lenMult = 1;
682             }
683             for (int i = 0; i < nTones; i++)
684             {
685                 TEST2(_veDTMFPtr->PlayDtmfTone(eventCode, lengthMs, attenuationDb) == 0,
686                     _T("PlayDtmfTone(eventCode=%u, outBand=%d, lengthMs=%d, attenuationDb=%d)"), eventCode, lengthMs, attenuationDb);
687                 Sleep(sleepMs);
688                 lengthMs = lenMult*lengthMs;
689                 eventCode++;
690             }
691         }
692     }
693     else
694     {
695         // --- SendTelephoneEvent
696 
697         if (_modeSingle)
698         {
699             TEST2(_veDTMFPtr->SendTelephoneEvent(_channel, eventCode, outBand, lengthMs, attenuationDb) == 0,
700                 _T("SendTelephoneEvent(channel=%d, eventCode=%u, outBand=%d, lengthMs=%d, attenuationDb=%d)"), _channel, eventCode, outBand, lengthMs, attenuationDb);
701         }
702         else if (_modeStartStop)
703         {
704             TEST2(false, _T("*** NOT IMPLEMENTED ***"));
705         }
706         else if (_modeSequence)
707         {
708             int nTones(1);
709             int sleepMs(0);
710             int lenMult(1);
711             if (eventCode == 1)
712             {
713                 nTones = 2;
714                 sleepMs = lengthMs;
715                 lenMult = 1;
716             }
717             else if (eventCode == 2)
718             {
719                 eventCode = 1;
720                 nTones = 2;
721                 sleepMs = lengthMs/2;
722                 lenMult = 2;
723             }
724             else if (eventCode == 3)
725             {
726                 eventCode = 1;
727                 nTones = 3;
728                 sleepMs = 0;
729                 lenMult = 1;
730             }
731             for (int i = 0; i < nTones; i++)
732             {
733                 TEST2(_veDTMFPtr->SendTelephoneEvent(_channel, eventCode, outBand, lengthMs, attenuationDb) == 0,
734                     _T("SendTelephoneEvent(channel=%d, eventCode=%u, outBand=%d, lengthMs=%d, attenuationDb=%d)"), _channel, eventCode, outBand, lengthMs, attenuationDb);
735                 Sleep(sleepMs);
736                 lengthMs = lenMult*lengthMs;
737                 eventCode++;
738             }
739         }
740     }
741 }
742 
OnBnClickedButtonSendTelephoneEvent()743 void CTelephonyEvent::OnBnClickedButtonSendTelephoneEvent()
744 {
745     BOOL ret;
746     unsigned char eventCode(0);
747 
748     eventCode = (unsigned char)GetDlgItemInt(IDC_EDIT_EVENT_CODE, &ret);
749     if (ret == FALSE)
750     {
751         return;
752     }
753     SendTelephoneEvent(eventCode);
754 }
755 
OnBnClickedButton1()756 void CTelephonyEvent::OnBnClickedButton1()
757 {
758     SendTelephoneEvent(1);
759 }
760 
OnBnClickedButton2()761 void CTelephonyEvent::OnBnClickedButton2()
762 {
763     SendTelephoneEvent(2);
764 }
765 
OnBnClickedButton3()766 void CTelephonyEvent::OnBnClickedButton3()
767 {
768     SendTelephoneEvent(3);
769 }
770 
OnBnClickedButton4()771 void CTelephonyEvent::OnBnClickedButton4()
772 {
773     SendTelephoneEvent(4);
774 }
775 
OnBnClickedButton5()776 void CTelephonyEvent::OnBnClickedButton5()
777 {
778     SendTelephoneEvent(5);
779 }
780 
OnBnClickedButton6()781 void CTelephonyEvent::OnBnClickedButton6()
782 {
783     SendTelephoneEvent(6);
784 }
785 
OnBnClickedButton7()786 void CTelephonyEvent::OnBnClickedButton7()
787 {
788     SendTelephoneEvent(7);
789 }
790 
OnBnClickedButton8()791 void CTelephonyEvent::OnBnClickedButton8()
792 {
793     SendTelephoneEvent(8);
794 }
795 
OnBnClickedButton9()796 void CTelephonyEvent::OnBnClickedButton9()
797 {
798     SendTelephoneEvent(9);
799 }
800 
OnBnClickedButton10()801 void CTelephonyEvent::OnBnClickedButton10()
802 {
803     // *
804     SendTelephoneEvent(10);
805 }
806 
OnBnClickedButton11()807 void CTelephonyEvent::OnBnClickedButton11()
808 {
809     SendTelephoneEvent(0);
810 }
811 
OnBnClickedButton12()812 void CTelephonyEvent::OnBnClickedButton12()
813 {
814     // #
815     SendTelephoneEvent(11);
816 }
817 
OnBnClickedButtonA()818 void CTelephonyEvent::OnBnClickedButtonA()
819 {
820     SendTelephoneEvent(12);
821 }
822 
OnBnClickedButtonB()823 void CTelephonyEvent::OnBnClickedButtonB()
824 {
825     SendTelephoneEvent(13);
826 }
827 
OnBnClickedButtonC()828 void CTelephonyEvent::OnBnClickedButtonC()
829 {
830     SendTelephoneEvent(14);
831 }
832 
OnBnClickedButtonD()833 void CTelephonyEvent::OnBnClickedButtonD()
834 {
835     SendTelephoneEvent(15);
836 }
837 
OnBnClickedCheckDtmfPlayoutRx()838 void CTelephonyEvent::OnBnClickedCheckDtmfPlayoutRx()
839 {
840     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_DTMF_PLAYOUT_RX);
841     int check = button->GetCheck();
842     const bool enable = (check == BST_CHECKED);
843     TEST2(_veDTMFPtr->SetDtmfPlayoutStatus(_channel, enable) == 0, _T("SetDtmfPlayoutStatus(channel=%d, enable=%d)"), _channel, enable);
844 }
845 
OnBnClickedCheckDtmfPlayTone()846 void CTelephonyEvent::OnBnClickedCheckDtmfPlayTone()
847 {
848     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_DTMF_PLAY_TONE);
849     int check = button->GetCheck();
850     _PlayDtmfToneLocally = (check == BST_CHECKED);
851 }
852 
OnBnClickedRadioSingle()853 void CTelephonyEvent::OnBnClickedRadioSingle()
854 {
855     _modeStartStop = false;
856     _modeSingle = true;
857     _modeSequence = false;
858 }
859 
OnBnClickedRadioMulti()860 void CTelephonyEvent::OnBnClickedRadioMulti()
861 {
862     _modeStartStop = false;
863     _modeSingle = false;
864     _modeSequence = true;
865 }
866 
OnBnClickedRadioStartStop()867 void CTelephonyEvent::OnBnClickedRadioStartStop()
868 {
869     // CButton* button = (CButton*)GetDlgItem(IDC_RADIO_START_STOP);
870     // int check = button->GetCheck();
871     _modeStartStop = true;
872     _modeSingle = false;
873     _modeSequence = false;
874     // GetDlgItem(IDC_EDIT_EVENT_LENGTH)->EnableWindow();
875 }
876 
OnBnClickedCheckEventInband()877 void CTelephonyEvent::OnBnClickedCheckEventInband()
878 {
879     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_EVENT_INBAND);
880     int check = button->GetCheck();
881     GetDlgItem(IDC_EDIT_EVENT_CODE)->EnableWindow(check?FALSE:TRUE);
882     GetDlgItem(IDC_BUTTON_SEND_TELEPHONE_EVENT)->EnableWindow(check?FALSE:TRUE);
883 }
884 
OnBnClickedCheckDtmfFeedback()885 void CTelephonyEvent::OnBnClickedCheckDtmfFeedback()
886 {
887     CButton* button(NULL);
888 
889     // Retrieve feedback state
890     button = (CButton*)GetDlgItem(IDC_CHECK_DTMF_FEEDBACK);
891     int check = button->GetCheck();
892     const bool enable = (check == BST_CHECKED);
893 
894     // Retrieve direct-feedback setting
895     button = (CButton*)GetDlgItem(IDC_CHECK_DIRECT_FEEDBACK);
896     check = button->GetCheck();
897     const bool directFeedback = (check == BST_CHECKED);
898 
899     // GetDlgItem(IDC_CHECK_DIRECT_FEEDBACK)->EnableWindow(enable ? TRUE : FALSE);
900 
901     TEST2(_veDTMFPtr->SetDtmfFeedbackStatus(enable, directFeedback) == 0,
902         _T("SetDtmfFeedbackStatus(enable=%d, directFeedback=%d)"), enable, directFeedback);
903 }
904 
OnBnClickedCheckDirectFeedback()905 void CTelephonyEvent::OnBnClickedCheckDirectFeedback()
906 {
907     CButton* button(NULL);
908 
909     // Retrieve feedback state
910     button = (CButton*)GetDlgItem(IDC_CHECK_DTMF_FEEDBACK);
911     int check = button->GetCheck();
912     const bool enable = (check == BST_CHECKED);
913 
914     // Retrieve new direct-feedback setting
915     button = (CButton*)GetDlgItem(IDC_CHECK_DIRECT_FEEDBACK);
916     check = button->GetCheck();
917     const bool directFeedback = (check == BST_CHECKED);
918 
919     TEST2(_veDTMFPtr->SetDtmfFeedbackStatus(enable, directFeedback) == 0,
920         _T("SetDtmfFeedbackStatus(enable=%d, directFeedback=%d)"), enable, directFeedback);
921 }
922 
OnBnClickedButtonSetRxTelephonePt()923 void CTelephonyEvent::OnBnClickedButtonSetRxTelephonePt()
924 {
925     BOOL ret;
926     int pt = GetDlgItemInt(IDC_EDIT_EVENT_RX_PT, &ret);
927     if (ret == FALSE || pt < 0 || pt > 127)
928         return;
929     CodecInst codec;
930     strcpy_s(codec.plname, 32, "telephone-event");
931     codec.pltype = pt;
932     codec.channels = 1;
933     codec.plfreq = 8000;
934     TEST2(_veCodecPtr->SetRecPayloadType(_channel, codec) == 0,
935           _T("SetRecPayloadType(channel=%d, codec.pltype=%d)"), _channel,
936           codec.pltype);
937 }
938 
OnBnClickedButtonSetTxTelephonePt()939 void CTelephonyEvent::OnBnClickedButtonSetTxTelephonePt()
940 {
941     BOOL ret;
942     int pt = GetDlgItemInt(IDC_EDIT_EVENT_TX_PT, &ret);
943     if (ret == FALSE || pt < 0 || pt > 127)
944         return;
945     TEST2(_veDTMFPtr->SetSendTelephoneEventPayloadType(_channel, pt) == 0,
946           _T("SetSendTelephoneEventPayloadType(channel=%d, type=%d)"), _channel,
947           pt);
948 }
949 
OnBnClickedCheckDetectInband()950 void CTelephonyEvent::OnBnClickedCheckDetectInband()
951 {
952     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_DETECT_INBAND);
953     int check = button->GetCheck();
954     _inbandEventDetection = (check == BST_CHECKED);
955 
956     bool enabled(false);
957     TelephoneEventDetectionMethods detectionMethod;
958     _veDTMFPtr->GetTelephoneEventDetectionStatus(_channel, enabled, detectionMethod);
959     if (enabled)
960     {
961         // deregister
962         _veDTMFPtr->DeRegisterTelephoneEventDetection(_channel);
963         delete _telephoneEventObserverPtr;
964         _telephoneEventObserverPtr = NULL;
965         SetDlgItemText(IDC_EDIT_ON_EVENT_INBAND,_T(""));
966         SetDlgItemText(IDC_EDIT_ON_EVENT_OUT_OF_BAND,_T(""));
967     }
968     OnBnClickedCheckEventDetection();
969 }
970 
OnBnClickedCheckDetectOutOfBand()971 void CTelephonyEvent::OnBnClickedCheckDetectOutOfBand()
972 {
973     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_DETECT_OUT_OF_BAND);
974     int check = button->GetCheck();
975     _outOfBandEventDetection = (check == BST_CHECKED);
976 
977     bool enabled(false);
978     TelephoneEventDetectionMethods detectionMethod;
979     _veDTMFPtr->GetTelephoneEventDetectionStatus(_channel, enabled, detectionMethod);
980     if (enabled)
981     {
982         // deregister
983         _veDTMFPtr->DeRegisterTelephoneEventDetection(_channel);
984         delete _telephoneEventObserverPtr;
985         _telephoneEventObserverPtr = NULL;
986         SetDlgItemText(IDC_EDIT_ON_EVENT_INBAND,_T(""));
987         SetDlgItemText(IDC_EDIT_ON_EVENT_OUT_OF_BAND,_T(""));
988     }
989     OnBnClickedCheckEventDetection();
990 }
991 
OnBnClickedCheckEventDetection()992 void CTelephonyEvent::OnBnClickedCheckEventDetection()
993 {
994     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_EVENT_DETECTION);
995     int check = button->GetCheck();
996     const bool enable = (check == BST_CHECKED);
997 
998     if (enable)
999     {
1000         TelephoneEventDetectionMethods method(kInBand);
1001         if (_inbandEventDetection && !_outOfBandEventDetection)
1002             method = kInBand;
1003         else if (!_inbandEventDetection && _outOfBandEventDetection)
1004             method = kOutOfBand;
1005         else if (_inbandEventDetection && _outOfBandEventDetection)
1006             method = kInAndOutOfBand;
1007 
1008         CWnd* wndOut = GetDlgItem(IDC_EDIT_ON_EVENT_OUT_OF_BAND);
1009         CWnd* wndIn = GetDlgItem(IDC_EDIT_ON_EVENT_INBAND);
1010         _telephoneEventObserverPtr = new TelephoneEventObserver(wndOut, wndIn);
1011 
1012         TEST2(_veDTMFPtr->RegisterTelephoneEventDetection(_channel, method, *_telephoneEventObserverPtr) == 0,
1013             _T("RegisterTelephoneEventDetection(channel=%d, detectionMethod=%d)"), _channel, method);
1014     }
1015     else
1016     {
1017         TEST2(_veDTMFPtr->DeRegisterTelephoneEventDetection(_channel) == 0,
1018             _T("DeRegisterTelephoneEventDetection(channel=%d)"), _channel);
1019         delete _telephoneEventObserverPtr;
1020         _telephoneEventObserverPtr = NULL;
1021         SetDlgItemText(IDC_EDIT_ON_EVENT_INBAND,_T(""));
1022         SetDlgItemText(IDC_EDIT_ON_EVENT_OUT_OF_BAND,_T(""));
1023     }
1024 }
1025 
1026 // ============================================================================
1027 //                                 CWinTestDlg dialog
1028 // ============================================================================
1029 
CWinTestDlg(CWnd * pParent)1030 CWinTestDlg::CWinTestDlg(CWnd* pParent /*=NULL*/)
1031     : CDialog(CWinTestDlg::IDD, pParent),
1032     _failCount(0),
1033     _vePtr(NULL),
1034     _veBasePtr(NULL),
1035     _veCodecPtr(NULL),
1036     _veNetworkPtr(NULL),
1037     _veFilePtr(NULL),
1038     _veHardwarePtr(NULL),
1039     _veExternalMediaPtr(NULL),
1040     _veApmPtr(NULL),
1041     _veRtpRtcpPtr(NULL),
1042     _transportPtr(NULL),
1043     _externalMediaPtr(NULL),
1044     _externalTransport(false),
1045     _externalTransportBuild(false),
1046     _checkPlayFileIn(0),
1047     _checkPlayFileIn1(0),
1048     _checkPlayFileIn2(0),
1049     _checkPlayFileOut1(0),
1050     _checkPlayFileOut2(0),
1051     _checkAGC(0),
1052     _checkAGC1(0),
1053     _checkNS(0),
1054     _checkNS1(0),
1055     _checkEC(0),
1056     _checkVAD1(0),
1057     _checkVAD2(0),
1058     _checkSrtpTx1(0),
1059     _checkSrtpTx2(0),
1060     _checkSrtpRx1(0),
1061     _checkSrtpRx2(0),
1062     _checkConference1(0),
1063     _checkConference2(0),
1064     _checkOnHold1(0),
1065     _checkOnHold2(0),
1066     _strComboIp1(_T("")),
1067     _strComboIp2(_T("")),
1068     _delayEstimate1(false),
1069     _delayEstimate2(false),
1070     _rxVad(false),
1071     _nErrorCallbacks(0),
1072     _timerTicks(0)
1073 {
1074     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
1075 
1076     _vePtr = VoiceEngine::Create();
1077 
1078     VoiceEngine::SetTraceFilter(kTraceNone);
1079     // VoiceEngine::SetTraceFilter(kTraceAll);
1080     // VoiceEngine::SetTraceFilter(kTraceStream | kTraceStateInfo | kTraceWarning | kTraceError | kTraceCritical | kTraceApiCall | kTraceModuleCall | kTraceMemory | kTraceDebug | kTraceInfo);
1081     // VoiceEngine::SetTraceFilter(kTraceStateInfo | kTraceWarning | kTraceError | kTraceCritical | kTraceApiCall | kTraceModuleCall | kTraceMemory | kTraceInfo);
1082 
1083     VoiceEngine::SetTraceFile("ve_win_test.txt");
1084     VoiceEngine::SetTraceCallback(NULL);
1085 
1086     if (_vePtr)
1087     {
1088         _veExternalMediaPtr = VoEExternalMedia::GetInterface(_vePtr);
1089         _veVolumeControlPtr = VoEVolumeControl::GetInterface(_vePtr);
1090         _veVideoSyncPtr = VoEVideoSync::GetInterface(_vePtr);
1091         _veNetworkPtr = VoENetwork::GetInterface(_vePtr);
1092         _veFilePtr = VoEFile::GetInterface(_vePtr);
1093         _veApmPtr = VoEAudioProcessing::GetInterface(_vePtr);
1094 
1095         _veBasePtr = VoEBase::GetInterface(_vePtr);
1096         _veCodecPtr = VoECodec::GetInterface(_vePtr);
1097         _veHardwarePtr = VoEHardware::GetInterface(_vePtr);
1098         _veRtpRtcpPtr = VoERTP_RTCP::GetInterface(_vePtr);
1099         _transportPtr = new MyTransport(_veNetworkPtr);
1100         _externalMediaPtr = new MediaProcessImpl();
1101         _rxVadObserverPtr = new RxCallback();
1102     }
1103 
1104     _veBasePtr->RegisterVoiceEngineObserver(*this);
1105 
1106     std::string resource_path = webrtc::test::ProjectRootPath();
1107     if (resource_path == webrtc::test::kCannotFindProjectRootDir) {
1108         _long_audio_file_path = "./";
1109     } else {
1110         _long_audio_file_path = resource_path + "data\\voice_engine\\";
1111     }
1112 }
1113 
~CWinTestDlg()1114 CWinTestDlg::~CWinTestDlg()
1115 {
1116     if (_externalMediaPtr) delete _externalMediaPtr;
1117     if (_transportPtr) delete _transportPtr;
1118     if (_rxVadObserverPtr) delete _rxVadObserverPtr;
1119 
1120     if (_veExternalMediaPtr) _veExternalMediaPtr->Release();
1121     if (_veVideoSyncPtr) _veVideoSyncPtr->Release();
1122     if (_veVolumeControlPtr) _veVolumeControlPtr->Release();
1123 
1124     if (_veBasePtr) _veBasePtr->Terminate();
1125     if (_veBasePtr) _veBasePtr->Release();
1126 
1127     if (_veCodecPtr) _veCodecPtr->Release();
1128     if (_veNetworkPtr) _veNetworkPtr->Release();
1129     if (_veFilePtr) _veFilePtr->Release();
1130     if (_veHardwarePtr) _veHardwarePtr->Release();
1131     if (_veApmPtr) _veApmPtr->Release();
1132     if (_veRtpRtcpPtr) _veRtpRtcpPtr->Release();
1133     if (_vePtr)
1134     {
1135         VoiceEngine::Delete(_vePtr);
1136     }
1137     VoiceEngine::SetTraceFilter(kTraceNone);
1138 }
1139 
DoDataExchange(CDataExchange * pDX)1140 void CWinTestDlg::DoDataExchange(CDataExchange* pDX)
1141 {
1142     CDialog::DoDataExchange(pDX);
1143     DDX_CBString(pDX, IDC_COMBO_IP_1, _strComboIp1);
1144     DDX_CBString(pDX, IDC_COMBO_IP_2, _strComboIp2);
1145 }
1146 
BEGIN_MESSAGE_MAP(CWinTestDlg,CDialog)1147 BEGIN_MESSAGE_MAP(CWinTestDlg, CDialog)
1148     ON_WM_SYSCOMMAND()
1149     ON_WM_PAINT()
1150     ON_WM_QUERYDRAGICON()
1151     ON_WM_TIMER()
1152     //}}AFX_MSG_MAP
1153     ON_BN_CLICKED(IDC_BUTTON_CREATE_1, &CWinTestDlg::OnBnClickedButtonCreate1)
1154     ON_BN_CLICKED(IDC_BUTTON_DELETE_1, &CWinTestDlg::OnBnClickedButtonDelete1)
1155     ON_BN_CLICKED(IDC_BUTTON_CREATE_2, &CWinTestDlg::OnBnClickedButtonCreate2)
1156     ON_BN_CLICKED(IDC_BUTTON_DELETE_2, &CWinTestDlg::OnBnClickedButtonDelete2)
1157     ON_CBN_SELCHANGE(IDC_COMBO_CODEC_1, &CWinTestDlg::OnCbnSelchangeComboCodec1)
1158     ON_BN_CLICKED(IDC_BUTTON_START_LISTEN_1, &CWinTestDlg::OnBnClickedButtonStartListen1)
1159     ON_BN_CLICKED(IDC_BUTTON_STOP_LISTEN_1, &CWinTestDlg::OnBnClickedButtonStopListen1)
1160     ON_BN_CLICKED(IDC_BUTTON_START_PLAYOUT_1, &CWinTestDlg::OnBnClickedButtonStartPlayout1)
1161     ON_BN_CLICKED(IDC_BUTTON_STOP_PLAYOUT_1, &CWinTestDlg::OnBnClickedButtonStopPlayout1)
1162     ON_BN_CLICKED(IDC_BUTTON_START_SEND_1, &CWinTestDlg::OnBnClickedButtonStartSend1)
1163     ON_BN_CLICKED(IDC_BUTTON_STOP_SEND_1, &CWinTestDlg::OnBnClickedButtonStopSend1)
1164     ON_CBN_SELCHANGE(IDC_COMBO_IP_2, &CWinTestDlg::OnCbnSelchangeComboIp2)
1165     ON_CBN_SELCHANGE(IDC_COMBO_IP_1, &CWinTestDlg::OnCbnSelchangeComboIp1)
1166     ON_CBN_SELCHANGE(IDC_COMBO_CODEC_2, &CWinTestDlg::OnCbnSelchangeComboCodec2)
1167     ON_BN_CLICKED(IDC_BUTTON_START_LISTEN_2, &CWinTestDlg::OnBnClickedButtonStartListen2)
1168     ON_BN_CLICKED(IDC_BUTTON_STOP_LISTEN_2, &CWinTestDlg::OnBnClickedButtonStopListen2)
1169     ON_BN_CLICKED(IDC_BUTTON_START_PLAYOUT_2, &CWinTestDlg::OnBnClickedButtonStartPlayout2)
1170     ON_BN_CLICKED(IDC_BUTTON_STOP_PLAYOUT_2, &CWinTestDlg::OnBnClickedButtonStopPlayout2)
1171     ON_BN_CLICKED(IDC_BUTTON_START_SEND_2, &CWinTestDlg::OnBnClickedButtonStartSend2)
1172     ON_BN_CLICKED(IDC_BUTTON_STOP_SEND_2, &CWinTestDlg::OnBnClickedButtonStopSend2)
1173     ON_BN_CLICKED(IDC_CHECK_EXT_TRANS_1, &CWinTestDlg::OnBnClickedCheckExtTrans1)
1174     ON_BN_CLICKED(IDC_CHECK_PLAY_FILE_IN_1, &CWinTestDlg::OnBnClickedCheckPlayFileIn1)
1175     ON_BN_CLICKED(IDC_CHECK_PLAY_FILE_OUT_1, &CWinTestDlg::OnBnClickedCheckPlayFileOut1)
1176     ON_BN_CLICKED(IDC_CHECK_EXT_TRANS_2, &CWinTestDlg::OnBnClickedCheckExtTrans2)
1177     ON_BN_CLICKED(IDC_CHECK_PLAY_FILE_IN_2, &CWinTestDlg::OnBnClickedCheckPlayFileIn2)
1178     ON_BN_CLICKED(IDC_CHECK_PLAY_FILE_OUT_2, &CWinTestDlg::OnBnClickedCheckPlayFileOut2)
1179     ON_BN_CLICKED(IDC_CHECK_PLAY_FILE_IN, &CWinTestDlg::OnBnClickedCheckPlayFileIn)
1180     ON_CBN_SELCHANGE(IDC_COMBO_REC_DEVICE, &CWinTestDlg::OnCbnSelchangeComboRecDevice)
1181     ON_CBN_SELCHANGE(IDC_COMBO_PLAY_DEVICE, &CWinTestDlg::OnCbnSelchangeComboPlayDevice)
1182     ON_BN_CLICKED(IDC_CHECK_EXT_MEDIA_IN_1, &CWinTestDlg::OnBnClickedCheckExtMediaIn1)
1183     ON_BN_CLICKED(IDC_CHECK_EXT_MEDIA_OUT_1, &CWinTestDlg::OnBnClickedCheckExtMediaOut1)
1184     ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_INPUT_VOLUME, &CWinTestDlg::OnNMReleasedcaptureSliderInputVolume)
1185     ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_OUTPUT_VOLUME, &CWinTestDlg::OnNMReleasedcaptureSliderOutputVolume)
1186     ON_BN_CLICKED(IDC_CHECK_AGC, &CWinTestDlg::OnBnClickedCheckAgc)
1187     ON_BN_CLICKED(IDC_CHECK_NS, &CWinTestDlg::OnBnClickedCheckNs)
1188     ON_BN_CLICKED(IDC_CHECK_EC, &CWinTestDlg::OnBnClickedCheckEc)
1189     ON_BN_CLICKED(IDC_CHECK_VAD_1, &CWinTestDlg::OnBnClickedCheckVad1)
1190     ON_BN_CLICKED(IDC_CHECK_VAD_3, &CWinTestDlg::OnBnClickedCheckVad2)
1191     ON_BN_CLICKED(IDC_CHECK_EXT_MEDIA_IN_2, &CWinTestDlg::OnBnClickedCheckExtMediaIn2)
1192     ON_BN_CLICKED(IDC_CHECK_EXT_MEDIA_OUT_2, &CWinTestDlg::OnBnClickedCheckExtMediaOut2)
1193     ON_BN_CLICKED(IDC_CHECK_MUTE_IN, &CWinTestDlg::OnBnClickedCheckMuteIn)
1194     ON_BN_CLICKED(IDC_CHECK_MUTE_IN_1, &CWinTestDlg::OnBnClickedCheckMuteIn1)
1195     ON_BN_CLICKED(IDC_CHECK_MUTE_IN_2, &CWinTestDlg::OnBnClickedCheckMuteIn2)
1196     ON_BN_CLICKED(IDC_CHECK_SRTP_TX_1, &CWinTestDlg::OnBnClickedCheckSrtpTx1)
1197     ON_BN_CLICKED(IDC_CHECK_SRTP_RX_1, &CWinTestDlg::OnBnClickedCheckSrtpRx1)
1198     ON_BN_CLICKED(IDC_CHECK_SRTP_TX_2, &CWinTestDlg::OnBnClickedCheckSrtpTx2)
1199     ON_BN_CLICKED(IDC_CHECK_SRTP_RX_2, &CWinTestDlg::OnBnClickedCheckSrtpRx2)
1200     ON_BN_CLICKED(IDC_CHECK_EXT_ENCRYPTION_1, &CWinTestDlg::OnBnClickedCheckExtEncryption1)
1201     ON_BN_CLICKED(IDC_CHECK_EXT_ENCRYPTION_2, &CWinTestDlg::OnBnClickedCheckExtEncryption2)
1202     ON_BN_CLICKED(IDC_BUTTON_DTMF_1, &CWinTestDlg::OnBnClickedButtonDtmf1)
1203     ON_BN_CLICKED(IDC_CHECK_REC_MIC, &CWinTestDlg::OnBnClickedCheckRecMic)
1204     ON_BN_CLICKED(IDC_BUTTON_DTMF_2, &CWinTestDlg::OnBnClickedButtonDtmf2)
1205     ON_BN_CLICKED(IDC_BUTTON_TEST_1, &CWinTestDlg::OnBnClickedButtonTest1)
1206     ON_BN_CLICKED(IDC_CHECK_CONFERENCE_1, &CWinTestDlg::OnBnClickedCheckConference1)
1207     ON_BN_CLICKED(IDC_CHECK_CONFERENCE_2, &CWinTestDlg::OnBnClickedCheckConference2)
1208     ON_BN_CLICKED(IDC_CHECK_ON_HOLD_1, &CWinTestDlg::OnBnClickedCheckOnHold1)
1209     ON_BN_CLICKED(IDC_CHECK_ON_HOLD_2, &CWinTestDlg::OnBnClickedCheckOnHold2)
1210     ON_BN_CLICKED(IDC_CHECK_EXT_MEDIA_IN, &CWinTestDlg::OnBnClickedCheckExtMediaIn)
1211     ON_BN_CLICKED(IDC_CHECK_EXT_MEDIA_OUT, &CWinTestDlg::OnBnClickedCheckExtMediaOut)
1212     ON_LBN_SELCHANGE(IDC_LIST_CODEC_1, &CWinTestDlg::OnLbnSelchangeListCodec1)
1213     ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_PAN_LEFT, &CWinTestDlg::OnNMReleasedcaptureSliderPanLeft)
1214     ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_PAN_RIGHT, &CWinTestDlg::OnNMReleasedcaptureSliderPanRight)
1215     ON_BN_CLICKED(IDC_BUTTON_VERSION, &CWinTestDlg::OnBnClickedButtonVersion)
1216     ON_BN_CLICKED(IDC_CHECK_DELAY_ESTIMATE_1, &CWinTestDlg::OnBnClickedCheckDelayEstimate1)
1217     ON_BN_CLICKED(IDC_CHECK_RXVAD, &CWinTestDlg::OnBnClickedCheckRxvad)
1218     ON_BN_CLICKED(IDC_CHECK_AGC_1, &CWinTestDlg::OnBnClickedCheckAgc1)
1219     ON_BN_CLICKED(IDC_CHECK_NS_1, &CWinTestDlg::OnBnClickedCheckNs1)
1220     ON_BN_CLICKED(IDC_CHECK_REC_CALL, &CWinTestDlg::OnBnClickedCheckRecCall)
1221     ON_BN_CLICKED(IDC_CHECK_TYPING_DETECTION, &CWinTestDlg::OnBnClickedCheckTypingDetection)
1222     ON_BN_CLICKED(IDC_CHECK_RED, &CWinTestDlg::OnBnClickedCheckRED)
1223     ON_BN_CLICKED(IDC_BUTTON_CLEAR_ERROR_CALLBACK, &CWinTestDlg::OnBnClickedButtonClearErrorCallback)
1224 END_MESSAGE_MAP()
1225 
1226 BOOL CWinTestDlg::UpdateTest(bool failed, const CString& strMsg)
1227 {
1228     if (failed)
1229     {
1230         SetDlgItemText(IDC_EDIT_MESSAGE, strMsg);
1231         _strErr.Format(_T("FAILED (error=%d)"), _veBasePtr->LastError());
1232         SetDlgItemText(IDC_EDIT_RESULT, _strErr);
1233         _failCount++;
1234         SetDlgItemInt(IDC_EDIT_N_FAILS, _failCount);
1235         SetDlgItemInt(IDC_EDIT_LAST_ERROR, _veBasePtr->LastError());
1236     }
1237     else
1238     {
1239         SetDlgItemText(IDC_EDIT_MESSAGE, strMsg);
1240         SetDlgItemText(IDC_EDIT_RESULT, _T("OK"));
1241     }
1242     return TRUE;
1243 }
1244 
1245 
1246 // CWinTestDlg message handlers
1247 
OnInitDialog()1248 BOOL CWinTestDlg::OnInitDialog()
1249 {
1250     CDialog::OnInitDialog();
1251 
1252     // Add "About..." menu item to system menu.
1253 
1254     // IDM_ABOUTBOX must be in the system command range.
1255     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
1256     ASSERT(IDM_ABOUTBOX < 0xF000);
1257 
1258     CMenu* pSysMenu = GetSystemMenu(FALSE);
1259     if (pSysMenu != NULL)
1260     {
1261         CString strAboutMenu;
1262         strAboutMenu.LoadString(IDS_ABOUTBOX);
1263         if (!strAboutMenu.IsEmpty())
1264         {
1265             pSysMenu->AppendMenu(MF_SEPARATOR);
1266             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
1267         }
1268     }
1269 
1270     // Set the icon for this dialog.  The framework does this automatically
1271     //  when the application's main window is not a dialog
1272     SetIcon(m_hIcon, TRUE);            // Set big icon
1273     SetIcon(m_hIcon, FALSE);        // Set small icon
1274 
1275     // char version[1024];
1276     // _veBasePtr->GetVersion(version);
1277     // AfxMessageBox(version, MB_OK);
1278 
1279     if (_veBasePtr->Init() != 0)
1280     {
1281          AfxMessageBox(_T("Init() failed "), MB_OKCANCEL);
1282     }
1283 
1284     int ch = _veBasePtr->CreateChannel();
1285     if (_veBasePtr->SetSendDestination(ch, 1234, "127.0.0.1") == -1)
1286     {
1287         if (_veBasePtr->LastError() == VE_EXTERNAL_TRANSPORT_ENABLED)
1288         {
1289             _strMsg.Format(_T("*** External transport build ***"));
1290             SetDlgItemText(IDC_EDIT_MESSAGE, _strMsg);
1291             _externalTransportBuild = true;
1292         }
1293     }
1294     _veBasePtr->DeleteChannel(ch);
1295 
1296     // --- Add (preferred) local IPv4 address in title
1297 
1298     if (_veNetworkPtr)
1299     {
1300         char localIP[64];
1301         _veNetworkPtr->GetLocalIP(localIP);
1302         CString str;
1303         GetWindowText(str);
1304         str.AppendFormat(_T("  [Local IPv4 address: %s]"), CharToTchar(localIP, 64));
1305         SetWindowText(str);
1306     }
1307 
1308     // --- Volume sliders
1309 
1310     if (_veVolumeControlPtr)
1311     {
1312         unsigned int volume(0);
1313         CSliderCtrl* slider(NULL);
1314 
1315         slider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_INPUT_VOLUME);
1316         slider->SetRangeMin(0);
1317         slider->SetRangeMax(255);
1318         _veVolumeControlPtr->GetMicVolume(volume);
1319         slider->SetPos(volume);
1320 
1321         slider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_OUTPUT_VOLUME);
1322         slider->SetRangeMin(0);
1323         slider->SetRangeMax(255);
1324         _veVolumeControlPtr->GetSpeakerVolume(volume);
1325         slider->SetPos(volume);
1326     }
1327 
1328     // --- Panning sliders
1329 
1330     if (_veVolumeControlPtr)
1331     {
1332         float lVol(0.0);
1333         float rVol(0.0);
1334         int leftVol, rightVol;
1335         CSliderCtrl* slider(NULL);
1336 
1337         _veVolumeControlPtr->GetOutputVolumePan(-1, lVol, rVol);
1338 
1339         leftVol = (int)(lVol*10.0f);    // [0,10]
1340         rightVol = (int)(rVol*10.0f);    // [0,10]
1341 
1342         slider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_PAN_LEFT);
1343         slider->SetRange(0,10);
1344         slider->SetPos(10-leftVol);        // pos 0 <=> max pan 1.0 (top of slider)
1345 
1346         slider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_PAN_RIGHT);
1347         slider->SetRange(0,10);
1348         slider->SetPos(10-rightVol);
1349     }
1350 
1351     // --- APM settings
1352 
1353     bool enable(false);
1354     CButton* button(NULL);
1355 
1356     AgcModes agcMode(kAgcDefault);
1357     if (_veApmPtr->GetAgcStatus(enable, agcMode) == 0)
1358     {
1359         button = (CButton*)GetDlgItem(IDC_CHECK_AGC);
1360         enable ? button->SetCheck(BST_CHECKED) : button->SetCheck(BST_UNCHECKED);
1361     }
1362     else
1363     {
1364         // AGC is not supported
1365         GetDlgItem(IDC_CHECK_AGC)->EnableWindow(FALSE);
1366     }
1367 
1368     NsModes nsMode(kNsDefault);
1369     if (_veApmPtr->GetNsStatus(enable, nsMode) == 0)
1370     {
1371         button = (CButton*)GetDlgItem(IDC_CHECK_NS);
1372         enable ? button->SetCheck(BST_CHECKED) : button->SetCheck(BST_UNCHECKED);
1373     }
1374     else
1375     {
1376         // NS is not supported
1377         GetDlgItem(IDC_CHECK_NS)->EnableWindow(FALSE);
1378     }
1379 
1380     EcModes ecMode(kEcDefault);
1381     if (_veApmPtr->GetEcStatus(enable, ecMode) == 0)
1382     {
1383         button = (CButton*)GetDlgItem(IDC_CHECK_EC);
1384         enable ? button->SetCheck(BST_CHECKED) : button->SetCheck(BST_UNCHECKED);
1385     }
1386     else
1387     {
1388         // EC is not supported
1389         GetDlgItem(IDC_CHECK_EC)->EnableWindow(FALSE);
1390     }
1391 
1392     // --- First channel section
1393 
1394     GetDlgItem(IDC_COMBO_IP_1)->EnableWindow(FALSE);
1395     GetDlgItem(IDC_EDIT_TX_PORT_1)->EnableWindow(FALSE);
1396     GetDlgItem(IDC_EDIT_RX_PORT_1)->EnableWindow(FALSE);
1397     GetDlgItem(IDC_COMBO_CODEC_1)->EnableWindow(FALSE);
1398     GetDlgItem(IDC_LIST_CODEC_1)->EnableWindow(FALSE);
1399     GetDlgItem(IDC_EDIT_CODEC_1)->EnableWindow(FALSE);
1400     GetDlgItem(IDC_BUTTON_DELETE_1)->EnableWindow(FALSE);
1401     GetDlgItem(IDC_BUTTON_START_LISTEN_1)->EnableWindow(FALSE);
1402     GetDlgItem(IDC_BUTTON_STOP_LISTEN_1)->EnableWindow(FALSE);
1403     GetDlgItem(IDC_BUTTON_START_PLAYOUT_1)->EnableWindow(FALSE);
1404     GetDlgItem(IDC_BUTTON_STOP_PLAYOUT_1)->EnableWindow(FALSE);
1405     GetDlgItem(IDC_BUTTON_START_SEND_1)->EnableWindow(FALSE);
1406     GetDlgItem(IDC_BUTTON_STOP_SEND_1)->EnableWindow(FALSE);
1407     GetDlgItem(IDC_CHECK_EXT_TRANS_1)->EnableWindow(FALSE);
1408     GetDlgItem(IDC_CHECK_PLAY_FILE_IN_1)->EnableWindow(FALSE);
1409     GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_1)->EnableWindow(FALSE);
1410     GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_1)->EnableWindow(FALSE);
1411     GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_1)->EnableWindow(FALSE);
1412     GetDlgItem(IDC_CHECK_VAD_1)->EnableWindow(FALSE);
1413     GetDlgItem(IDC_CHECK_MUTE_IN_1)->EnableWindow(FALSE);
1414     GetDlgItem(IDC_CHECK_SRTP_TX_1)->EnableWindow(FALSE);
1415     GetDlgItem(IDC_CHECK_SRTP_RX_1)->EnableWindow(FALSE);
1416     GetDlgItem(IDC_CHECK_EXT_ENCRYPTION_1)->EnableWindow(FALSE);
1417     GetDlgItem(IDC_BUTTON_DTMF_1)->EnableWindow(FALSE);
1418     GetDlgItem(IDC_CHECK_CONFERENCE_1)->EnableWindow(FALSE);
1419     GetDlgItem(IDC_CHECK_ON_HOLD_1)->EnableWindow(FALSE);
1420     GetDlgItem(IDC_CHECK_DELAY_ESTIMATE_1)->EnableWindow(FALSE);
1421     GetDlgItem(IDC_CHECK_RXVAD)->EnableWindow(FALSE);
1422     GetDlgItem(IDC_CHECK_AGC_1)->EnableWindow(FALSE);
1423     GetDlgItem(IDC_CHECK_NS_1)->EnableWindow(FALSE);
1424     GetDlgItem(IDC_CHECK_RED)->EnableWindow(FALSE);
1425 
1426     CComboBox* comboIP(NULL);
1427     comboIP = (CComboBox*)GetDlgItem(IDC_COMBO_IP_1);
1428     comboIP->AddString(_T("127.0.0.1"));
1429     comboIP->SetCurSel(0);
1430 
1431     SetDlgItemInt(IDC_EDIT_TX_PORT_1, 1111);
1432     SetDlgItemInt(IDC_EDIT_RX_PORT_1, 1111);
1433 
1434     // --- Add supported codecs to the codec combo box
1435 
1436     CComboBox* comboCodec(NULL);
1437     comboCodec = (CComboBox*)GetDlgItem(IDC_COMBO_CODEC_1);
1438     comboCodec->ResetContent();
1439 
1440     int numCodecs = _veCodecPtr->NumOfCodecs();
1441     for (int idx = 0; idx < numCodecs; idx++)
1442     {
1443         CodecInst codec;
1444         _veCodecPtr->GetCodec(idx, codec);
1445         if ((_stricmp(codec.plname, "CNNB") != 0) &&
1446             (_stricmp(codec.plname, "CNWB") != 0))
1447         {
1448             CString strCodec;
1449             if (_stricmp(codec.plname, "G7221") == 0)
1450                 strCodec.Format(_T("%s (%d/%d/%d)"), CharToTchar(codec.plname, 32), codec.pltype, codec.plfreq/1000, codec.rate/1000);
1451             else
1452                 strCodec.Format(_T("%s (%d/%d)"), CharToTchar(codec.plname, 32), codec.pltype, codec.plfreq/1000);
1453             comboCodec->AddString(strCodec);
1454         }
1455         if (idx == 0)
1456         {
1457             SetDlgItemInt(IDC_EDIT_CODEC_1, codec.pltype);
1458         }
1459     }
1460     comboCodec->SetCurSel(0);
1461 
1462     CListBox* list = (CListBox*)GetDlgItem(IDC_LIST_CODEC_1);
1463     list->AddString(_T("pltype"));
1464     list->AddString(_T("plfreq"));
1465     list->AddString(_T("pacsize"));
1466     list->AddString(_T("channels"));
1467     list->AddString(_T("rate"));
1468     list->SetCurSel(0);
1469 
1470     // --- Add available audio devices to the combo boxes
1471 
1472     CComboBox* comboRecDevice(NULL);
1473     CComboBox* comboPlayDevice(NULL);
1474     comboRecDevice = (CComboBox*)GetDlgItem(IDC_COMBO_REC_DEVICE);
1475     comboPlayDevice = (CComboBox*)GetDlgItem(IDC_COMBO_PLAY_DEVICE);
1476     comboRecDevice->ResetContent();
1477     comboPlayDevice->ResetContent();
1478 
1479     if (_veHardwarePtr)
1480     {
1481         int numPlayout(0);
1482         int numRecording(0);
1483         char nameStr[128];
1484         char guidStr[128];
1485         CString strDevice;
1486         AudioLayers audioLayer;
1487 
1488         _veHardwarePtr->GetAudioDeviceLayer(audioLayer);
1489         if (kAudioWindowsWave == audioLayer)
1490         {
1491             strDevice.FormatMessage(_T("Audio Layer: Windows Wave API"));
1492         }
1493         else if (kAudioWindowsCore == audioLayer)
1494         {
1495             strDevice.FormatMessage(_T("Audio Layer: Windows Core API"));
1496         }
1497         else
1498         {
1499             strDevice.FormatMessage(_T("Audio Layer: ** UNKNOWN **"));
1500         }
1501         SetDlgItemText(IDC_EDIT_AUDIO_LAYER, (LPCTSTR)strDevice);
1502 
1503         _veHardwarePtr->GetNumOfRecordingDevices(numRecording);
1504 
1505         for (int idx = 0; idx < numRecording; idx++)
1506         {
1507             _veHardwarePtr->GetRecordingDeviceName(idx, nameStr, guidStr);
1508       strDevice.Format(_T("%s"), CharToTchar(nameStr, 128));
1509             comboRecDevice->AddString(strDevice);
1510         }
1511         // Select default (communication) device in the combo box
1512         _veHardwarePtr->GetRecordingDeviceName(-1, nameStr, guidStr);
1513     CString tmp = CString(nameStr);
1514         int nIndex = comboRecDevice->SelectString(-1, tmp);
1515         ASSERT(nIndex != CB_ERR);
1516 
1517         _veHardwarePtr->GetNumOfPlayoutDevices(numPlayout);
1518 
1519         for (int idx = 0; idx < numPlayout; idx++)
1520         {
1521             _veHardwarePtr->GetPlayoutDeviceName(idx, nameStr, guidStr);
1522       strDevice.Format(_T("%s"), CharToTchar(nameStr, 128));
1523             comboPlayDevice->AddString(strDevice);
1524         }
1525         // Select default (communication) device in the combo box
1526         _veHardwarePtr->GetPlayoutDeviceName(-1, nameStr, guidStr);
1527         nIndex = comboPlayDevice->SelectString(-1, CString(nameStr));
1528         ASSERT(nIndex != CB_ERR);
1529     }
1530 
1531     // --- Second channel section
1532 
1533     GetDlgItem(IDC_COMBO_IP_2)->EnableWindow(FALSE);
1534     GetDlgItem(IDC_EDIT_TX_PORT_2)->EnableWindow(FALSE);
1535     GetDlgItem(IDC_EDIT_RX_PORT_2)->EnableWindow(FALSE);
1536     GetDlgItem(IDC_COMBO_CODEC_2)->EnableWindow(FALSE);
1537     GetDlgItem(IDC_BUTTON_DELETE_2)->EnableWindow(FALSE);
1538     GetDlgItem(IDC_BUTTON_START_LISTEN_2)->EnableWindow(FALSE);
1539     GetDlgItem(IDC_BUTTON_STOP_LISTEN_2)->EnableWindow(FALSE);
1540     GetDlgItem(IDC_BUTTON_START_PLAYOUT_2)->EnableWindow(FALSE);
1541     GetDlgItem(IDC_BUTTON_STOP_PLAYOUT_2)->EnableWindow(FALSE);
1542     GetDlgItem(IDC_BUTTON_START_SEND_2)->EnableWindow(FALSE);
1543     GetDlgItem(IDC_BUTTON_STOP_SEND_2)->EnableWindow(FALSE);
1544     GetDlgItem(IDC_CHECK_EXT_TRANS_2)->EnableWindow(FALSE);
1545     GetDlgItem(IDC_CHECK_PLAY_FILE_IN_2)->EnableWindow(FALSE);
1546     GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_2)->EnableWindow(FALSE);
1547     GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_2)->EnableWindow(FALSE);
1548     GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_2)->EnableWindow(FALSE);
1549     GetDlgItem(IDC_CHECK_VAD_3)->EnableWindow(FALSE);
1550     GetDlgItem(IDC_CHECK_MUTE_IN_2)->EnableWindow(FALSE);
1551     GetDlgItem(IDC_CHECK_SRTP_TX_2)->EnableWindow(FALSE);
1552     GetDlgItem(IDC_CHECK_SRTP_RX_2)->EnableWindow(FALSE);
1553     GetDlgItem(IDC_CHECK_EXT_ENCRYPTION_2)->EnableWindow(FALSE);
1554     GetDlgItem(IDC_BUTTON_DTMF_2)->EnableWindow(FALSE);
1555     GetDlgItem(IDC_CHECK_CONFERENCE_2)->EnableWindow(FALSE);
1556     GetDlgItem(IDC_CHECK_ON_HOLD_2)->EnableWindow(FALSE);
1557 
1558     comboIP = (CComboBox*)GetDlgItem(IDC_COMBO_IP_2);
1559     comboIP->AddString(_T("127.0.0.1"));
1560     comboIP->SetCurSel(0);
1561 
1562     SetDlgItemInt(IDC_EDIT_TX_PORT_2, 2222);
1563     SetDlgItemInt(IDC_EDIT_RX_PORT_2, 2222);
1564 
1565     comboCodec = (CComboBox*)GetDlgItem(IDC_COMBO_CODEC_2);
1566     comboCodec->ResetContent();
1567 
1568     if (_veCodecPtr)
1569     {
1570         numCodecs = _veCodecPtr->NumOfCodecs();
1571         for (int idx = 0; idx < numCodecs; idx++)
1572         {
1573             CodecInst codec;
1574             _veCodecPtr->GetCodec(idx, codec);
1575             CString strCodec;
1576             strCodec.Format(_T("%s (%d/%d)"), CharToTchar(codec.plname, 32), codec.pltype, codec.plfreq/1000);
1577             comboCodec->AddString(strCodec);
1578         }
1579         comboCodec->SetCurSel(0);
1580     }
1581 
1582     // --- Start windows timer
1583 
1584     SetTimer(0, 1000, NULL);
1585 
1586     return TRUE;  // return TRUE  unless you set the focus to a control
1587 }
1588 
OnSysCommand(UINT nID,LPARAM lParam)1589 void CWinTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
1590 {
1591     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
1592     {
1593         CAboutDlg dlgAbout;
1594         dlgAbout.DoModal();
1595     }
1596     else if (nID == SC_CLOSE)
1597     {
1598         BOOL ret;
1599         int channel(0);
1600         channel = GetDlgItemInt(IDC_EDIT_1, &ret);
1601         if (ret == TRUE)
1602         {
1603             _veBasePtr->DeleteChannel(channel);
1604         }
1605         channel = GetDlgItemInt(IDC_EDIT_2, &ret);
1606         if (ret == TRUE)
1607         {
1608             _veBasePtr->DeleteChannel(channel);
1609         }
1610 
1611         CDialog::OnSysCommand(nID, lParam);
1612     }
1613     else
1614     {
1615         CDialog::OnSysCommand(nID, lParam);
1616     }
1617 
1618 }
1619 
1620 // If you add a minimize button to your dialog, you will need the code below
1621 //  to draw the icon.  For MFC applications using the document/view model,
1622 //  this is automatically done for you by the framework.
1623 
OnPaint()1624 void CWinTestDlg::OnPaint()
1625 {
1626     if (IsIconic())
1627     {
1628         CPaintDC dc(this); // device context for painting
1629 
1630         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
1631 
1632         // Center icon in client rectangle
1633         int cxIcon = GetSystemMetrics(SM_CXICON);
1634         int cyIcon = GetSystemMetrics(SM_CYICON);
1635         CRect rect;
1636         GetClientRect(&rect);
1637         int x = (rect.Width() - cxIcon + 1) / 2;
1638         int y = (rect.Height() - cyIcon + 1) / 2;
1639 
1640         // Draw the icon
1641         dc.DrawIcon(x, y, m_hIcon);
1642     }
1643     else
1644     {
1645         CDialog::OnPaint();
1646     }
1647 }
1648 
1649 // The system calls this function to obtain the cursor to display while the user drags
1650 //  the minimized window.
OnQueryDragIcon()1651 HCURSOR CWinTestDlg::OnQueryDragIcon()
1652 {
1653     return static_cast<HCURSOR>(m_hIcon);
1654 }
1655 
1656 
OnBnClickedButtonCreate1()1657 void CWinTestDlg::OnBnClickedButtonCreate1()
1658 {
1659     int channel(0);
1660     TEST((channel = _veBasePtr->CreateChannel()) >= 0, _T("CreateChannel(channel=%d)"), channel);
1661     if (channel >= 0)
1662     {
1663         _veRtpRtcpPtr->RegisterRTPObserver(channel, *this);
1664 
1665         SetDlgItemInt(IDC_EDIT_1, channel);
1666         GetDlgItem(IDC_BUTTON_CREATE_1)->EnableWindow(FALSE);
1667         GetDlgItem(IDC_BUTTON_DELETE_1)->EnableWindow(TRUE);
1668         GetDlgItem(IDC_COMBO_IP_1)->EnableWindow(TRUE);
1669         GetDlgItem(IDC_EDIT_TX_PORT_1)->EnableWindow(TRUE);
1670         GetDlgItem(IDC_EDIT_RX_PORT_1)->EnableWindow(TRUE);
1671         GetDlgItem(IDC_COMBO_CODEC_1)->EnableWindow(TRUE);
1672         GetDlgItem(IDC_LIST_CODEC_1)->EnableWindow(TRUE);
1673         GetDlgItem(IDC_EDIT_CODEC_1)->EnableWindow(TRUE);
1674         GetDlgItem(IDC_BUTTON_START_LISTEN_1)->EnableWindow(TRUE);
1675         GetDlgItem(IDC_BUTTON_START_PLAYOUT_1)->EnableWindow(TRUE);
1676         GetDlgItem(IDC_BUTTON_START_SEND_1)->EnableWindow(TRUE);
1677         GetDlgItem(IDC_CHECK_EXT_TRANS_1)->EnableWindow(TRUE);
1678         GetDlgItem(IDC_CHECK_PLAY_FILE_IN_1)->EnableWindow(TRUE);
1679         GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_1)->EnableWindow(TRUE);
1680         GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_1)->EnableWindow(TRUE);
1681         GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_1)->EnableWindow(TRUE);
1682         GetDlgItem(IDC_CHECK_VAD_1)->EnableWindow(TRUE);
1683         GetDlgItem(IDC_CHECK_MUTE_IN_1)->EnableWindow(TRUE);
1684         GetDlgItem(IDC_CHECK_SRTP_TX_1)->EnableWindow(TRUE);
1685         GetDlgItem(IDC_CHECK_SRTP_RX_1)->EnableWindow(TRUE);
1686         GetDlgItem(IDC_CHECK_EXT_ENCRYPTION_1)->EnableWindow(TRUE);
1687         GetDlgItem(IDC_BUTTON_DTMF_1)->EnableWindow(TRUE);
1688         GetDlgItem(IDC_CHECK_ON_HOLD_1)->EnableWindow(TRUE);
1689         GetDlgItem(IDC_CHECK_DELAY_ESTIMATE_1)->EnableWindow(TRUE);
1690         GetDlgItem(IDC_CHECK_RXVAD)->EnableWindow(TRUE);
1691         GetDlgItem(IDC_CHECK_AGC_1)->EnableWindow(TRUE);
1692         GetDlgItem(IDC_CHECK_NS_1)->EnableWindow(TRUE);
1693         GetDlgItem(IDC_CHECK_RED)->EnableWindow(TRUE);
1694 
1695         // Always set send codec to default codec <=> index 0.
1696         CodecInst codec;
1697         _veCodecPtr->GetCodec(0, codec);
1698         _veCodecPtr->SetSendCodec(channel, codec);
1699     }
1700 }
1701 
OnBnClickedButtonCreate2()1702 void CWinTestDlg::OnBnClickedButtonCreate2()
1703 {
1704     int channel(0);
1705     TEST((channel = _veBasePtr->CreateChannel()) >=0 , _T("CreateChannel(%d)"), channel);
1706     if (channel >= 0)
1707     {
1708         _veRtpRtcpPtr->RegisterRTPObserver(channel, *this);
1709 
1710         SetDlgItemInt(IDC_EDIT_2, channel);
1711         GetDlgItem(IDC_BUTTON_CREATE_2)->EnableWindow(FALSE);
1712         GetDlgItem(IDC_BUTTON_DELETE_2)->EnableWindow(TRUE);
1713         GetDlgItem(IDC_COMBO_IP_2)->EnableWindow(TRUE);
1714         GetDlgItem(IDC_EDIT_TX_PORT_2)->EnableWindow(TRUE);
1715         GetDlgItem(IDC_EDIT_RX_PORT_2)->EnableWindow(TRUE);
1716         GetDlgItem(IDC_COMBO_CODEC_2)->EnableWindow(TRUE);
1717         GetDlgItem(IDC_BUTTON_START_LISTEN_2)->EnableWindow(TRUE);
1718         GetDlgItem(IDC_BUTTON_START_PLAYOUT_2)->EnableWindow(TRUE);
1719         GetDlgItem(IDC_BUTTON_START_SEND_2)->EnableWindow(TRUE);
1720         GetDlgItem(IDC_CHECK_EXT_TRANS_2)->EnableWindow(TRUE);
1721         GetDlgItem(IDC_CHECK_PLAY_FILE_IN_2)->EnableWindow(TRUE);
1722         GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_2)->EnableWindow(TRUE);
1723         GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_2)->EnableWindow(TRUE);
1724         GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_2)->EnableWindow(TRUE);
1725         GetDlgItem(IDC_CHECK_VAD_3)->EnableWindow(TRUE);
1726         GetDlgItem(IDC_CHECK_MUTE_IN_2)->EnableWindow(TRUE);
1727         GetDlgItem(IDC_CHECK_SRTP_TX_2)->EnableWindow(TRUE);
1728         GetDlgItem(IDC_CHECK_SRTP_RX_2)->EnableWindow(TRUE);
1729         GetDlgItem(IDC_CHECK_EXT_ENCRYPTION_2)->EnableWindow(TRUE);
1730         GetDlgItem(IDC_BUTTON_DTMF_2)->EnableWindow(TRUE);
1731         GetDlgItem(IDC_CHECK_CONFERENCE_2)->EnableWindow(TRUE);
1732         GetDlgItem(IDC_CHECK_ON_HOLD_2)->EnableWindow(TRUE);
1733 
1734         // Always set send codec to default codec <=> index 0.
1735         CodecInst codec;
1736         _veCodecPtr->GetCodec(0, codec);
1737         _veCodecPtr->SetSendCodec(channel, codec);
1738     }
1739 }
1740 
OnBnClickedButtonDelete1()1741 void CWinTestDlg::OnBnClickedButtonDelete1()
1742 {
1743     BOOL ret;
1744     int channel = GetDlgItemInt(IDC_EDIT_1, &ret);
1745     if (ret == TRUE)
1746     {
1747         _delayEstimate1 = false;
1748         _rxVad = false;
1749         _veRtpRtcpPtr->DeRegisterRTPObserver(channel);
1750         TEST(_veBasePtr->DeleteChannel(channel) == 0, _T("DeleteChannel(channel=%d)"), channel);
1751         SetDlgItemText(IDC_EDIT_1, _T(""));
1752         GetDlgItem(IDC_BUTTON_CREATE_1)->EnableWindow(TRUE);
1753         GetDlgItem(IDC_BUTTON_DELETE_1)->EnableWindow(FALSE);
1754         GetDlgItem(IDC_COMBO_IP_1)->EnableWindow(FALSE);
1755         GetDlgItem(IDC_EDIT_TX_PORT_1)->EnableWindow(FALSE);
1756         GetDlgItem(IDC_EDIT_RX_PORT_1)->EnableWindow(FALSE);
1757         GetDlgItem(IDC_COMBO_CODEC_1)->EnableWindow(FALSE);
1758         GetDlgItem(IDC_LIST_CODEC_1)->EnableWindow(FALSE);
1759         GetDlgItem(IDC_EDIT_CODEC_1)->EnableWindow(FALSE);
1760         GetDlgItem(IDC_BUTTON_START_LISTEN_1)->EnableWindow(FALSE);
1761         GetDlgItem(IDC_BUTTON_START_PLAYOUT_1)->EnableWindow(FALSE);
1762         GetDlgItem(IDC_BUTTON_START_SEND_1)->EnableWindow(FALSE);
1763         GetDlgItem(IDC_BUTTON_STOP_LISTEN_1)->EnableWindow(FALSE);
1764         GetDlgItem(IDC_BUTTON_STOP_PLAYOUT_1)->EnableWindow(FALSE);
1765         GetDlgItem(IDC_BUTTON_STOP_SEND_1)->EnableWindow(FALSE);
1766         GetDlgItem(IDC_BUTTON_DTMF_1)->EnableWindow(FALSE);
1767         GetDlgItem(IDC_CHECK_EXT_TRANS_1)->EnableWindow(FALSE);
1768         GetDlgItem(IDC_CHECK_PLAY_FILE_IN_1)->EnableWindow(FALSE);
1769         GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_1)->EnableWindow(FALSE);
1770         GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_1)->EnableWindow(FALSE);
1771         GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_1)->EnableWindow(FALSE);
1772         GetDlgItem(IDC_CHECK_VAD_1)->EnableWindow(FALSE);
1773         GetDlgItem(IDC_CHECK_MUTE_IN_1)->EnableWindow(FALSE);
1774         GetDlgItem(IDC_CHECK_SRTP_TX_1)->EnableWindow(FALSE);
1775         GetDlgItem(IDC_CHECK_SRTP_RX_1)->EnableWindow(FALSE);
1776         GetDlgItem(IDC_CHECK_EXT_ENCRYPTION_1)->EnableWindow(FALSE);
1777         GetDlgItem(IDC_CHECK_CONFERENCE_1)->EnableWindow(FALSE);
1778         GetDlgItem(IDC_CHECK_ON_HOLD_1)->EnableWindow(FALSE);
1779         GetDlgItem(IDC_CHECK_DELAY_ESTIMATE_1)->EnableWindow(FALSE);
1780         GetDlgItem(IDC_CHECK_AGC_1)->EnableWindow(FALSE);
1781         GetDlgItem(IDC_CHECK_NS_1)->EnableWindow(FALSE);
1782         GetDlgItem(IDC_CHECK_RXVAD)->EnableWindow(FALSE);
1783         GetDlgItem(IDC_CHECK_RED)->EnableWindow(FALSE);
1784         SetDlgItemText(IDC_EDIT_RXVAD, _T(""));
1785         GetDlgItem(IDC_EDIT_RXVAD)->EnableWindow(FALSE);
1786         CButton* button = (CButton*)GetDlgItem(IDC_CHECK_EXT_TRANS_1);
1787         button->SetCheck(BST_UNCHECKED);
1788         button = (CButton*)GetDlgItem(IDC_CHECK_PLAY_FILE_IN_1);
1789         button->SetCheck(BST_UNCHECKED);
1790         button = (CButton*)GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_1);
1791         button->SetCheck(BST_UNCHECKED);
1792         button = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_1);
1793         button->SetCheck(BST_UNCHECKED);
1794         button = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_1);
1795         button->SetCheck(BST_UNCHECKED);
1796         button = (CButton*)GetDlgItem(IDC_CHECK_VAD_1);
1797         button->SetCheck(BST_UNCHECKED);
1798         button = (CButton*)GetDlgItem(IDC_CHECK_MUTE_IN_1);
1799         button->SetCheck(BST_UNCHECKED);
1800         button = (CButton*)GetDlgItem(IDC_CHECK_SRTP_TX_1);
1801         button->SetCheck(BST_UNCHECKED);
1802         button = (CButton*)GetDlgItem(IDC_CHECK_SRTP_RX_1);
1803         button->SetCheck(BST_UNCHECKED);
1804         button = (CButton*)GetDlgItem(IDC_CHECK_EXT_ENCRYPTION_1);
1805         button->SetCheck(BST_UNCHECKED);
1806         button = (CButton*)GetDlgItem(IDC_CHECK_CONFERENCE_1);
1807         button->SetCheck(BST_UNCHECKED);
1808         button = (CButton*)GetDlgItem(IDC_CHECK_ON_HOLD_1);
1809         button->SetCheck(BST_UNCHECKED);
1810         button = (CButton*)GetDlgItem(IDC_CHECK_DELAY_ESTIMATE_1);
1811         button->SetCheck(BST_UNCHECKED);
1812         button = (CButton*)GetDlgItem(IDC_CHECK_AGC_1);
1813         button->SetCheck(BST_UNCHECKED);
1814         button = (CButton*)GetDlgItem(IDC_CHECK_NS_1);
1815         button->SetCheck(BST_UNCHECKED);
1816         button = (CButton*)GetDlgItem(IDC_CHECK_RXVAD);
1817         button->SetCheck(BST_UNCHECKED);
1818         button = (CButton*)GetDlgItem(IDC_CHECK_RED);
1819         button->SetCheck(BST_UNCHECKED);
1820     }
1821 }
1822 
OnBnClickedButtonDelete2()1823 void CWinTestDlg::OnBnClickedButtonDelete2()
1824 {
1825     BOOL ret;
1826     int channel = GetDlgItemInt(IDC_EDIT_2, &ret);
1827     if (ret == TRUE)
1828     {
1829         _delayEstimate2 = false;
1830         _veRtpRtcpPtr->DeRegisterRTPObserver(channel);
1831         TEST(_veBasePtr->DeleteChannel(channel) == 0, _T("DeleteChannel(%d)"), channel);
1832         SetDlgItemText(IDC_EDIT_2, _T(""));
1833         GetDlgItem(IDC_BUTTON_CREATE_2)->EnableWindow(TRUE);
1834         GetDlgItem(IDC_BUTTON_DELETE_2)->EnableWindow(FALSE);
1835         GetDlgItem(IDC_COMBO_IP_2)->EnableWindow(FALSE);
1836         GetDlgItem(IDC_EDIT_TX_PORT_2)->EnableWindow(FALSE);
1837         GetDlgItem(IDC_EDIT_RX_PORT_2)->EnableWindow(FALSE);
1838         GetDlgItem(IDC_COMBO_CODEC_2)->EnableWindow(FALSE);
1839         GetDlgItem(IDC_BUTTON_START_LISTEN_2)->EnableWindow(FALSE);
1840         GetDlgItem(IDC_BUTTON_START_PLAYOUT_2)->EnableWindow(FALSE);
1841         GetDlgItem(IDC_BUTTON_START_SEND_2)->EnableWindow(FALSE);
1842         GetDlgItem(IDC_BUTTON_STOP_LISTEN_2)->EnableWindow(FALSE);
1843         GetDlgItem(IDC_BUTTON_STOP_PLAYOUT_2)->EnableWindow(FALSE);
1844         GetDlgItem(IDC_BUTTON_STOP_SEND_2)->EnableWindow(FALSE);
1845         GetDlgItem(IDC_CHECK_EXT_TRANS_2)->EnableWindow(FALSE);
1846         GetDlgItem(IDC_CHECK_PLAY_FILE_IN_2)->EnableWindow(FALSE);
1847         GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_2)->EnableWindow(FALSE);
1848         GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_2)->EnableWindow(FALSE);
1849         GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_2)->EnableWindow(FALSE);
1850         GetDlgItem(IDC_CHECK_MUTE_IN_2)->EnableWindow(FALSE);
1851         GetDlgItem(IDC_CHECK_VAD_3)->EnableWindow(FALSE);
1852         GetDlgItem(IDC_CHECK_SRTP_TX_2)->EnableWindow(FALSE);
1853         GetDlgItem(IDC_CHECK_SRTP_RX_2)->EnableWindow(FALSE);
1854         GetDlgItem(IDC_CHECK_EXT_ENCRYPTION_2)->EnableWindow(FALSE);
1855         GetDlgItem(IDC_CHECK_CONFERENCE_2)->EnableWindow(FALSE);
1856         GetDlgItem(IDC_BUTTON_DTMF_2)->EnableWindow(FALSE);
1857         GetDlgItem(IDC_CHECK_ON_HOLD_2)->EnableWindow(FALSE);
1858         CButton* button = (CButton*)GetDlgItem(IDC_CHECK_EXT_TRANS_2);
1859         button->SetCheck(BST_UNCHECKED);
1860         button = (CButton*)GetDlgItem(IDC_CHECK_PLAY_FILE_IN_2);
1861         button->SetCheck(BST_UNCHECKED);
1862         button = (CButton*)GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_2);
1863         button->SetCheck(BST_UNCHECKED);
1864         button = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_2);
1865         button->SetCheck(BST_UNCHECKED);
1866         button = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_2);
1867         button->SetCheck(BST_UNCHECKED);
1868         button = (CButton*)GetDlgItem(IDC_CHECK_VAD_3);
1869         button->SetCheck(BST_UNCHECKED);
1870         button = (CButton*)GetDlgItem(IDC_CHECK_MUTE_IN_2);
1871         button->SetCheck(BST_UNCHECKED);
1872         button = (CButton*)GetDlgItem(IDC_CHECK_SRTP_TX_2);
1873         button->SetCheck(BST_UNCHECKED);
1874         button = (CButton*)GetDlgItem(IDC_CHECK_SRTP_RX_2);
1875         button->SetCheck(BST_UNCHECKED);
1876         button = (CButton*)GetDlgItem(IDC_CHECK_EXT_ENCRYPTION_2);
1877         button->SetCheck(BST_UNCHECKED);
1878         button = (CButton*)GetDlgItem(IDC_CHECK_CONFERENCE_2);
1879         button->SetCheck(BST_UNCHECKED);
1880         button = (CButton*)GetDlgItem(IDC_CHECK_ON_HOLD_2);
1881         button->SetCheck(BST_UNCHECKED);
1882     }
1883 }
1884 
OnCbnSelchangeComboIp1()1885 void CWinTestDlg::OnCbnSelchangeComboIp1()
1886 {
1887     int channel = GetDlgItemInt(IDC_EDIT_1);
1888     CString str;
1889     int port = GetDlgItemInt(IDC_EDIT_TX_PORT_1);
1890     CComboBox* comboIP = (CComboBox*)GetDlgItem(IDC_COMBO_IP_1);
1891     int n = comboIP->GetLBTextLen(0);
1892     comboIP->GetLBText(0, str.GetBuffer(n));
1893     TEST(_veBasePtr->SetSendDestination(channel, port, TcharToChar(str.GetBuffer(n), -1)) == 0,
1894         _T("SetSendDestination(channel=%d, port=%d, ip=%s)"), channel, port, str.GetBuffer(n));
1895     str.ReleaseBuffer();
1896 }
1897 
OnCbnSelchangeComboIp2()1898 void CWinTestDlg::OnCbnSelchangeComboIp2()
1899 {
1900     int channel = GetDlgItemInt(IDC_EDIT_2);
1901     CString str;
1902     int port = GetDlgItemInt(IDC_EDIT_TX_PORT_2);
1903     CComboBox* comboIP = (CComboBox*)GetDlgItem(IDC_COMBO_IP_2);
1904     int n = comboIP->GetLBTextLen(0);
1905     comboIP->GetLBText(0, str.GetBuffer(n));
1906     TEST(_veBasePtr->SetSendDestination(channel, port, TcharToChar(str.GetBuffer(n), -1)) == 0,
1907         _T("SetSendDestination(channel=%d, port=%d, ip=%s)"), channel, port, str.GetBuffer(n));
1908     str.ReleaseBuffer();
1909 }
1910 
OnCbnSelchangeComboCodec1()1911 void CWinTestDlg::OnCbnSelchangeComboCodec1()
1912 {
1913     int channel = GetDlgItemInt(IDC_EDIT_1);
1914 
1915     CodecInst codec;
1916     CComboBox* comboCodec(NULL);
1917     comboCodec = (CComboBox*)GetDlgItem(IDC_COMBO_CODEC_1);
1918     int index = comboCodec->GetCurSel();
1919     _veCodecPtr->GetCodec(index, codec);
1920     if (strncmp(codec.plname, "ISAC", 4) == 0)
1921     {
1922         // Set iSAC to adaptive mode by default.
1923         codec.rate = -1;
1924     }
1925     TEST(_veCodecPtr->SetSendCodec(channel, codec) == 0,
1926         _T("SetSendCodec(channel=%d, plname=%s, pltype=%d, plfreq=%d, rate=%d, pacsize=%d, channels=%d)"),
1927         channel, CharToTchar(codec.plname, 32), codec.pltype, codec.plfreq, codec.rate, codec.pacsize, codec.channels);
1928 
1929     CListBox* list = (CListBox*)GetDlgItem(IDC_LIST_CODEC_1);
1930     list->SetCurSel(0);
1931     SetDlgItemInt(IDC_EDIT_CODEC_1, codec.pltype);
1932 }
1933 
OnLbnSelchangeListCodec1()1934 void CWinTestDlg::OnLbnSelchangeListCodec1()
1935 {
1936     int channel = GetDlgItemInt(IDC_EDIT_1);
1937 
1938     CListBox* list = (CListBox*)GetDlgItem(IDC_LIST_CODEC_1);
1939     int listIdx = list->GetCurSel();
1940     if (listIdx < 0)
1941         return;
1942     CString str;
1943     list->GetText(listIdx, str);
1944 
1945     CodecInst codec;
1946     _veCodecPtr->GetSendCodec(channel, codec);
1947 
1948     int value = GetDlgItemInt(IDC_EDIT_CODEC_1);
1949     if (str == _T("pltype"))
1950     {
1951         codec.pltype = value;
1952     }
1953     else if (str == _T("plfreq"))
1954     {
1955         codec.plfreq = value;
1956     }
1957     else if (str == _T("pacsize"))
1958     {
1959         codec.pacsize = value;
1960     }
1961     else if (str == _T("channels"))
1962     {
1963         codec.channels = value;
1964     }
1965     else if (str == _T("rate"))
1966     {
1967         codec.rate = value;
1968     }
1969     TEST(_veCodecPtr->SetSendCodec(channel, codec) == 0,
1970         _T("SetSendCodec(channel=%d, plname=%s, pltype=%d, plfreq=%d, rate=%d, pacsize=%d, channels=%d)"),
1971         channel, CharToTchar(codec.plname, 32), codec.pltype, codec.plfreq, codec.rate, codec.pacsize, codec.channels);
1972 }
1973 
OnCbnSelchangeComboCodec2()1974 void CWinTestDlg::OnCbnSelchangeComboCodec2()
1975 {
1976     int channel = GetDlgItemInt(IDC_EDIT_2);
1977 
1978     CodecInst codec;
1979     CComboBox* comboCodec(NULL);
1980     comboCodec = (CComboBox*)GetDlgItem(IDC_COMBO_CODEC_2);
1981     int index = comboCodec->GetCurSel();
1982     _veCodecPtr->GetCodec(index, codec);
1983     TEST(_veCodecPtr->SetSendCodec(channel, codec) == 0,
1984         _T("SetSendCodec(channel=%d, plname=%s, pltype=%d, plfreq=%d, rate=%d, pacsize=%d, channels=%d)"),
1985         channel, CharToTchar(codec.plname, 32), codec.pltype, codec.plfreq, codec.rate, codec.pacsize, codec.channels);
1986 }
1987 
OnBnClickedButtonStartListen1()1988 void CWinTestDlg::OnBnClickedButtonStartListen1()
1989 {
1990     int ret1(0);
1991     int ret2(0);
1992     int channel = GetDlgItemInt(IDC_EDIT_1);
1993     int port = GetDlgItemInt(IDC_EDIT_RX_PORT_1);
1994     TEST((ret1 = _veBasePtr->SetLocalReceiver(channel, port)) == 0, _T("SetLocalReceiver(channel=%d, port=%d)"), channel, port);
1995     TEST((ret2 = _veBasePtr->StartReceive(channel)) == 0, _T("StartReceive(channel=%d)"), channel);
1996     if (ret1 == 0 && ret2 == 0)
1997     {
1998         GetDlgItem(IDC_BUTTON_START_LISTEN_1)->EnableWindow(FALSE);
1999         GetDlgItem(IDC_BUTTON_STOP_LISTEN_1)->EnableWindow(TRUE);
2000     }
2001 }
2002 
OnBnClickedButtonStartListen2()2003 void CWinTestDlg::OnBnClickedButtonStartListen2()
2004 {
2005     int ret1(0);
2006     int ret2(0);
2007     int channel = GetDlgItemInt(IDC_EDIT_2);
2008     int port = GetDlgItemInt(IDC_EDIT_RX_PORT_2);
2009     TEST((ret1 = _veBasePtr->SetLocalReceiver(channel, port)) == 0, _T("SetLocalReceiver(channel=%d, port=%d)"), channel, port);
2010     TEST((ret2 = _veBasePtr->StartReceive(channel)) == 0, _T("StartReceive(channel=%d)"), channel);
2011     if (ret1 == 0 && ret2 == 0)
2012     {
2013         GetDlgItem(IDC_BUTTON_START_LISTEN_2)->EnableWindow(FALSE);
2014         GetDlgItem(IDC_BUTTON_STOP_LISTEN_2)->EnableWindow(TRUE);
2015     }
2016 }
2017 
OnBnClickedButtonStopListen1()2018 void CWinTestDlg::OnBnClickedButtonStopListen1()
2019 {
2020     int ret(0);
2021     int channel = GetDlgItemInt(IDC_EDIT_1);
2022     TEST((ret = _veBasePtr->StopReceive(channel)) == 0, _T("StopListen(channel=%d)"), channel);
2023     if (ret == 0)
2024     {
2025         GetDlgItem(IDC_BUTTON_START_LISTEN_1)->EnableWindow(TRUE);
2026         GetDlgItem(IDC_BUTTON_STOP_LISTEN_1)->EnableWindow(FALSE);
2027     }
2028 }
2029 
OnBnClickedButtonStopListen2()2030 void CWinTestDlg::OnBnClickedButtonStopListen2()
2031 {
2032     int ret(0);
2033     int channel = GetDlgItemInt(IDC_EDIT_2);
2034     TEST((ret = _veBasePtr->StopReceive(channel)) == 0, _T("StopListen(channel=%d)"), channel);
2035     if (ret == 0)
2036     {
2037         GetDlgItem(IDC_BUTTON_START_LISTEN_2)->EnableWindow(TRUE);
2038         GetDlgItem(IDC_BUTTON_STOP_LISTEN_2)->EnableWindow(FALSE);
2039     }
2040 }
2041 
OnBnClickedButtonStartPlayout1()2042 void CWinTestDlg::OnBnClickedButtonStartPlayout1()
2043 {
2044     int ret(0);
2045     int channel = GetDlgItemInt(IDC_EDIT_1);
2046     TEST((ret = _veBasePtr->StartPlayout(channel)) == 0, _T("StartPlayout(channel=%d)"), channel);
2047     if (ret == 0)
2048     {
2049         GetDlgItem(IDC_BUTTON_START_PLAYOUT_1)->EnableWindow(FALSE);
2050         GetDlgItem(IDC_BUTTON_STOP_PLAYOUT_1)->EnableWindow(TRUE);
2051     }
2052 }
2053 
OnBnClickedButtonStartPlayout2()2054 void CWinTestDlg::OnBnClickedButtonStartPlayout2()
2055 {
2056     int ret(0);
2057     int channel = GetDlgItemInt(IDC_EDIT_2);
2058     TEST((ret = _veBasePtr->StartPlayout(channel)) == 0, _T("StartPlayout(channel=%d)"), channel);
2059     if (ret == 0)
2060     {
2061         GetDlgItem(IDC_BUTTON_START_PLAYOUT_2)->EnableWindow(FALSE);
2062         GetDlgItem(IDC_BUTTON_STOP_PLAYOUT_2)->EnableWindow(TRUE);
2063     }
2064 }
2065 
OnBnClickedButtonStopPlayout1()2066 void CWinTestDlg::OnBnClickedButtonStopPlayout1()
2067 {
2068     int ret(0);
2069     int channel = GetDlgItemInt(IDC_EDIT_1);
2070     TEST((ret = _veBasePtr->StopPlayout(channel)) == 0, _T("StopPlayout(channel=%d)"), channel);
2071     if (ret == 0)
2072     {
2073         GetDlgItem(IDC_BUTTON_START_PLAYOUT_1)->EnableWindow(TRUE);
2074         GetDlgItem(IDC_BUTTON_STOP_PLAYOUT_1)->EnableWindow(FALSE);
2075     }
2076 }
2077 
OnBnClickedButtonStopPlayout2()2078 void CWinTestDlg::OnBnClickedButtonStopPlayout2()
2079 {
2080     int ret(0);
2081     int channel = GetDlgItemInt(IDC_EDIT_2);
2082     TEST((ret = _veBasePtr->StopPlayout(channel)) == 0, _T("StopPlayout(channel=%d)"));
2083     if (ret == 0)
2084     {
2085         GetDlgItem(IDC_BUTTON_START_PLAYOUT_2)->EnableWindow(TRUE);
2086         GetDlgItem(IDC_BUTTON_STOP_PLAYOUT_2)->EnableWindow(FALSE);
2087     }
2088 }
2089 
OnBnClickedButtonStartSend1()2090 void CWinTestDlg::OnBnClickedButtonStartSend1()
2091 {
2092     UpdateData(TRUE);  // update IP address
2093 
2094     int ret(0);
2095     int channel = GetDlgItemInt(IDC_EDIT_1);
2096     if (!_externalTransport)
2097     {
2098         CString str;
2099         int port = GetDlgItemInt(IDC_EDIT_TX_PORT_1);
2100     TEST(_veBasePtr->SetSendDestination(channel, port, TcharToChar(_strComboIp1.GetBuffer(7), -1)) == 0,
2101       _T("SetSendDestination(channel=%d, port=%d, ip=%s)"), channel, port, _strComboIp1.GetBuffer(7));
2102         str.ReleaseBuffer();
2103     }
2104 
2105 	//_veVideoSyncPtr->SetInitTimestamp(0,0);
2106     // OnCbnSelchangeComboCodec1();
2107 
2108     TEST((ret = _veBasePtr->StartSend(channel)) == 0, _T("StartSend(channel=%d)"), channel);
2109     if (ret == 0)
2110     {
2111         GetDlgItem(IDC_BUTTON_START_SEND_1)->EnableWindow(FALSE);
2112         GetDlgItem(IDC_BUTTON_STOP_SEND_1)->EnableWindow(TRUE);
2113     }
2114 }
2115 
OnBnClickedButtonStartSend2()2116 void CWinTestDlg::OnBnClickedButtonStartSend2()
2117 {
2118     UpdateData(TRUE);  // update IP address
2119 
2120     int ret(0);
2121     int channel = GetDlgItemInt(IDC_EDIT_2);
2122     if (!_externalTransport)
2123     {
2124         CString str;
2125         int port = GetDlgItemInt(IDC_EDIT_TX_PORT_2);
2126         TEST(_veBasePtr->SetSendDestination(channel, port, TcharToChar(_strComboIp2.GetBuffer(7), -1)) == 0,
2127             _T("SetSendDestination(channel=%d, port=%d, ip=%s)"), channel, port, _strComboIp2.GetBuffer(7));
2128         str.ReleaseBuffer();
2129     }
2130 
2131     // OnCbnSelchangeComboCodec2();
2132 
2133     TEST((ret = _veBasePtr->StartSend(channel)) == 0, _T("StartSend(channel=%d)"), channel);
2134     if (ret == 0)
2135     {
2136         GetDlgItem(IDC_BUTTON_START_SEND_2)->EnableWindow(FALSE);
2137         GetDlgItem(IDC_BUTTON_STOP_SEND_2)->EnableWindow(TRUE);
2138     }
2139 }
2140 
OnBnClickedButtonStopSend1()2141 void CWinTestDlg::OnBnClickedButtonStopSend1()
2142 {
2143     int ret(0);
2144     int channel = GetDlgItemInt(IDC_EDIT_1);
2145     TEST((ret = _veBasePtr->StopSend(channel)) == 0, _T("StopSend(channel=%d)"), channel);
2146     if (ret == 0)
2147     {
2148         GetDlgItem(IDC_BUTTON_START_SEND_1)->EnableWindow(TRUE);
2149         GetDlgItem(IDC_BUTTON_STOP_SEND_1)->EnableWindow(FALSE);
2150     }
2151 }
2152 
OnBnClickedButtonStopSend2()2153 void CWinTestDlg::OnBnClickedButtonStopSend2()
2154 {
2155     int ret(0);
2156     int channel = GetDlgItemInt(IDC_EDIT_2);
2157     TEST((ret = _veBasePtr->StopSend(channel)) == 0, _T("StopSend(channel=%d)"), channel);
2158     if (ret == 0)
2159     {
2160         GetDlgItem(IDC_BUTTON_START_SEND_2)->EnableWindow(TRUE);
2161         GetDlgItem(IDC_BUTTON_STOP_SEND_2)->EnableWindow(FALSE);
2162     }
2163 }
2164 
OnBnClickedCheckExtTrans1()2165 void CWinTestDlg::OnBnClickedCheckExtTrans1()
2166 {
2167     int ret(0);
2168     int channel = GetDlgItemInt(IDC_EDIT_1);
2169     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_EXT_TRANS_1);
2170     int check = button->GetCheck();
2171     const bool enable = (check == BST_CHECKED);
2172     if (enable)
2173     {
2174         TEST((ret = _veNetworkPtr->RegisterExternalTransport(channel, *_transportPtr)) == 0,
2175             _T("RegisterExternalTransport(channel=%d, transport=0x%x)"), channel, _transportPtr);
2176     }
2177     else
2178     {
2179         TEST((ret = _veNetworkPtr->DeRegisterExternalTransport(channel)) == 0,
2180             _T("DeRegisterExternalTransport(channel=%d)"), channel);
2181     }
2182     if (ret == 0)
2183     {
2184         _externalTransport = enable;
2185     }
2186     else
2187     {
2188         // restore inital state since API call failed
2189         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2190     }
2191 }
2192 
OnBnClickedCheckExtTrans2()2193 void CWinTestDlg::OnBnClickedCheckExtTrans2()
2194 {
2195     int ret(0);
2196     int channel = GetDlgItemInt(IDC_EDIT_2);
2197     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_EXT_TRANS_2);
2198     int check = button->GetCheck();
2199     const bool enable = (check == BST_CHECKED);
2200     if (enable)
2201     {
2202         TEST((ret = _veNetworkPtr->RegisterExternalTransport(channel, *_transportPtr)) == 0,
2203             _T("RegisterExternalTransport(channel=%d, transport=0x%x)"), channel, _transportPtr);
2204     }
2205     else
2206     {
2207         TEST((ret = _veNetworkPtr->DeRegisterExternalTransport(channel)) == 0,
2208             _T("DeRegisterExternalTransport(channel=%d)"), channel);
2209     }
2210     if (ret == 0)
2211     {
2212         _externalTransport = enable;
2213     }
2214     else
2215     {
2216         // restore inital state since API call failed
2217         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2218     }
2219 }
2220 
OnBnClickedCheckPlayFileIn1()2221 void CWinTestDlg::OnBnClickedCheckPlayFileIn1()
2222 {
2223     std::string micFile = _long_audio_file_path + "audio_short16.pcm";
2224 
2225     int ret(0);
2226     int channel = GetDlgItemInt(IDC_EDIT_1);
2227     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_PLAY_FILE_IN_1);
2228     int check = button->GetCheck();
2229     const bool enable = (check == BST_CHECKED);
2230     if (enable)
2231     {
2232         bool mix;
2233         const bool loop(true);
2234         const FileFormats format = kFileFormatPcm16kHzFile;
2235         const float scale(1.0);
2236 
2237         (_checkPlayFileIn1 %2 == 0) ? mix = true : mix = false;
2238         TEST((ret = _veFilePtr->StartPlayingFileAsMicrophone(channel,
2239             micFile.c_str(), loop, mix, format, scale) == 0),
2240             _T("StartPlayingFileAsMicrophone(channel=%d, file=%s, loop=%d, ")
2241             _T("mix=%d, format=%d, scale=%2.1f)"),
2242             channel, CharToTchar(micFile.c_str(), -1),
2243             loop, mix, format, scale);
2244         _checkPlayFileIn1++;
2245     }
2246     else
2247     {
2248         TEST((ret = _veFilePtr->StopPlayingFileAsMicrophone(channel) == 0),
2249             _T("StopPlayingFileAsMicrophone(channel=%d)"), channel);
2250     }
2251     if (ret == -1)
2252     {
2253         // restore inital state since API call failed
2254         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2255     }
2256 }
2257 
OnBnClickedCheckPlayFileIn2()2258 void CWinTestDlg::OnBnClickedCheckPlayFileIn2()
2259 {
2260     std::string micFile = _long_audio_file_path + "audio_long16.pcm";
2261 
2262     int ret(0);
2263     int channel = GetDlgItemInt(IDC_EDIT_2);
2264     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_PLAY_FILE_IN_2);
2265     int check = button->GetCheck();
2266     const bool enable = (check == BST_CHECKED);
2267     if (enable)
2268     {
2269         bool mix;
2270         const bool loop(true);
2271         const FileFormats format = kFileFormatPcm16kHzFile;
2272         const float scale(1.0);
2273 
2274         (_checkPlayFileIn2 %2 == 0) ? mix = true : mix = false;
2275         TEST((ret = _veFilePtr->StartPlayingFileAsMicrophone(channel,
2276             micFile.c_str(), loop, mix, format, scale) == 0),
2277             _T("StartPlayingFileAsMicrophone(channel=%d, file=%s, loop=%d, ")
2278             _T("mix=%d, format=%d, scale=%2.1f)"),
2279             channel, CharToTchar(micFile.c_str(), -1),
2280             loop, mix, format, scale);
2281         _checkPlayFileIn2++;
2282     }
2283     else
2284     {
2285         TEST((ret = _veFilePtr->StopPlayingFileAsMicrophone(channel) == 0),
2286             _T("StopPlayingFileAsMicrophone(channel=%d)"), channel);
2287     }
2288     if (ret == -1)
2289     {
2290         // restore inital state since API call failed
2291         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2292     }
2293 }
2294 
OnBnClickedCheckPlayFileOut1()2295 void CWinTestDlg::OnBnClickedCheckPlayFileOut1()
2296 {
2297     const FileFormats formats[8]  = {{kFileFormatPcm16kHzFile},
2298                                           {kFileFormatWavFile},
2299                                           {kFileFormatWavFile},
2300                                           {kFileFormatWavFile},
2301                                           {kFileFormatWavFile},
2302                                           {kFileFormatWavFile},
2303                                           {kFileFormatWavFile},
2304                                           {kFileFormatWavFile}};
2305     // File path is relative to the location of 'voice_engine.gyp'.
2306     const char spkrFiles[8][64] = {{"audio_short16.pcm"},
2307                                    {"audio_tiny8.wav"},
2308                                    {"audio_tiny11.wav"},
2309                                    {"audio_tiny16.wav"},
2310                                    {"audio_tiny22.wav"},
2311                                    {"audio_tiny32.wav"},
2312                                    {"audio_tiny44.wav"},
2313                                    {"audio_tiny48.wav"}};
2314     int ret(0);
2315     int channel = GetDlgItemInt(IDC_EDIT_1);
2316     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_1);
2317     int check = button->GetCheck();
2318     const bool enable = (check == BST_CHECKED);
2319     if (enable)
2320     {
2321         const bool loop(true);
2322         const float volumeScaling(1.0);
2323         const int startPointMs(0);
2324         const int stopPointMs(0);
2325         const FileFormats format = formats[_checkPlayFileOut1 % 8];
2326         std::string spkrFile = _long_audio_file_path +
2327                                spkrFiles[_checkPlayFileOut1 % 8];
2328 
2329         CString str;
2330         if (_checkPlayFileOut1 % 8 == 0)
2331         {
2332             str = _T("kFileFormatPcm16kHzFile");
2333         }
2334         else
2335         {
2336             str = _T("kFileFormatWavFile");
2337         }
2338         // (_checkPlayFileOut1 %2 == 0) ? mix = true : mix = false;
2339         TEST((ret = _veFilePtr->StartPlayingFileLocally(channel,
2340             spkrFile.c_str(), loop, format, volumeScaling,
2341             startPointMs,stopPointMs) == 0),
2342             _T("StartPlayingFileLocally(channel=%d, file=%s, loop=%d, ")
2343             _T("format=%s, scale=%2.1f, start=%d, stop=%d)"),
2344             channel, CharToTchar(spkrFile.c_str(), -1),
2345             loop, str, volumeScaling, startPointMs, stopPointMs);
2346         _checkPlayFileOut1++;
2347     }
2348     else
2349     {
2350         TEST((ret = _veFilePtr->StopPlayingFileLocally(channel) == 0),
2351             _T("StopPlayingFileLocally(channel=%d)"), channel);
2352     }
2353     if (ret == -1)
2354     {
2355         // restore inital state since API call failed
2356         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2357     }
2358 }
2359 
OnBnClickedCheckPlayFileOut2()2360 void CWinTestDlg::OnBnClickedCheckPlayFileOut2()
2361 {
2362     std::string spkrFile = _long_audio_file_path + "audio_long16.pcm";
2363 
2364     int ret(0);
2365     int channel = GetDlgItemInt(IDC_EDIT_2);
2366     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_PLAY_FILE_OUT_2);
2367     int check = button->GetCheck();
2368     const bool enable = (check == BST_CHECKED);
2369     if (enable)
2370     {
2371         const bool loop(true);
2372         const FileFormats format = kFileFormatPcm16kHzFile;
2373         const float volumeScaling(1.0);
2374         const int startPointMs(0);
2375         const int stopPointMs(0);
2376 
2377         // (_checkPlayFileOut2 %2 == 0) ? mix = true : mix = false;
2378         TEST((ret = _veFilePtr->StartPlayingFileLocally(channel,
2379             spkrFile.c_str(), loop, format, volumeScaling,
2380             startPointMs,stopPointMs) == 0),
2381             _T("StartPlayingFileLocally(channel=%d, file=%s, loop=%d, ")
2382             _T("format=%d, scale=%2.1f, start=%d, stop=%d)"),
2383             channel, CharToTchar(spkrFile.c_str(), -1),
2384             loop, format, volumeScaling, startPointMs, stopPointMs);
2385         // _checkPlayFileIn2++;
2386     }
2387     else
2388     {
2389         TEST((ret = _veFilePtr->StopPlayingFileLocally(channel) == 0),
2390             _T("StopPlayingFileLocally(channel=%d)"), channel);
2391     }
2392     if (ret == -1)
2393     {
2394         // restore inital state since API call failed
2395         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2396     }
2397 }
2398 
OnBnClickedCheckExtMediaIn1()2399 void CWinTestDlg::OnBnClickedCheckExtMediaIn1()
2400 {
2401     int channel = GetDlgItemInt(IDC_EDIT_1);
2402     CButton* buttonExtTrans = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_1);
2403     int check = buttonExtTrans->GetCheck();
2404     const bool enable = (check == BST_CHECKED);
2405     if (enable)
2406     {
2407         TEST(_veExternalMediaPtr->RegisterExternalMediaProcessing(channel, kRecordingPerChannel, *_externalMediaPtr) == 0,
2408             _T("RegisterExternalMediaProcessing(channel=%d, kRecordingPerChannel, processObject=0x%x)"), channel, _externalMediaPtr);
2409     }
2410     else
2411     {
2412         TEST(_veExternalMediaPtr->DeRegisterExternalMediaProcessing(channel, kRecordingPerChannel) == 0,
2413             _T("DeRegisterExternalMediaProcessing(channel=%d, kRecordingPerChannel)"), channel);
2414     }
2415 }
2416 
OnBnClickedCheckExtMediaIn2()2417 void CWinTestDlg::OnBnClickedCheckExtMediaIn2()
2418 {
2419     int channel = GetDlgItemInt(IDC_EDIT_2);
2420     CButton* buttonExtTrans = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_IN_2);
2421     int check = buttonExtTrans->GetCheck();
2422     const bool enable = (check == BST_CHECKED);
2423     if (enable)
2424     {
2425         TEST(_veExternalMediaPtr->RegisterExternalMediaProcessing(channel, kRecordingPerChannel, *_externalMediaPtr) == 0,
2426             _T("RegisterExternalMediaProcessing(channel=%d, kRecordingPerChannel, processObject=0x%x)"), channel, _externalMediaPtr);
2427     }
2428     else
2429     {
2430         TEST(_veExternalMediaPtr->DeRegisterExternalMediaProcessing(channel, kRecordingPerChannel) == 0,
2431             _T("DeRegisterExternalMediaProcessing(channel=%d, kRecordingPerChannel)"), channel);
2432     }
2433 }
2434 
OnBnClickedCheckExtMediaOut1()2435 void CWinTestDlg::OnBnClickedCheckExtMediaOut1()
2436 {
2437     int channel = GetDlgItemInt(IDC_EDIT_1);
2438     CButton* buttonExtTrans = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_1);
2439     int check = buttonExtTrans->GetCheck();
2440     const bool enable = (check == BST_CHECKED);
2441     if (enable)
2442     {
2443         TEST(_veExternalMediaPtr->RegisterExternalMediaProcessing(channel, kPlaybackPerChannel, *_externalMediaPtr) == 0,
2444             _T("RegisterExternalMediaProcessing(channel=%d, kPlaybackPerChannel, processObject=0x%x)"), channel, _externalMediaPtr);
2445     }
2446     else
2447     {
2448         TEST(_veExternalMediaPtr->DeRegisterExternalMediaProcessing(channel, kPlaybackPerChannel) == 0,
2449             _T("DeRegisterExternalMediaProcessing(channel=%d, kPlaybackPerChannel)"), channel);
2450     }
2451 }
2452 
OnBnClickedCheckExtMediaOut2()2453 void CWinTestDlg::OnBnClickedCheckExtMediaOut2()
2454 {
2455     int channel = GetDlgItemInt(IDC_EDIT_2);
2456     CButton* buttonExtTrans = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT_2);
2457     int check = buttonExtTrans->GetCheck();
2458     const bool enable = (check == BST_CHECKED);
2459     if (enable)
2460     {
2461         TEST(_veExternalMediaPtr->RegisterExternalMediaProcessing(channel, kPlaybackPerChannel, *_externalMediaPtr) == 0,
2462             _T("RegisterExternalMediaProcessing(channel=%d, kPlaybackPerChannel, processObject=0x%x)"), channel, _externalMediaPtr);
2463     }
2464     else
2465     {
2466         TEST(_veExternalMediaPtr->DeRegisterExternalMediaProcessing(channel, kPlaybackPerChannel) == 0,
2467             _T("DeRegisterExternalMediaProcessing(channel=%d, kPlaybackPerChannel)"), channel);
2468     }
2469 }
2470 
OnBnClickedCheckVad1()2471 void CWinTestDlg::OnBnClickedCheckVad1()
2472 {
2473     int ret(0);
2474     int channel = GetDlgItemInt(IDC_EDIT_1);
2475     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_VAD_1);
2476     int check = button->GetCheck();
2477     const bool enable = (check == BST_CHECKED);
2478     if (enable)
2479     {
2480         CString str;
2481         VadModes mode(kVadConventional);
2482         if (_checkVAD1 % 4 == 0)
2483         {
2484             mode = kVadConventional;
2485             str = _T("kVadConventional");
2486         }
2487         else if (_checkVAD1 % 4 == 1)
2488         {
2489             mode = kVadAggressiveLow;
2490             str = _T("kVadAggressiveLow");
2491         }
2492         else if (_checkVAD1 % 4 == 2)
2493         {
2494             mode = kVadAggressiveMid;
2495             str = _T("kVadAggressiveMid");
2496         }
2497         else if (_checkVAD1 % 4 == 3)
2498         {
2499             mode = kVadAggressiveHigh;
2500             str = _T("kVadAggressiveHigh");
2501         }
2502         const bool disableDTX(false);
2503         TEST((ret = _veCodecPtr->SetVADStatus(channel, true, mode, disableDTX) == 0),
2504             _T("SetVADStatus(channel=%d, enable=%d, mode=%s, disableDTX=%d)"), channel, enable, str, disableDTX);
2505         _checkVAD1++;
2506     }
2507     else
2508     {
2509         TEST((ret = _veCodecPtr->SetVADStatus(channel, false)) == 0, _T("SetVADStatus(channel=%d, enable=%d)"), channel, false);
2510     }
2511     if (ret == -1)
2512     {
2513         // restore inital state since API call failed
2514         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2515     }
2516 }
2517 
OnBnClickedCheckVad2()2518 void CWinTestDlg::OnBnClickedCheckVad2()
2519 {
2520     int ret(0);
2521     int channel = GetDlgItemInt(IDC_EDIT_2);
2522     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_VAD_2);
2523     int check = button->GetCheck();
2524     const bool enable = (check == BST_CHECKED);
2525     if (enable)
2526     {
2527         CString str;
2528         VadModes mode(kVadConventional);
2529         if (_checkVAD2 % 4 == 0)
2530         {
2531             mode = kVadConventional;
2532             str = _T("kVadConventional");
2533         }
2534         else if (_checkVAD2 % 4 == 1)
2535         {
2536             mode = kVadAggressiveLow;
2537             str = _T("kVadAggressiveLow");
2538         }
2539         else if (_checkVAD2 % 4 == 2)
2540         {
2541             mode = kVadAggressiveMid;
2542             str = _T("kVadAggressiveMid");
2543         }
2544         else if (_checkVAD2 % 4 == 3)
2545         {
2546             mode = kVadAggressiveHigh;
2547             str = _T("kVadAggressiveHigh");
2548         }
2549         const bool disableDTX(false);
2550         TEST((ret = _veCodecPtr->SetVADStatus(channel, true, mode, disableDTX)) == 0,
2551             _T("SetVADStatus(channel=%d, enable=%d, mode=%s, disableDTX=%d)"), channel, enable, str, disableDTX);
2552         _checkVAD2++;
2553     }
2554     else
2555     {
2556         TEST((ret = _veCodecPtr->SetVADStatus(channel, false) == 0), _T("SetVADStatus(channel=%d, enable=%d)"), channel, false);
2557     }
2558     if (ret == -1)
2559     {
2560         // restore inital state since API call failed
2561         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2562     }
2563 }
2564 
OnBnClickedCheckMuteIn1()2565 void CWinTestDlg::OnBnClickedCheckMuteIn1()
2566 {
2567     int channel = GetDlgItemInt(IDC_EDIT_1);
2568     CButton* buttonMute = (CButton*)GetDlgItem(IDC_CHECK_MUTE_IN_1);
2569     int check = buttonMute->GetCheck();
2570     const bool enable = (check == BST_CHECKED);
2571     TEST(_veVolumeControlPtr->SetInputMute(channel, enable) == 0,
2572         _T("SetInputMute(channel=%d, enable=%d)"), channel, enable);
2573 }
2574 
OnBnClickedCheckMuteIn2()2575 void CWinTestDlg::OnBnClickedCheckMuteIn2()
2576 {
2577     int channel = GetDlgItemInt(IDC_EDIT_2);
2578     CButton* buttonMute = (CButton*)GetDlgItem(IDC_CHECK_MUTE_IN_2);
2579     int check = buttonMute->GetCheck();
2580     const bool enable = (check == BST_CHECKED);
2581     TEST(_veVolumeControlPtr->SetInputMute(channel, enable) == 0,
2582         _T("SetInputMute(channel=%d, enable=%d)"), channel, enable);
2583 }
2584 
OnBnClickedCheckSrtpTx1()2585 void CWinTestDlg::OnBnClickedCheckSrtpTx1()
2586 {
2587     TEST(true, "Built-in SRTP support is deprecated.");
2588 }
2589 
OnBnClickedCheckSrtpTx2()2590 void CWinTestDlg::OnBnClickedCheckSrtpTx2()
2591 {
2592     TEST(true, "Built-in SRTP support is deprecated.");
2593 }
2594 
OnBnClickedCheckSrtpRx1()2595 void CWinTestDlg::OnBnClickedCheckSrtpRx1()
2596 {
2597     TEST(true, "Built-in SRTP support is deprecated.");
2598 }
2599 
OnBnClickedCheckSrtpRx2()2600 void CWinTestDlg::OnBnClickedCheckSrtpRx2()
2601 {
2602     TEST(true, "Built-in SRTP support is deprecated.");
2603 }
2604 
OnBnClickedCheckExtEncryption1()2605 void CWinTestDlg::OnBnClickedCheckExtEncryption1()
2606 {
2607     TEST(true, "External Encryption has been removed from the API!");
2608 }
2609 
OnBnClickedCheckExtEncryption2()2610 void CWinTestDlg::OnBnClickedCheckExtEncryption2()
2611 {
2612     TEST(true, "External Encryption has been removed from the API!");
2613 }
2614 
OnBnClickedButtonDtmf1()2615 void CWinTestDlg::OnBnClickedButtonDtmf1()
2616 {
2617     int channel = GetDlgItemInt(IDC_EDIT_1);
2618     CTelephonyEvent dlgTelephoneEvent(_vePtr, channel, this);
2619     dlgTelephoneEvent.DoModal();
2620 }
2621 
OnBnClickedButtonDtmf2()2622 void CWinTestDlg::OnBnClickedButtonDtmf2()
2623 {
2624     int channel = GetDlgItemInt(IDC_EDIT_2);
2625     CTelephonyEvent dlgTelephoneEvent(_vePtr, channel, this);
2626     dlgTelephoneEvent.DoModal();
2627 }
2628 
OnBnClickedCheckConference1()2629 void CWinTestDlg::OnBnClickedCheckConference1()
2630 {
2631     // Not supported yet
2632 }
2633 
OnBnClickedCheckConference2()2634 void CWinTestDlg::OnBnClickedCheckConference2()
2635 {
2636    // Not supported yet
2637 }
2638 
OnBnClickedCheckOnHold1()2639 void CWinTestDlg::OnBnClickedCheckOnHold1()
2640 {
2641     SHORT shiftKeyIsPressed = ::GetAsyncKeyState(VK_SHIFT);
2642 
2643     CString str;
2644     int channel = GetDlgItemInt(IDC_EDIT_1);
2645     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_ON_HOLD_1);
2646     int check = button->GetCheck();
2647 
2648     if (shiftKeyIsPressed)
2649     {
2650         bool enabled(false);
2651         OnHoldModes mode(kHoldSendAndPlay);
2652         TEST(_veBasePtr->GetOnHoldStatus(channel, enabled, mode) == 0,
2653             _T("GetOnHoldStatus(channel=%d, enabled=?, mode=?)"), channel);
2654         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2655 
2656         switch (mode)
2657         {
2658         case kHoldSendAndPlay:
2659             str = _T("kHoldSendAndPlay");
2660             break;
2661         case kHoldSendOnly:
2662             str = _T("kHoldSendOnly");
2663             break;
2664         case kHoldPlayOnly:
2665             str = _T("kHoldPlayOnly");
2666             break;
2667         default:
2668             break;
2669         }
2670         PRINT_GET_RESULT(_T("enabled=%d, mode=%s"), enabled, str);
2671         return;
2672     }
2673 
2674     int ret(0);
2675     const bool enable = (check == BST_CHECKED);
2676     if (enable)
2677     {
2678         OnHoldModes mode(kHoldSendAndPlay);
2679         if (_checkOnHold1 % 3 == 0)
2680         {
2681             mode = kHoldSendAndPlay;
2682             str = _T("kHoldSendAndPlay");
2683         }
2684         else if (_checkOnHold1 % 3 == 1)
2685         {
2686             mode = kHoldSendOnly;
2687             str = _T("kHoldSendOnly");
2688         }
2689         else if (_checkOnHold1 % 3 == 2)
2690         {
2691             mode = kHoldPlayOnly;
2692             str = _T("kHoldPlayOnly");
2693         }
2694         TEST((ret = _veBasePtr->SetOnHoldStatus(channel, enable, mode)) == 0,
2695             _T("SetOnHoldStatus(channel=%d, enable=%d, mode=%s)"), channel, enable, str);
2696         _checkOnHold1++;
2697     }
2698     else
2699     {
2700         TEST((ret = _veBasePtr->SetOnHoldStatus(channel, enable)) == 0,
2701             _T("SetOnHoldStatus(channel=%d, enable=%d)"), channel, enable);
2702     }
2703 }
2704 
OnBnClickedCheckOnHold2()2705 void CWinTestDlg::OnBnClickedCheckOnHold2()
2706 {
2707     int ret(0);
2708     int channel = GetDlgItemInt(IDC_EDIT_2);
2709     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_ON_HOLD_2);
2710     int check = button->GetCheck();
2711     const bool enable = (check == BST_CHECKED);
2712     if (enable)
2713     {
2714         CString str;
2715         OnHoldModes mode(kHoldSendAndPlay);
2716         if (_checkOnHold1 % 3 == 0)
2717         {
2718             mode = kHoldSendAndPlay;
2719             str = _T("kHoldSendAndPlay");
2720         }
2721         else if (_checkOnHold1 % 3 == 1)
2722         {
2723             mode = kHoldSendOnly;
2724             str = _T("kHoldSendOnly");
2725         }
2726         else if (_checkOnHold1 % 3 == 2)
2727         {
2728             mode = kHoldPlayOnly;
2729             str = _T("kHoldPlayOnly");
2730         }
2731         TEST((ret = _veBasePtr->SetOnHoldStatus(channel, enable, mode)) == 0,
2732             _T("SetOnHoldStatus(channel=%d, enable=%d, mode=%s)"), channel, enable, str);
2733         _checkOnHold1++;
2734     }
2735     else
2736     {
2737         TEST((ret = _veBasePtr->SetOnHoldStatus(channel, enable)) == 0,
2738             _T("SetOnHoldStatus(channel=%d, enable=%d)"), channel, enable);
2739     }
2740 }
2741 
OnBnClickedCheckDelayEstimate1()2742 void CWinTestDlg::OnBnClickedCheckDelayEstimate1()
2743 {
2744     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_DELAY_ESTIMATE_1);
2745     int check = button->GetCheck();
2746     const bool enable = (check == BST_CHECKED);
2747 
2748     if (enable)
2749     {
2750         _delayEstimate1 = true;
2751         SetDlgItemInt(IDC_EDIT_DELAY_ESTIMATE_1, 0);
2752     }
2753     else
2754     {
2755         _delayEstimate1 = false;
2756         SetDlgItemText(IDC_EDIT_DELAY_ESTIMATE_1, _T(""));
2757     }
2758 }
2759 
OnBnClickedCheckRxvad()2760 void CWinTestDlg::OnBnClickedCheckRxvad()
2761 {
2762     int channel = GetDlgItemInt(IDC_EDIT_1);
2763     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_RXVAD);
2764     int check = button->GetCheck();
2765     const bool enable = (check == BST_CHECKED);
2766 
2767     if (enable)
2768     {
2769         _rxVad = true;
2770         _veApmPtr->RegisterRxVadObserver(channel, *_rxVadObserverPtr);
2771         SetDlgItemInt(IDC_EDIT_RXVAD, 0);
2772     }
2773     else
2774     {
2775         _rxVad = false;
2776         _veApmPtr->DeRegisterRxVadObserver(channel);
2777         SetDlgItemText(IDC_EDIT_RXVAD, _T(""));
2778     }
2779 }
2780 
OnBnClickedCheckAgc1()2781 void CWinTestDlg::OnBnClickedCheckAgc1()
2782 {
2783     SHORT shiftKeyIsPressed = ::GetAsyncKeyState(VK_SHIFT);
2784 
2785     CString str;
2786     int channel = GetDlgItemInt(IDC_EDIT_1);
2787     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_AGC_1);
2788     int check = button->GetCheck();
2789     const bool enable = (check == BST_CHECKED);
2790 
2791     if (shiftKeyIsPressed)
2792     {
2793         bool enabled(false);
2794         AgcModes mode(kAgcAdaptiveDigital);
2795         TEST(_veApmPtr->GetRxAgcStatus(channel, enabled, mode) == 0,
2796             _T("GetRxAgcStatus(channel=%d, enabled=?, mode=?)"), channel);
2797         button->SetCheck((check == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
2798 
2799         switch (mode)
2800         {
2801         case kAgcAdaptiveAnalog:
2802             str = _T("kAgcAdaptiveAnalog");
2803             break;
2804         case kAgcAdaptiveDigital:
2805             str = _T("kAgcAdaptiveDigital");
2806             break;
2807         case kAgcFixedDigital:
2808             str = _T("kAgcFixedDigital");
2809             break;
2810         default:
2811             break;
2812         }
2813         PRINT_GET_RESULT(_T("enabled=%d, mode=%s"), enabled, str);
2814         return;
2815     }
2816 
2817     if (enable)
2818     {
2819         CString str;
2820         AgcModes mode(kAgcDefault);
2821         if (_checkAGC1 % 3 == 0)
2822         {
2823             mode = kAgcDefault;
2824             str = _T("kAgcDefault");
2825         }
2826         else if (_checkAGC1 % 3 == 1)
2827         {
2828             mode = kAgcAdaptiveDigital;
2829             str = _T("kAgcAdaptiveDigital");
2830         }
2831         else if (_checkAGC1 % 3 == 2)
2832         {
2833             mode = kAgcFixedDigital;
2834             str = _T("kAgcFixedDigital");
2835         }
2836         TEST(_veApmPtr->SetRxAgcStatus(channel, true, mode) == 0, _T("SetRxAgcStatus(channel=%d, enable=%d, %s)"), channel, enable, str);
2837         _checkAGC1++;
2838     }
2839     else
2840     {
2841         TEST(_veApmPtr->SetRxAgcStatus(channel, false, kAgcUnchanged) == 0, _T("SetRxAgcStatus(channel=%d, enable=%d)"), channel, enable);
2842     }
2843 }
2844 
OnBnClickedCheckNs1()2845 void CWinTestDlg::OnBnClickedCheckNs1()
2846 {
2847     int channel = GetDlgItemInt(IDC_EDIT_1);
2848     CButton* buttonNS = (CButton*)GetDlgItem(IDC_CHECK_NS_1);
2849     int check = buttonNS->GetCheck();
2850     const bool enable = (check == BST_CHECKED);
2851     if (enable)
2852     {
2853         CString str;
2854         NsModes mode(kNsDefault);
2855         if (_checkNS1 % 6 == 0)
2856         {
2857             mode = kNsDefault;
2858             str = _T("kNsDefault");
2859         }
2860         else if (_checkNS1 % 6 == 1)
2861         {
2862             mode = kNsConference;
2863             str = _T("kNsConference");
2864         }
2865         else if (_checkNS1 % 6 == 2)
2866         {
2867             mode = kNsLowSuppression;
2868             str = _T("kNsLowSuppression");
2869         }
2870         else if (_checkNS1 % 6 == 3)
2871         {
2872             mode = kNsModerateSuppression;
2873             str = _T("kNsModerateSuppression");
2874         }
2875         else if (_checkNS1 % 6 == 4)
2876         {
2877             mode = kNsHighSuppression;
2878             str = _T("kNsHighSuppression");
2879         }
2880         else if (_checkNS1 % 6 == 5)
2881         {
2882             mode = kNsVeryHighSuppression;
2883             str = _T("kNsVeryHighSuppression");
2884         }
2885         TEST(_veApmPtr->SetRxNsStatus(channel, true, mode) == 0, _T("SetRxNsStatus(channel=%d, enable=%d, %s)"), channel, enable, str);
2886         _checkNS1++;
2887     }
2888     else
2889     {
2890         TEST(_veApmPtr->SetRxNsStatus(channel, false, kNsUnchanged) == 0, _T("SetRxNsStatus(channel=%d, enable=%d)"), enable, channel);
2891     }
2892 }
2893 
2894 // ----------------------------------------------------------------------------
2895 //                         Channel-independent Operations
2896 // ----------------------------------------------------------------------------
2897 
OnBnClickedCheckPlayFileIn()2898 void CWinTestDlg::OnBnClickedCheckPlayFileIn()
2899 {
2900     std::string micFile = _long_audio_file_path + "audio_short16.pcm";
2901     // std::string micFile = _long_audio_file_path + "audio_long16noise.pcm";
2902 
2903     int channel(-1);
2904     CButton* buttonExtTrans = (CButton*)GetDlgItem(IDC_CHECK_PLAY_FILE_IN);
2905     int check = buttonExtTrans->GetCheck();
2906     const bool enable = (check == BST_CHECKED);
2907     if (enable)
2908     {
2909         bool mix;
2910         const bool loop(true);
2911         const FileFormats format = kFileFormatPcm16kHzFile;
2912         const float scale(1.0);
2913 
2914         (_checkPlayFileIn %2 == 0) ? mix = true : mix = false;
2915         TEST(_veFilePtr->StartPlayingFileAsMicrophone(channel,
2916             micFile.c_str(), loop, mix, format, scale) == 0,
2917             _T("StartPlayingFileAsMicrophone(channel=%d, file=%s, ")
2918             _T("loop=%d, mix=%d, format=%d, scale=%2.1f)"),
2919             channel, CharToTchar(micFile.c_str(), -1),
2920             loop, mix, format, scale);
2921         _checkPlayFileIn++;
2922     }
2923     else
2924     {
2925         TEST(_veFilePtr->StopPlayingFileAsMicrophone(channel) == 0,
2926             _T("StopPlayingFileAsMicrophone(channel=%d)"), channel);
2927     }
2928 }
2929 
OnBnClickedCheckRecMic()2930 void CWinTestDlg::OnBnClickedCheckRecMic()
2931 {
2932     std::string micFile = webrtc::test::OutputPath() +
2933                           "rec_mic_mono_16kHz.pcm";
2934 
2935     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_REC_MIC);
2936     int check = button->GetCheck();
2937     const bool enable = (check == BST_CHECKED);
2938     if (enable)
2939     {
2940         TEST(_veFilePtr->StartRecordingMicrophone(micFile.c_str(), NULL) == 0,
2941             _T("StartRecordingMicrophone(file=%s)"),
2942             CharToTchar(micFile.c_str(), -1));
2943     }
2944     else
2945     {
2946         TEST(_veFilePtr->StopRecordingMicrophone() == 0,
2947             _T("StopRecordingMicrophone()"));
2948     }
2949 }
2950 
OnBnClickedCheckAgc()2951 void CWinTestDlg::OnBnClickedCheckAgc()
2952 {
2953     CButton* buttonAGC = (CButton*)GetDlgItem(IDC_CHECK_AGC);
2954     int check = buttonAGC->GetCheck();
2955     const bool enable = (check == BST_CHECKED);
2956     if (enable)
2957     {
2958         CString str;
2959         AgcModes mode(kAgcDefault);
2960         if (_checkAGC % 4 == 0)
2961         {
2962             mode = kAgcDefault;
2963             str = _T("kAgcDefault");
2964         }
2965         else if (_checkAGC % 4 == 1)
2966         {
2967             mode = kAgcAdaptiveAnalog;
2968             str = _T("kAgcAdaptiveAnalog");
2969         }
2970         else if (_checkAGC % 4 == 2)
2971         {
2972             mode = kAgcAdaptiveDigital;
2973             str = _T("kAgcAdaptiveDigital");
2974         }
2975         else if (_checkAGC % 4 == 3)
2976         {
2977             mode = kAgcFixedDigital;
2978             str = _T("kAgcFixedDigital");
2979         }
2980         TEST(_veApmPtr->SetAgcStatus(true, mode) == 0, _T("SetAgcStatus(enable=%d, %s)"), enable, str);
2981         _checkAGC++;
2982     }
2983     else
2984     {
2985         TEST(_veApmPtr->SetAgcStatus(false, kAgcUnchanged) == 0, _T("SetAgcStatus(enable=%d)"), enable);
2986     }
2987 }
2988 
OnBnClickedCheckNs()2989 void CWinTestDlg::OnBnClickedCheckNs()
2990 {
2991     CButton* buttonNS = (CButton*)GetDlgItem(IDC_CHECK_NS);
2992     int check = buttonNS->GetCheck();
2993     const bool enable = (check == BST_CHECKED);
2994     if (enable)
2995     {
2996         CString str;
2997         NsModes mode(kNsDefault);
2998         if (_checkNS % 6 == 0)
2999         {
3000             mode = kNsDefault;
3001             str = _T("kNsDefault");
3002         }
3003         else if (_checkNS % 6 == 1)
3004         {
3005             mode = kNsConference;
3006             str = _T("kNsConference");
3007         }
3008         else if (_checkNS % 6 == 2)
3009         {
3010             mode = kNsLowSuppression;
3011             str = _T("kNsLowSuppression");
3012         }
3013         else if (_checkNS % 6 == 3)
3014         {
3015             mode = kNsModerateSuppression;
3016             str = _T("kNsModerateSuppression");
3017         }
3018         else if (_checkNS % 6 == 4)
3019         {
3020             mode = kNsHighSuppression;
3021             str = _T("kNsHighSuppression");
3022         }
3023         else if (_checkNS % 6 == 5)
3024         {
3025             mode = kNsVeryHighSuppression;
3026             str = _T("kNsVeryHighSuppression");
3027         }
3028         TEST(_veApmPtr->SetNsStatus(true, mode) == 0, _T("SetNsStatus(enable=%d, %s)"), enable, str);
3029         _checkNS++;
3030     }
3031     else
3032     {
3033         TEST(_veApmPtr->SetNsStatus(false, kNsUnchanged) == 0, _T("SetNsStatus(enable=%d)"), enable);
3034     }
3035 }
3036 
OnBnClickedCheckEc()3037 void CWinTestDlg::OnBnClickedCheckEc()
3038 {
3039     CButton* buttonEC = (CButton*)GetDlgItem(IDC_CHECK_EC);
3040     int check = buttonEC->GetCheck();
3041     const bool enable = (check == BST_CHECKED);
3042     if (enable)
3043     {
3044         CString str;
3045         EcModes mode(kEcDefault);
3046         if (_checkEC % 4 == 0)
3047         {
3048             mode = kEcDefault;
3049             str = _T("kEcDefault");
3050         }
3051         else if (_checkEC % 4 == 1)
3052         {
3053             mode = kEcConference;
3054             str = _T("kEcConference");
3055         }
3056         else if (_checkEC % 4 == 2)
3057         {
3058             mode = kEcAec;
3059             str = _T("kEcAec");
3060         }
3061         else if (_checkEC % 4 == 3)
3062         {
3063             mode = kEcAecm;
3064             str = _T("kEcAecm");
3065         }
3066         TEST(_veApmPtr->SetEcStatus(true, mode) == 0, _T("SetEcStatus(enable=%d, %s)"), enable, str);
3067         _checkEC++;
3068     }
3069     else
3070     {
3071         TEST(_veApmPtr->SetEcStatus(false, kEcUnchanged) == 0, _T("SetEcStatus(enable=%d)"), enable);
3072     }
3073 }
3074 
OnBnClickedCheckMuteIn()3075 void CWinTestDlg::OnBnClickedCheckMuteIn()
3076 {
3077     CButton* buttonMute = (CButton*)GetDlgItem(IDC_CHECK_MUTE_IN);
3078     int check = buttonMute->GetCheck();
3079     const bool enable = (check == BST_CHECKED);
3080     const int channel(-1);
3081     TEST(_veVolumeControlPtr->SetInputMute(channel, enable) == 0,
3082         _T("SetInputMute(channel=%d, enable=%d)"), channel, enable);
3083 }
3084 
OnBnClickedCheckExtMediaIn()3085 void CWinTestDlg::OnBnClickedCheckExtMediaIn()
3086 {
3087     const int channel(-1);
3088     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_IN);
3089     int check = button->GetCheck();
3090     const bool enable = (check == BST_CHECKED);
3091     if (enable)
3092     {
3093         TEST(_veExternalMediaPtr->RegisterExternalMediaProcessing(channel, kRecordingAllChannelsMixed, *_externalMediaPtr) == 0,
3094             _T("RegisterExternalMediaProcessing(channel=%d, kRecordingAllChannelsMixed, processObject=0x%x)"), channel, _externalMediaPtr);
3095     }
3096     else
3097     {
3098         TEST(_veExternalMediaPtr->DeRegisterExternalMediaProcessing(channel, kRecordingAllChannelsMixed) == 0,
3099             _T("DeRegisterExternalMediaProcessing(channel=%d, kRecordingAllChannelsMixed)"), channel);
3100     }
3101 }
3102 
OnBnClickedCheckExtMediaOut()3103 void CWinTestDlg::OnBnClickedCheckExtMediaOut()
3104 {
3105     const int channel(-1);
3106     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_EXT_MEDIA_OUT);
3107     int check = button->GetCheck();
3108     const bool enable = (check == BST_CHECKED);
3109     if (enable)
3110     {
3111         TEST(_veExternalMediaPtr->RegisterExternalMediaProcessing(channel, kPlaybackAllChannelsMixed, *_externalMediaPtr) == 0,
3112             _T("RegisterExternalMediaProcessing(channel=%d, kPlaybackAllChannelsMixed, processObject=0x%x)"), channel, _externalMediaPtr);
3113     }
3114     else
3115     {
3116         TEST(_veExternalMediaPtr->DeRegisterExternalMediaProcessing(channel, kPlaybackAllChannelsMixed) == 0,
3117             _T("DeRegisterExternalMediaProcessing(channel=%d, kPlaybackAllChannelsMixed)"), channel);
3118     }
3119 }
3120 
OnCbnSelchangeComboRecDevice()3121 void CWinTestDlg::OnCbnSelchangeComboRecDevice()
3122 {
3123     CComboBox* comboCodec(NULL);
3124     comboCodec = (CComboBox*)GetDlgItem(IDC_COMBO_REC_DEVICE);
3125     int index = comboCodec->GetCurSel();
3126     TEST(_veHardwarePtr->SetRecordingDevice(index) == 0,
3127         _T("SetRecordingDevice(index=%d)"), index);
3128 }
3129 
OnCbnSelchangeComboPlayDevice()3130 void CWinTestDlg::OnCbnSelchangeComboPlayDevice()
3131 {
3132     CComboBox* comboCodec(NULL);
3133     comboCodec = (CComboBox*)GetDlgItem(IDC_COMBO_PLAY_DEVICE);
3134     int index = comboCodec->GetCurSel();
3135     TEST(_veHardwarePtr->SetPlayoutDevice(index) == 0,
3136         _T("SetPlayoutDevice(index=%d)"), index);
3137 }
3138 
OnNMReleasedcaptureSliderInputVolume(NMHDR * pNMHDR,LRESULT * pResult)3139 void CWinTestDlg::OnNMReleasedcaptureSliderInputVolume(NMHDR *pNMHDR, LRESULT *pResult)
3140 {
3141     CSliderCtrl* slider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_INPUT_VOLUME);
3142     slider->SetRangeMin(0);
3143     slider->SetRangeMax(255);
3144     int pos = slider->GetPos();
3145 
3146     TEST(_veVolumeControlPtr->SetMicVolume(pos) == 0, _T("SetMicVolume(volume=%d)"), pos);
3147 
3148     *pResult = 0;
3149 }
3150 
OnNMReleasedcaptureSliderOutputVolume(NMHDR * pNMHDR,LRESULT * pResult)3151 void CWinTestDlg::OnNMReleasedcaptureSliderOutputVolume(NMHDR *pNMHDR, LRESULT *pResult)
3152 {
3153     CSliderCtrl* slider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_OUTPUT_VOLUME);
3154     slider->SetRangeMin(0);
3155     slider->SetRangeMax(255);
3156     int pos = slider->GetPos();
3157 
3158     TEST(_veVolumeControlPtr->SetSpeakerVolume(pos) == 0, _T("SetSpeakerVolume(volume=%d)"), pos);
3159 
3160     *pResult = 0;
3161 }
3162 
OnNMReleasedcaptureSliderPanLeft(NMHDR * pNMHDR,LRESULT * pResult)3163 void CWinTestDlg::OnNMReleasedcaptureSliderPanLeft(NMHDR *pNMHDR, LRESULT *pResult)
3164 {
3165     CSliderCtrl* slider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_PAN_LEFT);
3166     slider->SetRange(0,10);
3167     int pos = 10 - slider->GetPos();    // 0 <=> lower end, 10 <=> upper end
3168 
3169     float left(0.0);
3170     float right(0.0);
3171     const int channel(-1);
3172 
3173     // Only left channel will be modified
3174     _veVolumeControlPtr->GetOutputVolumePan(channel, left, right);
3175 
3176     left = (float)((float)pos/10.0f);
3177 
3178     TEST(_veVolumeControlPtr->SetOutputVolumePan(channel, left, right) == 0,
3179         _T("SetOutputVolumePan(channel=%d, left=%2.1f, right=%2.1f)"), channel, left, right);
3180 
3181     *pResult = 0;
3182 }
3183 
OnNMReleasedcaptureSliderPanRight(NMHDR * pNMHDR,LRESULT * pResult)3184 void CWinTestDlg::OnNMReleasedcaptureSliderPanRight(NMHDR *pNMHDR, LRESULT *pResult)
3185 {
3186     CSliderCtrl* slider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_PAN_RIGHT);
3187     slider->SetRange(0,10);
3188     int pos = 10 - slider->GetPos();    // 0 <=> lower end, 10 <=> upper end
3189 
3190     float left(0.0);
3191     float right(0.0);
3192     const int channel(-1);
3193 
3194     // Only right channel will be modified
3195     _veVolumeControlPtr->GetOutputVolumePan(channel, left, right);
3196 
3197     right = (float)((float)pos/10.0f);
3198 
3199     TEST(_veVolumeControlPtr->SetOutputVolumePan(channel, left, right) == 0,
3200         _T("SetOutputVolumePan(channel=%d, left=%2.1f, right=%2.1f)"), channel, left, right);
3201 
3202     *pResult = 0;
3203 }
3204 
OnBnClickedButtonVersion()3205 void CWinTestDlg::OnBnClickedButtonVersion()
3206 {
3207     if (_veBasePtr)
3208     {
3209         char version[1024];
3210         if (_veBasePtr->GetVersion(version) == 0)
3211         {
3212             AfxMessageBox(CString(version), MB_OK);
3213         }
3214         else
3215         {
3216             AfxMessageBox(_T("FAILED!"), MB_OK);
3217         }
3218     }
3219 }
3220 
OnBnClickedCheckRecCall()3221 void CWinTestDlg::OnBnClickedCheckRecCall()
3222 {
3223     // Not supported
3224 }
3225 
OnBnClickedCheckTypingDetection()3226 void CWinTestDlg::OnBnClickedCheckTypingDetection()
3227 {
3228     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_TYPING_DETECTION);
3229     int check = button->GetCheck();
3230     const bool enable = (check == BST_CHECKED);
3231     TEST(_veApmPtr->SetTypingDetectionStatus(enable) == 0, _T("SetTypingDetectionStatus(enable=%d)"), enable);
3232 }
3233 
OnBnClickedCheckRED()3234 void CWinTestDlg::OnBnClickedCheckRED()
3235 {
3236     CButton* button = (CButton*)GetDlgItem(IDC_CHECK_RED);
3237     int channel = GetDlgItemInt(IDC_EDIT_1);
3238     int check = button->GetCheck();
3239     const bool enable = (check == BST_CHECKED);
3240     TEST(_veRtpRtcpPtr->SetREDStatus(channel, enable) == 0,
3241          _T("SetREDStatus(enable=%d)"), enable);
3242 }
3243 
3244 // ----------------------------------------------------------------------------
3245 //                                   Message Handlers
3246 // ----------------------------------------------------------------------------
3247 
OnTimer(UINT_PTR nIDEvent)3248 void CWinTestDlg::OnTimer(UINT_PTR nIDEvent)
3249 {
3250     CString str;
3251 
3252     unsigned int svol(0);
3253     unsigned int mvol(0);
3254 
3255     _timerTicks++;
3256 
3257     // Get speaker and microphone volumes
3258     _veVolumeControlPtr->GetSpeakerVolume(svol);
3259     _veVolumeControlPtr->GetMicVolume(mvol);
3260 
3261     // Update speaker volume slider
3262     CSliderCtrl* sliderSpkr = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_OUTPUT_VOLUME);
3263     sliderSpkr->SetRangeMin(0);
3264     sliderSpkr->SetRangeMax(255);
3265     sliderSpkr->SetPos(svol);
3266 
3267     // Update microphone volume slider
3268     CSliderCtrl* sliderMic = (CSliderCtrl*)GetDlgItem(IDC_SLIDER_INPUT_VOLUME);
3269     sliderMic->SetRangeMin(0);
3270     sliderMic->SetRangeMax(255);
3271     sliderMic->SetPos(mvol);
3272 
3273     unsigned int micLevel;
3274     unsigned int combinedOutputLevel;
3275 
3276     // Get audio levels
3277     _veVolumeControlPtr->GetSpeechInputLevel(micLevel);
3278     _veVolumeControlPtr->GetSpeechOutputLevel(-1, combinedOutputLevel);
3279 
3280     // Update audio level controls
3281     CProgressCtrl* progressMic = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS_AUDIO_LEVEL_IN);
3282     progressMic->SetRange(0,9);
3283     progressMic->SetStep(1);
3284     progressMic->SetPos(micLevel);
3285     CProgressCtrl* progressOut = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS_AUDIO_LEVEL_OUT);
3286     progressOut->SetRange(0,9);
3287     progressOut->SetStep(1);
3288     progressOut->SetPos(combinedOutputLevel);
3289 
3290     // Update playout delay (buffer size)
3291     if (_veVideoSyncPtr)
3292     {
3293         int bufferMs(0);
3294         _veVideoSyncPtr->GetPlayoutBufferSize(bufferMs);
3295         SetDlgItemInt(IDC_EDIT_PLAYOUT_BUFFER_SIZE, bufferMs);
3296     }
3297 
3298     if (_delayEstimate1 && _veVideoSyncPtr)
3299     {
3300         const int channel = GetDlgItemInt(IDC_EDIT_1);
3301         int delayMs(0);
3302         _veVideoSyncPtr->GetDelayEstimate(channel, delayMs);
3303         SetDlgItemInt(IDC_EDIT_DELAY_ESTIMATE_1, delayMs);
3304     }
3305 
3306     if (_rxVad && _veApmPtr && _rxVadObserverPtr)
3307     {
3308         SetDlgItemInt(IDC_EDIT_RXVAD, _rxVadObserverPtr->vad_decision);
3309     }
3310 
3311     if (_veHardwarePtr)
3312     {
3313         int load1, load2;
3314         _veHardwarePtr->GetSystemCPULoad(load1);
3315         _veHardwarePtr->GetCPULoad(load2);
3316         str.Format(_T("CPU load (system/VoE): %d/%d [%%]"), load1, load2);
3317         SetDlgItemText(IDC_EDIT_CPU_LOAD, (LPCTSTR)str);
3318     }
3319 
3320     BOOL ret;
3321     int channel = GetDlgItemInt(IDC_EDIT_1, &ret);
3322 
3323     if (_veCodecPtr)
3324     {
3325         if (ret == TRUE)
3326         {
3327             CodecInst codec;
3328             if (_veCodecPtr->GetRecCodec(channel, codec) == 0)
3329             {
3330         str.Format(_T("RX codec: %s, freq=%d, pt=%d, rate=%d, size=%d"), CharToTchar(codec.plname, 32), codec.plfreq, codec.pltype, codec.rate, codec.pacsize);
3331                 SetDlgItemText(IDC_EDIT_RX_CODEC_1, (LPCTSTR)str);
3332             }
3333         }
3334     }
3335 
3336     if (_veRtpRtcpPtr)
3337     {
3338         if (ret == TRUE)
3339         {
3340             CallStatistics stats;
3341             if (_veRtpRtcpPtr->GetRTCPStatistics(channel, stats) == 0)
3342             {
3343                 str.Format(_T("RTCP | RTP: cum=%u, ext=%d, frac=%u, jitter=%u | TX=%d, RX=%d, RTT=%d"),
3344                     stats.cumulativeLost, stats.extendedMax, stats.fractionLost, stats.jitterSamples, stats.packetsSent, stats.packetsReceived, stats.rttMs);
3345                 SetDlgItemText(IDC_EDIT_RTCP_STAT_1, (LPCTSTR)str);
3346             }
3347         }
3348     }
3349 
3350     SetTimer(0, 1000, NULL);
3351     CDialog::OnTimer(nIDEvent);
3352 }
3353 
OnBnClickedButtonClearErrorCallback()3354 void CWinTestDlg::OnBnClickedButtonClearErrorCallback()
3355 {
3356     _nErrorCallbacks = 0;
3357     SetDlgItemText(IDC_EDIT_ERROR_CALLBACK, _T(""));
3358 }
3359 
3360 // ----------------------------------------------------------------------------
3361 //                                       TEST
3362 // ----------------------------------------------------------------------------
3363 
OnBnClickedButtonTest1()3364 void CWinTestDlg::OnBnClickedButtonTest1()
3365 {
3366     // add tests here...
3367 }
3368