summaryrefslogtreecommitdiff
path: root/Protocols
diff options
context:
space:
mode:
authorpescuma <pescuma@c086bb3d-8645-0410-b8da-73a8550f86e7>2009-12-16 01:36:38 +0000
committerpescuma <pescuma@c086bb3d-8645-0410-b8da-73a8550f86e7>2009-12-16 01:36:38 +0000
commit1aa7c4b3887e950376978eee64c652df5f94cd5c (patch)
treedf677d1a05cba7681aaa3a3b7115ab539cc5715e /Protocols
parent1cb7189cc9f3ff7a01a347b6f5be2483f541badd (diff)
iax: added voice service calls
git-svn-id: http://pescuma.googlecode.com/svn/trunk/Miranda@182 c086bb3d-8645-0410-b8da-73a8550f86e7
Diffstat (limited to 'Protocols')
-rw-r--r--Protocols/IAX/IAXProto.cpp263
-rw-r--r--Protocols/IAX/IAXProto.h22
-rw-r--r--Protocols/IAX/commons.h22
-rw-r--r--Protocols/IAX/lib/iaxclient/Debug/libgsm.libbin139818 -> 139818 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Debug/libiax2.libbin284956 -> 285094 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Debug/libiaxclient.libbin2124852 -> 2125758 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Debug/libogg.libbin65558 -> 65558 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Debug/libportaudio.libbin396496 -> 396490 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Debug/libportmixer.libbin45542 -> 45542 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Debug/libspeex.libbin634058 -> 634058 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Release/libgsm.libbin49314 -> 49314 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Release/libiax2.libbin129474 -> 129474 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Release/libiaxclient.libbin822788 -> 822976 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Release/libogg.libbin29444 -> 29444 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Release/libportaudio.libbin141138 -> 141138 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Release/libportmixer.libbin15066 -> 15066 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/Release/libspeex.libbin294770 -> 294770 bytes
-rw-r--r--Protocols/IAX/lib/iaxclient/iaxclient.h5
18 files changed, 289 insertions, 23 deletions
diff --git a/Protocols/IAX/IAXProto.cpp b/Protocols/IAX/IAXProto.cpp
index d374c26..a88217d 100644
--- a/Protocols/IAX/IAXProto.cpp
+++ b/Protocols/IAX/IAXProto.cpp
@@ -19,6 +19,8 @@ Boston, MA 02111-1307, USA.
#include "commons.h"
+#define NUM_LINES 3
+
static INT_PTR CALLBACK DlgProcAccMgrUI(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
static int static_iaxc_callback(iaxc_event e, void *param);
@@ -29,6 +31,8 @@ IAXProto::IAXProto(const char *aProtoName, const TCHAR *aUserName)
InitializeCriticalSection(&cs);
reg_id = 0;
+ hNetlibUser = 0;
+ hCallStateEvent = 0;
m_iDesiredStatus = m_iStatus = ID_STATUS_OFFLINE;
m_tszUserName = mir_tstrdup(aUserName);
@@ -111,6 +115,8 @@ int __cdecl IAXProto::SetStatus( int iNewStatus )
}
else if (m_iStatus == ID_STATUS_OFFLINE)
{
+ Trace(_T("Connecting..."));
+
BroadcastStatus(ID_STATUS_CONNECTING);
TCHAR server_port[1024];
@@ -119,6 +125,7 @@ int __cdecl IAXProto::SetStatus( int iNewStatus )
reg_id = iaxc_register(TcharToUtf8(opts.username), opts.password, TcharToUtf8(server_port));
if (reg_id <= 0)
{
+ Error(TranslateT("Error registering with IAX"));
BroadcastStatus(ID_STATUS_OFFLINE);
return -1;
}
@@ -141,6 +148,8 @@ INT_PTR __cdecl IAXProto::CreateAccMgrUI(WPARAM wParam, LPARAM lParam)
void IAXProto::BroadcastStatus(int newStatus)
{
+ Trace(_T("BroadcastStatus %d"), newStatus);
+
int oldStatus = m_iStatus;
m_iStatus = newStatus;
SendBroadcast(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)oldStatus, m_iStatus);
@@ -186,23 +195,66 @@ int IAXProto::SendBroadcast(HANDLE hContact, int type, int result, HANDLE hProce
}
-void IAXProto::ShowMessage(bool error, TCHAR *fmt, ...)
+#define MESSAGE_TYPE_TRACE 0
+#define MESSAGE_TYPE_INFO 1
+#define MESSAGE_TYPE_ERROR 2
+
+
+void IAXProto::Trace(TCHAR *fmt, ...)
{
va_list args;
va_start(args, fmt);
- TCHAR buff[1024];
- mir_sntprintf(buff, MAX_REGS(buff), fmt, args);
+ ShowMessage(MESSAGE_TYPE_TRACE, fmt, args);
- OutputDebugString(buff);
- CallService(MS_NETLIB_LOG, (WPARAM) hNetlibUser, (LPARAM) (const char *) TcharToChar(buff));
+ va_end(args);
+}
+
+
+void IAXProto::Info(TCHAR *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+
+ ShowMessage(MESSAGE_TYPE_INFO, fmt, args);
+
+ va_end(args);
+}
+
+
+void IAXProto::Error(TCHAR *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+
+ ShowMessage(MESSAGE_TYPE_ERROR, fmt, args);
va_end(args);
}
+void IAXProto::ShowMessage(int type, TCHAR *fmt, va_list args)
+{
+ TCHAR buff[1024];
+ if (type == MESSAGE_TYPE_TRACE)
+ lstrcpy(buff, _T("TRACE: "));
+ else if (type == MESSAGE_TYPE_INFO)
+ lstrcpy(buff, _T("INFO : "));
+ else
+ lstrcpy(buff, _T("ERROR: "));
+
+ mir_vsntprintf(&buff[7], MAX_REGS(buff)-7, fmt, args);
+
+ OutputDebugString(buff);
+ OutputDebugString(_T("\n"));
+ CallService(MS_NETLIB_LOG, (WPARAM) hNetlibUser, (LPARAM) TcharToChar(buff).get());
+}
+
+
void IAXProto::Disconnect()
{
+ Trace(_T("Disconnecting..."));
+
iaxc_dump_all_calls();
if (reg_id > 0)
@@ -227,28 +279,28 @@ int IAXProto::text_callback(iaxc_ev_text &text)
{
case IAXC_TEXT_TYPE_STATUS:
{
- ShowMessage(false, TranslateT("Status: %s"), Utf8ToTchar(text.message));
+ Trace(_T("Status: %s"), Utf8ToTchar(text.message));
return 1;
}
case IAXC_TEXT_TYPE_NOTICE:
{
- ShowMessage(false, TranslateT("Notice: %s"), Utf8ToTchar(text.message));
+ Info(TranslateT("Notice: %s"), Utf8ToTchar(text.message));
return 1;
}
case IAXC_TEXT_TYPE_ERROR:
{
- ShowMessage(true, Utf8ToTchar(text.message));
+ Error(Utf8ToTchar(text.message));
return 1;
}
case IAXC_TEXT_TYPE_FATALERROR:
{
- ShowMessage(true, TranslateT("Fatal: %s"), Utf8ToTchar(text.message));
+ Error(TranslateT("Fatal: %s"), Utf8ToTchar(text.message));
Disconnect();
return 1;
}
case IAXC_TEXT_TYPE_IAX:
{
- ShowMessage(false, TranslateT("IAX: %s"), Utf8ToTchar(text.message));
+ Trace(_T("IAX: %s"), Utf8ToTchar(text.message));
return 1;
}
default:
@@ -261,24 +313,68 @@ int IAXProto::text_callback(iaxc_ev_text &text)
int IAXProto::state_callback(iaxc_ev_call_state &call)
{
+ bool outgoing = ((call.state & IAXC_CALL_STATE_OUTGOING) != 0);
+
+ TCHAR buffer[256] = {0};
+ TCHAR *number = NULL;
+
+ if (!outgoing)
+ {
+ mir_sntprintf(buffer, MAX_REGS(buffer), _T("%s %s"),
+ Utf8ToTchar(call.remote_name).get(),
+ Utf8ToTchar(call.remote).get());
+ lstrtrim(buffer);
+ number = buffer;
+ }
+
+ Trace(_T("callNo %d state %d"), call.callNo, call.state);
+
+ if (call.state & IAXC_CALL_STATE_FREE)
+ {
+ NotifyCall(call.callNo, VOICE_STATE_ENDED);
+ }
+ else if (call.state & IAXC_CALL_STATE_BUSY)
+ {
+ NotifyCall(call.callNo, VOICE_STATE_BUSY, NULL, number);
+ }
+ else if (call.state & IAXC_CALL_STATE_RINGING)
+ {
+ if (outgoing)
+ NotifyCall(call.callNo, VOICE_STATE_CALLING, NULL, number);
+ else
+ NotifyCall(call.callNo, VOICE_STATE_RINGING, NULL, number);
+ }
+ else if (call.state & IAXC_CALL_STATE_SELECTED)
+ {
+ NotifyCall(call.callNo, VOICE_STATE_TALKING, NULL, number);
+ }
+ else
+ {
+ NotifyCall(call.callNo, VOICE_STATE_ON_HOLD, NULL, number);
+ }
+
return 0;
}
int IAXProto::netstats_callback(iaxc_ev_netstats &netstats)
{
+ Trace(_T("netstats"));
return 0;
}
int IAXProto::url_callback(iaxc_ev_url &url)
{
+ Trace(_T("URL"));
return 0;
}
int IAXProto::registration_callback(iaxc_ev_registration &reg)
{
+ Trace(_T("registration_callback %d : %d"), reg.id, reg.reply);
+
if (reg.id != reg_id)
return 0;
@@ -289,20 +385,20 @@ int IAXProto::registration_callback(iaxc_ev_registration &reg)
BroadcastStatus(m_iDesiredStatus > ID_STATUS_OFFLINE ? m_iDesiredStatus : ID_STATUS_ONLINE);
if (reg.msgcount > 0)
- ShowMessage(false, TranslateT("You have %d voicemail message(s)."), reg.msgcount);
+ Info(TranslateT("You have %d voicemail message(s)"), reg.msgcount);
return 1;
}
case IAXC_REGISTRATION_REPLY_REJ:
{
- ShowMessage(true, TranslateT("Registration rejected"));
+ Error(TranslateT("Registration rejected"));
Disconnect();
return 1;
}
case IAXC_REGISTRATION_REPLY_TIMEOUT:
{
- ShowMessage(true, TranslateT("Registration timeout"));
+ Error(TranslateT("Registration timeout"));
Disconnect();
return 1;
@@ -413,7 +509,7 @@ int __cdecl IAXProto::OnEvent( PROTOEVENTTYPE iEventType, WPARAM wParam, LPARAM
}
-int __cdecl IAXProto::OnModulesLoaded(WPARAM wParam, LPARAM lParam)
+int __cdecl IAXProto::OnModulesLoaded(WPARAM wParam, LPARAM lParam)
{
TCHAR buffer[MAX_PATH];
mir_sntprintf(buffer, MAX_REGS(buffer), TranslateT("%s plugin connections"), m_tszUserName);
@@ -425,13 +521,21 @@ int __cdecl IAXProto::OnModulesLoaded(WPARAM wParam, LPARAM lParam)
nl_user.ptszDescriptiveName = buffer;
hNetlibUser = (HANDLE) CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nl_user);
+ if (!ServiceExists(MS_VOICESERVICE_REGISTER))
+ {
+ Error(TranslateT("IAX needs Voice Service plugin to work!"));
+ return 1;
+ }
iaxc_set_event_callback(&static_iaxc_callback, this);
// TODO Handle network out port
iaxc_set_preferred_source_udp_port(-1);
- if (iaxc_initialize(3))
- throw "!!";
+ if (iaxc_initialize(NUM_LINES))
+ {
+ Error(TranslateT("Failed to initialize iaxc lib"));
+ return 1;
+ }
iaxc_set_formats(IAXC_FORMAT_SPEEX,
IAXC_FORMAT_ULAW|IAXC_FORMAT_ALAW|IAXC_FORMAT_GSM|IAXC_FORMAT_SPEEX|IAXC_FORMAT_ILBC);
@@ -439,23 +543,144 @@ int __cdecl IAXProto::OnModulesLoaded(WPARAM wParam, LPARAM lParam)
iaxc_set_silence_threshold(-99);
if (iaxc_start_processing_thread())
- throw "!!";
+ {
+ Error(TranslateT("Failed to initialize iax threads"));
+ return 1;
+ }
+
+
+ hCallStateEvent = CreateProtoEvent(PE_VOICE_CALL_STATE);
+
+ VOICE_MODULE vm = {0};
+ vm.cbSize = sizeof(vm);
+ vm.name = m_szModuleName;
+ vm.flags = VOICE_CAPS_CALL_STRING | VOICE_CAPS_CAN_HOLD;
+ CallService(MS_VOICESERVICE_REGISTER, (WPARAM) &vm, 0);
return 0;
}
-int __cdecl IAXProto::OnOptionsInit(WPARAM wParam,LPARAM lParam)
+int __cdecl IAXProto::OnOptionsInit(WPARAM wParam, LPARAM lParam)
{
return 0;
}
-int __cdecl IAXProto::OnPreShutdown(WPARAM wParam,LPARAM lParam)
+int __cdecl IAXProto::OnPreShutdown(WPARAM wParam, LPARAM lParam)
{
+ CallService(MS_VOICESERVICE_UNREGISTER, (WPARAM) m_szModuleName, 0);
+
iaxc_stop_processing_thread();
iaxc_shutdown();
return 0;
}
+
+
+void IAXProto::NotifyCall(int callNo, int state, HANDLE hContact, TCHAR *number)
+{
+ char tmp[16];
+
+ VOICE_CALL vc = {0};
+ vc.cbSize = sizeof(vc);
+ vc.szModule = m_szModuleName;
+ vc.id = itoa(callNo, tmp, 10);
+ vc.flags = VOICE_TCHAR;
+ vc.hContact = hContact;
+ vc.ptszNumber = number;
+ vc.state = state;
+
+ NotifyEventHooks(hCallStateEvent, (WPARAM) &vc, 0);
+}
+
+
+int __cdecl IAXProto::VoiceCall(WPARAM wParam, LPARAM lParam)
+{
+ HANDLE hContact = (HANDLE) wParam;
+ TCHAR *number = (TCHAR *) lParam;
+
+ if (number == NULL || number[0] == 0)
+ return 1;
+
+ if (iaxc_first_free_call() < 0)
+ return 2;
+
+ int callNo = iaxc_call_ex(TcharToUtf8(number), NULL, NULL, FALSE);
+ if (callNo < 0 || callNo >= NUM_LINES)
+ return 3;
+
+ NotifyCall(callNo, VOICE_STATE_CALLING, hContact, number);
+
+ return 0;
+}
+
+
+int __cdecl IAXProto::VoiceAnswerCall(WPARAM wParam, LPARAM lParam)
+{
+ char *id = (char *) wParam;
+ if (id == NULL || id[0] == 0)
+ return 1;
+
+ int callNo = atoi(id);
+ if (callNo < 0 || callNo >= NUM_LINES)
+ return 2;
+
+ if (iaxc_select_call(callNo) < 0)
+ return 3;
+
+ return 0;
+}
+
+
+int __cdecl IAXProto::VoiceDropCall(WPARAM wParam, LPARAM lParam)
+{
+ char *id = (char *) wParam;
+ if (id == NULL || id[0] == 0)
+ return 1;
+
+ int callNo = atoi(id);
+ if (callNo < 0 || callNo >= NUM_LINES)
+ return 2;
+
+ if (iaxc_get_call_state(callNo) & IAXC_CALL_STATE_RINGING)
+ iaxc_reject_call_number(callNo);
+ else
+ iaxc_dump_call_number(callNo);
+
+ return 0;
+}
+
+
+int __cdecl IAXProto::VoiceHoldCall(WPARAM wParam, LPARAM lParam)
+{
+ char *id = (char *) wParam;
+ if (id == NULL || id[0] == 0)
+ return 1;
+
+ int callNo = atoi(id);
+ if (callNo < 0 || callNo >= NUM_LINES)
+ return 2;
+
+ if (callNo != iaxc_selected_call())
+ return 3;
+
+ iaxc_select_call(-1);
+ NotifyCall(callNo, VOICE_STATE_ON_HOLD);
+ return 0;
+}
+
+
+int __cdecl IAXProto::VoiceCallStringValid(WPARAM wParam, LPARAM lParam)
+{
+ TCHAR *number = (TCHAR *) wParam;
+
+ if (number == NULL || number[0] == 0 || lstrlen(number) >= IAXC_EVENT_BUFSIZ)
+ return 0;
+
+ return 1;
+}
+
+
+
diff --git a/Protocols/IAX/IAXProto.h b/Protocols/IAX/IAXProto.h
index df399f9..0c52b65 100644
--- a/Protocols/IAX/IAXProto.h
+++ b/Protocols/IAX/IAXProto.h
@@ -30,6 +30,7 @@ class IAXProto : public PROTO_INTERFACE
{
private:
HANDLE hNetlibUser;
+ HANDLE hCallStateEvent;
int reg_id;
struct {
@@ -106,11 +107,15 @@ private:
HANDLE CreateProtoEvent(const char* szService);
int SendBroadcast(HANDLE hContact, int type, int result, HANDLE hProcess, LPARAM lParam);
- int __cdecl OnModulesLoaded(WPARAM wParam, LPARAM lParam);
- int __cdecl OnOptionsInit(WPARAM wParam,LPARAM lParam);
- int __cdecl OnPreShutdown(WPARAM wParam,LPARAM lParam);
+ int __cdecl OnModulesLoaded(WPARAM wParam, LPARAM lParam);
+ int __cdecl OnOptionsInit(WPARAM wParam,LPARAM lParam);
+ int __cdecl OnPreShutdown(WPARAM wParam,LPARAM lParam);
+
+ void Trace(TCHAR *fmt, ...);
+ void Info(TCHAR *fmt, ...);
+ void Error(TCHAR *fmt, ...);
+ void ShowMessage(int type, TCHAR *fmt, va_list args);
- void ShowMessage(bool error, TCHAR *fmt, ...);
void Disconnect();
INT_PTR __cdecl CreateAccMgrUI(WPARAM wParam, LPARAM lParam);
@@ -121,6 +126,15 @@ private:
int url_callback(iaxc_ev_url &url);
int registration_callback(iaxc_ev_registration &reg);
+ // Voice services
+ void NotifyCall(int callNo, int state, HANDLE hContact = NULL, TCHAR *number = NULL);
+ int __cdecl VoiceGetCaps(WPARAM wParam,LPARAM lParam);
+ int __cdecl VoiceCall(WPARAM wParam,LPARAM lParam);
+ int __cdecl VoiceAnswerCall(WPARAM wParam,LPARAM lParam);
+ int __cdecl VoiceDropCall(WPARAM wParam,LPARAM lParam);
+ int __cdecl VoiceHoldCall(WPARAM wParam,LPARAM lParam);
+ int __cdecl VoiceCallStringValid(WPARAM wParam,LPARAM lParam);
+
};
diff --git a/Protocols/IAX/commons.h b/Protocols/IAX/commons.h
index b501be1..3f5e762 100644
--- a/Protocols/IAX/commons.h
+++ b/Protocols/IAX/commons.h
@@ -64,6 +64,8 @@ Boston, MA 02111-1307, USA.
#include "../../plugins/utils/mir_icons.h"
#include "../../plugins/utils/mir_log.h"
#include "../../plugins/utils/utf8_helpers.h"
+#include "../../plugins/voiceservice/m_voice.h"
+#include "../../plugins/voiceservice/m_voiceservice.h"
#include <iaxclient.h>
@@ -87,5 +89,25 @@ extern OBJLIST<IAXProto> instances;
+static TCHAR *lstrtrim(TCHAR *str)
+{
+ int len = lstrlen(str);
+
+ int i;
+ for(i = len - 1; i >= 0 && (str[i] == ' ' || str[i] == '\t'); --i) ;
+ if (i < len - 1)
+ {
+ ++i;
+ str[i] = _T('\0');
+ len = i;
+ }
+
+ for(i = 0; i < len && (str[i] == ' ' || str[i] == '\t'); ++i) ;
+ if (i > 0)
+ memmove(str, &str[i], (len - i + 1) * sizeof(TCHAR));
+
+ return str;
+}
+
#endif // __COMMONS_H__
diff --git a/Protocols/IAX/lib/iaxclient/Debug/libgsm.lib b/Protocols/IAX/lib/iaxclient/Debug/libgsm.lib
index 79957a8..8a2c952 100644
--- a/Protocols/IAX/lib/iaxclient/Debug/libgsm.lib
+++ b/Protocols/IAX/lib/iaxclient/Debug/libgsm.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Debug/libiax2.lib b/Protocols/IAX/lib/iaxclient/Debug/libiax2.lib
index 485afa4..853b285 100644
--- a/Protocols/IAX/lib/iaxclient/Debug/libiax2.lib
+++ b/Protocols/IAX/lib/iaxclient/Debug/libiax2.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Debug/libiaxclient.lib b/Protocols/IAX/lib/iaxclient/Debug/libiaxclient.lib
index 4bf8d9d..474f084 100644
--- a/Protocols/IAX/lib/iaxclient/Debug/libiaxclient.lib
+++ b/Protocols/IAX/lib/iaxclient/Debug/libiaxclient.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Debug/libogg.lib b/Protocols/IAX/lib/iaxclient/Debug/libogg.lib
index 0096216..d1c540e 100644
--- a/Protocols/IAX/lib/iaxclient/Debug/libogg.lib
+++ b/Protocols/IAX/lib/iaxclient/Debug/libogg.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Debug/libportaudio.lib b/Protocols/IAX/lib/iaxclient/Debug/libportaudio.lib
index 46010cc..580fb92 100644
--- a/Protocols/IAX/lib/iaxclient/Debug/libportaudio.lib
+++ b/Protocols/IAX/lib/iaxclient/Debug/libportaudio.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Debug/libportmixer.lib b/Protocols/IAX/lib/iaxclient/Debug/libportmixer.lib
index 02dbc95..9875f07 100644
--- a/Protocols/IAX/lib/iaxclient/Debug/libportmixer.lib
+++ b/Protocols/IAX/lib/iaxclient/Debug/libportmixer.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Debug/libspeex.lib b/Protocols/IAX/lib/iaxclient/Debug/libspeex.lib
index 222145d..82cf5dc 100644
--- a/Protocols/IAX/lib/iaxclient/Debug/libspeex.lib
+++ b/Protocols/IAX/lib/iaxclient/Debug/libspeex.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Release/libgsm.lib b/Protocols/IAX/lib/iaxclient/Release/libgsm.lib
index e802484..8aed6eb 100644
--- a/Protocols/IAX/lib/iaxclient/Release/libgsm.lib
+++ b/Protocols/IAX/lib/iaxclient/Release/libgsm.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Release/libiax2.lib b/Protocols/IAX/lib/iaxclient/Release/libiax2.lib
index 623d0c8..f78cfda 100644
--- a/Protocols/IAX/lib/iaxclient/Release/libiax2.lib
+++ b/Protocols/IAX/lib/iaxclient/Release/libiax2.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Release/libiaxclient.lib b/Protocols/IAX/lib/iaxclient/Release/libiaxclient.lib
index f6c2ca2..aa70680 100644
--- a/Protocols/IAX/lib/iaxclient/Release/libiaxclient.lib
+++ b/Protocols/IAX/lib/iaxclient/Release/libiaxclient.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Release/libogg.lib b/Protocols/IAX/lib/iaxclient/Release/libogg.lib
index 5fa9864..ddae00c 100644
--- a/Protocols/IAX/lib/iaxclient/Release/libogg.lib
+++ b/Protocols/IAX/lib/iaxclient/Release/libogg.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Release/libportaudio.lib b/Protocols/IAX/lib/iaxclient/Release/libportaudio.lib
index aa4ff2c..bb5b0c0 100644
--- a/Protocols/IAX/lib/iaxclient/Release/libportaudio.lib
+++ b/Protocols/IAX/lib/iaxclient/Release/libportaudio.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Release/libportmixer.lib b/Protocols/IAX/lib/iaxclient/Release/libportmixer.lib
index 7bd59ab..73c8ac4 100644
--- a/Protocols/IAX/lib/iaxclient/Release/libportmixer.lib
+++ b/Protocols/IAX/lib/iaxclient/Release/libportmixer.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/Release/libspeex.lib b/Protocols/IAX/lib/iaxclient/Release/libspeex.lib
index ebd892a..ee0dfef 100644
--- a/Protocols/IAX/lib/iaxclient/Release/libspeex.lib
+++ b/Protocols/IAX/lib/iaxclient/Release/libspeex.lib
Binary files differ
diff --git a/Protocols/IAX/lib/iaxclient/iaxclient.h b/Protocols/IAX/lib/iaxclient/iaxclient.h
index 92e8f72..a0039eb 100644
--- a/Protocols/IAX/lib/iaxclient/iaxclient.h
+++ b/Protocols/IAX/lib/iaxclient/iaxclient.h
@@ -856,6 +856,11 @@ EXPORT void iaxc_send_text_call(int callNo, const char * text);
EXPORT void iaxc_send_url(const char *url, int link); /* link == 1 ? AST_HTML_LINKURL : AST_HTML_URL */
/*!
+ Returns the state of a call
+*/
+EXPORT int iaxc_get_call_state(int callNo);
+
+/*!
Suspends thread execution for an interval measured in milliseconds
\param ms The number of milliseconds to sleep
*/