29 1月 2009

Skype API - DTMF介紹

  在一般的電話對談中,如果我們不小心按到了電話上的按鍵(0~9, #, *),此時會響起一個嗶嗶聲,這個聲響就是以DTMF的方式編碼傳送,每個按鍵都有各自獨有的頻率,所以照理來說,只要對方可以解析傳來的DTMF頻率,即可知道傳來的按鍵為何,可以讓對方做進一步的處理…(如,撥打分機號碼)

  而在Skype的AP中,也有著類似的介面供使用者在通話中,按下畫面上虛擬的按鍵,即會發出DTMF Tone了。而 Skype API 也有提供解析DTMF code的方法,很是方便。

  Skype API 提供了一個Command供使用者送出/接收DTMF code,「SET CALL DTMF」,在Skype4Com裡,也提供了一個Event,當收到DTMF code時,就會觸發「CallDtmfReceived」Event,不過在使用上還是有些限制…
  1. 使用者只能接收到對方送來的DTMF code。當自己送出DTMF code時,並不會觸發CallDtmfReceived Event。
  2. 在Skype4Com的Document中提到,「This event can be received with P2P calls」,所以似乎只限定在P2P的通話上( Skype AP<->Skype AP ),不支援手機<->Skype AP

範例程式:
範例程式下載連結

#include <vcl.h>
#include <iostream>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SKYPE4COMLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
using namespace std;

// 這個程式是用來測試Skype4Com的一些功能
// (1) 要執行這個程式 首先要將$(BCB)/Imports/加入 Include Path
// #include "SKYPE4COMLib_OCX.h"
// (2) 需要新增以下的元件:
// TListBox *ListBox1;
// TMemo *Memo1;
// (3) 需要額外宣告變數:
// TSkype * mSkype;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
mSkype = new TSkype(Owner);
mSkype->Attach(5,false);

// test if Skype is running, if not, start it;
if( !mSkype->Client->IsRunning )
mSkype->Client->Start(false,false);
// 1st parameter - start Skype in minimized state
// 2nd parameter - show splash screen

// Get the count of Friends
int count = mSkype->Friends->get_Count();

// Add Friend list to Memo
for( int i=1 ; i<count ; i++ )// start index from 1 !!!
this->ListBox1->Items->Add( mSkype->Friends->get_Item(i)->get_Handle() );

// bind the Skype Event.
mSkype->OnCallDtmfReceived = OnCallDtmfReceived;
}

// Skype4Com的Event
// 在Skype4Com.chm中定義的 Class : _SkypeEvents 裡面
// HRESULT CallDtmfReceived ([in] ICall *pCall,[in] BSTR Code)
// This event is caused by a call DTMF event.
// 經由BCB處理過後的header檔,定義在 $(BCB)/Imports/SKYPE4COMLib_OCX.h 100行
//
// @target : when receive the DTMF code, print on Memo.
void __fastcall TForm1::OnCallDtmfReceived( TObject *Sender, ICall* pCall/*[in]*/, BSTR code/*[in]*/)
{
this->Memo1->Lines->Add( "OnCallDtmfReceived" );
if( pCall!=NULL ){
this->Memo1->Lines->Add( AnsiString("DTMF Code : ")+WideString(code) );
}
}

補充:
在coding時的測試要透過兩個不同的Skype AP,一般的情況下都得在兩台安裝Skype AP的電腦上測試,建議可以用官網提供的Skype Launcher這個小程式,就能在一台電腦上執行多個Skype AP了。

相關連結:

沒有留言: