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