台湾一级a毛片在线播放,黄色精品偷拍视频大全,精品一区二区在线欧美日韩,日本特黄一级视频播三级片,日韩美女18岁美女视频,偷偷操不一样的99,国产午夜激无码av毛片久

智慧服務,成就美好體驗 項目咨詢

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

入門使用

桌面協(xié)同與共享

更新時間:2019-12-10

開始和結束屏幕共享

描述

會議中,主講人和與會者可以進行屏幕共享或程序共享。

前提條件:

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

業(yè)務流程

主講人共享屏幕

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

    SDK并未對接口tsdk_app_share_set_owner的調用者進行與角色限制,但實際應用場景中,UI應該僅對主講人才提供主動“共享屏幕”入口。

    代碼示例:
    //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. 主講人側和其他與會者側SDK向UI上報共享權限擁有者變更通知消息TSDK_E_CONF_EVT_AS_OWNER_CHANGE,攜帶當前共享權限擁有者ID,UI刷新共享者信息。
    說明: 

    應用程序在擁有主講人身份時,收到此通知消息,UI應自動進行后繼開始“共享屏幕”的處理流程,而不需要用戶確認。

    代碼示例:
    //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調用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. 主講人側和其他與會者側SDK向UI上報屏幕共享狀態(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. 共享側SDK自動抓取屏幕數(shù)據(jù),由業(yè)務服務器發(fā)送給其他與會者,其他與會者側SDK向UI上報屏幕數(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調用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;
    
     

 

主講人邀請其他與會者共享屏幕

圖2 主講人邀請其他與會者共享屏幕流程 
  1. 主講人選擇邀請其他與會者共享屏幕,UI調用tsdk_app_share_set_owner()接口設置其他與會者為共享權限擁有者。
    說明: 

    SDK并未對接口tup_conf_as_set_owner的調用者進行與角色限制,但實際應用場景中,UI應該僅對主講人才提供“邀請其他與會者共享”入口;成功調用該接口后,原來擁有共享權限的用戶的共享權限會自動取消,正在進行的共享會停止。

    代碼示例:
    //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. 主講人側和其他與會者側SDK向UI上報共享權限擁有者變更通知消息TSDK_E_CONF_EVT_AS_OWNER_CHANGE,攜帶當前共享權限擁有者ID,UI刷新屏幕共享者信息。
    說明: 

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

    代碼示例:
    //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調用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;
    
     
    說明: 

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

 

共享者主動結束共享

圖3 共享者主動結束共享流程 
  1. UI調用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. 共享側和其他與會者側SDK向UI上報屏幕共享狀態(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. 共享側向UI調用tsdk_app_share_set_owner()釋放共享權限擁有者權限。
  4. 共享側和其他與會者側SDK向UI上報共享權限擁有者變更通知消息TSDK_E_CONF_EVT_AS_OWNER_CHANGE,攜帶當前共享權限擁有者ID,UI刷新屏幕共享者信息。

 

主講人結束共享者共享

圖4 主講人結束共享者共享流程 
  1. 主講人UI調用tsdk_app_share_set_owner()接口釋放當前共享者共享權限。
    代碼示例:
    //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. 共享側和其他與會者側SDK向UI上報共享權限擁有者變更通知消息TSDK_E_CONF_EVT_AS_OWNER_CHANGE,攜帶當前共享權限擁有者ID,UI刷新屏幕共享者信息。
  3. 共享側調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. 共享側和其他與會者側SDK向UI上報屏幕共享狀態(tài)變更通知消息TSDK_E_CONF_EVT_AS_STATE_CHANGE,UI刷新屏幕共享狀態(tài)信息。

注意事項

無。

文檔共享

描述

會議過程中,與會者可以打開一個文檔進行共享,以及關閉一個已經共享的文檔或者取消打開一個已經打開但未打開完成的文檔。

前提條件:

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

業(yè)務流程

打開共享文檔

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

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

    代碼示例:
    //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. 共享側SDK向UI上報開始加載文檔通知消息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. 共享側和觀看側SDK向UI上報通知消息TSDK_E_CONF_EVT_DS_DOC_NEW,對于共享側表示打開一個文檔成功,對于觀看側表示下載到一個文檔頭。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_NEW:
    {
         LOG_D_CALL_INFO("doc share new");
         break;
    }
    
     
  4. 共享側SDK向UI上報加載完成一頁通知消息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. 共享側和觀看側SDK向UI上報通知消息TSDK_E_CONF_EVT_DS_DOC_PAGE_NEW,對于共享側表示加載一頁成功,對于觀看側表示下載到一個頁頭。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_DS_DOC_PAGE_NEW:
    {	
         LOG_D_CALL_INFO("doc share page new");
         break;
    }
    
     
  6. 共享側SDK向UI上報文檔加載完成通知消息TSDK_E_CONF_EVT_DS_DOC_LOAD_FINISH。
    說明: 

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

    代碼示例:
    //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. 共享側UI調用tsdk_doc_share_set_current_page()設置當前要顯示的頁面。
    說明: 

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

    代碼示例:
    //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. 共享側SDK向UI上報當前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE;所有觀看側SDK向UI上報收到同步翻頁指示通知消息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;
    }
    
     
說明: 

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

關閉共享文檔

圖6 關閉共享文檔流程 
  1. 共享側UI調用tsdk_doc_share_close_document接口關閉正在共享文檔。

     

    代碼示例:
    //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. 觀看側SDK向UI上報刪除頁面通知消息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. 共享側和觀看側SDK向UI上報文檔被刪除通知消息TSDK_E_CONF_EVT_DS_DOC_DEL,UI關閉文檔共享顯示窗口。

     

    代碼示例:
    //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;
    }
    
     

     

注意事項

無。

切換文檔和頁面

描述

會議過程中,與會者在不同的文檔和不同的頁面之間切換,以觀看不同的內容。

前提條件:

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

業(yè)務流程

同步翻頁或切換文檔

圖7 同步翻頁或切換文檔流程 
  1. UI調用tsdk_doc_share_set_current_page()接口進行同步翻頁或切換文檔操作,是否同步設置標識參數(shù)is_sync設置為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ā)起操作側SDK向UI上報當前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE;所有觀看側SDK向UI上報收到同步翻頁指示通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE_IND。
  3. 若同步翻頁或切換文檔,觀看側UI調用tsdk_doc_share_set_current_page()接口操作,是否同步設置標識參數(shù)is_sync設置為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. 觀看側SDK向UI上報當前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE。
  5. 所有與會者側SDK向UI上報文檔界面數(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ā)生變更時就會上報。

  6. UI調用tsdk_doc_share_get_surface_bmp()接口獲取當前頁面圖像數(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調用tsdk_doc_share_set_current_page()接口進行本地翻頁或切換文檔操作,是否同步設置標識參數(shù)is_sync設置為FALSE。
  2. SDK向UI上報當前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE。
  3. 所有與會者側SDK向UI上報文檔界面數(shù)據(jù)通知消息TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY。
  4. UI調用tsdk_doc_share_get_surface_bmp()接口獲取當前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

 

同步服務器頁面

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

    通過此接口獲取當前共享頁面信息,并通過后繼步驟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調用tsdk_doc_share_set_current_page()接口設置當前頁面(相關參數(shù)通過“步驟1獲?。欠裢皆O置標識參數(shù)is_sync設置為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上報當前文檔頁面變化通知消息TSDK_E_CONF_EVT_DS_DOC_CURRENT_PAGE。
  4. 所有與會者側SDK向UI上報文檔界面數(shù)據(jù)通知消息TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY。
  5. UI調用tsdk_doc_share_get_surface_bmp()接口獲取當前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

注意事項

無。

白板共享

描述

會議過程中,與會者通過白板與其他與會者進行交流。

說明: 

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

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

業(yè)務流程

新建白板

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

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

    代碼示例:
    //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. 共享側和觀看側SDK向UI上報通知消息TSDK_E_CONF_EVT_WB_DOC_NEW,對于共享側表示新建一個白板成功,對于觀看側表示下載到一個白板頭。
    代碼示例:
    //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. 共享側UI調用tsdk_doc_share_set_current_page()設置當前要顯示的白板。
    代碼示例:
    //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. 共享側SDK向UI上報當前白板頁面變化通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE;所有觀看側SDK向UI上報收到同步翻頁指示通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE_IND,UI自動同步設置白板頁。
    代碼示例:
    //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. 觀看側UI調用tsdk_doc_share_set_current_page()接口進行操作,是否同步設置標識參數(shù)sync設置為false。
  6. 觀看側SDK向UI上報當前文檔頁面變化通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE。
說明: 

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

新建白板頁

圖11 新建白板頁流程 

 

  1. 共享側UI調用tsdk_whiteboard_new_page()接口在指定的白板文檔中新建一個空的白板頁,接口出參返回新建的白板頁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. 共享側和觀看側SDK向UI上報通知消息TSDK_E_CONF_EVT_WB_PAGE_NEW,對于共享側表示新建一個白板頁成功,對于觀看側表示下載到一個白板頁。
    代碼示例:
    //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. 共享側UI調用tsdk_doc_share_set_current_page()設置當前要顯示的白板頁,是否同步設置標識參數(shù)is_sync設置為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. 共享側SDK向UI上報當前白板頁面變化通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE;所有觀看側SDK向UI上報收到同步翻頁指示通知消息TSDK_E_CONF_EVT_WB_DOC_CURRENT_PAGE_IND,UI自動同步設置白板頁。
    代碼示例:
    //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. 觀看側UI調用tsdk_doc_share_set_current_page()接口進行操作,是否同步設置標識參數(shù)sync設置為false。
  6. 觀看側SDK向UI上報當前白板頁面變化通知消息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. 所有與會者側SDK向UI上報白板界面數(shù)據(jù)通知消息TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

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

    代碼示例:
    //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調用tsdk_doc_share_get_surface_bmp()接口獲取當前頁面圖像數(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; 
    }
    
     

結束共享白板

圖12 結束共享白板流程 
  1. 共享側UI調用tsdk_whiteboard_delete_document()接口關閉正在共享的白板。
  2. 共享側和觀看側SDK向UI上報白板文檔被刪除通知消息TSDK_E_CONF_EVT_WB_DOC_DEL,UI關閉白板共享顯示窗口。
    代碼示例:
    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;
    }
    
     

注意事項

無。

創(chuàng)建標注

描述

在文檔共享或白板共享中,與會者間可以通過標注功能在共享界面進行遠程交流。

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

業(yè)務流程

設置畫筆和畫刷

圖13 設置畫筆和畫刷流程 
說明: 
  1. 啟用標注功能后,可以設置畫筆和畫刷的屬性,畫筆屬性會影響標注線條的顏色、寬度和類型;畫刷屬性會影響填充的顏色等;
  2. 設置畫筆和畫刷后,所有新創(chuàng)建的TSDK_E_ANNOTATION_DRAWING類型標注都會使用新的畫筆和畫刷,舊的標注不受影響。
  1. UI調用tsdk_annotation_set_pen()接口設置畫筆屬性,設置時指定當前共享的組件ID、畫筆類型和畫筆屬性。
    說明: 
    1. 因僅屏幕共享、文檔共享和白板共享支持標注功能,所以組件ID僅支持對應的組件ID;
    2. 此接口可以返回原畫筆的屬性,在應用層需要記錄原畫筆屬性時,此接口的最后一個參數(shù)應非空。
    代碼示例:
    //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調用tsdk_annotation_set_brush()接口設置畫刷屬性,設置時指定當前共享的組件ID,畫刷屬性。
    說明: 
    1. 當前僅文檔共享和白板共享支持標注功能,所以組件ID僅支持對應的組件ID;
    2. 此接口可以返回原畫刷的屬性,在應用層需要記錄原畫刷屬性時,此接口的最后一個參數(shù)應非空。
    代碼示例:
    //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)建幾何標注

圖14 創(chuàng)建幾何標注流程 
  1. UI調用tsdk_annotation_create_start()接口開始創(chuàng)建標注,標注類型為TSDK_E_ANNOTATION_DRAWING。
    說明: 
    1. 屏幕共享過程中、僅具備標注權限的與會者可以進行標注操作;文檔共享和白板共享過程中,所有與會者均有標注權限進行標注操作。應用程序界面應該根據(jù)當前共享狀態(tài)和權限給用戶提供標注入口;
    2. 創(chuàng)建標注的接口中用到的坐標都是相對于頁面左上角的TWIPS單位坐標,向右向下為正。
    代碼示例:
    //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定時循環(huán)調用tsdk_annotation_create_update()接口在創(chuàng)建過程中更新數(shù)據(jù)。
    說明: 

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

    代碼示例:
    //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調用tsdk_annotation_create_done()接口完成標注創(chuàng)建。
    說明: 

    若完成標注創(chuàng)建,則此接口的第三個參數(shù)應設置為0,否則設置為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. 其他與會者側SDK向UI上報數(shù)據(jù)更新消息,屏幕共享時上報TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時上報TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時上報TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

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

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

 

創(chuàng)建文字標注

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

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

    代碼示例:
    //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. 其他與會者側SDK向UI上報數(shù)據(jù)更新消息,屏幕共享時上報TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時上報TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時上報TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

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

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

 

編輯文字標注

說明: 

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

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

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

    代碼示例:
    //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. 與會者在文本框并完成標注文字編輯,UI調用tsdk_annotation_text_update()接口完成標注更新。
    代碼示例:
    //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; 
    }
    
     

注意事項

無。

編輯標注

描述

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

前提條件:

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

業(yè)務流程

選中標注

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

     

    代碼示例:
    //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調用tsdk_annotation_set_select()接口將步驟1中的標注設置為選中狀態(tài)。

     

    說明: 

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

    代碼示例:
    //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. 選中操作側SDK向UI上報數(shù)據(jù)更新消息,屏幕共享時上報TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時上報TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時上報TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
  4. UI調用tsdk_doc_share_get_surface_bmp()/tsdk_app_share_get_screen_data()接口獲取當前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

 

編輯標注

圖17 編輯標注流程 
說明: 

標注被選中后,與會者可以進行拖動或拉伸,以改變標注的位置或形狀。

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

    此接口可以對選中的多個標注同時開始編輯,編輯過程中,被選中的標注會一同被移動或被拉伸。

    代碼示例:
    //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定時循環(huán)調用tsdk_annotation_edit_update()接口在編輯過程中更新數(shù)據(jù)。
    說明: 

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

    代碼示例:
    //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調用tsdk_annotation_edit_done()接口完成標注編輯。
    說明: 

    若完成標注編輯,則此接口的第三個參數(shù)應設置為0,否則設置為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. 其他與會者側SDK向UI上報數(shù)據(jù)更新消息,屏幕共享時上報TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時上報TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時上報TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

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

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

 

刪除標注

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

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

    代碼示例:
    //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. 其他與會者側SDK向UI上報數(shù)據(jù)更新消息,屏幕共享時上報TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時上報TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時上報TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
  3. UI調用tsdk_doc_share_get_surface_bmp()/tsdk_app_share_get_screen_data()接口獲取當前頁面圖像數(shù)據(jù),并使用獲取到的數(shù)據(jù)刷新共享顯示頁面。

注意事項

無。

操作激光點

描述

會議過程中,與會者進行激光點的開啟、移動和停止操作。

前提條件:

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

業(yè)務流程

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

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

    代碼示例:
    //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定時循環(huán)調用tsdk_annotation_laser_pointer_moveto()接口在移動激光點。
    說明: 

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

    代碼示例:
    //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調用tsdk_annotation_laser_pointer_stop()接口結束激光點操作,用戶只能結束自己的激光點。
    代碼示例:
    //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. 其他與會者側SDK向UI上報數(shù)據(jù)更新消息,屏幕共享時上報TSDK_E_CONF_EVT_AS_SCREEN_DATA_UPDATE,文檔共享時上報TSDK_E_CONF_EVT_DS_DOC_DRAW_DATA_NOTIFY,白板共享時上報TSDK_E_CONF_EVT_WB_DOC_DRAW_DATA_NOTIFY。
    說明: 

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

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

注意事項

無。

聊天

描述

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

  1. 入會成功。
  2. 加載即時消息模塊成功。

業(yè)務流程

圖20 發(fā)送和接收公共消息流程 
  1. UI調用接口tsdk_send_chat_msg_in_conference()接口在會議中發(fā)送公共即時消息。
    代碼示例:
    //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. 會議中所有用戶(包括消息發(fā)送者)側SDK均收到消息通知,向UI上報TSDK_E_CONF_EVT_RECV_CHAT_MSG事件,UI顯示公共即時消息。
    代碼示例:
    //c code
    case TSDK_E_CONF_EVT_RECV_CHAT_MSG:
    {
         /*Notify UI*/
    }
    
     

注意事項

當前僅提供公共消息的開放能力。