• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
     首頁(yè) > 技術(shù) > 解決方案 > UniMedia 6S級電話(huà)語(yǔ)音中間件典型應用-電話(huà)QQ

    UniMedia 6S級電話(huà)語(yǔ)音中間件典型應用-電話(huà)QQ

    2009-05-11 00:00:00   作者:   來(lái)源:   評論:0 點(diǎn)擊:


    2009/05/11

    1.應用場(chǎng)景

      假定呼入電話(huà),聽(tīng)到提示音,按鍵為1的為等待聊天用戶(hù),電話(huà)呼入按鍵為2的為主動(dòng)尋找等待聊天的用戶(hù)

    //全局變量定義

    SCPMANAGER g_SCPManager
    CALL g_TheCall
    int g_iTaskID

    sub main(LIST& cpl)
    {
    int iCallID, iRet

    //注冊系統錯誤處理函數
    EventMap(INF_SYS_ERROR, OnSysError, 0)
    //注冊?huà)鞕C通知處理函數
    EventMap(INF_CTI_ONHOOK, OnCallEndInform, 0)
    //注冊被路由通知處理函數
    EventMap(INF_CTI_ROUTED, OnRoutedInform, 0)
    //注冊取消路由通知處理函數
    EventMap(INF_CTI_UNROUTED, OnUnroutedInform, 0)
    //注冊異步結束通知處理函數
    EventMap(INF_SYS_ASYNCFINISHED, OnAsyncFinishedInform, 0)

    //在BOOT進(jìn)程啟動(dòng)該進(jìn)程時(shí),參數是按照CALLID、ANO、BNO,UUD順序先后存放在參數列表cpl中
    //根據業(yè)務(wù)需要取出參數值

    //獲得命令行參數的callid
    cpl.GetItem(0, iCallID, iRet)
    Log(DBG, "Call Income: CallID=", iCallID)

    //根據對象ID獲得當前Call對象
    g_SCPManager.FindCallByID(iCallID, g_TheCall, iRet)
    //設置Call對象的業(yè)務(wù)處理進(jìn)程ID為當前進(jìn)程
    g_TheCall.AttachCurrentProcess(iRet)
    //應答CALL
    g_TheCall.Answer(iRet)


    //來(lái)話(huà)聊天業(yè)務(wù)處理過(guò)程:
    //來(lái)話(huà)應答成功后,首先進(jìn)行放音收碼,在分析用戶(hù)的按鍵
    // 如果用戶(hù)按鍵為"1",則假定用戶(hù)為等候交談的客戶(hù),設置業(yè)務(wù)參數名值對為("Number"、"Waiting"),用戶(hù)聽(tīng)音樂(lè )等待其它用戶(hù)的交談申請
    // 如果用戶(hù)按鍵為"2",則假定用戶(hù)為主動(dòng)尋找交談的客戶(hù),則從業(yè)務(wù)參數名值對為("Number"、"Waiting")的等待用戶(hù)中查找一個(gè)進(jìn)行交談,并把等待呼叫的名值對該為("Number"、"Connecting")
    // 如果用戶(hù)按鍵為其它,則在循環(huán)播放收碼
    while(true)
    {
    //同步循環(huán)放音收碼
    string sDigits,sTermChar
    g_TheCall.PlayReceiveDTMF(true, "welcome.vox", 1, "*", sTermChar, sDigits, -1, iRet)

    switch(sDigits)
    {
    case("1")
    //等待被連接
    Log(DBG, "Playing wait music to Income Call(", iCallID, ").")
    g_TheCall.Play(true, true, "musichold.vox", g_iTaskID, iRet)
    //設置呼叫對象的業(yè)務(wù)名值對
    g_TheCall.SetParam("Number", sDigits, iRet)
    //注冊被連接事件函數
    EventMap(INF_CTI_ROUTED, OnRoutedInform, 1)

    //無(wú)限等待(直到用戶(hù)主動(dòng)掛機)
    Wait(-1)
    break

    case("2")
    //設置呼叫對象為查找用戶(hù)的標志
    g_TheCall.SetParam("Number", sDigits, iRet)
    //查找空閑等候用戶(hù),主動(dòng)進(jìn)行連接
    Log(DBG, "Matching user(", iCallID, ")...")

    //查找交談對象并進(jìn)行連接操作,實(shí)現通話(huà)交流
    MatchWaitingUser(g_TheCall)

    //無(wú)限等待(直到用戶(hù)主動(dòng)掛機)
    Wait(-1)
    break

    default
    Log(DBG, "用戶(hù)按鍵其它碼,需重新收碼,Digits=", sDigits)
    break
    }//end of Switch
    }// end of While

    Log(DBG, "Finished. Bye.")
    }

    //查找函數的業(yè)務(wù)處理過(guò)程:
    //首先給主動(dòng)查找用戶(hù)播放等待提示語(yǔ)音
    //然后根據呼叫對象的名值對從全局呼叫對象實(shí)例管理器中查找等待呼叫
    //如果成功找到,則停止當前呼叫的提示語(yǔ)音,主動(dòng)進(jìn)行連接通話(huà)操作
    //如果沒(méi)有找到,則等待1秒鐘在循環(huán)查找
    sub MatchWaitingUser(CALL& call)
    {
    int iRet,iTaskID

    //異步循環(huán)放音
    call.Play(true, true, "waiting.vox", iTaskID, iRet)


    while(true)
    {
    CALL callWait
    //根據名值對查找等待呼叫對象
    g_SCPManager.FindCallByParam("Number", "1", callWait, iRet)
    if (iRet == RET_SUCC)
    {
    //重新設置等待連接呼叫的名值對
    callWait.SetParam("Number","Connecting",iRet)

    //找到等待用戶(hù),停止當前呼叫的語(yǔ)音提示
    call.StopOP(iTaskID, iRet)

    //主動(dòng)連接兩個(gè)CALL
    call.ConnectCall(callWait, iRet)
    break
    }
    else
    {
    //沒(méi)有找到,1000毫秒后繼續尋找
    Wait(1000)
    }
    }//end of while
    }

    //Chat工程中所有事件處理函數實(shí)現

    //錯誤處理函數
    sub OnSysError(int tag)
    {
    Log(ERR, "System error: ", __LASTERRSTR__)
    }

    //掛機通知處理函數
    sub OnCallEndInform(int tag, CALL& call)
    {
    Log(INF, "OnHooked. CallID=", call.CallID)
    Log(INF, "Exit...")
    Exit("掛機退出")
    }

    //被路由通知處理函數
    sub OnRoutedInform(int tag, CALL& call1, CALL& call2)
    {
    Log(INF, "Routed. CallID1=", call1.CallID, " CallID2=", call2.CallID)

    int iRet
    string paraValue
    //在連接前已經(jīng)把等待呼叫的名值對的值由1改為Connecting
    call1.GetParam("Number", paraValue, iRet)
    if (paraValue == "Connecting")
    {
    //call1如果是被連接的等待用戶(hù),需要停止它已經(jīng)在播放的等候音樂(lè )
    call1.StopOP(g_iTaskID, iRet)
    }
    }

    //取消路由通知處理函數
    sub OnUnroutedInform(int tag, CALL& call1, CALL& call2)
    {
    Log(INF, "Unrouted. CallID1=", call1.CallID, " CallID2=", call2.CallID)
    }

    //異步結束通知處理函數
    sub OnAsyncFinishedInform(int tag, CALL& call, int optype, int taskid, int ret)
    {
    if (ret == RET_SUCC)
    {
    Log(INF, "異步結束OK. CallID=", call.CallID, " optype=", optype, " taskid=", taskid)
    }
    else
    {
    Log(INF, "異步結束FAIL. CallID=", call.CallID, " optype=", optype, " taskid=", taskid)
    }
    }

    CTI論壇報道

    相關(guān)閱讀:

    分享到: 收藏
    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 灵山县| 兴国县| 彰武县| 东光县| 镇坪县| 柘荣县| 抚顺县| 黔南| 正镶白旗| 兴仁县| 景泰县| 舟山市| 明水县| 磐石市| 化德县| 景德镇市| 延津县| 常熟市| 卓资县| 剑川县| 渭南市| 浦城县| 松潘县| 苏尼特左旗| 台东县| 灵川县| 都昌县| 长沙县| 黄骅市| 凤阳县| 西乌珠穆沁旗| 景洪市| 平遥县| 郸城县| 铜梁县| 观塘区| 印江| 渭南市| 扶绥县| 镇安县| 永新县| http://444 http://444 http://444 http://444 http://444 http://444