From 28413584fe392747cc132fa2417c0b7a5052aa89 Mon Sep 17 00:00:00 2001 From: bossiel Date: Thu, 25 Aug 2011 01:07:28 +0000 Subject: [PATCH] Begin integration with OpenTelePresence --- .../doubango/bindings/_common/ActionConfig.h | 4 +- .../2.0/doubango/bindings/_common/Common.h | 10 +- .../bindings/_common/MediaSessionMgr.cxx | 45 +++-- .../bindings/_common/MediaSessionMgr.h | 6 +- .../bindings/_common/ProxyPluginMgr.cxx | 17 +- .../bindings/_common/ProxyPluginMgr.h | 5 +- .../doubango/bindings/_common/SMSEncoder.cxx | 2 +- .../doubango/bindings/_common/SipSession.cxx | 1 + .../doubango/bindings/_common/SipStack.cxx | 46 ++++-- .../2.0/doubango/bindings/_common/SipStack.h | 4 +- .../2.0/doubango/bindings/_common/SipUri.cxx | 4 +- .../2.0/doubango/bindings/_common/Xcap.cxx | 2 +- .../bindings/csharp/MediaSessionMgr.cs | 5 + .../bindings/csharp/ProxyPluginMgr.cs | 4 +- .../2.0/doubango/bindings/csharp/SipStack.cs | 10 ++ .../bindings/csharp/tinyWRAPPINVOKE.cs | 9 + .../bindings/csharp/tinyWRAP_wrap.cxx | 34 ++++ .../bindings/csharp/twrap_media_type_t.cs | 10 +- .../bindings/java/MediaSessionMgr.java | 4 + .../bindings/java/ProxyPluginMgr.java | 4 +- .../2.0/doubango/bindings/java/SipStack.java | 8 + .../java/android/MediaSessionMgr.java | 4 + .../bindings/java/android/ProxyPluginMgr.java | 4 +- .../bindings/java/android/SipStack.java | 8 + .../bindings/java/android/tinyWRAPJNI.java | 3 + .../bindings/java/android/tinyWRAP_wrap.cxx | 57 +++++++ .../java/android/twrap_media_type_t.java | 10 +- .../doubango/bindings/java/tinyWRAPJNI.java | 3 + .../doubango/bindings/java/tinyWRAP_wrap.cxx | 57 +++++++ .../bindings/java/twrap_media_type_t.java | 10 +- .../2.0/doubango/bindings/perl/tinyWRAP.pm | 3 + .../doubango/bindings/perl/tinyWRAP_wrap.cxx | 155 +++++++++++++----- .../2.0/doubango/bindings/python/tinyWRAP.py | 13 ++ .../bindings/python/tinyWRAP_wrap.cxx | 92 +++++++++-- .../Doubango - Licensing Agreement.doc | Bin 0 -> 31232 bytes .../thirdparties/win32/lib/vpx/vpxmd.lib | Bin 767692 -> 768632 bytes .../src/audio/tdav_speakup_jitterbuffer.c | 6 +- .../src/audio/tdav_speex_jitterbuffer.c | 12 +- .../src/codecs/theora/tdav_codec_theora.c | 6 +- .../2.0/doubango/tinyDAV/src/tdav_win32.c | 15 ++ .../tinyMSRP/src/session/tmsrp_sender.c | 2 +- .../2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c | 2 +- .../tinyNET/src/tnet_transport_win32.c | 2 + .../2.0/doubango/tinySAK/src/tsk_string.c | 2 +- branches/2.0/doubango/tinySAK/src/tsk_time.c | 40 ++--- branches/2.0/doubango/tinySAK/src/tsk_time.h | 20 +-- branches/2.0/doubango/tinySAK/src/tsk_timer.c | 24 ++- branches/2.0/doubango/tinySAK/src/tsk_timer.h | 1 + branches/2.0/doubango/tinySAK/src/tsk_uuid.c | 6 +- 49 files changed, 604 insertions(+), 187 deletions(-) create mode 100644 branches/2.0/doubango/documentation/Doubango - Licensing Agreement.doc diff --git a/branches/2.0/doubango/bindings/_common/ActionConfig.h b/branches/2.0/doubango/bindings/_common/ActionConfig.h index 6015e49e..073496f8 100644 --- a/branches/2.0/doubango/bindings/_common/ActionConfig.h +++ b/branches/2.0/doubango/bindings/_common/ActionConfig.h @@ -30,13 +30,13 @@ class ActionConfig public: ActionConfig(); virtual ~ActionConfig(); - + bool addHeader(const char* name, const char* value); ActionConfig* setResponseLine(short code, const char* phrase); ActionConfig* setMediaString(twrap_media_type_t type, const char* key, const char* value); ActionConfig* setMediaInt(twrap_media_type_t type, const char* key, int value); - + private: tsip_action_handle_t* m_pHandle; diff --git a/branches/2.0/doubango/bindings/_common/Common.h b/branches/2.0/doubango/bindings/_common/Common.h index 01492086..efc1698c 100644 --- a/branches/2.0/doubango/bindings/_common/Common.h +++ b/branches/2.0/doubango/bindings/_common/Common.h @@ -32,11 +32,11 @@ typedef enum twrap_media_type_e { - twrap_media_none, - twrap_media_audio, - twrap_media_video, - twrap_media_audiovideo, - twrap_media_msrp + twrap_media_none = 0x00, + twrap_media_audio = (0x01<<0), + twrap_media_video = (0x01<<1), + twrap_media_audiovideo = (twrap_media_audio | twrap_media_video), + twrap_media_msrp = (0x01<<2) } twrap_media_type_t; diff --git a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.cxx b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.cxx index e5c6bace..416e145a 100644 --- a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.cxx +++ b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.cxx @@ -30,9 +30,9 @@ static void *__droid_destroy_mgr(void *mgr){ #endif -MediaSessionMgr::MediaSessionMgr(tmedia_session_mgr_t* _mgr) +MediaSessionMgr::MediaSessionMgr(tmedia_session_mgr_t* pWrappedMgr) { - this->mgr = (tmedia_session_mgr_t*)tsk_object_ref(_mgr); + m_pWrappedMgr = (tmedia_session_mgr_t*)tsk_object_ref(pWrappedMgr); } MediaSessionMgr::~MediaSessionMgr() @@ -41,14 +41,14 @@ MediaSessionMgr::~MediaSessionMgr() // On Android, deleting the manager from the managed code will trigger OnPluginDestroyed() event // for each plugin associated to this manager (audio,video,...consumers/producers) void* tid[1] = { tsk_null }; - if(tsk_thread_create(tid, __droid_destroy_mgr, this->mgr) == 0){ + if(tsk_thread_create(tid, __droid_destroy_mgr, m_pWrappedMgr) == 0){ tsk_thread_join(tid); } else{ TSK_DEBUG_ERROR("Failed to start the thread"); } #else - TSK_OBJECT_SAFE_FREE(this->mgr); + TSK_OBJECT_SAFE_FREE(m_pWrappedMgr); #endif } @@ -61,7 +61,7 @@ bool MediaSessionMgr::sessionSetInt32(twrap_media_type_t media, const char* key, bool MediaSessionMgr::consumerSetInt32(twrap_media_type_t media, const char* key, int32_t value) { tmedia_type_t _media = _get_media_type(media); - return (tmedia_session_mgr_set(this->mgr, + return (tmedia_session_mgr_set(m_pWrappedMgr, TMEDIA_SESSION_CONSUMER_SET_INT32(_media, key, value), TMEDIA_SESSION_SET_NULL()) == 0); } @@ -69,7 +69,7 @@ bool MediaSessionMgr::consumerSetInt32(twrap_media_type_t media, const char* key bool MediaSessionMgr::consumerSetInt64(twrap_media_type_t media, const char* key, int64_t value) { tmedia_type_t _media = _get_media_type(media); - return (tmedia_session_mgr_set(this->mgr, + return (tmedia_session_mgr_set(m_pWrappedMgr, TMEDIA_SESSION_CONSUMER_SET_INT64(_media, key, value), TMEDIA_SESSION_SET_NULL()) == 0); } @@ -77,7 +77,7 @@ bool MediaSessionMgr::consumerSetInt64(twrap_media_type_t media, const char* key bool MediaSessionMgr::producerSetInt32(twrap_media_type_t media, const char* key, int32_t value) { tmedia_type_t _media = _get_media_type(media); - return (tmedia_session_mgr_set(this->mgr, + return (tmedia_session_mgr_set(m_pWrappedMgr, TMEDIA_SESSION_PRODUCER_SET_INT32(_media, key, value), TMEDIA_SESSION_SET_NULL()) == 0); } @@ -85,7 +85,7 @@ bool MediaSessionMgr::producerSetInt32(twrap_media_type_t media, const char* key bool MediaSessionMgr::producerSetInt64(twrap_media_type_t media, const char* key, int64_t value) { tmedia_type_t _media = _get_media_type(media); - return (tmedia_session_mgr_set(this->mgr, + return (tmedia_session_mgr_set(m_pWrappedMgr, TMEDIA_SESSION_PRODUCER_SET_INT64(_media, key, value), TMEDIA_SESSION_SET_NULL()) == 0); } @@ -105,9 +105,9 @@ const ProxyPlugin* MediaSessionMgr::findProxyPlugin(twrap_media_type_t media, bo return tsk_null; } - if(manager && this->mgr){ + if(manager && m_pWrappedMgr){ tmedia_type_t _media = _get_media_type(media); - tmedia_session_t* session = tmedia_session_mgr_find(this->mgr, _media); + tmedia_session_t* session = tmedia_session_mgr_find(m_pWrappedMgr, _media); if(session){ if(session->plugin == tdav_session_audio_plugin_def_t){ if(consumer){ @@ -135,6 +135,31 @@ const ProxyPlugin* MediaSessionMgr::findProxyPlugin(twrap_media_type_t media, bo return plugin; } +uint64_t MediaSessionMgr::getSessionId(twrap_media_type_t media)const +{ + const ProxyPlugin* plugin = tsk_null; + ProxyPluginMgr* manager = ProxyPluginMgr::getInstance(); + uint64_t id = 0; + + if(media != twrap_media_audio && media != twrap_media_video){ + TSK_DEBUG_ERROR("Invalid media type"); + return tsk_null; + } + + if(manager && m_pWrappedMgr){ + tmedia_type_t _media = _get_media_type(media); + tmedia_session_t* session = tmedia_session_mgr_find(m_pWrappedMgr, _media); + if(session){ + id = session->id; + } + tsk_object_unref(session); + } + else{ + TSK_DEBUG_ERROR("Invalid state"); + } + + return id; +} bool MediaSessionMgr::defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl) { diff --git a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h index 2a85174f..cb0c710b 100644 --- a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h +++ b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h @@ -31,7 +31,7 @@ class MediaSessionMgr { public: #if !defined(SWIG) - MediaSessionMgr(tmedia_session_mgr_t* mgr); + MediaSessionMgr(tmedia_session_mgr_t* pWrappedMgr); #endif virtual ~MediaSessionMgr(); @@ -54,6 +54,8 @@ public: const ProxyPlugin* findProxyPluginProducer(twrap_media_type_t media)const{ return this->findProxyPlugin(media, false); } + + uint64_t getSessionId(twrap_media_type_t media)const; // Defaults static bool defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl); @@ -80,7 +82,7 @@ public: private: - tmedia_session_mgr_t* mgr; + tmedia_session_mgr_t* m_pWrappedMgr; }; #endif /* TINYWRAP_MEDIA_SESSIONMGR_H */ diff --git a/branches/2.0/doubango/bindings/_common/ProxyPluginMgr.cxx b/branches/2.0/doubango/bindings/_common/ProxyPluginMgr.cxx index 27cac99a..6c4a856d 100644 --- a/branches/2.0/doubango/bindings/_common/ProxyPluginMgr.cxx +++ b/branches/2.0/doubango/bindings/_common/ProxyPluginMgr.cxx @@ -61,18 +61,29 @@ ProxyPluginMgr::~ProxyPluginMgr() TSK_OBJECT_SAFE_FREE(this->plugins); } -ProxyPluginMgr* ProxyPluginMgr::createInstance(ProxyPluginMgrCallback* _callback) +ProxyPluginMgr* ProxyPluginMgr::createInstance(ProxyPluginMgrCallback* pCallback) { if(!ProxyPluginMgr::instance){ - ProxyPluginMgr::instance = new ProxyPluginMgr(_callback); + ProxyPluginMgr::instance = new ProxyPluginMgr(pCallback); } else{ TSK_DEBUG_WARN("Plugin instance already exist"); - ProxyPluginMgr::instance->callback = _callback; + ProxyPluginMgr::instance->callback = pCallback; } return ProxyPluginMgr::instance; } +void ProxyPluginMgr::destroyInstance(ProxyPluginMgr** ppInstance) +{ + if(ppInstance && *ppInstance){ + bool bMatch = ProxyPluginMgr::instance && (*ppInstance == ProxyPluginMgr::instance); + delete *ppInstance, *ppInstance = tsk_null; + if(bMatch){ + ProxyPluginMgr::instance = tsk_null; + } + } +} + ProxyPluginMgr* ProxyPluginMgr::getInstance() { if(!ProxyPluginMgr::instance){ diff --git a/branches/2.0/doubango/bindings/_common/ProxyPluginMgr.h b/branches/2.0/doubango/bindings/_common/ProxyPluginMgr.h index f287a658..a53ade30 100644 --- a/branches/2.0/doubango/bindings/_common/ProxyPluginMgr.h +++ b/branches/2.0/doubango/bindings/_common/ProxyPluginMgr.h @@ -54,7 +54,10 @@ public: virtual ~ProxyPluginMgr(); // SWIG %newobject - static ProxyPluginMgr* createInstance(ProxyPluginMgrCallback* callback); + static ProxyPluginMgr* createInstance(ProxyPluginMgrCallback* pCallback); +#if !defined(SWIG) + static void destroyInstance(ProxyPluginMgr** ppInstance); +#endif static ProxyPluginMgr* getInstance(); #if !defined(SWIG) diff --git a/branches/2.0/doubango/bindings/_common/SMSEncoder.cxx b/branches/2.0/doubango/bindings/_common/SMSEncoder.cxx index b03f90a9..f530503f 100644 --- a/branches/2.0/doubango/bindings/_common/SMSEncoder.cxx +++ b/branches/2.0/doubango/bindings/_common/SMSEncoder.cxx @@ -316,7 +316,7 @@ SMSData* SMSEncoder::decode(const void* data, unsigned size, bool MobOrig) if((tpdu = tsms_tpdu_message_deserialize(rp_data->udata->data, rp_data->udata->size, MobOrig))){ if(tpdu->mti == tsms_tpdu_mti_deliver_mt || tpdu->mti == tsms_tpdu_mti_submit_mo){ /* SMS-SUBMIT or SMS-DELIVER? */ ascii = tsms_tpdu_message_get_payload(tpdu); - decodedData = new SMSData(twrap_sms_type_rpdata, rp_message->mr, ascii, tsk_strlen(ascii)); + decodedData = new SMSData(twrap_sms_type_rpdata, rp_message->mr, ascii, (tsk_size_t)tsk_strlen(ascii)); if(tpdu->mti == tsms_tpdu_mti_deliver_mt){ tsms_tpdu_deliver_t* tpdu_deliver = (tsms_tpdu_deliver_t*)tpdu; diff --git a/branches/2.0/doubango/bindings/_common/SipSession.cxx b/branches/2.0/doubango/bindings/_common/SipSession.cxx index c1511a5d..2be5f156 100644 --- a/branches/2.0/doubango/bindings/_common/SipSession.cxx +++ b/branches/2.0/doubango/bindings/_common/SipSession.cxx @@ -176,6 +176,7 @@ bool SipSession::removeSigCompCompartment() TSIP_SSESSION_SET_NULL()) == 0); } +// FIXME: should be "uint64_t" instead of "unsigned" unsigned SipSession::getId()const { return (unsigned)tsip_ssession_get_id(m_pHandle); diff --git a/branches/2.0/doubango/bindings/_common/SipStack.cxx b/branches/2.0/doubango/bindings/_common/SipStack.cxx index 39a34cfe..ba26ee90 100644 --- a/branches/2.0/doubango/bindings/_common/SipStack.cxx +++ b/branches/2.0/doubango/bindings/_common/SipStack.cxx @@ -28,7 +28,7 @@ #include "Common.h" -unsigned SipStack::count = 0; +bool SipStack::g_bInitialized = false; /* === ANSI-C functions (local use) === */ @@ -50,10 +50,9 @@ SipStack::SipStack(SipCallback* pCallback, const char* realm_uri, const char* im m_pDebugCallback = tsk_null; m_pCallback = pCallback; - /* Initialize network layer */ - if(SipStack::count == 0){ - tdav_init(); - tnet_startup(); + /* Initialize network and media layers */ + if(!SipStack::initialize()){ + return;// isValid() will be false } /* Creates stack handle */ @@ -61,8 +60,6 @@ SipStack::SipStack(SipCallback* pCallback, const char* realm_uri, const char* im TSIP_STACK_SET_LOCAL_IP(DEFAULT_LOCAL_IP), TSIP_STACK_SET_USERDATA(this), /* used as context (useful for server-initiated requests) */ TSIP_STACK_SET_NULL()); - - SipStack::count++; } SipStack::~SipStack() @@ -71,12 +68,6 @@ SipStack::~SipStack() /* Destroy stack handle */ TSK_OBJECT_SAFE_FREE(m_pHandle); - - /* DeInitialize the network layer (only if last stack) */ - if(--SipStack::count == 0){ - tdav_deinit(); - tnet_cleanup(); - } } bool SipStack::start() @@ -391,6 +382,35 @@ bool SipStack::stop() return (ret == 0); } +bool SipStack::initialize() +{ + if(!g_bInitialized) + { + int ret; + + if((ret = tnet_startup())){ + TSK_DEBUG_ERROR("tnet_startup failed with error code=%d", ret); + return false; + } + if((ret = tdav_init())){ + TSK_DEBUG_ERROR("tdav_init failed with error code=%d", ret); + return false; + } + g_bInitialized = true; + } + return true; +} + +bool SipStack::deInitialize() +{ + if(SipStack::g_bInitialized){ + tdav_deinit(); + tnet_cleanup(); + SipStack::g_bInitialized = false; + } + return false; +} + void SipStack::setCodecs(tdav_codec_id_t codecs) { tdav_set_codecs(codecs); diff --git a/branches/2.0/doubango/bindings/_common/SipStack.h b/branches/2.0/doubango/bindings/_common/SipStack.h index b7273376..114a83be 100644 --- a/branches/2.0/doubango/bindings/_common/SipStack.h +++ b/branches/2.0/doubango/bindings/_common/SipStack.h @@ -81,6 +81,8 @@ public: /* API functions */ bool isValid(); bool stop(); + static bool initialize(); + static bool deInitialize(); static void setCodecs(tdav_codec_id_t codecs); static void setCodecs_2(int codecs); // For stupid languages static bool setCodecPriority(tdav_codec_id_t codec_id, int priority); @@ -105,7 +107,7 @@ private: DDebugCallback* m_pDebugCallback; tsip_stack_handle_t* m_pHandle; - static unsigned count; + static bool g_bInitialized; }; #endif /* TINYWRAP_SIPSTACK_H */ diff --git a/branches/2.0/doubango/bindings/_common/SipUri.cxx b/branches/2.0/doubango/bindings/_common/SipUri.cxx index f0ab3b5f..6be18f1d 100644 --- a/branches/2.0/doubango/bindings/_common/SipUri.cxx +++ b/branches/2.0/doubango/bindings/_common/SipUri.cxx @@ -23,7 +23,7 @@ SipUri::SipUri(const char* uriString, const char* displayName/*=tsk_null*/) { - if((m_pUri = tsip_uri_parse(uriString, tsk_strlen(uriString))) && displayName){ + if((m_pUri = tsip_uri_parse(uriString, (tsk_size_t)tsk_strlen(uriString))) && displayName){ m_pUri->display_name = tsk_strdup(displayName); } } @@ -38,7 +38,7 @@ bool SipUri::isValid(const char* uriString) tsip_uri_t* uri; bool ret = false; - if((uri = tsip_uri_parse(uriString, tsk_strlen(uriString)))){ + if((uri = tsip_uri_parse(uriString, (tsk_size_t)tsk_strlen(uriString)))){ ret = (uri->type != uri_unknown) && (!tsk_strnullORempty(uri->host)); TSK_OBJECT_SAFE_FREE(uri); diff --git a/branches/2.0/doubango/bindings/_common/Xcap.cxx b/branches/2.0/doubango/bindings/_common/Xcap.cxx index 3c04483e..84ccabeb 100644 --- a/branches/2.0/doubango/bindings/_common/Xcap.cxx +++ b/branches/2.0/doubango/bindings/_common/Xcap.cxx @@ -215,7 +215,7 @@ char* XcapSelector::getString() /* append the namespace */ if(_namespace){ - tsk_buffer_append(buffer, _namespace, strlen(_namespace)); + tsk_buffer_append(buffer, _namespace, (tsk_size_t)tsk_strlen(_namespace)); TSK_FREE(_namespace); } diff --git a/branches/2.0/doubango/bindings/csharp/MediaSessionMgr.cs b/branches/2.0/doubango/bindings/csharp/MediaSessionMgr.cs index 845f25b1..7b9b5210 100644 --- a/branches/2.0/doubango/bindings/csharp/MediaSessionMgr.cs +++ b/branches/2.0/doubango/bindings/csharp/MediaSessionMgr.cs @@ -76,6 +76,11 @@ public class MediaSessionMgr : IDisposable { return ret; } + public ulong getSessionId(twrap_media_type_t media) { + ulong ret = tinyWRAPPINVOKE.MediaSessionMgr_getSessionId(swigCPtr, (int)media); + return ret; + } + public static bool defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl) { bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetBandwidthLevel((int)bl); return ret; diff --git a/branches/2.0/doubango/bindings/csharp/ProxyPluginMgr.cs b/branches/2.0/doubango/bindings/csharp/ProxyPluginMgr.cs index ef1be3fb..1bb96070 100644 --- a/branches/2.0/doubango/bindings/csharp/ProxyPluginMgr.cs +++ b/branches/2.0/doubango/bindings/csharp/ProxyPluginMgr.cs @@ -39,8 +39,8 @@ public class ProxyPluginMgr : IDisposable { } } - public static ProxyPluginMgr createInstance(ProxyPluginMgrCallback callback) { - IntPtr cPtr = tinyWRAPPINVOKE.ProxyPluginMgr_createInstance(ProxyPluginMgrCallback.getCPtr(callback)); + public static ProxyPluginMgr createInstance(ProxyPluginMgrCallback pCallback) { + IntPtr cPtr = tinyWRAPPINVOKE.ProxyPluginMgr_createInstance(ProxyPluginMgrCallback.getCPtr(pCallback)); ProxyPluginMgr ret = (cPtr == IntPtr.Zero) ? null : new ProxyPluginMgr(cPtr, true); return ret; } diff --git a/branches/2.0/doubango/bindings/csharp/SipStack.cs b/branches/2.0/doubango/bindings/csharp/SipStack.cs index 8467b940..4bedf602 100644 --- a/branches/2.0/doubango/bindings/csharp/SipStack.cs +++ b/branches/2.0/doubango/bindings/csharp/SipStack.cs @@ -206,6 +206,16 @@ public class SipStack : SafeObject { return ret; } + public static bool initialize() { + bool ret = tinyWRAPPINVOKE.SipStack_initialize(); + return ret; + } + + public static bool deInitialize() { + bool ret = tinyWRAPPINVOKE.SipStack_deInitialize(); + return ret; + } + public static void setCodecs(tdav_codec_id_t codecs) { tinyWRAPPINVOKE.SipStack_setCodecs((int)codecs); } diff --git a/branches/2.0/doubango/bindings/csharp/tinyWRAPPINVOKE.cs b/branches/2.0/doubango/bindings/csharp/tinyWRAPPINVOKE.cs index 31ad54e2..722c5e25 100644 --- a/branches/2.0/doubango/bindings/csharp/tinyWRAPPINVOKE.cs +++ b/branches/2.0/doubango/bindings/csharp/tinyWRAPPINVOKE.cs @@ -278,6 +278,9 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_findProxyPluginProducer")] public static extern IntPtr MediaSessionMgr_findProxyPluginProducer(HandleRef jarg1, int jarg2); + [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_getSessionId")] + public static extern ulong MediaSessionMgr_getSessionId(HandleRef jarg1, int jarg2); + [DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetBandwidthLevel")] public static extern bool MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1); @@ -1346,6 +1349,12 @@ class tinyWRAPPINVOKE { [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_stop")] public static extern bool SipStack_stop(HandleRef jarg1); + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_initialize")] + public static extern bool SipStack_initialize(); + + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_deInitialize")] + public static extern bool SipStack_deInitialize(); + [DllImport("tinyWRAP", EntryPoint="CSharp_SipStack_setCodecs")] public static extern void SipStack_setCodecs(int jarg1); diff --git a/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.cxx index 62ab3317..2994f05f 100644 --- a/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/csharp/tinyWRAP_wrap.cxx @@ -1522,6 +1522,20 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_MediaSessionMgr_findProxyPluginProducer(voi } +SWIGEXPORT unsigned long long SWIGSTDCALL CSharp_MediaSessionMgr_getSessionId(void * jarg1, int jarg2) { + unsigned long long jresult ; + MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ; + twrap_media_type_t arg2 ; + uint64_t result; + + arg1 = (MediaSessionMgr *)jarg1; + arg2 = (twrap_media_type_t)jarg2; + result = (uint64_t)((MediaSessionMgr const *)arg1)->getSessionId(arg2); + jresult = result; + return jresult; +} + + SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1) { unsigned int jresult ; tmedia_bandwidth_level_t arg1 ; @@ -6068,6 +6082,26 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_stop(void * jarg1) { } +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_initialize() { + unsigned int jresult ; + bool result; + + result = (bool)SipStack::initialize(); + jresult = result; + return jresult; +} + + +SWIGEXPORT unsigned int SWIGSTDCALL CSharp_SipStack_deInitialize() { + unsigned int jresult ; + bool result; + + result = (bool)SipStack::deInitialize(); + jresult = result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_SipStack_setCodecs(int jarg1) { tdav_codec_id_t arg1 ; diff --git a/branches/2.0/doubango/bindings/csharp/twrap_media_type_t.cs b/branches/2.0/doubango/bindings/csharp/twrap_media_type_t.cs index b0f1b404..8b1e7756 100644 --- a/branches/2.0/doubango/bindings/csharp/twrap_media_type_t.cs +++ b/branches/2.0/doubango/bindings/csharp/twrap_media_type_t.cs @@ -9,11 +9,11 @@ namespace org.doubango.tinyWRAP { public enum twrap_media_type_t { - twrap_media_none, - twrap_media_audio, - twrap_media_video, - twrap_media_audiovideo, - twrap_media_msrp + twrap_media_none = 0x00, + twrap_media_audio = (0x01 << 0), + twrap_media_video = (0x01 << 1), + twrap_media_audiovideo = (twrap_media_audio|twrap_media_video), + twrap_media_msrp = (0x01 << 2) } } diff --git a/branches/2.0/doubango/bindings/java/MediaSessionMgr.java b/branches/2.0/doubango/bindings/java/MediaSessionMgr.java index 53933174..f1712836 100644 --- a/branches/2.0/doubango/bindings/java/MediaSessionMgr.java +++ b/branches/2.0/doubango/bindings/java/MediaSessionMgr.java @@ -63,6 +63,10 @@ public class MediaSessionMgr { return (cPtr == 0) ? null : new ProxyPlugin(cPtr, false); } + public java.math.BigInteger getSessionId(twrap_media_type_t media) { + return tinyWRAPJNI.MediaSessionMgr_getSessionId(swigCPtr, this, media.swigValue()); + } + public static boolean defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl) { return tinyWRAPJNI.MediaSessionMgr_defaultsSetBandwidthLevel(bl.swigValue()); } diff --git a/branches/2.0/doubango/bindings/java/ProxyPluginMgr.java b/branches/2.0/doubango/bindings/java/ProxyPluginMgr.java index 03f96834..5ae2c20d 100644 --- a/branches/2.0/doubango/bindings/java/ProxyPluginMgr.java +++ b/branches/2.0/doubango/bindings/java/ProxyPluginMgr.java @@ -33,8 +33,8 @@ public class ProxyPluginMgr { swigCPtr = 0; } - public static ProxyPluginMgr createInstance(ProxyPluginMgrCallback callback) { - long cPtr = tinyWRAPJNI.ProxyPluginMgr_createInstance(ProxyPluginMgrCallback.getCPtr(callback), callback); + public static ProxyPluginMgr createInstance(ProxyPluginMgrCallback pCallback) { + long cPtr = tinyWRAPJNI.ProxyPluginMgr_createInstance(ProxyPluginMgrCallback.getCPtr(pCallback), pCallback); return (cPtr == 0) ? null : new ProxyPluginMgr(cPtr, true); } diff --git a/branches/2.0/doubango/bindings/java/SipStack.java b/branches/2.0/doubango/bindings/java/SipStack.java index 3c4f9c30..f0f8a346 100644 --- a/branches/2.0/doubango/bindings/java/SipStack.java +++ b/branches/2.0/doubango/bindings/java/SipStack.java @@ -169,6 +169,14 @@ public class SipStack extends SafeObject { return tinyWRAPJNI.SipStack_stop(swigCPtr, this); } + public static boolean initialize() { + return tinyWRAPJNI.SipStack_initialize(); + } + + public static boolean deInitialize() { + return tinyWRAPJNI.SipStack_deInitialize(); + } + public static void setCodecs(tdav_codec_id_t codecs) { tinyWRAPJNI.SipStack_setCodecs(codecs.swigValue()); } diff --git a/branches/2.0/doubango/bindings/java/android/MediaSessionMgr.java b/branches/2.0/doubango/bindings/java/android/MediaSessionMgr.java index 53933174..f1712836 100644 --- a/branches/2.0/doubango/bindings/java/android/MediaSessionMgr.java +++ b/branches/2.0/doubango/bindings/java/android/MediaSessionMgr.java @@ -63,6 +63,10 @@ public class MediaSessionMgr { return (cPtr == 0) ? null : new ProxyPlugin(cPtr, false); } + public java.math.BigInteger getSessionId(twrap_media_type_t media) { + return tinyWRAPJNI.MediaSessionMgr_getSessionId(swigCPtr, this, media.swigValue()); + } + public static boolean defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl) { return tinyWRAPJNI.MediaSessionMgr_defaultsSetBandwidthLevel(bl.swigValue()); } diff --git a/branches/2.0/doubango/bindings/java/android/ProxyPluginMgr.java b/branches/2.0/doubango/bindings/java/android/ProxyPluginMgr.java index 03f96834..5ae2c20d 100644 --- a/branches/2.0/doubango/bindings/java/android/ProxyPluginMgr.java +++ b/branches/2.0/doubango/bindings/java/android/ProxyPluginMgr.java @@ -33,8 +33,8 @@ public class ProxyPluginMgr { swigCPtr = 0; } - public static ProxyPluginMgr createInstance(ProxyPluginMgrCallback callback) { - long cPtr = tinyWRAPJNI.ProxyPluginMgr_createInstance(ProxyPluginMgrCallback.getCPtr(callback), callback); + public static ProxyPluginMgr createInstance(ProxyPluginMgrCallback pCallback) { + long cPtr = tinyWRAPJNI.ProxyPluginMgr_createInstance(ProxyPluginMgrCallback.getCPtr(pCallback), pCallback); return (cPtr == 0) ? null : new ProxyPluginMgr(cPtr, true); } diff --git a/branches/2.0/doubango/bindings/java/android/SipStack.java b/branches/2.0/doubango/bindings/java/android/SipStack.java index 3c4f9c30..f0f8a346 100644 --- a/branches/2.0/doubango/bindings/java/android/SipStack.java +++ b/branches/2.0/doubango/bindings/java/android/SipStack.java @@ -169,6 +169,14 @@ public class SipStack extends SafeObject { return tinyWRAPJNI.SipStack_stop(swigCPtr, this); } + public static boolean initialize() { + return tinyWRAPJNI.SipStack_initialize(); + } + + public static boolean deInitialize() { + return tinyWRAPJNI.SipStack_deInitialize(); + } + public static void setCodecs(tdav_codec_id_t codecs) { tinyWRAPJNI.SipStack_setCodecs(codecs.swigValue()); } diff --git a/branches/2.0/doubango/bindings/java/android/tinyWRAPJNI.java b/branches/2.0/doubango/bindings/java/android/tinyWRAPJNI.java index a44d7a50..3e65e908 100644 --- a/branches/2.0/doubango/bindings/java/android/tinyWRAPJNI.java +++ b/branches/2.0/doubango/bindings/java/android/tinyWRAPJNI.java @@ -41,6 +41,7 @@ class tinyWRAPJNI { public final static native boolean MediaSessionMgr_producerSetInt64(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, long jarg4); public final static native long MediaSessionMgr_findProxyPluginConsumer(long jarg1, MediaSessionMgr jarg1_, int jarg2); public final static native long MediaSessionMgr_findProxyPluginProducer(long jarg1, MediaSessionMgr jarg1_, int jarg2); + public final static native java.math.BigInteger MediaSessionMgr_getSessionId(long jarg1, MediaSessionMgr jarg1_, int jarg2); public final static native boolean MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1); public final static native int MediaSessionMgr_defaultsGetBandwidthLevel(); public final static native boolean MediaSessionMgr_defaultsSetEchoTail(long jarg1); @@ -403,6 +404,8 @@ class tinyWRAPJNI { public final static native String SipStack_getPreferredIdentity(long jarg1, SipStack jarg1_); public final static native boolean SipStack_isValid(long jarg1, SipStack jarg1_); public final static native boolean SipStack_stop(long jarg1, SipStack jarg1_); + public final static native boolean SipStack_initialize(); + public final static native boolean SipStack_deInitialize(); public final static native void SipStack_setCodecs(int jarg1); public final static native void SipStack_setCodecs_2(int jarg1); public final static native boolean SipStack_setCodecPriority(int jarg1, int jarg2); diff --git a/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.cxx index c59f8451..0b002cd9 100644 --- a/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/java/android/tinyWRAP_wrap.cxx @@ -2412,6 +2412,39 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_ } +SWIGEXPORT jobject JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1getSessionId(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) { + jobject jresult = 0 ; + MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ; + twrap_media_type_t arg2 ; + uint64_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(MediaSessionMgr **)&jarg1; + arg2 = (twrap_media_type_t)jarg2; + result = (uint64_t)((MediaSessionMgr const *)arg1)->getSessionId(arg2); + { + jbyteArray ba = jenv->NewByteArray(9); + jbyte* bae = jenv->GetByteArrayElements(ba, 0); + jclass clazz = jenv->FindClass("java/math/BigInteger"); + jmethodID mid = jenv->GetMethodID(clazz, "", "([B)V"); + jobject bigint; + int i; + + bae[0] = 0; + for(i=1; i<9; i++ ) { + bae[i] = (jbyte)(result>>8*(8-i)); + } + + jenv->ReleaseByteArrayElements(ba, bae, 0); + bigint = jenv->NewObject(clazz, mid, ba); + jresult = bigint; + } + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetBandwidthLevel(JNIEnv *jenv, jclass jcls, jint jarg1) { jboolean jresult = 0 ; tmedia_bandwidth_level_t arg1 ; @@ -8771,6 +8804,30 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1sto } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1initialize(JNIEnv *jenv, jclass jcls) { + jboolean jresult = 0 ; + bool result; + + (void)jenv; + (void)jcls; + result = (bool)SipStack::initialize(); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1deInitialize(JNIEnv *jenv, jclass jcls) { + jboolean jresult = 0 ; + bool result; + + (void)jenv; + (void)jcls; + result = (bool)SipStack::deInitialize(); + jresult = (jboolean)result; + return jresult; +} + + SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setCodecs(JNIEnv *jenv, jclass jcls, jint jarg1) { tdav_codec_id_t arg1 ; diff --git a/branches/2.0/doubango/bindings/java/android/twrap_media_type_t.java b/branches/2.0/doubango/bindings/java/android/twrap_media_type_t.java index c70e6c96..2a680670 100644 --- a/branches/2.0/doubango/bindings/java/android/twrap_media_type_t.java +++ b/branches/2.0/doubango/bindings/java/android/twrap_media_type_t.java @@ -9,11 +9,11 @@ package org.doubango.tinyWRAP; public enum twrap_media_type_t { - twrap_media_none, - twrap_media_audio, - twrap_media_video, - twrap_media_audiovideo, - twrap_media_msrp; + twrap_media_none(0x00), + twrap_media_audio((0x01 << 0)), + twrap_media_video((0x01 << 1)), + twrap_media_audiovideo((twrap_media_audio|twrap_media_video)), + twrap_media_msrp((0x01 << 2)); public final int swigValue() { return swigValue; diff --git a/branches/2.0/doubango/bindings/java/tinyWRAPJNI.java b/branches/2.0/doubango/bindings/java/tinyWRAPJNI.java index a44d7a50..3e65e908 100644 --- a/branches/2.0/doubango/bindings/java/tinyWRAPJNI.java +++ b/branches/2.0/doubango/bindings/java/tinyWRAPJNI.java @@ -41,6 +41,7 @@ class tinyWRAPJNI { public final static native boolean MediaSessionMgr_producerSetInt64(long jarg1, MediaSessionMgr jarg1_, int jarg2, String jarg3, long jarg4); public final static native long MediaSessionMgr_findProxyPluginConsumer(long jarg1, MediaSessionMgr jarg1_, int jarg2); public final static native long MediaSessionMgr_findProxyPluginProducer(long jarg1, MediaSessionMgr jarg1_, int jarg2); + public final static native java.math.BigInteger MediaSessionMgr_getSessionId(long jarg1, MediaSessionMgr jarg1_, int jarg2); public final static native boolean MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1); public final static native int MediaSessionMgr_defaultsGetBandwidthLevel(); public final static native boolean MediaSessionMgr_defaultsSetEchoTail(long jarg1); @@ -403,6 +404,8 @@ class tinyWRAPJNI { public final static native String SipStack_getPreferredIdentity(long jarg1, SipStack jarg1_); public final static native boolean SipStack_isValid(long jarg1, SipStack jarg1_); public final static native boolean SipStack_stop(long jarg1, SipStack jarg1_); + public final static native boolean SipStack_initialize(); + public final static native boolean SipStack_deInitialize(); public final static native void SipStack_setCodecs(int jarg1); public final static native void SipStack_setCodecs_2(int jarg1); public final static native boolean SipStack_setCodecPriority(int jarg1, int jarg2); diff --git a/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.cxx index a7c079ac..a274f10a 100644 --- a/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/java/tinyWRAP_wrap.cxx @@ -2412,6 +2412,39 @@ SWIGEXPORT jlong JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_ } +SWIGEXPORT jobject JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1getSessionId(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) { + jobject jresult = 0 ; + MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ; + twrap_media_type_t arg2 ; + uint64_t result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(MediaSessionMgr **)&jarg1; + arg2 = (twrap_media_type_t)jarg2; + result = (uint64_t)((MediaSessionMgr const *)arg1)->getSessionId(arg2); + { + jbyteArray ba = jenv->NewByteArray(9); + jbyte* bae = jenv->GetByteArrayElements(ba, 0); + jclass clazz = jenv->FindClass("java/math/BigInteger"); + jmethodID mid = jenv->GetMethodID(clazz, "", "([B)V"); + jobject bigint; + int i; + + bae[0] = 0; + for(i=1; i<9; i++ ) { + bae[i] = (jbyte)(result>>8*(8-i)); + } + + jenv->ReleaseByteArrayElements(ba, bae, 0); + bigint = jenv->NewObject(clazz, mid, ba); + jresult = bigint; + } + return jresult; +} + + SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetBandwidthLevel(JNIEnv *jenv, jclass jcls, jint jarg1) { jboolean jresult = 0 ; tmedia_bandwidth_level_t arg1 ; @@ -8771,6 +8804,30 @@ SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1sto } +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1initialize(JNIEnv *jenv, jclass jcls) { + jboolean jresult = 0 ; + bool result; + + (void)jenv; + (void)jcls; + result = (bool)SipStack::initialize(); + jresult = (jboolean)result; + return jresult; +} + + +SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1deInitialize(JNIEnv *jenv, jclass jcls) { + jboolean jresult = 0 ; + bool result; + + (void)jenv; + (void)jcls; + result = (bool)SipStack::deInitialize(); + jresult = (jboolean)result; + return jresult; +} + + SWIGEXPORT void JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_SipStack_1setCodecs(JNIEnv *jenv, jclass jcls, jint jarg1) { tdav_codec_id_t arg1 ; diff --git a/branches/2.0/doubango/bindings/java/twrap_media_type_t.java b/branches/2.0/doubango/bindings/java/twrap_media_type_t.java index c70e6c96..2a680670 100644 --- a/branches/2.0/doubango/bindings/java/twrap_media_type_t.java +++ b/branches/2.0/doubango/bindings/java/twrap_media_type_t.java @@ -9,11 +9,11 @@ package org.doubango.tinyWRAP; public enum twrap_media_type_t { - twrap_media_none, - twrap_media_audio, - twrap_media_video, - twrap_media_audiovideo, - twrap_media_msrp; + twrap_media_none(0x00), + twrap_media_audio((0x01 << 0)), + twrap_media_video((0x01 << 1)), + twrap_media_audiovideo((twrap_media_audio|twrap_media_video)), + twrap_media_msrp((0x01 << 2)); public final int swigValue() { return swigValue; diff --git a/branches/2.0/doubango/bindings/perl/tinyWRAP.pm b/branches/2.0/doubango/bindings/perl/tinyWRAP.pm index 88b82c3a..e6c561b5 100644 --- a/branches/2.0/doubango/bindings/perl/tinyWRAP.pm +++ b/branches/2.0/doubango/bindings/perl/tinyWRAP.pm @@ -198,6 +198,7 @@ sub DESTROY { *producerSetInt64 = *tinyWRAPc::MediaSessionMgr_producerSetInt64; *findProxyPluginConsumer = *tinyWRAPc::MediaSessionMgr_findProxyPluginConsumer; *findProxyPluginProducer = *tinyWRAPc::MediaSessionMgr_findProxyPluginProducer; +*getSessionId = *tinyWRAPc::MediaSessionMgr_getSessionId; *defaultsSetBandwidthLevel = *tinyWRAPc::MediaSessionMgr_defaultsSetBandwidthLevel; *defaultsGetBandwidthLevel = *tinyWRAPc::MediaSessionMgr_defaultsGetBandwidthLevel; *defaultsSetEchoTail = *tinyWRAPc::MediaSessionMgr_defaultsSetEchoTail; @@ -1718,6 +1719,8 @@ sub DESTROY { *getPreferredIdentity = *tinyWRAPc::SipStack_getPreferredIdentity; *isValid = *tinyWRAPc::SipStack_isValid; *stop = *tinyWRAPc::SipStack_stop; +*initialize = *tinyWRAPc::SipStack_initialize; +*deInitialize = *tinyWRAPc::SipStack_deInitialize; *setCodecs = *tinyWRAPc::SipStack_setCodecs; *setCodecs_2 = *tinyWRAPc::SipStack_setCodecs_2; *setCodecPriority = *tinyWRAPc::SipStack_setCodecPriority; diff --git a/branches/2.0/doubango/bindings/perl/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/perl/tinyWRAP_wrap.cxx index b60bf340..2c6d61c0 100644 --- a/branches/2.0/doubango/bindings/perl/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/perl/tinyWRAP_wrap.cxx @@ -1995,6 +1995,44 @@ SWIG_AsVal_long_SS_long SWIG_PERL_DECL_ARGS_2(SV *obj, long long *val) } +#include +#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) +# ifndef snprintf +# define snprintf _snprintf +# endif +#endif + + +SWIGINTERNINLINE SV * +SWIG_From_long_SS_long SWIG_PERL_DECL_ARGS_1(long long value) +{ + if (((long long) LONG_MIN <= value) && (value <= (long long) LONG_MAX)) { + return SWIG_From_long SWIG_PERL_CALL_ARGS_1(static_cast< long >(value)); + } else { + char temp[256]; + SV *obj = sv_newmortal(); + sprintf(temp, "%lld", value); + sv_setpv(obj, temp); + return obj; + } +} + + +SWIGINTERNINLINE SV * +SWIG_From_unsigned_SS_long_SS_long SWIG_PERL_DECL_ARGS_1(unsigned long long value) +{ + if (value < (unsigned long long) LONG_MAX) { + return SWIG_From_long_SS_long SWIG_PERL_CALL_ARGS_1(static_cast< long long >(value)); + } else { + char temp[256]; + SV *obj = sv_newmortal(); + sprintf(temp, "%llu", value); + sv_setpv(obj, temp); + return obj; + } +} + + SWIGINTERN int SWIG_AsVal_bool SWIG_PERL_DECL_ARGS_2(SV *obj, bool* val) { @@ -2167,44 +2205,6 @@ SWIG_AsVal_unsigned_SS_long_SS_long SWIG_PERL_DECL_ARGS_2(SV *obj, unsigned long } -#include -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) -# ifndef snprintf -# define snprintf _snprintf -# endif -#endif - - -SWIGINTERNINLINE SV * -SWIG_From_long_SS_long SWIG_PERL_DECL_ARGS_1(long long value) -{ - if (((long long) LONG_MIN <= value) && (value <= (long long) LONG_MAX)) { - return SWIG_From_long SWIG_PERL_CALL_ARGS_1(static_cast< long >(value)); - } else { - char temp[256]; - SV *obj = sv_newmortal(); - sprintf(temp, "%lld", value); - sv_setpv(obj, temp); - return obj; - } -} - - -SWIGINTERNINLINE SV * -SWIG_From_unsigned_SS_long_SS_long SWIG_PERL_DECL_ARGS_1(unsigned long long value) -{ - if (value < (unsigned long long) LONG_MAX) { - return SWIG_From_long_SS_long SWIG_PERL_CALL_ARGS_1(static_cast< long long >(value)); - } else { - char temp[256]; - SV *obj = sv_newmortal(); - sprintf(temp, "%llu", value); - sv_setpv(obj, temp); - return obj; - } -} - - SWIGINTERN int SWIG_AsVal_unsigned_SS_short SWIG_PERL_DECL_ARGS_2(SV * obj, unsigned short *val) { @@ -3363,6 +3363,44 @@ XS(_wrap_MediaSessionMgr_findProxyPluginProducer) { } +XS(_wrap_MediaSessionMgr_getSessionId) { + { + MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ; + twrap_media_type_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int argvi = 0; + uint64_t result; + dXSARGS; + + if ((items < 2) || (items > 2)) { + SWIG_croak("Usage: MediaSessionMgr_getSessionId(self,media);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_MediaSessionMgr, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MediaSessionMgr_getSessionId" "', argument " "1"" of type '" "MediaSessionMgr const *""'"); + } + arg1 = reinterpret_cast< MediaSessionMgr * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MediaSessionMgr_getSessionId" "', argument " "2"" of type '" "twrap_media_type_t""'"); + } + arg2 = static_cast< twrap_media_type_t >(val2); + result = (uint64_t)((MediaSessionMgr const *)arg1)->getSessionId(arg2); + ST(argvi) = SWIG_From_unsigned_SS_long_SS_long SWIG_PERL_CALL_ARGS_1(static_cast< unsigned long long >(result)); argvi++ ; + + + XSRETURN(argvi); + fail: + + + SWIG_croak_null(); + } +} + + XS(_wrap_MediaSessionMgr_defaultsSetBandwidthLevel) { { tmedia_bandwidth_level_t arg1 ; @@ -12288,7 +12326,7 @@ XS(_wrap_ProxyPluginMgr_createInstance) { dXSARGS; if ((items < 1) || (items > 1)) { - SWIG_croak("Usage: ProxyPluginMgr_createInstance(callback);"); + SWIG_croak("Usage: ProxyPluginMgr_createInstance(pCallback);"); } res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_ProxyPluginMgrCallback, 0 | 0 ); if (!SWIG_IsOK(res1)) { @@ -17381,6 +17419,42 @@ XS(_wrap_SipStack_stop) { } +XS(_wrap_SipStack_initialize) { + { + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: SipStack_initialize();"); + } + result = (bool)SipStack::initialize(); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + +XS(_wrap_SipStack_deInitialize) { + { + int argvi = 0; + bool result; + dXSARGS; + + if ((items < 0) || (items > 0)) { + SWIG_croak("Usage: SipStack_deInitialize();"); + } + result = (bool)SipStack::deInitialize(); + ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ; + XSRETURN(argvi); + fail: + SWIG_croak_null(); + } +} + + XS(_wrap_SipStack_setCodecs) { { tdav_codec_id_t arg1 ; @@ -21407,6 +21481,7 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::MediaSessionMgr_producerSetInt64", _wrap_MediaSessionMgr_producerSetInt64}, {"tinyWRAPc::MediaSessionMgr_findProxyPluginConsumer", _wrap_MediaSessionMgr_findProxyPluginConsumer}, {"tinyWRAPc::MediaSessionMgr_findProxyPluginProducer", _wrap_MediaSessionMgr_findProxyPluginProducer}, +{"tinyWRAPc::MediaSessionMgr_getSessionId", _wrap_MediaSessionMgr_getSessionId}, {"tinyWRAPc::MediaSessionMgr_defaultsSetBandwidthLevel", _wrap_MediaSessionMgr_defaultsSetBandwidthLevel}, {"tinyWRAPc::MediaSessionMgr_defaultsGetBandwidthLevel", _wrap_MediaSessionMgr_defaultsGetBandwidthLevel}, {"tinyWRAPc::MediaSessionMgr_defaultsSetEchoTail", _wrap_MediaSessionMgr_defaultsSetEchoTail}, @@ -21687,6 +21762,8 @@ static swig_command_info swig_commands[] = { {"tinyWRAPc::SipStack_getPreferredIdentity", _wrap_SipStack_getPreferredIdentity}, {"tinyWRAPc::SipStack_isValid", _wrap_SipStack_isValid}, {"tinyWRAPc::SipStack_stop", _wrap_SipStack_stop}, +{"tinyWRAPc::SipStack_initialize", _wrap_SipStack_initialize}, +{"tinyWRAPc::SipStack_deInitialize", _wrap_SipStack_deInitialize}, {"tinyWRAPc::SipStack_setCodecs", _wrap_SipStack_setCodecs}, {"tinyWRAPc::SipStack_setCodecs_2", _wrap_SipStack_setCodecs_2}, {"tinyWRAPc::SipStack_setCodecPriority", _wrap_SipStack_setCodecPriority}, diff --git a/branches/2.0/doubango/bindings/python/tinyWRAP.py b/branches/2.0/doubango/bindings/python/tinyWRAP.py index 9793dc93..421180de 100644 --- a/branches/2.0/doubango/bindings/python/tinyWRAP.py +++ b/branches/2.0/doubango/bindings/python/tinyWRAP.py @@ -153,6 +153,7 @@ class MediaSessionMgr(_object): def producerSetInt64(self, *args): return _tinyWRAP.MediaSessionMgr_producerSetInt64(self, *args) def findProxyPluginConsumer(self, *args): return _tinyWRAP.MediaSessionMgr_findProxyPluginConsumer(self, *args) def findProxyPluginProducer(self, *args): return _tinyWRAP.MediaSessionMgr_findProxyPluginProducer(self, *args) + def getSessionId(self, *args): return _tinyWRAP.MediaSessionMgr_getSessionId(self, *args) __swig_getmethods__["defaultsSetBandwidthLevel"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetBandwidthLevel if _newclass:defaultsSetBandwidthLevel = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetBandwidthLevel) __swig_getmethods__["defaultsGetBandwidthLevel"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsGetBandwidthLevel @@ -1142,6 +1143,10 @@ class SipStack(SafeObject): def getPreferredIdentity(self): return _tinyWRAP.SipStack_getPreferredIdentity(self) def isValid(self): return _tinyWRAP.SipStack_isValid(self) def stop(self): return _tinyWRAP.SipStack_stop(self) + __swig_getmethods__["initialize"] = lambda x: _tinyWRAP.SipStack_initialize + if _newclass:initialize = staticmethod(_tinyWRAP.SipStack_initialize) + __swig_getmethods__["deInitialize"] = lambda x: _tinyWRAP.SipStack_deInitialize + if _newclass:deInitialize = staticmethod(_tinyWRAP.SipStack_deInitialize) __swig_getmethods__["setCodecs"] = lambda x: _tinyWRAP.SipStack_setCodecs if _newclass:setCodecs = staticmethod(_tinyWRAP.SipStack_setCodecs) __swig_getmethods__["setCodecs_2"] = lambda x: _tinyWRAP.SipStack_setCodecs_2 @@ -1155,6 +1160,14 @@ class SipStack(SafeObject): SipStack_swigregister = _tinyWRAP.SipStack_swigregister SipStack_swigregister(SipStack) +def SipStack_initialize(): + return _tinyWRAP.SipStack_initialize() +SipStack_initialize = _tinyWRAP.SipStack_initialize + +def SipStack_deInitialize(): + return _tinyWRAP.SipStack_deInitialize() +SipStack_deInitialize = _tinyWRAP.SipStack_deInitialize + def SipStack_setCodecs(*args): return _tinyWRAP.SipStack_setCodecs(*args) SipStack_setCodecs = _tinyWRAP.SipStack_setCodecs diff --git a/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.cxx b/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.cxx index 554dae98..369e3c16 100644 --- a/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.cxx +++ b/branches/2.0/doubango/bindings/python/tinyWRAP_wrap.cxx @@ -3721,6 +3721,22 @@ SWIG_AsVal_long_SS_long (PyObject *obj, long long *val) } +SWIGINTERNINLINE PyObject* +SWIG_From_long_SS_long (long long value) +{ + return ((value < LONG_MIN) || (value > LONG_MAX)) ? + PyLong_FromLongLong(value) : PyInt_FromLong(static_cast< long >(value)); +} + + +SWIGINTERNINLINE PyObject* +SWIG_From_unsigned_SS_long_SS_long (unsigned long long value) +{ + return (value > LONG_MAX) ? + PyLong_FromUnsignedLongLong(value) : PyInt_FromLong(static_cast< long >(value)); +} + + SWIGINTERN int SWIG_AsVal_bool (PyObject *obj, bool *val) { @@ -3851,22 +3867,6 @@ SWIG_AsVal_unsigned_SS_long_SS_long (PyObject *obj, unsigned long long *val) } -SWIGINTERNINLINE PyObject* -SWIG_From_long_SS_long (long long value) -{ - return ((value < LONG_MIN) || (value > LONG_MAX)) ? - PyLong_FromLongLong(value) : PyInt_FromLong(static_cast< long >(value)); -} - - -SWIGINTERNINLINE PyObject* -SWIG_From_unsigned_SS_long_SS_long (unsigned long long value) -{ - return (value > LONG_MAX) ? - PyLong_FromUnsignedLongLong(value) : PyInt_FromLong(static_cast< long >(value)); -} - - SWIGINTERN int SWIG_AsVal_unsigned_SS_short (PyObject * obj, unsigned short *val) { @@ -6089,6 +6089,37 @@ fail: } +SWIGINTERN PyObject *_wrap_MediaSessionMgr_getSessionId(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + MediaSessionMgr *arg1 = (MediaSessionMgr *) 0 ; + twrap_media_type_t arg2 ; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + uint64_t result; + + if (!PyArg_ParseTuple(args,(char *)"OO:MediaSessionMgr_getSessionId",&obj0,&obj1)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_MediaSessionMgr, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MediaSessionMgr_getSessionId" "', argument " "1"" of type '" "MediaSessionMgr const *""'"); + } + arg1 = reinterpret_cast< MediaSessionMgr * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MediaSessionMgr_getSessionId" "', argument " "2"" of type '" "twrap_media_type_t""'"); + } + arg2 = static_cast< twrap_media_type_t >(val2); + result = (uint64_t)((MediaSessionMgr const *)arg1)->getSessionId(arg2); + resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result)); + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetBandwidthLevel(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tmedia_bandwidth_level_t arg1 ; @@ -17691,6 +17722,32 @@ fail: } +SWIGINTERN PyObject *_wrap_SipStack_initialize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + bool result; + + if (!PyArg_ParseTuple(args,(char *)":SipStack_initialize")) SWIG_fail; + result = (bool)SipStack::initialize(); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_SipStack_deInitialize(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + bool result; + + if (!PyArg_ParseTuple(args,(char *)":SipStack_deInitialize")) SWIG_fail; + result = (bool)SipStack::deInitialize(); + resultobj = SWIG_From_bool(static_cast< bool >(result)); + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *_wrap_SipStack_setCodecs(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; tdav_codec_id_t arg1 ; @@ -20874,6 +20931,7 @@ static PyMethodDef SwigMethods[] = { { (char *)"MediaSessionMgr_producerSetInt64", _wrap_MediaSessionMgr_producerSetInt64, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_findProxyPluginConsumer", _wrap_MediaSessionMgr_findProxyPluginConsumer, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_findProxyPluginProducer", _wrap_MediaSessionMgr_findProxyPluginProducer, METH_VARARGS, NULL}, + { (char *)"MediaSessionMgr_getSessionId", _wrap_MediaSessionMgr_getSessionId, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsSetBandwidthLevel", _wrap_MediaSessionMgr_defaultsSetBandwidthLevel, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsGetBandwidthLevel", _wrap_MediaSessionMgr_defaultsGetBandwidthLevel, METH_VARARGS, NULL}, { (char *)"MediaSessionMgr_defaultsSetEchoTail", _wrap_MediaSessionMgr_defaultsSetEchoTail, METH_VARARGS, NULL}, @@ -21198,6 +21256,8 @@ static PyMethodDef SwigMethods[] = { { (char *)"SipStack_getPreferredIdentity", _wrap_SipStack_getPreferredIdentity, METH_VARARGS, NULL}, { (char *)"SipStack_isValid", _wrap_SipStack_isValid, METH_VARARGS, NULL}, { (char *)"SipStack_stop", _wrap_SipStack_stop, METH_VARARGS, NULL}, + { (char *)"SipStack_initialize", _wrap_SipStack_initialize, METH_VARARGS, NULL}, + { (char *)"SipStack_deInitialize", _wrap_SipStack_deInitialize, METH_VARARGS, NULL}, { (char *)"SipStack_setCodecs", _wrap_SipStack_setCodecs, METH_VARARGS, NULL}, { (char *)"SipStack_setCodecs_2", _wrap_SipStack_setCodecs_2, METH_VARARGS, NULL}, { (char *)"SipStack_setCodecPriority", _wrap_SipStack_setCodecPriority, METH_VARARGS, NULL}, diff --git a/branches/2.0/doubango/documentation/Doubango - Licensing Agreement.doc b/branches/2.0/doubango/documentation/Doubango - Licensing Agreement.doc new file mode 100644 index 0000000000000000000000000000000000000000..3047338b387c6c0f15e1b92329e11e2d5430df6d GIT binary patch literal 31232 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 ADF6Tf delta 45581 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 - uint64_t epoch = tsk_time_epoch(); + uint64_t now = tsk_time_now(); struct timeval tv; long ts = (rtp_hdr->timestamp/(jitterbuffer->rate/1000)); //=> Do not use (see clock_gettime() on linux): tsk_gettimeofday(&tv, tsk_null); - tv.tv_sec = (long)(epoch)/1000; - tv.tv_usec = (long)(epoch - (tv.tv_sec*1000))*1000; + tv.tv_sec = (long)(now)/1000; + tv.tv_usec = (long)(now - (tv.tv_sec*1000))*1000; tv.tv_sec -= (ts / jitterbuffer->rate); tv.tv_usec -= (ts % jitterbuffer->rate) * 125; diff --git a/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_jitterbuffer.c b/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_jitterbuffer.c index 43b224a2..80ed8272 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_jitterbuffer.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_jitterbuffer.c @@ -35,7 +35,7 @@ #include "tsk_debug.h" -int tdav_speex_jitterbuffer_open(tmedia_jitterbuffer_t* self, uint32_t frame_duration, uint32_t rate) +static int tdav_speex_jitterbuffer_open(tmedia_jitterbuffer_t* self, uint32_t frame_duration, uint32_t rate) { tdav_speex_jitterbuffer_t *jitterbuffer = (tdav_speex_jitterbuffer_t *)self; if(!(jitterbuffer->state = jitter_buffer_init((int)frame_duration))){ @@ -48,7 +48,7 @@ int tdav_speex_jitterbuffer_open(tmedia_jitterbuffer_t* self, uint32_t frame_dur return 0; } -int tdav_speex_jitterbuffer_tick(tmedia_jitterbuffer_t* self) +static int tdav_speex_jitterbuffer_tick(tmedia_jitterbuffer_t* self) { tdav_speex_jitterbuffer_t *jitterbuffer = (tdav_speex_jitterbuffer_t *)self; if(!jitterbuffer->state){ @@ -59,7 +59,7 @@ int tdav_speex_jitterbuffer_tick(tmedia_jitterbuffer_t* self) return 0; } -int tdav_speex_jitterbuffer_put(tmedia_jitterbuffer_t* self, void* data, tsk_size_t data_size, const tsk_object_t* proto_hdr) +static int tdav_speex_jitterbuffer_put(tmedia_jitterbuffer_t* self, void* data, tsk_size_t data_size, const tsk_object_t* proto_hdr) { tdav_speex_jitterbuffer_t *jitterbuffer = (tdav_speex_jitterbuffer_t *)self; const trtp_rtp_header_t* rtp_hdr; @@ -88,7 +88,7 @@ int tdav_speex_jitterbuffer_put(tmedia_jitterbuffer_t* self, void* data, tsk_siz return 0; } -tsk_size_t tdav_speex_jitterbuffer_get(tmedia_jitterbuffer_t* self, void* out_data, tsk_size_t out_size) +static tsk_size_t tdav_speex_jitterbuffer_get(tmedia_jitterbuffer_t* self, void* out_data, tsk_size_t out_size) { tdav_speex_jitterbuffer_t *jitterbuffer = (tdav_speex_jitterbuffer_t *)self; JitterBufferPacket jb_packet; @@ -120,7 +120,7 @@ tsk_size_t tdav_speex_jitterbuffer_get(tmedia_jitterbuffer_t* self, void* out_da return out_size; } -int tdav_speex_jitterbuffer_reset(tmedia_jitterbuffer_t* self) +static int tdav_speex_jitterbuffer_reset(tmedia_jitterbuffer_t* self) { tdav_speex_jitterbuffer_t *jitterbuffer = (tdav_speex_jitterbuffer_t *)self; if(jitterbuffer->state){ @@ -129,7 +129,7 @@ int tdav_speex_jitterbuffer_reset(tmedia_jitterbuffer_t* self) return 0; } -int tdav_speex_jitterbuffer_close(tmedia_jitterbuffer_t* self) +static int tdav_speex_jitterbuffer_close(tmedia_jitterbuffer_t* self) { tdav_speex_jitterbuffer_t *jitterbuffer = (tdav_speex_jitterbuffer_t *)self; if(jitterbuffer->state){ diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/theora/tdav_codec_theora.c b/branches/2.0/doubango/tinyDAV/src/codecs/theora/tdav_codec_theora.c index 85fab078..1ef8aefd 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/theora/tdav_codec_theora.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/theora/tdav_codec_theora.c @@ -267,7 +267,7 @@ tsk_size_t tdav_codec_theora_encode(tmedia_codec_t* self, const void* in_data, t } // Encode data - //theora->encoder.picture->pts = tsk_time_epoch(); + //theora->encoder.picture->pts = tsk_time_now(); theora->encoder.picture->pts = AV_NOPTS_VALUE; //theora->encoder.picture->pict_type = FF_I_TYPE; ret = avcodec_encode_video(theora->encoder.context, theora->encoder.buffer, size, theora->encoder.picture); @@ -607,7 +607,7 @@ const tmedia_codec_plugin_def_t *tdav_codec_theora_plugin_def_t = &tdav_codec_th static void tdav_codec_theora_encap(tdav_codec_theora_t* theora, const uint8_t* pdata, tsk_size_t size) { if((theora->encoder.conf_count < THEORA_CONF_SEND_COUNT) && theora->encoder.context && theora->encoder.context->extradata){ - if((theora->encoder.conf_last + (250 *theora->encoder.conf_count)) < tsk_time_epoch()){ + if((theora->encoder.conf_last + (250 *theora->encoder.conf_count)) < tsk_time_now()){ int hdr_size, i, exd_size = theora->encoder.context->extradata_size, conf_pkt_size = 0; uint8_t *conf_pkt_ptr = tsk_null, *exd_ptr = theora->encoder.context->extradata; for(i=0; i<3 && exd_size; i++){ @@ -637,7 +637,7 @@ static void tdav_codec_theora_encap(tdav_codec_theora_t* theora, const uint8_t* TSK_FREE(conf_pkt_ptr); } - theora->encoder.conf_last = tsk_time_epoch(); + theora->encoder.conf_last = tsk_time_now(); theora->encoder.conf_count++; } } diff --git a/branches/2.0/doubango/tinyDAV/src/tdav_win32.c b/branches/2.0/doubango/tinyDAV/src/tdav_win32.c index 9fd8ecba..12a0b9ed 100644 --- a/branches/2.0/doubango/tinyDAV/src/tdav_win32.c +++ b/branches/2.0/doubango/tinyDAV/src/tdav_win32.c @@ -35,6 +35,14 @@ int tdav_win32_init() { + MMRESULT result; + + // Timers accuracy + result = timeBeginPeriod(1); + if(result){ + TSK_DEBUG_ERROR("timeBeginPeriod(1) returned result=%u", result); + } + return 0; } @@ -62,6 +70,13 @@ void tdav_win32_print_error(const char* func, HRESULT hr) int tdav_win32_deinit() { + MMRESULT result; + + // Timers accuracy + result = timeEndPeriod(1); + if(result){ + TSK_DEBUG_ERROR("timeEndPeriod(1) returned result=%u", result); + } return 0; } diff --git a/branches/2.0/doubango/tinyMSRP/src/session/tmsrp_sender.c b/branches/2.0/doubango/tinyMSRP/src/session/tmsrp_sender.c index 9c5346b9..069382fd 100644 --- a/branches/2.0/doubango/tinyMSRP/src/session/tmsrp_sender.c +++ b/branches/2.0/doubango/tinyMSRP/src/session/tmsrp_sender.c @@ -148,7 +148,7 @@ void *run(void* self) tsk_size_t end; tsk_size_t total; tsk_istr_t tid; - int64_t __now = (int64_t)tsk_time_epoch(); + int64_t __now = (int64_t)tsk_time_now(); tsk_bool_t error = tsk_false; TSK_DEBUG_INFO("MSRP SENDER::run -- START"); diff --git a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c index 3e2d5929..40a23e12 100644 --- a/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c +++ b/branches/2.0/doubango/tinyNET/src/dhcp/tnet_dhcp.c @@ -115,7 +115,7 @@ tnet_dhcp_reply_t* tnet_dhcp_send_request(tnet_dhcp_ctx_t* ctx, tnet_dhcp_reques } /* Set timeout */ - timeout = tsk_time_epoch() + ctx->timeout; + timeout = tsk_time_now() + ctx->timeout; do { diff --git a/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c b/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c index 6703c30a..5b6fb0e0 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c @@ -516,6 +516,8 @@ void *tnet_transport_mainthread(void *param) transport_socket_t* active_socket; int index; + SetPriorityClass(GetCurrentThread(), REALTIME_PRIORITY_CLASS); + TSK_DEBUG_INFO("Starting [%s] server with IP {%s} on port {%d}...", transport->description, transport->master->ip, transport->master->port); while(TSK_RUNNABLE(transport)->running || TSK_RUNNABLE(transport)->started) diff --git a/branches/2.0/doubango/tinySAK/src/tsk_string.c b/branches/2.0/doubango/tinySAK/src/tsk_string.c index 55b338c2..e8bf3209 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_string.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_string.c @@ -527,7 +527,7 @@ long tsk_atox(const char* str) void tsk_strrandom(tsk_istr_t *result) { static uint64_t __counter = 1; - tsk_itoa((tsk_time_epoch() ^ (rand())) ^ ++__counter, result); + tsk_itoa((tsk_time_now() ^ (rand())) ^ ++__counter, result); } /**@ingroup tsk_string_group diff --git a/branches/2.0/doubango/tinySAK/src/tsk_time.c b/branches/2.0/doubango/tinySAK/src/tsk_time.c index 9c1f907c..e5a4e6bc 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_time.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_time.c @@ -144,18 +144,26 @@ uint64_t tsk_time_get_ms(struct timeval* tv) * @retval The number of milliseconds since EPOCH. */ uint64_t tsk_time_epoch() +{ + struct timeval tv; + gettimeofday(&tv, 0); + return (((uint64_t)tv.tv_sec)*(uint64_t)1000) + (((uint64_t)tv.tv_usec)/(uint64_t)1000); +} + +uint64_t tsk_time_now() { #if TSK_UNDER_WINDOWS - return (uint64_t)timeGetTime(); + static LARGE_INTEGER __liFrequency = {0}; + LARGE_INTEGER liPerformanceCount; + if(!__liFrequency.QuadPart){ + QueryPerformanceFrequency(&__liFrequency); + } + QueryPerformanceCounter(&liPerformanceCount); + return (uint64_t)(((double)liPerformanceCount.QuadPart/(double)__liFrequency.QuadPart)*1000.0); #elif HAVE_CLOCK_GETTIME || _POSIX_TIMERS > 0 struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (((uint64_t)ts.tv_sec)*(uint64_t)1000) + (((uint64_t)ts.tv_nsec)/(uint64_t)1000000); -#elif defined(__APPLE__) && 0 - if(__apple_timebase_info.denom == 0){ - (void) mach_timebase_info(&__apple_timebase_info); - } - return (mach_absolute_time() * __apple_timebase_info.numer / __apple_timebase_info.denom)*1e-6; #else struct timeval tv; gettimeofday(&tv, 0); @@ -163,23 +171,3 @@ uint64_t tsk_time_epoch() #endif } -//int tsk_time_epoch_2(struct timespec *ts) -//{ -//#if HAVE_CLOCK_GETTIME || _POSIX_TIMERS > 0 -// clock_gettime(CLOCK_MONOTONIC, ts); -//#elif defined(__APPLE__) && 0 -// if(__apple_timebase_info.denom == 0){ -// (void) mach_timebase_info(&__apple_timebase_info); -// } -// uint64_t nano = mach_absolute_time() * __apple_timebase_info.numer / __apple_timebase_info.denom; -// ts->tv_sec = nano * 1e-9; -// ts->tv_nsec = nano - (ts->tv_sec * 1e9); -//#else -// struct timeval tv; -// gettimeofday(&tv, tsk_null); -// ts->tv_sec = tv.tv_sec; -// ts->tv_nsec = tv.tv_usec * 1000; -//#endif -// return 0; -//} - diff --git a/branches/2.0/doubango/tinySAK/src/tsk_time.h b/branches/2.0/doubango/tinySAK/src/tsk_time.h index 0c715c46..cf2b835b 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_time.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_time.h @@ -48,27 +48,9 @@ struct timespec; TINYSAK_API int tsk_gettimeofday(struct timeval *tv, struct timezone *tz); TINYSAK_API uint64_t tsk_time_get_ms(struct timeval *tv); TINYSAK_API uint64_t tsk_time_epoch(); +TINYSAK_API uint64_t tsk_time_now(); -/**@ingroup tsk_time_group -* Gets the number of milliseconds since the EPOCH. -*/ -#define tsk_time_now() tsk_time_epoch() - -//#ifdef _WIN32_WCE -// -//#ifndef TIMEVAL -///* On wince timeval struct is defined in "Winsock2.h" but I don't want to add it */ -//struct timeval -//{ -// long tv_sec; -// long tv_usec; -//}; -//#define TIMEVAL -//#endif TIMEVAL -// -//#endif - TSK_END_DECLS #endif /* _TINYSAK_TIME_H_ */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_timer.c b/branches/2.0/doubango/tinySAK/src/tsk_timer.c index 907b9cde..0ba42f73 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_timer.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_timer.c @@ -141,7 +141,7 @@ void tsk_timer_manager_debug(tsk_timer_manager_handle_t *self) tsk_list_foreach(item, manager->timers){ tsk_timer_t* timer = item->data; - TSK_DEBUG_INFO("timer [%llu]- %llu, %llu", timer->id, timer->timeout, tsk_time_epoch()); + TSK_DEBUG_INFO("timer [%llu]- %llu, %llu", timer->id, timer->timeout, tsk_time_now()); } tsk_mutex_unlock(manager->mutex); @@ -241,6 +241,16 @@ int tsk_timer_manager_cancel(tsk_timer_manager_handle_t *self, tsk_timer_id_t id return ret; } +int tsk_timer_manager_destroy(tsk_timer_manager_handle_t **self) +{ + if(!self || !*self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + TSK_OBJECT_SAFE_FREE(*self); + return 0; +} + static void *run(void* self) { int ret; @@ -248,7 +258,7 @@ static void *run(void* self) tsk_timer_manager_t *manager = self; TSK_RUNNABLE(manager)->running = tsk_true; // VERY IMPORTANT --> needed by the main thread - + /* create main thread */ if((ret = tsk_thread_create(&(manager->mainThreadId[0]), __tsk_timer_manager_mainthread, manager))){ TSK_DEBUG_FATAL("Failed to create mainthread: %d\n", ret); @@ -259,7 +269,7 @@ static void *run(void* self) TSK_RUNNABLE_RUN_BEGIN(manager); - if(curr = TSK_RUNNABLE_POP_FIRST(manager)){ + if(curr = TSK_RUNNABLE_POP_FIRST_SAFE(TSK_RUNNABLE(manager))){ tsk_timer_t *timer = (tsk_timer_t *)curr->data; if(timer->callback){ timer->callback(timer->arg, timer->id); @@ -292,7 +302,7 @@ static void *__tsk_timer_manager_mainthread(void *param) tsk_timer_manager_t *manager = param; TSK_DEBUG_INFO("TIMER MANAGER -- START"); - + while(TSK_RUNNABLE(manager)->running){ tsk_semaphore_decrement(manager->sem); @@ -306,13 +316,13 @@ peek_first: tsk_mutex_unlock(manager->mutex); if(curr && !curr->canceled) { - epoch = tsk_time_epoch(); + epoch = tsk_time_now(); if(epoch >= curr->timeout){ tsk_timer_t *timer = tsk_object_ref(curr); //TSK_DEBUG_INFO("Timer raise %llu", timer->id); tsk_mutex_lock(manager->mutex); - TSK_RUNNABLE_ENQUEUE_OBJECT(TSK_RUNNABLE(manager), timer); + TSK_RUNNABLE_ENQUEUE_OBJECT_SAFE(TSK_RUNNABLE(manager), timer); tsk_list_remove_item_by_data(manager->timers, curr); tsk_mutex_unlock(manager->mutex); } @@ -493,7 +503,7 @@ static tsk_object_t* tsk_timer_ctor(tsk_object_t * self, va_list * app) timer->callback = va_arg(*app, tsk_timer_callback_f); timer->arg = va_arg(*app, const void *); - timer->timeout += tsk_time_epoch(); + timer->timeout += tsk_time_now(); } return self; } diff --git a/branches/2.0/doubango/tinySAK/src/tsk_timer.h b/branches/2.0/doubango/tinySAK/src/tsk_timer.h index 4110b7c0..28e6c545 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_timer.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_timer.h @@ -74,6 +74,7 @@ TINYSAK_API void tsk_timer_manager_debug(tsk_timer_manager_handle_t *self); TINYSAK_API tsk_timer_id_t tsk_timer_manager_schedule(tsk_timer_manager_handle_t *self, uint64_t timeout, tsk_timer_callback_f callback, const void *arg); TINYSAK_API int tsk_timer_manager_cancel(tsk_timer_manager_handle_t *self, tsk_timer_id_t id); +TINYSAK_API int tsk_timer_manager_destroy(tsk_timer_manager_handle_t **self); // Global Timer manager diff --git a/branches/2.0/doubango/tinySAK/src/tsk_uuid.c b/branches/2.0/doubango/tinySAK/src/tsk_uuid.c index 9599bc7b..6b4e7aab 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_uuid.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_uuid.c @@ -50,12 +50,12 @@ int tsk_uuidgenerate(tsk_uuidstring_t *result) * Note that the 160 bit SHA-1 hash is truncated to 128 bits to make the length work out. */ tsk_sha1string_t sha1result; - tsk_istr_t epoch; + tsk_istr_t now; unsigned i, k; static char HEX[] = "0123456789abcdef"; - tsk_itoa(tsk_time_epoch(), &epoch); - tsk_sha1compute(epoch, sizeof(epoch), &sha1result); + tsk_itoa(tsk_time_now(), &now); + tsk_sha1compute(now, sizeof(now), &sha1result); /* XOR the SHA-1 result with random numbers. */ for(i=0; i<(TSK_UUID_DIGEST_SIZE*2); i+=4){