黄h片网址在线观看,五月婷婷网址,一级一级一级毛片免费毛片,欧美一级视频免费观看

智慧服務(wù),成就美好體驗(yàn) 項(xiàng)目咨詢

主頁 > 服務(wù)與支持 > 開發(fā)平臺(tái) > 客戶端SDK參考 > Windows Native SDK > 會(huì)議 桌面協(xié)同與共享

入門使用

桌面協(xié)同與共享

更新時(shí)間:2019-12-10

開始和結(jié)束屏幕共享

描述

會(huì)議中,主講人和與會(huì)者可以進(jìn)行屏幕共享或程序共享。

前提條件:

  1. 加入數(shù)據(jù)會(huì)議成功。
  2. 加載屏幕/程序共享模塊成功。

業(yè)務(wù)流程

主講人共享屏幕

圖1 主講人共享屏幕流程 
  1. 主講人選擇共享本端屏幕,UI調(diào)用tsdk_app_share_set_owner()接口設(shè)置自己為共享權(quán)限擁有者。
    說明: 

    SDK并未對(duì)接口tsdk_app_share_set_owner的調(diào)用者進(jìn)行與角色限制,但實(shí)際應(yīng)用場景中,UI應(yīng)該僅對(duì)主講人才提供主動(dòng)“共享屏幕”入口。

    代碼示例:
    //c code 
    TSDK_RESULT ret;
    ret = tsdk_app_share_set_owner(confHandle, attendee, action);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("share set owner failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 主講人側(cè)和其他與會(huì)者側(cè)SDK向UI上報(bào)共享權(quán)限擁有者變更通知消息TSDK_E_CONF_EVT_AS_OWNER_CHANGE,攜帶當(dāng)前共享權(quán)限擁有者ID,UI刷新共享者信息。
    說明: 

    應(yīng)用程序在擁有主講人身份時(shí),收到此通知消息,UI應(yīng)自動(dòng)進(jìn)行后繼開始“共享屏幕”的處理流程,而不需要用戶確認(rèn)。

    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_AS_OWNER_CHANGE:
    {
         CHECK_POINTER(data);
         CDemoDataMeetingDlg* pDataMettingDlg = maindlg->GetDemoDataMeetingDlg();
         CHECK_POINTER(pDataMettingDlg);
         ::PostMessage(pDataMettingDlg->GetSafeHwnd(), WM_DATACONF_MODULE_SHARING_SESSION, (WPARAM)param2, (LPARAM)data);
         break;
    }
    
     
  3. UI調(diào)用tsdk_app_share_start()接口開始共享屏幕。
    代碼示例:
    //c code
    TSDK_UINT32 confHandle = get_data_conf_handle();
    TSDK_RESULT ret;
    ret = tsdk_app_share_start(confHandle, shareType);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("share start failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  4. 主講人側(cè)和其他與會(huì)者側(cè)SDK向UI上報(bào)屏幕共享狀態(tài)變更通知消息TSDK_E_CONF_EVT_AS_STATE_CHANGE,UI刷新屏幕共享狀態(tài)信息。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_AS_STATE_CHANGE:
    {
         CHECK_POINTER(data);
         TSDK_S_CONF_AS_STATE_INFO* pResult = (TSDK_S_CONF_AS_STATE_INFO*)data;
         TSDK_S_CONF_AS_STATE_INFO* notifyInfo = new TSDK_S_CONF_AS_STATE_INFO;
         memset(notifyInfo, 0, sizeof(TSDK_S_CONF_AS_STATE_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_CONF_AS_STATE_INFO), pResult, sizeof(TSDK_S_CONF_AS_STATE_INFO));
    
         CDemoDataMeetingDlg* pDataMettingDlg = maindlg->GetDemoDataMeetingDlg();
         CHECK_POINTER(pDataMettingDlg);
         ::PostMessage(pDataMettingDlg->GetSafeHwnd(), WM_DATACONF_MODULE_SHARING_STATE, (WPARAM)notifyInfo, (LPARAM)param2);
         break;
    }
    
     
  5. 共享側(cè)SDK自動(dòng)抓取屏幕數(shù)據(jù),由業(yè)務(wù)服務(wù)器發(fā)送給其他與會(huì)者,其他與會(huì)者側(cè)SDK向UI上報(bào)屏幕數(shù)據(jù)更新通知消息TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE:
    {
         CDemoDataMeetingDlg* pDataMettingDlg = maindlg->GetDemoDataMeetingDlg();
         CHECK_POINTER(pDataMettingDlg);
         ::PostMessage(pDataMettingDlg->GetSafeHwnd(), WM_DATACONF_MODULE_SCREEN_DATA, NULL, NULL);
         break;
    }
    
     
  6. UI調(diào)用tsdk_app_share_get_screen_data()接口獲取屏幕數(shù)據(jù),刷新共享顯示區(qū)域。
    代碼示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_app_share_get_screen_data(confHandle, screenData);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("share get screen data failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     

 

主講人邀請(qǐng)其他與會(huì)者共享屏幕

圖2 主講人邀請(qǐng)其他與會(huì)者共享屏幕流程 
  1. 主講人選擇邀請(qǐng)其他與會(huì)者共享屏幕,UI調(diào)用tsdk_app_share_set_owner()接口設(shè)置其他與會(huì)者為共享權(quán)限擁有者。
    說明: 

    SDK并未對(duì)接口tup_conf_as_set_owner的調(diào)用者進(jìn)行與角色限制,但實(shí)際應(yīng)用場景中,UI應(yīng)該僅對(duì)主講人才提供“邀請(qǐng)其他與會(huì)者共享”入口;成功調(diào)用該接口后,原來擁有共享權(quán)限的用戶的共享權(quán)限會(huì)自動(dòng)取消,正在進(jìn)行的共享會(huì)停止。

    代碼示例:
    //c code 
    TSDK_RESULT ret;
    ret = tsdk_app_share_set_owner(confHandle, attendee, action);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("share set owner failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 主講人側(cè)和其他與會(huì)者側(cè)SDK向UI上報(bào)共享權(quán)限擁有者變更通知消息TSDK_E_CONF_EVT_AS_OWNER_CHANGE,攜帶當(dāng)前共享權(quán)限擁有者ID,UI刷新屏幕共享者信息。
    說明: 

    應(yīng)用程序在非主講人時(shí)收到此通知消息,并且共享者ID為自己,UI應(yīng)提示用戶收到共享邀請(qǐng),并提供“共享屏幕”和“拒絕共享”入口,若應(yīng)用程序支持“程序共享”,還應(yīng)該提供“程序共享”的選擇入口。

    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_AS_OWNER_CHANGE:
    {
         CHECK_POINTER(data);
         CDemoDataMeetingDlg* pDataMettingDlg = maindlg->GetDemoDataMeetingDlg();
         CHECK_POINTER(pDataMettingDlg);
         ::PostMessage(pDataMettingDlg->GetSafeHwnd(), WM_DATACONF_MODULE_SHARING_SESSION, (WPARAM)param2, (LPARAM)data);
         break;
    }
    
     
  3. UI調(diào)用tsdk_app_share_start()接口開始共享屏幕共享。
    代碼示例:
    //c code 
    TSDK_UINT32 confHandle = get_data_conf_handle();
    TSDK_RESULT ret;
    ret = tsdk_app_share_start(confHandle, shareType);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("share start failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
    說明: 

    后繼步驟與“主講人共享屏幕”相同。

 

共享者主動(dòng)結(jié)束共享

圖3 共享者主動(dòng)結(jié)束共享流程 
  1. UI調(diào)用tsdk_app_share_stop()接口停止共享。
    代碼示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_app_share_stop(confHandle);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("share stop failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 共享側(cè)和其他與會(huì)者側(cè)SDK向UI上報(bào)屏幕共享狀態(tài)變更通知消息TSDK_E_CONF_EVT_AS_STATE_CHANGE,UI刷新屏幕共享狀態(tài)信息。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_AS_STATE_CHANGE:
    {
         CHECK_POINTER(data);
         TSDK_S_CONF_AS_STATE_INFO* pResult = (TSDK_S_CONF_AS_STATE_INFO*)data;
         TSDK_S_CONF_AS_STATE_INFO* notifyInfo = new TSDK_S_CONF_AS_STATE_INFO;
         memset(notifyInfo, 0, sizeof(TSDK_S_CONF_AS_STATE_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_CONF_AS_STATE_INFO), pResult, sizeof(TSDK_S_CONF_AS_STATE_INFO));
    
         CDemoDataMeetingDlg* pDataMettingDlg = maindlg->GetDemoDataMeetingDlg();
         CHECK_POINTER(pDataMettingDlg);
         ::PostMessage(pDataMettingDlg->GetSafeHwnd(), WM_DATACONF_MODULE_SHARING_STATE, (WPARAM)notifyInfo, (LPARAM)param2);
         break;
    }
    
     
  3. 共享側(cè)向UI調(diào)用tsdk_app_share_set_owner()釋放共享權(quán)限擁有者權(quán)限。
  4. 共享側(cè)和其他與會(huì)者側(cè)SDK向UI上報(bào)共享權(quán)限擁有者變更通知消息TSDK_E_CONF_EVT_AS_OWNER_CHANGE,攜帶當(dāng)前共享權(quán)限擁有者ID,UI刷新屏幕共享者信息。

 

主講人結(jié)束共享者共享

圖4 主講人結(jié)束共享者共享流程 
  1. 主講人UI調(diào)用tsdk_app_share_set_owner()接口釋放當(dāng)前共享者共享權(quán)限。
    代碼示例:
    //c code 
    TSDK_RESULT ret;
    ret = tsdk_app_share_set_owner(confHandle, attendee, action);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("share set owner failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 共享側(cè)和其他與會(huì)者側(cè)SDK向UI上報(bào)共享權(quán)限擁有者變更通知消息TSDK_E_CONF_EVT_AS_OWNER_CHANGE,攜帶當(dāng)前共享權(quán)限擁有者ID,UI刷新屏幕共享者信息。
  3. 共享側(cè)調(diào)UI用tsdk_app_share_stop()接口停止共享。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_AS_OWNER_CHANGE:
    {
         CHECK_POINTER(data);
         CDemoDataMeetingDlg* pDataMettingDlg = maindlg->GetDemoDataMeetingDlg();
         CHECK_POINTER(pDataMettingDlg);
         ::PostMessage(pDataMettingDlg->GetSafeHwnd(), WM_DATACONF_MODULE_SHARING_SESSION, (WPARAM)param2, (LPARAM)data);
         break;
    }
    
     
  4. 共享側(cè)和其他與會(huì)者側(cè)SDK向UI上報(bào)屏幕共享狀態(tài)變更通知消息TSDK_E_CONF_EVT_AS_STATE_CHANGE,UI刷新屏幕共享狀態(tài)信息。

注意事項(xiàng)

無。

文檔共享

描述

會(huì)議過程中,與會(huì)者可以打開一個(gè)文檔進(jìn)行共享,以及關(guān)閉一個(gè)已經(jīng)共享的文檔或者取消打開一個(gè)已經(jīng)打開但未打開完成的文檔。

前提條件:

  1. 加入數(shù)據(jù)會(huì)議成功。
  2. 加載文檔共享模塊成功。

業(yè)務(wù)流程

打開共享文檔

圖5 打開共享文檔流程 
  1. 共享側(cè)UI調(diào)用tsdk_doc_share_open_document()接口打開指定文檔,接口出參返回共享文檔的ID,用于后繼文檔操作。
    說明: 

    SDK并未對(duì)接口tsdk_doc_share_open_document()的調(diào)用者進(jìn)行角色限制,實(shí)際應(yīng)用場景中,建議應(yīng)用程序UI僅對(duì)主講人或桌面共享權(quán)限所有者提供“共享文檔”入口,以減少不必要的交互。

    代碼示例:
    //c code
    CString docmentPath;
    CFileDialog filedlg(TRUE);
    if (filedlg.DoModal())
    {
        docmentPath = filedlg.GetPathName();
    }
    unsigned int newdocid = 0;
    service_data_conf_ds_share_open_document(CTools::UNICODE2UTF(docmentPath).c_str(),&newdocid);
    
    int service_data_conf_ds_share_open_document(const char* file_path,unsigned int* doc_id)
    {
       TSDK_RESULT ret;
       ret = tsdk_doc_share_open_document(confHandle,file_path,TSDK_E_DOC_SHARE_SIZE,doc_id);
       if (TSDK_SUCCESS != ret)
       {
           LOG_D_CALL_ERROR("share open document failed. result=%#x", ret);
           return -1;
    }
    return TSDK_SUCCESS;
    }
    
     
  2. 共享側(cè)SDK向UI上報(bào)開始加載文檔通知消息TSDK_E_CONF_EVT_DS_DOC_LOAD_START。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_LOAD_START:
    {
         CHECK_POINTER(data);
         TSDK_S_DOC_BASE_INFO* pResult = (TSDK_S_DOC_BASE_INFO*)data;
         TSDK_S_DOC_BASE_INFO* notifyInfo = new TSDK_S_DOC_BASE_INFO;
         service_memset_s(notifyInfo, sizeof(TSDK_S_DOC_BASE_INFO), 0, sizeof(TSDK_S_DOC_BASE_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_DOC_BASE_INFO), pResult, sizeof(TSDK_S_DOC_BASE_INFO));
    
         CDemoDocumentsShareDlg* pDocumentShareDlg = maindlg->GetDocumentDlg();
         CHECK_POINTER(pDocumentShareDlg); 
         ::PostMessage(pDocumentShareDlg->GetSafeHwnd(),WM_DATACONF_MODULE_DS_NEW,(WPARAM)notifyInfo,(LPARAM)param2);
         break;
    }
    
     
  3. 共享側(cè)和觀看側(cè)SDK向UI上報(bào)通知消息TSDK_E_CONF_EVT_DS_DOC_NEW,對(duì)于共享側(cè)表示打開一個(gè)文檔成功,對(duì)于觀看側(cè)表示下載到一個(gè)文檔頭。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_NEW:
    {
         LOG_D_CALL_INFO("doc share new");
         break;
    }
    
     
  4. 共享側(cè)SDK向UI上報(bào)加載完成一頁通知消息TSDK_E_CONF_EVT_DS_DOC_PAGE_LOADED。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_PAGE_LOADED:
    {
         CHECK_POINTER(data);
         TSDK_S_DOC_PAGE_BASE_INFO* pResult = (TSDK_S_DOC_PAGE_BASE_INFO*)data;
         TSDK_S_DOC_PAGE_BASE_INFO* notifyInfo = new TSDK_S_DOC_PAGE_BASE_INFO;
         service_memset_s(notifyInfo, sizeof(TSDK_S_DOC_PAGE_BASE_INFO), 0, sizeof(TSDK_S_DOC_PAGE_BASE_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_DOC_PAGE_BASE_INFO), pResult, sizeof(TSDK_S_DOC_PAGE_BASE_INFO));
    
         CDemoDocumentsShareDlg* pDocumentShareDlg = maindlg->GetDocumentDlg();
         CHECK_POINTER(pDocumentShareDlg);
         ::PostMessage(pDocumentShareDlg->GetSafeHwnd(), WM_DATACONF_MODULE_DS_PAGE_LOADED, (WPARAM)notifyInfo, NULL);
         break;
    }
    
     
  5. 共享側(cè)和觀看側(cè)SDK向UI上報(bào)通知消息TSDK_E_CONF_EVT_DS_DOC_PAGE_NEW,對(duì)于共享側(cè)表示加載一頁成功,對(duì)于觀看側(cè)表示下載到一個(gè)頁頭。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_PAGE_NEW:
    {	
         LOG_D_CALL_INFO("doc share page new");
         break;
    }
    
     
  6. 共享側(cè)SDK向UI上報(bào)文檔加載完成通知消息TSDK_E_CONF_EVT_DS_DOC_LOAD_FINISH。
    說明: 

    收到此消息通知表示文檔加載并上傳服務(wù)器成功,可以進(jìn)行后繼操作,在此之前的步驟2至步驟5均為中間過程,UI可僅記錄狀態(tài)信息,不進(jìn)行界面刷新處理。

    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_LOAD_FINISH:
    {
         CHECK_POINTER(data);
         TSDK_S_DOC_BASE_INFO* pResult = (TSDK_S_DOC_BASE_INFO*)data;
         TSDK_S_DOC_BASE_INFO* notifyInfo = new TSDK_S_DOC_BASE_INFO;
         service_memset_s(notifyInfo, sizeof(TSDK_S_DOC_BASE_INFO), 0, sizeof(TSDK_S_DOC_BASE_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_DOC_BASE_INFO), pResult, sizeof(TSDK_S_DOC_BASE_INFO));
    
         CDemoDocumentsShareDlg* pDocumentShareDlg = maindlg->GetDocumentDlg();
         CHECK_POINTER(pDocumentShareDlg);
         ::PostMessage(pDocumentShareDlg->GetSafeHwnd(),WM_DATACONF_MODULE_DS_DOCLOADED, (WPARAM)notifyInfo, (LPARAM)param2);
         break;
    }
    
     
  7. 共享側(cè)UI調(diào)用tsdk_doc_share_set_current_page()設(shè)置當(dāng)前要顯示的頁面。
    說明: 

    調(diào)用該接口后,當(dāng)前顯示的頁面將被切換到指定的文檔頁。如果指定的文檔ID為有效值而頁面ID為0,則切換到該文檔上次顯示的頁面。該函數(shù)有同步設(shè)置和非同步兩種,同步設(shè)置時(shí),其他所有與會(huì)者都會(huì)收到切換消息并顯示切換的頁面;非同步時(shí),只有本地發(fā)生變化,共享側(cè)應(yīng)該設(shè)置為同步。

    代碼示例:
    //c code
    TSDK_RESULT ret;
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    page_info.component_id = TSDK_E_COMPONENT_DS;
    page_info.document_id = docId;
    page_info.page_index = pageIndex;
    ret = tsdk_doc_share_set_current_page(confHandle,&page_info,isSyn);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("set current page failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  8. 共享側(cè)SDK向UI上報(bào)當(dāng)前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE;所有觀看側(cè)SDK向UI上報(bào)收到同步翻頁指示通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE_IND。

    代碼示例:

    //c code
    case TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE:
    {
         LOG_D_CALL_INFO("doc share current page");
         break;
    }
    case TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE_IND:
    {
    CHECK_POINTER(data);
    TSDK_S_DOC_PAGE_BASE_INFO* pResult = (TSDK_S_DOC_PAGE_BASE_INFO*)data;
    TSDK_S_DOC_PAGE_BASE_INFO* notifyInfo = new TSDK_S_DOC_PAGE_BASE_INFO;
    service_memset_s(notifyInfo, sizeof(TSDK_S_DOC_PAGE_BASE_INFO), 0, sizeof(TSDK_S_DOC_PAGE_BASE_INFO));
    memcpy_s(notifyInfo, sizeof(TSDK_S_DOC_PAGE_BASE_INFO), pResult, sizeof(TSDK_S_DOC_PAGE_BASE_INFO));
    
    CDemoDocumentsShareDlg* pDocumentShareDlg = maindlg->GetDocumentDlg();
    CHECK_POINTER(pDocumentShareDlg);
    ::PostMessage(pDocumentShareDlg->GetSafeHwnd(),WM_DATACONF_MODULE_DS_PAGE_IND,(WPARAM)notifyInfo,NULL);
    break;
    }
    
     
說明: 

后繼處理過程參見“切換文檔和頁面”描述。

關(guān)閉共享文檔

圖6 關(guān)閉共享文檔流程 
  1. 共享側(cè)UI調(diào)用tsdk_doc_share_close_document接口關(guān)閉正在共享文檔。

     

    代碼示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_doc_share_close_document(confHandle,docId);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("close document failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     

     

  2. 觀看側(cè)SDK向UI上報(bào)刪除頁面通知消息TSDK_E_CONF_EVT_DS_DOC_PAGE_DEL。

     

    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_PAGE_DEL:
    {
         LOG_D_CALL_INFO("doc share page delete");
         break;
    }
    
     

     

  3. 共享側(cè)和觀看側(cè)SDK向UI上報(bào)文檔被刪除通知消息TSDK_E_CONF_EVT_DS_DOC_DEL,UI關(guān)閉文檔共享顯示窗口。

     

    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_DEL:
    {
         CDemoDocumentsShareDlg* pDocumentShareDlg = maindlg->GetDocumentDlg();
         CHECK_POINTER(pDocumentShareDlg);
    
         CHECK_POINTER(data);
         TSDK_S_DOC_SHARE_DEL_DOC_INFO* pResult = (TSDK_S_DOC_SHARE_DEL_DOC_INFO*)data;
         TSDK_S_DOC_SHARE_DEL_DOC_INFO* notifyInfo = new TSDK_S_DOC_SHARE_DEL_DOC_INFO;
         service_memset_s(notifyInfo, sizeof(TSDK_S_DOC_SHARE_DEL_DOC_INFO), 0, sizeof(TSDK_S_DOC_SHARE_DEL_DOC_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_DOC_SHARE_DEL_DOC_INFO), pResult, sizeof(TSDK_S_DOC_SHARE_DEL_DOC_INFO));
    
         ::PostMessage(pDocumentShareDlg->GetSafeHwnd(),WM_DATACONF_MODULE_DS_DELETE,(WPARAM)notifyInfo,(LPARAM)param2);
         break;
    }
    
     

     

注意事項(xiàng)

無。

切換文檔和頁面

描述

會(huì)議過程中,與會(huì)者在不同的文檔和不同的頁面之間切換,以觀看不同的內(nèi)容。

前提條件:

  1. 加入數(shù)據(jù)會(huì)議成功。
  2. 加載文檔共享模塊成功。
  3. 有一個(gè)或多個(gè)文檔正在共享。

業(yè)務(wù)流程

同步翻頁或切換文檔

圖7 同步翻頁或切換文檔流程 
  1. UI調(diào)用tsdk_doc_share_set_current_page()接口進(jìn)行同步翻頁或切換文檔操作,是否同步設(shè)置標(biāo)識(shí)參數(shù)is_sync設(shè)置為TRUE。
    代碼示例:
    //c code 
    TSDK_RESULT ret;
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    page_info.component_id = TSDK_E_COMPONENT_DS;
    page_info.document_id = docId;
    page_info.page_index = pageIndex;
    ret = tsdk_doc_share_set_current_page(confHandle,&page_info,isSyn);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("set current page failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 發(fā)起操作側(cè)SDK向UI上報(bào)當(dāng)前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE;所有觀看側(cè)SDK向UI上報(bào)收到同步翻頁指示通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE_IND。
  3. 若同步翻頁或切換文檔,觀看側(cè)UI調(diào)用tsdk_doc_share_set_current_page()接口操作,是否同步設(shè)置標(biāo)識(shí)參數(shù)is_sync設(shè)置為FALSE。
    代碼示例:
    //c code
    TSDK_RESULT ret;
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    page_info.component_id = TSDK_E_COMPONENT_DS;
    page_info.document_id = docId;
    page_info.page_index = pageIndex;
    ret = tsdk_doc_share_set_current_page(confHandle,&page_info,isSyn);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("set current page failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  4. 觀看側(cè)SDK向UI上報(bào)當(dāng)前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE。
  5. 所有與會(huì)者側(cè)SDK向UI上報(bào)文檔界面數(shù)據(jù)通知消息TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY:
    {
         CDemoDocumentsShareDlg* pDocumentShareDlg = maindlg->GetDocumentDlg();
         CHECK_POINTER(pDocumentShareDlg);
         ::PostMessage(pDocumentShareDlg->GetSafeHwnd(),WM_DATACONF_MODULE_DS_DRAW_DATA,NULL,NULL);
         break;
    }
    
     
    說明: 

    此通知消息在共享過程中頁面發(fā)生變更時(shí)就會(huì)上報(bào)。

  6. UI調(diào)用tsdk_doc_share_get_surface_bmp()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。
    代碼示例:
    //c code 
    unsigned int bmpWidth;
    unsigned int bmpHeight;
    
    void* data = NULL;
    data = tsdk_doc_share_get_surface_bmp(confHandle,TSDK_E_COMPONENT_DS,&bmpWidth,&bmpHeight);
    
    if (NULL == data)
    {
        LOG_D_CALL_ERROR("get surface bmp failed.");
        return NULL;
    }
    return data;
    
     

 

本地翻頁或切換文檔(本地瀏覽)

圖8 本地翻頁或切換文檔流程 
  1. UI調(diào)用tsdk_doc_share_set_current_page()接口進(jìn)行本地翻頁或切換文檔操作,是否同步設(shè)置標(biāo)識(shí)參數(shù)is_sync設(shè)置為FALSE。
  2. SDK向UI上報(bào)當(dāng)前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE。
  3. 所有與會(huì)者側(cè)SDK向UI上報(bào)文檔界面數(shù)據(jù)通知消息TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY。
  4. UI調(diào)用tsdk_doc_share_get_surface_bmp()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

 

同步服務(wù)器頁面

圖9 同步服務(wù)器頁面流程 
  1. UI調(diào)用tsdk_doc_share_get_syn_document_info()接口獲取服務(wù)器上的當(dāng)前共享頁面信息。
    說明: 

    通過此接口獲取當(dāng)前共享頁面信息,并通過后繼步驟2至步驟5保證觀看端頁面的立即更新。

    代碼示例:
    //c code 
    TSDK_S_DOC_PAGE_DETAIL_INFO info;
    service_data_conf_ds_share_get_syn_document_info(&info);
    m_docId = info.doc_page_info.document_id;
    m_pageNum = info.doc_page_info.page_index;
    
    int service_data_conf_ds_share_get_syn_document_info(TSDK_S_DOC_PAGE_DETAIL_INFO* sync_info)
    {
        TSDK_RESULT ret;
        ret = tsdk_doc_share_get_syn_document_info(confHandle,TSDK_E_COMPONENT_DS,sync_info);
        if (TSDK_SUCCESS != ret)
        {
            LOG_D_CALL_ERROR("get syn document info failed. result=%#x", ret);
            return -1;
        }
        return TSDK_SUCCESS;
    }
    
     
  2. UI調(diào)用tsdk_doc_share_set_current_page()接口設(shè)置當(dāng)前頁面(相關(guān)參數(shù)通過“步驟1獲?。?,是否同步設(shè)置標(biāo)識(shí)參數(shù)is_sync設(shè)置為FALSE。
    代碼示例:
    //c code 
    TSDK_RESULT ret;
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    page_info.component_id = TSDK_E_COMPONENT_DS;
    page_info.document_id = docId;
    page_info.page_index = pageIndex;
    ret = tsdk_doc_share_set_current_page(confHandle,&page_info,isSyn);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("set current page failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  3. SDK向UI上報(bào)當(dāng)前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE。
  4. 所有與會(huì)者側(cè)SDK向UI上報(bào)文檔界面數(shù)據(jù)通知消息TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY。
  5. UI調(diào)用tsdk_doc_share_get_surface_bmp()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

注意事項(xiàng)

無。

白板共享

描述

會(huì)議過程中,與會(huì)者通過白板與其他與會(huì)者進(jìn)行交流。

說明: 

使用白板必然需要使用標(biāo)注功能,因標(biāo)注功能相對(duì)較獨(dú)立,且可以在多個(gè)業(yè)務(wù)場景下使用,所以本章節(jié)僅描述對(duì)白板文檔和頁面的管理操作,標(biāo)注相關(guān)操作參見“標(biāo)注”章節(jié)描述。

  1. 加入數(shù)據(jù)會(huì)議成功。
  2. 加載白板共享模塊成功。

業(yè)務(wù)流程

新建白板

圖10 新建白板流程 
  1. 共享側(cè)UI調(diào)用tsdk_whiteboard_new_document()接口新建一個(gè)空的白板文檔,接口出參返回白板文檔的ID,用于后繼白板操作。
    說明: 

    SDK并未對(duì)接口tsdk_whiteboard_new_document()的調(diào)用者進(jìn)行與角色限制,實(shí)際應(yīng)用場景中,建議應(yīng)用程序UI僅對(duì)主講人或桌面共享權(quán)限所有者提供“共享白板”入口,以減少不必要的交互。

    代碼示例:
    //c code
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    unsigned int* doc_id;
    
    /*Step 1:[Must]Create a new empty whiteboard document */
    result = tsdk_whiteboard_new_document(conf_handle,doc_id);
    if(TSDK_SUCCESS != result)
    {
        LOG_D_DATA_CONF_ERROR("Create a new empty whiteboard document failed. result=%#x", result);
        return SERVICE_E_WHITE_BOARD_SHARE_CREATE_NEW_FAILED;
    }
    
     
  2. 共享側(cè)和觀看側(cè)SDK向UI上報(bào)通知消息TSDK_E_CONF_EVT_WB_DOC_NEW,對(duì)于共享側(cè)表示新建一個(gè)白板成功,對(duì)于觀看側(cè)表示下載到一個(gè)白板頭。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_WB_DOC_NEW:
    {
        /*Create a new whiteboard document, all attendees can receive this message*/
        service_handle_data_conf_whiteboard_doc_new_evt(conf_handle, type, value1, value2, data, size);
        break;
    }
    
    /**
    * @brief Create a new whiteboard document, all attendees can receive this message
    *
    * @param [in] unsigned int conf_handle  data conference handle
    * @param [in] int type                  callback message type
    * @param [in] unsigned int value1       document ID
    * @param [in] unsigned int value2       Document new ID
    * @param [in] void* data                NULL
    * @param [in] int size                  NULL
    * @retval void
    *
    * @attention: NA
    **/
    void service_handle_data_conf_whiteboard_doc_new_evt(unsigned int conf_handle, int type, unsigned int value1, unsigned int value2, void *data, int size)
    {
        LOG_D_DATA_CONF_INFO("service_handle_data_conf_whiteboard_doc_new_evt");
    
        (void)service_data_conf_notify_to_ui_proc(conf_handle, SERVICE_E_DATA_CONF_EVT_WB_DOC_NEW, value1, value2, NULL, NULL);
    
        return;
    }
    
     
  3. 共享側(cè)UI調(diào)用tsdk_doc_share_set_current_page()設(shè)置當(dāng)前要顯示的白板。
    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    page_info.component_id = TSDK_E_COMPONENT_WB;
    page_info.document_id = current_document_id ;
    page_info.page_index = current_page_index ;
    
    /*Switch document or whiteboard page*/ 
    result = tsdk_doc_share_set_current_page(conf_handle, &page_info, true); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Switch document or whiteboard page failed. result=%#x", result); 
        return SERVICE_E_DOCUMENT_SHARE_SWITCH_FAILED; 
    }
    
     
  4. 共享側(cè)SDK向UI上報(bào)當(dāng)前白板頁面變化通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE;所有觀看側(cè)SDK向UI上報(bào)收到同步翻頁指示通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE_IND,UI自動(dòng)同步設(shè)置白板頁。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE:
    {
        /*Notify UI*/
    }break;
    
    case TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE_IND:
    {
        /*Notify UI*/
    }break;
    
     
  5. 觀看側(cè)UI調(diào)用tsdk_doc_share_set_current_page()接口進(jìn)行操作,是否同步設(shè)置標(biāo)識(shí)參數(shù)sync設(shè)置為false。
  6. 觀看側(cè)SDK向UI上報(bào)當(dāng)前文檔頁面變化通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE。
說明: 

共享側(cè)UI在完成空白白板創(chuàng)建后,應(yīng)該自動(dòng)新建第一個(gè)白板頁面,以減少不必要的用戶交互,提升用戶體驗(yàn)。后繼處理過程參見“新建白板頁”描述。

新建白板頁

圖11 新建白板頁流程 

 

  1. 共享側(cè)UI調(diào)用tsdk_whiteboard_new_page()接口在指定的白板文檔中新建一個(gè)空的白板頁,接口出參返回新建的白板頁ID,用于后繼白板頁操作。
    代碼示例:
    //c code
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    
    /*Step 1:[Must]Create a new page*/
    result = tsdk_whiteboard_new_page(conf_handle, doc_id, page_width, page_height, page_id);
    if(TSDK_SUCCESS != result)
    {
        LOG_D_DATA_CONF_ERROR("Create a new page in specified whiteboard document failed. result=%#x", result);
        return SERVICE_E_WHITE_BOARD_SHARE_CREATE_NEW_PAGE_FAILED;
    }
    
     
  2. 共享側(cè)和觀看側(cè)SDK向UI上報(bào)通知消息TSDK_E_CONF_EVT_WB_PAGE_NEW,對(duì)于共享側(cè)表示新建一個(gè)白板頁成功,對(duì)于觀看側(cè)表示下載到一個(gè)白板頁。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_WB_PAGE_NEW:
    {
        /*Create a new whiteboard document, all attendees can receive this message*/
        service_handle_data_conf_whiteboard_doc_new_evt(conf_handle, type, value1, value2, data, size);
        break;
    }
    
    /**
    * @brief Create a new whiteboard document, all attendees can receive this message
    *
    * @param [in] unsigned int conf_handle data conference handle
    * @param [in] int type                 callback message type
    * @param [in] unsigned int value1      document ID
    * @param [in] unsigned int value2      Document new ID
    * @param [in] void* data               NULL
    * @param [in] int size                 NULL
    * @retval void
    *
    * @attention: NA
    **/
    void service_handle_data_conf_whiteboard_doc_new_evt(unsigned int conf_handle, int type, unsigned int value1, unsigned int value2, void *data, int size)
    {
        LOG_D_DATA_CONF_INFO("service_handle_data_conf_whiteboard_doc_new_evt");
    
        (void)service_data_conf_notify_to_ui_proc(conf_handle, SERVICE_E_DATA_CONF_EVT_WB_DOC_NEW, value1, value2, NULL, NULL);
    
        return;
    }
    
     
  3. 共享側(cè)UI調(diào)用tsdk_doc_share_set_current_page()設(shè)置當(dāng)前要顯示的白板頁,是否同步設(shè)置標(biāo)識(shí)參數(shù)is_sync設(shè)置為true。
    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    page_info.component_id = TSDK_E_COMPONENT_WB;
    page_info.document_id = current_document_id ;
    page_info.page_index = current_page_index ;
    
    /*Switch document or whiteboard page*/ 
    result = tsdk_doc_share_set_current_page(conf_handle, &page_info, true); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Switch document or whiteboard page failed. result=%#x", result); 
        return SERVICE_E_DOCUMENT_SHARE_SWITCH_FAILED; 
    }
    
     
  4. 共享側(cè)SDK向UI上報(bào)當(dāng)前白板頁面變化通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE;所有觀看側(cè)SDK向UI上報(bào)收到同步翻頁指示通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE_IND,UI自動(dòng)同步設(shè)置白板頁。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE:
    {
        /*Notify UI*/
    }break
    
    case TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE_IND:
    {
        /*Notify UI*/
    }break
    
     
  5. 觀看側(cè)UI調(diào)用tsdk_doc_share_set_current_page()接口進(jìn)行操作,是否同步設(shè)置標(biāo)識(shí)參數(shù)sync設(shè)置為false。
  6. 觀看側(cè)SDK向UI上報(bào)當(dāng)前白板頁面變化通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE:
    {
        /*Current page is turned, all attendees can receive this message*/
        service_handle_data_conf_whiteboard_turn_page_evt(conf_handle, type, value1, value2, data, size);
        break;
    }
    
    /**
    * @brief Current page is turned, all attendees can receive this message
    *
    * @param [in] unsigned int conf_handle  data conference handle
    * @param [in] int type                  callback message type
    * @param [in] unsigned int value1       document ID
    * @param [in] unsigned int value2       page ID
    * @param [in] void* data                NULL
    * @param [in] int size                  NULL
    * @retval void
    *
    * @attention: NA
    **/
    void service_handle_data_conf_whiteboard_turn_page_evt(unsigned int conf_handle, int type, unsigned int value1, unsigned int value2, void *data, int size)
    {
        LOG_D_DATA_CONF_INFO("service_handle_data_conf_whiteboard_turn_page_evt");
    
        (void)service_data_conf_notify_to_ui_proc(conf_handle, SERVICE_E_DATA_CONF_EVT_WB_CURRENT_PAGE, value1, value2, NULL, NULL);
    
        return;
    }
    
     
  7. 所有與會(huì)者側(cè)SDK向UI上報(bào)白板界面數(shù)據(jù)通知消息TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

    此通知消息在共享過程中白板頁面發(fā)生變更時(shí)就會(huì)上報(bào)。

    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY:
    {
        /*UI update notification, all attendees can receive this message*/
        service_handle_data_conf_whiteboard_on_draw_data(conf_handle, type, value1, value2, data, size);
        break;
    }
    
    /**
    * @brief UI update notification, all attendees can receive this message
    *
    * @param [in] unsigned int conf_handle  data conference handle
    * @param [in] int type                  callback message type
    * @param [in] unsigned int value1       document ID
    * @param [in] unsigned int value2       page ID
    * @param [in] void* data                NULL
    * @param [in] int size                  NULL
    * @retval void
    *
    * @attention: NA
    **/
    void service_handle_data_conf_whiteboard_on_draw_data(unsigned int conf_handle, int type, unsigned int value1, unsigned int value2, void *data, int size)
    {
        LOG_D_DATA_CONF_INFO("service_handle_data_conf_whiteboard_on_draw_data");
    
        (void)service_data_conf_notify_to_ui_proc(conf_handle, SERVICE_E_DATA_CONF_EVT_WB_DRAW_DATA_NOTIFY, value1, value2, NULL, NULL);
    
        return;
    }
    
     
  8. UI調(diào)用tsdk_doc_share_get_surface_bmp()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。
    代碼示例:
    //c code 
    void* data = NULL;
    unsigned int conf_handle = get_data_conf_handle();
    unsigned int* width;
    unsigned int* height;
    
    /*Step 1:[Must]Get document and whiteboard page image data*/ 
    data = tsdk_doc_share_get_surface_bmp(conf_handle, TSDK_E_COMPONENT_WB, width, height); 
    if(NULL == data) 
    { 
        LOG_D_DATA_CONF_ERROR("Get document and whiteboard page image data failed"); 
        return NULL; 
    }
    
     

結(jié)束共享白板

圖12 結(jié)束共享白板流程 
  1. 共享側(cè)UI調(diào)用tsdk_whiteboard_delete_document()接口關(guān)閉正在共享的白板。
  2. 共享側(cè)和觀看側(cè)SDK向UI上報(bào)白板文檔被刪除通知消息TSDK_E_CONF_EVT_WB_DOC_DEL,UI關(guān)閉白板共享顯示窗口。
    代碼示例:
    case TSDK_E_CONF_EVT_WB_DOC_DEL:
    {
        /*Delete a whiteboard document, all attendees can receive this message*/
        service_handle_data_conf_whiteboard_doc_del_evt(conf_handle, type, value1, value2, data, size);
                break;
    }
    
    /**
     * @brief Delete a whiteboard document, all attendees can receive this message
     * 
     * @param [in] unsigned int conf_handle         data conference handle
     * @param [in] int type                         callback message type   
     * @param [in] unsigned int value1              document ID
     * @param [in] unsigned int value2              0
     * @param [in] void* data                       NULL
     * @param [in] int size                         NULL
     * @retval void
     * 
     * @attention: NA
     **/
    void service_handle_data_conf_whiteboard_doc_del_evt(unsigned int conf_handle, 
                                                         int type, 
                                                         unsigned int value1, 
                                                         unsigned int value2, 
                                                         void *data, 
                                                         int size)
    {
        LOG_D_DATA_CONF_INFO("service_handle_data_conf_whiteboard_doc_del_evt");
    
        (void)service_data_conf_notify_to_ui_proc(conf_handle, SERVICE_E_DATA_CONF_EVT_WB_DOC_DEL, value1, value2, NULL, NULL);
    
        return;
    }
    
     

注意事項(xiàng)

無。

創(chuàng)建標(biāo)注

描述

在文檔共享或白板共享中,與會(huì)者間可以通過標(biāo)注功能在共享界面進(jìn)行遠(yuǎn)程交流。

  1. 加入數(shù)據(jù)會(huì)議成功。
  2. 加載相關(guān)模塊成功。

業(yè)務(wù)流程

設(shè)置畫筆和畫刷

圖13 設(shè)置畫筆和畫刷流程 
說明: 
  1. 啟用標(biāo)注功能后,可以設(shè)置畫筆和畫刷的屬性,畫筆屬性會(huì)影響標(biāo)注線條的顏色、寬度和類型;畫刷屬性會(huì)影響填充的顏色等;
  2. 設(shè)置畫筆和畫刷后,所有新創(chuàng)建的TSDK_E_ANNOTATION_DRAWING類型標(biāo)注都會(huì)使用新的畫筆和畫刷,舊的標(biāo)注不受影響。
  1. UI調(diào)用tsdk_annotation_set_pen()接口設(shè)置畫筆屬性,設(shè)置時(shí)指定當(dāng)前共享的組件ID、畫筆類型和畫筆屬性。
    說明: 
    1. 因僅屏幕共享、文檔共享和白板共享支持標(biāo)注功能,所以組件ID僅支持對(duì)應(yīng)的組件ID;
    2. 此接口可以返回原畫筆的屬性,在應(yīng)用層需要記錄原畫筆屬性時(shí),此接口的最后一個(gè)參數(shù)應(yīng)非空。
    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_ANNOTATION_PEN_INFO new_pen_info = {0};
    TSDK_S_ANNOTATION_PEN_INFO old_pen_info = {0};
    TSDK_E_ANNOTATION_PEN_TYPE pen_type = TSDK_E_ANNOTATION_PEN_NORMAL;
    
    /*tup_pen_info comes from UI*/
    new_pen_info.style = TSDK_E_ANNOTATION_PEN_STYLE_SOLID;
    new_pen_info.color = 0xFFFFFFAA; //0xRRGGBBAA
    new_pen_info.width = 1;
    
    /*Set pen information*/ 
    result = tsdk_annotation_set_pen(conf_handle, TSDK_E_COMPONENT_WB, pen_type, &new_pen_info, &old_pen_info ); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Set pen information failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_SET_PEN_FAILED; 
    }
    
     
  2. UI調(diào)用tsdk_annotation_set_brush()接口設(shè)置畫刷屬性,設(shè)置時(shí)指定當(dāng)前共享的組件ID,畫刷屬性。
    說明: 
    1. 當(dāng)前僅文檔共享和白板共享支持標(biāo)注功能,所以組件ID僅支持對(duì)應(yīng)的組件ID;
    2. 此接口可以返回原畫刷的屬性,在應(yīng)用層需要記錄原畫刷屬性時(shí),此接口的最后一個(gè)參數(shù)應(yīng)非空。
    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    
    TSDK_S_ANNOTATION_BRUSH_INFO new_brush_info = {0};
    TSDK_S_ANNOTATION_BRUSH_INFO old_brush_info = {0};
    
    /*the information of brush comes from UI*/
    new_brush_info.style = TSDK_E_ANNOTATION_BRUSH_SOLID;
    new_brush_info.color = 0xFFFFFFAA; //0xRRGGBBAA
    
    /*Set paint brush information*/ 
    result = tup_conf_annotation_set_brush(conf_handle, TSDK_E_COMPONENT_WB, &new_brush_info, &old_brush_info); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Set paint brush information failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_SET_BRUSH_FAILED; 
    }
    
     

 

創(chuàng)建幾何標(biāo)注

圖14 創(chuàng)建幾何標(biāo)注流程 
  1. UI調(diào)用tsdk_annotation_create_start()接口開始創(chuàng)建標(biāo)注,標(biāo)注類型為TSDK_E_ANNOTATION_DRAWING。
    說明: 
    1. 屏幕共享過程中、僅具備標(biāo)注權(quán)限的與會(huì)者可以進(jìn)行標(biāo)注操作;文檔共享和白板共享過程中,所有與會(huì)者均有標(biāo)注權(quán)限進(jìn)行標(biāo)注操作。應(yīng)用程序界面應(yīng)該根據(jù)當(dāng)前共享狀態(tài)和權(quán)限給用戶提供標(biāo)注入口;
    2. 創(chuàng)建標(biāo)注的接口中用到的坐標(biāo)都是相對(duì)于頁面左上角的TWIPS單位坐標(biāo),向右向下為正。
    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    TC_POINT tup_start_point = {0};
    
    /*Start to create annotation*/ 
    result = tsdk_annotation_create_start(conf_handle, TSDK_E_ANNOTATION_DRAWING, document_id, page_id, type, DS_ANNOTDRAWING_TYPE_FREEHAND, tup_start_point); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Start to create annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_START_CREATE_FAILED; 
    }
    
     
  2. UI定時(shí)循環(huán)調(diào)用tsdk_annotation_create_update()接口在創(chuàng)建過程中更新數(shù)據(jù)。
    說明: 

    應(yīng)用程序界面應(yīng)在創(chuàng)建標(biāo)注過程中啟動(dòng)周期定時(shí)器,在檢查到鼠標(biāo)位置變化時(shí)調(diào)用此接口更新數(shù)據(jù),以呈現(xiàn)更優(yōu)的交互體驗(yàn)。

    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    CreateDrawingData data = {0};
    
    /*Upodate annotation data*/ 
    result = tsdk_annotation_create_update(conf_handle, TSDK_E_ANNOTATION_DRAWING, (void*)&data); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Upodate annotation data failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_UPDATE_FAILED; 
    }
    
     
  3. UI調(diào)用tsdk_annotation_create_done()接口完成標(biāo)注創(chuàng)建。
    說明: 

    若完成標(biāo)注創(chuàng)建,則此接口的第三個(gè)參數(shù)應(yīng)設(shè)置為0,否則設(shè)置為1。

    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    
    /*Finish creating annotation*/ 
    result = tsdk_annotation_create_done(conf_handle, TSDK_E_COMPONENT_WB, false, NULL); 
    if(TSDK_SUCCESS!= result) 
    { 
        LOG_D_DATA_CONF_ERROR("Finish creating annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_CREATE_FINISH_FAILED; 
    }
    
     
  4. 其他與會(huì)者側(cè)SDK向UI上報(bào)數(shù)據(jù)更新消息,屏幕共享時(shí)上報(bào)TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時(shí)上報(bào)TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時(shí)上報(bào)TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

    實(shí)際上,在標(biāo)注創(chuàng)建過程中,每次數(shù)據(jù)更新之后都會(huì)收到相應(yīng)的數(shù)據(jù)更新通知,當(dāng)前因流程圖限制,僅呈現(xiàn)在標(biāo)注創(chuàng)建完成后收到數(shù)據(jù)更新通知消息。

  5. UI調(diào)用tsdk_doc_share_get_surface_bmp()/tsdk_app_share_get_screen_data()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

 

創(chuàng)建文字標(biāo)注

圖15 創(chuàng)建文字標(biāo)注流程 
  1. 與會(huì)者在共享界面創(chuàng)建文本框并完成文字輸入,UI調(diào)用tsdk_annotation_text_create()接口完成文字標(biāo)注創(chuàng)建。
    說明: 

    “文字標(biāo)注”與“幾何標(biāo)注”體驗(yàn)不同,其他與會(huì)者只有在“文字標(biāo)注”創(chuàng)建者完成標(biāo)注創(chuàng)建后才會(huì)顯示標(biāo)注內(nèi)容,即看不到文字的輸入過程。

    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    tsdk_memset_s(&page_info, sizeof(TSDK_S_DOC_PAGE_BASE_INFO), 0, sizeof(TSDK_S_DOC_PAGE_BASE_INFO));
    TSDK_S_ANNOTATION_TEXT_INFO text_info;
    tsdk_memset_s(&text_info, sizeof(TSDK_S_ANNOTATION_TEXT_INFO), 0, sizeof(TSDK_S_ANNOTATION_TEXT_INFO));
    TSDK_UINT32 annotation_id = 0;
    /*Create text annotation*/ 
    result = tsdk_annotation_text_create(conf_handle, &page_info, &text_info, page_id, &tup_anno_text_info, &annotation_id ); 
    if(TSDK_SUCCESS!= result) 
    { 
        LOG_D_DATA_CONF_ERROR("Create text annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_TEXT_CREATE_FAILED; 
    }
    
     
  2. 其他與會(huì)者側(cè)SDK向UI上報(bào)數(shù)據(jù)更新消息,屏幕共享時(shí)上報(bào)TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時(shí)上報(bào)TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時(shí)上報(bào)TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

    實(shí)際上,在標(biāo)注創(chuàng)建過程中,每次數(shù)據(jù)更新之后都會(huì)收到相應(yīng)的數(shù)據(jù)更新通知,當(dāng)前因流程圖限制,僅呈現(xiàn)在標(biāo)注創(chuàng)建完成后收到數(shù)據(jù)更新通知消息。

  3. UI調(diào)用tsdk_doc_share_get_surface_bmp()/tsdk_app_share_get_screen_data()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

 

編輯文字標(biāo)注

說明: 

與會(huì)者在文字標(biāo)注創(chuàng)建完成后,可以進(jìn)行編輯操作。

  1. UI調(diào)用tsdk_annotation_text_get_info()接口獲取文字標(biāo)注的信息。
    說明: 

    此接口所需的文字標(biāo)注ID通過“編輯標(biāo)注”中的“選中標(biāo)注”流程獲取。

    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    tsdk_memset_s(&page_info, sizeof(TSDK_S_DOC_PAGE_BASE_INFO), 0, sizeof(TSDK_S_DOC_PAGE_BASE_INFO));
    TSDK_S_ANNOTATION_TEXT_INFO text_info;
    tsdk_memset_s(&text_info, sizeof(TSDK_S_ANNOTATION_TEXT_INFO), 0, sizeof(TSDK_S_ANNOTATION_TEXT_INFO));
    TSDK_UINT32 annotation_id = 0;
    
    /*Get text information of the specified annotation*/ 
    result = tsdk_annotation_text_get_info(conf_handle, &page_info, annotation_id, &text_info); 
    if(TSDK_SUCCESS!= result) 
    { 
        LOG_D_DATA_CONF_ERROR("Get text information of the specified annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_GET_TEXT_INFO_FAILED; 
    }
    
     
  2. 與會(huì)者在文本框并完成標(biāo)注文字編輯,UI調(diào)用tsdk_annotation_text_update()接口完成標(biāo)注更新。
    代碼示例:
    //c code 
    TSDK_RESULT  result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    tsdk_memset_s(&page_info, sizeof(TSDK_S_DOC_PAGE_BASE_INFO), 0, sizeof(TSDK_S_DOC_PAGE_BASE_INFO));
    TSDK_S_ANNOTATION_TEXT_INFO text_info;
    tsdk_memset_s(&text_info, sizeof(TSDK_S_ANNOTATION_TEXT_INFO), 0, sizeof(TSDK_S_ANNOTATION_TEXT_INFO));
    TSDK_UINT32 annotation_id = 0;
    TSDK_BOOL is_redraw = 0;
    
    /*Create text annotation*/ 
    result = tsdk_annotation_text_update(conf_handle, &page_info, annotation_id , &text_info, is_redraw); 
    if(TSDK_SUCCESS!= result) 
    { 
        LOG_D_DATA_CONF_ERROR("Update text annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_UPDATE_TEXT_INFO_FAILED; 
    }
    
     

注意事項(xiàng)

無。

編輯標(biāo)注

描述

在屏幕共享、文檔共享或白板共享中,與會(huì)者可以對(duì)共享過程中創(chuàng)建的標(biāo)注進(jìn)行選中、編輯或刪除操作。

前提條件:

  1. 加入數(shù)據(jù)會(huì)議成功。
  2. 加載相關(guān)模塊成功。

業(yè)務(wù)流程

選中標(biāo)注

圖16 選中標(biāo)注流程 
  1. UI調(diào)用tsdk_annotation_hit_test_point()接口檢測指定坐標(biāo)點(diǎn)是否存在標(biāo)注,或調(diào)用tsdk_annotation_hit_test_rect()接口檢測指定矩形區(qū)域是否存在標(biāo)注。

     

    代碼示例:
    //c code 
    TSDK_RESULT  result = 0;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_ANNOTATION_HIT_TEST_POINT_INFO hit_test_point_info;
    tsdk_memset_s(&hit_test_point_info, sizeof(TSDK_S_ANNOTATION_HIT_TEST_POINT_INFO), 0, sizeof(TSDK_S_ANNOTATION_HIT_TEST_POINT_INFO));
    TSDK_UINT32 select_annotation_id = 0;
    TSDK_E_ANNOTATION_HIT_TEST_CODE hit_test_code = TSDK_E_ANNOTATION_HIT_TEST_BUTT;
    TSDK_UINT32 annotation_type = 0;
    
    /*Test whether a point falls on the annotation*/ 
    result = tsdk_annotation_hit_test_point(conf_handle, &hit_test_point_info, select_annotation_id, hit_test_code , annotation_type ); 
    if(TSDK_SUCCESS  != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Test whether a point falls on the annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_TEST_POINT_FAILED; 
    } 
     
    TSDK_UINT32 count = 0;
    TSDK_UINT32* annotation_id_list = 0;
    /*Test annotation in a rect*/ 
    result = tsdk_annotation_hit_test_rect(conf_handle, &hit_test_point_info, &annotation_id_list , &count ); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Test annotation in a rect failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_TEST_IN_RECT_FAILED; 
    }
    
     

     

  2. UI調(diào)用tsdk_annotation_set_select()接口將步驟1中的標(biāo)注設(shè)置為選中狀態(tài)。

     

    說明: 

    設(shè)置選中狀態(tài),可以設(shè)置為選中狀態(tài)或非選中狀態(tài),可以設(shè)置立刻刷新界面或不刷新界面。設(shè)置為立即刷新時(shí),若為選中狀態(tài),界面會(huì)收到數(shù)據(jù)更新的通知,被選中的標(biāo)注邊框上會(huì)多出8個(gè)選中框;若為非選中狀態(tài)后,邊框消失。該接口只會(huì)對(duì)自己的界面產(chǎn)生影響,不會(huì)影響其他與會(huì)者。

    代碼示例:
    //c code 
    TSDK_RESULT result = 0;
    unsigned int conf_handle = get_data_conf_handle()
    TSDK_S_ANNOTATION_SELECT_INFO select_info;
    tsdk_memset_s(&select_info, sizeof(TSDK_S_ANNOTATION_SELECT_INFO), 0, sizeof(TSDK_S_ANNOTATION_SELECT_INFO));
    /*Test annotation in a rect*/ 
    result = tsdk_annotation_set_select(conf_handle, &select_info, is_redraw); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Set annotation status failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_SET_STATUS_FAILED; 
    }
    
     

     

  3. 選中操作側(cè)SDK向UI上報(bào)數(shù)據(jù)更新消息,屏幕共享時(shí)上報(bào)TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時(shí)上報(bào)TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時(shí)上報(bào)TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
  4. UI調(diào)用tsdk_doc_share_get_surface_bmp()/tsdk_app_share_get_screen_data()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

 

編輯標(biāo)注

圖17 編輯標(biāo)注流程 
說明: 

標(biāo)注被選中后,與會(huì)者可以進(jìn)行拖動(dòng)或拉伸,以改變標(biāo)注的位置或形狀。

  1. UI調(diào)用tsdk_annotation_edit_start()接口開始編輯標(biāo)注。
    說明: 

    此接口可以對(duì)選中的多個(gè)標(biāo)注同時(shí)開始編輯,編輯過程中,被選中的標(biāo)注會(huì)一同被移動(dòng)或被拉伸。

    代碼示例:
    //c code 
    TUP_RESULT result = TUP_FAIL;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_DOC_PAGE_BASE_INFO page_info;
    tsdk_memset_s(&page_info, sizeof(TSDK_S_DOC_PAGE_BASE_INFO), 0, sizeof(TSDK_S_DOC_PAGE_BASE_INFO));
    TC_POINT tup_point_info = {0};
    
    /*Start to edit the annotation*/ 
    result = tsdk_annotation_edit_start(conf_handle, IID_COMPONENT_WB, document_id, page_id, annotation_id, count, current_anno_id, (DS_HITTEST_CODE)edit_type, tup_point_info); 
    if(TC_OK != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Start to edit the annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_EDIT_START_FAILED; 
    }
    
     
  2. UI定時(shí)循環(huán)調(diào)用tsdk_annotation_edit_update()接口在編輯過程中更新數(shù)據(jù)。
    說明: 

    應(yīng)用程序界面應(yīng)在編輯標(biāo)注過程中啟動(dòng)周期定時(shí)器,在檢查到鼠標(biāo)位置變化時(shí)調(diào)用此接口更新數(shù)據(jù),以呈現(xiàn)更優(yōu)的交互體驗(yàn)。

    代碼示例:
    //c code 
    TSDK_RESULT result = TUP_FAIL;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_POINT current_point;
    tsdk_memset_s(&current_point, sizeof(TSDK_S_POINT), 0, sizeof(TSDK_S_POINT));
    TSDK_E_COMPONENT_ID component_id;
    
    /*Update the annotation*/ 
    result = tsdk_annotation_edit_update(conf_handle, component_id, &current_point); 
    if(TC_OK != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Update the annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_EDIT_UPDATE_FAILED; 
    }
    
     
  3. UI調(diào)用tsdk_annotation_edit_done()接口完成標(biāo)注編輯。
    說明: 

    若完成標(biāo)注編輯,則此接口的第三個(gè)參數(shù)應(yīng)設(shè)置為0,否則設(shè)置為1。

    代碼示例:
    //c code 
    TSDK_RESULT result = TUP_FAIL;
    unsigned int conf_handle = get_data_conf_handle();
    
    /*Finish creating annotation*/ 
    result = tsdk_annotation_edit_done(conf_handle, TSDK_E_COMPONENT_WB, is_cancel); 
    if(TC_OK != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Finish creating annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_CREATE_FINISH_FAILED; 
    }
    
     
  4. 其他與會(huì)者側(cè)SDK向UI上報(bào)數(shù)據(jù)更新消息,屏幕共享時(shí)上報(bào)TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時(shí)上報(bào)TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時(shí)上報(bào)TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

    實(shí)際上,在標(biāo)注編輯過程中,每次數(shù)據(jù)更新之后都會(huì)收到相應(yīng)的數(shù)據(jù)更新通知,當(dāng)前因流程圖限制,僅呈現(xiàn)在標(biāo)注編輯完成后收到數(shù)據(jù)更新通知消息。

  5. UI調(diào)用tsdk_doc_share_get_surface_bmp()/tsdk_app_share_get_screen_data()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

 

刪除標(biāo)注

圖18 刪除標(biāo)注流程 
  1. UI調(diào)用tsdk_annotation_delete_annotation()接口刪除標(biāo)注。
    說明: 

    此接口可以對(duì)選中的多個(gè)標(biāo)注同時(shí)開始刪除,應(yīng)用程序也可以實(shí)現(xiàn)對(duì)標(biāo)注ID的記錄管理,給用戶提供刪除“自己創(chuàng)建的標(biāo)注”、“其他人創(chuàng)建的標(biāo)注”和“所有標(biāo)注”功能入口。

    代碼示例:
    //c code 
    TSDK_RESULT result;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_ANNOTATION_DELETE_INFO delete_info;
    tsdk_memset_s(&delete_info, sizeof(TSDK_S_ANNOTATION_DELETE_INFO), 0, sizeof(TSDK_S_ANNOTATION_DELETE_INFO));
    
    /*Delete the annotation*/ 
    result = tsdk_annotation_delete_annotation(conf_handle, &delete_info); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Delete the annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_DELETE_FAILED; 
    }
    
     
  2. 其他與會(huì)者側(cè)SDK向UI上報(bào)數(shù)據(jù)更新消息,屏幕共享時(shí)上報(bào)TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時(shí)上報(bào)TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時(shí)上報(bào)TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
  3. UI調(diào)用tsdk_doc_share_get_surface_bmp()/tsdk_app_share_get_screen_data()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

注意事項(xiàng)

無。

操作激光點(diǎn)

描述

會(huì)議過程中,與會(huì)者進(jìn)行激光點(diǎn)的開啟、移動(dòng)和停止操作。

前提條件:

  1. 加入數(shù)據(jù)會(huì)議成功。
  2. 加載相關(guān)模塊成功。

業(yè)務(wù)流程

圖19 操作激光點(diǎn)流程 
  1. UI調(diào)用tsdk_annotation_laser_pointer_start()接口開啟激光點(diǎn)。
    說明: 

    開啟激光的接口中用到的坐標(biāo)都是相對(duì)于頁面左上角的TWIPS單位坐標(biāo),向右向下為正。

    代碼示例:
    //c code 
    TSDK_RESULT result; 
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_ANNOTATION_LASER_POINTER_INFO laser_pointer_info;
    tsdk_memset_s(&laser_pointer_info,sizeof(TSDK_S_ANNOTATION_LASER_POINTER_INFO),0,sizeof(TSDK_S_ANNOTATION_LASER_POINTER_INFO));
    
    /*Start to use laser point in annotation.*/ 
    result = tsdk_annotation_laser_pointer_start(conf_handle, TSDK_E_COMPONENT_WB,&laser_pointer_info ); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Start to use laser pointer in annotation failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_START_LASER_POINTER_FAILED; 
    }
    
     
  2. UI定時(shí)循環(huán)調(diào)用tsdk_annotation_laser_pointer_moveto()接口在移動(dòng)激光點(diǎn)。
    說明: 

    應(yīng)用程序界面應(yīng)在移動(dòng)激光點(diǎn)過程中啟動(dòng)周期定時(shí)器,在檢查到鼠標(biāo)位置變化時(shí)調(diào)用此接口更新數(shù)據(jù),以呈現(xiàn)更優(yōu)的交互體驗(yàn)。

    代碼示例:
    //c code 
    TSDK_RESULT result;
    unsigned int conf_handle = get_data_conf_handle();
    TSDK_S_POINT point;
    tsdk_memset_s(&point, sizeof(TSDK_S_POINT), 0, sizeof(TSDK_S_POINT));
    
    /*Move the laser pointer to the destination.*/ 
    result = tsdk_annotation_laser_pointer_moveto(conf_handle, TSDK_E_COMPONENT_WB, &point); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Move the laser pointer failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_MOVE_LASER_POINTER_FAILED; 
    }
    
     
  3. UI調(diào)用tsdk_annotation_laser_pointer_stop()接口結(jié)束激光點(diǎn)操作,用戶只能結(jié)束自己的激光點(diǎn)。
    代碼示例:
    //c code 
    TSDK_RESULT result;
    unsigned int conf_handle = get_data_conf_handle();
    
    /*Stop the laser pointer.*/ 
    result = tsdk_annotation_laser_pointer_stop(conf_handle, TSDK_E_COMPONENT_WB); 
    if(TSDK_SUCCESS != result) 
    { 
        LOG_D_DATA_CONF_ERROR("Stop the laser pointer failed. result=%#x", result); 
        return SERVICE_E_SHARE_ANNOTATION_STOP_LASER_POINTER_FAILED; 
    }
    
     
  4. 其他與會(huì)者側(cè)SDK向UI上報(bào)數(shù)據(jù)更新消息,屏幕共享時(shí)上報(bào)TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時(shí)上報(bào)TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時(shí)上報(bào)TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

    實(shí)際上,在激光點(diǎn)移動(dòng)過程中,每次數(shù)據(jù)更新之后都會(huì)收到相應(yīng)的數(shù)據(jù)更新通知,當(dāng)前因流程圖限制,僅呈現(xiàn)在激光點(diǎn)結(jié)束后收到數(shù)據(jù)更新通知消息。

  5. UI調(diào)用tsdk_doc_share_get_surface_bmp()/tsdk_app_share_get_screen_data()接口獲取當(dāng)前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

注意事項(xiàng)

無。

聊天

描述

會(huì)議過程中,某一與會(huì)者可以發(fā)送即時(shí)消息給其他所有與會(huì)者。

  1. 入會(huì)成功。
  2. 加載即時(shí)消息模塊成功。

業(yè)務(wù)流程

圖20 發(fā)送和接收公共消息流程 
  1. UI調(diào)用接口tsdk_send_chat_msg_in_conference()接口在會(huì)議中發(fā)送公共即時(shí)消息。
    代碼示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_send_chat_msg_in_conference(confHandle, chatMsgInfo);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("send chat msg failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 會(huì)議中所有用戶(包括消息發(fā)送者)側(cè)SDK均收到消息通知,向UI上報(bào)TSDK_E_CONF_EVT_RECV_CHAT_MSG事件,UI顯示公共即時(shí)消息。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_RECV_CHAT_MSG:
    {
         /*Notify UI*/
    }
    
     

注意事項(xiàng)

當(dāng)前僅提供公共消息的開放能力。