📄 mainframe.cpp
字号:
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 + -