輔助電話語音概觀
電話語音的一項重要功能是稱為「輔助電話語音」的一小組函式。 輔助電話語音的設計目的是要建立語音通話,以及可供任何應用程式使用媒體通話,而不只是電話語音功能專用的通話。 換句話說,輔助電話語音可讓應用程式撥打電話,而不需要注意完整電話語音 API 服務的詳細資料。 它會將電話語音延伸至文字處理應用程式、試算表、資料庫、個人資訊管理員和其他非電話語音應用程式。
如需基本電話語音的 TAPI 2.x 輔助電話語音功能清單,請參閱 TAPI 快速函式參考。 TAPI 3.x 支援透過 ITRequest 介面的輔助電話語音。
下列範例可說明輔助電話語音的實用性。 試算表應用程式可以納入撥打語音通話電話號碼的函式。 只要應用程式不需要完整電話語音 API 所提供的詳細通話控制項,輔助電話語音是提供電話語音功能的最簡單且最有效率的方式。
輔助電話語音和完整的電話語音 API 會以不同的方式使用和實作,因此不建議在單一應用程式中混合輔助電話語音函式呼叫和電話語音 API 函式呼叫。
使用輔助電話語音
使用輔助電話語音服務的應用程式只會起始 TAPI 暫時排入佇列的通話要求。 要求收件者應用程式會擷取這些要求,並代表輔助電話語音應用程式執行這些要求。 tapiRequestMakeCall函式會要求建立語音通話。 要求的應用程式不會控制呼叫。
TAPI 可讓使用者為每個服務建立不同的或相同的要求收件者應用程式。 應用程式會向 lineRegisterRequestRecipient註冊來成為要求收件者,其中 TRUE 會指定為 參數 bEnable的值。 (指定FALSE會將應用程式取消註冊為要求收件者,當應用程式判斷其收件者職責是透過目前會話時執行。) 應用程式會選取想要在lineRegisterRequestRecipient的dwRequestMode參數中處理的服務。 要求的可能值為 LINEREQUESTMODE_MAKECALL,以顯示應用程式會處理 tapiRequestMakeCall 要求。 如果多個應用程式註冊相同的服務,則會使用優先順序配置來允許使用者選取處理要求的慣用應用程式。 此優先順序配置與用於呼叫交接的相同,以及根據登錄中 HandoffPriorities 中檔案名清單的來電路由。
呼叫要求
輔助電話語音提供具備電話語音功能的應用程式,並提供便於使用的機制來進行通話,而不需要開發人員在電話語音中變得完全滿意。
tapiRequestMakeCall函式要求使用者與其電話號碼所指定的遠端合作物件之間的語音通話。 對 TAPI 提出要求,它會將其傳遞至註冊為這類要求的收件者的應用程式。 此收件者是通話管理員應用程式。
應用程式提出要求之後,會完全從通話管理員應用程式控制通話,因為輔助電話語音應用程式無法管理通話。 由於電話語音和所有使用者介面作業的較複雜層面是由通話管理員應用程式處理,因此啟用電話語音的應用程式不需要以任何大幅的方式修改。 事實上,允許從其內建指令碼語言叫用此作業的應用程式可能完全不需要修改。
tapiGetLocationInfo函式會傳回應用程式國家/地區代碼和城市 (區域) 使用者已在電話語音主控台中目前位置參數中設定的程式碼。 應用程式可以使用這項資訊來協助使用者形成適當的標準電話號碼,例如在電話簿專案或資料庫記錄中輸入新號碼時提供這些號碼作為預設值。
要求收件者
需要兩種應用程式才能執行輔助電話語音。 輔助電話語音 用戶端 是使用輔助電話語音的應用程式,方法是呼叫前置詞為 「tapi」 的函式。這類用戶端應用程式的範例是新增 [撥號 ] 功能表命令或工具列按鈕的試算表。
輔助電話語音 伺服器 是可執行來自另一個應用程式呼叫「tapi」前置函式之電話語音 API 函式的應用程式。 為了將本身稱為「輔助電話語音」伺服器,這類應用程式會使用 lineRegisterRequestRecipient 函式註冊為一部伺服器。
Assisted Telephony (的函式,開頭為前置詞 「tapi」) 稱為 要求函式。 處理這些要求的輔助電話語音應用程式—輔助電話語音伺服器— 稱為 要求收件者。
處理輔助電話語音要求
傳遞和服務要求的程式如下:
當 TAPI 收到輔助電話語音要求時,它會檢查要求收件者,也就是目前註冊來處理該類型要求的應用程式。 如果有要求收件者,要求會排入佇列,且已註冊該要求服務的最高優先順序應用程式會傳送 LINE_REQUEST 訊息。 此訊息會通知要求收件者新要求已到達,並指出要求的模式。
如果 TAPI 找不到目前正在執行的應用程式來處理這類要求,它會嘗試啟動已註冊為能夠執行的應用程式。 此註冊資訊會記錄在登錄中的 HandoffPriorities 中。 TAPI 會嘗試依其列在 HandoffPriorities 區段中的順序啟動應用程式。 (請參閱下列步驟。)
如果目前未註冊任何應用程式,TAPI 會檢查 HandoffPriorities中相關聯專案上的要求處理應用程式清單。 如果檔案中遺漏相關聯的行,如果檔案上沒有列出任何應用程式,或清單中沒有任何應用程式可以啟動,則會拒絕要求,並出現錯誤TAPIERR_NOREQUESTRECIPIENT。
啟動要求收件者時, (TAPI 是否已啟動要求收件者) 在啟動程式期間呼叫 lineRegisterRequestRecipient 並註冊本身為要求收件者。
如果專案中列出一或多個應用程式,TAPI 會以第一個列出的應用程式開頭 (最高優先順序) ,並嘗試使用 CreateProcess 函式啟動它。 如果嘗試啟動應用程式失敗,TAPI 會嘗試啟動清單中的下一個應用程式。 當任何應用程式成功啟動時,TAPI 只會將要求排入佇列,並將成功指示傳回給應用程式,即使要求尚未向要求收件者發出訊號也一樣。
啟動要求收件者應用程式之後,它會呼叫 lineRegisterRequestRecipient,這會導致傳送 LINE_REQUEST 訊息,表示要求已排入佇列。 如果基於某些原因,啟動的應用程式永遠不會註冊,要求會維持佇列,並無限期地保留在佇列中,直到應用程式註冊該類型的要求為止。
如果 TAPI 發現這類已註冊的應用程式已在執行中或成功啟動,它會將要求排入佇列、將LINE_REQUEST訊息傳送至伺服器應用程式,並傳回對輔助電話語音應用程式之函數呼叫的成功指示。 此成功訊息只會指出要求已接受並排入佇列,而不是已成功執行要求。
當伺服器應用程式準備好處理要求時,它會呼叫 lineGetRequest 函式。 這可讓它接收所需的任何資訊,例如要撥號的位址。 然後它會使用 TAPI 函式來處理要求, (例如 lineMakeCall 和 lineDrop) ,否則會用來撥打呼叫。 叫用 lineGetRequest 會從 TAPI 移除要求,而且要求參數會複製到應用程式佈建的要求緩衝區中。 緩衝區內容的大小和解譯取決於要求模式。
伺服器必須確定在執行要求時會使用正確的參數。 執行此動作時,會遵循下列步驟:
- 要求收件者會先收到 LINE_REQUEST 訊息,告知要求佇列中可以存在要求。 這會告訴應用程式呼叫 lineGetRequest ,並持續呼叫,直到佇列清空 (是否要求進行新的呼叫) ,或卸載現有的呼叫。 此訊息不包含要求的參數,但卸載現有呼叫的要求除外。
- 如果要求是要進行新的呼叫,Assisted Telephony 伺服器會使用 lineGetRequest 函式來擷取完整要求,其中包含要求的參數。 伺服器現在具有它所需的所有資訊,例如要撥打的數位或要求建立者識別。 不過,伺服器必須配置儲存此資訊所需的記憶體。
- 最後,伺服器會叫用適當的 TAPI 函式或一組函式來執行要求。
如果 TAPI 無法啟動能夠作為要求收件者的應用程式,輔助電話語音電話會失敗,並傳回錯誤TAPIERR_NOREQUESTRECIPIENT。
要求收件者作業的注意事項
下列資訊涉及處理輔助電話語音要求的系統:
- 預設登錄應該會在 tapiRequestMakeCall的優先順序清單中列出呼叫管理員應用程式。 呼叫管理員應用程式具有功能表選項,可讓使用者將它設定為最高優先順序,這很有説明,但並非必要。
- 當 TAPI 自動啟動輔助電話語音收件者應用程式時,如果它是系統中唯一的 TAPI 應用程式,此動作就會初始化 TAPI。 如果輔助電話語音收件者應用程式在註冊輔助電話語音要求之前初始化並關閉線路裝置,TAPI 也會關閉,而且輔助電話語音要求會遺失。 當另一個啟動的 TAPI 應用程式執行初始化和關機時,輔助電話語音要求也可能會遺失。