⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainframe.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
									CHECK_RETURN SsmClearFileList(ch);
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\m.wav", -1, 0, -1);
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\a.wav", -1, 0, -1);
									CHECK_RETURN SsmPlayFileList(ch);
								}
							}
							else // ENG: Failed to create a conference.
								 // CHS: 创建会议失败。
							{
								CHECK_RETURN SsmClearFileList(ch);
								CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\m.wav", -1, 0, -1);
								CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\a.wav", -1, 0, -1);
								CHECK_RETURN SsmPlayFileList(ch);
							}

						}
						// ENG: To join
						// CHS: 加入
						else if (SsmValidateGrpId(atoi(channels[ch].dtmf_str.c_str())))
						{
							// ENG: Store the conf_id, it will be used later on.
							// CHS: 保存 conf_id,以后有用。
							channels[ch].creater = false;
							channels[ch].conf_to_join = atoi(channels[ch].dtmf_str.c_str());
							channels[ch].dtmf_str.erase(channels[ch].dtmf_str.begin(), channels[ch].dtmf_str.end());
							CHECK_RETURN SsmPlayFile(ch, ".\\wav\\c.wav", -1, 0, -1);
							channels[ch].state_conference = CO_HOW_TO_JOIN;
						}
						// ENG: To what? no specific conference.
						// CHS: 不操作,没指定的会议。
						else 
						{
							// ENG: Play "the id doesn't exist ...".
							// CHS: 播放“该会议编号不存在……”。
							CHECK_RETURN SsmClearFileList(ch);
							CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\b.wav", -1, 0, -1);
							// ENG: Play "which to join or create...".
							// CHS: 播放“加入哪个/创建……”
							CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\a.wav", -1, 0, -1);
							CHECK_RETURN SsmPlayFileList(ch);
							// ENG: Clear my dtmf buffer.
							// CHS: 清空自己的 DTMF 缓存
							channels[ch].dtmf_str.erase(channels[ch].dtmf_str.begin(), channels[ch].dtmf_str.end());
						}
					}
					else
					{
						// ENG: never forget to store the recent dtmf.
						// CHS: 不要忘记保存最近的 DTMF。
						channels[ch].dtmf_str.append(1, dtmf);
					}
				}

				// Arc 8
				else if (channels[ch].state_conference == CO_IN_CONFERENCE)
				{
					dtmf = lParam & 0x00FF;
					switch (dtmf)
					{
						case '#':
							{
								int num;
								if (channels[ch].dtmf_str.length() == 0 )
								{
									break;
								}
								num = atoi(channels[ch].dtmf_str.c_str());
								if(num == 1)
								{
									channels[ch].dtmf_str.erase(channels[ch].dtmf_str.begin(), channels[ch].dtmf_str.end());
									CHECK_RETURN SsmPlayFile(ch, ".\\wav\\invite.wav", -1, 0, -1);
									channels[ch].state_conference = CO_INVITE_OTHER;
									break;
								}
								else if(num == 2)
								{
									// ENG: To talk securely
									// CHS: 开始密谈
									channels[ch].dtmf_str.erase(channels[ch].dtmf_str.begin(), channels[ch].dtmf_str.end());
									CHECK_RETURN SsmPlayFile(ch, ".\\wav\\h.wav", -1, 0, -1);
									channels[ch].state_conference = CO_WHO_TO_TALK_SECURELY;
									break;
								}
								else if(num == 3)
								{
									// ENG: verbose infomation
									// CHS: 详细信息
									int GrpId, MmbrId;
									DWORD SilenceTime;
									WORD JoinMode, IsSpeaking, TotalMember, TotalSpeaker, TotalSpeaking;
									CHECK_RETURN SsmGetConfChInfo(ch, &GrpId, &MmbrId, & JoinMode, &IsSpeaking, &SilenceTime);
									CHECK_RETURN SsmGetConfGrpInfo(GrpId, &TotalMember, &TotalSpeaker, &TotalSpeaking);
									CHECK_RETURN SsmClearFileList(ch);
									// ENG: Play "group id is ...".
									// CHS: 播放“会议组号是……”。
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\j1.wav", -1, 0, -1);
									add_list(ch, GrpId);
									// ENG: Play "member id is ...".
									// CHS: 播放“成员号是……”。
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\j2.wav", -1, 0, -1);
									add_list(ch, MmbrId);
									// ENG: Play "join mode is ...".
									// CHS: 播放“加入模式号是……”。
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\j3.wav", -1, 0, -1);
									add_list(ch, JoinMode);
									// ENG: Play "is_speaking is ...".
									// CHS: 播放“正在发言标识是……”。
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\j4.wav", -1, 0, -1);
									add_list(ch, IsSpeaking);
									// ENG: Play "silence time is ...".
									// CHS: 播放“静默时间是……”。
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\j5.wav", -1, 0, -1);
									add_list(ch, SilenceTime);
									// ENG: play "total member is ...".
									// CHS: 播放“会议成员总数是……”。
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\j6.wav", -1, 0, -1);
									add_list(ch, TotalMember);
									// ENG: Play "total speaker is ...".
									// CHS: 播放“会议常讲人数是是……”。
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\j7.wav", -1, 0, -1);
									add_list(ch, TotalSpeaker);
									// ENG: Play "total speaking is ...".
									// CHS: 播放“会议正在发言人数是……”。
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\j8.wav", -1, 0, -1);
									add_list(ch, TotalSpeaking);
									CHECK_RETURN SsmPlayFileList(ch);
									channels[ch].dtmf_str.erase(channels[ch].dtmf_str.begin(), channels[ch].dtmf_str.end());
								}
								break;
							}

						default:
							// ENG: Error! but no operation needed!
							// CHS: 错误!不过不用操作!
							channels[ch].dtmf_str.append(1, dtmf);
							break;
					}
				}

				else if(channels[ch].state_conference == CO_INVITE_OTHER)
				{
					dtmf = lParam & 0x00FF;
					if(dtmf == '#')
					{
						if(channels[ch].dtmf_str.length() > 0 )
						{
							WORD wSearchMode = 1<<8;
							int	 IdleCh;
						    IdleCh =  SsmSearchIdleCallOutCh(wSearchMode, 0);
							if(IdleCh >= 0)
							{
								CHECK_RETURN SsmAutoDial(IdleCh, (char *)channels[ch].dtmf_str.c_str());
								channels[IdleCh].conf_to_join = channels[ch].conf_to_join;
								channels[IdleCh].state_channel = CH_INVITEUSER;
							}	
						}
						
						channels[ch].dtmf_str.erase(channels[ch].dtmf_str.begin(), channels[ch].dtmf_str.end());
						channels[ch].state_conference = CO_IN_CONFERENCE;
					}
					else
					{
						if(dtmf == '*')
							dtmf = '.';
						channels[ch].dtmf_str.append(1, dtmf);
					}

				}

				// Arc 10
				else if (channels[ch].state_conference == CO_WHO_TO_TALK_SECURELY)
				{
					dtmf = lParam & 0x00FF;
					switch (dtmf)
					{
						case '#':
							// ENG: Exit talking securely
							// CHS: 退出密谈
							if (channels[ch].dtmf_str.length() == 0)
							{
								if (channels[ch].ch_to_talk_securely >= 0)
								{
									CHECK_RETURN SsmStopLinkFrom(ch, channels[ch].ch_to_talk_securely);
									CHECK_RETURN SsmExitConfGroup(ch, FALSE);
									CHECK_RETURN SsmJoinConfGroup(channels[ch].conf_to_join, ch, channels[ch].last_join_mode, 0, FALSE, FALSE);
									channels[ch].ch_to_talk_securely = -1;
									CHECK_RETURN SsmPlayFile(ch, ".\\wav\\o.wav", -1, 0, -1);
								}
							}
							// ENG: Start talking securely
							// CHS: 开始密谈
							else
							{
								channels[ch].ch_to_talk_securely = atoi(channels[ch].dtmf_str.c_str());
								channels[ch].dtmf_str.erase(channels[ch].dtmf_str.begin(), channels[ch].dtmf_str.end());
								if (is_same_group(ch, channels[ch].ch_to_talk_securely))
								{
									int tmp;
									WORD tmp2;
									DWORD tmp3;
									CHECK_RETURN SsmGetConfChInfo(ch, &tmp, &tmp, &channels[ch].last_join_mode, &tmp2, &tmp3);
									CHECK_RETURN SsmExitConfGroup(ch, FALSE);
									CHECK_RETURN SsmJoinConfGroup(channels[ch].conf_to_join,
										ch,	2 , 0, FALSE, FALSE);
									CHECK_RETURN SsmLinkFrom(ch, channels[ch].ch_to_talk_securely);
									CHECK_RETURN SsmPlayFile(ch, ".\\wav\\n.wav", -1, 0, -1);
								}
								else
								{
									channels[ch].ch_to_talk_securely = -1;
									CHECK_RETURN SsmClearFileList(ch);
									CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\i.wav", -1, 0, -1);
									CHECK_RETURN SsmPlayFileList(ch);
								}
							}
							channels[ch].state_conference = CO_IN_CONFERENCE;
							break;
						default:
							channels[ch].dtmf_str.append(sizeof(char), dtmf);
					}
				}

				// Arc 11
				else if (channels[ch].state_conference == CO_HOW_TO_JOIN)
				{
					dtmf = lParam & 0x00FF;
					switch (dtmf)
					{
						// ENG: Five entries, corresponding to five join modes.
						// CHS: 五个入口对应五个加入模式。
						case '1': case '2': case '3': case '4': case '5':
							if (SsmJoinConfGroup(channels[ch].conf_to_join, ch, dtmf - '1', 0, FALSE, FALSE) == 0)
							{
								CHECK_RETURN SsmStopPlayFileList(get_chs_master(ch));
								CHECK_RETURN SsmSetPlayDest(get_chs_master(ch), 1);
								CHECK_RETURN SsmClearFileList(get_chs_master(ch));
						//		add_list(get_chs_master(ch), ch);
								CHECK_RETURN SsmAddToFileList(get_chs_master(ch), ".\\wav\\f.wav", -1, 0, -1);
								CHECK_RETURN SsmAddToFileList(get_chs_master(ch), ".\\wav\\m.wav", -1, 0, -1);
								add_list(ch, conInfo[channels[ch].conf_to_join].recNum);
								CHECK_RETURN SsmAddToFileList(get_chs_master(ch), ".\\wav\\x.wav", -1, 0, -1);
								CHECK_RETURN SsmStopPlayFile(get_chs_master(ch));
								CHECK_RETURN SsmPlayFileList(get_chs_master(ch));
								channels[get_chs_master(ch)].IsPlayingBgSound = false;
								//SsmBindVCh(ch);
								//SsmSetVoiceEffect(ch, 128);
								channels[ch].state_conference = CO_IN_CONFERENCE;
								CHECK_RETURN SsmSetDtmfStopPlay(ch, TRUE);

							}
							else
							{
								CString aa = SsmGetLastErrMsgA();
								CHECK_RETURN SsmClearFileList(ch);
								CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\p.wav", -1, 0, -1);
								CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\c.wav", -1, 0, -1);
								CHECK_RETURN SsmPlayFileList(ch);
							}
							break;
						// ENG: No specified join mode.
						// CHS: 没有指定的加入模式。
						default:
							CHECK_RETURN SsmClearFileList(ch);
							CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\e.wav", -1, 0, -1);
							CHECK_RETURN SsmAddToFileList(ch, ".\\wav\\c.wav", -1, 0, -1);
							CHECK_RETURN SsmPlayFileList(ch);
					}
				}
				break; 

			// ENG: Here is the first step in conf flowchart.
			// CHS: 这里是会议状态转移图的第一步
			case TO_START - WM_USER:
				if (channels[ch].state_conference == CO_IDLE)
				{
					CHECK_RETURN SsmSetDtmfStopPlay(ch, TRUE);
					CHECK_RETURN SsmPlayFile(ch, ".\\wav\\a.wav", -1, 0, -1);
					channels[ch].state_conference = CO_CREATE_OR_JOIN;
					channels[ch].dtmf_str.erase(channels[ch].dtmf_str.begin(), channels[ch].dtmf_str.end());
				}
				break; 

			// ENG: Here is the last step in conf flowchart.
			// CHS: 这里是会议状态转移图的最后一步
			case TO_END - WM_USER:
				if (channels[ch].state_conference == CO_CREATE_OR_JOIN)
				{
					if (SsmCheckPlay(ch) == 0)
						CHECK_RETURN SsmStopPlay(ch);
					CHECK_RETURN SsmSetDtmfStopPlay(ch, FALSE);
					channels[ch].state_conference = CO_IDLE;
				}
				else if (channels[ch].state_conference == CO_HOW_TO_JOIN)
				{
					if (channels[ch].creater == true)
					{
						CHECK_RETURN SsmStopRecToFile(cm_pair.find(channels[ch].conf_to_join)->second);
						channels[cm_pair.find(channels[ch].conf_to_join)->second].master = MASTER_IDLE;
						CHECK_RETURN SsmFreeConfGroup(channels[ch].conf_to_join);
						cm_pair.erase(cm_pair.find(channels[ch].conf_to_join));
					}
					if (SsmCheckPlay(ch) == 0)
						CHECK_RETURN SsmStopPlay(ch);
					CHECK_RETURN SsmSetDtmfStopPlay(ch, FALSE);
					channels[ch].state_conference = CO_IDLE;
				}
				else if (channels[ch].state_conference == CO_IN_CONFERENCE ||
					channels[ch].state_conference == CO_WHO_TO_TALK_SECURELY)
				{
					int GrpId, MmbrId;
					DWORD SilenceTime;
					WORD JoinMode, IsSpeaking, TotalMember, TotalSpeaker, TotalSpeaking;
					CHECK_RETURN SsmSetPlayDest(get_chs_master(ch), 1);
					CHECK_RETURN SsmStopPlayFileList(get_chs_master(ch));
					CHECK_RETURN SsmClearFileList(get_chs_master(ch));
					add_list(get_chs_master(ch), ch);
					CHECK_RETURN SsmAddToFileList(get_chs_master(ch), ".\\wav\\g.wav", -1, 0, -1);
					CHECK_RETURN SsmStopPlayFile(get_chs_master(ch));
					CHECK_RETURN SsmPlayFileList(get_chs_master(ch));
					channels[get_chs_master(ch)].IsPlayingBgSound = false;
					CHECK_RETURN SsmGetConfChInfo(ch, &GrpId, &MmbrId, & JoinMode, &IsSpeaking, &SilenceTime);
					CHECK_RETURN SsmGetConfGrpInfo(GrpId, &TotalMember, &TotalSpeaker, &TotalSpeaking);
					//SsmSetVoiceEffect(ch, 128);
					//SsmUnBindVCh(ch);
					if (TotalMember == 1)
					{
						CHECK_RETURN SsmStopRecToFile(get_chs_master(ch));
						CHECK_RETURN SsmExitConfGroup(ch, FALSE);
						if (channels[ch].ch_to_talk_securely >= 0)
						{
							CHECK_RETURN SsmStopLinkFrom(ch, channels[ch].ch_to_talk_securely);
							channels[ch].ch_to_talk_securely = -1;
						}
						channels[get_master(GrpId)].master = MASTER_IDLE;
						CHECK_RETURN SsmFreeConfGroup(GrpId);
						cm_pair.erase(cm_pair.find(GrpId));
					}
					else
					{
						if (channels[ch].ch_to_talk_securely >= 0)
						{
							CHECK_RETURN SsmStopLinkFrom(ch, channels[ch].ch_to_talk_securely);
							channels[ch].ch_to_talk_securely = -1;
						}
						CHECK_RETURN SsmExitConfGroup(ch, FALSE);
					}
					if (SsmCheckPlay(ch) == 0)
						CHECK_RETURN SsmStopPlay(ch);
					CHECK_RETURN SsmSetDtmfStopPlay(ch, FALSE);
					channels[ch].state_conference = CO_IDLE;
				}
				break; 
		}
	}

	return CFrameWnd::WindowProc(message, wParam, lParam);
}

// ENG: Maintain backgound sound.
// CHS: 维护背景音
void maintain(pair<int, int> x)
{
	CHECK_RETURN SsmSetPlayVolume(x.second, channels[x.second].BgSoundVolume);
	// ENG: Not playing anything
	// CHS: 没有放任何声音
	if (SsmCheckPlay(x.second) > 0)
	{
		int i = SsmCheckPlay(x.second);
		// ENG: Let it play backgroud sound.
		// CHS: 那就放背景音
		if (channels[x.second].BgSoundEnabled == true)
		{
			CHECK_RETURN SsmPlayFile(x.second, ".\\wav\\bg.wav", -1, 0, -1);
			channels[x.second].IsPlayingBgSound = true;
		}
	}
	// ENG: Playing
	// CHS: 正在播放
	else
	{
		// ENG: Playing background sound, but not allowed, so let us stop it.
		// CHS: 正在播放背景音,但是不允许,就关闭它
		if(channels[x.second].IsPlayingBgSound && channels[x.second].BgSoundEnabled == false)
		{
			CHECK_RETURN SsmStopPlay(x.second);
		}
	}
}

void MainFrame::OnTimer(UINT nIDEvent)
{
	if (nIDEvent == 0)
	{
		for_each(cm_pair.begin(), cm_pair.end(), maintain);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -