更新時(shí)間:2019-11-20
描述
普通與會(huì)者和主席均可在會(huì)議中主動(dòng)退出會(huì)議,主席可以結(jié)束會(huì)議。
若主席退出會(huì)議,則會(huì)議中無主席,預(yù)約會(huì)議時(shí),原主席可以通過主席接入信息重新加入會(huì)議獲取主席;當(dāng)會(huì)議中無任何與會(huì)者時(shí),會(huì)議也會(huì)自動(dòng)結(jié)束。
與會(huì)者已在會(huì)議中。
業(yè)務(wù)流程
退出會(huì)議
在主動(dòng)離開會(huì)議過程中,sdk層會(huì)主動(dòng)掛斷通話,然后才離開會(huì)議。
//c code TSDK_RESULT ret; ret = tsdk_leave_conference(confHandle); if (TSDK_SUCCESS != ret) { LOG_D_CALL_ERROR("leave conf failed. result=%#x", ret); return -1; } return TSDK_SUCCESS; |
//c code case TSDK_E_CALL_EVT_CALL_DESTROY: { CHECK_POINTER(data); TSDK_S_CALL_INFO* callInfo = (TSDK_S_CALL_INFO*)data; TSDK_S_CALL_INFO* notifyInfo = new TSDK_S_CALL_INFO; memset(notifyInfo, 0, sizeof(TSDK_S_CALL_INFO)); memcpy_s(notifyInfo, sizeof(TSDK_S_CALL_INFO), callInfo, sizeof(TSDK_S_CALL_INFO)); ::PostMessage(maindlg->GetSafeHwnd(), WM_CALL_END, (WPARAM)notifyInfo, NULL); break; } |
詳細(xì)流程參見“更新會(huì)議狀態(tài)信息和與會(huì)者列表”描述。
結(jié)束會(huì)議
應(yīng)用程序界面在關(guān)閉會(huì)議時(shí)應(yīng)為主席提供“退出會(huì)議”和“結(jié)束會(huì)議”的選擇入口。
//c code TSDK_RESULT ret; ret = tsdk_end_conference(confHandle); if (TSDK_SUCCESS != ret) { LOG_D_CALL_ERROR("end conf failed. result=%#x", ret); return -1; } return TSDK_SUCCESS; |
注意事項(xiàng)
無。
描述
在會(huì)議中進(jìn)行基礎(chǔ)的會(huì)議控制操作。
業(yè)務(wù)流程
基礎(chǔ)會(huì)議控制
會(huì)控類型 |
接口 |
權(quán)限 |
說明 |
---|---|---|---|
閉音會(huì)議 |
tsdk_mute_conference |
主席 |
設(shè)置會(huì)議閉音后,除主席外,其他所有與會(huì)者均不可說(只可聽)。 |
添加與會(huì)者 |
tsdk_add_attendee |
主席 |
支持邀請一個(gè)或多個(gè)與會(huì)者。 |
重?fù)芘c會(huì)者 |
tsdk_redial_attendee |
主席 |
- |
掛斷與會(huì)者 |
tsdk_hang_up_attendee |
主席 |
掛斷在會(huì)議中的與會(huì)者. |
刪除與會(huì)者 |
tsdk_remove_attendee |
主席 |
踢出與會(huì)者(正在會(huì)議中的)、移除已離會(huì)的與會(huì)者和取消正在邀請的與會(huì)者。 |
閉音與會(huì)者 |
tsdk_mute_attendee |
主席 普通與會(huì)者 |
設(shè)置閉音后,該與會(huì)者不可說(只聽)。 會(huì)議主席在會(huì)議中設(shè)置或取消其他與會(huì)者閉音,普通與會(huì)者設(shè)置或取消自己閉音。 |
舉手 |
tsdk_set_handup |
主席 普通與會(huì)者 |
會(huì)議主席在會(huì)議中取消其他與會(huì)者舉手,所有與會(huì)者設(shè)置或取消自己舉手。 |
設(shè)置會(huì)議視頻模式 |
tsdk_set_video_mode |
主席 |
在CloudEC解決方案下,支持的視頻會(huì)議模式有“廣播與會(huì)者模式”、“聲控模式”和“自由討論模式”。 |
觀看與會(huì)者 |
tsdk_watch_attendee |
主席 普通與會(huì)者 |
AVC 會(huì)議:只需要指定待選看的與會(huì)者號碼,每次指定選看一個(gè)與會(huì)者。 SVC會(huì)議:
|
廣播與會(huì)者 |
tsdk_broadcast_attendee |
主席 |
會(huì)議視頻模式為“廣播與會(huì)者模式”時(shí)主席可以指定廣播與會(huì)者。 |
申請主席 |
tsdk_request_chairman |
普通與會(huì)者 |
- |
釋放主席 |
tsdk_release_chairman |
主席 |
- |
延長會(huì)議 |
tsdk_postpone_conference |
主席 |
- |
設(shè)置主講人 |
tsdk_set_presenter |
主席 會(huì)議主講人 |
會(huì)議類型為TSDK_E_CONF_MEDIA_VOICE_DATA或TSDK_E_CONF_MEDIA_VIDEO_DATA支持。 |
申請主講人 |
tsdk_request_presenter |
與會(huì)者 |
會(huì)議類型為TSDK_E_CONF_MEDIA_VOICE_DATA或TSDK_E_CONF_MEDIA_VIDEO_DATA支持。 |
設(shè)置會(huì)議錄播 |
tsdk_set_record_broadcast |
主席 |
- |
設(shè)置會(huì)議直播 |
tsdk_set_live_broadcast |
主席 |
- |
//c code /* 閉音會(huì)場 */ TSDK_RESULT ret; ret = tsdk_mute_conference(confHandle, isMute); if (TSDK_SUCCESS != ret) { LOG_D_CALL_ERROR("mute conference failed. result=%#x", ret); return -1; } return TSDK_SUCCESS; |
//c code case TSDK_E_CONF_EVT_CONFCTRL_OPERATION_RESULT: { CHECK_POINTER(data); TSDK_S_CONF_OPERATION_RESULT* pResult = (TSDK_S_CONF_OPERATION_RESULT*)data; TSDK_S_CONF_OPERATION_RESULT* notifyInfo = new TSDK_S_CONF_OPERATION_RESULT; memset(notifyInfo, 0, sizeof(TSDK_S_CONF_OPERATION_RESULT)); memcpy_s(notifyInfo, sizeof(TSDK_S_CONF_OPERATION_RESULT), pResult, sizeof(TSDK_S_CONF_OPERATION_RESULT)); if(TSDK_SUCCESS != notifyInfo->reason_code) { maindlg->MessageBox(_T("operation failed!")); } if (TSDK_SUCCESS == notifyInfo->reason_code) { if(TSDK_E_CONF_SET_PRESENTER == notifyInfo->operation_type) { CDemoDataMeetingDlg* dataMeetingDlg = maindlg->GetDemoDataMeetingDlg(); CHECK_POINTER(dataMeetingDlg); dataMeetingDlg->SetPresenter(false); } } break; } |
詳細(xì)流程參見“更新會(huì)議狀態(tài)信息和與會(huì)者列表”描述。
注意事項(xiàng)
無。
描述
會(huì)議過程中,會(huì)議狀態(tài)或與會(huì)者成員狀態(tài)發(fā)生變化時(shí),服務(wù)器會(huì)推送變更通知,應(yīng)用程序界面應(yīng)刷新相應(yīng)的狀態(tài)以提示用戶。
主席和與會(huì)者均已在會(huì)議中。
業(yè)務(wù)流程
事件對應(yīng)的數(shù)據(jù)結(jié)構(gòu)TSDK_S_CONF_STATUS_INFO中:
//c code case TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE: { CHECK_POINTER(data); TSDK_S_CONF_STATUS_INFO* pResult = (TSDK_S_CONF_STATUS_INFO*)data; TSDK_S_CONF_STATUS_INFO* notifyInfo = new TSDK_S_CONF_STATUS_INFO; memset(notifyInfo, 0, sizeof(TSDK_S_CONF_STATUS_INFO)); memcpy_s(notifyInfo, sizeof(TSDK_S_CONF_STATUS_INFO), pResult, sizeof(TSDK_S_CONF_STATUS_INFO)); unsigned int attrndsnumber = pResult->attendee_num; notifyInfo->attendee_list = NULL; notifyInfo->attendee_list = (TSDK_S_ATTENDEE*)malloc(attrndsnumber*sizeof(TSDK_S_ATTENDEE)); if (NULL == notifyInfo->attendee_list) { return; } (void)memset(notifyInfo->attendee_list, 0, attrndsnumber*sizeof(TSDK_S_ATTENDEE)); TSDK_S_ATTENDEE* pTempAttendee = notifyInfo->attendee_list; for (unsigned int i = 0; i < attrndsnumber; i++) { if (pTempAttendee) { (void)strncpy_s(pTempAttendee->status_info.participant_id, TSDK_D_MAX_PARTICIPANTID_LEN+1, pResult->attendee_list[i].status_info.participant_id, _TRUNCATE); (void)strncpy_s(pTempAttendee->base_info.display_name, TSDK_D_MAX_DISPLAY_NAME_LEN+1, pResult->attendee_list[i].base_info.display_name, _TRUNCATE); (void)strncpy_s(pTempAttendee->base_info.number, TSDK_D_MAX_NUMBER_LEN+1, pResult->attendee_list[i].base_info.number, _TRUNCATE); pTempAttendee->base_info.role = (TSDK_E_CONF_ROLE)pResult->attendee_list[i].base_info.role; pTempAttendee->status_info.is_mute = pResult->attendee_list[i].status_info.is_mute; pTempAttendee->status_info.is_handup = pResult->attendee_list[i].status_info.is_handup; pTempAttendee->status_info.state = (TSDK_E_CONF_PARTICIPANT_STATUS)pResult->attendee_list[i].status_info.state; pTempAttendee->status_info.has_camera = pResult->attendee_list[i].status_info.has_camera; pTempAttendee->status_info.is_present = pResult->attendee_list[i].status_info.is_present; pTempAttendee->status_info.is_self = pResult->attendee_list[i].status_info.is_self; } else { break; } pTempAttendee++; } if (TSDK_E_CONF_MEDIA_VOICE == notifyInfo->conf_media_type) { CDemoAudioMeetingDlg* pAudioMettingDlg = maindlg->GetDemoAudioMeetingDlg(); CHECK_POINTER(pAudioMettingDlg); ::PostMessage(pAudioMettingDlg->GetSafeHwnd(), WM_CONF_CTRL_INFO_AND_STATUS_UPDATE, (WPARAM)notifyInfo, (LPARAM)param1); } else if (TSDK_E_CONF_MEDIA_VIDEO == notifyInfo->conf_media_type) { CDemoVideoMeetingDlg* pVideoMettingDlg = maindlg->GetDemoVideoMeetingDlg(); CHECK_POINTER(pVideoMettingDlg); ::PostMessage(pVideoMettingDlg->GetSafeHwnd(), WM_CONF_CTRL_INFO_AND_STATUS_UPDATE, (WPARAM)notifyInfo, (LPARAM)param1); } else if (TSDK_E_CONF_MEDIA_VOICE_DATA == notifyInfo->conf_media_type || TSDK_E_CONF_MEDIA_VIDEO_DATA == notifyInfo->conf_media_type) { CDemoDataMeetingDlg* pDataMettingDlg = maindlg->GetDemoDataMeetingDlg(); CHECK_POINTER(pDataMettingDlg); ::PostMessage(pDataMettingDlg->GetSafeHwnd(), WM_CONF_CTRL_INFO_AND_STATUS_UPDATE, (WPARAM)notifyInfo, (LPARAM)param1); } break; } |
注意事項(xiàng)
無。