CALLINFO.CPP
上传用户:chinamans
上传日期:2013-03-17
资源大小:202k
文件大小:18k
源码类别:

TAPI编程

开发平台:

Visual C++

  1. // callinfo.cpp : implementation file for callinfo class
  2. // (c) Dialogic corp 1995, 1996
  3. #include "stdafx.h"
  4. #include <tapi.h>
  5. #include "tapiapp.h"
  6. #include "tapiline.h"
  7. #include "tapicall.h"
  8. #include "talker32.h"
  9. #include "talkdlg.h"
  10. #include "callinfo.h"
  11. #include "lineinfo.h"
  12. #include "helpid.h"
  13. #include "tonedlg.h"
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char BASED_CODE THIS_FILE[] = __FILE__;
  17. #endif
  18. #define CALLINFO_TIMER_ID 1
  19. #define WAVE_TIMER_ID 2
  20. UINT uiMsg;
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CCallInfo property page
  23. IMPLEMENT_DYNCREATE(CCallInfo, CPropertyPage)
  24. CCallInfo::CCallInfo() : CPropertyPage(CCallInfo::IDD)
  25. {
  26. //{{AFX_DATA_INIT(CCallInfo)
  27. m_csCallInfo = _T("");
  28. m_csCallState = _T("");
  29. m_csCallAction = _T("");
  30. m_csGathered = _T("");
  31. m_csLastDigit = _T("");
  32. m_csGatherRes = _T("");
  33. //}}AFX_DATA_INIT
  34. m_pWaveName = NULL;
  35. m_nRecTime = 0;
  36. m_uiMsg = RegisterWindowMessage("TALKER32 callinfo alert");
  37. uiMsg = m_uiMsg;
  38. SetHelpID(HIDD_TALKER32_DialogCallInfo);
  39. }
  40. CCallInfo::~CCallInfo()
  41. {
  42. }
  43. void CCallInfo::DoDataExchange(CDataExchange* pDX)
  44. {
  45. CPropertyPage::DoDataExchange(pDX);
  46. //{{AFX_DATA_MAP(CCallInfo)
  47. DDX_Control(pDX, IDC_CALLALERT, m_btnCallAlert);
  48. DDX_Control(pDX, IDC_VOLUME, m_ctlVolume);
  49. DDX_Control(pDX, IDC_STOP, m_btnStop);
  50. DDX_Control(pDX, IDC_PAUSE, m_btnPause);
  51. DDX_Control(pDX, IDC_GATHER, m_btnGather);
  52. DDX_Control(pDX, IDC_MONITOR, m_btnMonitor);
  53. DDX_Control(pDX, IDC_RECORD, m_btnRecord);
  54. DDX_Control(pDX, IDC_PLAY, m_btnPlay);
  55. DDX_Text(pDX, IDC_CALLINFO, m_csCallInfo);
  56. DDX_Text(pDX, IDC_STATE, m_csCallState);
  57. DDX_Text(pDX, IDC_ACTIVITY, m_csCallAction);
  58. DDX_Text(pDX, IDC_GATHERED, m_csGathered);
  59. DDX_Text(pDX, IDC_LASTDIGIT, m_csLastDigit);
  60. DDX_Text(pDX, IDC_GATHERRES, m_csGatherRes);
  61. //}}AFX_DATA_MAP
  62. }
  63. BEGIN_MESSAGE_MAP(CCallInfo, CPropertyPage)
  64. //{{AFX_MSG_MAP(CCallInfo)
  65. ON_BN_CLICKED(IDC_PLAY, OnPlay)
  66. ON_BN_CLICKED(IDC_RECORD, OnRecord)
  67. ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
  68. ON_WM_CLOSE()
  69. ON_WM_TIMER()
  70. ON_BN_CLICKED(IDC_INFOBTN, OnInfobtn)
  71. ON_BN_CLICKED(IDC_MONITOR, OnMonitor)
  72. ON_WM_DESTROY()
  73. ON_BN_CLICKED(IDC_CALLALERT, OnCallalert)
  74. ON_BN_CLICKED(IDC_GATHER, OnGather)
  75. ON_BN_CLICKED(IDC_PAUSE, OnPause)
  76. ON_BN_CLICKED(IDC_STOP, OnStop)
  77. ON_WM_HSCROLL()
  78. ON_REGISTERED_MESSAGE(uiMsg, OnDynamicAlert)
  79. ON_BN_CLICKED(IDC_GENTONE, OnGentone)
  80. ON_WM_SETFOCUS()
  81. //}}AFX_MSG_MAP
  82. END_MESSAGE_MAP()
  83. void CCallInfo::DisplayCallInfo(BOOL bUpdateCallInfo)
  84. {
  85. if(m_pCall == NULL) return;
  86. if(NULL == m_pLine->ctlGetActiveCall())  // call no longer active
  87. {
  88. if(m_pCall) {
  89. m_pCall->m_hStatusWnd = NULL;
  90. m_pCall->m_hCallAlertWnd = NULL;
  91. m_pCall->m_uiAlertMsg = NULL;
  92.    }
  93. m_pCall = NULL;
  94. ::PostMessage(::GetParent(m_hWnd), WM_CLOSE, 0, NULL);
  95. KillTimer(CALLINFO_TIMER_ID);
  96. return;
  97. }
  98. // display status
  99. WORD wState = m_pCall->GetCallState();
  100. WORD wDir = m_pCall->GetCallDirection();
  101. CString csTemp;
  102. m_csCallState = "State =";
  103. switch(wState)
  104. {
  105. case IDLE:
  106. csTemp = "idle";
  107. break;
  108. case MAKING:
  109. csTemp = "making";
  110. break;
  111. case STOP_MAKING:
  112. csTemp = "stop making";
  113. break;
  114. case PROGRESS:
  115. csTemp = "progress";
  116. break;
  117. case DIALING:
  118. csTemp = "dialing";
  119. break;
  120.   case OFFERING:
  121. csTemp = "offering";
  122. break;
  123.   case ANSWERING:
  124. csTemp = "answering";
  125. break;
  126.   case CONNECTED:
  127. csTemp = "connected";
  128. break;
  129. case HOLD:
  130. csTemp = "hold";
  131. break;
  132.   case DROPPING:
  133. csTemp = "dropping";
  134. break;
  135.   case DISCONNECTED: 
  136. csTemp = "disconnected";
  137. break;
  138. default:
  139. csTemp = "undefined";
  140. break;
  141. }
  142. m_csCallState += csTemp;
  143. DWORD dwWaveStatus = m_pCall->GetWaveStatus();
  144. DWORD dwPRStatus;
  145. switch(dwWaveStatus)
  146. {
  147. case WAVE_IDLE:
  148. csTemp = "Idle";
  149. m_btnPause.SetWindowText("Pause");
  150. m_btnStop.EnableWindow(FALSE);
  151. KillTimer(WAVE_TIMER_ID);
  152. m_nRecTime = 0;
  153. break;
  154. case PREPARING_TO_PLAY:
  155. case PLAYING:
  156. case FINISHING_PLAY:
  157. csTemp = "Playing";
  158. m_btnPause.SetWindowText("Pause");
  159. m_btnStop.EnableWindow();
  160. break;
  161. case PAUSED:
  162. csTemp = "Paused";
  163. m_btnPause.SetWindowText("Resume");
  164. break;
  165. case PREPARING_TO_RECORD:
  166. case RECORDING:  
  167. case FINISHING_RECORD:
  168. csTemp.Format("Recording, %d seconds left", m_nRecTime);
  169. m_btnStop.EnableWindow();
  170. break;
  171. case WAVE_DISFUNCTIONAL:
  172. csTemp = "Wave disabled";
  173. m_btnStop.EnableWindow(FALSE);
  174. // m_nRecTime = 0;
  175. // check the dev specific play/record status
  176. dwPRStatus = m_pCall->GetRecPlayStatus();
  177. switch(dwPRStatus) // all possible cases for dev specific play/record
  178. {
  179. case WAVE_IDLE:
  180. KillTimer(WAVE_TIMER_ID);
  181. m_nRecTime = 0;
  182. break;
  183. case PREPARING_TO_RECORD:
  184. case RECORDING:
  185. csTemp.Format("Recording, %d seconds left", m_nRecTime);
  186. m_btnStop.EnableWindow();
  187. break;
  188. case PREPARING_TO_PLAY:
  189. case PLAYING:
  190. case FINISHING_PLAY:
  191. csTemp = "Playing";
  192. m_btnStop.EnableWindow();
  193. break;
  194. case FAILED_START:
  195. csTemp = "Wave disabled";
  196. m_pLine->ctlUpdateDevSpecStatus(DEVSPEC_IDLE);
  197. MessageBox("WAVE function failed to start", NULL, MB_ICONSTOP);
  198. m_btnStop.EnableWindow(FALSE);
  199. break;
  200. case WAVE_FAILED:
  201. csTemp = "Wave disabled";
  202. m_pLine->ctlUpdateDevSpecStatus(DEVSPEC_IDLE);
  203. MessageBox("WAVE function failed to complete", NULL, MB_ICONSTOP);
  204. m_btnStop.EnableWindow(FALSE);
  205. break;
  206. }
  207. break;
  208. default:
  209. csTemp = "Not available";
  210. m_btnStop.EnableWindow(FALSE);
  211. m_nRecTime = 0;
  212. break;
  213. }  //end-switch
  214. m_csCallAction = "Action:";
  215. m_csCallAction += csTemp;
  216. if(wState != CONNECTED)
  217. m_btnStop.EnableWindow(FALSE);
  218. // Determine if WAVE play/record are available thru TAPI extensions
  219. // Make it available if: local system, wave driver not installed OR remote system
  220. if(dwWaveStatus == WAVE_DISFUNCTIONAL && m_bRunningOnNT)
  221. {
  222. m_btnPlay.SetWindowText("PlayX");
  223. m_btnRecord.SetWindowText("RecordX");
  224. m_btnPlay.EnableWindow(wState == CONNECTED);
  225. m_btnRecord.EnableWindow(wState == CONNECTED);
  226. }
  227. else
  228. {
  229. m_btnPlay.EnableWindow(wState == CONNECTED && dwWaveStatus == WAVE_IDLE);
  230. m_btnRecord.EnableWindow(wState == CONNECTED && dwWaveStatus == WAVE_IDLE);
  231. }
  232. m_btnPause.EnableWindow(dwWaveStatus==PREPARING_TO_PLAY || dwWaveStatus==PLAYING || // dwWaveStatus==WAVE_IDLE ||
  233. dwWaveStatus== PAUSED); //PREPARING_TO_RECORD || dwWaveStatus==RECORDING);
  234. UpdateData(FALSE);
  235. if(!bUpdateCallInfo) return;
  236. //UpdateDigitsMonitorStatus(); // do not read gathered
  237. m_csCallInfo.Empty();
  238. LPLINECALLSTATUS lpLCI = ((CTalkApp *)AfxGetApp())->GetCallStatus(m_pCall->m_hCall);
  239. if(lpLCI == NULL) return; // failed for some reason
  240. char szState[48];
  241. if(!((CTalkApp *)AfxGetApp())->Code2CallState(lpLCI->dwCallState, szState, 46))
  242. csTemp.Format("state = %lxrnstatemode = %lxrnprivilege = %lxrnfeatures = %lxrn",
  243. lpLCI->dwCallState, lpLCI->dwCallStateMode, lpLCI->dwCallPrivilege,lpLCI->dwCallFeatures);
  244. else
  245. csTemp.Format("state = %srnstatemode = %lxrnprivilege = %lxrnfeatures = %lxrn",
  246. szState, lpLCI->dwCallStateMode, lpLCI->dwCallPrivilege,lpLCI->dwCallFeatures);
  247. m_csCallInfo += csTemp;
  248. m_btnMonitor.EnableWindow(lpLCI->dwCallState == LINECALLSTATE_CONNECTED || lpLCI->dwCallState == LINECALLSTATE_DIALTONE);
  249. m_btnGather.EnableWindow(lpLCI->dwCallState == LINECALLSTATE_CONNECTED);
  250. UpdateData(FALSE);
  251. delete (PBYTE) lpLCI; 
  252. }
  253. void CCallInfo::UpdateDigitsMonitorStatus(BOOL bReadGathered, UINT wParam, LONG lParam)
  254. {
  255. MONITORSTATE msMonState ={0, 0, 0L, 0L, 0};
  256. BOOL bUpdateMon = FALSE;
  257. // Check/update monitor & gather state here
  258. if(lParam) // this is always != 0 for the parametrized alert
  259. {
  260. if(wParam) // Monitor result
  261. {
  262. msMonState.wState |= MONITOR_DIGITS;
  263. msMonState.wLastDigit = (WORD) wParam;
  264. bUpdateMon = TRUE;
  265. }    
  266. else  // gather result
  267. {
  268. msMonState.dwGatherResult = lParam;
  269. msMonState.wState &= ~START_GATHER;
  270. }
  271. }
  272. else if(!wParam)  // non-parametrized alert
  273. {
  274. m_pCall->GetMonitorState(&msMonState);
  275. bUpdateMon = TRUE;
  276. }
  277. if(bUpdateMon)
  278. {
  279. if(msMonState.wState & MONITOR_DIGITS)
  280. {
  281. m_btnMonitor.SetWindowText("Stop Monitor");
  282. m_csLastDigit.Format("%c", LOBYTE(msMonState.wLastDigit));
  283. }
  284. else 
  285. m_btnMonitor.SetWindowText("Monitor Digits");
  286. }
  287. if(msMonState.wState & START_GATHER)   // gathering in progress
  288. m_btnGather.SetWindowText("Stop Gather");
  289. else if(bReadGathered && msMonState.dwGatherResult) // read result if available
  290. {
  291. if(msMonState.dwGatherResult != LINEGATHERTERM_CANCEL)
  292. {
  293. m_pCall->m_szDigits[20] = 0;
  294. m_csGathered = m_pCall->m_szDigits;
  295. int i;
  296. for(i=0; i<lstrlen(m_pCall->m_szDigits); i++)
  297. {
  298. if(m_pCall->m_szDigits[i] != '*' && m_pCall->m_szDigits[i] != '#'
  299.  && !isdigit(m_pCall->m_szDigits[i]))
  300.  {
  301.   m_csGathered.Empty();
  302. break;
  303.  }
  304. }
  305. }
  306. m_csGatherRes.Format("%d",msMonState.dwGatherResult);
  307. m_pCall->UpdateMonitorState(RESET_GATHER_RESULT, 0L, 0L); 
  308. m_btnGather.SetWindowText("Gather Digits");
  309. }
  310. UpdateData(FALSE); //from data to controls
  311. }
  312. /////////////////////////////////////////////////////////////////////////////
  313. // CCallInfo message handlers
  314. BOOL CCallInfo::OnInitDialog() 
  315. {
  316. CPropertyPage::OnInitDialog();
  317. SetHelpID(HIDD_TALKER32_DialogCallInfo);
  318. if(!m_csCaption.IsEmpty()) SetWindowText(m_csCaption);
  319. m_ctlVolume.SetRange(0, MAX_REL_VOLUME);
  320. if(m_pCall)
  321. m_ctlVolume.SetPos((int) ((MAX_REL_VOLUME * (int) (m_pCall->GetWaveVolume()))/MAX_ABS_VOLUME));
  322. else
  323. m_ctlVolume.SetPos(MAX_REL_VOLUME);
  324. SetTimer(CALLINFO_TIMER_ID, 2000, NULL);
  325. DisplayCallInfo(TRUE);
  326. UpdateDigitsMonitorStatus(TRUE, 0, 0); // get monitoring & gathering result from the status structure
  327. if(m_pCall) 
  328. {
  329. m_pCall->m_hStatusWnd = m_hWnd; // register self to the pCall
  330. m_pCall->m_hCallAlertWnd = m_btnCallAlert.GetSafeHwnd(); // register self to the pCall
  331. m_pCall->m_dwCallAlert = IDC_CALLALERT;
  332. m_pCall->m_uiAlertMsg = m_uiMsg;
  333. }
  334.   return TRUE;  // return TRUE unless you set the focus to a control
  335.               // EXCEPTION: OCX Property Pages should return FALSE
  336. }
  337. void CCallInfo::OnPlay() 
  338. {
  339. long lrc;
  340. if(m_pWaveName == NULL || m_pWaveName->IsEmpty()) 
  341. {
  342. AfxMessageBox("No file to play");
  343. return;
  344. }
  345. if(m_pCall) 
  346. {
  347. SetTimer(WAVE_TIMER_ID, 500, NULL);
  348. if(WAVE_DISFUNCTIONAL ==  m_pCall->GetWaveStatus())  // use devspecific
  349. {
  350. lrc = m_pCall->PlayEx(m_pWaveName->GetBuffer(128));
  351. if(lrc < 0) 
  352. AfxMessageBox("Failed to start playing");
  353. }
  354. else
  355. m_pCall->Play(m_pWaveName->GetBuffer(128));
  356. }
  357. DisplayCallInfo();
  358. }
  359. void CCallInfo::OnRecord() 
  360. {
  361. if(m_pCall)
  362. {
  363. if(*m_pnWaveFormatID == 0 )
  364. m_nRecTime = *m_pdwRecFileSize/3000;
  365. else if(*m_pnWaveFormatID == 1 )
  366. m_nRecTime = *m_pdwRecFileSize/4000;
  367. else if(*m_pnWaveFormatID == 2  || *m_pnWaveFormatID == 5 || *m_pnWaveFormatID == 8)
  368. m_nRecTime = *m_pdwRecFileSize/6000;
  369. else if(*m_pnWaveFormatID == 3 || *m_pnWaveFormatID == 6 || *m_pnWaveFormatID == 9)
  370. m_nRecTime = *m_pdwRecFileSize/8000;
  371. else
  372. m_nRecTime = *m_pdwRecFileSize/11000;
  373. SetTimer(WAVE_TIMER_ID, 1000, NULL);
  374. if(WAVE_DISFUNCTIONAL ==  m_pCall->GetWaveStatus())  // use devspecific
  375. {
  376. if(m_pWaveRecName->IsEmpty()) 
  377. m_pWaveRecName->Format("%s","C:\WINNT35\SYSTEM32\TESTREC.WAV");
  378. TRACE("Recording into %sn", m_pWaveRecName->GetBuffer(120));
  379. m_pCall->RecordEx(m_pWaveRecName->GetBuffer(120), m_nRecTime, *m_pnWaveFormatID);
  380. }
  381. else
  382. m_pCall->Record(*m_pnWaveFormatID, *m_pdwRecFileSize);
  383. }
  384. DisplayCallInfo();
  385. }
  386. void CCallInfo::OnRefresh() 
  387. {
  388. DisplayCallInfo(TRUE); // update=FALSE by default
  389. }
  390. void CCallInfo::OnClose() 
  391. {
  392. KillTimer(CALLINFO_TIMER_ID);
  393. CPropertyPage::OnClose();
  394. }
  395. void CCallInfo::OnTimer(UINT nIDEvent) 
  396. {
  397. //if(nIDEvent == CALLINFO_TIMER_ID && !m_nRecTime) DisplayCallInfo(TRUE);
  398. if(nIDEvent == WAVE_TIMER_ID) 
  399. {
  400. if(m_nRecTime >1) m_nRecTime -=1; 
  401. else m_nRecTime = 0;
  402. DisplayCallInfo();
  403. }
  404. CPropertyPage::OnTimer(nIDEvent);
  405. }
  406. // Get call info
  407. void CCallInfo::OnInfobtn() 
  408. {
  409. CString csTemp;
  410. m_csCallInfo.Empty();
  411. LPLINECALLINFO lpLCI = ((CTalkApp *)AfxGetApp())->GetCallInfo(m_pCall->m_hCall);
  412. if(lpLCI == NULL) return; // failed for some reason
  413. csTemp.Format("hLine = %lxrndwLineDeviceID = %drndwBearerMode = %lxrn",
  414. lpLCI->hLine, lpLCI->dwLineDeviceID, lpLCI->dwBearerMode);
  415. m_csCallInfo += csTemp;
  416. csTemp.Format("dwMediaMode = %lxrndwCallStates = %lxrndwMonitorDigitModes = %lxrnCallerID flags = %lxrnCalledID flags = %lxrn",
  417. lpLCI->dwMediaMode, lpLCI->dwCallStates, lpLCI->dwMonitorDigitModes,lpLCI->dwCallerIDFlags,lpLCI->dwCalledIDFlags);
  418. m_csCallInfo += csTemp;
  419.     if (lpLCI->dwCallerIDFlags & LINECALLPARTYID_NAME && lpLCI->dwCallerIDNameSize)
  420.     {
  421.          csTemp.Format("Caller name=%srn",(LPSTR)(((LPSTR)(lpLCI))+lpLCI->dwCallerIDNameOffset));
  422. m_csCallInfo += csTemp;
  423.     } 
  424.     if (lpLCI->dwCallerIDFlags & LINECALLPARTYID_ADDRESS && lpLCI->dwCallerIDSize)
  425.     {
  426.          csTemp.Format("Caller number=%srn", (LPSTR)(((LPSTR)(lpLCI))+lpLCI->dwCallerIDOffset));      
  427. m_csCallInfo += csTemp;
  428.     } 
  429. UpdateData(FALSE);
  430. delete (PBYTE) lpLCI; 
  431. }
  432. void CCallInfo::OnMonitor() 
  433. {
  434. LONG lrc;
  435. CString csTemp;
  436. HCALL hCall;
  437. if(m_pCall) hCall = m_pCall->m_hCall; // protect this 
  438. m_btnMonitor.GetWindowText(csTemp);
  439. if(!csTemp.CompareNoCase("Monitor Digits")) // currently not monitoring
  440. {
  441. lrc = m_pCall->MonitorDigits(LINEDIGITMODE_DTMF);
  442. if(!lrc) m_btnMonitor.SetWindowText("Stop Monitor");
  443. }
  444. else
  445. {
  446. lrc = m_pCall->MonitorDigits(0);
  447. m_btnMonitor.SetWindowText("Monitor Digits");
  448. }
  449. }
  450. void CCallInfo::OnDestroy() 
  451. {
  452. CPropertyPage::OnDestroy();
  453. if(m_pCall) 
  454. {
  455. m_pCall->m_hStatusWnd = NULL;
  456. m_pCall->m_hCallAlertWnd = NULL;
  457. m_pCall->m_dwCallAlert = NULL;
  458. m_pCall->m_uiAlertMsg = m_uiMsg;
  459. }
  460. }
  461. // Alert message w/o parameters 
  462. void CCallInfo::OnCallalert() 
  463. {
  464. UpdateDigitsMonitorStatus(TRUE); // get monitoring & gathering result
  465. }
  466. // Alert message w/parameters 
  467. LONG CCallInfo::OnDynamicAlert(UINT wParam, LONG lParam)
  468. {
  469. if(!wParam)  // gather result
  470. UpdateDigitsMonitorStatus(TRUE, 0, lParam); // get gathering result
  471. else 
  472. UpdateDigitsMonitorStatus(FALSE, wParam, lParam); // get monitoring result
  473. return 0;
  474. }
  475. void CCallInfo::OnGather() 
  476. {
  477. CString csTemp;
  478. LONG lrc;
  479. char szErr[48];
  480. if(m_pCall == NULL) return;
  481. m_btnGather.GetWindowText(csTemp);
  482. if(!csTemp.CompareNoCase("Gather Digits")) // currently not gathering
  483. {
  484. m_csGathered.Empty();
  485. m_csGatherRes.Empty();
  486. UpdateData(FALSE);
  487. lrc = m_pCall->GatherDigits(20, "*#", 10000, 5000, NULL);
  488. if(lrc)
  489. {
  490. if(!((CTalkApp *)AfxGetApp())->Code2Error(lrc, szErr, 46))
  491. csTemp.Format("lineGatherDigits failed reason=%lx", lrc);
  492. else
  493. csTemp.Format("lineGatherDigits failed reason=%s", szErr);
  494. AfxMessageBox(csTemp);
  495. }
  496. else m_btnGather.SetWindowText("Stop Gather");
  497. }
  498. else    // user said stop 
  499. {
  500. lrc = m_pCall->GatherDigits(0, "", 0, 0, NULL);
  501. if(lrc)
  502. {
  503. if(!((CTalkApp *)AfxGetApp())->Code2Error(lrc, szErr, 46))
  504. csTemp.Format("attempt to cancel lineGatherDigits failed reason=%lx", lrc);
  505. else
  506. csTemp.Format("attempt to cancel lineGatherDigits failed reason=%s", szErr);
  507. AfxMessageBox(csTemp);
  508. }
  509. // else m_btnGather.SetWindowText("Gather Digits"); // consider it done...
  510. }
  511. }
  512. void CCallInfo::OnPause() 
  513. {
  514. if(!m_pCall) return;
  515. DWORD dwWaveStatus = m_pCall->GetWaveStatus();
  516. if(dwWaveStatus == PLAYING) 
  517. m_pCall->Pause();
  518. else if(dwWaveStatus == PAUSED)
  519. m_pCall->Resume();
  520. DisplayCallInfo();
  521. }
  522. void CCallInfo::OnStop() 
  523. {
  524. m_pCall->StopWave();
  525. DisplayCallInfo();
  526. }
  527. void CCallInfo::OnSetFocus(CWnd* pOldWnd) 
  528. {
  529. CPropertyPage::OnSetFocus(pOldWnd);
  530. ((CTalkApp *)AfxGetApp())->SetHelpId(HIDD_TALKER32_DialogCallInfo);
  531. }
  532. void CCallInfo::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  533. {
  534. int nP;
  535. if(nSBCode == SB_THUMBPOSITION || nSBCode == SB_THUMBTRACK) nP = nPos;
  536. else nP = m_ctlVolume.GetPos();
  537. if(m_pCall) m_pCall->SetWaveVolume((DWORD) ((MAX_ABS_VOLUME/MAX_REL_VOLUME) * nP)); 
  538. CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
  539. }
  540. void CCallInfo::OnGentone() 
  541. {
  542. // display tone selection dialog
  543. CToneDlg dlg(this);
  544. //LPLINEGENERATETONE lplgT = NULL;
  545. dlg.m_bRunningOnNT = m_bRunningOnNT;
  546. if(IDCANCEL == dlg.DoModal()) return;
  547. if(dlg.m_bBeep) 
  548. lineGenerateTone(m_pCall->m_hCall, LINETONEMODE_BEEP, dlg.m_dwDur, 0, 0);
  549. else
  550. {
  551. LINEGENERATETONE lgt[2];
  552. DWORD dwNum = 1;
  553. LONG lrc;
  554. // lplgT = (LPLINEGENERATETONE)new char[200*sizeof(LINEGENERATETONE)];
  555. // if(!lplgT) return;
  556. lgt[0].dwFrequency = dlg.m_dwF1;
  557. lgt[0].dwVolume = dlg.m_dwA1;
  558. lgt[0].dwCadenceOn = dlg.m_dwDur/2;
  559. lgt[0].dwCadenceOff = dlg.m_dwDur/2;
  560. if(dlg.m_dwF2)
  561. {
  562. lgt[1].dwFrequency = dlg.m_dwF2;
  563. lgt[1].dwVolume = dlg.m_dwA2;
  564. lgt[1].dwCadenceOn = dlg.m_dwDur/2;
  565. lgt[1].dwCadenceOff = dlg.m_dwDur/2;
  566. dwNum++;
  567. }
  568. if(lrc = lineGenerateTone(m_pCall->m_hCall, LINETONEMODE_CUSTOM, 
  569. dlg.m_dwDur, dwNum, lgt))
  570. {
  571. CString csTemp;
  572. csTemp.Format("lineGenerateTone failed rc=%lx", lrc);
  573. AfxMessageBox(csTemp);
  574. }
  575. // if(lplgT) delete lplgT;
  576. }
  577. }
  578. /* 
  579.  #define SB_LINEUP           0
  580. #define SB_LINELEFT         0
  581. #define SB_LINEDOWN         1
  582. #define SB_LINERIGHT        1
  583. #define SB_PAGEUP           2
  584. #define SB_PAGELEFT         2
  585. #define SB_PAGEDOWN         3
  586. #define SB_PAGERIGHT        3
  587. #define SB_THUMBPOSITION    4
  588. #define SB_THUMBTRACK       5
  589. #define SB_TOP              6
  590. #define SB_LEFT             6
  591. #define SB_BOTTOM           7
  592. #define SB_RIGHT            7
  593. #define SB_ENDSCROLL        8
  594. */