From 5702098bc870d3c379e16b0e68f85dffd355657c Mon Sep 17 00:00:00 2001 From: bossiel Date: Sun, 17 Feb 2013 18:56:03 +0000 Subject: [PATCH] Adds support for Windows Phone 8 and Surface Pro --- .../bindings/_common/ActionConfig.cxx | 8 + .../doubango/bindings/_common/ActionConfig.h | 11 +- .../bindings/_common/AudioResampler.cxx | 2 +- .../bindings/_common/MediaSessionMgr.h | 7 +- branches/2.0/doubango/bindings/_common/Msrp.h | 10 +- .../doubango/bindings/_common/SafeObject.h | 4 +- .../doubango/bindings/_common/SipEvent.cxx | 96 +- .../2.0/doubango/bindings/_common/SipEvent.h | 29 +- .../doubango/bindings/_common/SipMessage.h | 8 +- .../doubango/bindings/_common/SipSession.cxx | 18 +- .../doubango/bindings/_common/SipSession.h | 35 +- .../doubango/bindings/_common/SipStack.cxx | 8 + .../2.0/doubango/bindings/_common/SipStack.h | 5 +- .../2.0/doubango/bindings/_common/SipUri.h | 4 +- .../bindings/_common/tinyWRAP_config.h | 10 +- .../2.0/doubango/bindings/winrt/HandleRef.cs | 55 ++ .../winrt/doubango_rt/doubango_rt.vcxproj | 232 +++++ .../doubango_rt/doubango_rt.vcxproj.filters | 112 +++ .../doubango_rt/include/rt_ActionConfig.h | 53 + .../winrt/doubango_rt/include/rt_Config.h | 31 + .../winrt/doubango_rt/include/rt_DDebug.h | 53 + .../winrt/doubango_rt/include/rt_Enums.h | 331 +++++++ .../doubango_rt/include/rt_MediaContent.h | 18 + .../doubango_rt/include/rt_MediaSessionMgr.h | 129 +++ .../winrt/doubango_rt/include/rt_Msrp.h | 109 ++ .../winrt/doubango_rt/include/rt_SMSEncoder.h | 18 + .../doubango_rt/include/rt_SipCallback.h | 70 ++ .../winrt/doubango_rt/include/rt_SipEvent.h | 244 +++++ .../winrt/doubango_rt/include/rt_SipMessage.h | 78 ++ .../winrt/doubango_rt/include/rt_SipSession.h | 506 ++++++++++ .../winrt/doubango_rt/include/rt_SipStack.h | 120 +++ .../winrt/doubango_rt/include/rt_SipUri.h | 60 ++ .../winrt/doubango_rt/include/rt_String.h | 33 + .../winrt/doubango_rt/include/rt_Xcap.h | 18 + .../winrt/doubango_rt/src/rt_ActionConfig.cxx | 76 ++ .../winrt/doubango_rt/src/rt_DDebug.cxx | 78 ++ .../winrt/doubango_rt/src/rt_Enums.cxx | 17 + .../winrt/doubango_rt/src/rt_MediaContent.cxx | 17 + .../doubango_rt/src/rt_MediaSessionMgr.cxx | 374 +++++++ .../winrt/doubango_rt/src/rt_Msrp.cxx | 194 ++++ .../winrt/doubango_rt/src/rt_SMSEncoder.cxx | 17 + .../winrt/doubango_rt/src/rt_SipCallback.cxx | 135 +++ .../winrt/doubango_rt/src/rt_SipEvent.cxx | 239 +++++ .../winrt/doubango_rt/src/rt_SipMessage.cxx | 171 ++++ .../winrt/doubango_rt/src/rt_SipSession.cxx | 642 ++++++++++++ .../winrt/doubango_rt/src/rt_SipStack.cxx | 390 ++++++++ .../winrt/doubango_rt/src/rt_SipUri.cxx | 103 ++ .../winrt/doubango_rt/src/rt_String.cxx | 58 ++ .../winrt/doubango_rt/src/rt_Xcap.cxx | 17 + .../2.0/doubango/bindings/winrt/tinyWRAP.sln | 229 +++++ .../doubango/bindings/winrt/tinyWRAP.vcxproj | 204 ++++ .../bindings/winrt/tinyWRAP.vcxproj.filters | 139 +++ .../thirdparties/common/include/speex/speex.h | 424 ++++++++ .../common/include/speex/speex_bits.h | 174 ++++ .../common/include/speex/speex_buffer.h | 68 ++ .../common/include/speex/speex_callbacks.h | 134 +++ .../common/include/speex/speex_echo.h | 170 ++++ .../common/include/speex/speex_header.h | 94 ++ .../common/include/speex/speex_jitter.h | 197 ++++ .../common/include/speex/speex_preprocess.h | 219 ++++ .../common/include/speex/speex_resampler.h | 340 +++++++ .../common/include/speex/speex_stereo.h | 91 ++ .../common/include/speex/speex_types.h | 126 +++ .../thirdparties/winrt/lib/arm/libspeex.lib | Bin 0 -> 615656 bytes .../winrt/lib/arm/libspeexdsp.lib | Bin 0 -> 260480 bytes .../thirdparties/winrt/lib/x86/libspeex.lib | Bin 0 -> 637882 bytes .../winrt/lib/x86/libspeexdsp.lib | Bin 0 -> 273724 bytes .../audio/directsound/tdav_producer_dsound.h | 7 +- .../tinydav/audio/tdav_speex_resampler.h | 8 +- .../tinydav/audio/tdav_webrtc_denoise.h | 2 +- .../audio/wasapi/tdav_consumer_wasapi.h | 39 + .../audio/wasapi/tdav_producer_wasapi.h | 40 + .../tinydav/codecs/h264/tdav_codec_h264.h | 4 +- .../tinydav/video/winm/tdav_consumer_winm.h | 39 + .../tinydav/video/winm/tdav_producer_winm.h | 39 + .../doubango/tinyDAV/include/tinydav_config.h | 14 +- .../src/audio/coreaudio/tdav_audiounit.c | 23 +- .../audio/directsound/tdav_consumer_dsound.c | 2 +- .../audio/directsound/tdav_producer_dsound.c | 2 +- .../tinyDAV/src/audio/tdav_session_audio.c | 14 +- .../tinyDAV/src/audio/tdav_speex_resampler.c | 57 +- .../src/audio/wasapi/tdav_consumer_wasapi.cxx | 671 +++++++++++++ .../src/audio/wasapi/tdav_producer_wasapi.cxx | 669 +++++++++++++ .../tinyDAV/src/codecs/h264/tdav_codec_h264.c | 83 +- branches/2.0/doubango/tinyDAV/src/tdav.c | 46 +- .../doubango/tinyDAV/src/tdav_session_av.c | 12 +- .../2.0/doubango/tinyDAV/src/tdav_win32.c | 38 +- .../tinyDAV/src/video/tdav_session_video.c | 6 +- .../src/video/winm/tdav_consumer_winm.cxx | 214 ++++ .../src/video/winm/tdav_producer_winm.cxx | 732 ++++++++++++++ .../2.0/doubango/tinyDAV/winrt/tinyDAV.sln | 142 +++ .../doubango/tinyDAV/winrt/tinyDAV.vcxproj | 315 ++++++ .../tinyDAV/winrt/tinyDAV.vcxproj.filters | 571 +++++++++++ .../2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj | 6 +- .../tinyHTTP/include/tinyhttp_config.h | 10 +- .../thttp_parser_header_Authorization.rl | 2 +- .../thttp_parser_header_Content_Length.rl | 2 +- .../ragel/thttp_parser_header_Content_Type.rl | 2 +- .../ragel/thttp_parser_header_Dummy.rl | 2 +- .../ragel/thttp_parser_header_ETag.rl | 2 +- ...http_parser_header_Sec_WebSocket_Accept.rl | 2 +- .../thttp_parser_header_Sec_WebSocket_Key.rl | 2 +- ...tp_parser_header_Sec_WebSocket_Protocol.rl | 2 +- ...ttp_parser_header_Sec_WebSocket_Version.rl | 2 +- .../thttp_parser_header_Transfer_Encoding.rl | 2 +- .../thttp_parser_header_WWW_Authenticate.rl | 2 +- .../src/headers/thttp_header_Authorization.c | 2 +- .../src/headers/thttp_header_Content_Length.c | 2 +- .../src/headers/thttp_header_Content_Type.c | 2 +- .../tinyHTTP/src/headers/thttp_header_Dummy.c | 2 +- .../tinyHTTP/src/headers/thttp_header_ETag.c | 2 +- .../thttp_header_Sec_WebSocket_Accept.c | 2 +- .../headers/thttp_header_Sec_WebSocket_Key.c | 2 +- .../thttp_header_Sec_WebSocket_Protocol.c | 2 +- .../thttp_header_Sec_WebSocket_Version.c | 2 +- .../headers/thttp_header_Transfer_Encoding.c | 2 +- .../headers/thttp_header_WWW_Authenticate.c | 2 +- .../2.0/doubango/tinyHTTP/winrt/tinyHTTP.sln | 53 + .../doubango/tinyHTTP/winrt/tinyHTTP.vcxproj | 213 ++++ .../tinyHTTP/winrt/tinyHTTP.vcxproj.filters | 190 ++++ .../doubango/tinyIPSec/src/tinyipsec_config.h | 8 +- .../doubango/tinyIPSec/winrt/tinyIPSec.sln | 39 + .../tinyIPSec/winrt/tinyIPSec.vcxproj | 173 ++++ .../tinyIPSec/winrt/tinyIPSec.vcxproj.filters | 52 + .../include/tinymedia/tmedia_codec.h | 2 + .../include/tinymedia/tmedia_consumer.h | 6 + .../include/tinymedia/tmedia_producer.h | 5 + .../include/tinymedia/tmedia_resampler.h | 4 +- .../tinyMEDIA/include/tinymedia_config.h | 10 +- .../tinyMEDIA/ragel/tmedia_content_cpim.rl | 2 +- .../tinyMEDIA/ragel/tmedia_imageattr.rl | 10 +- .../src/content/tmedia_content_cpim.c | 2 +- .../doubango/tinyMEDIA/src/tmedia_imageattr.c | 10 +- .../doubango/tinyMEDIA/src/tmedia_resampler.c | 6 +- .../doubango/tinyMEDIA/winrt/tinyMEDIA.sln | 67 ++ .../tinyMEDIA/winrt/tinyMEDIA.vcxproj | 208 ++++ .../tinyMEDIA/winrt/tinyMEDIA.vcxproj.filters | 166 ++++ .../tinyMSRP/include/tinymsrp_config.h | 10 +- .../ragel/tmsrp_parser_header_Byte-Range.rl | 2 +- .../ragel/tmsrp_parser_header_Content-Type.rl | 2 +- .../ragel/tmsrp_parser_header_Dummy.rl | 2 +- .../ragel/tmsrp_parser_header_Expires.rl | 2 +- .../ragel/tmsrp_parser_header_From-Path.rl | 2 +- .../ragel/tmsrp_parser_header_Max-Expires.rl | 2 +- .../ragel/tmsrp_parser_header_Message-ID.rl | 2 +- .../ragel/tmsrp_parser_header_Min-Expires.rl | 2 +- .../ragel/tmsrp_parser_header_Status.rl | 2 +- .../ragel/tmsrp_parser_header_To-Path.rl | 2 +- .../ragel/tmsrp_parser_header_Use-Path.rl | 2 +- .../tinyMSRP/ragel/tmsrp_parser_uri.rl | 2 +- .../src/headers/tmsrp_header_Byte-Range.c | 2 +- .../src/headers/tmsrp_header_Content-Type.c | 2 +- .../tinyMSRP/src/headers/tmsrp_header_Dummy.c | 2 +- .../src/headers/tmsrp_header_Expires.c | 2 +- .../src/headers/tmsrp_header_From-Path.c | 2 +- .../src/headers/tmsrp_header_Max-Expires.c | 2 +- .../src/headers/tmsrp_header_Message-ID.c | 2 +- .../src/headers/tmsrp_header_Min-Expires.c | 2 +- .../src/headers/tmsrp_header_Status.c | 2 +- .../src/headers/tmsrp_header_To-Path.c | 2 +- .../src/headers/tmsrp_header_Use-Path.c | 2 +- .../tinyMSRP/src/parsers/tmsrp_parser_uri.c | 2 +- .../tinyMSRP/src/session/tmsrp_sender.c | 12 +- .../2.0/doubango/tinyMSRP/winrt/tinyMSRP.sln | 98 ++ .../doubango/tinyMSRP/winrt/tinyMSRP.vcxproj | 219 ++++ .../tinyMSRP/winrt/tinyMSRP.vcxproj.filters | 211 ++++ .../tinyNET/ragel/tnet_dns_resolvconf.rl | 2 +- .../tinyNET/src/dns/tnet_dns_resolvconf.c | 2 +- .../doubango/tinyNET/src/ice/tnet_ice_ctx.c | 4 +- .../2.0/doubango/tinyNET/src/tinynet_config.h | 13 +- .../doubango/tinyNET/src/tnet_endianness.h | 5 + .../2.0/doubango/tinyNET/src/tnet_transport.c | 6 +- .../tinyNET/src/tnet_transport_win32.c | 6 +- .../2.0/doubango/tinyNET/src/tnet_types.h | 23 +- .../2.0/doubango/tinyNET/src/tnet_utils.c | 155 ++- .../2.0/doubango/tinyNET/winrt/tinyNET.sln | 39 + .../doubango/tinyNET/winrt/tinyNET.vcxproj | 273 +++++ .../tinyNET/winrt/tinyNET.vcxproj.filters | 361 +++++++ .../doubango/tinyRTP/include/tinyrtp_config.h | 8 +- .../2.0/doubango/tinySAK/src/tinysak_config.h | 10 +- .../2.0/doubango/tinySAK/src/tsk_base64.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_buffer.c | 8 +- .../2.0/doubango/tinySAK/src/tsk_condwait.c | 16 +- branches/2.0/doubango/tinySAK/src/tsk_fsm.c | 662 ++++++------- branches/2.0/doubango/tinySAK/src/tsk_list.c | 16 +- branches/2.0/doubango/tinySAK/src/tsk_mutex.c | 11 +- .../2.0/doubango/tinySAK/src/tsk_object.c | 2 +- .../2.0/doubango/tinySAK/src/tsk_options.c | 10 +- .../2.0/doubango/tinySAK/src/tsk_params.c | 20 +- .../2.0/doubango/tinySAK/src/tsk_plugin.c | 19 +- .../2.0/doubango/tinySAK/src/tsk_plugin.h | 4 + .../2.0/doubango/tinySAK/src/tsk_runnable.c | 6 +- .../2.0/doubango/tinySAK/src/tsk_runnable.h | 2 +- .../2.0/doubango/tinySAK/src/tsk_semaphore.c | 23 +- branches/2.0/doubango/tinySAK/src/tsk_sha1.c | 4 +- .../2.0/doubango/tinySAK/src/tsk_string.c | 59 +- .../2.0/doubango/tinySAK/src/tsk_thread.c | 13 +- .../2.0/doubango/tinySAK/src/tsk_thread.h | 2 +- branches/2.0/doubango/tinySAK/src/tsk_time.c | 418 ++++---- branches/2.0/doubango/tinySAK/src/tsk_timer.c | 50 +- branches/2.0/doubango/tinySAK/src/tsk_url.c | 4 +- .../tinySAK/winrt/ThreadEmulation.cxx | 356 +++++++ .../doubango/tinySAK/winrt/ThreadEmulation.h | 53 + .../2.0/doubango/tinySAK/winrt/tinySAK.sln | 26 + .../doubango/tinySAK/winrt/tinySAK.vcxproj | 498 ++++++++++ .../tinySAK/winrt/tinySAK.vcxproj.filters | 220 +++++ .../doubango/tinySDP/include/tinysdp_config.h | 11 +- .../tinySDP/ragel/tsdp_parser_header_A.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_B.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_C.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_Dummy.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_E.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_I.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_K.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_M.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_O.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_P.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_R.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_S.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_T.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_U.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_V.rl | 2 +- .../tinySDP/ragel/tsdp_parser_header_Z.rl | 4 +- .../tinySDP/src/headers/tsdp_header_A.c | 2 +- .../tinySDP/src/headers/tsdp_header_B.c | 2 +- .../tinySDP/src/headers/tsdp_header_C.c | 2 +- .../tinySDP/src/headers/tsdp_header_Dummy.c | 2 +- .../tinySDP/src/headers/tsdp_header_E.c | 2 +- .../tinySDP/src/headers/tsdp_header_I.c | 2 +- .../tinySDP/src/headers/tsdp_header_K.c | 2 +- .../tinySDP/src/headers/tsdp_header_M.c | 2 +- .../tinySDP/src/headers/tsdp_header_O.c | 2 +- .../tinySDP/src/headers/tsdp_header_P.c | 2 +- .../tinySDP/src/headers/tsdp_header_R.c | 2 +- .../tinySDP/src/headers/tsdp_header_S.c | 2 +- .../tinySDP/src/headers/tsdp_header_T.c | 2 +- .../tinySDP/src/headers/tsdp_header_U.c | 2 +- .../tinySDP/src/headers/tsdp_header_V.c | 2 +- .../tinySDP/src/headers/tsdp_header_Z.c | 4 +- .../2.0/doubango/tinySDP/winrt/tinySDP.sln | 39 + .../doubango/tinySDP/winrt/tinySDP.vcxproj | 206 ++++ .../tinySDP/winrt/tinySDP.vcxproj.filters | 163 +++ .../tinySIGCOMP/src/tinysigcomp_config.h | 8 +- .../tinySIGCOMP/winrt/tinySIGCOMP.sln | 39 + .../tinySIGCOMP/winrt/tinySIGCOMP.vcxproj | 227 +++++ .../winrt/tinySIGCOMP.vcxproj.filters | 238 +++++ .../include/tinysip/api/tsip_api_info.h | 1 + .../include/tinysip/api/tsip_api_invite.h | 1 + .../include/tinysip/api/tsip_api_message.h | 1 + .../include/tinysip/api/tsip_api_options.h | 1 + .../include/tinysip/api/tsip_api_publish.h | 1 + .../include/tinysip/api/tsip_api_register.h | 1 + .../include/tinysip/api/tsip_api_subscribe.h | 1 + .../tinySIP/include/tinysip/tsip_action.h | 2 + .../doubango/tinySIP/include/tinysip_config.h | 14 +- .../tinySIP/ragel/tsip_parser_header_Allow.rl | 2 +- .../ragel/tsip_parser_header_Allow_Events.rl | 2 +- .../ragel/tsip_parser_header_Authorization.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_CSeq.rl | 2 +- .../ragel/tsip_parser_header_Call_ID.rl | 2 +- .../ragel/tsip_parser_header_Contact.rl | 2 +- .../tsip_parser_header_Content_Length.rl | 2 +- .../ragel/tsip_parser_header_Content_Type.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_Date.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_Dummy.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_Event.rl | 2 +- .../ragel/tsip_parser_header_Expires.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_From.rl | 2 +- .../ragel/tsip_parser_header_Max_Forwards.rl | 2 +- .../ragel/tsip_parser_header_Min_Expires.rl | 2 +- .../ragel/tsip_parser_header_Min_SE.rl | 2 +- ...sip_parser_header_P_Access_Network_Info.rl | 2 +- .../tsip_parser_header_P_Asserted_Identity.rl | 2 +- .../tsip_parser_header_P_Associated_URI.rl | 2 +- ...er_header_P_Charging_Function_Addresses.rl | 2 +- ...tsip_parser_header_P_Preferred_Identity.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_Path.rl | 2 +- .../ragel/tsip_parser_header_Privacy.rl | 2 +- .../tsip_parser_header_Proxy_Authenticate.rl | 2 +- .../tsip_parser_header_Proxy_Authorization.rl | 2 +- .../ragel/tsip_parser_header_Proxy_Require.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_RAck.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_RSeq.rl | 2 +- .../ragel/tsip_parser_header_Record_Route.rl | 2 +- .../ragel/tsip_parser_header_Refer_Sub.rl | 2 +- .../ragel/tsip_parser_header_Refer_To.rl | 2 +- .../ragel/tsip_parser_header_Referred_By.rl | 2 +- .../ragel/tsip_parser_header_Require.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_Route.rl | 2 +- .../ragel/tsip_parser_header_SIP_ETag.rl | 2 +- .../ragel/tsip_parser_header_SIP_If_Match.rl | 2 +- .../tsip_parser_header_Security_Client.rl | 2 +- .../tsip_parser_header_Security_Server.rl | 2 +- .../tsip_parser_header_Security_Verify.rl | 2 +- .../ragel/tsip_parser_header_Server.rl | 2 +- .../ragel/tsip_parser_header_Service_Route.rl | 2 +- .../tsip_parser_header_Session_Expires.rl | 2 +- .../tsip_parser_header_Subscription_State.rl | 2 +- .../ragel/tsip_parser_header_Supported.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_To.rl | 2 +- .../ragel/tsip_parser_header_User_Agent.rl | 2 +- .../tinySIP/ragel/tsip_parser_header_Via.rl | 2 +- .../tsip_parser_header_WWW_Authenticate.rl | 2 +- .../ragel/tsip_parser_header_Warning.rl | 2 +- .../src/dialogs/tsip_dialog_invite.server.c | 11 +- .../tinySIP/src/headers/tsip_header_Allow.c | 2 +- .../src/headers/tsip_header_Allow_Events.c | 2 +- .../tinySIP/src/headers/tsip_header_CSeq.c | 2 +- .../tinySIP/src/headers/tsip_header_Call_ID.c | 2 +- .../tinySIP/src/headers/tsip_header_Contact.c | 2 +- .../src/headers/tsip_header_Content_Length.c | 2 +- .../src/headers/tsip_header_Content_Type.c | 2 +- .../tinySIP/src/headers/tsip_header_Date.c | 2 +- .../tinySIP/src/headers/tsip_header_Dummy.c | 2 +- .../tinySIP/src/headers/tsip_header_Event.c | 2 +- .../tinySIP/src/headers/tsip_header_Expires.c | 2 +- .../tinySIP/src/headers/tsip_header_From.c | 2 +- .../src/headers/tsip_header_Max_Forwards.c | 2 +- .../src/headers/tsip_header_Min_Expires.c | 2 +- .../tinySIP/src/headers/tsip_header_Min_SE.c | 2 +- .../tsip_header_P_Access_Network_Info.c | 2 +- .../headers/tsip_header_P_Asserted_Identity.c | 2 +- .../headers/tsip_header_P_Associated_URI.c | 2 +- ...sip_header_P_Charging_Function_Addresses.c | 2 +- .../tsip_header_P_Preferred_Identity.c | 2 +- .../tinySIP/src/headers/tsip_header_Path.c | 2 +- .../tinySIP/src/headers/tsip_header_Privacy.c | 2 +- .../src/headers/tsip_header_Proxy_Require.c | 2 +- .../tinySIP/src/headers/tsip_header_RAck.c | 2 +- .../tinySIP/src/headers/tsip_header_RSeq.c | 2 +- .../src/headers/tsip_header_Record_Route.c | 2 +- .../src/headers/tsip_header_Refer_Sub.c | 2 +- .../src/headers/tsip_header_Refer_To.c | 2 +- .../src/headers/tsip_header_Referred_By.c | 2 +- .../tinySIP/src/headers/tsip_header_Require.c | 2 +- .../tinySIP/src/headers/tsip_header_Route.c | 2 +- .../src/headers/tsip_header_SIP_ETag.c | 2 +- .../src/headers/tsip_header_SIP_If_Match.c | 2 +- .../src/headers/tsip_header_Security_Client.c | 2 +- .../src/headers/tsip_header_Security_Server.c | 2 +- .../src/headers/tsip_header_Security_Verify.c | 2 +- .../tinySIP/src/headers/tsip_header_Server.c | 2 +- .../src/headers/tsip_header_Service_Route.c | 2 +- .../src/headers/tsip_header_Session_Expires.c | 2 +- .../headers/tsip_header_Subscription_State.c | 2 +- .../src/headers/tsip_header_Supported.c | 2 +- .../tinySIP/src/headers/tsip_header_To.c | 2 +- .../src/headers/tsip_header_User_Agent.c | 2 +- .../tinySIP/src/headers/tsip_header_Via.c | 2 +- .../tinySIP/src/headers/tsip_header_Warning.c | 2 +- branches/2.0/doubango/tinySIP/src/tsip.c | 8 +- .../2.0/doubango/tinySIP/src/tsip_action.c | 8 + .../2.0/doubango/tinySIP/src/tsip_ssession.c | 5 +- .../2.0/doubango/tinySIP/winrt/tinySIP.sln | 126 +++ .../doubango/tinySIP/winrt/tinySIP.vcxproj | 450 +++++++++ .../tinySIP/winrt/tinySIP.vcxproj.filters | 934 ++++++++++++++++++ .../doubango/tinySMS/include/tinysms_config.h | 158 +-- .../2.0/doubango/tinySMS/winrt/tinySMS.sln | 39 + .../doubango/tinySMS/winrt/tinySMS.vcxproj | 185 ++++ .../tinySMS/winrt/tinySMS.vcxproj.filters | 103 ++ .../tinyXCAP/include/tinyxcap_config.h | 10 +- .../2.0/doubango/tinyXCAP/winrt/tinyXCAP.sln | 68 ++ .../doubango/tinyXCAP/winrt/tinyXCAP.vcxproj | 176 ++++ .../tinyXCAP/winrt/tinyXCAP.vcxproj.filters | 64 ++ 364 files changed, 19131 insertions(+), 1172 deletions(-) create mode 100644 branches/2.0/doubango/bindings/winrt/HandleRef.cs create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/doubango_rt.vcxproj create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/doubango_rt.vcxproj.filters create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_ActionConfig.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Config.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_DDebug.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Enums.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_MediaContent.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_MediaSessionMgr.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Msrp.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SMSEncoder.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipCallback.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipEvent.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipMessage.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipSession.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipStack.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipUri.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_String.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Xcap.h create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_ActionConfig.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_DDebug.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Enums.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_MediaContent.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_MediaSessionMgr.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Msrp.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SMSEncoder.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipCallback.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipEvent.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipMessage.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipSession.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipStack.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipUri.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_String.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Xcap.cxx create mode 100644 branches/2.0/doubango/bindings/winrt/tinyWRAP.sln create mode 100644 branches/2.0/doubango/bindings/winrt/tinyWRAP.vcxproj create mode 100644 branches/2.0/doubango/bindings/winrt/tinyWRAP.vcxproj.filters create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_bits.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_buffer.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_callbacks.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_echo.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_header.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_jitter.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_preprocess.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_resampler.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_stereo.h create mode 100644 branches/2.0/doubango/thirdparties/common/include/speex/speex_types.h create mode 100644 branches/2.0/doubango/thirdparties/winrt/lib/arm/libspeex.lib create mode 100644 branches/2.0/doubango/thirdparties/winrt/lib/arm/libspeexdsp.lib create mode 100644 branches/2.0/doubango/thirdparties/winrt/lib/x86/libspeex.lib create mode 100644 branches/2.0/doubango/thirdparties/winrt/lib/x86/libspeexdsp.lib create mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/audio/wasapi/tdav_consumer_wasapi.h create mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/audio/wasapi/tdav_producer_wasapi.h create mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/video/winm/tdav_consumer_winm.h create mode 100644 branches/2.0/doubango/tinyDAV/include/tinydav/video/winm/tdav_producer_winm.h create mode 100644 branches/2.0/doubango/tinyDAV/src/audio/wasapi/tdav_consumer_wasapi.cxx create mode 100644 branches/2.0/doubango/tinyDAV/src/audio/wasapi/tdav_producer_wasapi.cxx create mode 100644 branches/2.0/doubango/tinyDAV/src/video/winm/tdav_consumer_winm.cxx create mode 100644 branches/2.0/doubango/tinyDAV/src/video/winm/tdav_producer_winm.cxx create mode 100644 branches/2.0/doubango/tinyDAV/winrt/tinyDAV.sln create mode 100644 branches/2.0/doubango/tinyDAV/winrt/tinyDAV.vcxproj create mode 100644 branches/2.0/doubango/tinyDAV/winrt/tinyDAV.vcxproj.filters create mode 100644 branches/2.0/doubango/tinyHTTP/winrt/tinyHTTP.sln create mode 100644 branches/2.0/doubango/tinyHTTP/winrt/tinyHTTP.vcxproj create mode 100644 branches/2.0/doubango/tinyHTTP/winrt/tinyHTTP.vcxproj.filters create mode 100644 branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.sln create mode 100644 branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.vcxproj create mode 100644 branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.vcxproj.filters create mode 100644 branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.sln create mode 100644 branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.vcxproj create mode 100644 branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.vcxproj.filters create mode 100644 branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.sln create mode 100644 branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.vcxproj create mode 100644 branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.vcxproj.filters create mode 100644 branches/2.0/doubango/tinyNET/winrt/tinyNET.sln create mode 100644 branches/2.0/doubango/tinyNET/winrt/tinyNET.vcxproj create mode 100644 branches/2.0/doubango/tinyNET/winrt/tinyNET.vcxproj.filters create mode 100644 branches/2.0/doubango/tinySAK/winrt/ThreadEmulation.cxx create mode 100644 branches/2.0/doubango/tinySAK/winrt/ThreadEmulation.h create mode 100644 branches/2.0/doubango/tinySAK/winrt/tinySAK.sln create mode 100644 branches/2.0/doubango/tinySAK/winrt/tinySAK.vcxproj create mode 100644 branches/2.0/doubango/tinySAK/winrt/tinySAK.vcxproj.filters create mode 100644 branches/2.0/doubango/tinySDP/winrt/tinySDP.sln create mode 100644 branches/2.0/doubango/tinySDP/winrt/tinySDP.vcxproj create mode 100644 branches/2.0/doubango/tinySDP/winrt/tinySDP.vcxproj.filters create mode 100644 branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.sln create mode 100644 branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.vcxproj create mode 100644 branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.vcxproj.filters create mode 100644 branches/2.0/doubango/tinySIP/winrt/tinySIP.sln create mode 100644 branches/2.0/doubango/tinySIP/winrt/tinySIP.vcxproj create mode 100644 branches/2.0/doubango/tinySIP/winrt/tinySIP.vcxproj.filters create mode 100644 branches/2.0/doubango/tinySMS/winrt/tinySMS.sln create mode 100644 branches/2.0/doubango/tinySMS/winrt/tinySMS.vcxproj create mode 100644 branches/2.0/doubango/tinySMS/winrt/tinySMS.vcxproj.filters create mode 100644 branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.sln create mode 100644 branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.vcxproj create mode 100644 branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.vcxproj.filters diff --git a/branches/2.0/doubango/bindings/_common/ActionConfig.cxx b/branches/2.0/doubango/bindings/_common/ActionConfig.cxx index ed8bc97e..5253ad08 100644 --- a/branches/2.0/doubango/bindings/_common/ActionConfig.cxx +++ b/branches/2.0/doubango/bindings/_common/ActionConfig.cxx @@ -46,6 +46,14 @@ bool ActionConfig::addPayload(const void* payload, unsigned len) TSIP_ACTION_SET_NULL()) == 0); } +bool ActionConfig::setActiveMedia(twrap_media_type_t type) +{ + tmedia_type_t media_type = twrap_get_media_type(type); + return (tsip_action_set(m_pHandle, + TSIP_ACTION_SET_MEDIA_TYPE(media_type), + TSIP_ACTION_SET_NULL()) == 0); +} + ActionConfig* ActionConfig::setResponseLine(short code, const char* phrase) { int32_t _code = code; diff --git a/branches/2.0/doubango/bindings/_common/ActionConfig.h b/branches/2.0/doubango/bindings/_common/ActionConfig.h index f05a4049..ab8ad73a 100644 --- a/branches/2.0/doubango/bindings/_common/ActionConfig.h +++ b/branches/2.0/doubango/bindings/_common/ActionConfig.h @@ -1,7 +1,4 @@ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop +/* Copyright (C) 2010-2011 Mamadou Diop. * * This file is part of Open Source Doubango Framework. * @@ -17,15 +14,16 @@ * * You should have received a copy of the GNU General Public License * along with DOUBANGO. -* */ #ifndef TINYWRAP_ACTIONCONFIG_H #define TINYWRAP_ACTIONCONFIG_H +#include "tinyWRAP_config.h" + #include "tinysip.h" #include "Common.h" -class ActionConfig +class TINYWRAP_API ActionConfig { public: ActionConfig(); @@ -33,6 +31,7 @@ public: bool addHeader(const char* name, const char* value); bool addPayload(const void* payload, unsigned len); + bool setActiveMedia(twrap_media_type_t type); ActionConfig* setResponseLine(short code, const char* phrase); ActionConfig* setMediaString(twrap_media_type_t type, const char* key, const char* value); diff --git a/branches/2.0/doubango/bindings/_common/AudioResampler.cxx b/branches/2.0/doubango/bindings/_common/AudioResampler.cxx index a06129ce..b9538196 100644 --- a/branches/2.0/doubango/bindings/_common/AudioResampler.cxx +++ b/branches/2.0/doubango/bindings/_common/AudioResampler.cxx @@ -40,7 +40,7 @@ m_nQuality(nQuality) { if((m_pWrappedResampler = tmedia_resampler_create())){ int ret; - if((ret = tmedia_resampler_open(m_pWrappedResampler, nInFreq, nOutFreq, nFrameDuration, nChannels, m_nQuality))){ + if((ret = tmedia_resampler_open(m_pWrappedResampler, nInFreq, nOutFreq, nFrameDuration, nChannels, nChannels, m_nQuality))){ TSK_DEBUG_ERROR("Failed to open audio resampler (%d)", ret); TSK_OBJECT_SAFE_FREE(m_pWrappedResampler); } diff --git a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h index 162c9c92..627cd394 100644 --- a/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h +++ b/branches/2.0/doubango/bindings/_common/MediaSessionMgr.h @@ -22,12 +22,14 @@ #ifndef TINYWRAP_MEDIA_SESSIONMGR_H #define TINYWRAP_MEDIA_SESSIONMGR_H +#include "tinyWRAP_config.h" + #include "tinymedia.h" #include "Common.h" class ProxyPlugin; -class Codec +class TINYWRAP_API Codec { public: #if !defined(SWIG) @@ -36,6 +38,7 @@ public: virtual ~Codec(); public: + const struct tmedia_codec_s* getWrappedCodec(){ return m_pWrappedCodec; } twrap_media_type_t getMediaType(); const char* getName(); const char* getDescription(); @@ -48,7 +51,7 @@ private: struct tmedia_codec_s* m_pWrappedCodec; }; -class MediaSessionMgr +class TINYWRAP_API MediaSessionMgr { public: #if !defined(SWIG) diff --git a/branches/2.0/doubango/bindings/_common/Msrp.h b/branches/2.0/doubango/bindings/_common/Msrp.h index f241fc14..f317ecd6 100644 --- a/branches/2.0/doubango/bindings/_common/Msrp.h +++ b/branches/2.0/doubango/bindings/_common/Msrp.h @@ -22,11 +22,13 @@ #ifndef TINYWRAP_MSRP_H #define TINYWRAP_MSRP_H +#include "tinyWRAP_config.h" + #include "tinymsrp.h" class MsrpSession; -class MsrpMessage +class TINYWRAP_API MsrpMessage { public: MsrpMessage(); @@ -52,6 +54,8 @@ public: unsigned getMsrpContentLength(); unsigned getMsrpContent(void* output, unsigned maxsize); + const tmsrp_message_t* getWrappedMsrpMessage() { return m_pMessage; } + private: const tmsrp_header_t* getMsrpHeader(const char* name, unsigned index = 0); @@ -59,7 +63,7 @@ private: tmsrp_message_t *m_pMessage; }; -class MsrpEvent +class TINYWRAP_API MsrpEvent { public: #if !defined(SWIG) @@ -76,7 +80,7 @@ protected: MsrpMessage* m_pMessage; }; -class MsrpCallback +class TINYWRAP_API MsrpCallback { public: MsrpCallback() { } diff --git a/branches/2.0/doubango/bindings/_common/SafeObject.h b/branches/2.0/doubango/bindings/_common/SafeObject.h index 7cd6733d..1b4e6bd4 100644 --- a/branches/2.0/doubango/bindings/_common/SafeObject.h +++ b/branches/2.0/doubango/bindings/_common/SafeObject.h @@ -22,9 +22,11 @@ #ifndef TINYWRAP_SAFEOBJECT_H #define TINYWRAP_SAFEOBJECT_H +#include "tinyWRAP_config.h" + #include "tsk_mutex.h" -class SafeObject +class TINYWRAP_API SafeObject { public: SafeObject(); diff --git a/branches/2.0/doubango/bindings/_common/SipEvent.cxx b/branches/2.0/doubango/bindings/_common/SipEvent.cxx index 7bf933d6..24448e08 100644 --- a/branches/2.0/doubango/bindings/_common/SipEvent.cxx +++ b/branches/2.0/doubango/bindings/_common/SipEvent.cxx @@ -25,6 +25,20 @@ #include "SipStack.h" + +#define takeOwnership_Implement(cls, name, session) \ +name##Session* cls##Event::take##session##Ownership() const \ +{ \ + if(this->sipevent && this->sipevent->ss /*&& !tsip_ssession_have_ownership(this->sipevent->ss)*/){ \ + SipStack* stack = this->getStack(); \ + if(stack){ \ + /* The constructor will call take_ownerhip() */ \ + return new name##Session(stack, this->sipevent->ss); \ + } \ + } \ + return tsk_null; \ +} \ + /* ======================== SipEvent ========================*/ SipEvent::SipEvent(const tsip_event_t *_sipevent) { @@ -132,31 +146,8 @@ const InviteSession* InviteEvent::getSession() const return dyn_cast(this->getBaseSession()); } -CallSession* InviteEvent::takeCallSessionOwnership() const -{ - // TODO: Factor all takeSessionOwnership() functions - if(this->sipevent && this->sipevent->ss && !tsip_ssession_have_ownership(this->sipevent->ss)){ - SipStack* stack = this->getStack(); - if(stack){ - /* The constructor will call take_ownerhip() */ - return new CallSession(stack, this->sipevent->ss); - } - } - return tsk_null; -} - -MsrpSession* InviteEvent::takeMsrpSessionOwnership() const -{ - // TODO: Factor all takeSessionOwnership() functions - if(this->sipevent && this->sipevent->ss && !tsip_ssession_have_ownership(this->sipevent->ss)){ - SipStack* stack = this->getStack(); - if(stack){ - /* The constructor will call take_ownerhip() */ - return new MsrpSession(stack, this->sipevent->ss); - } - } - return tsk_null; -} +takeOwnership_Implement(Invite, Call, CallSession); +takeOwnership_Implement(Invite, Msrp, MsrpSession); /* ======================== MessagingEvent ========================*/ MessagingEvent::MessagingEvent(const tsip_event_t *_sipevent) @@ -178,18 +169,7 @@ const MessagingSession* MessagingEvent::getSession() const return dyn_cast(this->getBaseSession()); } -MessagingSession* MessagingEvent::takeSessionOwnership() const -{ - if(this->sipevent && this->sipevent->ss && !tsip_ssession_have_ownership(this->sipevent->ss)){ - SipStack* stack = this->getStack(); - if(stack){ - /* The constructor will call take_ownerhip() */ - return new MessagingSession(stack, this->sipevent->ss); - } - } - return tsk_null; -} - +takeOwnership_Implement(Messaging, Messaging, Session); /* ======================== InfoEvent ========================*/ @@ -212,17 +192,7 @@ const InfoSession* InfoEvent::getSession() const return dyn_cast(this->getBaseSession()); } -InfoSession* InfoEvent::takeSessionOwnership() const -{ - if(this->sipevent && this->sipevent->ss && !tsip_ssession_have_ownership(this->sipevent->ss)){ - SipStack* stack = this->getStack(); - if(stack){ - /* The constructor will call take_ownerhip() */ - return new InfoSession(stack, this->sipevent->ss); - } - } - return tsk_null; -} +takeOwnership_Implement(Info, Info, Session); @@ -246,17 +216,7 @@ const OptionsSession* OptionsEvent::getSession() const return dyn_cast(this->getBaseSession()); } -OptionsSession* OptionsEvent::takeSessionOwnership() const -{ - if(this->sipevent && this->sipevent->ss && !tsip_ssession_have_ownership(this->sipevent->ss)){ - SipStack* stack = this->getStack(); - if(stack){ - /* The constructor will call take_ownerhip() */ - return new OptionsSession(stack, this->sipevent->ss); - } - } - return tsk_null; -} +takeOwnership_Implement(Options, Options, Session); /* ======================== PublicationEvent ========================*/ @@ -279,6 +239,7 @@ const PublicationSession* PublicationEvent::getSession() const return dyn_cast(this->getBaseSession()); } +takeOwnership_Implement(Publication, Publication, Session); /* ======================== RegistrationEvent ========================*/ @@ -301,18 +262,7 @@ const RegistrationSession* RegistrationEvent::getSession() const return dyn_cast(this->getBaseSession()); } -RegistrationSession* RegistrationEvent::takeSessionOwnership() const -{ - // TODO: Factor all takeSessionOwnership() functions - if(this->sipevent && this->sipevent->ss && !tsip_ssession_have_ownership(this->sipevent->ss)){ - SipStack* stack = this->getStack(); - if(stack){ - /* The constructor will call take_ownerhip() */ - return new RegistrationSession(stack, this->sipevent->ss); - } - } - return tsk_null; -} +takeOwnership_Implement(Registration, Registration, Session); /* ======================== SubscriptionEvent ========================*/ @@ -333,4 +283,6 @@ tsip_subscribe_event_type_t SubscriptionEvent::getType() const const SubscriptionSession* SubscriptionEvent::getSession() const { return dyn_cast(this->getBaseSession()); -} \ No newline at end of file +} + +takeOwnership_Implement(Subscription, Subscription, Session); \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/_common/SipEvent.h b/branches/2.0/doubango/bindings/_common/SipEvent.h index 70157083..85acb8d0 100644 --- a/branches/2.0/doubango/bindings/_common/SipEvent.h +++ b/branches/2.0/doubango/bindings/_common/SipEvent.h @@ -22,6 +22,8 @@ #ifndef TINYWRAP_SIPEVENT_H #define TINYWRAP_SIPEVENT_H +#include "tinyWRAP_config.h" + #include "tinysip.h" #include "Common.h" @@ -42,7 +44,7 @@ class SipMessage; /* ======================== SipEvent ========================*/ -class SipEvent +class TINYWRAP_API SipEvent { public: #if !defined(SWIG) @@ -55,8 +57,9 @@ public: const char* getPhrase() const; const SipSession* getBaseSession() const; const SipMessage* getSipMessage() const; - -protected: +#if !defined(SWIG) + const tsip_event_t * getWrappedEvent(){ return sipevent; } +#endif #if !defined(SWIG) SipStack* getStack()const; #endif @@ -68,7 +71,7 @@ protected: /* ======================== DialogEvent ========================*/ -class DialogEvent: public SipEvent +class TINYWRAP_API DialogEvent: public SipEvent { public: #if !defined(SWIG) @@ -80,7 +83,7 @@ public: /* Public API functions */ }; /* ======================== StackEvent ========================*/ -class StackEvent: public SipEvent +class TINYWRAP_API StackEvent: public SipEvent { public: #if !defined(SWIG) @@ -94,7 +97,7 @@ public: /* Public API functions */ /* ======================== InviteEvent ========================*/ -class InviteEvent: public SipEvent +class TINYWRAP_API InviteEvent: public SipEvent { public: #if !defined(SWIG) @@ -113,7 +116,7 @@ public: /* Public API functions */ /* ======================== MessagingEvent ========================*/ -class MessagingEvent: public SipEvent +class TINYWRAP_API MessagingEvent: public SipEvent { public: #if !defined(SWIG) @@ -128,7 +131,7 @@ public: /* Public API functions */ }; /* ======================== InfoEvent ========================*/ -class InfoEvent: public SipEvent +class TINYWRAP_API InfoEvent: public SipEvent { public: #if !defined(SWIG) @@ -145,7 +148,7 @@ public: /* Public API functions */ /* ======================== OptionsEvent ========================*/ -class OptionsEvent: public SipEvent +class TINYWRAP_API OptionsEvent: public SipEvent { public: #if !defined(SWIG) @@ -162,7 +165,7 @@ public: /* Public API functions */ /* ======================== PublicationEvent ========================*/ -class PublicationEvent: public SipEvent +class TINYWRAP_API PublicationEvent: public SipEvent { public: #if !defined(SWIG) @@ -173,12 +176,13 @@ public: public: /* Public API functions */ tsip_publish_event_type_t getType() const; const PublicationSession* getSession() const; + PublicationSession* takeSessionOwnership() const; }; /* ======================== RegistrationEvent ========================*/ -class RegistrationEvent: public SipEvent +class TINYWRAP_API RegistrationEvent: public SipEvent { public: #if !defined(SWIG) @@ -195,7 +199,7 @@ public: /* Public API functions */ /* ======================== SubscriptionEvent ========================*/ -class SubscriptionEvent: public SipEvent +class TINYWRAP_API SubscriptionEvent: public SipEvent { public: #if !defined(SWIG) @@ -206,6 +210,7 @@ public: public: /* Public API functions */ tsip_subscribe_event_type_t getType() const; const SubscriptionSession* getSession() const; + SubscriptionSession* takeSessionOwnership() const; }; #endif /* TINYWRAP_SIPEVENT_H */ diff --git a/branches/2.0/doubango/bindings/_common/SipMessage.h b/branches/2.0/doubango/bindings/_common/SipMessage.h index 307c4fe7..dedc75dd 100644 --- a/branches/2.0/doubango/bindings/_common/SipMessage.h +++ b/branches/2.0/doubango/bindings/_common/SipMessage.h @@ -22,9 +22,10 @@ #ifndef TINYWRAP_SIPMESSAGE_H #define TINYWRAP_SIPMESSAGE_H +#include "tinyWRAP_config.h" #include "tinysip.h" -class SdpMessage +class TINYWRAP_API SdpMessage { public: SdpMessage(); @@ -35,12 +36,15 @@ public: char* getSdpHeaderValue(const char* media, char name, unsigned index = 0); char* getSdpHeaderAValue(const char* media, const char* attributeName); +#if !defined(SWIG) + const tsdp_message_t * getWrappedSdpMessage(){ return m_pSdpMessage; } +#endif private: tsdp_message_t *m_pSdpMessage; }; -class SipMessage +class TINYWRAP_API SipMessage { public: SipMessage(); diff --git a/branches/2.0/doubango/bindings/_common/SipSession.cxx b/branches/2.0/doubango/bindings/_common/SipSession.cxx index ca506137..89c1d0b2 100644 --- a/branches/2.0/doubango/bindings/_common/SipSession.cxx +++ b/branches/2.0/doubango/bindings/_common/SipSession.cxx @@ -59,7 +59,10 @@ void SipSession::init(SipStack* pStack, tsip_ssession_handle_t* pHandle/*=tsk_nu { if(pHandle){ /* "server-side-session" */ - if(tsip_ssession_take_ownership(pHandle)){ /* should never happen */ + if(tsip_ssession_have_ownership(pHandle)){ + tsk_object_ref(pHandle); + } + else if(tsip_ssession_take_ownership(pHandle) != 0){ /* should never happen */ TSK_DEBUG_ERROR("Failed to take ownership"); return; } @@ -965,6 +968,12 @@ PublicationSession::PublicationSession(SipStack* Stack) { } +PublicationSession::PublicationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +: SipSession(pStack, pHandle) +{ + +} + PublicationSession::~PublicationSession() { } @@ -1053,6 +1062,13 @@ SubscriptionSession::SubscriptionSession(SipStack* pStack) { } +SubscriptionSession::SubscriptionSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +: SipSession(pStack, pHandle) +{ + +} + + SubscriptionSession::~SubscriptionSession() { } diff --git a/branches/2.0/doubango/bindings/_common/SipSession.h b/branches/2.0/doubango/bindings/_common/SipSession.h index a1f3c8d0..1c810adc 100644 --- a/branches/2.0/doubango/bindings/_common/SipSession.h +++ b/branches/2.0/doubango/bindings/_common/SipSession.h @@ -22,6 +22,8 @@ #ifndef TINYWRAP_SIPSESSION_H #define TINYWRAP_SIPSESSION_H +#include "tinyWRAP_config.h" + #include "tinysip.h" #include "tinymedia/tmedia_qos.h" #include "ActionConfig.h" @@ -32,7 +34,7 @@ class MsrpCallback; class MediaSessionMgr; /* ======================== T140Callback ========================*/ -class T140CallbackData{ +class TINYWRAP_API T140CallbackData{ public: #if !defined(SWIG) T140CallbackData(enum tmedia_t140_data_type_e data_type, const void* data_ptr, unsigned data_size){ @@ -60,7 +62,7 @@ class T140CallbackData{ unsigned m_nSize; }; -class T140Callback +class TINYWRAP_API T140Callback { public: T140Callback() {} @@ -83,7 +85,7 @@ class RtcpCallbackData{ uint32_t m_nSSRC; }; -class RtcpCallback +class TINYWRAP_API RtcpCallback { public: RtcpCallback() {} @@ -95,7 +97,7 @@ public: /* ======================== SipSession ========================*/ -class SipSession +class TINYWRAP_API SipSession { public: SipSession(SipStack* stack); @@ -127,6 +129,7 @@ public: #if !defined(SWIG) bool setWebSocketSrc(const char* host, int32_t port, const char* proto); const SipStack* getStack() const; + const tsip_ssession_handle_t* getWrappedSession() { return m_pHandle; } #endif private: @@ -138,7 +141,7 @@ protected: }; /* ======================== InviteSession ========================*/ -class InviteSession : public SipSession +class TINYWRAP_API InviteSession : public SipSession { public: /* ctor() and dtor() */ InviteSession(SipStack* Stack); @@ -160,7 +163,7 @@ private: /* ======================== CallSession ========================*/ -class CallSession : public InviteSession +class TINYWRAP_API CallSession : public InviteSession { public: /* ctor() and dtor() */ CallSession(SipStack* pStack); @@ -214,7 +217,7 @@ private: }; /* ======================== MsrpSession ========================*/ -class MsrpSession : public InviteSession +class TINYWRAP_API MsrpSession : public InviteSession { public: /* ctor() and dtor() */ MsrpSession(SipStack* pStack, MsrpCallback* pCallback); @@ -244,7 +247,7 @@ private: /* ======================== MessagingSession ========================*/ -class MessagingSession : public SipSession +class TINYWRAP_API MessagingSession : public SipSession { public: /* ctor() and dtor() */ MessagingSession(SipStack* pStack); @@ -260,7 +263,7 @@ public: /* Public functions */ }; /* ======================== InfoSession ========================*/ -class InfoSession : public SipSession +class TINYWRAP_API InfoSession : public SipSession { public: /* ctor() and dtor() */ InfoSession(SipStack* pStack); @@ -276,7 +279,7 @@ public: /* Public functions */ }; /* ======================== OptionsSession ========================*/ -class OptionsSession : public SipSession +class TINYWRAP_API OptionsSession : public SipSession { public: /* ctor() and dtor() */ OptionsSession(SipStack* pStack); @@ -294,10 +297,13 @@ public: /* Public functions */ /* ======================== PublicationSession ========================*/ -class PublicationSession : public SipSession +class TINYWRAP_API PublicationSession : public SipSession { public: /* ctor() and dtor() */ PublicationSession(SipStack* pStack); +#if !defined(SWIG) + PublicationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); +#endif virtual ~PublicationSession(); public: /* Public functions */ @@ -307,7 +313,7 @@ public: /* Public functions */ /* ======================== RegistrationSession ========================*/ -class RegistrationSession : public SipSession +class TINYWRAP_API RegistrationSession : public SipSession { public: /* ctor() and dtor() */ RegistrationSession(SipStack* pStack); @@ -325,10 +331,13 @@ public: /* Public functions */ /* ======================== SubscriptionSession ========================*/ -class SubscriptionSession : public SipSession +class TINYWRAP_API SubscriptionSession : public SipSession { public: /* ctor() and dtor() */ SubscriptionSession(SipStack* pStack); +#if !defined(SWIG) + SubscriptionSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); +#endif virtual ~SubscriptionSession(); public: /* Public functions */ diff --git a/branches/2.0/doubango/bindings/_common/SipStack.cxx b/branches/2.0/doubango/bindings/_common/SipStack.cxx index e08c888b..cc21c07d 100644 --- a/branches/2.0/doubango/bindings/_common/SipStack.cxx +++ b/branches/2.0/doubango/bindings/_common/SipStack.cxx @@ -88,6 +88,14 @@ bool SipStack::setDebugCallback(DDebugCallback* pCallback) return true; } +bool SipStack::setDisplayName(const char* display_name) +{ + int ret = tsip_stack_set(m_pHandle, + TSIP_STACK_SET_DISPLAY_NAME(display_name), + TSIP_STACK_SET_NULL()); + return (ret == 0); +} + bool SipStack::setRealm(const char* realm_uri) { int ret = tsip_stack_set(m_pHandle, diff --git a/branches/2.0/doubango/bindings/_common/SipStack.h b/branches/2.0/doubango/bindings/_common/SipStack.h index 904a96e3..c5a0c5e4 100644 --- a/branches/2.0/doubango/bindings/_common/SipStack.h +++ b/branches/2.0/doubango/bindings/_common/SipStack.h @@ -22,6 +22,8 @@ #ifndef TINYWRAP_SIPSTACK_H #define TINYWRAP_SIPSTACK_H +#include "tinyWRAP_config.h" + #include "SipCallback.h" #include "SafeObject.h" @@ -30,7 +32,7 @@ class DDebugCallback; -class SipStack: public SafeObject +class TINYWRAP_API SipStack: public SafeObject { public: /* ctor() and dtor() */ SipStack(SipCallback* pCallback, const char* realm_uri, const char* impi_uri, const char* impu_uri); @@ -39,6 +41,7 @@ public: /* ctor() and dtor() */ public: /* API functions */ bool start(); bool setDebugCallback(DDebugCallback* pCallback); + bool setDisplayName(const char* display_name); bool setRealm(const char* realm_uri); bool setIMPI(const char* impi); bool setIMPU(const char* impu_uri); diff --git a/branches/2.0/doubango/bindings/_common/SipUri.h b/branches/2.0/doubango/bindings/_common/SipUri.h index 976947f9..9e2d15c5 100644 --- a/branches/2.0/doubango/bindings/_common/SipUri.h +++ b/branches/2.0/doubango/bindings/_common/SipUri.h @@ -22,9 +22,11 @@ #ifndef TINYWRAP_SIPURI_H #define TINYWRAP_SIPURI_H +#include "tinyWRAP_config.h" + #include "tinysip.h" -class SipUri +class TINYWRAP_API SipUri { public: SipUri(const char* uriString, const char* displayName=tsk_null); diff --git a/branches/2.0/doubango/bindings/_common/tinyWRAP_config.h b/branches/2.0/doubango/bindings/_common/tinyWRAP_config.h index 70d2f793..f2531df5 100644 --- a/branches/2.0/doubango/bindings/_common/tinyWRAP_config.h +++ b/branches/2.0/doubango/bindings/_common/tinyWRAP_config.h @@ -27,16 +27,18 @@ #undef _WIN32 /* Because of WINSCW */ #endif -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition. #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TWRAP_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TWRAP_UNDER_WINDOWS_RT 1 +# endif #endif #if (TWRAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYWRAP_EXPORTS) # define TINYWRAP_API __declspec(dllexport) -# define TINYWRAP_GEXTERN __declspec(dllexport) -#elif (TWRAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) /*&& defined(TINYWRAP_IMPORTS)*/ +# define TINYWRAP_GEXTERN extern __declspec(dllexport) +#elif (TWRAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && !defined(TINYWRAP_IMPORTS_IGNORE) # define TINYWRAP_API __declspec(dllimport) # define TINYWRAP_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/bindings/winrt/HandleRef.cs b/branches/2.0/doubango/bindings/winrt/HandleRef.cs new file mode 100644 index 00000000..4f623384 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/HandleRef.cs @@ -0,0 +1,55 @@ +// ==++== +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// ==--== +namespace System.Runtime.InteropServices +{ + + using System; + + [System.Runtime.InteropServices.ComVisible(true)] + public struct HandleRef + { + + // ! Do not add or rearrange fields as the EE depends on this layout. + //------------------------------------------------------------------ + internal Object m_wrapper; + internal IntPtr m_handle; + //----------------------------------------------------------------- + + + public HandleRef(Object wrapper, IntPtr handle) + { + m_wrapper = wrapper; + m_handle = handle; + } + + public Object Wrapper + { + get + { + return m_wrapper; + } + } + + public IntPtr Handle + { + get + { + return m_handle; + } + } + + + public static explicit operator IntPtr(HandleRef value) + { + return value.m_handle; + } + + public static IntPtr ToIntPtr(HandleRef value) + { + return value.m_handle; + } + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/doubango_rt.vcxproj b/branches/2.0/doubango/bindings/winrt/doubango_rt/doubango_rt.vcxproj new file mode 100644 index 00000000..bfadcabf --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/doubango_rt.vcxproj @@ -0,0 +1,232 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {9ef0fc75-baab-4f71-ac0c-dbd185463ff8} + doubango_rt + en-US + 11.0 + true + + + + DynamicLibrary + true + v110_wp80 + + + DynamicLibrary + true + v110_wp80 + + + DynamicLibrary + false + true + v110_wp80 + + + DynamicLibrary + false + true + v110_wp80 + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(Platform)\$(Configuration)\ + + + $(Platform)\$(Configuration)\ + + + + _WINRT_DLL;%(PreprocessorDefinitions) + NotUsing + + + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + true + include;..\..\_common;..\..\.;..\..\..\thirdparties\winrt\include;..\..\..\tinySAK\src;..\..\..\tinyNET\src;..\..\..\tinyHTTP\include;..\..\..\tinySIP\include;..\..\..\tinyDAV\include;..\..\..\tinySDP\include;..\..\..\tinyMEDIA\include;..\..\..\tinyXCAP\include;..\..\..\tinySMS\include;..\..\..\tinyMSRP\include + + + Console + false + ole32.lib;%(IgnoreSpecificDefaultLibraries) + true + %(AdditionalDependencies) + + + + + _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions) + NotUsing + + + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + true + include;..\..\_common;..\..\.;..\..\..\thirdparties\winrt\include;..\..\..\tinySAK\src;..\..\..\tinyNET\src;..\..\..\tinyHTTP\include;..\..\..\tinySIP\include;..\..\..\tinyDAV\include;..\..\..\tinySDP\include;..\..\..\tinyMEDIA\include;..\..\..\tinyXCAP\include;..\..\..\tinySMS\include;..\..\..\tinyMSRP\include + + + Console + false + ole32.lib;%(IgnoreSpecificDefaultLibraries) + true + %(AdditionalDependencies) + + + + + _WINRT_DLL;%(PreprocessorDefinitions) + NotUsing + + + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + true + include;..\..\_common;..\..\.;..\..\..\thirdparties\winrt\include;..\..\..\tinySAK\src;..\..\..\tinyNET\src;..\..\..\tinyHTTP\include;..\..\..\tinySIP\include;..\..\..\tinyDAV\include;..\..\..\tinySDP\include;..\..\..\tinyMEDIA\include;..\..\..\tinyXCAP\include;..\..\..\tinySMS\include;..\..\..\tinyMSRP\include + + + Console + false + ole32.lib;%(IgnoreSpecificDefaultLibraries) + true + %(AdditionalDependencies) + + + + + _WINRT_DLL;NDEBUG;%(PreprocessorDefinitions) + NotUsing + + + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + true + include;..\..\_common;..\..\.;..\..\..\thirdparties\winrt\include;..\..\..\tinySAK\src;..\..\..\tinyNET\src;..\..\..\tinyHTTP\include;..\..\..\tinySIP\include;..\..\..\tinyDAV\include;..\..\..\tinySDP\include;..\..\..\tinyMEDIA\include;..\..\..\tinyXCAP\include;..\..\..\tinySMS\include;..\..\..\tinyMSRP\include + + + Console + false + ole32.lib;%(IgnoreSpecificDefaultLibraries) + true + %(AdditionalDependencies) + + + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {0f2c458a-1edb-4e09-9a22-c2209731cff2} + + + {1a27423c-6535-4a49-96ec-5d209fe125f2} + + + {0875a083-5118-40cc-941e-722b00295a5b} + + + {52e43eeb-a549-4159-b254-dca225d7638b} + + + {be41d117-1d61-4c12-ad9d-b20d02c79687} + + + {06e58f9d-28a1-4dd4-af11-2f5239222ccc} + + + {77a24977-079c-4e02-9717-8b2f684baa21} + + + {19279f5b-cdaf-4187-9f09-2a896a828b05} + + + {982d737a-0649-4c32-a00e-08992a0b7673} + + + {f623cbdb-707a-4fdc-ace0-3d616e239f16} + + + {1137a808-dac8-4af7-b8bb-aee8abff2f67} + + + {65cdf0ff-3b84-45f3-9bb6-468c79b8e0bc} + + + {49843b78-0ceb-445d-bacc-c5c5c2f6c26f} + + + {5004ba7e-950d-4d60-a030-29acd38dca08} + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/doubango_rt.vcxproj.filters b/branches/2.0/doubango/bindings/winrt/doubango_rt/doubango_rt.vcxproj.filters new file mode 100644 index 00000000..92288793 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/doubango_rt.vcxproj.filters @@ -0,0 +1,112 @@ + + + + + 5fd0e509-b6ae-4f29-bd2a-4d2cc10f3aa0 + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {98c8b78c-011e-40c4-91a2-a9fcf6d9fa24} + + + {a8badfe7-5114-4a27-bb07-76772da8a9d1} + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_ActionConfig.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_ActionConfig.h new file mode 100644 index 00000000..be2ce86d --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_ActionConfig.h @@ -0,0 +1,53 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include "rt_Enums.h" + +class ActionConfig; + +namespace doubango_rt +{ + namespace BackEnd + { + public ref class rtActionConfig sealed + { + public: + rtActionConfig(); + virtual ~rtActionConfig(); + + bool addHeader(Platform::String^ name, Platform::String^ value); +#if COM_VISIBLE + bool addPayload(Platform::String^ payload); +#else + bool addPayload(Platform::IntPtr payload, unsigned len); +#endif + bool setActiveMedia(rt_twrap_media_type_t type); + + rtActionConfig^ setResponseLine(short code, Platform::String^ phrase); + rtActionConfig^ setMediaString(rt_twrap_media_type_t type, Platform::String^ key, Platform::String^ value); + rtActionConfig^ setMediaInt(rt_twrap_media_type_t type, Platform::String^ key, int value); + + internal: + ActionConfig* getWrappedActionConfig(){ return m_pActionConfig; } + + private: + ActionConfig* m_pActionConfig; + }; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Config.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Config.h new file mode 100644 index 00000000..81684196 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Config.h @@ -0,0 +1,31 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#define rtSafeDelete(ptr) if((ptr)) delete (ptr), (ptr) = nullptr; + +#if COM_VISIBLE +# define OVERRIDE_FUNC(fun) +# define VISIBLE_VOID_PTR Platform::String^ +# define VISIBLE_VOID_PTR_2_VOID_PTR(ptr) rtString::toUtf8((ptr)).data() +#else +# define OVERRIDE_FUNC(fun) fun +# define VISIBLE_VOID_PTR Platform::IntPtr +# define VISIBLE_VOID_PTR_2_VOID_PTR(ptr) (void*)((ptr)) +#endif + \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_DDebug.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_DDebug.h new file mode 100644 index 00000000..22a4b65f --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_DDebug.h @@ -0,0 +1,53 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include "rt_Config.h" + +class DDebugCallback; +class DDebugCallbackProxy; + +namespace doubango_rt +{ + namespace BackEnd + { + public interface class rtIDDebugCallback + { + virtual int OnDebugInfo(Platform::String^ message); + virtual int OnDebugWarn(Platform::String^ message); + virtual int OnDebugError(Platform::String^ message); + virtual int OnDebugFatal(Platform::String^ message); + }; + + public ref class rtDDebugCallback sealed + { + internal: + rtDDebugCallback(rtIDDebugCallback^ pI); + public: + virtual ~rtDDebugCallback(); + friend class DDebugCallbackProxy; + + internal: + const DDebugCallback* getWrappedCallback(); + + private: + rtIDDebugCallback^ m_pI; + DDebugCallbackProxy* m_pCallback; + }; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Enums.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Enums.h new file mode 100644 index 00000000..61ec8cde --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Enums.h @@ -0,0 +1,331 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include "rt_config.h" + +#include "tinysip.h" +#include "tinymsrp.h" +#include "tinymedia.h" + +#include "Common.h" + +namespace doubango_rt +{ + namespace BackEnd + { + public enum class rtConstants + { + rt_tsip_event_code_dialog_transport_error = tsip_event_code_dialog_transport_error, + rt_tsip_event_code_dialog_global_error = tsip_event_code_dialog_global_error, + rt_tsip_event_code_dialog_message_error = tsip_event_code_dialog_message_error, + + // 8xx ==> success + rt_tsip_event_code_dialog_request_incoming = tsip_event_code_dialog_request_incoming, + rt_tsip_event_code_dialog_request_outgoing = tsip_event_code_dialog_request_outgoing, + rt_tsip_event_code_dialog_request_cancelled = tsip_event_code_dialog_request_cancelled, + rt_tsip_event_code_dialog_request_sent = tsip_event_code_dialog_request_sent, + + // 9xx ==> Informational + rt_tsip_event_code_dialog_connecting = tsip_event_code_dialog_connecting, + rt_tsip_event_code_dialog_connected = tsip_event_code_dialog_connected, + rt_tsip_event_code_dialog_terminating = tsip_event_code_dialog_terminating, + rt_tsip_event_code_dialog_terminated = tsip_event_code_dialog_terminated, + rt_tsip_event_code_stack_starting = tsip_event_code_stack_starting, + rt_tsip_event_code_stack_started = tsip_event_code_stack_started, + rt_tsip_event_code_stack_stopping = tsip_event_code_stack_stopping, + rt_tsip_event_code_stack_stopped = tsip_event_code_stack_stopped, + rt_tsip_event_code_stack_failed_to_start = tsip_event_code_stack_failed_to_start, + rt_tsip_event_code_stack_failed_to_stop = tsip_event_code_stack_failed_to_stop + }; + + public enum class rt_twrap_media_type_t + { + twrap_media_none = twrap_media_none, + + twrap_media_audio = twrap_media_audio, + twrap_media_video = twrap_media_video, + twrap_media_msrp = twrap_media_msrp, + twrap_media_t140 = twrap_media_t140, + + twrap_media_audio_t140 = twrap_media_audio_t140, + twrap_media_video_t140 = twrap_media_video_t140, + twrap_media_audiovideo = twrap_media_audiovideo, /* @deprecated */ + twrap_media_audio_video = twrap_media_audio_video, + twrap_media_audio_video_t140 = twrap_media_audio_video_t140 + }; + + public enum class rt_tmedia_bandwidth_level_t + { + tmedia_bl_low = tmedia_bl_low, + tmedia_bl_medium = tmedia_bl_medium, + tmedia_bl_hight = tmedia_bl_hight, + tmedia_bl_unrestricted = tmedia_bl_unrestricted + }; + + public enum class rt_tmedia_pref_video_size_t + { + tmedia_pref_video_size_sqcif = tmedia_pref_video_size_sqcif, // 128 x 98 + tmedia_pref_video_size_qcif = tmedia_pref_video_size_qcif, // 176 x 144 + tmedia_pref_video_size_qvga = tmedia_pref_video_size_qvga, // 320 x 240 + tmedia_pref_video_size_cif = tmedia_pref_video_size_cif, // 352 x 288 + tmedia_pref_video_size_hvga = tmedia_pref_video_size_hvga, // 480 x 320 + tmedia_pref_video_size_vga = tmedia_pref_video_size_vga, // 640 x 480 + tmedia_pref_video_size_4cif = tmedia_pref_video_size_4cif, // 704 x 576 + tmedia_pref_video_size_svga = tmedia_pref_video_size_svga, // 800 x 600 + tmedia_pref_video_size_480p = tmedia_pref_video_size_480p, // 852 x 480 + tmedia_pref_video_size_720p = tmedia_pref_video_size_720p, // 1280 x 720 + tmedia_pref_video_size_16cif = tmedia_pref_video_size_16cif, // 1408 x 1152 + tmedia_pref_video_size_1080p = tmedia_pref_video_size_1080p, // 1920 x 1080 + }; + + public enum class rt_tmedia_profile_t + { + tmedia_profile_default = tmedia_profile_default, + tmedia_profile_rtcweb = tmedia_profile_rtcweb + }; + + public enum class rt_tmedia_qos_strength_t + { + tmedia_qos_strength_none = tmedia_qos_strength_none, + tmedia_qos_strength_failure = tmedia_qos_strength_failure, + tmedia_qos_strength_unknown = tmedia_qos_strength_unknown, + tmedia_qos_strength_optional = tmedia_qos_strength_optional, + tmedia_qos_strength_mandatory = tmedia_qos_strength_mandatory + }; + + public enum class rt_tmedia_qos_stype_t + { + tmedia_qos_stype_none = tmedia_qos_stype_none, + + tmedia_qos_stype_segmented = tmedia_qos_stype_segmented, + tmedia_qos_stype_e2e = tmedia_qos_stype_e2e, + }; + + public enum class rt_tmedia_srtp_mode_t + { + tmedia_srtp_mode_none = tmedia_srtp_mode_none, + tmedia_srtp_mode_optional = tmedia_srtp_mode_optional, + tmedia_srtp_mode_mandatory = tmedia_srtp_mode_mandatory + }; + + public enum class rt_tmedia_srtp_type_t + { + tmedia_srtp_type_none = tmedia_srtp_type_none, + tmedia_srtp_type_sdes = tmedia_srtp_type_sdes, + tmedia_srtp_type_dtls = tmedia_srtp_type_dtls, + tmedia_srtp_type_sdes_dtls = tmedia_srtp_type_sdes_dtls + }; + + public enum class rt_tmedia_t140_data_type_t + { + tmedia_t140_data_type_utf8 = tmedia_t140_data_type_utf8, + tmedia_t140_data_type_zero_width_no_break_space = tmedia_t140_data_type_zero_width_no_break_space, + tmedia_t140_data_type_backspace = tmedia_t140_data_type_backspace, + tmedia_t140_data_type_esc = tmedia_t140_data_type_esc, + tmedia_t140_data_type_cr = tmedia_t140_data_type_cr, + tmedia_t140_data_type_lf = tmedia_t140_data_type_lf, + tmedia_t140_data_type_cr_lf = tmedia_t140_data_type_cr_lf, + tmedia_t140_data_type_bell = tmedia_t140_data_type_bell, + tmedia_t140_data_type_sos = tmedia_t140_data_type_sos, + tmedia_t140_data_type_string_term = tmedia_t140_data_type_string_term, + tmedia_t140_data_type_graphic_start = tmedia_t140_data_type_graphic_start, + tmedia_t140_data_type_graphic_end = tmedia_t140_data_type_graphic_end, + tmedia_t140_data_type_loss_char_char = tmedia_t140_data_type_loss_char_char, + tmedia_t140_data_type_loss_utf8 = tmedia_t140_data_type_loss_utf8, + }; + + public enum class rt_tmedia_type_t + { + tmedia_none = tmedia_none, + tmedia_ghost = tmedia_ghost, + + tmedia_audio = tmedia_audio, + tmedia_video = tmedia_video, + tmedia_chat = tmedia_chat, + tmedia_file = tmedia_file, + tmedia_t38 = tmedia_t38, + tmedia_t140 = tmedia_t140, + + tmedia_msrp = tmedia_msrp, + tmedia_audiovideo = tmedia_audiovideo, + + tmedia_all = tmedia_all + }; + + public enum class rt_tmsrp_event_type_t + { + tmsrp_event_type_none = tmsrp_event_type_none, + tmsrp_event_type_connected = tmsrp_event_type_connected, + tmsrp_event_type_disconnected = tmsrp_event_type_disconnected, + tmsrp_event_type_message = tmsrp_event_type_message, + }; + + public enum class rt_tmsrp_request_type_t + { + tmsrp_NONE = tmsrp_NONE, + + tmsrp_SEND = tmsrp_SEND, + tmsrp_REPORT = tmsrp_REPORT, + tmsrp_AUTH = tmsrp_AUTH + }; + + public enum class rt_tsip_info_event_type_t + { + tsip_i_info = tsip_i_info, + tsip_ao_info = tsip_ao_info, + }; + + public enum class rt_tsip_invite_event_type_t + { + tsip_i_newcall = tsip_i_newcall, + + tsip_i_request = tsip_i_request, + tsip_ao_request = tsip_ao_request, + + tsip_o_ect_trying = tsip_o_ect_trying, + tsip_o_ect_accepted = tsip_o_ect_accepted, + tsip_o_ect_completed = tsip_o_ect_completed, + tsip_o_ect_failed = tsip_o_ect_failed, + tsip_o_ect_notify = tsip_o_ect_notify, + tsip_i_ect_requested = tsip_i_ect_requested, + tsip_i_ect_newcall = tsip_i_ect_newcall, + tsip_i_ect_completed = tsip_i_ect_completed, + tsip_i_ect_failed = tsip_i_ect_failed, + tsip_i_ect_notify = tsip_i_ect_notify, + + tsip_m_early_media = tsip_m_early_media, + tsip_m_updating = tsip_m_updating, + tsip_m_updated = tsip_m_updated, + + tsip_m_local_hold_ok = tsip_m_local_hold_ok, + tsip_m_local_hold_nok = tsip_m_local_hold_nok, + tsip_m_local_resume_ok = tsip_m_local_resume_ok, + tsip_m_local_resume_nok = tsip_m_local_resume_nok, + tsip_m_remote_hold = tsip_m_remote_hold, + tsip_m_remote_resume = tsip_m_remote_resume, + }; + + public enum class rt_tsip_message_event_type_t + { + tsip_i_message = tsip_i_message, + tsip_ao_message = tsip_ao_message, + }; + + public enum class rt_tsip_options_event_type_t + { + tsip_i_options = tsip_i_options, + tsip_ao_options = tsip_ao_options, + }; + + public enum class rt_tsip_publish_event_type_t + { + tsip_i_publish = tsip_i_publish, + tsip_ao_publish = tsip_ao_publish, + + tsip_i_unpublish = tsip_i_unpublish, + tsip_ao_unpublish = tsip_ao_unpublish + }; + + public enum class rt_tsip_register_event_type_t + { + tsip_i_newreg = tsip_i_newreg, + + tsip_i_register = tsip_i_register, + tsip_ao_register = tsip_ao_register, + + tsip_i_unregister = tsip_i_unregister, + tsip_ao_unregister = tsip_ao_unregister, + }; + + public enum class rt_tsip_request_type_t + { + tsip_NONE = tsip_NONE, + + tsip_ACK = tsip_ACK, + tsip_BYE = tsip_BYE, + tsip_CANCEL = tsip_CANCEL, + tsip_INVITE = tsip_INVITE, + tsip_OPTIONS = tsip_OPTIONS, + tsip_REGISTER = tsip_REGISTER, + tsip_SUBSCRIBE = tsip_SUBSCRIBE, + tsip_NOTIFY = tsip_NOTIFY, + tsip_REFER = tsip_REFER, + tsip_INFO = tsip_INFO, + tsip_UPDATE = tsip_UPDATE, + tsip_MESSAGE = tsip_MESSAGE, + tsip_PUBLISH = tsip_PUBLISH, + tsip_PRACK = tsip_PRACK + }; + + public enum class rt_tsip_subscribe_event_type_t + { + tsip_i_subscribe = tsip_i_subscribe, + tsip_ao_subscribe = tsip_ao_subscribe, + + tsip_i_unsubscribe = tsip_i_unsubscribe, + tsip_ao_unsubscribe = tsip_ao_unsubscribe, + + tsip_i_notify = tsip_i_notify, + tsip_ao_notify = tsip_ao_notify + }; + + public enum class rt_tdav_codec_id_t + { + tdav_codec_id_none = tmedia_codec_id_none, + + tdav_codec_id_amr_nb_oa = tmedia_codec_id_amr_nb_oa, + tdav_codec_id_amr_nb_be = tmedia_codec_id_amr_nb_be, + tdav_codec_id_amr_wb_oa = tmedia_codec_id_amr_wb_oa, + tdav_codec_id_amr_wb_be = tmedia_codec_id_amr_wb_be, + tdav_codec_id_gsm = tmedia_codec_id_gsm, + tdav_codec_id_pcma = tmedia_codec_id_pcma, + tdav_codec_id_pcmu = tmedia_codec_id_pcmu, + tdav_codec_id_ilbc = tmedia_codec_id_ilbc, + tdav_codec_id_speex_nb = tmedia_codec_id_speex_nb, + tdav_codec_id_speex_wb = tmedia_codec_id_speex_wb, + tdav_codec_id_speex_uwb = tmedia_codec_id_speex_uwb, + tdav_codec_id_bv16 = tmedia_codec_id_bv16, + tdav_codec_id_bv32 = tmedia_codec_id_bv32, + tdav_codec_id_opus = tmedia_codec_id_opus, + tdav_codec_id_g729ab = tmedia_codec_id_g729ab, + tdav_codec_id_g722 = tmedia_codec_id_g722, + + tdav_codec_id_h261 = tmedia_codec_id_h261, + tdav_codec_id_h263 = tmedia_codec_id_h263, + tdav_codec_id_h263p = tmedia_codec_id_h263p, + tdav_codec_id_h263pp = tmedia_codec_id_h263pp, + tdav_codec_id_h264_bp = tmedia_codec_id_h264_bp, + tdav_codec_id_h264_mp = tmedia_codec_id_h264_mp, + tdav_codec_id_h264_hp = tmedia_codec_id_h264_hp, + tdav_codec_id_h264_bp10 = tmedia_codec_id_h264_bp, // @deprecated + tdav_codec_id_h264_bp20 = tmedia_codec_id_h264_bp, // @deprecated + tdav_codec_id_h264_bp30 = tmedia_codec_id_h264_bp, // @deprecated + tdav_codec_id_h264_svc = tmedia_codec_id_h264_svc, + tdav_codec_id_theora = tmedia_codec_id_theora, + tdav_codec_id_mp4ves_es = tmedia_codec_id_mp4ves_es, + tdav_codec_id_vp8 = tmedia_codec_id_vp8, + + tdav_codec_id_t140 = tmedia_codec_id_t140, +#if !COM_VISIBLE + tdav_codec_id_red = tmedia_codec_id_red, +#endif + tdav_codec_id_all = tmedia_codec_id_all, + }; + } +} diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_MediaContent.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_MediaContent.h new file mode 100644 index 00000000..dc403219 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_MediaContent.h @@ -0,0 +1,18 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_MediaSessionMgr.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_MediaSessionMgr.h new file mode 100644 index 00000000..17b9547d --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_MediaSessionMgr.h @@ -0,0 +1,129 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +class MediaSessionMgr; +class Codec; + +struct tmedia_codec_s; +struct tmedia_session_mgr_s; + +namespace doubango_rt +{ + namespace BackEnd + { + enum class rt_twrap_media_type_t; + enum class rt_tmedia_profile_t; + enum class rt_tmedia_srtp_mode_t; + enum class rt_tmedia_srtp_type_t; + enum class rt_tmedia_profile_t; + enum class rt_tmedia_pref_video_size_t; + + public ref class rtCodec sealed + { + internal: + rtCodec(struct tmedia_codec_s* pCodec); + public: + virtual ~rtCodec(); + enum class rt_twrap_media_type_t getMediaType(); + Platform::String^ getName(); + Platform::String^ getDescription(); + Platform::String^ getNegFormat(); + int getAudioSamplingRate(); + int getAudioChannels(); + int getAudioPTime(); + + private: + Codec* m_pCodec; + }; + + public ref class rtMediaSessionMgr sealed + { + internal: + rtMediaSessionMgr(struct tmedia_session_mgr_s* pWrappedMgr); + + public: + virtual ~rtMediaSessionMgr(); + bool sessionSetInt32(rt_twrap_media_type_t media, Platform::String^ key, int32 value); + int32 sessionGetInt32(rt_twrap_media_type_t media, Platform::String^ key); + + bool consumerSetInt32(rt_twrap_media_type_t media, Platform::String^ key, int32 value); + bool consumerSetInt64(rt_twrap_media_type_t media, Platform::String^ key, int64 value); + + bool producerSetInt32(rt_twrap_media_type_t media, Platform::String^ key, int32 value); + bool producerSetInt64(rt_twrap_media_type_t media, Platform::String^ key, int64 value); + rtCodec^ producerGetCodec(rt_twrap_media_type_t media); + + static unsigned int registerAudioPluginFromFile(Platform::String^ path); + + uint64 getSessionId(rt_twrap_media_type_t media); + + static bool defaultsSetProfile(rt_tmedia_profile_t profile); + static rt_tmedia_profile_t defaultsGetProfile(); + static bool defaultsSetPrefVideoSize(enum class rt_tmedia_pref_video_size_t pref_video_size); + static bool defaultsSetJbMargin(uint32 jb_margin_ms); + static bool defaultsSetJbMaxLateRate(uint32 jb_late_rate_percent); + static bool defaultsSetEchoTail(uint32 echo_tail); + static uint32 defaultsGetEchoTail(); + static bool defaultsSetEchoSkew(uint32 echo_skew); + static bool defaultsSetEchoSuppEnabled(bool echo_supp_enabled); + static bool defaultsGetEchoSuppEnabled(); + static bool defaultsSetAgcEnabled(bool agc_enabled); + static bool defaultsGetAgcEnabled(); + static bool defaultsSetAgcLevel(float agc_level); + static float defaultsGetAgcLevel(); + static bool defaultsSetVadEnabled(bool vad_enabled); + static bool defaultsGetGetVadEnabled(); + static bool defaultsSetNoiseSuppEnabled(bool noise_supp_enabled); + static bool defaultsGetNoiseSuppEnabled(); + static bool defaultsSetNoiseSuppLevel(int32 noise_supp_level); + static int32 defaultsGetNoiseSuppLevel(); + static bool defaultsSet100relEnabled(bool _100rel_enabled); + static bool defaultsGet100relEnabled(); + static bool defaultsSetScreenSize(int32 sx, int32 sy); + static bool defaultsSetAudioGain(int32 producer_gain, int32 consumer_gain); + static bool defaultsSetRtpPortRange(uint16 range_start, uint16 range_stop); + static bool defaultsSetRtpSymetricEnabled(bool enabled); + static bool defaultsSetMediaType(enum class rt_twrap_media_type_t media_type); + static bool defaultsSetVolume(int32 volume); + static int32 defaultsGetVolume(); + static bool defaultsSetInviteSessionTimers(int32 timeout, Platform::String^ refresher); + static bool defaultsSetSRtpMode(enum class rt_tmedia_srtp_mode_t mode); + static enum class rt_tmedia_srtp_mode_t defaultsGetSRtpMode(); + static bool defaultsSetSRtpType(enum class rt_tmedia_srtp_type_t srtp_type); + static enum class rt_tmedia_srtp_type_t defaultsGetSRtpType(); + static bool defaultsSetRtcpEnabled(bool enabled); + static bool defaultsGetRtcpEnabled(); + static bool defaultsSetRtcpMuxEnabled(bool enabled); + static bool defaultsGetRtcpMuxEnabled(); + static bool defaultsSetIceEnabled(bool ice_enabled); + static bool defaultsSetByPassEncoding(bool enabled); + static bool defaultsGetByPassEncoding(); + static bool defaultsSetByPassDecoding(bool enabled); + static bool defaultsGetByPassDecoding(); + static bool defaultsSetVideoJbEnabled(bool enabled); + static bool defaultsGetVideoJbEnabled(bool enabled); + static bool defaultsSetRtpBuffSize(unsigned buffSize); + static unsigned defaultsGetRtpBuffSize(); + static bool defaultsSetAvpfTail(unsigned tail_min, unsigned tail_max); + + private: + MediaSessionMgr* m_pMediaSessionMgr; + }; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Msrp.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Msrp.h new file mode 100644 index 00000000..f7649723 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Msrp.h @@ -0,0 +1,109 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include "rt_Enums.h" + +class MsrpCallback; +class MsrpMessage; +class MsrpEvent; + +namespace doubango_rt +{ + namespace BackEnd + { + ref class rtMsrpSession; + + public ref class rtMsrpByteRange sealed + { + internal: + rtMsrpByteRange(int64 start, int64 end, int64 total):_start(start),_end(end),_total(total){} + public: + property int64 Start{ int64 get() { return _start; }; } + property int64 End{ int64 get() { return _end; }; } + property int64 Total{ int64 get() { return _total; }; } + private: + int64 _start, _end, _total; + }; + + public ref class rtMsrpMessage sealed + { + public: + virtual ~rtMsrpMessage(); + internal: + rtMsrpMessage(struct tmsrp_message_s *message); + + public: + bool isRequest(); + short getCode(); + Platform::String^ getPhrase(); + rt_tmsrp_request_type_t getRequestType(); +#if COM_VISIBLE + rtMsrpByteRange^ getByteRange(); +#else + void getByteRange(Platform::IntPtr start, Platform::IntPtr end, Platform::IntPtr total); +#endif + bool isLastChunck(); + bool isFirstChunck(); + bool isSuccessReport(); + Platform::String^ getMsrpHeaderValue(Platform::String^ name); + Platform::String^ getMsrpHeaderParamValue(Platform::String^ name, Platform::String^ param); + unsigned getMsrpContentLength(); +#if COM_VISIBLE + Platform::String^ getMsrpContent(unsigned maxsize); +#else + unsigned getMsrpContent(Platform::IntPtr output, unsigned maxsize); +#endif + + private: + MsrpMessage* m_pMsrpMessage; + }; + + public ref class rtMsrpEvent sealed + { + internal: + rtMsrpEvent(const struct tmsrp_event_s *event); + public: + virtual ~rtMsrpEvent(); + + rt_tmsrp_event_type_t getType(); + rtMsrpSession^ getSipSession(); + rtMsrpMessage^ getMessage(); + + private: + MsrpEvent* m_pMsrpEvent; + }; + + public interface class rtIMsrpCallback + { + virtual int OnEvent(rtMsrpEvent^ pEvent); + }; + public ref class rtMsrpCallback sealed + { + internal: + rtMsrpCallback(rtIMsrpCallback^ pI); + const MsrpCallback* getWrappedCallback(){ return m_pCallback; } + public: + virtual ~rtMsrpCallback(); + + private: + MsrpCallback* m_pCallback; + rtIMsrpCallback^ m_pI; + }; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SMSEncoder.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SMSEncoder.h new file mode 100644 index 00000000..dc403219 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SMSEncoder.h @@ -0,0 +1,18 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipCallback.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipCallback.h new file mode 100644 index 00000000..a229fc46 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipCallback.h @@ -0,0 +1,70 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +class SipCallback; +class SipCallbackProxy; + +namespace doubango_rt +{ + namespace BackEnd + { + ref class rtDialogEvent; + ref class rtStackEvent; + + ref class rtInviteEvent; + ref class rtMessagingEvent; + ref class rtInfoEvent; + ref class rtOptionsEvent; + ref class rtPublicationEvent; + ref class rtRegistrationEvent; + ref class rtSubscriptionEvent; + + public interface class rtISipCallback + { + virtual int OnDialogEvent(rtDialogEvent^ e); + virtual int OnStackEvent(rtStackEvent^ e); + + virtual int OnInviteEvent(rtInviteEvent^ e); + virtual int OnMessagingEvent(rtMessagingEvent^ e); + virtual int OnInfoEvent(rtInfoEvent^ e); + virtual int OnOptionsEvent(rtOptionsEvent^ e); + virtual int OnPublicationEvent(rtPublicationEvent^ e); + virtual int OnRegistrationEvent(rtRegistrationEvent^ e); + virtual int OnSubscriptionEvent(rtSubscriptionEvent^ e); + }; + + public ref class rtSipCallback sealed + { + internal: + rtSipCallback(rtISipCallback^ pI); + public: + virtual ~rtSipCallback(); + friend class SipCallbackProxy; + + internal: + const SipCallback* getWrappedCallback(); + + private: + rtISipCallback^ m_pI; + SipCallbackProxy* m_pCallback; + }; + } +} + + diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipEvent.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipEvent.h new file mode 100644 index 00000000..5777c7d1 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipEvent.h @@ -0,0 +1,244 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include "rt_Config.h" +#include "rt_Enums.h" + +struct tsip_event_s; + +class SipEvent; +class DialogEvent; +class StackEvent; +class InviteEvent; +class MessagingEvent; +class InfoEvent; +class OptionsEvent; +class PublicationEvent; +class RegistrationEvent; +class SubscriptionEvent; + + +#define rtISipEvent_Declare() \ + virtual short getCode(); \ + virtual Platform::String^ getPhrase(); \ + virtual rtISipSession^ getBaseSession(); \ + virtual rtSipMessage^ getSipMessage(); \ + +#define rtISipEvent_Implement(cls) \ +short cls##::getCode(){ \ + return m_pEvent->getCode(); \ +} \ +Platform::String^ cls##::getPhrase(){ \ + return rtString::toString(m_pEvent->getPhrase()); \ +} \ +rtISipSession^ cls##::getBaseSession(){ \ + return ref new rtSipSession(const_cast(m_pEvent->getStack()), const_cast(m_pEvent->getWrappedEvent()->ss)); \ +} \ +rtSipMessage^ cls##::getSipMessage(){ \ + return ref new rtSipMessage(const_cast(const_cast(m_pEvent->getSipMessage())->getWrappedSipMessage())); \ +} \ + + +namespace doubango_rt +{ + namespace BackEnd + { + interface class rtISipSession; + ref class rtSipMessage; + ref class rtInviteSession; + ref class rtMsrpSession; + ref class rtCallSession; + ref class rtMessagingSession; + ref class rtInfoSession; + ref class rtOptionsSession; + ref class rtPublicationSession; + ref class rtRegistrationSession; + ref class rtSubscriptionSession; + + + /* ======================== rtISipEvent ========================*/ + public interface class rtISipEvent + { + short getCode(); + Platform::String^ getPhrase(); + rtISipSession^ getBaseSession(); + rtSipMessage^ getSipMessage(); + }; + + + /* ======================== rtDialogEvent ========================*/ + public ref class rtDialogEvent sealed : rtISipEvent + { + internal: + rtDialogEvent(const struct tsip_event_s *e); + + public: + virtual ~rtDialogEvent(); + rtISipEvent_Declare(); + + private: + DialogEvent* m_pEvent; + }; + + /* ======================== rtStackEvent ========================*/ + public ref class rtStackEvent sealed : rtISipEvent + { + internal: + rtStackEvent(const struct tsip_event_s *e); + + public: + virtual ~rtStackEvent(); + rtISipEvent_Declare(); + + private: + StackEvent* m_pEvent; + }; + + + /* ======================== rtInviteEvent ========================*/ + public ref class rtInviteEvent sealed : rtISipEvent + { + internal: + rtInviteEvent(const struct tsip_event_s *e); + + public: + virtual ~rtInviteEvent(); + rtISipEvent_Declare(); + + rt_tsip_invite_event_type_t getType(); + rt_twrap_media_type_t getMediaType(); + rtInviteSession^ getSession(); + rtCallSession^ takeCallSessionOwnership(); + rtMsrpSession^ takeMsrpSessionOwnership(); + + private: + InviteEvent* m_pEvent; + }; + + /* ======================== rtMessagingEvent ========================*/ + public ref class rtMessagingEvent sealed : rtISipEvent + { + internal: + rtMessagingEvent(const struct tsip_event_s *e); + + public: + virtual ~rtMessagingEvent(); + rtISipEvent_Declare(); + + rt_tsip_message_event_type_t getType(); + rtMessagingSession^ getSession(); + rtMessagingSession^ takeSessionOwnership(); + + private: + MessagingEvent* m_pEvent; + }; + + + /* ======================== rtInfoEvent ========================*/ + public ref class rtInfoEvent sealed : rtISipEvent + { + internal: + rtInfoEvent(const struct tsip_event_s *e); + + public: + virtual ~rtInfoEvent(); + rtISipEvent_Declare(); + + rt_tsip_info_event_type_t getType(); + rtInfoSession^ getSession(); + rtInfoSession^ takeSessionOwnership(); + + private: + InfoEvent* m_pEvent; + }; + + + /* ======================== rtOptionsEvent ========================*/ + public ref class rtOptionsEvent sealed : rtISipEvent + { + internal: + rtOptionsEvent(const struct tsip_event_s *e); + + public: + virtual ~rtOptionsEvent(); + rtISipEvent_Declare(); + + rt_tsip_options_event_type_t getType(); + rtOptionsSession^ getSession(); + rtOptionsSession^ takeSessionOwnership(); + + private: + OptionsEvent* m_pEvent; + }; + + /* ======================== rtPublicationEvent ========================*/ + public ref class rtPublicationEvent sealed : rtISipEvent + { + internal: + rtPublicationEvent(const struct tsip_event_s *e); + + public: + virtual ~rtPublicationEvent(); + rtISipEvent_Declare(); + + rt_tsip_publish_event_type_t getType(); + rtPublicationSession^ getSession(); + rtPublicationSession^ takeSessionOwnership(); + + private: + PublicationEvent* m_pEvent; + }; + + /* ======================== rtRegistrationEvent ========================*/ + public ref class rtRegistrationEvent sealed : rtISipEvent + { + internal: + rtRegistrationEvent(const struct tsip_event_s *e); + + public: + virtual ~rtRegistrationEvent(); + rtISipEvent_Declare(); + + rt_tsip_register_event_type_t getType(); + rtRegistrationSession^ getSession(); + rtRegistrationSession^ takeSessionOwnership(); + + private: + RegistrationEvent* m_pEvent; + }; + + /* ======================== rtSubscriptionEvent ========================*/ + public ref class rtSubscriptionEvent sealed : rtISipEvent + { + internal: + rtSubscriptionEvent(const struct tsip_event_s *e); + + public: + virtual ~rtSubscriptionEvent(); + rtISipEvent_Declare(); + + rt_tsip_subscribe_event_type_t getType(); + rtSubscriptionSession^ getSession(); + rtSubscriptionSession^ takeSessionOwnership(); + + private: + SubscriptionEvent* m_pEvent; + }; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipMessage.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipMessage.h new file mode 100644 index 00000000..4eaadbdc --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipMessage.h @@ -0,0 +1,78 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include "rt_Enums.h" + +class SdpMessage; +class SipMessage; + +struct tsdp_message_s; +struct tsip_message_s; + +namespace doubango_rt +{ + namespace BackEnd + { + public ref class rtSdpMessage sealed + { + internal: + rtSdpMessage(); + rtSdpMessage(struct tsdp_message_s *message); + public: + virtual ~rtSdpMessage(); + + public: + Platform::String^ getSdpHeaderValue(Platform::String^ media, Platform::String^ name, unsigned index); + Platform::String^ getSdpHeaderValue(Platform::String^ media, Platform::String^ name); + Platform::String^ getSdpHeaderAValue(Platform::String^ media, Platform::String^ attributeName); + + private: + SdpMessage* m_pSdpMessage; + }; + + public ref class rtSipMessage sealed + { + internal: + rtSipMessage(); + rtSipMessage(struct tsip_message_s* message); + public: + virtual ~rtSipMessage(); + + public: + bool isResponse(); + rt_tsip_request_type_t getRequestType(); + short getResponseCode(); + Platform::String^ getResponsePhrase(); + Platform::String^ getSipHeaderValue(Platform::String^ name, unsigned index); + Platform::String^ getSipHeaderValue(Platform::String^ name); + Platform::String^ getSipHeaderParamValue(Platform::String^ name, Platform::String^ param, unsigned index); + Platform::String^ getSipHeaderParamValue(Platform::String^ name, Platform::String^ param); + unsigned getSipContentLength(); +#if COM_VISIBLE + Platform::String^ getSipContent(); +#else + unsigned getSipContent(Platform::IntPtr output, unsigned maxsize); +#endif + rtSdpMessage^ getSdpMessage(); + + private: + SipMessage* m_pSipMessage; + }; + } +} diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipSession.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipSession.h new file mode 100644 index 00000000..2882355f --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipSession.h @@ -0,0 +1,506 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include "rt_Config.h" +#include "rt_SipStack.h" +#include "rt_SipUri.h" +#include "rt_String.h" +#include "rt_ActionConfig.h" +#include "rt_MediaSessionMgr.h" + +#include "tinysip.h" + +class SipSession; +class InviteSession; +class CallSession; +class MsrpSession; +class MessagingSession; +class InfoSession; +class OptionsSession; +class PublicationSession; +class RegistrationSession; +class SubscriptionSession; +class SipStack; + +class T140CallbackData; +class T140Callback; + +// error C4585: 'doubango_rt::rtSipSession' : A WinRT 'public ref class' must either be sealed or derive from an existing unsealed class +#define rtISession_Declare() \ + virtual unsigned getId(); \ + virtual bool haveOwnership(); \ + virtual bool addHeader(Platform::String^ name, Platform::String^ value); \ + virtual bool removeHeader(Platform::String^ name); \ + [Windows::Foundation::Metadata::DefaultOverload] \ + virtual bool addCaps(Platform::String^ name, Platform::String^ value); \ + OVERRIDE_FUNC(virtual bool addCaps(Platform::String^ name);) \ + virtual bool removeCaps(Platform::String^ name); \ + virtual bool setExpires(unsigned expires); \ + OVERRIDE_FUNC(virtual bool setFromUri(Platform::String^ fromUriString);) \ + [Windows::Foundation::Metadata::DefaultOverload] \ + virtual bool setFromUri(rtSipUri^ fromUri); \ + OVERRIDE_FUNC(virtual bool setToUri(Platform::String^ toUriString);) \ + [Windows::Foundation::Metadata::DefaultOverload] \ + virtual bool setToUri(rtSipUri^ toUri); \ + virtual bool setSilentHangup(bool silent); \ + virtual bool addSigCompCompartment(Platform::String^ compId); \ + virtual bool removeSigCompCompartment(); \ + +#define rtISession_Implement(cls) \ + unsigned cls##::getId(){ \ + return m_pSipSession->getId(); \ +} \ + bool cls##::haveOwnership(){ \ + return m_pSipSession->haveOwnership(); \ +} \ + bool cls##::addHeader(Platform::String^ name, Platform::String^ value){ \ + return m_pSipSession->addHeader(rtString::toUtf8(name).data(), rtString::toUtf8(value).data()); \ +} \ + bool cls##::removeHeader(Platform::String^ name){ \ + return m_pSipSession->removeHeader(rtString::toUtf8(name).data()); \ +} \ + bool cls##::addCaps(Platform::String^ name, Platform::String^ value){ \ + return m_pSipSession->addCaps(rtString::toUtf8(name).data(), rtString::toUtf8(value).data()); \ +} \ +OVERRIDE_FUNC(bool cls##::addCaps(Platform::String^ name){ \ + return addCaps(name, nullptr); \ +}) \ + bool cls##::removeCaps(Platform::String^ name){ \ + return m_pSipSession->removeCaps(rtString::toUtf8(name).data()); \ +} \ + bool cls##::setExpires(unsigned expires){ \ + return m_pSipSession->setExpires(expires); \ +} \ +OVERRIDE_FUNC(bool cls##::setFromUri(Platform::String^ fromUriString){ \ + return m_pSipSession->setFromUri(rtString::toUtf8(fromUriString).data()); \ +}) \ + bool cls##::setFromUri(rtSipUri^ fromUri){ \ + return m_pSipSession->setFromUri(fromUri->getWrappedUri()); \ +} \ +OVERRIDE_FUNC(bool cls##::setToUri(Platform::String^ toUriString){ \ + return m_pSipSession->setToUri(rtString::toUtf8(toUriString).data()); \ +}) \ + bool cls##::setToUri(rtSipUri^ toUri){ \ + return m_pSipSession->setToUri(toUri->getWrappedUri()); \ +} \ + bool cls##::setSilentHangup(bool silent){ \ + return m_pSipSession->setSilentHangup(silent); \ +} \ + bool cls##::addSigCompCompartment(Platform::String^ compId){ \ + return m_pSipSession->addSigCompCompartment(rtString::toUtf8(compId).data()); \ +} \ + bool cls##::removeSigCompCompartment(){ \ + return m_pSipSession->removeSigCompCompartment(); \ +}\ + + +#define rtIInviteSession_Declare() \ + [Windows::Foundation::Metadata::DefaultOverload] \ + virtual bool accept(rtActionConfig^ config); \ + OVERRIDE_FUNC(virtual bool accept();) \ + [Windows::Foundation::Metadata::DefaultOverload] \ + virtual bool hangup(rtActionConfig^ config); \ + OVERRIDE_FUNC(virtual bool hangup();) \ + [Windows::Foundation::Metadata::DefaultOverload] \ + virtual bool reject(rtActionConfig^ config); \ + OVERRIDE_FUNC(virtual bool reject();) \ + [Windows::Foundation::Metadata::DefaultOverload] \ + virtual bool sendInfo(VISIBLE_VOID_PTR payload, unsigned len, rtActionConfig^ config); \ + OVERRIDE_FUNC(virtual bool sendInfo(VISIBLE_VOID_PTR payload, unsigned len);) \ + virtual rtMediaSessionMgr^ getMediaMgr(); \ + +#define rtIInviteSession_Implement(cls) \ +bool cls##::accept(rtActionConfig^ config){ \ + return m_pSipSession->accept(config ? config->getWrappedActionConfig() : tsk_null); \ +} \ +OVERRIDE_FUNC(bool cls##::accept(){ \ + return accept(nullptr); \ +}) \ +bool cls##::hangup(rtActionConfig^ config){ \ + return m_pSipSession->hangup(config ? config->getWrappedActionConfig() : tsk_null); \ +} \ +OVERRIDE_FUNC(bool cls##::hangup(){ \ + return hangup(nullptr); \ +}) \ +bool cls##::reject(rtActionConfig^ config){ \ + return m_pSipSession->reject(config ? config->getWrappedActionConfig() : tsk_null); \ +} \ +OVERRIDE_FUNC(bool cls##::reject(){ \ + return reject(nullptr); \ +}) \ +bool cls##::sendInfo(VISIBLE_VOID_PTR payload, unsigned len, rtActionConfig^ config){ \ + return m_pSipSession->sendInfo(VISIBLE_VOID_PTR_2_VOID_PTR(payload), len, config ? config->getWrappedActionConfig() : tsk_null); \ +} \ +OVERRIDE_FUNC(bool cls##::sendInfo(VISIBLE_VOID_PTR payload, unsigned len){ \ + return sendInfo(payload, len, nullptr); \ +}) \ +rtMediaSessionMgr^ cls##::getMediaMgr(){ \ + if(m_pSipSession->getMediaMgr()){ \ + return ref new rtMediaSessionMgr(const_cast(m_pSipSession->getMediaMgr()->getWrappedMgr())); \ + } \ + return nullptr; \ +} \ + +namespace doubango_rt +{ + namespace BackEnd + { + ref class rtMsrpCallback; + interface class rtIMsrpCallback; + + + /* ======================== rtT140CallbackData ========================*/ + public ref class rtT140CallbackData sealed + { + internal: + rtT140CallbackData(enum tmedia_t140_data_type_e data_type, const void* data_ptr, unsigned data_size); + public: + virtual ~rtT140CallbackData(); + + private: + T140CallbackData* m_pData; + }; + + /* ======================== rtT140Callback ========================*/ + public interface class rtIT140Callback + { + virtual int ondata(rtT140CallbackData^ pData); + }; + public ref class rtT140Callback sealed + { + internal: + rtT140Callback(); + const T140Callback* getWrappedCallback(){ return m_pCallback; } + + public: + rtT140Callback(rtIT140Callback^ pI) + { + m_pI = pI; + } + virtual ~rtT140Callback(); + + protected: + virtual int ondata(rtT140CallbackData^ pData){ + if(m_pI) + { + return m_pI->ondata(pData); + } + return 0; + } + + private: + T140Callback* m_pCallback; + rtIT140Callback^ m_pI; + }; + + + /* ======================== rtISipSession ========================*/ + public interface class rtISipSession + { + rtISession_Declare(); + }; + + + /* ======================== rtIInviteSession ========================*/ + public interface class rtIInviteSession : rtISipSession + { + rtIInviteSession_Declare(); + }; + + /* ======================== rtSipSession ========================*/ + public ref class rtSipSession sealed: rtISipSession + { + public: + rtSipSession(rtSipStack^ pStack); + virtual ~rtSipSession(); + internal: + rtSipSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + SipSession* getWrappedSession(){ return m_pSipSession; } + + public: + rtISession_Declare(); + + private: + SipSession* m_pSipSession; + }; + + /* ======================== rtInviteSession ========================*/ + public ref class rtInviteSession sealed: rtIInviteSession + { + public: + rtInviteSession(rtSipStack^ pStack); + virtual ~rtInviteSession(); + internal: + rtInviteSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + InviteSession* getWrappedSession(){ return m_pSipSession; } + + public: + rtISession_Declare(); + rtIInviteSession_Declare(); + + private: + InviteSession* m_pSipSession; + }; + + /* ======================== CallSession ========================*/ + public ref class rtCallSession sealed : rtIInviteSession + { + public: + rtCallSession(rtSipStack^ pStack); + virtual ~rtCallSession(); + internal: + rtCallSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + CallSession* getWrappedSession(){ return m_pSipSession; } + + public: + rtISession_Declare(); + rtIInviteSession_Declare(); + + [Windows::Foundation::Metadata::DefaultOverload] + bool call(Platform::String^ remoteUriString, rt_twrap_media_type_t media, rtActionConfig^ config); + [Windows::Foundation::Metadata::DefaultOverload] + bool call(Platform::String^ remoteUriString, rt_twrap_media_type_t media); + bool call(rtSipUri^ remoteUri, rt_twrap_media_type_t media, rtActionConfig^ config); + bool call(rtSipUri^ remoteUri, rt_twrap_media_type_t media); + + bool setSessionTimer(unsigned timeout, Platform::String^ refresher); + bool set100rel(bool enabled); + bool setRtcp(bool enabled); + bool setRtcpMux(bool enabled); + bool setICE(bool enabled); + bool setQoS(rt_tmedia_qos_stype_t type, rt_tmedia_qos_strength_t strength); + bool hold(rtActionConfig^ config); + bool hold(); + bool resume(rtActionConfig^ config); + bool resume(); + bool transfer(Platform::String^ referToUriString, rtActionConfig^ config); + bool transfer(Platform::String^ referToUriString); + bool acceptTransfer(rtActionConfig^ config); + bool acceptTransfer(); + bool rejectTransfer(rtActionConfig^ config); + bool rejectTransfer(); + bool sendDTMF(int number); + unsigned getSessionTransferId(); +#if COM_VISIBLE + bool sendT140Data(rt_tmedia_t140_data_type_t data_type, Platform::String^ data); +#else + bool sendT140Data(rt_tmedia_t140_data_type_t data_type, Platform::IntPtr data_ptr, unsigned data_size); +#endif + bool sendT140Data(rt_tmedia_t140_data_type_t data_type); + bool setT140Callback(rtT140Callback^ pT140Callback); + + private: + CallSession* m_pSipSession; + }; + + + /* ======================== rtMsrpSession ========================*/ + public ref class rtMsrpSession sealed : rtIInviteSession + { + public: + rtMsrpSession(rtSipStack^ pStack, rtIMsrpCallback^ pCallback); + virtual ~rtMsrpSession(); + + internal: + rtMsrpSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + MsrpSession* getWrappedSession(){ return m_pSipSession; } + + public: + rtISession_Declare(); + rtIInviteSession_Declare(); + + bool setCallback(rtIMsrpCallback^ pCallback); + [Windows::Foundation::Metadata::DefaultOverload] + bool callMsrp(Platform::String^ remoteUriString, rtActionConfig^ config); + [Windows::Foundation::Metadata::DefaultOverload] + bool callMsrp(Platform::String^ remoteUriString); + bool callMsrp(rtSipUri^ remoteUri, rtActionConfig^ config); + bool callMsrp(rtSipUri^ remoteUri); +#if COM_VISIBLE + bool sendMessage(Platform::String^ payload, rtActionConfig^ config); + bool sendMessage(Platform::String^ payload); +#else + bool sendMessage(Platform::IntPtr payload, unsigned len, rtActionConfig^ config); + bool sendMessage(Platform::IntPtr payload, unsigned len); +#endif + + private: + MsrpSession* m_pSipSession; + rtMsrpCallback^ m_pCallback; + }; + + /* ======================== rtMessagingSession ========================*/ + public ref class rtMessagingSession sealed : rtISipSession + { + internal: + rtMessagingSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + public: + rtMessagingSession(rtSipStack^ pStack); + virtual ~rtMessagingSession(); + + rtISession_Declare(); + +#if COM_VISIBLE + bool send(Platform::String^ payload, rtActionConfig^ config); + bool send(Platform::String^ payload); +#else + [Windows::Foundation::Metadata::DefaultOverload] + bool send(Platform::IntPtr payload, unsigned len, rtActionConfig^ config); + bool send(Platform::IntPtr payload, unsigned len); +#endif + [Windows::Foundation::Metadata::DefaultOverload] + bool accept(rtActionConfig^ config); + bool accept(); + [Windows::Foundation::Metadata::DefaultOverload] + bool reject(rtActionConfig^ config); + bool reject(); + + private: + MessagingSession* m_pSipSession; + }; + + + /* ======================== rtInfoSession ========================*/ + public ref class rtInfoSession sealed : rtISipSession + { + internal: + rtInfoSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + public: + rtInfoSession(rtSipStack^ pStack); + virtual ~rtInfoSession(); + + rtISession_Declare(); + +#if COM_VISIBLE + bool send(Platform::String^ payload, rtActionConfig^ config); + bool send(Platform::String^ payload); +#else + [Windows::Foundation::Metadata::DefaultOverload] + bool send(Platform::IntPtr payload, unsigned len, rtActionConfig^ config); + bool send(Platform::IntPtr payload, unsigned len); +#endif + [Windows::Foundation::Metadata::DefaultOverload] + bool accept(rtActionConfig^ config); + bool accept(); + [Windows::Foundation::Metadata::DefaultOverload] + bool reject(rtActionConfig^ config); + bool reject(); + + private: + InfoSession* m_pSipSession; + }; + + + /* ======================== rtOptionsSession ========================*/ + public ref class rtOptionsSession sealed : rtISipSession + { + internal: + rtOptionsSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + public: + rtOptionsSession(rtSipStack^ pStack); + virtual ~rtOptionsSession(); + + rtISession_Declare(); + + [Windows::Foundation::Metadata::DefaultOverload] + bool send(rtActionConfig^ config); + bool send(); + [Windows::Foundation::Metadata::DefaultOverload] + bool accept(rtActionConfig^ config); + bool accept(); + [Windows::Foundation::Metadata::DefaultOverload] + bool reject(rtActionConfig^ config); + bool reject(); + + private: + OptionsSession* m_pSipSession; + }; + + + /* ======================== rtPublicationSession ========================*/ + public ref class rtPublicationSession sealed : rtISipSession + { + internal: + rtPublicationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + public: + rtPublicationSession(rtSipStack^ pStack); + virtual ~rtPublicationSession(); + + rtISession_Declare(); + +#if COM_VISIBLE + bool publish(Platform::String^ payload, rtActionConfig^ config); + bool publish(Platform::String^ payload); +#else + [Windows::Foundation::Metadata::DefaultOverload] + bool publish(Platform::IntPtr payload, unsigned len, rtActionConfig^ config); + bool publish(Platform::IntPtr payload, unsigned len); +#endif + [Windows::Foundation::Metadata::DefaultOverload] + bool unPublish(rtActionConfig^ config); + bool unPublish(); + + private: + PublicationSession* m_pSipSession; + }; + + + /* ======================== rtRegistrationSession ========================*/ + public ref class rtRegistrationSession sealed : rtISipSession + { + internal: + rtRegistrationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + public: + rtRegistrationSession(rtSipStack^ pStack); + virtual ~rtRegistrationSession(); + + rtISession_Declare(); + + bool register_(rtActionConfig^ config); + bool register_(); + bool unRegister(rtActionConfig^ config); + bool unRegister(); + bool accept(rtActionConfig^ config); + bool accept(); + bool reject(rtActionConfig^ config); + bool reject(); + + private: + RegistrationSession* m_pSipSession; + }; + + /* ======================== rtSubscriptionSession ========================*/ + public ref class rtSubscriptionSession sealed : rtISipSession + { + internal: + rtSubscriptionSession(SipStack* pStack, tsip_ssession_handle_t* pHandle); + public: + rtSubscriptionSession(rtSipStack^ pStack); + virtual ~rtSubscriptionSession(); + + rtISession_Declare(); + + bool subscribe(); + bool unSubscribe(); + + private: + SubscriptionSession* m_pSipSession; + }; + } +} diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipStack.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipStack.h new file mode 100644 index 00000000..43a9e0af --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipStack.h @@ -0,0 +1,120 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include + +class SipStack; + +namespace doubango_rt +{ + namespace BackEnd + { + ref class rtSipCallback; + interface class rtISipCallback; + ref class rtDDebugCallback; + interface class rtIDDebugCallback; + + enum class rt_tdav_codec_id_t; + + public ref class rtDnsResult sealed + { + internal: + rtDnsResult(uint16 port, Platform::String^ address):_port(port), _address(address){} + public: + property uint16 Port{ uint16 get() { return _port; }; } + property Platform::String^ Address{ Platform::String^ get() { return _address; }; } + private: + uint16 _port; + Platform::String^ _address; + }; + + public ref class rtSipStack sealed + { + public: + virtual ~rtSipStack(); + + internal: + rtSipStack(rtISipCallback^ callback, Platform::String^ realmUri, Platform::String^ impiString, Platform::String^ impuUri); + const SipStack* getWrappedStack() { return m_pSipStack; } + + public: + bool start(); + bool setDebugCallback(rtIDDebugCallback^ pCallback); + bool setDisplayName(Platform::String^ display_name); + bool setRealm(Platform::String^ realm_uri); + bool setIMPI(Platform::String^ impi); + bool setIMPU(Platform::String^ impu_uri); + bool setPassword(Platform::String^ password); + bool setAMF(Platform::String^ amf); + bool setOperatorId(Platform::String^ opid); + bool setProxyCSCF(Platform::String^ fqdn, unsigned short port, Platform::String^ transport, Platform::String^ ipversion); + bool setLocalIP(Platform::String^ ip, Platform::String^ transport); + bool setLocalIP(Platform::String^ ip); + bool setLocalPort(unsigned short port, Platform::String^ transport); + bool setLocalPort(unsigned short port); + bool setEarlyIMS(bool enabled); + bool addHeader(Platform::String^ name, Platform::String^ value); + bool removeHeader(Platform::String^ name); + bool addDnsServer(Platform::String^ ip); + bool setDnsDiscovery(bool enabled); + bool setAoR(Platform::String^ ip, int port); + bool setSigCompParams(unsigned dms, unsigned sms, unsigned cpb, bool enablePresDict); + bool addSigCompCompartment(Platform::String^ compId); + bool removeSigCompCompartment(Platform::String^ compId); + + bool setSTUNServer(Platform::String^ ip, unsigned short port); + bool setSTUNCred(Platform::String^ login, Platform::String^ password); + + bool setTLSSecAgree(bool enabled); + bool setSSLCertificates(Platform::String^ privKey, Platform::String^ pubKey, Platform::String^ caKey, bool verify); + bool setSSLCertificates(Platform::String^ privKey, Platform::String^ pubKey, Platform::String^ caKey); + bool setIPSecSecAgree(bool enabled); + bool setIPSecParameters(Platform::String^ algo, Platform::String^ ealgo, Platform::String^ mode, Platform::String^ proto); + + Platform::String^ dnsENUM(Platform::String^ service, Platform::String^ e164num, Platform::String^ domain); +#if COM_VISIBLE + rtDnsResult^ dnsNaptrSrv(Platform::String^ domain, Platform::String^ service); + rtDnsResult^ dnsSrv(Platform::String^ service); + Platform::String^ getLocalIP(Platform::String^ protocol); + uint16 getLocalPort(Platform::String^ protocol); +#else + Platform::String^ dnsNaptrSrv(Platform::String^ domain, Platform::String^ service, Platform::IntPtr port); + Platform::String^ dnsSrv(Platform::String^ service, Platform::IntPtr port); + Platform::String^ getLocalIPnPort(Platform::String^ protocol, Platform::IntPtr port); +#endif + + Platform::String^ getPreferredIdentity(); + + bool isValid(); + bool stop(); + + static bool initialize(); + static bool deInitialize(); + static void setCodecs(enum class rt_tdav_codec_id_t codecs); + static bool setCodecPriority(enum class rt_tdav_codec_id_t codec_id, int priority); + static bool isCodecSupported(enum class rt_tdav_codec_id_t codec_id); + + private: + SipStack* m_pSipStack; + rtSipCallback^ m_pSipCallback; + rtDDebugCallback^ m_pDebugCallback; + std::recursive_mutex mLock; + }; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipUri.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipUri.h new file mode 100644 index 00000000..ac0e5151 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_SipUri.h @@ -0,0 +1,60 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include "rt_Config.h" + +class SipUri; + +namespace doubango_rt +{ + namespace BackEnd + { + public ref class rtSipUri sealed + { + public: + virtual ~rtSipUri(); + rtSipUri(Platform::String^ uriString, Platform::String^ displayName); + rtSipUri(Platform::String^ uriString); + + + public: + static bool isValid(Platform::String^ uri); + +#if COM_VISIBLE + bool isValid_(); +#else + bool isValid(); +#endif + Platform::String^ getScheme(); + Platform::String^ getHost(); + unsigned short getPort(); + Platform::String^ getUserName(); + Platform::String^ getPassword(); + Platform::String^ getDisplayName(); + Platform::String^ getParamValue(Platform::String^ name); + void setDisplayName(Platform::String^ displayName); + + internal: + const SipUri* getWrappedUri(){ return m_pSipUri; } + + private: + SipUri* m_pSipUri; + }; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_String.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_String.h new file mode 100644 index 00000000..2ffeacb7 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_String.h @@ -0,0 +1,33 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once + +#include + +namespace doubango_rt +{ + namespace BackEnd + { + ref class rtString sealed + { + internal: + static std::vector toUtf8(Platform::String^ str); + static Platform::String^ toString(char const* str); + }; + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Xcap.h b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Xcap.h new file mode 100644 index 00000000..dc403219 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/include/rt_Xcap.h @@ -0,0 +1,18 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#pragma once \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_ActionConfig.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_ActionConfig.cxx new file mode 100644 index 00000000..58bc4e42 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_ActionConfig.cxx @@ -0,0 +1,76 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_ActionConfig.h" +#include "rt_String.h" + +#include "ActionConfig.h" + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + +rtActionConfig::rtActionConfig() +{ + m_pActionConfig = new ActionConfig(); +} + +rtActionConfig::~rtActionConfig() +{ + rtSafeDelete(m_pActionConfig); +} + +bool rtActionConfig::addHeader(String^ name, String^ value) +{ + return m_pActionConfig->addHeader(rtString::toUtf8(name).data(), rtString::toUtf8(value).data()); +} + +bool rtActionConfig::setActiveMedia(rt_twrap_media_type_t type) +{ + return m_pActionConfig->setActiveMedia((twrap_media_type_t)type); +} + +#if COM_VISIBLE +bool rtActionConfig::addPayload(Platform::String^ payload) +{ + static std::vector _payload = rtString::toUtf8(payload); + return m_pActionConfig->addPayload(_payload.data(), _payload.size()); +} +#else +bool rtActionConfig::addPayload(IntPtr payload, unsigned len) +{ + return m_pActionConfig->addPayload((const void*)payload, len); +} +#endif /* COM_VISIBLE */ + +rtActionConfig^ rtActionConfig::setResponseLine(short code, String^ phrase) +{ + m_pActionConfig->setResponseLine(code, rtString::toUtf8(phrase).data()); + return this; +} + +rtActionConfig^ rtActionConfig::setMediaString(rt_twrap_media_type_t type, String^ key, String^ value) +{ + m_pActionConfig->setMediaString((twrap_media_type_t)type, rtString::toUtf8(key).data(), rtString::toUtf8(value).data()); + return this; +} + +rtActionConfig^ rtActionConfig::setMediaInt(rt_twrap_media_type_t type, String^ key, int value) +{ + m_pActionConfig->setMediaInt((twrap_media_type_t)type, rtString::toUtf8(key).data(), value); + return this; +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_DDebug.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_DDebug.cxx new file mode 100644 index 00000000..0d8eca0b --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_DDebug.cxx @@ -0,0 +1,78 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_DDebug.h" +#include "rt_String.h" + +#include "DDebug.h" + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + +class DDebugCallbackProxy : public DDebugCallback +{ +public: + DDebugCallbackProxy(rtDDebugCallback^ pCallback) + { + m_pCallback = pCallback; + } + + ~DDebugCallbackProxy() + { + + } + + virtual int OnDebugInfo(const char* message) + { + return m_pCallback->m_pI->OnDebugInfo(rtString::toString(message)); + } + + virtual int OnDebugWarn(const char* message) + { + return m_pCallback->m_pI->OnDebugWarn(rtString::toString(message)); + } + + virtual int OnDebugError(const char* message) + { + return m_pCallback->m_pI->OnDebugError(rtString::toString(message)); + } + + virtual int OnDebugFatal(const char* message) + { + return m_pCallback->m_pI->OnDebugFatal(rtString::toString(message)); + } + +private: + rtDDebugCallback^ m_pCallback; +}; + +rtDDebugCallback::rtDDebugCallback(rtIDDebugCallback^ pI) +{ + m_pI = pI; + m_pCallback = new DDebugCallbackProxy(this); +} + +rtDDebugCallback::~rtDDebugCallback() +{ + rtSafeDelete(m_pCallback); +} + +const DDebugCallback* rtDDebugCallback::getWrappedCallback() +{ + return dynamic_cast(m_pCallback); +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Enums.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Enums.cxx new file mode 100644 index 00000000..f6dfd615 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Enums.cxx @@ -0,0 +1,17 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/#include "rt_enums.h" \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_MediaContent.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_MediaContent.cxx new file mode 100644 index 00000000..5e285713 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_MediaContent.cxx @@ -0,0 +1,17 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_MediaSessionMgr.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_MediaSessionMgr.cxx new file mode 100644 index 00000000..902ebc78 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_MediaSessionMgr.cxx @@ -0,0 +1,374 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_MediaSessionMgr.h" +#include "rt_Enums.h" +#include "rt_String.h" + +#include "MediaSessionMgr.h" + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + +rtCodec::rtCodec(struct tmedia_codec_s* pCodec) +{ + m_pCodec = new Codec(pCodec); +} + +rtCodec::~rtCodec() +{ + rtSafeDelete(m_pCodec); +} + +enum class rt_twrap_media_type_t rtCodec::getMediaType() +{ + return (rt_twrap_media_type_t)m_pCodec->getMediaType(); +} + +Platform::String^ rtCodec::getName() +{ + return rtString::toString(m_pCodec->getName()); +} + +Platform::String^ rtCodec::getDescription() +{ + return rtString::toString(m_pCodec->getDescription()); +} + +Platform::String^ rtCodec::getNegFormat() +{ + return rtString::toString(m_pCodec->getNegFormat()); +} + +int rtCodec::getAudioSamplingRate() +{ + return m_pCodec->getAudioSamplingRate(); +} + +int rtCodec::getAudioChannels() +{ + return m_pCodec->getAudioChannels(); +} + +int rtCodec::getAudioPTime() +{ + return m_pCodec->getAudioPTime(); +} + + +rtMediaSessionMgr::rtMediaSessionMgr(struct tmedia_session_mgr_s* pWrappedMgr) +{ + m_pMediaSessionMgr = new MediaSessionMgr(pWrappedMgr); +} + +rtMediaSessionMgr::~rtMediaSessionMgr() +{ + rtSafeDelete(m_pMediaSessionMgr); +} + +bool rtMediaSessionMgr::sessionSetInt32(rt_twrap_media_type_t media, Platform::String^ key, int32 value) +{ + return m_pMediaSessionMgr->sessionSetInt32((twrap_media_type_t)media, rtString::toUtf8(key).data(), value); +} + +int32 rtMediaSessionMgr::sessionGetInt32(rt_twrap_media_type_t media, Platform::String^ key) +{ + return m_pMediaSessionMgr->sessionGetInt32((twrap_media_type_t)media, rtString::toUtf8(key).data()); +} + +bool rtMediaSessionMgr::consumerSetInt32(rt_twrap_media_type_t media, Platform::String^ key, int32 value) +{ + return m_pMediaSessionMgr->consumerSetInt32((twrap_media_type_t)media, rtString::toUtf8(key).data(), value); +} + +bool rtMediaSessionMgr::consumerSetInt64(rt_twrap_media_type_t media, Platform::String^ key, int64 value) +{ + return m_pMediaSessionMgr->consumerSetInt64((twrap_media_type_t)media, rtString::toUtf8(key).data(), value); +} + +bool rtMediaSessionMgr::producerSetInt32(rt_twrap_media_type_t media, Platform::String^ key, int32 value) +{ + return m_pMediaSessionMgr->producerSetInt32((twrap_media_type_t)media, rtString::toUtf8(key).data(), value); +} + +bool rtMediaSessionMgr::producerSetInt64(rt_twrap_media_type_t media, Platform::String^ key, int64 value) +{ + return m_pMediaSessionMgr->producerSetInt64((twrap_media_type_t)media, rtString::toUtf8(key).data(), value); +} + +rtCodec^ rtMediaSessionMgr::producerGetCodec(rt_twrap_media_type_t media) +{ + Codec* c = m_pMediaSessionMgr->producerGetCodec((twrap_media_type_t)media); + if(c) + { + rtCodec^ codec = ref new rtCodec(const_cast(c->getWrappedCodec())); + rtSafeDelete(c); + return codec; + } + return nullptr; +} + +unsigned int rtMediaSessionMgr::registerAudioPluginFromFile(Platform::String^ path) +{ + return MediaSessionMgr::registerAudioPluginFromFile(rtString::toUtf8(path).data()); +} + +uint64 rtMediaSessionMgr::getSessionId(rt_twrap_media_type_t media) +{ + return m_pMediaSessionMgr->getSessionId((twrap_media_type_t)media); +} + +bool rtMediaSessionMgr::defaultsSetProfile(rt_tmedia_profile_t profile) +{ + return MediaSessionMgr::defaultsSetProfile((tmedia_profile_t) profile); +} + +rt_tmedia_profile_t rtMediaSessionMgr::defaultsGetProfile() +{ + return (rt_tmedia_profile_t)MediaSessionMgr::defaultsGetProfile(); +} + +bool rtMediaSessionMgr::defaultsSetPrefVideoSize(enum class rt_tmedia_pref_video_size_t pref_video_size) +{ + return MediaSessionMgr::defaultsSetPrefVideoSize((tmedia_pref_video_size_t) pref_video_size); +} + +bool rtMediaSessionMgr::defaultsSetJbMargin(uint32 jb_margin_ms) +{ + return MediaSessionMgr::defaultsSetJbMargin(jb_margin_ms); +} + +bool rtMediaSessionMgr::defaultsSetJbMaxLateRate(uint32 jb_late_rate_percent) +{ + return MediaSessionMgr::defaultsSetJbMaxLateRate(jb_late_rate_percent); +} + +bool rtMediaSessionMgr::defaultsSetEchoTail(uint32 echo_tail) +{ + return MediaSessionMgr::defaultsSetEchoTail(echo_tail); +} + +uint32 rtMediaSessionMgr::defaultsGetEchoTail() +{ + return MediaSessionMgr::defaultsGetEchoTail(); +} + +bool rtMediaSessionMgr::defaultsSetEchoSkew(uint32 echo_skew) +{ + return MediaSessionMgr::defaultsSetEchoSkew(echo_skew); +} + +bool rtMediaSessionMgr::defaultsSetEchoSuppEnabled(bool echo_supp_enabled) +{ + return MediaSessionMgr::defaultsSetEchoSuppEnabled(echo_supp_enabled); +} + +bool rtMediaSessionMgr::defaultsGetEchoSuppEnabled() +{ + return MediaSessionMgr::defaultsGetEchoSuppEnabled(); +} + +bool rtMediaSessionMgr::defaultsSetAgcEnabled(bool agc_enabled) +{ + return MediaSessionMgr::defaultsSetAgcEnabled(agc_enabled); +} + +bool rtMediaSessionMgr::defaultsGetAgcEnabled() +{ + return MediaSessionMgr::defaultsGetAgcEnabled(); +} + +bool rtMediaSessionMgr::defaultsSetAgcLevel(float agc_level) +{ + return MediaSessionMgr::defaultsSetAgcLevel(agc_level); +} + +float rtMediaSessionMgr::defaultsGetAgcLevel() +{ + return MediaSessionMgr::defaultsGetAgcLevel(); +} + +bool rtMediaSessionMgr::defaultsSetVadEnabled(bool vad_enabled) +{ + return MediaSessionMgr::defaultsSetVadEnabled(vad_enabled); +} + +bool rtMediaSessionMgr::defaultsGetGetVadEnabled() +{ + return MediaSessionMgr::defaultsGetGetVadEnabled(); +} + +bool rtMediaSessionMgr::defaultsSetNoiseSuppEnabled(bool noise_supp_enabled) +{ + return MediaSessionMgr::defaultsSetNoiseSuppEnabled(noise_supp_enabled); +} + +bool rtMediaSessionMgr::defaultsGetNoiseSuppEnabled() +{ + return MediaSessionMgr::defaultsGetNoiseSuppEnabled(); +} + +bool rtMediaSessionMgr::defaultsSetNoiseSuppLevel(int32 noise_supp_level) +{ + return MediaSessionMgr::defaultsSetNoiseSuppLevel(noise_supp_level); +} + +int32 rtMediaSessionMgr::defaultsGetNoiseSuppLevel() +{ + return MediaSessionMgr::defaultsGetNoiseSuppLevel(); +} + +bool rtMediaSessionMgr::defaultsSet100relEnabled(bool _100rel_enabled) +{ + return MediaSessionMgr::defaultsSet100relEnabled(_100rel_enabled); +} + +bool rtMediaSessionMgr::defaultsGet100relEnabled() +{ + return MediaSessionMgr::defaultsGet100relEnabled(); +} + +bool rtMediaSessionMgr::defaultsSetScreenSize(int32 sx, int32 sy) +{ + return MediaSessionMgr::defaultsSetScreenSize(sx, sy); +} + +bool rtMediaSessionMgr::defaultsSetAudioGain(int32 producer_gain, int32 consumer_gain) +{ + return MediaSessionMgr::defaultsSetAudioGain(producer_gain, consumer_gain); +} + +bool rtMediaSessionMgr::defaultsSetRtpPortRange(uint16 range_start, uint16 range_stop) +{ + return MediaSessionMgr::defaultsSetRtpPortRange(range_start, range_stop); +} + +bool rtMediaSessionMgr::defaultsSetRtpSymetricEnabled(bool enabled) +{ + return MediaSessionMgr::defaultsSetRtpSymetricEnabled(enabled); +} + +bool rtMediaSessionMgr::defaultsSetMediaType(enum class rt_twrap_media_type_t media_type) +{ + return MediaSessionMgr::defaultsSetMediaType((twrap_media_type_t) media_type); +} + +bool rtMediaSessionMgr::defaultsSetVolume(int32 volume) +{ + return MediaSessionMgr::defaultsSetVolume(volume); +} + +int32 rtMediaSessionMgr::defaultsGetVolume() +{ + return MediaSessionMgr::defaultsGetVolume(); +} + +bool rtMediaSessionMgr::defaultsSetInviteSessionTimers(int32 timeout, Platform::String^ refresher) +{ + return MediaSessionMgr::defaultsSetInviteSessionTimers(timeout, rtString::toUtf8(refresher).data()); +} + +bool rtMediaSessionMgr::defaultsSetSRtpMode(enum class rt_tmedia_srtp_mode_t mode) +{ + return MediaSessionMgr::defaultsSetSRtpMode((tmedia_srtp_mode_t) mode); +} + +enum class rt_tmedia_srtp_mode_t rtMediaSessionMgr::defaultsGetSRtpMode() +{ + return (rt_tmedia_srtp_mode_t)MediaSessionMgr::defaultsGetSRtpMode(); +} + +bool rtMediaSessionMgr::defaultsSetSRtpType(enum class rt_tmedia_srtp_type_t srtp_type) +{ + return MediaSessionMgr::defaultsSetSRtpType((tmedia_srtp_type_t) srtp_type); +} + +enum class rt_tmedia_srtp_type_t rtMediaSessionMgr::defaultsGetSRtpType() +{ + return (rt_tmedia_srtp_type_t)MediaSessionMgr::defaultsGetSRtpType(); +} + +bool rtMediaSessionMgr::defaultsSetRtcpEnabled(bool enabled) +{ + return MediaSessionMgr::defaultsSetRtcpEnabled(enabled); +} + +bool rtMediaSessionMgr::defaultsGetRtcpEnabled() +{ + return MediaSessionMgr::defaultsGetRtcpEnabled(); +} + +bool rtMediaSessionMgr::defaultsSetRtcpMuxEnabled(bool enabled) +{ + return MediaSessionMgr::defaultsSetRtcpMuxEnabled(enabled); +} + +bool rtMediaSessionMgr::defaultsGetRtcpMuxEnabled() +{ + return MediaSessionMgr::defaultsGetRtcpMuxEnabled(); +} + +bool rtMediaSessionMgr::defaultsSetIceEnabled(bool ice_enabled) +{ + return MediaSessionMgr::defaultsSetIceEnabled(ice_enabled); +} + +bool rtMediaSessionMgr::defaultsSetByPassEncoding(bool enabled) +{ + return MediaSessionMgr::defaultsSetByPassEncoding(enabled); +} + +bool rtMediaSessionMgr::defaultsGetByPassEncoding() +{ + return MediaSessionMgr::defaultsGetByPassEncoding(); +} + +bool rtMediaSessionMgr::defaultsSetByPassDecoding(bool enabled) +{ + return MediaSessionMgr::defaultsSetByPassDecoding(enabled); +} + +bool rtMediaSessionMgr::defaultsGetByPassDecoding() +{ + return MediaSessionMgr::defaultsGetByPassDecoding(); +} + +bool rtMediaSessionMgr::defaultsSetVideoJbEnabled(bool enabled) +{ + return MediaSessionMgr::defaultsSetVideoJbEnabled(enabled); +} + +bool rtMediaSessionMgr::defaultsGetVideoJbEnabled(bool enabled) +{ + return MediaSessionMgr::defaultsGetVideoJbEnabled(enabled); +} + +bool rtMediaSessionMgr::defaultsSetRtpBuffSize(unsigned buffSize) +{ + return MediaSessionMgr::defaultsSetRtpBuffSize(buffSize); +} + +unsigned rtMediaSessionMgr::defaultsGetRtpBuffSize() +{ + return MediaSessionMgr::defaultsGetRtpBuffSize(); +} + +bool rtMediaSessionMgr::defaultsSetAvpfTail(unsigned tail_min, unsigned tail_max) +{ + return MediaSessionMgr::defaultsSetAvpfTail(tail_min, tail_max); +} diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Msrp.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Msrp.cxx new file mode 100644 index 00000000..42652f5e --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Msrp.cxx @@ -0,0 +1,194 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_Msrp.h" +#include "rt_String.h" +#include "rt_SipSession.h" + +#include "SipSession.h" +#include "Msrp.h" + +#include + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + + +// +// rtMsrpMessage +// + +rtMsrpMessage::rtMsrpMessage(struct tmsrp_message_s *message) +{ + m_pMsrpMessage= new MsrpMessage(message); +} + +rtMsrpMessage::~rtMsrpMessage() +{ + rtSafeDelete(m_pMsrpMessage); +} + +bool rtMsrpMessage::isRequest() +{ + return m_pMsrpMessage->isRequest(); +} + +short rtMsrpMessage::getCode() +{ + return m_pMsrpMessage->getCode(); +} + +String^ rtMsrpMessage::getPhrase() +{ + return rtString::toString(m_pMsrpMessage->getPhrase()); +} + +rt_tmsrp_request_type_t rtMsrpMessage::getRequestType() +{ + return (rt_tmsrp_request_type_t)m_pMsrpMessage->getRequestType(); +} + +#if COM_VISIBLE +rtMsrpByteRange^ rtMsrpMessage::getByteRange() +{ + int64_t _start = -1, _end = -1, _total = -1; + m_pMsrpMessage->getByteRange(&_start, &_end, &_total); + return ref new rtMsrpByteRange(_start, _end, _total); +} +#else +void rtMsrpMessage::getByteRange(IntPtr start, IntPtr end, IntPtr total) +{ + int64_t _start = -1, _end = -1, _total = -1; + m_pMsrpMessage->getByteRange(&_start, &_end, &_total); + // IntPtr is 32bit or 64bit -> 32 to be sure not memory errors will raise + *((int32_t*)(void*)start) = (int32_t)_start; + *((int32_t*)(void*)end) = (int32_t)_end; + *((int32_t*)(void*)total) = (int32_t)_total; +} +#endif /* COM_VISIBLE */ + +bool rtMsrpMessage::isLastChunck() +{ + return m_pMsrpMessage->isLastChunck(); +} + +bool rtMsrpMessage::isFirstChunck() +{ + return m_pMsrpMessage->isFirstChunck(); +} + +bool rtMsrpMessage::isSuccessReport() +{ + return m_pMsrpMessage->isSuccessReport(); +} + +String^ rtMsrpMessage::getMsrpHeaderValue(String^ name) +{ + return rtString::toString(m_pMsrpMessage->getMsrpHeaderValue(rtString::toUtf8(name).data())); +} + +String^ rtMsrpMessage::getMsrpHeaderParamValue(String^ name, String^ param) +{ + return rtString::toString(m_pMsrpMessage->getMsrpHeaderParamValue(rtString::toUtf8(name).data(), rtString::toUtf8(param).data())); +} + +unsigned rtMsrpMessage::getMsrpContentLength() +{ + return m_pMsrpMessage->getMsrpContentLength(); +} + +#if COM_VISIBLE +String^ rtMsrpMessage::getMsrpContent(unsigned maxsize) +{ + if(maxsize) + { + void* _s = calloc(maxsize + 1, 1); + if(_s) + { + unsigned len = m_pMsrpMessage->getMsrpContent(_s, maxsize); + String^ s = rtString::toString((const char*)_s); + free(_s); + return s; + } + } + return nullptr; +} +#else +unsigned rtMsrpMessage::getMsrpContent(IntPtr output, unsigned maxsize) +{ + return m_pMsrpMessage->getMsrpContent((void*)output, maxsize); +} +#endif /* COM_VISIBLE */ + + +// +// rtMsrpEvent +// + +rtMsrpEvent::rtMsrpEvent(const struct tmsrp_event_s *event) +{ + m_pMsrpEvent = new MsrpEvent(event); +} + +rtMsrpEvent::~rtMsrpEvent() +{ + rtSafeDelete(m_pMsrpEvent); +} + +rt_tmsrp_event_type_t rtMsrpEvent::getType() +{ + return (rt_tmsrp_event_type_t)m_pMsrpEvent->getType(); +} + +rtMsrpSession^ rtMsrpEvent::getSipSession() +{ + if(m_pMsrpEvent->getSipSession()) + { + assert(0); // FIXME: Not implemented + return nullptr; + // return ref new rtMsrpSession(m_pMsrpEvent->getSipSession()->getWrappedSession()); + } + return nullptr; +} + +rtMsrpMessage^ rtMsrpEvent::getMessage() +{ + if(m_pMsrpEvent->getMessage()) + { + return ref new rtMsrpMessage(const_cast(const_cast(m_pMsrpEvent->getMessage())->getWrappedMsrpMessage())); + } + return nullptr; +} + +// +// rtMsrpCallback +// + +rtMsrpCallback::rtMsrpCallback(rtIMsrpCallback^ pI) +{ + m_pI = pI; + m_pCallback = new MsrpCallback(); +} + +rtMsrpCallback::~rtMsrpCallback() +{ + rtSafeDelete(m_pCallback); +} + + + \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SMSEncoder.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SMSEncoder.cxx new file mode 100644 index 00000000..5e285713 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SMSEncoder.cxx @@ -0,0 +1,17 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipCallback.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipCallback.cxx new file mode 100644 index 00000000..89b4f8e0 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipCallback.cxx @@ -0,0 +1,135 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_SipCallback.h" +#include "rt_SipEvent.h" + +#include "SipEvent.h" +#include "SipCallback.h" + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + +class SipCallbackProxy : public SipCallback +{ +public: + SipCallbackProxy(rtSipCallback^ rtCallback) + { + m_pCallback = rtCallback; + } + + virtual int OnDialogEvent(const DialogEvent* e) override + { + if(e && m_pCallback && m_pCallback->m_pI) + { + return m_pCallback->m_pI->OnDialogEvent(ref new rtDialogEvent(const_cast(const_cast(e)->getWrappedEvent()))); + } + return 0; + } + + virtual int OnStackEvent(const StackEvent* e) override + { + if(e && m_pCallback && m_pCallback->m_pI) + { + return m_pCallback->m_pI->OnStackEvent(ref new rtStackEvent(const_cast(const_cast(e)->getWrappedEvent()))); + } + return 0; + } + + virtual int OnInviteEvent(const InviteEvent* e) override + { + if(e && m_pCallback && m_pCallback->m_pI) + { + return m_pCallback->m_pI->OnInviteEvent(ref new rtInviteEvent(const_cast(const_cast(e)->getWrappedEvent()))); + } + return 0; + } + + virtual int OnMessagingEvent(const MessagingEvent* e) override + { + if(e && m_pCallback && m_pCallback->m_pI) + { + return m_pCallback->m_pI->OnMessagingEvent(ref new rtMessagingEvent(const_cast(const_cast(e)->getWrappedEvent()))); + } + return 0; + } + + virtual int OnInfoEvent(const InfoEvent* e) override + { + if(m_pCallback && m_pCallback->m_pI) + { + return m_pCallback->m_pI->OnInfoEvent(ref new rtInfoEvent(const_cast(const_cast(e)->getWrappedEvent()))); + } + return 0; + } + + virtual int OnOptionsEvent(const OptionsEvent* e) override + { + if(e && m_pCallback && m_pCallback->m_pI) + { + return m_pCallback->m_pI->OnOptionsEvent(ref new rtOptionsEvent(const_cast(const_cast(e)->getWrappedEvent()))); + } + return 0; + } + + virtual int OnPublicationEvent(const PublicationEvent* e) override + { + if(e && m_pCallback && m_pCallback->m_pI) + { + return m_pCallback->m_pI->OnPublicationEvent(ref new rtPublicationEvent(const_cast(const_cast(e)->getWrappedEvent()))); + } + return 0; + } + + virtual int OnRegistrationEvent(const RegistrationEvent* e) override + { + if(m_pCallback && m_pCallback->m_pI) + { + return m_pCallback->m_pI->OnRegistrationEvent(ref new rtRegistrationEvent(const_cast(const_cast(e)->getWrappedEvent()))); + } + return 0; + } + + virtual int OnSubscriptionEvent(const SubscriptionEvent* e) override + { + if(e && m_pCallback && m_pCallback->m_pI) + { + return m_pCallback->m_pI->OnSubscriptionEvent(ref new rtSubscriptionEvent(const_cast(const_cast(e)->getWrappedEvent()))); + } + return 0; + } + +private: + rtSipCallback^ m_pCallback; +}; + +rtSipCallback::rtSipCallback(rtISipCallback^ pI) +{ + m_pI = pI; + m_pCallback = new SipCallbackProxy(this); +} + +rtSipCallback::~rtSipCallback() +{ + rtSafeDelete(m_pCallback); +} + +const SipCallback* rtSipCallback::getWrappedCallback() +{ + return dynamic_cast(m_pCallback); +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipEvent.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipEvent.cxx new file mode 100644 index 00000000..8851d4f9 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipEvent.cxx @@ -0,0 +1,239 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_SipEvent.h" +#include "rt_String.h" +#include "rt_SipMessage.h" +#include "rt_SipSession.h" + +#include "tinysip/tsip_event.h" + +#include "SipMessage.h" +#include "SipSession.h" +#include "SipEvent.h" + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + +#define rt_getSession_Implement(cls) \ +rt##cls##Session^ rt##cls##Event::getSession(){ \ + const cls##Session* s = m_pEvent->getSession(); \ + if(s){ \ + return ref new rt##cls##Session(const_cast(const_cast<##cls##Session*>(s)->getStack()), const_cast(const_cast<##cls##Session*>(s)->getWrappedSession())); \ + } \ + return nullptr; \ +} \ + +#define rt_takeOwnership_Implement(cls, name, session) \ +rt##name##Session^ rt##cls##Event::take##session##Ownership(){ \ + name##Session* s = m_pEvent->take##session##Ownership(); \ + if(s){ \ + rt##name##Session^ _s = ref new rt##name##Session(const_cast(s->getStack()), const_cast(s->getWrappedSession())); \ + rtSafeDelete(s); \ + return _s; \ + } \ + return nullptr; \ +} \ + +/* ======================== rtDialogEvent ========================*/ +rtISipEvent_Implement(rtDialogEvent); + +rtDialogEvent::rtDialogEvent(const struct tsip_event_s *e) +{ + m_pEvent = new DialogEvent(e); +} + +rtDialogEvent::~rtDialogEvent() +{ + rtSafeDelete(m_pEvent); +} + + +/* ======================== rtStackEvent ========================*/ +rtISipEvent_Implement(rtStackEvent); + +rtStackEvent::rtStackEvent(const struct tsip_event_s *e) +{ + m_pEvent = new StackEvent(e); +} + +rtStackEvent::~rtStackEvent() +{ + rtSafeDelete(m_pEvent); +} + + + /* ======================== rtInviteEvent ========================*/ +rtISipEvent_Implement(rtInviteEvent); + +rtInviteEvent::rtInviteEvent(const struct tsip_event_s *e) +{ + m_pEvent = new InviteEvent(e); +} + +rtInviteEvent::~rtInviteEvent() +{ + rtSafeDelete(m_pEvent); +} + +rt_tsip_invite_event_type_t rtInviteEvent::getType() +{ + return (rt_tsip_invite_event_type_t)m_pEvent->getType(); +} + +rt_twrap_media_type_t rtInviteEvent::getMediaType() +{ + return (rt_twrap_media_type_t)m_pEvent->getMediaType(); +} + +rt_getSession_Implement(Invite); +rt_takeOwnership_Implement(Invite, Call, CallSession); +rt_takeOwnership_Implement(Invite, Msrp, MsrpSession); + +/* ======================== rtMessagingEvent ========================*/ +rtISipEvent_Implement(rtMessagingEvent); + +rtMessagingEvent::rtMessagingEvent(const struct tsip_event_s *e) +{ + m_pEvent = new MessagingEvent(e); +} + + +rtMessagingEvent::~rtMessagingEvent() +{ + rtSafeDelete(m_pEvent); +} + +rt_tsip_message_event_type_t rtMessagingEvent::getType() +{ + return (rt_tsip_message_event_type_t)m_pEvent->getType(); +} + +rt_getSession_Implement(Messaging); +rt_takeOwnership_Implement(Messaging, Messaging, Session); + + +/* ======================== rtInfoEvent ========================*/ +rtISipEvent_Implement(rtInfoEvent); + +rtInfoEvent::rtInfoEvent(const struct tsip_event_s *e) +{ + m_pEvent = new InfoEvent(e); +} + +rtInfoEvent::~rtInfoEvent() +{ + rtSafeDelete(m_pEvent); +} + +rt_tsip_info_event_type_t rtInfoEvent::getType() +{ + return (rt_tsip_info_event_type_t)m_pEvent->getType(); +} + +rt_getSession_Implement(Info); +rt_takeOwnership_Implement(Info, Info, Session); + + +/* ======================== rtOptionsEvent ========================*/ +rtISipEvent_Implement(rtOptionsEvent); + +rtOptionsEvent::rtOptionsEvent(const struct tsip_event_s *e) +{ + m_pEvent = new OptionsEvent(e); +} + +rtOptionsEvent::~rtOptionsEvent() +{ + rtSafeDelete(m_pEvent); +} + +rt_tsip_options_event_type_t rtOptionsEvent::getType() +{ + return (rt_tsip_options_event_type_t)m_pEvent->getType(); +} + +rt_getSession_Implement(Options); +rt_takeOwnership_Implement(Options, Options, Session); + + +/* ======================== rtPublicationEvent ========================*/ +rtISipEvent_Implement(rtPublicationEvent); + +rtPublicationEvent::rtPublicationEvent(const struct tsip_event_s *e) +{ + m_pEvent = new PublicationEvent(e); +} + +rtPublicationEvent::~rtPublicationEvent() +{ + rtSafeDelete(m_pEvent); +} + +rt_tsip_publish_event_type_t rtPublicationEvent::getType() +{ + return (rt_tsip_publish_event_type_t)m_pEvent->getType(); +} + +rt_getSession_Implement(Publication); +rt_takeOwnership_Implement(Publication, Publication, Session); + + + +/* ======================== rtRegistrationEvent ========================*/ +rtISipEvent_Implement(rtRegistrationEvent); + +rtRegistrationEvent::rtRegistrationEvent(const struct tsip_event_s *e) +{ + m_pEvent = new RegistrationEvent(e); +} + +rtRegistrationEvent::~rtRegistrationEvent() +{ + rtSafeDelete(m_pEvent); +} + +rt_tsip_register_event_type_t rtRegistrationEvent::getType() +{ + return (rt_tsip_register_event_type_t)m_pEvent->getType(); +} + +rt_getSession_Implement(Registration); +rt_takeOwnership_Implement(Registration, Registration, Session); + + +/* ======================== rtSubscriptionEvent ========================*/ +rtISipEvent_Implement(rtSubscriptionEvent); + +rtSubscriptionEvent::rtSubscriptionEvent(const struct tsip_event_s *e) +{ + m_pEvent = new SubscriptionEvent(e); +} + +rtSubscriptionEvent::~rtSubscriptionEvent() +{ + rtSafeDelete(m_pEvent); +} + +rt_tsip_subscribe_event_type_t rtSubscriptionEvent::getType() +{ + return (rt_tsip_subscribe_event_type_t)m_pEvent->getType(); +} + +rt_getSession_Implement(Subscription); +rt_takeOwnership_Implement(Subscription, Subscription, Session); \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipMessage.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipMessage.cxx new file mode 100644 index 00000000..2af3976e --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipMessage.cxx @@ -0,0 +1,171 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_SipMessage.h" +#include "rt_String.h" + +#include "SipMessage.h" + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + +// +// rtSdpMessage +// + +rtSdpMessage::rtSdpMessage() + :m_pSdpMessage(NULL) +{ +} + +rtSdpMessage::rtSdpMessage(struct tsdp_message_s *message) +{ + m_pSdpMessage = new SdpMessage(message); +} + +rtSdpMessage::~rtSdpMessage() +{ + rtSafeDelete(m_pSdpMessage); +} + +String^ rtSdpMessage::getSdpHeaderValue(String^ media, String^ name, unsigned index) +{ + if(m_pSdpMessage) + { + char * _str = m_pSdpMessage->getSdpHeaderValue + (rtString::toUtf8(media).data(), + rtString::toUtf8(media).data()[0], + index); + String^ str = rtString::toString(_str); + TSK_FREE(str); + return str; + } + return nullptr; +} + +String^ rtSdpMessage::getSdpHeaderValue(String^ media, String^ name) +{ + return getSdpHeaderValue(media, name, 0); +} + +String^ rtSdpMessage::getSdpHeaderAValue(String^ media, String^ attributeName) +{ + if(m_pSdpMessage) + { + char * _str = m_pSdpMessage->getSdpHeaderAValue + (rtString::toUtf8(media).data(), + rtString::toUtf8(attributeName).data()); + String^ str = rtString::toString(_str); + TSK_FREE(str); + return str; + } + return nullptr; +} + +// +// rtSipMessage +// + +rtSipMessage::rtSipMessage() + :m_pSipMessage(NULL) +{ +} + +rtSipMessage::rtSipMessage(struct tsip_message_s* message) +{ + m_pSipMessage = new SipMessage(message); +} + +rtSipMessage::~rtSipMessage() +{ + rtSafeDelete(m_pSipMessage); +} + +bool rtSipMessage::isResponse() +{ + return m_pSipMessage ? m_pSipMessage->isResponse() : false; +} + +rt_tsip_request_type_t rtSipMessage::getRequestType() +{ + return (rt_tsip_request_type_t)(m_pSipMessage ? m_pSipMessage->getRequestType() : 0); +} + +short rtSipMessage::getResponseCode() +{ + return m_pSipMessage ? m_pSipMessage->getResponseCode() : 0; +} + +String^ rtSipMessage::getResponsePhrase() +{ + return m_pSipMessage ? rtString::toString(m_pSipMessage->getResponsePhrase()) : nullptr; +} + +String^ rtSipMessage::getSipHeaderValue(String^ name, unsigned index) +{ + return m_pSipMessage ? rtString::toString(m_pSipMessage->getSipHeaderValue(rtString::toUtf8(name).data(), index)) : nullptr; +} + +String^ rtSipMessage::getSipHeaderValue(String^ name) +{ + return getSipHeaderValue(name, 0); +} + +String^ rtSipMessage::getSipHeaderParamValue(String^ name, String^ param, unsigned index) +{ + return m_pSipMessage ? rtString::toString(m_pSipMessage->getSipHeaderParamValue(rtString::toUtf8(name).data(), rtString::toUtf8(param).data(), index)) : nullptr; +} + +String^ rtSipMessage::getSipHeaderParamValue(String^ name, String^ param) +{ + return getSipHeaderParamValue(name, param, 0); +} + +unsigned rtSipMessage::getSipContentLength() +{ + return m_pSipMessage ? m_pSipMessage->getSipContentLength() : 0; +} + +#if COM_VISIBLE +String^ rtSipMessage::getSipContent() +{ + unsigned len = getSipContentLength(); + if(len > 0) + { + void* data_ptr = calloc(len, 1); + if(data_ptr) + { + m_pSipMessage->getSipContent(data_ptr, len); + String^ s = rtString::toString((const char*)data_ptr); + free(data_ptr); + return s; + } + } + return nullptr; +} +#else +unsigned rtSipMessage::getSipContent(IntPtr output, unsigned maxsize) +{ + return m_pSipMessage ? m_pSipMessage->getSipContent((void*)output, maxsize) : 0; +} +#endif + +rtSdpMessage^ rtSipMessage::getSdpMessage() +{ + return m_pSipMessage ? ref new rtSdpMessage(const_cast(const_cast(m_pSipMessage->getSdpMessage())->getWrappedSdpMessage())) : nullptr; +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipSession.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipSession.cxx new file mode 100644 index 00000000..7d4e62a7 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipSession.cxx @@ -0,0 +1,642 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_SipSession.h" +#include "rt_String.h" +#include "rt_SipStack.h" +#include "rt_SipUri.h" +#include "rt_Msrp.h" + +#include "SipSession.h" +#include "MediaSessionMgr.h" + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + +/* ======================== T140Callback ========================*/ +rtT140CallbackData::rtT140CallbackData(enum tmedia_t140_data_type_e data_type, const void* data_ptr, unsigned data_size) +{ + m_pData = new T140CallbackData(data_type, data_ptr, data_size); +} + +rtT140CallbackData::~rtT140CallbackData() +{ + rtSafeDelete(m_pData); +} + +/* ======================== rtT140Callback ========================*/ + +rtT140Callback::rtT140Callback() +{ + m_pCallback = new T140Callback(); +} + +rtT140Callback::~rtT140Callback() +{ + rtSafeDelete(m_pCallback); +} + +/* ======================== rtSipSession ========================*/ +rtISession_Implement(rtSipSession); + +rtSipSession::rtSipSession(rtSipStack^ pStack) +{ + m_pSipSession = new SipSession(const_cast(pStack->getWrappedStack())); +} + +rtSipSession::rtSipSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new SipSession(pStack, pHandle); +} + +rtSipSession::~rtSipSession() +{ + rtSafeDelete(m_pSipSession); +} + + +/* ======================== rtInviteSession ========================*/ +rtISession_Implement(rtInviteSession); +rtIInviteSession_Implement(rtInviteSession); + +rtInviteSession::rtInviteSession(rtSipStack^ pStack) +{ + m_pSipSession = new InviteSession(const_cast(pStack->getWrappedStack())); +} + +rtInviteSession::rtInviteSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new InviteSession(pStack, pHandle); +} + +rtInviteSession::~rtInviteSession() +{ + rtSafeDelete(m_pSipSession); +} + + +/* ======================== rtCallSession ========================*/ +rtISession_Implement(rtCallSession); +rtIInviteSession_Implement(rtCallSession); + +rtCallSession::rtCallSession(rtSipStack^ pStack) +{ + m_pSipSession = new CallSession(const_cast(pStack->getWrappedStack())); +} + +rtCallSession::rtCallSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new CallSession(pStack, pHandle); +} + +rtCallSession::~rtCallSession() +{ + rtSafeDelete(m_pSipSession); +} + + +bool rtCallSession::call(String^ remoteUriString, rt_twrap_media_type_t media, rtActionConfig^ config) +{ + return m_pSipSession->call(rtString::toUtf8(remoteUriString).data(), (twrap_media_type_t)media, config ? config->getWrappedActionConfig() : tsk_null); + +} + +bool rtCallSession::call(String^ remoteUriString, rt_twrap_media_type_t media) +{ + return call(remoteUriString, media, nullptr); +} + +bool rtCallSession::call(rtSipUri^ remoteUri, rt_twrap_media_type_t media, rtActionConfig^ config) +{ + return m_pSipSession->call(remoteUri->getWrappedUri(), (twrap_media_type_t)media, config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtCallSession::call(rtSipUri^ remoteUri, rt_twrap_media_type_t media) +{ + return call(remoteUri, media, nullptr); +} + +bool rtCallSession::setSessionTimer(unsigned timeout, String^ refresher) +{ + return m_pSipSession->setSessionTimer(timeout, rtString::toUtf8(refresher).data()); +} + +bool rtCallSession::set100rel(bool enabled) +{ + return m_pSipSession->set100rel(enabled); +} + +bool rtCallSession::setRtcp(bool enabled) +{ + return m_pSipSession->setRtcp(enabled); +} + +bool rtCallSession::setRtcpMux(bool enabled) +{ + return m_pSipSession->setRtcpMux(enabled); +} + +bool rtCallSession::setICE(bool enabled) +{ + return m_pSipSession->setICE(enabled); +} + +bool rtCallSession::setQoS(rt_tmedia_qos_stype_t type, rt_tmedia_qos_strength_t strength) +{ + return m_pSipSession->setQoS((tmedia_qos_stype_t) type, (tmedia_qos_strength_t) strength); +} + +bool rtCallSession::hold(rtActionConfig^ config) +{ + return m_pSipSession->hold(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtCallSession::hold() +{ + return hold(nullptr); +} + +bool rtCallSession::resume(rtActionConfig^ config) +{ + return m_pSipSession->resume(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtCallSession::resume() +{ + return resume(nullptr); +} + +bool rtCallSession::transfer(String^ referToUriString, rtActionConfig^ config) +{ + return m_pSipSession->transfer(rtString::toUtf8(referToUriString).data(), config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtCallSession::transfer(String^ referToUriString) +{ + return transfer(referToUriString, nullptr); +} + +bool rtCallSession::acceptTransfer(rtActionConfig^ config) +{ + return m_pSipSession->acceptTransfer(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtCallSession::acceptTransfer() +{ + return acceptTransfer(nullptr); +} + +bool rtCallSession::rejectTransfer(rtActionConfig^ config) +{ + return m_pSipSession->rejectTransfer(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtCallSession::rejectTransfer() +{ + return rejectTransfer(nullptr); +} + +bool rtCallSession::sendDTMF(int number) +{ + return m_pSipSession->sendDTMF(number); +} + +unsigned rtCallSession::getSessionTransferId() +{ + return m_pSipSession->getSessionTransferId(); +} + +#if COM_VISIBLE +bool rtCallSession::sendT140Data(rt_tmedia_t140_data_type_t data_type, String^ data) +{ + std::vector _data = rtString::toUtf8(data); + return m_pSipSession->sendT140Data((tmedia_t140_data_type_t) data_type, (const void*)_data.data(), _data.size()); +} +#else +bool rtCallSession::sendT140Data(rt_tmedia_t140_data_type_t data_type, IntPtr data_ptr, unsigned data_size) +{ + return m_pSipSession->sendT140Data((tmedia_t140_data_type_t) data_type, (const void*)data_ptr, data_size); +} + +#endif + +bool rtCallSession::sendT140Data(rt_tmedia_t140_data_type_t data_type) +{ + return sendT140Data(data_type, nullptr +#if !COM_VISIBLE + , 0 +#endif + ); +} + +bool rtCallSession::setT140Callback(rtT140Callback^ pT140Callback) +{ + return m_pSipSession->setT140Callback(const_cast(pT140Callback->getWrappedCallback())); +} + + +/* ======================== rtMsrpSession ========================*/ +rtISession_Implement(rtMsrpSession); +rtIInviteSession_Implement(rtMsrpSession); + +rtMsrpSession::rtMsrpSession(rtSipStack^ pStack, rtIMsrpCallback^ pCallback) +{ + m_pCallback = ref new rtMsrpCallback(pCallback); + m_pSipSession = new MsrpSession(const_cast(pStack->getWrappedStack()), const_cast(m_pCallback->getWrappedCallback())); +} + +rtMsrpSession::rtMsrpSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new MsrpSession(pStack, pHandle); +} + +rtMsrpSession::~rtMsrpSession() +{ + rtSafeDelete(m_pSipSession); + rtSafeDelete(m_pCallback); +} + +bool rtMsrpSession::setCallback(rtIMsrpCallback^ pCallback) +{ + rtSafeDelete(m_pCallback); + if(!pCallback) + { + return m_pSipSession->setCallback(tsk_null); + return true; + } + m_pCallback = ref new rtMsrpCallback(pCallback); + return m_pSipSession->setCallback(const_cast(m_pCallback->getWrappedCallback())); +} + +bool rtMsrpSession::callMsrp(Platform::String^ remoteUriString, rtActionConfig^ config) +{ + return m_pSipSession->callMsrp(rtString::toUtf8(remoteUriString).data(), config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtMsrpSession::callMsrp(Platform::String^ remoteUriString) +{ + return callMsrp(remoteUriString, nullptr); +} + +bool rtMsrpSession::callMsrp(rtSipUri^ remoteUri, rtActionConfig^ config) +{ + return m_pSipSession->callMsrp(remoteUri->getWrappedUri(), config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtMsrpSession::callMsrp(rtSipUri^ remoteUri) +{ + return callMsrp(remoteUri, nullptr); +} + +#if COM_VISIBLE +bool rtMsrpSession::sendMessage(String^ payload, rtActionConfig^ config) +{ + std::vector _payload = rtString::toUtf8(payload); + return m_pSipSession->sendMessage((const void*)_payload.data(), _payload.size(), config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtMsrpSession::sendMessage(Platform::String^ payload) +{ + return sendMessage(payload, nullptr); +} + +#else +bool rtMsrpSession::sendMessage(Platform::IntPtr payload, unsigned len, rtActionConfig^ config) +{ + return m_pSipSession->sendMessage((const void*)payload, len, config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtMsrpSession::sendMessage(Platform::IntPtr payload, unsigned len) +{ + return sendMessage(payload, len, nullptr); +} +#endif /* COM_VISIBLE */ + + +/* ======================== rtMessagingSession ========================*/ +rtISession_Implement(rtMessagingSession); + +rtMessagingSession::rtMessagingSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new MessagingSession(pStack, pHandle); +} + +rtMessagingSession::rtMessagingSession(rtSipStack^ pStack) +{ + m_pSipSession = new MessagingSession(const_cast(pStack->getWrappedStack())); +} + +rtMessagingSession::~rtMessagingSession() +{ + rtSafeDelete(m_pSipSession); +} + +#if COM_VISIBLE +bool rtMessagingSession::send(String^ payload, rtActionConfig^ config) +{ + std::vector_payload = rtString::toUtf8(payload); + return m_pSipSession->send((const void*)_payload.data(), _payload.size(), config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtMessagingSession::send(Platform::String^ payload) +{ + return send(payload, nullptr); +} + +#else +bool rtMessagingSession::send(IntPtr payload, unsigned len, rtActionConfig^ config) +{ + return m_pSipSession->send((const void*)payload, len, config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtMessagingSession::send(IntPtr payload, unsigned len) +{ + return send(payload, len, nullptr); +} +#endif + +bool rtMessagingSession::accept(rtActionConfig^ config) +{ + return m_pSipSession->accept(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtMessagingSession::accept() +{ + return accept(nullptr); +} + +bool rtMessagingSession::reject(rtActionConfig^ config) +{ + return m_pSipSession->reject(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtMessagingSession::reject() +{ + return reject(nullptr); +} + +/* ======================== rtInfoSession ========================*/ +rtISession_Implement(rtInfoSession); + +rtInfoSession::rtInfoSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new InfoSession(pStack, pHandle); +} + +rtInfoSession::rtInfoSession(rtSipStack^ pStack) +{ + m_pSipSession = new InfoSession(const_cast(pStack->getWrappedStack())); +} + +rtInfoSession::~rtInfoSession() +{ + rtSafeDelete(m_pSipSession); +} + +#if COM_VISIBLE +bool rtInfoSession::send(Platform::String^ payload, rtActionConfig^ config) +{ + std::vector_payload = rtString::toUtf8(payload); + return m_pSipSession->send((const void*)_payload.data(), _payload.size(), config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtInfoSession::send(Platform::String^ payload) +{ + return send(payload, nullptr); +} +#else +bool rtInfoSession::send(IntPtr payload, unsigned len, rtActionConfig^ config) +{ + return m_pSipSession->send((const void*)payload, len, config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtInfoSession::send(IntPtr payload, unsigned len) +{ + return send(payload, len, nullptr); +} +#endif + +bool rtInfoSession::accept(rtActionConfig^ config) +{ + return m_pSipSession->accept(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtInfoSession::accept() +{ + return accept(nullptr); +} + +bool rtInfoSession::reject(rtActionConfig^ config) +{ + return m_pSipSession->reject(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtInfoSession::reject() +{ + return reject(nullptr); +} + + + +/* ======================== rtOptionsSession ========================*/ +rtISession_Implement(rtOptionsSession); + +rtOptionsSession::rtOptionsSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new OptionsSession(pStack, pHandle); +} + +rtOptionsSession::rtOptionsSession(rtSipStack^ pStack) +{ + m_pSipSession = new OptionsSession(const_cast(pStack->getWrappedStack())); +} + +rtOptionsSession::~rtOptionsSession() +{ + rtSafeDelete(m_pSipSession); +} + +bool rtOptionsSession::send(rtActionConfig^ config) +{ + return m_pSipSession->send(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtOptionsSession::send() +{ + return send(nullptr); +} + +bool rtOptionsSession::accept(rtActionConfig^ config) +{ + return m_pSipSession->accept(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtOptionsSession::accept() +{ + return accept(nullptr); +} + +bool rtOptionsSession::reject(rtActionConfig^ config) +{ + return m_pSipSession->reject(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtOptionsSession::reject() +{ + return reject(nullptr); +} + + + +/* ======================== rtPublicationSession ========================*/ +rtISession_Implement(rtPublicationSession); + +rtPublicationSession::rtPublicationSession(rtSipStack^ pStack) +{ + m_pSipSession = new PublicationSession(const_cast(pStack->getWrappedStack())); +} + +rtPublicationSession::rtPublicationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new PublicationSession(pStack, pHandle); +} + +rtPublicationSession::~rtPublicationSession() +{ + rtSafeDelete(m_pSipSession); +} + +#if COM_VISIBLE +bool rtPublicationSession::publish(String^ payload, rtActionConfig^ config) +{ + std::vector_payload = rtString::toUtf8(payload); + return m_pSipSession->publish((const void*)_payload.data(), _payload.size(), config ? config->getWrappedActionConfig() : tsk_null); +} +bool rtPublicationSession::publish(Platform::String^ payload) +{ + return publish(payload, nullptr); +} +#else +bool rtPublicationSession::publish(Platform::IntPtr payload, unsigned len, rtActionConfig^ config) +{ + return m_pSipSession->publish((const void*)payload, len, config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtPublicationSession::publish(Platform::IntPtr payload, unsigned len) +{ + return publish(payload, len, nullptr); +} +#endif + +bool rtPublicationSession::unPublish(rtActionConfig^ config) +{ + return m_pSipSession->unPublish(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtPublicationSession::unPublish() +{ + return unPublish(nullptr); +} + + +/* ======================== rtRegistrationSession ========================*/ +rtISession_Implement(rtRegistrationSession); + +rtRegistrationSession::rtRegistrationSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new RegistrationSession(pStack, pHandle); +} + +rtRegistrationSession::rtRegistrationSession(rtSipStack^ pStack) +{ + m_pSipSession = new RegistrationSession(const_cast(pStack->getWrappedStack())); +} + +rtRegistrationSession::~rtRegistrationSession() +{ + rtSafeDelete(m_pSipSession); +} + +bool rtRegistrationSession::register_(rtActionConfig^ config) +{ + return m_pSipSession->register_(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtRegistrationSession::register_() +{ + return register_(nullptr); +} + +bool rtRegistrationSession::unRegister(rtActionConfig^ config) +{ + return m_pSipSession->unRegister(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtRegistrationSession::unRegister() +{ + return unRegister(nullptr); +} + +bool rtRegistrationSession::accept(rtActionConfig^ config) +{ + return m_pSipSession->accept(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtRegistrationSession::accept() +{ + return accept(nullptr); +} + +bool rtRegistrationSession::reject(rtActionConfig^ config) +{ + return m_pSipSession->reject(config ? config->getWrappedActionConfig() : tsk_null); +} + +bool rtRegistrationSession::reject() +{ + return reject(nullptr); +} + + +/* ======================== rtSubscriptionSession ========================*/ +rtISession_Implement(rtSubscriptionSession); + +rtSubscriptionSession::rtSubscriptionSession(rtSipStack^ pStack) +{ + m_pSipSession = new SubscriptionSession(const_cast(pStack->getWrappedStack())); +} + +rtSubscriptionSession::rtSubscriptionSession(SipStack* pStack, tsip_ssession_handle_t* pHandle) +{ + m_pSipSession = new SubscriptionSession(pStack, pHandle); +} + +rtSubscriptionSession::~rtSubscriptionSession() +{ + rtSafeDelete(m_pSipSession); +} + +bool rtSubscriptionSession::subscribe() +{ + return m_pSipSession->subscribe(); +} + +bool rtSubscriptionSession::unSubscribe() +{ + return m_pSipSession->unSubscribe(); +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipStack.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipStack.cxx new file mode 100644 index 00000000..8aa4db13 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipStack.cxx @@ -0,0 +1,390 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_SipStack.h" +#include "rt_SipCallback.h" +#include "rt_DDebug.h" +#include "rt_String.h" +#include "rt_Enums.h" + +#include "SipStack.h" + + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + +rtSipStack::rtSipStack(rtISipCallback^ callback, Platform::String^ realmUri, Platform::String^ impiString, Platform::String^ impuUri) +{ + m_pSipCallback = ref new rtSipCallback(callback); + m_pSipStack = new SipStack( + const_cast(m_pSipCallback->getWrappedCallback()), + rtString::toUtf8(realmUri).data(), + rtString::toUtf8(impiString).data(), + rtString::toUtf8(impuUri).data() + ); +} + +rtSipStack::~rtSipStack() +{ + std::lock_guard lock(mLock); + + rtSafeDelete(m_pSipStack); + rtSafeDelete(m_pSipCallback); + rtSafeDelete(m_pDebugCallback); +} + +bool rtSipStack::start() +{ + std::lock_guard lock(mLock); + + return m_pSipStack->start(); +} + +bool rtSipStack::setDebugCallback(rtIDDebugCallback^ pCallback) +{ + std::lock_guard lock(mLock); + + m_pSipStack->setDebugCallback(tsk_null); + rtSafeDelete(m_pDebugCallback); + if(!pCallback) + { + return true; + } + + m_pDebugCallback = ref new rtDDebugCallback(pCallback); + return m_pSipStack->setDebugCallback(const_cast(m_pDebugCallback->getWrappedCallback())); +} + +bool rtSipStack::setDisplayName(Platform::String^ display_name) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setDisplayName(rtString::toUtf8(display_name).data()); +} + +bool rtSipStack::setRealm(Platform::String^ realm_uri) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setRealm(rtString::toUtf8(realm_uri).data()); +} + +bool rtSipStack::setIMPI(Platform::String^ impi) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setIMPI(rtString::toUtf8(impi).data()); +} + +bool rtSipStack::setIMPU(Platform::String^ impu_uri) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setIMPU(rtString::toUtf8(impu_uri).data()); +} + +bool rtSipStack::setPassword(Platform::String^ password) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setPassword(rtString::toUtf8(password).data()); +} + +bool rtSipStack::setAMF(Platform::String^ amf) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setAMF(rtString::toUtf8(amf).data()); +} + +bool rtSipStack::setOperatorId(Platform::String^ opid) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setOperatorId(rtString::toUtf8(opid).data()); +} + + +bool rtSipStack::setProxyCSCF(Platform::String^ fqdn, unsigned short port, Platform::String^ transport, Platform::String^ ipversion) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setProxyCSCF( + rtString::toUtf8(fqdn).data(), + port, + rtString::toUtf8(transport).data(), + rtString::toUtf8(ipversion).data() + ); +} +bool rtSipStack::setLocalIP(Platform::String^ ip, Platform::String^ transport) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setLocalIP(rtString::toUtf8(ip).data(), rtString::toUtf8(transport).data()); +} + +bool rtSipStack::setLocalIP(Platform::String^ ip) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setLocalIP(rtString::toUtf8(ip).data()); +} + +bool rtSipStack::setLocalPort(unsigned short port, Platform::String^ transport) +{ + return m_pSipStack->setLocalPort(port, rtString::toUtf8(transport).data()); +} + +bool rtSipStack::setLocalPort(unsigned short port) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setLocalPort(port); +} + +bool rtSipStack::setEarlyIMS(bool enabled) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setEarlyIMS(enabled); +} + +bool rtSipStack::addHeader(Platform::String^ name, Platform::String^ value) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->addHeader(rtString::toUtf8(name).data(), rtString::toUtf8(value).data()); +} + +bool rtSipStack::removeHeader(Platform::String^ name) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->removeHeader(rtString::toUtf8(name).data()); +} + +bool rtSipStack::addDnsServer(Platform::String^ ip) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->removeHeader(rtString::toUtf8(ip).data()); +} + +bool rtSipStack::setDnsDiscovery(bool enabled) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setDnsDiscovery(enabled); +} + +bool rtSipStack::setAoR(Platform::String^ ip, int port) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setAoR(rtString::toUtf8(ip).data(), port); +} + +bool rtSipStack::setSigCompParams(unsigned dms, unsigned sms, unsigned cpb, bool enablePresDict) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setSigCompParams(dms, sms, cpb, enablePresDict); +} + +bool rtSipStack::addSigCompCompartment(Platform::String^ compId) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->addSigCompCompartment(rtString::toUtf8(compId).data()); +} + +bool rtSipStack::removeSigCompCompartment(Platform::String^ compId) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->removeSigCompCompartment(rtString::toUtf8(compId).data()); +} + +bool rtSipStack::setSTUNServer(Platform::String^ ip, unsigned short port) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setSTUNServer(rtString::toUtf8(ip).data(), port); +} + +bool rtSipStack::setSTUNCred(Platform::String^ login, Platform::String^ password) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setSTUNCred(rtString::toUtf8(login).data(), rtString::toUtf8(password).data()); +} + +bool rtSipStack::setTLSSecAgree(bool enabled) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setTLSSecAgree(enabled); +} + +bool rtSipStack::setSSLCertificates(Platform::String^ privKey, Platform::String^ pubKey, Platform::String^ caKey, bool verify) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setSSLCertificates(rtString::toUtf8(privKey).data(), rtString::toUtf8(pubKey).data(), rtString::toUtf8(caKey).data(), verify); +} + +bool rtSipStack::setSSLCertificates(Platform::String^ privKey, Platform::String^ pubKey, Platform::String^ caKey) +{ + std::lock_guard lock(mLock); + + return setSSLCertificates(privKey, pubKey, caKey, false); +} + +bool rtSipStack::setIPSecSecAgree(bool enabled) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setIPSecSecAgree(enabled); +} + +bool rtSipStack::setIPSecParameters(Platform::String^ algo, Platform::String^ ealgo, Platform::String^ mode, Platform::String^ proto) +{ + std::lock_guard lock(mLock); + + return m_pSipStack->setIPSecParameters(rtString::toUtf8(algo).data(), rtString::toUtf8(ealgo).data(), rtString::toUtf8(mode).data(), rtString::toUtf8(proto).data()); +} + +Platform::String^ rtSipStack::dnsENUM(Platform::String^ service, Platform::String^ e164num, Platform::String^ domain) +{ + std::lock_guard lock(mLock); + + return rtString::toString(m_pSipStack->dnsENUM(rtString::toUtf8(service).data(), rtString::toUtf8(e164num).data(), rtString::toUtf8(domain).data())); +} + +#if COM_VISIBLE +rtDnsResult^ rtSipStack::dnsNaptrSrv(String^ domain, String^ service) +{ + std::lock_guard lock(mLock); + + unsigned short _port = 0; + String^ address = rtString::toString(m_pSipStack->dnsNaptrSrv(rtString::toUtf8(domain).data(), rtString::toUtf8(service).data(), &_port)); + return ref new rtDnsResult(_port, address); +} + +rtDnsResult^ rtSipStack::dnsSrv(String^ service) +{ + std::lock_guard lock(mLock); + + unsigned short _port = 0; + String^ address = rtString::toString(m_pSipStack->dnsSrv(rtString::toUtf8(service).data(), &_port)); + return ref new rtDnsResult(_port, address); +} + +String^ rtSipStack::getLocalIP(String^ protocol) +{ + std::lock_guard lock(mLock); + + char* _ip = m_pSipStack->getLocalIPnPort(rtString::toUtf8(protocol).data(), tsk_null); + String^ ip = rtString::toString(_ip); + TSK_FREE(_ip); + return ip; +} + +uint16 rtSipStack::getLocalPort(String^ protocol) +{ + std::lock_guard lock(mLock); + + uint16 port = 0; + char* _ip = m_pSipStack->getLocalIPnPort(rtString::toUtf8(protocol).data(), &port); + TSK_FREE(_ip); + return port; +} +#else +String^ rtSipStack::dnsNaptrSrv(String^ domain, String^ service, IntPtr port) +{ + std::lock_guard lock(mLock); + + return rtString::toString(m_pSipStack->dnsNaptrSrv(rtString::toUtf8(domain).data(), rtString::toUtf8(service).data(), ((unsigned short*)(void*)port))); +} + +String^ rtSipStack::dnsSrv(String^ service, IntPtr port) +{ + std::lock_guard lock(mLock); + + return rtString::toString(m_pSipStack->dnsSrv(rtString::toUtf8(service).data(), ((unsigned short*)(void*)port))); +} + +Platform::String^ rtSipStack::getLocalIPnPort(String^ protocol, IntPtr port) +{ + std::lock_guard lock(mLock); + + char* _ip = m_pSipStack->getLocalIPnPort(rtString::toUtf8(protocol).data(), ((unsigned short*)(void*)port)); + String^ ip = rtString::toString(); + TSK_FREE(_ip); + return ip; +} +#endif /* COM_VISIBLE */ + +Platform::String^ rtSipStack::getPreferredIdentity() +{ + std::lock_guard lock(mLock); + + return rtString::toString(m_pSipStack->getPreferredIdentity()); +} + +bool rtSipStack::isValid() +{ + std::lock_guard lock(mLock); + + return m_pSipStack->isValid(); +} + +bool rtSipStack::stop() +{ + std::lock_guard lock(mLock); + + return m_pSipStack->stop(); +} + +bool rtSipStack::initialize() +{ + return SipStack::initialize(); +} + +bool rtSipStack::deInitialize() +{ + return SipStack::deInitialize(); +} + +void rtSipStack::setCodecs(enum class rt_tdav_codec_id_t codecs) +{ + return SipStack::setCodecs((tdav_codec_id_t) codecs); +} + +bool rtSipStack::setCodecPriority(enum class rt_tdav_codec_id_t codec_id, int priority) +{ + return SipStack::setCodecPriority((tdav_codec_id_t)codec_id, priority); +} + +bool rtSipStack::isCodecSupported(enum class rt_tdav_codec_id_t codec_id) +{ + return SipStack::isCodecSupported((tdav_codec_id_t) codec_id); +} + + + diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipUri.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipUri.cxx new file mode 100644 index 00000000..f0cc0f71 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_SipUri.cxx @@ -0,0 +1,103 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_SipUri.h" +#include "rt_String.h" + +#include "SipUri.h" + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + + +rtSipUri::rtSipUri(Platform::String^ uriString, Platform::String^ displayName) +{ + m_pSipUri = new SipUri( + rtString::toUtf8(uriString).data(), + rtString::toUtf8(displayName).data()); +} + +rtSipUri::rtSipUri(Platform::String^ uriString) +{ + m_pSipUri = new SipUri(rtString::toUtf8(uriString).data()); +} + +rtSipUri::~rtSipUri() +{ + rtSafeDelete(m_pSipUri); +} + +bool rtSipUri::isValid(Platform::String^ uri) +{ + return SipUri::isValid(rtString::toUtf8(uri).data()); +} + +// MIDL4069: Static members and instance members cannot have the same name on a runtime class. isValid + +#if COM_VISIBLE +bool rtSipUri::isValid_() +#else +bool rtSipUri::isValid() +#endif +{ + return (m_pSipUri && m_pSipUri->isValid()); +} + +Platform::String^ rtSipUri::getScheme() +{ + return m_pSipUri ? rtString::toString(m_pSipUri->getScheme()) : nullptr; +} + +Platform::String^ rtSipUri::getHost() +{ + return m_pSipUri ? rtString::toString(m_pSipUri->getHost()) : nullptr; +} + +unsigned short rtSipUri::getPort() +{ + return m_pSipUri ? m_pSipUri->getPort() : 0; +} + +Platform::String^ rtSipUri::getUserName() +{ + return m_pSipUri ? rtString::toString(m_pSipUri->getUserName()) : nullptr; +} + +Platform::String^ rtSipUri::getPassword() +{ + return m_pSipUri ? rtString::toString(m_pSipUri->getPassword()) : nullptr; +} + +Platform::String^ rtSipUri::getDisplayName() +{ + return m_pSipUri ? rtString::toString(m_pSipUri->getDisplayName()) : nullptr; +} + +Platform::String^ rtSipUri::getParamValue(Platform::String^ name) +{ + return m_pSipUri ? rtString::toString(m_pSipUri->getParamValue(rtString::toUtf8(name).data())) : nullptr; +} + +void rtSipUri::setDisplayName(Platform::String^ displayName) +{ + if(m_pSipUri) + { + m_pSipUri->setDisplayName(rtString::toUtf8(displayName).data()); + } +} + diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_String.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_String.cxx new file mode 100644 index 00000000..848c339a --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_String.cxx @@ -0,0 +1,58 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +#include "rt_String.h" + +#include + +using namespace doubango_rt::BackEnd; +using namespace Platform; +using namespace std; + +vector rtString::toUtf8(String^ str) +{ + if(str != nullptr && !str->IsEmpty()) + { + int len = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, str->Data(), str->Length(), nullptr, 0, nullptr, nullptr); + if (len > 0) + { + vector vec(len + 1); + if (WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, str->Data(), str->Length(), vec.data(), len, nullptr, nullptr) == len) + { + return std::move(vec); + } + } + } + return std::move(vector(0)); +} + +String^ rtString::toString(char const* str) +{ + if(str) + { + int len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, -1, nullptr, 0); + if (len > 0) + { + vector vec(len); + if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, -1, vec.data(), len) == len) + { + return ref new String(vec.data()); + } + } + } + return nullptr; +} \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Xcap.cxx b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Xcap.cxx new file mode 100644 index 00000000..5e285713 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/doubango_rt/src/rt_Xcap.cxx @@ -0,0 +1,17 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/tinyWRAP.sln b/branches/2.0/doubango/bindings/winrt/tinyWRAP.sln new file mode 100644 index 00000000..fdce0d04 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/tinyWRAP.sln @@ -0,0 +1,229 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyWRAP", "tinyWRAP.vcxproj", "{5004BA7E-950D-4D60-A030-29ACD38DCA08}" + ProjectSection(ProjectDependencies) = postProject + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67} = {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67} + {BE41D117-1D61-4C12-AD9D-B20D02C79687} = {BE41D117-1D61-4C12-AD9D-B20D02C79687} + {1A27423C-6535-4A49-96EC-5D209FE125F2} = {1A27423C-6535-4A49-96EC-5D209FE125F2} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {77A24977-079C-4E02-9717-8B2F684BAA21} = {77A24977-079C-4E02-9717-8B2F684BAA21} + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F} = {49843B78-0CEB-445D-BACC-C5C5C2F6C26F} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {0875A083-5118-40CC-941E-722B00295A5B} = {0875A083-5118-40CC-941E-722B00295A5B} + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2} = {0F2C458A-1EDB-4E09-9A22-C2209731CFF2} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + {F623CBDB-707A-4FDC-ACE0-3D616E239F16} = {F623CBDB-707A-4FDC-ACE0-3D616E239F16} + {52E43EEB-A549-4159-B254-DCA225D7638B} = {52E43EEB-A549-4159-B254-DCA225D7638B} + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC} = {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyDAV", "..\..\tinyDAV\winrt\tinyDAV.vcxproj", "{0F2C458A-1EDB-4E09-9A22-C2209731CFF2}" + ProjectSection(ProjectDependencies) = postProject + {BE41D117-1D61-4C12-AD9D-B20D02C79687} = {BE41D117-1D61-4C12-AD9D-B20D02C79687} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {77A24977-079C-4E02-9717-8B2F684BAA21} = {77A24977-079C-4E02-9717-8B2F684BAA21} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + {52E43EEB-A549-4159-B254-DCA225D7638B} = {52E43EEB-A549-4159-B254-DCA225D7638B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyHTTP", "..\..\tinyHTTP\winrt\tinyHTTP.vcxproj", "{1A27423C-6535-4A49-96EC-5D209FE125F2}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyIPSec", "..\..\tinyIPSec\winrt\tinyIPSec.vcxproj", "{0875A083-5118-40CC-941E-722B00295A5B}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMEDIA", "..\..\tinyMEDIA\winrt\tinyMEDIA.vcxproj", "{52E43EEB-A549-4159-B254-DCA225D7638B}" + ProjectSection(ProjectDependencies) = postProject + {BE41D117-1D61-4C12-AD9D-B20D02C79687} = {BE41D117-1D61-4C12-AD9D-B20D02C79687} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMSRP", "..\..\tinyMSRP\winrt\tinyMSRP.vcxproj", "{BE41D117-1D61-4C12-AD9D-B20D02C79687}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "..\..\tinyNET\winrt\tinyNET.vcxproj", "{06E58F9D-28A1-4DD4-AF11-2F5239222CCC}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyRTP", "..\..\tinyRTP\winrt\tinyRTP.vcxproj", "{77A24977-079C-4E02-9717-8B2F684BAA21}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + {52E43EEB-A549-4159-B254-DCA225D7638B} = {52E43EEB-A549-4159-B254-DCA225D7638B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySDP", "..\..\tinySDP\winrt\tinySDP.vcxproj", "{982D737A-0649-4C32-A00E-08992A0B7673}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIGCOMP", "..\..\tinySIGCOMP\winrt\tinySIGCOMP.vcxproj", "{F623CBDB-707A-4FDC-ACE0-3D616E239F16}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIP", "..\..\tinySIP\winrt\tinySIP.vcxproj", "{1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}" + ProjectSection(ProjectDependencies) = postProject + {BE41D117-1D61-4C12-AD9D-B20D02C79687} = {BE41D117-1D61-4C12-AD9D-B20D02C79687} + {1A27423C-6535-4A49-96EC-5D209FE125F2} = {1A27423C-6535-4A49-96EC-5D209FE125F2} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {0875A083-5118-40CC-941E-722B00295A5B} = {0875A083-5118-40CC-941E-722B00295A5B} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + {F623CBDB-707A-4FDC-ACE0-3D616E239F16} = {F623CBDB-707A-4FDC-ACE0-3D616E239F16} + {52E43EEB-A549-4159-B254-DCA225D7638B} = {52E43EEB-A549-4159-B254-DCA225D7638B} + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC} = {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySMS", "..\..\tinySMS\winrt\tinySMS.vcxproj", "{65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXCAP", "..\..\tinyXCAP\winrt\tinyXCAP.vcxproj", "{49843B78-0CEB-445D-BACC-C5C5C2F6C26F}" + ProjectSection(ProjectDependencies) = postProject + {1A27423C-6535-4A49-96EC-5D209FE125F2} = {1A27423C-6535-4A49-96EC-5D209FE125F2} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5004BA7E-950D-4D60-A030-29ACD38DCA08}.Debug|ARM.ActiveCfg = Debug|ARM + {5004BA7E-950D-4D60-A030-29ACD38DCA08}.Debug|ARM.Build.0 = Debug|ARM + {5004BA7E-950D-4D60-A030-29ACD38DCA08}.Debug|Win32.ActiveCfg = Debug|Win32 + {5004BA7E-950D-4D60-A030-29ACD38DCA08}.Debug|Win32.Build.0 = Debug|Win32 + {5004BA7E-950D-4D60-A030-29ACD38DCA08}.Release|ARM.ActiveCfg = Release|ARM + {5004BA7E-950D-4D60-A030-29ACD38DCA08}.Release|ARM.Build.0 = Release|ARM + {5004BA7E-950D-4D60-A030-29ACD38DCA08}.Release|Win32.ActiveCfg = Release|Win32 + {5004BA7E-950D-4D60-A030-29ACD38DCA08}.Release|Win32.Build.0 = Release|Win32 + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Debug|ARM.ActiveCfg = Debug|ARM + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Debug|ARM.Build.0 = Debug|ARM + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Debug|Win32.ActiveCfg = Debug|Win32 + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Debug|Win32.Build.0 = Debug|Win32 + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Release|ARM.ActiveCfg = Release|ARM + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Release|ARM.Build.0 = Release|ARM + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Release|Win32.ActiveCfg = Release|Win32 + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Release|Win32.Build.0 = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.ActiveCfg = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.Build.0 = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.Build.0 = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.ActiveCfg = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.Build.0 = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.ActiveCfg = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.Build.0 = Release|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|ARM.ActiveCfg = Debug|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|ARM.Build.0 = Debug|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|Win32.ActiveCfg = Debug|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|Win32.Build.0 = Debug|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Release|ARM.ActiveCfg = Release|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Release|ARM.Build.0 = Release|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Release|Win32.ActiveCfg = Release|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Release|Win32.Build.0 = Release|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.ActiveCfg = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.Build.0 = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.ActiveCfg = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.Build.0 = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.ActiveCfg = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.Build.0 = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.ActiveCfg = Release|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.Build.0 = Release|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|ARM.ActiveCfg = Debug|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|ARM.Build.0 = Debug|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|Win32.ActiveCfg = Debug|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|Win32.Build.0 = Debug|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|ARM.ActiveCfg = Release|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|ARM.Build.0 = Release|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|Win32.ActiveCfg = Release|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|Win32.Build.0 = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.ActiveCfg = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.Build.0 = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.Build.0 = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.ActiveCfg = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.Build.0 = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.ActiveCfg = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.Build.0 = Release|Win32 + {77A24977-079C-4E02-9717-8B2F684BAA21}.Debug|ARM.ActiveCfg = Debug|ARM + {77A24977-079C-4E02-9717-8B2F684BAA21}.Debug|ARM.Build.0 = Debug|ARM + {77A24977-079C-4E02-9717-8B2F684BAA21}.Debug|Win32.ActiveCfg = Debug|Win32 + {77A24977-079C-4E02-9717-8B2F684BAA21}.Debug|Win32.Build.0 = Debug|Win32 + {77A24977-079C-4E02-9717-8B2F684BAA21}.Release|ARM.ActiveCfg = Release|ARM + {77A24977-079C-4E02-9717-8B2F684BAA21}.Release|ARM.Build.0 = Release|ARM + {77A24977-079C-4E02-9717-8B2F684BAA21}.Release|Win32.ActiveCfg = Release|Win32 + {77A24977-079C-4E02-9717-8B2F684BAA21}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.ActiveCfg = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.Build.0 = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.ActiveCfg = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.Build.0 = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.ActiveCfg = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.Build.0 = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.ActiveCfg = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.Build.0 = Release|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|ARM.ActiveCfg = Debug|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|ARM.Build.0 = Debug|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|Win32.ActiveCfg = Debug|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|Win32.Build.0 = Debug|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|ARM.ActiveCfg = Release|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|ARM.Build.0 = Release|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|Win32.ActiveCfg = Release|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|Win32.Build.0 = Release|Win32 + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Debug|ARM.ActiveCfg = Debug|ARM + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Debug|ARM.Build.0 = Debug|ARM + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Debug|Win32.ActiveCfg = Debug|Win32 + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Debug|Win32.Build.0 = Debug|Win32 + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Release|ARM.ActiveCfg = Release|ARM + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Release|ARM.Build.0 = Release|ARM + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Release|Win32.ActiveCfg = Release|Win32 + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Release|Win32.Build.0 = Release|Win32 + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Debug|ARM.ActiveCfg = Debug|ARM + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Debug|ARM.Build.0 = Debug|ARM + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Debug|Win32.ActiveCfg = Debug|Win32 + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Debug|Win32.Build.0 = Debug|Win32 + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Release|ARM.ActiveCfg = Release|ARM + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Release|ARM.Build.0 = Release|ARM + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Release|Win32.ActiveCfg = Release|Win32 + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Release|Win32.Build.0 = Release|Win32 + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Debug|ARM.ActiveCfg = Debug|ARM + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Debug|ARM.Build.0 = Debug|ARM + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Debug|Win32.ActiveCfg = Debug|Win32 + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Debug|Win32.Build.0 = Debug|Win32 + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Release|ARM.ActiveCfg = Release|ARM + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Release|ARM.Build.0 = Release|ARM + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Release|Win32.ActiveCfg = Release|Win32 + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/bindings/winrt/tinyWRAP.vcxproj b/branches/2.0/doubango/bindings/winrt/tinyWRAP.vcxproj new file mode 100644 index 00000000..c1939232 --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/tinyWRAP.vcxproj @@ -0,0 +1,204 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {5004ba7e-950d-4d60-a030-29acd38dca08} + tinyWRAP + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + _USRDLL;TINYWRAP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\_common;..\.;..\..\thirdparties\winrt\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinySIP\include;..\..\tinyDAV\include;..\..\tinySDP\include;..\..\tinyMEDIA\include;..\..\tinyXCAP\include;..\..\tinySMS\include;..\..\tinyMSRP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinySIP\tinySIP.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyDAV\tinyDAV.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";"$(SolutionDir)$(Configuration)\tinyXCAP\tinyXCAP.lib";"$(SolutionDir)$(Configuration)\tinySMS\tinySMS.lib";"$(SolutionDir)$(Configuration)\tinyMSRP\tinyMSRP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib" + + + + + _USRDLL;TINYWRAP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\_common;..\.;..\..\thirdparties\winrt\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinySIP\include;..\..\tinyDAV\include;..\..\tinySDP\include;..\..\tinyMEDIA\include;..\..\tinyXCAP\include;..\..\tinySMS\include;..\..\tinyMSRP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinySIP\tinySIP.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyDAV\tinyDAV.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";"$(SolutionDir)$(Configuration)\tinyXCAP\tinyXCAP.lib";"$(SolutionDir)$(Configuration)\tinySMS\tinySMS.lib";"$(SolutionDir)$(Configuration)\tinyMSRP\tinyMSRP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib" + + + + + _USRDLL;TINYWRAP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\_common;..\.;..\..\thirdparties\winrt\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinySIP\include;..\..\tinyDAV\include;..\..\tinySDP\include;..\..\tinyMEDIA\include;..\..\tinyXCAP\include;..\..\tinySMS\include;..\..\tinyMSRP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinySIP\tinySIP.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyDAV\tinyDAV.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";"$(SolutionDir)$(Configuration)\tinyXCAP\tinyXCAP.lib";"$(SolutionDir)$(Configuration)\tinySMS\tinySMS.lib";"$(SolutionDir)$(Configuration)\tinyMSRP\tinyMSRP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib" + + + + + _USRDLL;TINYWRAP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\_common;..\.;..\..\thirdparties\winrt\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinySIP\include;..\..\tinyDAV\include;..\..\tinySDP\include;..\..\tinyMEDIA\include;..\..\tinyXCAP\include;..\..\tinySMS\include;..\..\tinyMSRP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinySIP\tinySIP.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyDAV\tinyDAV.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";"$(SolutionDir)$(Configuration)\tinyXCAP\tinyXCAP.lib";"$(SolutionDir)$(Configuration)\tinySMS\tinySMS.lib";"$(SolutionDir)$(Configuration)\tinyMSRP\tinyMSRP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib" + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/bindings/winrt/tinyWRAP.vcxproj.filters b/branches/2.0/doubango/bindings/winrt/tinyWRAP.vcxproj.filters new file mode 100644 index 00000000..ff9ab44a --- /dev/null +++ b/branches/2.0/doubango/bindings/winrt/tinyWRAP.vcxproj.filters @@ -0,0 +1,139 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {a58a2275-bd4d-4d21-98b1-e3729f6e71ef} + + + {1c6acf3c-a6a2-4eea-9828-1b02bf401bb7} + + + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + \ No newline at end of file diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex.h new file mode 100644 index 00000000..82ba0162 --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex.h @@ -0,0 +1,424 @@ +/* Copyright (C) 2002-2006 Jean-Marc Valin*/ +/** + @file speex.h + @brief Describes the different modes of the codec +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef SPEEX_H +#define SPEEX_H +/** @defgroup Codec Speex encoder and decoder + * This is the Speex codec itself. + * @{ + */ + +#include "speex/speex_bits.h" +#include "speex/speex_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Values allowed for *ctl() requests */ + +/** Set enhancement on/off (decoder only) */ +#define SPEEX_SET_ENH 0 +/** Get enhancement state (decoder only) */ +#define SPEEX_GET_ENH 1 + +/*Would be SPEEX_SET_FRAME_SIZE, but it's (currently) invalid*/ +/** Obtain frame size used by encoder/decoder */ +#define SPEEX_GET_FRAME_SIZE 3 + +/** Set quality value */ +#define SPEEX_SET_QUALITY 4 +/** Get current quality setting */ +/* #define SPEEX_GET_QUALITY 5 -- Doesn't make much sense, does it? */ + +/** Set sub-mode to use */ +#define SPEEX_SET_MODE 6 +/** Get current sub-mode in use */ +#define SPEEX_GET_MODE 7 + +/** Set low-band sub-mode to use (wideband only)*/ +#define SPEEX_SET_LOW_MODE 8 +/** Get current low-band mode in use (wideband only)*/ +#define SPEEX_GET_LOW_MODE 9 + +/** Set high-band sub-mode to use (wideband only)*/ +#define SPEEX_SET_HIGH_MODE 10 +/** Get current high-band mode in use (wideband only)*/ +#define SPEEX_GET_HIGH_MODE 11 + +/** Set VBR on (1) or off (0) */ +#define SPEEX_SET_VBR 12 +/** Get VBR status (1 for on, 0 for off) */ +#define SPEEX_GET_VBR 13 + +/** Set quality value for VBR encoding (0-10) */ +#define SPEEX_SET_VBR_QUALITY 14 +/** Get current quality value for VBR encoding (0-10) */ +#define SPEEX_GET_VBR_QUALITY 15 + +/** Set complexity of the encoder (0-10) */ +#define SPEEX_SET_COMPLEXITY 16 +/** Get current complexity of the encoder (0-10) */ +#define SPEEX_GET_COMPLEXITY 17 + +/** Set bit-rate used by the encoder (or lower) */ +#define SPEEX_SET_BITRATE 18 +/** Get current bit-rate used by the encoder or decoder */ +#define SPEEX_GET_BITRATE 19 + +/** Define a handler function for in-band Speex request*/ +#define SPEEX_SET_HANDLER 20 + +/** Define a handler function for in-band user-defined request*/ +#define SPEEX_SET_USER_HANDLER 22 + +/** Set sampling rate used in bit-rate computation */ +#define SPEEX_SET_SAMPLING_RATE 24 +/** Get sampling rate used in bit-rate computation */ +#define SPEEX_GET_SAMPLING_RATE 25 + +/** Reset the encoder/decoder memories to zero*/ +#define SPEEX_RESET_STATE 26 + +/** Get VBR info (mostly used internally) */ +#define SPEEX_GET_RELATIVE_QUALITY 29 + +/** Set VAD status (1 for on, 0 for off) */ +#define SPEEX_SET_VAD 30 + +/** Get VAD status (1 for on, 0 for off) */ +#define SPEEX_GET_VAD 31 + +/** Set Average Bit-Rate (ABR) to n bits per seconds */ +#define SPEEX_SET_ABR 32 +/** Get Average Bit-Rate (ABR) setting (in bps) */ +#define SPEEX_GET_ABR 33 + +/** Set DTX status (1 for on, 0 for off) */ +#define SPEEX_SET_DTX 34 +/** Get DTX status (1 for on, 0 for off) */ +#define SPEEX_GET_DTX 35 + +/** Set submode encoding in each frame (1 for yes, 0 for no, setting to no breaks the standard) */ +#define SPEEX_SET_SUBMODE_ENCODING 36 +/** Get submode encoding in each frame */ +#define SPEEX_GET_SUBMODE_ENCODING 37 + +/*#define SPEEX_SET_LOOKAHEAD 38*/ +/** Returns the lookahead used by Speex */ +#define SPEEX_GET_LOOKAHEAD 39 + +/** Sets tuning for packet-loss concealment (expected loss rate) */ +#define SPEEX_SET_PLC_TUNING 40 +/** Gets tuning for PLC */ +#define SPEEX_GET_PLC_TUNING 41 + +/** Sets the max bit-rate allowed in VBR mode */ +#define SPEEX_SET_VBR_MAX_BITRATE 42 +/** Gets the max bit-rate allowed in VBR mode */ +#define SPEEX_GET_VBR_MAX_BITRATE 43 + +/** Turn on/off input/output high-pass filtering */ +#define SPEEX_SET_HIGHPASS 44 +/** Get status of input/output high-pass filtering */ +#define SPEEX_GET_HIGHPASS 45 + +/** Get "activity level" of the last decoded frame, i.e. + how much damage we cause if we remove the frame */ +#define SPEEX_GET_ACTIVITY 47 + + +/* Preserving compatibility:*/ +/** Equivalent to SPEEX_SET_ENH */ +#define SPEEX_SET_PF 0 +/** Equivalent to SPEEX_GET_ENH */ +#define SPEEX_GET_PF 1 + + + + +/* Values allowed for mode queries */ +/** Query the frame size of a mode */ +#define SPEEX_MODE_FRAME_SIZE 0 + +/** Query the size of an encoded frame for a particular sub-mode */ +#define SPEEX_SUBMODE_BITS_PER_FRAME 1 + + + +/** Get major Speex version */ +#define SPEEX_LIB_GET_MAJOR_VERSION 1 +/** Get minor Speex version */ +#define SPEEX_LIB_GET_MINOR_VERSION 3 +/** Get micro Speex version */ +#define SPEEX_LIB_GET_MICRO_VERSION 5 +/** Get extra Speex version */ +#define SPEEX_LIB_GET_EXTRA_VERSION 7 +/** Get Speex version string */ +#define SPEEX_LIB_GET_VERSION_STRING 9 + +/*#define SPEEX_LIB_SET_ALLOC_FUNC 10 +#define SPEEX_LIB_GET_ALLOC_FUNC 11 +#define SPEEX_LIB_SET_FREE_FUNC 12 +#define SPEEX_LIB_GET_FREE_FUNC 13 + +#define SPEEX_LIB_SET_WARNING_FUNC 14 +#define SPEEX_LIB_GET_WARNING_FUNC 15 +#define SPEEX_LIB_SET_ERROR_FUNC 16 +#define SPEEX_LIB_GET_ERROR_FUNC 17 +*/ + +/** Number of defined modes in Speex */ +#define SPEEX_NB_MODES 3 + +/** modeID for the defined narrowband mode */ +#define SPEEX_MODEID_NB 0 + +/** modeID for the defined wideband mode */ +#define SPEEX_MODEID_WB 1 + +/** modeID for the defined ultra-wideband mode */ +#define SPEEX_MODEID_UWB 2 + +struct SpeexMode; + + +/* Prototypes for mode function pointers */ + +/** Encoder state initialization function */ +typedef void *(*encoder_init_func)(const struct SpeexMode *mode); + +/** Encoder state destruction function */ +typedef void (*encoder_destroy_func)(void *st); + +/** Main encoding function */ +typedef int (*encode_func)(void *state, void *in, SpeexBits *bits); + +/** Function for controlling the encoder options */ +typedef int (*encoder_ctl_func)(void *state, int request, void *ptr); + +/** Decoder state initialization function */ +typedef void *(*decoder_init_func)(const struct SpeexMode *mode); + +/** Decoder state destruction function */ +typedef void (*decoder_destroy_func)(void *st); + +/** Main decoding function */ +typedef int (*decode_func)(void *state, SpeexBits *bits, void *out); + +/** Function for controlling the decoder options */ +typedef int (*decoder_ctl_func)(void *state, int request, void *ptr); + + +/** Query function for a mode */ +typedef int (*mode_query_func)(const void *mode, int request, void *ptr); + +/** Struct defining a Speex mode */ +typedef struct SpeexMode { + /** Pointer to the low-level mode data */ + const void *mode; + + /** Pointer to the mode query function */ + mode_query_func query; + + /** The name of the mode (you should not rely on this to identify the mode)*/ + const char *modeName; + + /**ID of the mode*/ + int modeID; + + /**Version number of the bitstream (incremented every time we break + bitstream compatibility*/ + int bitstream_version; + + /** Pointer to encoder initialization function */ + encoder_init_func enc_init; + + /** Pointer to encoder destruction function */ + encoder_destroy_func enc_destroy; + + /** Pointer to frame encoding function */ + encode_func enc; + + /** Pointer to decoder initialization function */ + decoder_init_func dec_init; + + /** Pointer to decoder destruction function */ + decoder_destroy_func dec_destroy; + + /** Pointer to frame decoding function */ + decode_func dec; + + /** ioctl-like requests for encoder */ + encoder_ctl_func enc_ctl; + + /** ioctl-like requests for decoder */ + decoder_ctl_func dec_ctl; + +} SpeexMode; + +/** + * Returns a handle to a newly created Speex encoder state structure. For now, + * the "mode" argument can be &nb_mode or &wb_mode . In the future, more modes + * may be added. Note that for now if you have more than one channels to + * encode, you need one state per channel. + * + * @param mode The mode to use (either speex_nb_mode or speex_wb.mode) + * @return A newly created encoder state or NULL if state allocation fails + */ +void *speex_encoder_init(const SpeexMode *mode); + +/** Frees all resources associated to an existing Speex encoder state. + * @param state Encoder state to be destroyed */ +void speex_encoder_destroy(void *state); + +/** Uses an existing encoder state to encode one frame of speech pointed to by + "in". The encoded bit-stream is saved in "bits". + @param state Encoder state + @param in Frame that will be encoded with a +-2^15 range. This data MAY be + overwritten by the encoder and should be considered uninitialised + after the call. + @param bits Bit-stream where the data will be written + @return 0 if frame needs not be transmitted (DTX only), 1 otherwise + */ +int speex_encode(void *state, float *in, SpeexBits *bits); + +/** Uses an existing encoder state to encode one frame of speech pointed to by + "in". The encoded bit-stream is saved in "bits". + @param state Encoder state + @param in Frame that will be encoded with a +-2^15 range + @param bits Bit-stream where the data will be written + @return 0 if frame needs not be transmitted (DTX only), 1 otherwise + */ +int speex_encode_int(void *state, spx_int16_t *in, SpeexBits *bits); + +/** Used like the ioctl function to control the encoder parameters + * + * @param state Encoder state + * @param request ioctl-type request (one of the SPEEX_* macros) + * @param ptr Data exchanged to-from function + * @return 0 if no error, -1 if request in unknown, -2 for invalid parameter + */ +int speex_encoder_ctl(void *state, int request, void *ptr); + + +/** Returns a handle to a newly created decoder state structure. For now, + * the mode argument can be &nb_mode or &wb_mode . In the future, more modes + * may be added. Note that for now if you have more than one channels to + * decode, you need one state per channel. + * + * @param mode Speex mode (one of speex_nb_mode or speex_wb_mode) + * @return A newly created decoder state or NULL if state allocation fails + */ +void *speex_decoder_init(const SpeexMode *mode); + +/** Frees all resources associated to an existing decoder state. + * + * @param state State to be destroyed + */ +void speex_decoder_destroy(void *state); + +/** Uses an existing decoder state to decode one frame of speech from + * bit-stream bits. The output speech is saved written to out. + * + * @param state Decoder state + * @param bits Bit-stream from which to decode the frame (NULL if the packet was lost) + * @param out Where to write the decoded frame + * @return return status (0 for no error, -1 for end of stream, -2 corrupt stream) + */ +int speex_decode(void *state, SpeexBits *bits, float *out); + +/** Uses an existing decoder state to decode one frame of speech from + * bit-stream bits. The output speech is saved written to out. + * + * @param state Decoder state + * @param bits Bit-stream from which to decode the frame (NULL if the packet was lost) + * @param out Where to write the decoded frame + * @return return status (0 for no error, -1 for end of stream, -2 corrupt stream) + */ +int speex_decode_int(void *state, SpeexBits *bits, spx_int16_t *out); + +/** Used like the ioctl function to control the encoder parameters + * + * @param state Decoder state + * @param request ioctl-type request (one of the SPEEX_* macros) + * @param ptr Data exchanged to-from function + * @return 0 if no error, -1 if request in unknown, -2 for invalid parameter + */ +int speex_decoder_ctl(void *state, int request, void *ptr); + + +/** Query function for mode information + * + * @param mode Speex mode + * @param request ioctl-type request (one of the SPEEX_* macros) + * @param ptr Data exchanged to-from function + * @return 0 if no error, -1 if request in unknown, -2 for invalid parameter + */ +int speex_mode_query(const SpeexMode *mode, int request, void *ptr); + +/** Functions for controlling the behavior of libspeex + * @param request ioctl-type request (one of the SPEEX_LIB_* macros) + * @param ptr Data exchanged to-from function + * @return 0 if no error, -1 if request in unknown, -2 for invalid parameter + */ +int speex_lib_ctl(int request, void *ptr); + +/** Default narrowband mode */ +extern const SpeexMode speex_nb_mode; + +/** Default wideband mode */ +extern const SpeexMode speex_wb_mode; + +/** Default "ultra-wideband" mode */ +extern const SpeexMode speex_uwb_mode; + +/** List of all modes available */ +extern const SpeexMode * const speex_mode_list[SPEEX_NB_MODES]; + +/** Obtain one of the modes available */ +const SpeexMode * speex_lib_get_mode (int mode); + +#ifndef WIN32 +/* We actually override the function in the narrowband case so that we can avoid linking in the wideband stuff */ +#define speex_lib_get_mode(mode) ((mode)==SPEEX_MODEID_NB ? &speex_nb_mode : speex_lib_get_mode (mode)) +#endif + +#ifdef __cplusplus +} +#endif + +/** @}*/ +#endif diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_bits.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_bits.h new file mode 100644 index 00000000..a26fb4ce --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_bits.h @@ -0,0 +1,174 @@ +/* Copyright (C) 2002 Jean-Marc Valin */ +/** + @file speex_bits.h + @brief Handles bit packing/unpacking +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef BITS_H +#define BITS_H +/** @defgroup SpeexBits SpeexBits: Bit-stream manipulations + * This is the structure that holds the bit-stream when encoding or decoding + * with Speex. It allows some manipulations as well. + * @{ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** Bit-packing data structure representing (part of) a bit-stream. */ +typedef struct SpeexBits { + char *chars; /**< "raw" data */ + int nbBits; /**< Total number of bits stored in the stream*/ + int charPtr; /**< Position of the byte "cursor" */ + int bitPtr; /**< Position of the bit "cursor" within the current char */ + int owner; /**< Does the struct "own" the "raw" buffer (member "chars") */ + int overflow;/**< Set to one if we try to read past the valid data */ + int buf_size;/**< Allocated size for buffer */ + int reserved1; /**< Reserved for future use */ + void *reserved2; /**< Reserved for future use */ +} SpeexBits; + +/** Initializes and allocates resources for a SpeexBits struct */ +void speex_bits_init(SpeexBits *bits); + +/** Initializes SpeexBits struct using a pre-allocated buffer*/ +void speex_bits_init_buffer(SpeexBits *bits, void *buff, int buf_size); + +/** Sets the bits in a SpeexBits struct to use data from an existing buffer (for decoding without copying data) */ +void speex_bits_set_bit_buffer(SpeexBits *bits, void *buff, int buf_size); + +/** Frees all resources associated to a SpeexBits struct. Right now this does nothing since no resources are allocated, but this could change in the future.*/ +void speex_bits_destroy(SpeexBits *bits); + +/** Resets bits to initial value (just after initialization, erasing content)*/ +void speex_bits_reset(SpeexBits *bits); + +/** Rewind the bit-stream to the beginning (ready for read) without erasing the content */ +void speex_bits_rewind(SpeexBits *bits); + +/** Initializes the bit-stream from the data in an area of memory */ +void speex_bits_read_from(SpeexBits *bits, char *bytes, int len); + +/** Append bytes to the bit-stream + * + * @param bits Bit-stream to operate on + * @param bytes pointer to the bytes what will be appended + * @param len Number of bytes of append + */ +void speex_bits_read_whole_bytes(SpeexBits *bits, char *bytes, int len); + +/** Write the content of a bit-stream to an area of memory + * + * @param bits Bit-stream to operate on + * @param bytes Memory location where to write the bits + * @param max_len Maximum number of bytes to write (i.e. size of the "bytes" buffer) + * @return Number of bytes written to the "bytes" buffer +*/ +int speex_bits_write(SpeexBits *bits, char *bytes, int max_len); + +/** Like speex_bits_write, but writes only the complete bytes in the stream. Also removes the written bytes from the stream */ +int speex_bits_write_whole_bytes(SpeexBits *bits, char *bytes, int max_len); + +/** Append bits to the bit-stream + * @param bits Bit-stream to operate on + * @param data Value to append as integer + * @param nbBits number of bits to consider in "data" + */ +void speex_bits_pack(SpeexBits *bits, int data, int nbBits); + +/** Interpret the next bits in the bit-stream as a signed integer + * + * @param bits Bit-stream to operate on + * @param nbBits Number of bits to interpret + * @return A signed integer represented by the bits read + */ +int speex_bits_unpack_signed(SpeexBits *bits, int nbBits); + +/** Interpret the next bits in the bit-stream as an unsigned integer + * + * @param bits Bit-stream to operate on + * @param nbBits Number of bits to interpret + * @return An unsigned integer represented by the bits read + */ +unsigned int speex_bits_unpack_unsigned(SpeexBits *bits, int nbBits); + +/** Returns the number of bytes in the bit-stream, including the last one even if it is not "full" + * + * @param bits Bit-stream to operate on + * @return Number of bytes in the stream + */ +int speex_bits_nbytes(SpeexBits *bits); + +/** Same as speex_bits_unpack_unsigned, but without modifying the cursor position + * + * @param bits Bit-stream to operate on + * @param nbBits Number of bits to look for + * @return Value of the bits peeked, interpreted as unsigned + */ +unsigned int speex_bits_peek_unsigned(SpeexBits *bits, int nbBits); + +/** Get the value of the next bit in the stream, without modifying the + * "cursor" position + * + * @param bits Bit-stream to operate on + * @return Value of the bit peeked (one bit only) + */ +int speex_bits_peek(SpeexBits *bits); + +/** Advances the position of the "bit cursor" in the stream + * + * @param bits Bit-stream to operate on + * @param n Number of bits to advance + */ +void speex_bits_advance(SpeexBits *bits, int n); + +/** Returns the number of bits remaining to be read in a stream + * + * @param bits Bit-stream to operate on + * @return Number of bits that can still be read from the stream + */ +int speex_bits_remaining(SpeexBits *bits); + +/** Insert a terminator so that the data can be sent as a packet while auto-detecting + * the number of frames in each packet + * + * @param bits Bit-stream to operate on + */ +void speex_bits_insert_terminator(SpeexBits *bits); + +#ifdef __cplusplus +} +#endif + +/* @} */ +#endif diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_buffer.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_buffer.h new file mode 100644 index 00000000..df56f5f1 --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_buffer.h @@ -0,0 +1,68 @@ +/* Copyright (C) 2007 Jean-Marc Valin + + File: speex_buffer.h + This is a very simple ring buffer implementation. It is not thread-safe + so you need to do your own locking. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef SPEEX_BUFFER_H +#define SPEEX_BUFFER_H + +#include "speex/speex_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct SpeexBuffer_; +typedef struct SpeexBuffer_ SpeexBuffer; + +SpeexBuffer *speex_buffer_init(int size); + +void speex_buffer_destroy(SpeexBuffer *st); + +int speex_buffer_write(SpeexBuffer *st, void *data, int len); + +int speex_buffer_writezeros(SpeexBuffer *st, int len); + +int speex_buffer_read(SpeexBuffer *st, void *data, int len); + +int speex_buffer_get_available(SpeexBuffer *st); + +int speex_buffer_resize(SpeexBuffer *st, int len); + +#ifdef __cplusplus +} +#endif + +#endif + + + + diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_callbacks.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_callbacks.h new file mode 100644 index 00000000..6f450b3a --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_callbacks.h @@ -0,0 +1,134 @@ +/* Copyright (C) 2002 Jean-Marc Valin*/ +/** + @file speex_callbacks.h + @brief Describes callback handling and in-band signalling +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef SPEEX_CALLBACKS_H +#define SPEEX_CALLBACKS_H +/** @defgroup SpeexCallbacks Various definitions for Speex callbacks supported by the decoder. + * @{ + */ + +#include "speex.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Total number of callbacks */ +#define SPEEX_MAX_CALLBACKS 16 + +/* Describes all the in-band requests */ + +/*These are 1-bit requests*/ +/** Request for perceptual enhancement (1 for on, 0 for off) */ +#define SPEEX_INBAND_ENH_REQUEST 0 +/** Reserved */ +#define SPEEX_INBAND_RESERVED1 1 + +/*These are 4-bit requests*/ +/** Request for a mode change */ +#define SPEEX_INBAND_MODE_REQUEST 2 +/** Request for a low mode change */ +#define SPEEX_INBAND_LOW_MODE_REQUEST 3 +/** Request for a high mode change */ +#define SPEEX_INBAND_HIGH_MODE_REQUEST 4 +/** Request for VBR (1 on, 0 off) */ +#define SPEEX_INBAND_VBR_QUALITY_REQUEST 5 +/** Request to be sent acknowledge */ +#define SPEEX_INBAND_ACKNOWLEDGE_REQUEST 6 +/** Request for VBR (1 for on, 0 for off) */ +#define SPEEX_INBAND_VBR_REQUEST 7 + +/*These are 8-bit requests*/ +/** Send a character in-band */ +#define SPEEX_INBAND_CHAR 8 +/** Intensity stereo information */ +#define SPEEX_INBAND_STEREO 9 + +/*These are 16-bit requests*/ +/** Transmit max bit-rate allowed */ +#define SPEEX_INBAND_MAX_BITRATE 10 + +/*These are 32-bit requests*/ +/** Acknowledge packet reception */ +#define SPEEX_INBAND_ACKNOWLEDGE 12 + +/** Callback function type */ +typedef int (*speex_callback_func)(SpeexBits *bits, void *state, void *data); + +/** Callback information */ +typedef struct SpeexCallback { + int callback_id; /**< ID associated to the callback */ + speex_callback_func func; /**< Callback handler function */ + void *data; /**< Data that will be sent to the handler */ + void *reserved1; /**< Reserved for future use */ + int reserved2; /**< Reserved for future use */ +} SpeexCallback; + +/** Handle in-band request */ +int speex_inband_handler(SpeexBits *bits, SpeexCallback *callback_list, void *state); + +/** Standard handler for mode request (change mode, no questions asked) */ +int speex_std_mode_request_handler(SpeexBits *bits, void *state, void *data); + +/** Standard handler for high mode request (change high mode, no questions asked) */ +int speex_std_high_mode_request_handler(SpeexBits *bits, void *state, void *data); + +/** Standard handler for in-band characters (write to stderr) */ +int speex_std_char_handler(SpeexBits *bits, void *state, void *data); + +/** Default handler for user-defined requests: in this case, just ignore */ +int speex_default_user_handler(SpeexBits *bits, void *state, void *data); + + + +/** Standard handler for low mode request (change low mode, no questions asked) */ +int speex_std_low_mode_request_handler(SpeexBits *bits, void *state, void *data); + +/** Standard handler for VBR request (Set VBR, no questions asked) */ +int speex_std_vbr_request_handler(SpeexBits *bits, void *state, void *data); + +/** Standard handler for enhancer request (Turn enhancer on/off, no questions asked) */ +int speex_std_enh_request_handler(SpeexBits *bits, void *state, void *data); + +/** Standard handler for VBR quality request (Set VBR quality, no questions asked) */ +int speex_std_vbr_quality_request_handler(SpeexBits *bits, void *state, void *data); + + +#ifdef __cplusplus +} +#endif + +/** @} */ +#endif diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_echo.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_echo.h new file mode 100644 index 00000000..53bcd28a --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_echo.h @@ -0,0 +1,170 @@ +/* Copyright (C) Jean-Marc Valin */ +/** + @file speex_echo.h + @brief Echo cancellation +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef SPEEX_ECHO_H +#define SPEEX_ECHO_H +/** @defgroup SpeexEchoState SpeexEchoState: Acoustic echo canceller + * This is the acoustic echo canceller module. + * @{ + */ +#include "speex/speex_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Obtain frame size used by the AEC */ +#define SPEEX_ECHO_GET_FRAME_SIZE 3 + +/** Set sampling rate */ +#define SPEEX_ECHO_SET_SAMPLING_RATE 24 +/** Get sampling rate */ +#define SPEEX_ECHO_GET_SAMPLING_RATE 25 + +/* Can't set window sizes */ +/** Get size of impulse response (int32) */ +#define SPEEX_ECHO_GET_IMPULSE_RESPONSE_SIZE 27 + +/* Can't set window content */ +/** Get impulse response (int32[]) */ +#define SPEEX_ECHO_GET_IMPULSE_RESPONSE 29 + +/** Internal echo canceller state. Should never be accessed directly. */ +struct SpeexEchoState_; + +/** @class SpeexEchoState + * This holds the state of the echo canceller. You need one per channel. +*/ + +/** Internal echo canceller state. Should never be accessed directly. */ +typedef struct SpeexEchoState_ SpeexEchoState; + +/** Creates a new echo canceller state + * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms) + * @param filter_length Number of samples of echo to cancel (should generally correspond to 100-500 ms) + * @return Newly-created echo canceller state + */ +SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length); + +/** Creates a new multi-channel echo canceller state + * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms) + * @param filter_length Number of samples of echo to cancel (should generally correspond to 100-500 ms) + * @param nb_mic Number of microphone channels + * @param nb_speakers Number of speaker channels + * @return Newly-created echo canceller state + */ +SpeexEchoState *speex_echo_state_init_mc(int frame_size, int filter_length, int nb_mic, int nb_speakers); + +/** Destroys an echo canceller state + * @param st Echo canceller state +*/ +void speex_echo_state_destroy(SpeexEchoState *st); + +/** Performs echo cancellation a frame, based on the audio sent to the speaker (no delay is added + * to playback in this form) + * + * @param st Echo canceller state + * @param rec Signal from the microphone (near end + far end echo) + * @param play Signal played to the speaker (received from far end) + * @param out Returns near-end signal with echo removed + */ +void speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out); + +/** Performs echo cancellation a frame (deprecated) */ +void speex_echo_cancel(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out, spx_int32_t *Yout); + +/** Perform echo cancellation using internal playback buffer, which is delayed by two frames + * to account for the delay introduced by most soundcards (but it could be off!) + * @param st Echo canceller state + * @param rec Signal from the microphone (near end + far end echo) + * @param out Returns near-end signal with echo removed +*/ +void speex_echo_capture(SpeexEchoState *st, const spx_int16_t *rec, spx_int16_t *out); + +/** Let the echo canceller know that a frame was just queued to the soundcard + * @param st Echo canceller state + * @param play Signal played to the speaker (received from far end) +*/ +void speex_echo_playback(SpeexEchoState *st, const spx_int16_t *play); + +/** Reset the echo canceller to its original state + * @param st Echo canceller state + */ +void speex_echo_state_reset(SpeexEchoState *st); + +/** Used like the ioctl function to control the echo canceller parameters + * + * @param st Echo canceller state + * @param request ioctl-type request (one of the SPEEX_ECHO_* macros) + * @param ptr Data exchanged to-from function + * @return 0 if no error, -1 if request in unknown + */ +int speex_echo_ctl(SpeexEchoState *st, int request, void *ptr); + + + +struct SpeexDecorrState_; + +typedef struct SpeexDecorrState_ SpeexDecorrState; + + +/** Create a state for the channel decorrelation algorithm + This is useful for multi-channel echo cancellation only + * @param rate Sampling rate + * @param channels Number of channels (it's a bit pointless if you don't have at least 2) + * @param frame_size Size of the frame to process at ones (counting samples *per* channel) +*/ +SpeexDecorrState *speex_decorrelate_new(int rate, int channels, int frame_size); + +/** Remove correlation between the channels by modifying the phase and possibly + adding noise in a way that is not (or little) perceptible. + * @param st Decorrelator state + * @param in Input audio in interleaved format + * @param out Result of the decorrelation (out *may* alias in) + * @param strength How much alteration of the audio to apply from 0 to 100. +*/ +void speex_decorrelate(SpeexDecorrState *st, const spx_int16_t *in, spx_int16_t *out, int strength); + +/** Destroy a Decorrelation state + * @param st State to destroy +*/ +void speex_decorrelate_destroy(SpeexDecorrState *st); + + +#ifdef __cplusplus +} +#endif + + +/** @}*/ +#endif diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_header.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_header.h new file mode 100644 index 00000000..f85b2496 --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_header.h @@ -0,0 +1,94 @@ +/* Copyright (C) 2002 Jean-Marc Valin */ +/** + @file speex_header.h + @brief Describes the Speex header +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +#ifndef SPEEX_HEADER_H +#define SPEEX_HEADER_H +/** @defgroup SpeexHeader SpeexHeader: Makes it easy to write/parse an Ogg/Speex header + * This is the Speex header for the Ogg encapsulation. You don't need that if you just use RTP. + * @{ + */ + +#include "speex/speex_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct SpeexMode; + +/** Length of the Speex header identifier */ +#define SPEEX_HEADER_STRING_LENGTH 8 + +/** Maximum number of characters for encoding the Speex version number in the header */ +#define SPEEX_HEADER_VERSION_LENGTH 20 + +/** Speex header info for file-based formats */ +typedef struct SpeexHeader { + char speex_string[SPEEX_HEADER_STRING_LENGTH]; /**< Identifies a Speex bit-stream, always set to "Speex " */ + char speex_version[SPEEX_HEADER_VERSION_LENGTH]; /**< Speex version */ + spx_int32_t speex_version_id; /**< Version for Speex (for checking compatibility) */ + spx_int32_t header_size; /**< Total size of the header ( sizeof(SpeexHeader) ) */ + spx_int32_t rate; /**< Sampling rate used */ + spx_int32_t mode; /**< Mode used (0 for narrowband, 1 for wideband) */ + spx_int32_t mode_bitstream_version; /**< Version ID of the bit-stream */ + spx_int32_t nb_channels; /**< Number of channels encoded */ + spx_int32_t bitrate; /**< Bit-rate used */ + spx_int32_t frame_size; /**< Size of frames */ + spx_int32_t vbr; /**< 1 for a VBR encoding, 0 otherwise */ + spx_int32_t frames_per_packet; /**< Number of frames stored per Ogg packet */ + spx_int32_t extra_headers; /**< Number of additional headers after the comments */ + spx_int32_t reserved1; /**< Reserved for future use, must be zero */ + spx_int32_t reserved2; /**< Reserved for future use, must be zero */ +} SpeexHeader; + +/** Initializes a SpeexHeader using basic information */ +void speex_init_header(SpeexHeader *header, int rate, int nb_channels, const struct SpeexMode *m); + +/** Creates the header packet from the header itself (mostly involves endianness conversion) */ +char *speex_header_to_packet(SpeexHeader *header, int *size); + +/** Creates a SpeexHeader from a packet */ +SpeexHeader *speex_packet_to_header(char *packet, int size); + +/** Frees the memory allocated by either speex_header_to_packet() or speex_packet_to_header() */ +void speex_header_free(void *ptr); + +#ifdef __cplusplus +} +#endif + +/** @} */ +#endif diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_jitter.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_jitter.h new file mode 100644 index 00000000..d68674b1 --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_jitter.h @@ -0,0 +1,197 @@ +/* Copyright (C) 2002 Jean-Marc Valin */ +/** + @file speex_jitter.h + @brief Adaptive jitter buffer for Speex +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef SPEEX_JITTER_H +#define SPEEX_JITTER_H +/** @defgroup JitterBuffer JitterBuffer: Adaptive jitter buffer + * This is the jitter buffer that reorders UDP/RTP packets and adjusts the buffer size + * to maintain good quality and low latency. + * @{ + */ + +#include "speex/speex_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Generic adaptive jitter buffer state */ +struct JitterBuffer_; + +/** Generic adaptive jitter buffer state */ +typedef struct JitterBuffer_ JitterBuffer; + +/** Definition of an incoming packet */ +typedef struct _JitterBufferPacket JitterBufferPacket; + +/** Definition of an incoming packet */ +struct _JitterBufferPacket { + char *data; /**< Data bytes contained in the packet */ + spx_uint32_t len; /**< Length of the packet in bytes */ + spx_uint32_t timestamp; /**< Timestamp for the packet */ + spx_uint32_t span; /**< Time covered by the packet (same units as timestamp) */ + spx_uint16_t sequence; /**< RTP Sequence number if available (0 otherwise) */ + spx_uint32_t user_data; /**< Put whatever data you like here (it's ignored by the jitter buffer) */ +}; + +/** Packet has been retrieved */ +#define JITTER_BUFFER_OK 0 +/** Packet is lost or is late */ +#define JITTER_BUFFER_MISSING 1 +/** A "fake" packet is meant to be inserted here to increase buffering */ +#define JITTER_BUFFER_INSERTION 2 +/** There was an error in the jitter buffer */ +#define JITTER_BUFFER_INTERNAL_ERROR -1 +/** Invalid argument */ +#define JITTER_BUFFER_BAD_ARGUMENT -2 + + +/** Set minimum amount of extra buffering required (margin) */ +#define JITTER_BUFFER_SET_MARGIN 0 +/** Get minimum amount of extra buffering required (margin) */ +#define JITTER_BUFFER_GET_MARGIN 1 +/* JITTER_BUFFER_SET_AVAILABLE_COUNT wouldn't make sense */ + +/** Get the amount of available packets currently buffered */ +#define JITTER_BUFFER_GET_AVAILABLE_COUNT 3 +/** Included because of an early misspelling (will remove in next release) */ +#define JITTER_BUFFER_GET_AVALIABLE_COUNT 3 + +/** Assign a function to destroy unused packet. When setting that, the jitter + buffer no longer copies packet data. */ +#define JITTER_BUFFER_SET_DESTROY_CALLBACK 4 +/** */ +#define JITTER_BUFFER_GET_DESTROY_CALLBACK 5 + +/** Tell the jitter buffer to only adjust the delay in multiples of the step parameter provided */ +#define JITTER_BUFFER_SET_DELAY_STEP 6 +/** */ +#define JITTER_BUFFER_GET_DELAY_STEP 7 + +/** Tell the jitter buffer to only do concealment in multiples of the size parameter provided */ +#define JITTER_BUFFER_SET_CONCEALMENT_SIZE 8 +#define JITTER_BUFFER_GET_CONCEALMENT_SIZE 9 + +/** Absolute max amount of loss that can be tolerated regardless of the delay. Typical loss + should be half of that or less. */ +#define JITTER_BUFFER_SET_MAX_LATE_RATE 10 +#define JITTER_BUFFER_GET_MAX_LATE_RATE 11 + +/** Equivalent cost of one percent late packet in timestamp units */ +#define JITTER_BUFFER_SET_LATE_COST 12 +#define JITTER_BUFFER_GET_LATE_COST 13 + + +/** Initialises jitter buffer + * + * @param step_size Starting value for the size of concleanment packets and delay + adjustment steps. Can be changed at any time using JITTER_BUFFER_SET_DELAY_STEP + and JITTER_BUFFER_GET_CONCEALMENT_SIZE. + * @return Newly created jitter buffer state + */ +JitterBuffer *jitter_buffer_init(int step_size); + +/** Restores jitter buffer to its original state + * + * @param jitter Jitter buffer state + */ +void jitter_buffer_reset(JitterBuffer *jitter); + +/** Destroys jitter buffer + * + * @param jitter Jitter buffer state + */ +void jitter_buffer_destroy(JitterBuffer *jitter); + +/** Put one packet into the jitter buffer + * + * @param jitter Jitter buffer state + * @param packet Incoming packet +*/ +void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPacket *packet); + +/** Get one packet from the jitter buffer + * + * @param jitter Jitter buffer state + * @param packet Returned packet + * @param desired_span Number of samples (or units) we wish to get from the buffer (no guarantee) + * @param current_timestamp Timestamp for the returned packet +*/ +int jitter_buffer_get(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t desired_span, spx_int32_t *start_offset); + +/** Used right after jitter_buffer_get() to obtain another packet that would have the same timestamp. + * This is mainly useful for media where a single "frame" can be split into several packets. + * + * @param jitter Jitter buffer state + * @param packet Returned packet + */ +int jitter_buffer_get_another(JitterBuffer *jitter, JitterBufferPacket *packet); + +/** Get pointer timestamp of jitter buffer + * + * @param jitter Jitter buffer state +*/ +int jitter_buffer_get_pointer_timestamp(JitterBuffer *jitter); + +/** Advance by one tick + * + * @param jitter Jitter buffer state +*/ +void jitter_buffer_tick(JitterBuffer *jitter); + +/** Telling the jitter buffer about the remaining data in the application buffer + * @param jitter Jitter buffer state + * @param rem Amount of data buffered by the application (timestamp units) + */ +void jitter_buffer_remaining_span(JitterBuffer *jitter, spx_uint32_t rem); + +/** Used like the ioctl function to control the jitter buffer parameters + * + * @param jitter Jitter buffer state + * @param request ioctl-type request (one of the JITTER_BUFFER_* macros) + * @param ptr Data exchanged to-from function + * @return 0 if no error, -1 if request in unknown +*/ +int jitter_buffer_ctl(JitterBuffer *jitter, int request, void *ptr); + +int jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset); + +/* @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_preprocess.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_preprocess.h new file mode 100644 index 00000000..f8eef2cd --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_preprocess.h @@ -0,0 +1,219 @@ +/* Copyright (C) 2003 Epic Games + Written by Jean-Marc Valin */ +/** + * @file speex_preprocess.h + * @brief Speex preprocessor. The preprocess can do noise suppression, + * residual echo suppression (after using the echo canceller), automatic + * gain control (AGC) and voice activity detection (VAD). +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef SPEEX_PREPROCESS_H +#define SPEEX_PREPROCESS_H +/** @defgroup SpeexPreprocessState SpeexPreprocessState: The Speex preprocessor + * This is the Speex preprocessor. The preprocess can do noise suppression, + * residual echo suppression (after using the echo canceller), automatic + * gain control (AGC) and voice activity detection (VAD). + * @{ + */ + +#include "speex/speex_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** State of the preprocessor (one per channel). Should never be accessed directly. */ +struct SpeexPreprocessState_; + +/** State of the preprocessor (one per channel). Should never be accessed directly. */ +typedef struct SpeexPreprocessState_ SpeexPreprocessState; + + +/** Creates a new preprocessing state. You MUST create one state per channel processed. + * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms). Must be + * the same value as that used for the echo canceller for residual echo cancellation to work. + * @param sampling_rate Sampling rate used for the input. + * @return Newly created preprocessor state +*/ +SpeexPreprocessState *speex_preprocess_state_init(int frame_size, int sampling_rate); + +/** Destroys a preprocessor state + * @param st Preprocessor state to destroy +*/ +void speex_preprocess_state_destroy(SpeexPreprocessState *st); + +/** Preprocess a frame + * @param st Preprocessor state + * @param x Audio sample vector (in and out). Must be same size as specified in speex_preprocess_state_init(). + * @return Bool value for voice activity (1 for speech, 0 for noise/silence), ONLY if VAD turned on. +*/ +int speex_preprocess_run(SpeexPreprocessState *st, spx_int16_t *x); + +/** Preprocess a frame (deprecated, use speex_preprocess_run() instead)*/ +int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo); + +/** Update preprocessor state, but do not compute the output + * @param st Preprocessor state + * @param x Audio sample vector (in only). Must be same size as specified in speex_preprocess_state_init(). +*/ +void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x); + +/** Used like the ioctl function to control the preprocessor parameters + * @param st Preprocessor state + * @param request ioctl-type request (one of the SPEEX_PREPROCESS_* macros) + * @param ptr Data exchanged to-from function + * @return 0 if no error, -1 if request in unknown +*/ +int speex_preprocess_ctl(SpeexPreprocessState *st, int request, void *ptr); + + + +/** Set preprocessor denoiser state */ +#define SPEEX_PREPROCESS_SET_DENOISE 0 +/** Get preprocessor denoiser state */ +#define SPEEX_PREPROCESS_GET_DENOISE 1 + +/** Set preprocessor Automatic Gain Control state */ +#define SPEEX_PREPROCESS_SET_AGC 2 +/** Get preprocessor Automatic Gain Control state */ +#define SPEEX_PREPROCESS_GET_AGC 3 + +/** Set preprocessor Voice Activity Detection state */ +#define SPEEX_PREPROCESS_SET_VAD 4 +/** Get preprocessor Voice Activity Detection state */ +#define SPEEX_PREPROCESS_GET_VAD 5 + +/** Set preprocessor Automatic Gain Control level (float) */ +#define SPEEX_PREPROCESS_SET_AGC_LEVEL 6 +/** Get preprocessor Automatic Gain Control level (float) */ +#define SPEEX_PREPROCESS_GET_AGC_LEVEL 7 + +/** Set preprocessor dereverb state */ +#define SPEEX_PREPROCESS_SET_DEREVERB 8 +/** Get preprocessor dereverb state */ +#define SPEEX_PREPROCESS_GET_DEREVERB 9 + +/** Set preprocessor dereverb level */ +#define SPEEX_PREPROCESS_SET_DEREVERB_LEVEL 10 +/** Get preprocessor dereverb level */ +#define SPEEX_PREPROCESS_GET_DEREVERB_LEVEL 11 + +/** Set preprocessor dereverb decay */ +#define SPEEX_PREPROCESS_SET_DEREVERB_DECAY 12 +/** Get preprocessor dereverb decay */ +#define SPEEX_PREPROCESS_GET_DEREVERB_DECAY 13 + +/** Set probability required for the VAD to go from silence to voice */ +#define SPEEX_PREPROCESS_SET_PROB_START 14 +/** Get probability required for the VAD to go from silence to voice */ +#define SPEEX_PREPROCESS_GET_PROB_START 15 + +/** Set probability required for the VAD to stay in the voice state (integer percent) */ +#define SPEEX_PREPROCESS_SET_PROB_CONTINUE 16 +/** Get probability required for the VAD to stay in the voice state (integer percent) */ +#define SPEEX_PREPROCESS_GET_PROB_CONTINUE 17 + +/** Set maximum attenuation of the noise in dB (negative number) */ +#define SPEEX_PREPROCESS_SET_NOISE_SUPPRESS 18 +/** Get maximum attenuation of the noise in dB (negative number) */ +#define SPEEX_PREPROCESS_GET_NOISE_SUPPRESS 19 + +/** Set maximum attenuation of the residual echo in dB (negative number) */ +#define SPEEX_PREPROCESS_SET_ECHO_SUPPRESS 20 +/** Get maximum attenuation of the residual echo in dB (negative number) */ +#define SPEEX_PREPROCESS_GET_ECHO_SUPPRESS 21 + +/** Set maximum attenuation of the residual echo in dB when near end is active (negative number) */ +#define SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE 22 +/** Get maximum attenuation of the residual echo in dB when near end is active (negative number) */ +#define SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE 23 + +/** Set the corresponding echo canceller state so that residual echo suppression can be performed (NULL for no residual echo suppression) */ +#define SPEEX_PREPROCESS_SET_ECHO_STATE 24 +/** Get the corresponding echo canceller state */ +#define SPEEX_PREPROCESS_GET_ECHO_STATE 25 + +/** Set maximal gain increase in dB/second (int32) */ +#define SPEEX_PREPROCESS_SET_AGC_INCREMENT 26 + +/** Get maximal gain increase in dB/second (int32) */ +#define SPEEX_PREPROCESS_GET_AGC_INCREMENT 27 + +/** Set maximal gain decrease in dB/second (int32) */ +#define SPEEX_PREPROCESS_SET_AGC_DECREMENT 28 + +/** Get maximal gain decrease in dB/second (int32) */ +#define SPEEX_PREPROCESS_GET_AGC_DECREMENT 29 + +/** Set maximal gain in dB (int32) */ +#define SPEEX_PREPROCESS_SET_AGC_MAX_GAIN 30 + +/** Get maximal gain in dB (int32) */ +#define SPEEX_PREPROCESS_GET_AGC_MAX_GAIN 31 + +/* Can't set loudness */ +/** Get loudness */ +#define SPEEX_PREPROCESS_GET_AGC_LOUDNESS 33 + +/* Can't set gain */ +/** Get current gain (int32 percent) */ +#define SPEEX_PREPROCESS_GET_AGC_GAIN 35 + +/* Can't set spectrum size */ +/** Get spectrum size for power spectrum (int32) */ +#define SPEEX_PREPROCESS_GET_PSD_SIZE 37 + +/* Can't set power spectrum */ +/** Get power spectrum (int32[] of squared values) */ +#define SPEEX_PREPROCESS_GET_PSD 39 + +/* Can't set noise size */ +/** Get spectrum size for noise estimate (int32) */ +#define SPEEX_PREPROCESS_GET_NOISE_PSD_SIZE 41 + +/* Can't set noise estimate */ +/** Get noise estimate (int32[] of squared values) */ +#define SPEEX_PREPROCESS_GET_NOISE_PSD 43 + +/* Can't set speech probability */ +/** Get speech probability in last frame (int32). */ +#define SPEEX_PREPROCESS_GET_PROB 45 + +/** Set preprocessor Automatic Gain Control level (int32) */ +#define SPEEX_PREPROCESS_SET_AGC_TARGET 46 +/** Get preprocessor Automatic Gain Control level (int32) */ +#define SPEEX_PREPROCESS_GET_AGC_TARGET 47 + +#ifdef __cplusplus +} +#endif + +/** @}*/ +#endif diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_resampler.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_resampler.h new file mode 100644 index 00000000..54eef8d7 --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_resampler.h @@ -0,0 +1,340 @@ +/* Copyright (C) 2007 Jean-Marc Valin + + File: speex_resampler.h + Resampling code + + The design goals of this code are: + - Very fast algorithm + - Low memory requirement + - Good *perceptual* quality (and not best SNR) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifndef SPEEX_RESAMPLER_H +#define SPEEX_RESAMPLER_H + +#ifdef OUTSIDE_SPEEX + +/********* WARNING: MENTAL SANITY ENDS HERE *************/ + +/* If the resampler is defined outside of Speex, we change the symbol names so that + there won't be any clash if linking with Speex later on. */ + +/* #define RANDOM_PREFIX your software name here */ +#ifndef RANDOM_PREFIX +#error "Please define RANDOM_PREFIX (above) to something specific to your project to prevent symbol name clashes" +#endif + +#define CAT_PREFIX2(a,b) a ## b +#define CAT_PREFIX(a,b) CAT_PREFIX2(a, b) + +#define speex_resampler_init CAT_PREFIX(RANDOM_PREFIX,_resampler_init) +#define speex_resampler_init_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_init_frac) +#define speex_resampler_destroy CAT_PREFIX(RANDOM_PREFIX,_resampler_destroy) +#define speex_resampler_process_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_float) +#define speex_resampler_process_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_int) +#define speex_resampler_process_interleaved_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_float) +#define speex_resampler_process_interleaved_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_int) +#define speex_resampler_set_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate) +#define speex_resampler_get_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_get_rate) +#define speex_resampler_set_rate_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate_frac) +#define speex_resampler_get_ratio CAT_PREFIX(RANDOM_PREFIX,_resampler_get_ratio) +#define speex_resampler_set_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_set_quality) +#define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality) +#define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride) +#define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride) +#define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride) +#define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride) +#define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency) +#define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency) +#define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros) +#define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem) +#define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror) + +#define spx_int16_t short +#define spx_int32_t int +#define spx_uint16_t unsigned short +#define spx_uint32_t unsigned int + +#else /* OUTSIDE_SPEEX */ + +#include "speex/speex_types.h" + +#endif /* OUTSIDE_SPEEX */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define SPEEX_RESAMPLER_QUALITY_MAX 10 +#define SPEEX_RESAMPLER_QUALITY_MIN 0 +#define SPEEX_RESAMPLER_QUALITY_DEFAULT 4 +#define SPEEX_RESAMPLER_QUALITY_VOIP 3 +#define SPEEX_RESAMPLER_QUALITY_DESKTOP 5 + +enum { + RESAMPLER_ERR_SUCCESS = 0, + RESAMPLER_ERR_ALLOC_FAILED = 1, + RESAMPLER_ERR_BAD_STATE = 2, + RESAMPLER_ERR_INVALID_ARG = 3, + RESAMPLER_ERR_PTR_OVERLAP = 4, + + RESAMPLER_ERR_MAX_ERROR +}; + +struct SpeexResamplerState_; +typedef struct SpeexResamplerState_ SpeexResamplerState; + +/** Create a new resampler with integer input and output rates. + * @param nb_channels Number of channels to be processed + * @param in_rate Input sampling rate (integer number of Hz). + * @param out_rate Output sampling rate (integer number of Hz). + * @param quality Resampling quality between 0 and 10, where 0 has poor quality + * and 10 has very high quality. + * @return Newly created resampler state + * @retval NULL Error: not enough memory + */ +SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, + spx_uint32_t in_rate, + spx_uint32_t out_rate, + int quality, + int *err); + +/** Create a new resampler with fractional input/output rates. The sampling + * rate ratio is an arbitrary rational number with both the numerator and + * denominator being 32-bit integers. + * @param nb_channels Number of channels to be processed + * @param ratio_num Numerator of the sampling rate ratio + * @param ratio_den Denominator of the sampling rate ratio + * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). + * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). + * @param quality Resampling quality between 0 and 10, where 0 has poor quality + * and 10 has very high quality. + * @return Newly created resampler state + * @retval NULL Error: not enough memory + */ +SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, + spx_uint32_t ratio_num, + spx_uint32_t ratio_den, + spx_uint32_t in_rate, + spx_uint32_t out_rate, + int quality, + int *err); + +/** Destroy a resampler state. + * @param st Resampler state + */ +void speex_resampler_destroy(SpeexResamplerState *st); + +/** Resample a float array. The input and output buffers must *not* overlap. + * @param st Resampler state + * @param channel_index Index of the channel to process for the multi-channel + * base (0 otherwise) + * @param in Input buffer + * @param in_len Number of input samples in the input buffer. Returns the + * number of samples processed + * @param out Output buffer + * @param out_len Size of the output buffer. Returns the number of samples written + */ +int speex_resampler_process_float(SpeexResamplerState *st, + spx_uint32_t channel_index, + const float *in, + spx_uint32_t *in_len, + float *out, + spx_uint32_t *out_len); + +/** Resample an int array. The input and output buffers must *not* overlap. + * @param st Resampler state + * @param channel_index Index of the channel to process for the multi-channel + * base (0 otherwise) + * @param in Input buffer + * @param in_len Number of input samples in the input buffer. Returns the number + * of samples processed + * @param out Output buffer + * @param out_len Size of the output buffer. Returns the number of samples written + */ +int speex_resampler_process_int(SpeexResamplerState *st, + spx_uint32_t channel_index, + const spx_int16_t *in, + spx_uint32_t *in_len, + spx_int16_t *out, + spx_uint32_t *out_len); + +/** Resample an interleaved float array. The input and output buffers must *not* overlap. + * @param st Resampler state + * @param in Input buffer + * @param in_len Number of input samples in the input buffer. Returns the number + * of samples processed. This is all per-channel. + * @param out Output buffer + * @param out_len Size of the output buffer. Returns the number of samples written. + * This is all per-channel. + */ +int speex_resampler_process_interleaved_float(SpeexResamplerState *st, + const float *in, + spx_uint32_t *in_len, + float *out, + spx_uint32_t *out_len); + +/** Resample an interleaved int array. The input and output buffers must *not* overlap. + * @param st Resampler state + * @param in Input buffer + * @param in_len Number of input samples in the input buffer. Returns the number + * of samples processed. This is all per-channel. + * @param out Output buffer + * @param out_len Size of the output buffer. Returns the number of samples written. + * This is all per-channel. + */ +int speex_resampler_process_interleaved_int(SpeexResamplerState *st, + const spx_int16_t *in, + spx_uint32_t *in_len, + spx_int16_t *out, + spx_uint32_t *out_len); + +/** Set (change) the input/output sampling rates (integer value). + * @param st Resampler state + * @param in_rate Input sampling rate (integer number of Hz). + * @param out_rate Output sampling rate (integer number of Hz). + */ +int speex_resampler_set_rate(SpeexResamplerState *st, + spx_uint32_t in_rate, + spx_uint32_t out_rate); + +/** Get the current input/output sampling rates (integer value). + * @param st Resampler state + * @param in_rate Input sampling rate (integer number of Hz) copied. + * @param out_rate Output sampling rate (integer number of Hz) copied. + */ +void speex_resampler_get_rate(SpeexResamplerState *st, + spx_uint32_t *in_rate, + spx_uint32_t *out_rate); + +/** Set (change) the input/output sampling rates and resampling ratio + * (fractional values in Hz supported). + * @param st Resampler state + * @param ratio_num Numerator of the sampling rate ratio + * @param ratio_den Denominator of the sampling rate ratio + * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). + * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). + */ +int speex_resampler_set_rate_frac(SpeexResamplerState *st, + spx_uint32_t ratio_num, + spx_uint32_t ratio_den, + spx_uint32_t in_rate, + spx_uint32_t out_rate); + +/** Get the current resampling ratio. This will be reduced to the least + * common denominator. + * @param st Resampler state + * @param ratio_num Numerator of the sampling rate ratio copied + * @param ratio_den Denominator of the sampling rate ratio copied + */ +void speex_resampler_get_ratio(SpeexResamplerState *st, + spx_uint32_t *ratio_num, + spx_uint32_t *ratio_den); + +/** Set (change) the conversion quality. + * @param st Resampler state + * @param quality Resampling quality between 0 and 10, where 0 has poor + * quality and 10 has very high quality. + */ +int speex_resampler_set_quality(SpeexResamplerState *st, + int quality); + +/** Get the conversion quality. + * @param st Resampler state + * @param quality Resampling quality between 0 and 10, where 0 has poor + * quality and 10 has very high quality. + */ +void speex_resampler_get_quality(SpeexResamplerState *st, + int *quality); + +/** Set (change) the input stride. + * @param st Resampler state + * @param stride Input stride + */ +void speex_resampler_set_input_stride(SpeexResamplerState *st, + spx_uint32_t stride); + +/** Get the input stride. + * @param st Resampler state + * @param stride Input stride copied + */ +void speex_resampler_get_input_stride(SpeexResamplerState *st, + spx_uint32_t *stride); + +/** Set (change) the output stride. + * @param st Resampler state + * @param stride Output stride + */ +void speex_resampler_set_output_stride(SpeexResamplerState *st, + spx_uint32_t stride); + +/** Get the output stride. + * @param st Resampler state copied + * @param stride Output stride + */ +void speex_resampler_get_output_stride(SpeexResamplerState *st, + spx_uint32_t *stride); + +/** Get the latency in input samples introduced by the resampler. + * @param st Resampler state + */ +int speex_resampler_get_input_latency(SpeexResamplerState *st); + +/** Get the latency in output samples introduced by the resampler. + * @param st Resampler state + */ +int speex_resampler_get_output_latency(SpeexResamplerState *st); + +/** Make sure that the first samples to go out of the resamplers don't have + * leading zeros. This is only useful before starting to use a newly created + * resampler. It is recommended to use that when resampling an audio file, as + * it will generate a file with the same length. For real-time processing, + * it is probably easier not to use this call (so that the output duration + * is the same for the first frame). + * @param st Resampler state + */ +int speex_resampler_skip_zeros(SpeexResamplerState *st); + +/** Reset a resampler so a new (unrelated) stream can be processed. + * @param st Resampler state + */ +int speex_resampler_reset_mem(SpeexResamplerState *st); + +/** Returns the English meaning for an error code + * @param err Error code + * @return English string + */ +const char *speex_resampler_strerror(int err); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_stereo.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_stereo.h new file mode 100644 index 00000000..a259713b --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_stereo.h @@ -0,0 +1,91 @@ +/* Copyright (C) 2002 Jean-Marc Valin*/ +/** + @file speex_stereo.h + @brief Describes the handling for intensity stereo +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef STEREO_H +#define STEREO_H +/** @defgroup SpeexStereoState SpeexStereoState: Handling Speex stereo files + * This describes the Speex intensity stereo encoding/decoding + * @{ + */ + +#include "speex/speex_types.h" +#include "speex/speex_bits.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** If you access any of these fields directly, I'll personally come and bite you */ +typedef struct SpeexStereoState { + float balance; /**< Left/right balance info */ + float e_ratio; /**< Ratio of energies: E(left+right)/[E(left)+E(right)] */ + float smooth_left; /**< Smoothed left channel gain */ + float smooth_right; /**< Smoothed right channel gain */ + float reserved1; /**< Reserved for future use */ + float reserved2; /**< Reserved for future use */ +} SpeexStereoState; + +/** Deprecated. Use speex_stereo_state_init() instead. */ +#define SPEEX_STEREO_STATE_INIT {1,.5,1,1,0,0} + +/** Initialise/create a stereo stereo state */ +SpeexStereoState *speex_stereo_state_init(); + +/** Reset/re-initialise an already allocated stereo state */ +void speex_stereo_state_reset(SpeexStereoState *stereo); + +/** Destroy a stereo stereo state */ +void speex_stereo_state_destroy(SpeexStereoState *stereo); + +/** Transforms a stereo frame into a mono frame and stores intensity stereo info in 'bits' */ +void speex_encode_stereo(float *data, int frame_size, SpeexBits *bits); + +/** Transforms a stereo frame into a mono frame and stores intensity stereo info in 'bits' */ +void speex_encode_stereo_int(spx_int16_t *data, int frame_size, SpeexBits *bits); + +/** Transforms a mono frame into a stereo frame using intensity stereo info */ +void speex_decode_stereo(float *data, int frame_size, SpeexStereoState *stereo); + +/** Transforms a mono frame into a stereo frame using intensity stereo info */ +void speex_decode_stereo_int(spx_int16_t *data, int frame_size, SpeexStereoState *stereo); + +/** Callback handler for intensity stereo info */ +int speex_std_stereo_request_handler(SpeexBits *bits, void *state, void *data); + +#ifdef __cplusplus +} +#endif + +/** @} */ +#endif diff --git a/branches/2.0/doubango/thirdparties/common/include/speex/speex_types.h b/branches/2.0/doubango/thirdparties/common/include/speex/speex_types.h new file mode 100644 index 00000000..852fed80 --- /dev/null +++ b/branches/2.0/doubango/thirdparties/common/include/speex/speex_types.h @@ -0,0 +1,126 @@ +/* speex_types.h taken from libogg */ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + last mod: $Id: os_types.h 7524 2004-08-11 04:20:36Z conrad $ + + ********************************************************************/ +/** + @file speex_types.h + @brief Speex types +*/ +#ifndef _SPEEX_TYPES_H +#define _SPEEX_TYPES_H + +#if defined(_WIN32) + +# if defined(__CYGWIN__) +# include <_G_config.h> + typedef _G_int32_t spx_int32_t; + typedef _G_uint32_t spx_uint32_t; + typedef _G_int16_t spx_int16_t; + typedef _G_uint16_t spx_uint16_t; +# elif defined(__MINGW32__) + typedef short spx_int16_t; + typedef unsigned short spx_uint16_t; + typedef int spx_int32_t; + typedef unsigned int spx_uint32_t; +# elif defined(__MWERKS__) + typedef int spx_int32_t; + typedef unsigned int spx_uint32_t; + typedef short spx_int16_t; + typedef unsigned short spx_uint16_t; +# else + /* MSVC/Borland */ + typedef __int32 spx_int32_t; + typedef unsigned __int32 spx_uint32_t; + typedef __int16 spx_int16_t; + typedef unsigned __int16 spx_uint16_t; +# endif + +#elif defined(__MACOS__) + +# include + typedef SInt16 spx_int16_t; + typedef UInt16 spx_uint16_t; + typedef SInt32 spx_int32_t; + typedef UInt32 spx_uint32_t; + +#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ + +# include + typedef int16_t spx_int16_t; + typedef u_int16_t spx_uint16_t; + typedef int32_t spx_int32_t; + typedef u_int32_t spx_uint32_t; + +#elif defined(__BEOS__) + + /* Be */ +# include + typedef int16_t spx_int16_t; + typedef u_int16_t spx_uint16_t; + typedef int32_t spx_int32_t; + typedef u_int32_t spx_uint32_t; + +#elif defined (__EMX__) + + /* OS/2 GCC */ + typedef short spx_int16_t; + typedef unsigned short spx_uint16_t; + typedef int spx_int32_t; + typedef unsigned int spx_uint32_t; + +#elif defined (DJGPP) + + /* DJGPP */ + typedef short spx_int16_t; + typedef int spx_int32_t; + typedef unsigned int spx_uint32_t; + +#elif defined(R5900) + + /* PS2 EE */ + typedef int spx_int32_t; + typedef unsigned spx_uint32_t; + typedef short spx_int16_t; + +#elif defined(__SYMBIAN32__) + + /* Symbian GCC */ + typedef signed short spx_int16_t; + typedef unsigned short spx_uint16_t; + typedef signed int spx_int32_t; + typedef unsigned int spx_uint32_t; + +#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) + + typedef short spx_int16_t; + typedef unsigned short spx_uint16_t; + typedef long spx_int32_t; + typedef unsigned long spx_uint32_t; + +#elif defined(CONFIG_TI_C6X) + + typedef short spx_int16_t; + typedef unsigned short spx_uint16_t; + typedef int spx_int32_t; + typedef unsigned int spx_uint32_t; + +#else + +# include + +#endif + +#endif /* _SPEEX_TYPES_H */ diff --git a/branches/2.0/doubango/thirdparties/winrt/lib/arm/libspeex.lib b/branches/2.0/doubango/thirdparties/winrt/lib/arm/libspeex.lib new file mode 100644 index 0000000000000000000000000000000000000000..0478acbcaddcaaaced987a9a7b0e193a74e64517 GIT binary patch literal 615656 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

#{hJih~!@3j;3C!nute3!=G1g!=B31}VYF?~M_ z?IEAz;YbajRENg*8=&zd&?{gc1&VDgexJTysPCT-`g7oyYJ8T)Ye269ewD_r*0>*Z zA@GG7U!w6Q(8a)4Xndu{?*d&4{2q<3)%bm&Hv;FD9fo(a#V5M7qO6_!u9%L05vlukphgKL+}1;C)b5D37us@`FIvz&=>x$m@b5 zZyW1?j{;o}iZqnxkalwaQqbQ5F9qEI>eu%XM{<7&=mWs!vtv^Qdl48pkHI;`a|PR_ zIgil{u28V|G^dWRo+22!qXsz-73>=Yf_uO^ z2{sh}6S#?jRca23@xe_H>mhof7-oi5lq&3Qz{65ELw&RFy4ILKix+88F- z^P2M*taF)DVvN@`=P~wzOBHON<~#=L-W0(Cn)4W6fEyy%zcuGEB2mXA3l^<8k8vWn z(**0MIgc?I++e{{H0Lo!f;&~PF`Dxj6TuAt9-|aol3+75=P@n^ zmnhg=&3O#g;a;kAc7VVostD0`&jNQu8SvdQ1ty(y#Y(K3H))T$$8@dM4I zA^Gv%$Q2`t=NA9*P+sKb;-keJZ>N$jL`ahq)Ju+1&Z@4jq%n;#)ts^z0#U*@nEeKIMc2e9QvV!k>A5v#d2 zZa$P3(``>TeDO3#U>-~C|J?hVLzq2C>D|2Hh-n%_V)mMcBEwf2H^xtxc$YEulI(bM z%-HiH#zkZqL$JbN<3IKogMN>-2t%69)y-{@EzNDw{)l^;+xo2OdN*D6;QMGKzLe7a zE{7Hwc%~@|IF3`?*cJD%!eFEFovsz+y}!5H-H~{H&>E&ECJu&mX*QG2X&dM@GatzP z5-TLOz_;k;s5^VCG}Ra2CIeKy|2F039oxIQ^`}wi9>&Qmi5rY1n2*`swsINMr@77W z8-u##Z*N!rwHPjkj~Uu)s2)vX14R=1vgXkY7Dd-k>FHDMO<70gn7 z`88sTd9w|$n@ zUt@l%M>6JfSGV>{I2!QaaF5iDOIlMB{DJO0wzm#V;Crra?UkC0nNNf}bph}tt;14? zR~kTII~`A?ZQS0rW7!g{Ipdw}SRayxc-e*=vU6F_P0xNB%N-BDMA5wI_p^I#z2@X) zgTZfjH{tV~sJ8}=!@322ZZL*S|0u_J>aw#9|C~I-_%bg6mztFt-wDAcpJ*&O=}T+!c`t1R^0DAcFbf?aEK?1?LE6S!JDrB=m2OiUFJH8*v$ za37j$l6rph)xK{&+V>5rQ&}fJ3wO>8nX%#w9K%GKdYl<6^`)z-rb_KC8lij*{rCMh zSI&L=q?98#-%Hs2X>LrqbNtVBxEwAw;=*b>uD~mjZHfuF!SS=Y(NKc9iZ&@zXbX<=*ytd$ak-RCV=h)Wp4^SUq5@1uYw}i7=HmR z1Vuks4m8;XS_=Ccpw*yQDd4{v^i5F2k?|Jj3edlSuG023+P(pF5Aa7p_ktqqMl&eF zV(bHb7xX>QPeJ#Ceg^shC}$Hs0*wVd2-*kqV^H>+KLH&Cik`TCC@7xw7lNWc?!O51 zFlaI85zuPTqo7RVW1tH`+dw%3{sky!8)#>Vr=7D3UxKdD_WQJb59n9GKL`C9l>N$Y zK(j!R#r)$yO;C>hyMZnQMQiI{1?mCi=({)QP>5IJ9n~n3oX408jPV&GJ37dDj77kH zE*NtNIkk`DD#7jmM$Tib1$U)j%pv4Fav<1z!5#-j&SPu^$MIB*u}yOx<1gUm3HFBO zJaWkJT*3AOBj+(%!8HnYL~|ZF#;rjx1OMba-18+$q+__-OE?erYjMvD{2ib zN5)A1o*a74_*e0=NON4((S{zUw+Gj#53KyC`n9&`H7_2@kK_ukU*wyaSlgAxR!*&{ zm^;Aqn!{4Cl4=xIppQt{jWtu#+PrBEj~uApkFP|2tZMUzaYYr^sbSr*jRFf$Xs< zT&cOcZFwyF5OmvwOJV`j&4b$FJkvm3n5o^%ltpk2R@_ z%+S%|O<8}z+Ricz|0G!Y;9_k^^LeoA z40JfHpyNTig3i$PO3+BymuUM7`ZXqQ=HtT9^jjW=wv z$_-XDcfbEoc+|Q>QQ=)~=Zedo`4d0)ma+tGOS?Tc{8wRjn9bn5*xTU6_t2)@C|T%< z;yZh6ikZ0$HuO`YmInOj=f1$z5dEZY`wsUQw#?p*kpcR}H?D5=ton0XtlvnUAK0<# zqStn}-4vT4UqivAAy+3nuJ=pyW&d~9KCJ)j){;ECrVuY+Si2JF6ITORYc6`c!4eXQ zeHS-j4YnQ+ta_B+Q^|p=1 zsjR2wAXaWk+1Gkg_JKKg8*d_Noy7>>Vr%tlf_Z4M+3nC`BQ1~|h21<+h%xLXON<&= ziydXzkPcgbRlIe9%BUA`cOX`!E;d;^Vqc63EmqCuO8r>+Fe}0G0X1w2YQcnz z!1a8$goUWbm|Kc5_Ti2-?sPdj;RW1H3?wFGVdvTb37rw}Ctz%pplqxI-F}%P^YS=$ z`V~@ck@rB&zSe1Y!}GFPr;?NQV#6R%j>wi1W- z;;mBh^P)u_hlYoRA6g=77$P#w>>k=YZrdSrfnp8vDk{Fs+{`NWnD+b3gnFjoi{Kn5#@^+D4amF62@3*ino6*%e-lQ@EJelG z$9OEz(xgVdhmm{M)i9TB3KTF;g+Bs0wuozMN@`w140BaDa-zYy0d|b8w<1@V7=_=A zJz_%>%s`T)1k(V|hcREhjQi<<4JkVU3$gF)!RLy&1ko9O?6nk?+3-V~TTnZ7Lz zgk>`~Ce6u!y!bV8U?40dFAw!r3f2%!zA+FXySkX~n)W84#36P~y0o??$d@{B=s6hf zJGvC{`Rc~Qc=KpG@G*k1N&#!*Ctm?Ags~Mbb z%>!jkj+udbn78@oUh`D$F<4if1pJQ@s;RBAuRvy1eBhn;_+~6+=E%p<2l7gd*s^zR z^}sp1fb!jmVopgvwH-NgNjP^ZaF+}3abE#f_@zE_Z}q0YtSD7$msa0fy<6{>F$QvG zi@RPX=Y56xWMx{}V`{FetoodM`tfAoCCQDOFtdUb=^;6~8S(RLmgm;jQP-e;QhWD2 z&07QAql~07S+`_n@cDCOrw;N})KRokbUU`0_ZNh%3)$0iwqs9E_-fxP%EqqkX^5HF!M=?io7D!`lt>O3^Z}WC~(B5eJX8P+Rxpe|hc3@ypTPKa5_CTKB~7 zUuwQa^=vuTR6X0>;MCoS2(^#3uW>cFsq(~E;Hrho?}BfA;@Wk?@d=-=@;DBu~QrErb2#oVEa}eQA92e2jB@fqRT-`pvEY1hPSsaY$+pRm=5Xs&d zCe=XGkJG=dpR05p^tXL?F&K!uR~d2L(eZoP|IgnISsXHYq;qnJo51Q2g|2Z#BLH;D z9h<;p9D)A2ZJ17zV7m?%a~aKB7^!o-fKk892;rNRzYpxqpo2gUfO7oxJ}4$ljSoP5 zpa((e<)@&xfZ}VGtnWAi`X=m0LEiyA2FmflKS93&Z39h0UZQ<4DD6W*@eNG&dwdBx z4)%Y6=7W9(dI{*)pv9mD#xpZOdw^Dh_5@w7?VOqMz`kAEcY?;k{x)cD&=$}>pqN!L z`hsGXg9paR5ws_R4o6Awg8mFN5tK72gFxqjo(B3dXfo(KpnR@H+dl*y4m-kXoDRxw za_OK`K{G%v0nG%x8gvw>A9OS*znsy&3^WUr-^%dC&c6n9Ea-ipXMk?kIM*rAzDwKR z)bFIf4~jJK z7lXb6TCVTU0>#=9|9sF_L9YhI7fb&V(APj$fFiB@>p|ZF-3p4Ym;RlgdqLYk-vRB4 z^4SdP1x1?rlR@7Doe25?XaVR)pf#YappBpb(0QOoLH(c~gDwI61azs!Zv#C7`*LmP z`22q4eKkHOr`C61Ru5PW?vley6}T5gZjt8jjTaneHt~&DbNI#!4l}sG)@lylc)@KI z>=Di38!xy&2)0#o_{Iwkv%`3nb9Cf9SY(d%D}ueNIghN@eMT_O(UDX8qn;LwH48b9 z(GCAk3C1}(avu3!{CmL?@J~+7%xw{D2>!`=WL3eFf@R^KoJZDYJR#Uw_$TL)FE5V^ zb`k!`LHiQ^Hw#vwIcQP=_n2Ufn)Ar~CfnW^<2wA4^KiCXr^gP>p;gr?1DQHOWr(b4 zM}^FCp>WzJt@Bn`X0>cVH{+x7Eu}cn)uzyCt4*QGMC2c%5#Wi2C<_UGZ%B5y$A>22 zLKcFb%3uYWpWGXu%za!jqH-TOkLQ3y+?mwbue7U#o9n?@es#ffXoDQ5@t{h9U%XGhmbbi;7xe3NAT-^? zFVQNg0Q`sg#Uyw8)&9uk?jn=Ke_XFdpK&zk7r!3SbQiyzamYjnH+#xmWT|+bu*N(? z!~8=-8HFLL#LzGI5t==K1P?g9X79yq-6b|CzL0+~B7?)|Mu?5?q}-u(rC|KyyU(bD z%Gbsj8Y6;3HO0pF)4n^>A{uD8xdZ=9R~qHJGcEXz;pSleI;s26g(XGANnbgam9~v$9i{$ zUAydfcZMz8Y{9?v?wuVV{5E7vT+_DRI#qG7$hQ;HIC=N7+6G#*Va!8~QX|yvmRp#5 z(|&XahE<(AC-94=`!LnufxYZw(ufS+G@YNnMQ4k02S^qXhEyXsr7i=uof?sY3grOd z-A+WFdcpM+ERyqVcO(NfDL-(6%}HAx@Hx(}}J?66|C-HiWN2L0-%R-Qv|QoG#O@FH(3tyd5d!xW?` zw`D@pi(j7I=@mShm@Oua$RNE&iH-F^UtBy`QW8-56dJ)IdPeIeEhFib&Jw@bi7-hq zlC|BzQ$&8|LYQC=*@!cqPXwxt>jY!uzV}*bFw8gVFpG>Up5x`I0^DbbrD=Z<@kv0{ zv5mZ6^^>M0DxS3>IfBp#%Xr3i0f`Q}Do+uS=wNISLAh|0(*z*l<~IDZ=A(hqK>R!F zsD7}An``jTR7<(F@AhChU8moxpZH!ezYY?Xu~L~mBO1EnE|u&9xKkN}TZ+Q`Nk1hr zER~Wv%*DzbAW~A+1QDbcU-d4Hs8ohUG*{}U3JRoDUZiCZ9>=+3Cj$+Zl$xi?o)3lx z-{r-Kj4KWY$W!xi--<)^lrs)b5gC5RXB<_4B{|D@&@BjxdTM<23^-kfjTt%Q-n#v%>0wds6XaH81)<@ z2W42A_;NvnB?Vvq9SFVWng&}&lJF9sMC4FbD77>Up93jOXCZ8JB9elf0kEDbME?N$ zADoCBNzKuSEhBHrRa-V9vBB?+HbT#h2c3w#7RMg8jMTI(4n!Tw%Ko{MaptH*xEIV( z-EUieB$zs55fd~bE3e4w3wey*Pq8RQ>1pIdS{eeY`U_#ddV2Tx<=)jRZ43c*uS zi!!9@DQ;<^0<_MuWaGqmK%Xiflc$_j)|M1JUl5y6nr{c+QlcPMV|D$5nStsyq!_C8xp?R~g zdP*<_p$kRKV8cqm7i}ao1y6%yFai+NETlksUuzu*wx7bb!-cTu?sp-q0(Q9&<|wAJ<+93k**b)*kyLxiH3qg! zCc_i&Kvb^#-06^G#EMhMRXG7L;q0 z39U1Sii{UCUA{* zhcfP`h64#VSrTb7`W?PD_|)(9QkqWj&R6iuvEV3l*ynwUGcWI zJJJP7av`jLFgxv#VHU@HvIC*-eiy>R)8s-JKX zm(k5|7s5B?enR^xzJ#&FiAYVd)`>8H26qYCPmN)0#N$#3@BbZPp;3tQBxKGf1?z-9 z<@=`(wd(|#g2H`~LFrB(L6_Nww*5*^L!d3cRDT{H0OgPn%4h^(q0a0fwTo$5f4#aXKb5q3&wb07#aOSS_+n3*091Yu@mI}n7K zdB}kv%uF-~0xM(9fgsEr!#WTMjB_Ih^LQ7+Cf4Uh5awJrg5XVbBM5W88$p04xeZJcgy(8q`)QXEo<(j1amYSW zF!v&026rRdA(Sw018N}!nQ+F~92P_h#~?WT4sFX6jw15D3&Cs2o=eM}!Z8S-F~V7| zj$-_zxe)p_%887oJM&x!{kqMCAaRU`97utTe7Wn}@?DKeN*#!(RFM_#mJE8r@GMNn zs(U5}$%dMirxp9b(Wsi%+0$c4!_BV{4$fly<^CKDSP|J`2Eb>Ubi=FrGTAo5yy2|X zk^H(=M}&$=w`=vu`YDk?t)9gwl({YX-c_WbX+RsxuWMb%pef9SY7dZl3O%AR$WZ*2 ziV*6We+*-lEn^U23cl?^m|iU|1X;}B_we9T4B|m2BJIv$Hv)0Cx%N}(X?VppH-Z2$ ztsF845MRZCAV7Q*2ZHRvFcDE@kT%X;SV)14fF5-qh0?x%=0FOhSMaU_Q8OonNFv)E z$#tApu#iG}MZMNGqUM%4gJ8=rnhow5v5*2rs!{Dg3YpwSp^gpp7DUE5kOICoSCeRW zobx0sF~NC~6K`MS3Fav1aS$Uiu6YtV7;f@Y7h8K8^^`NuGw|VNAH)khHg;AHIW?H) zp&3EUNW;p9uiHpyo@dSq_GEq;fBw*scAnp_pAs45c^M!|PlmoDHl}1U>SVWpMlh>J zE*jyI5Xw9opO1ASGMjM|Q2QyF@nD-0L>Mni97uuW4Yu#LjHK7g4n);9%N>ZC1NqQ_ zs5y|`4n)m?aK^)OSIojMu%DUo46b2MX&{?T_;Bb}>df@9B_E<_Hxwx_xn z9=gN)$FM7RP)DU_p|G#fh-%}qkn-!@2p;ny$H==g-P5xWo$S3k5M+g9H-hLK>P8@* z=0@;}BU}jU(JVKD@QiaKD7!v4f(V-EMiAynZUkY5rW!|>IWX9)V^z2B2+tNLlEMD` zGfsrBZum4J^@cPUjV=V9iv|kDkCI_^^QKcKosIW4Co-Dp9dIB8ObR*Q$988lOWaW8 zP#a-qN3 z$F*e^Qjp15<*G9aQQuRz&dfpzGU?Y{4x~^T46Ze^WC~?ggsaUgq(J6U(i{k41MYAI znI%&wv#DHrW+4R`%o|*t7DSlqu5}<#Fa~6+11XR>hkG1Ip|nI?jb^(etqj+xS%~@y z<8{=B1@i5NYu9WUMvuW&YZjtrLAjpILJAoigDcZ)gb^mn$!&y5YH+oijY!}49vgA? zE;t?zewqE<%6s1mwhn%zCymIsdKY7XhMT)_KSdPaSXUJ1K@sDgOW}LYEFrLVfv)6n%={Y&U^V)dYlFv8BHwK?vaP)bRS_7nbS)`*_ z>uA%QoT3T7qO?NalyeHEPR>1RvQOX1$;=sn9aL9d z(pZu{$n9QHQB`ee(Tuq@W!iu3oSf{bJl{Zbq%NVkH9Sr-V~`Vc$08kaorGt(6Dnpo6@ptQ_BhVJVhip%lgo0lBU#JY4(_Qq zw{GxAAh_&4kH>Pk15wN2_O~4B!R=#4;IjMl5XB36&h^hZfs3A!WnmR|IBE>Qic&c_p{ z`pzntbWU!;*;9Sc=$bPUDqV9%LZ@raNGf&B8EI*Ch5gE$ktMk2v!0zW$(K8|F!#)J z3w>IfYtG1y{Gub5OW_OA?bzunGJx$|a;U&SWVy9Obn24hAxF&AR9pe~cVRX(?* z+HkzLm7nVx$}xWK{H24=1!Ka9Iz2Oeq}O56Ge?d|%gPv)Il=*g#dN}`QKP)xQR$<` zjFDT#QQORkM$<9#yrkbjuN-A!KgmLJAm;(R{IZ569|N;^;aVCwZ|d0v8S4 z^Tw7Ihq|{O_z*9?Y2u<`YulN7|L|gG2`-w>+8Ef2L(b5PzM;UmfJ;YuV1i zw*${Fgv>d~%C*kIH#H1n5Xii#JFb-LtX%d&A}27RVeptrH^-Vd;*96vT84I-j?%Xn z4vdG~J^c6$6OXH-`19cfZ$Tz}l@%NetGLd>$EnY3Tr{1C|kV|DG(z(AI;BPr(qB#hG>8!ru?Und@P0MwIy)%DLz#x18 z2jVcDy)SPhLnfJn7MRZRK_l*!L*{KQ$8_w>-}xBs_&MZ(>CE3rxX}ceT^#nnbmng| zGQJ0coKfd0x#=L{Z%F-e67W~gS2EVWl#dX(3Ap)DJ2|u;A#yCTxWjlKh=9l-|x!1m(o`ej1$xO_2)+k>Wfpqj9Z+F3(tOm$k zspRnbo#wyzt8fn&O=scTgnJ{jj0obdqk3p7JbE8;>u*p}ABtT2e#C>2TeA%Fn0G6= zvq3tF=S<*(*C-k5zoUFL9yfpT9pp}f+#TORj_vew9m#c&Pd|m+F)iC!{IU9pyccnX zi>9-DdI>VzIgnYqQOWs0n7-(`o<1=z|I7;uE+{xVH#-S`6Q*2{UNleOUVNjQXZ(#fr=NNLl zeIcDvRaRfyP&=d1n|%Hd@40o*<5YDOkKUMogEy+GE9zC)79fkp8$IJHdNFh~C5??0 zHFHZEt7>bo&?Gvp+`e-~X;H)Ms=6YXp~1bLai#XXd8PG52v}n!Mj4gHX}I?uYg;iD z^UI24zTon?B{hvj4cNk!SyWm(x2D`kgy0O@k&Xn#t&-!3q&wUyJFXyh=k<&$wneH- zW)^Y21S`%%Zq$`oHwGAyai1ejt7>X$=Sid#&8<=IA@f1;xZekFT3w5`s;H`&QHwLk z>gSdcIE0r6e!kHNm?hoOAxZlX} zKK*d_WO!?ZM^70j_n><@E)g$qMOkG@J)DYxeFCC$Vnx|B9=z5b=mUw#keJ44y9t=K zE5#`=Sbf+L%Fxc$(K8o2%_OuZ1Du8Ms8|TbvW{d%|KA+Z$6>h&E2F;$9xPJN=&1e- zvegZB?liR0prR%u4SK?jQ|Sh#|K`p>(F(?WS#8A(xJh5KAR+IUTh-Xm0m5Xjh71By zUooQ$`CerOuSck&E8b?ZM55P>!{Id)4B(B-o z>!K)G&B{xbx52!`6x;_FRiRMM(U({_r^_c2SIQ^z(lPD1tD;E2jeLY#>hmI07E%1P zhN39)_m0?^`1kwnc;${;x17>^%j##a$zSk=E8`+Q+WvIjq~{M*+&QDXKle`4{f3HZ zf4enq{@}Mx{pjcay1EtJ)Cur7*4)$lTMiopK4RGikBs^7l2IpqaP=dZ zXO|%S*Wuk_&0*(GirtwtHf->`hOMU#y6jnW83q5{=Uaas{fpLdqr3WcWv>0h1sJLd zeyqIZ?&{jvPmg&Z{Q70#@fcs^plcXw)>NlFI=1ipRijdR2kv;{n_JX!qgb<|?5$Jw z{VJ|y=d_hi_4Pk^ttb_M{H0$N4Y};`XFgwldrI#+pY}YA?l}rjtoe}l?`78(PI}{$ zM$bL(eDuK~6bHdmUj4T*_Q^5#M5ZL!3o|H;uagv@`xZcjV)L`EuGf+oG4t zArWxr?)abGx8j7s2fzH|izQ3Uu7wy9pmG@zD#34j z^1Q2jjeE`?(W~m}+FARqfwBj|%RlP&;!$&Un4(;#z6FwGqqx;zdo3h47r7V4^;jw8?JaX0=)X#$7)Bki|Z0Xl0 z_Po8;$o5})BDS#!{_6gAAPtE;VVR30M;GoiKEi)q-3 z25<8GtWiUz&#`-J^Qsy!N9%29oLgR1>rGD|o;H16+4L(gK|34&S!vU&YRanTmRC$i z3yALAkL%E7L)Ereb2J`#`2084V}BGdW8+% zy2{#`3h!*R>(jH45O&m;RI6vdU(QvH5t`B;>@gy@Y;Ju$TBs`SW~ zvdoU0$9Nh4Jp_AIa~|VEaJvQjL~|Y-7>z!eU|lumkpqZ&3U)d$avnK63*AikaXv6| z9<4H+*w2B*2*!T#I+5eXLvkKbXtZ81Do7&dkxx)FjJ|#UdHHkC{=WMk3f3=9`*qiX z;isZI`9oXSlKMH*>-AjFyt4H4G<=RKHI9CE1QXafCq>N5d9eSbIf&O55glEV51OFO7 zC4FGd3F#N)#C@|Yr=jesGgi$%ZG2|s{+Ij7g;>jv>KYx7@W8C3AvJHPzszG+?@YW-v&a;$NC zSn=IZTFQe}(gG8xj+GY_d4>u9?7?^(qI<0RqH7*{qKB{OXwA5uGdOu}7l;d7AkYS=_ zFssEousR%qS_vyO_=-Qu=kPWb>Z2HZAFdM(GzOSxh>K$gl|re83g~&E5D=plI8L}M zslnTx8}}IyA7O2ZLE~{@a3G89LAa^P&-cd4Ge7e)mSOtoIKH3w&jH1t%|8?rV^h3i zn&vzbPbUjjj(>9MkOB-MA;%eQa_W$Reu6EY{P*BQ*Q=rp(WB; z)*^$6q*70o^&LO)tTGV}hfc&qOueL?A<8`&7R%6|Nw~srS*bTwzu9^E&G^Muy%{-` zdJ6NyuCR{ZtOob9LekFpW`7M$JHFX>OuGN%4KLAe_!Iqx{D`C8keo_8g)!|EHtgeT zQDevV=$r4!j}WE(zRwJED=uGJYChEXFGn1-nO^>X{Vr=0r$Y+go^b_Jb`@-+ zLsFJ+%akR(jm|5h64tr;_V_h~JNc|uS62G6Xwl(d@)2RPq|$00@=j2TW10>C3Bwec zQVWnWjF0Oa36QXvv_KRBH+CRb4rXRiQnAX z!+|s5#!2=GMCPt-umMR~-CB*a{dm5LrEh+9>kOQ6QQq`kW%2Ayfy$<^KzBLk0B5vB z4V;x!H7PJD$~*hL%C4EkfnVTchza2+QHK_o(1O2;rT04Ty4q>yo?p1O5?$@f!vEE+ z1bXYo_Q)?r2R!2TY5nh=d3S3>6wjYXs!5#1ZZ}VzNDJhlYyLb>0qExqgbQzX$037L zCbD-WH02u2QTYd|R^=Ld67mmJ8eStc4X15nqTBvb!nEAGjl_U4`P{?TdDhj^=cxRe zqx;T}xb5DVWwYt)C-I116MiP(REHEZEn;MPAg@P#AURtP0dNXL1pIzsYRK%?wL5noDPPg)aLD>axFa(tB6s z{2%t-1iq^3-uvDsCrklP5+*~W8Uj)Xh$jQcpb`Q`z!<1fi^G*Mm;)h6lb|@%dqAp) z+9IH3lvJ^oqSrE5XDwGL4%J>nO1)q-4pk~9Wm3uQ2+4%;jlRal(7 z39@!(rizErR6g|nHN{F9L@|ZZsaDMbwX$YrPKHrysZ`YVoGjC`h&y*vT&e8IVb_>c zZT}UvKa|?1+A9Ed0Q2CPL)=vOJArc38N3P9dQf^=r+}18X1%8sU{8)Wfv19-!Cv6Q z;A!A9U~h0I$O!cK2VfsiJww^7duC&~Pd9UWO2UM~uj(u5X6*+_5$kz= zm7dbA-HsHoUPsbA zi;2|bUro23{Li;l>b{xi7=1I5QM_=*(=*;obcu%goHygIGddp43BSmiQEw)uN6(%4 zVqz(-mP8-;PCH8Nb-h-reKzraZyi~bOE=DXpciF%pW(B_KNAb}X*3#%S&jB*a^eY3 zx-m9u+o6opu}SZM?spzGl*iFD|`tru&Aw{+ioZ z<>SS~p8QdzFDCY7X5_w*Sf0_H6;8f*{kE1HaC1HTLNq?fd@*r^{RDgB?%}117uNG& zQ@yD#dk^ywXiMcBFE`v$?`$K|-GR2-iz5%LK{sY(# z)XD$@K&=cg7u@S-(g}y-J@hao6dKv-X%)WBSX%N4-+&$ec#}lW);$T&dQRwt7-g?8r54$)@$# ztuv*)J8|b^xvia5oMZcZNhuOEX?~3kDyahJLqm*8W+wIcpVETk&J|xC<<%!!Rk#eIgal$FZ?(?{Z zJ?S}5dI?E+Bh!q_f51rZd1sXiZ2weavnAzrThiOymL_}B6`nN5lNNf?VozFzq_VUJ zJ2`t+(SHe5A|}hn7dUELJ|4oI${69-83^`90p{=j^erEGCzp?mX>U_Le*0mtc2`uS z($l&4HM5oS-3R8t|1+2e zE&=5iWkP%$NQn?153UERz>Q!vcpF#?-UZfyln`uS-1ilKs3cd#F8U7yJ2kJQtCY;2FQ-({j%W%R5r!riUU50Z% zP8lxAUMclo4aXBPYpd8_`rJQyJUz26Y((*Faz(oJFOC#3GuqqN)!WLxZqoA7JXfVn z&OH4#o8LzBn^R>N^J}jvr{<|H_%MXsHip`g(w!}x?n(VTNvY00t8`~e2-XiBE6tP0 z$vk`~N5k9HafZVw4-3D{;K$yQl@Me>FzmQ1UvAbMp=5 ztfsECHQncv!l3);#6HF0-{bw9hOCu&byV<2`AzCtc=AS0la5 z-ox0wY+tIpvk2CoofNhU`P)-i0~$(U!q4>x?JZeQ|8J$R!eRcR{@YU6X7`Gq!k`q^ zm0kH-+aD=Cl)?^z3LYh-Nn!7RN@2~QQrNrT0PuZKG4cVZ6!s@@B={j%41NTbf``B| z@Xz2B@MG`_umzk6wt{oP{{(BnFF>W#7ufBTD#=c%ie)>cO0rX`t+$C|TQ9k0bL0-C zzsI(=FKuA0^Q^`mD`u5+I}*kYxh&l6aB9alk6K~(IDEKc%B9}f^;w(H$yk}x|G+TW zKBn7>>|Xby)pupm-QFxQSpg<_Hh0C|tmM)9tiriDD~?p96t1;)RGw1W>mI&SL$4*K zHg-2nLxpo|=iBGR>rVD3nxpf!?N7WF?Yu3eFAt<|&!h1aYsL1;fqXejqc-M-I3CXK zwJqjeZBck#R=1<6tXjP&e8w3&Dy@Fl_S(IWZ4G)Y(XhNn)A9M+Ss8N)Yl$uixhrF~ zqn;Zo%5hc^{$Xr;YY|jF{_Ne$kC2isL&de*;L5-tZ`QSjfdsi z8|8vhkIk+94HXmMQN|Nji8(UVVZHwiVru7x~T7pUh@v$Sex}@_ShQJw)uk_B$A|nitU_HE+fn()?E1?3Z98Jp>E4vJF1z$l_AOIG`6Y?eQ9EL5N)iV< zH5bHcs|S`|YK2y!w<60}f;YC@`0=(_*6OXT<>srQDG`rv=a{R9E;7$ze_~(G{=}Y) zcUo#*`CcM7dXOi#Gnz6ewMj?oD#L@i9z@Eyw6gxmZk0QZemy$v_5F$U(NRzCPi%_z zeR9$fD{X6Q)q#I*?zUlj?B140+JpG*-f_lyap`G&yg1lawRJu<3Eg#NuQdlxBUQ0J z>}`grugNWy>lE(bwM3WY+)1Uia>x8E6Vmp5QZ6j~X5s9^5V*w*=+sg#!d+R&1B zU}MX9otqLn8?D^OTVKo0dpP>9SfWqs)@vo}!eU$Y?CbrTF70(?g3+=ImRt-1T=; z3qm8J#A7il#UCdPY~|~A=R?+@3-|2jE9_pr!bk^sT8YTHw_3CpXr*Dbd%WVTv%9h7muUWiGtbl3;;c5mcVo-X^X}!_?^tUpU4>H6 zZ|0ltOtV^YO4Dwn_Ra1ULwh-XWqak;){E0FEgj*k->y3(Uf15*(mzf2IB*gEEqkYB z*;>U!$9|8uzGQO8)IO}6JBV-Q4m;Vqwq{(>;n>oQdA(DRQd*buHT-;DqV>JJ;jJav zb*(RDr=6AZ`f_r8m*#m{9S+~ZD!jK)5`;`iK-!~)rIFCus|9yz8bSNeqpg3o!@ak$ zl=h;vokxVu9X#9`_#dyomKYz`8ty%a*@ts(*!FnqAunb+zO_HGnRSi3=Y?5)w<|3; z;pPyivbF1$_I;wIeD6k;5B4V-qt>AGrpztfU>znWbKT04c1@WpGPiW~*sam}9esRS zTXXuX+s`xH&l6jhy|HD?mHOh>v*U}uv)YPsTGK||+j7>#$632QrM2CtXlv)r3EGVw zZ+(IGtDT*H*t$gD;@P*hoSn9t6wzzr{=}=%ro@!^rQ1TeRv)`1hBTg$n(N6bd!m<8 z(pZCvkK7d}zvn9a@3iDBQ@OA>tktBIlNN{Vm8Ex7t}QuwkP;5Pj!lKEQSO|1We06i zpB=1?ZL19Rt)ISQ=Gg4D*3QFY!dt6&F6PbTx;oC9@IhBr&akbDt!F=pm=%q`dRuKh zbIjH{nlZhsjb8Swo#%e}8|3qjR=&UV*NG3FbGXr4dEV}`?!A|1m~nUD8Fn_$aO}43 z1KYo4JD+IC7) zQ=)QtJ@*h#xjc~*4Mn?6*Bj(h-dzpLiQmb@X>s3;+hbD_XBKC#9$VUvcTnSnPDyWK z`!rLMx8HL-)`4fS<#5<}bDMWT^s!d!4n31AE3e!^?jt|Gmc6|-!rJU6*LJ2=(3Ggr z){dP`tnu_|9h{gxIMkHhFQu7sT-qjnCb!#P>a&J zoHeQq{G9sKC{tQ=U)_{g+Ppp12=fR!HoF5i^QnbpG<9Da8g*qy`5r3VOG&4CPsf4~ zWx>w0{8lUb1f|!~=&5U!zgPu5yW2XuPQdj-IqTf3sz%_J*gX&Cpp&u2J$G93S8t#3 z)S>fVd$mik@?iPVCpP!Y+&22PSG9dIntL+!qzvjn&$n3Q`cQsqfoediCmpGLBm0(; z;v*N`a_YJloApH+ZD?ihbvjFITWH)Po#T}o zN;)0ry^a;&Q@Fon$16iaQwuh5f9{GvTZ1|@Z= zze7lLodKmOq`lO*uH*VvSfl!;-?w9x3Ll+t2;U$R`T?b3+;#kKxa+#%Z@bjp&wG;V zk{>#mk~^LhcL)zMhvQ%ggoJywTv_1rm=!kLub1$;%Bbez*Va9QtW zc+>kOrBAn`SRl}}UGe7jxhf903N>$SjV(KU-7)H0LQaUAtUMT;Z^)Gy1 zF1Gm2Gx20!qf682lr8c(l%Lbu$rtk{4!ZuGzPkO-i0@*nukJ|q_U>HWlhT9kN%yAv znmyNlU-n%MXiZBC-c?4^ch={Y4md4Y*VZ%7@m*QZ{5u;?`(`R>NNQr;fc z8@=3E=yp;pD3|O{+!?)e+fh=Qo}`Yv@;U8z_4ZiT4L#SprB$BE@8c;aY~7vF`fY_Z z-PUBR)i;@4hNxT%|IDInkj|;A3uB?^smoWFeEr#$hl!tPXwVrdtH|Y@o3bg#;vu`P z(z(*DsT}vt_ciD3ceek$?T@}RACC4|-ECWHZhD_kb1Jn+T~l>Dt6#%(w}#hi&DN@r zXMNb0Vb>}9M6a0Zrs}mNo%W2`_UOz|n|fZT?~ao=UBPt+n%n}KPO;X?;$ssFi%nfS zlq1b=*Pe9Z{QCcic78zntGB;;y9*YhciDTGxt^2<@cMcRjyX`CUnSCK#+L>pJM;^^v&%i{K2L9pr}v0=c0bbR#+SkA_6*=WEu^~* zmy+Rf4M^BQ33DTo9r|5JcIby^x*?c?w8!YpLBe86NN+&0pV3b|X)V$iqjw)tv(ftn z61HAkJc2aJNY5daAdwf4#v17*B-`z)NKHmhgC}gann}ZU`w5cmRx^UwZZ*w|?e+_# z1IBGiSJ!PClI=Dd$#$EAWV;2MCi!7Fr>bKZI8eEou%9`_AiT>AZzizkh{V1PHn#lUY-^37ah1|SdQ z#**6yh;|deJroovR<};e^Ir}(cX+mAbB7n%haC!i_~koa^ZU-%a`p4Czy4Z=_4hq@ zM@5IVjMariTXNGRX#88kzmgoB&1*Wa)F$<&O9ydGh+dQTB6C-7nSD9H!WJ zn-0~B66{>*pmj>W6wW#Mj0_fZb=xVNhu{=aA@>JFD3vYV-TgLxc(2OJ5W z4wivufNI9e0qej%phBGsE(iO9_knbhif;kG3%&#n099~t&3H372>cR^f*7-{d=NjZ zLQoy3*yGc|q2OF_7`Ptfsl~T|Bf#w-Pb{tu7UzNLbiwnAp8!ihEvGXM)G`Sdf?41M zFb}*GjDl0ZBJlfQ2}nnSxVqf_0K5d83eExP^b)@o{3mcJSOLBS-VVMBE(7<1gf;#l zI1kiJG4sI`${;!{#JhtvU;$VMYEhmB@Cxu+Pzzn&488;|0=1-)_`M(<7~*e%KLu%o zww8l*>(#Oq@$MjHWIPZ28MqMK46X$q0yl#XgFC@rfv^7+I0Sqe)N(D)faAeu!7}hUa4Ps4@G9_munPPwcr*ACxEOpHTn4@Zt^)rZ z+y&C%BK{KiI`}HM7yLc=26zbk187m1`XiVEz6rJm4}clqTVQvv3CsrH0f&PhfaijL z0*k?S!ExY6U@1siiH`>lgO`DyfLDWm0V_c&r|~-Q7}x+F2X6*H2bX|ffIk8M3a$db z1XqLq1%3ebN+J9pOGw5O;2B^l)xLgUPq06j3w{?o9~=m3F$mITd@48u)XX*c;7wow z_!F=YTn?_K1Hv9K%<|4g3o145m_UkoMyp!R}xh*a7SUQss_Eobx@M^I2dz ze2&BSbNK#X5BMlJ94rDyg2f<9Wyhz2W57CaJa{WO5nKgc3~mO$2W|zw5AFkh0KN%M z1rLCigU#R-;CtYe;3wc!pn7i11#`f8U_X#0uHyZ{`QTu%8XN-Ffaim?U>SHFI2pVi z)Z~dbfK}kl;LRYjKgE9n#=%YCB5*6X7~Bos0`3L*2#Gg?w}E+7nePGzgDb!x;3}{P zWQpzgCE#jsF1QZ77F-YB3T_1N1%D1c4E_Rq43vM*gTDmd1RnxF1fKxE1fK-csFptk zW`R$G!@+04ao}^{CEzY_I`~^~HuxfVEl61vUj@Dl-V440J_7y@JOI81o&f(H`~utq zehIz~W>I&iY>S@`>bM{H23P>@2SBn1g`{_ zfmea6z<&bQgO`Ji;ML$`;0!PU&IH?2Kbi$bK=B&Zu4BzUIU9_E6`<--*MJj2-gR-! zo)`mb!Fk}VU@f=_tOvJ%4d6?l^4)&$dXC=)Zv;OCS>*(ECBBSi@>`;CMeZnknySDDzE|k8F($Y23!cLoV^vi2VCaxcRIX22Nl2iv{U-i zXPWZgVCpsh&Te+1 zoTP}EXC%{b>RKi#Vmj<(816+lNfBc{NH?5}F_I$2OcOEOpWq}#jFIFN!|9`3QpD0{ zRTsn2>}I5h(e7+Gg+o$Abwq5C3Ny7qBSp;8U7ZXUh!0Z8 zaGM>;o+ZUH9JL@$%RlNj)>j;)o5jB*MNCIu>dSEZI4db)y@#awY`XQKBSoweNPjh4 z!jU3Yd+LNA7%t6`B4(*>JH1fqnv@eUi+$N#v&T^;I_c_&$5GxnoW6AJw5EEd?KaEf z&ieC022N*~;iQq$*+Y706#en57FkEeFFJdOb?n|n?;PrRq?lo?t3s36SB0W<-qbER z`1b>ADeNZp8>~fi*A1T4(E-xfs?Z_t%wI6qtO|W?4XU(qb}_8T9>lnC={{sDXV7%_ z*gn71cYbN${QJ01YU4U*A48U!E7hbhZ`&2~X3b6cYxt-;&}qPQ21uFVk_(s4noFmc z&^MjYHD}FC>iMsrbGQpL6f-a_tkv&3J)+m^u{#HbPMQ9GoKpxZ^4NFfaw;HJC}RxLn9C!w~CMNj`y8s zHv~#U=X7RG$?=29J5w0nzsB|b{ThGx`^Nl7(%h9ucp=$`>_5M%< zK84YM4`yrlFzc2(>aN)oBpNOC@A?Q@$<-dzkXkmh|1Z*KpLD z9f|jdV>H#*;TUt4ceb^G5+u{omtr|wrZopi9`~@E^^9_4*=wlEVf~^7EZH+Mhm*;T z&pXRDrtzVG^mNENYl79B@;&y;*=Mjp2m1>4HSE7;e}Vll`!V+aWVb@iDIM7} z*hjNZVV}dklzln-z3lg~Kgj+h`@3ImUZ__|D*I9Pu?R(NOmcBD&8?2MtI0LyP_!cD73QO1$$J?;HC+cPQhCv&rXr_rSi;KMvja_($aY-=8*4 z^Q_!vp|1in9?Hp>#+EvOrx_+&yS7x>GF1zcGwNw-R-|m}^2}V55<2oi zOm5QBIld;@I_Rs?+c2h3fKAG@jv=Tb;a$W@IxGa7?=$|+~Maqd^L!v$&8hf z|BD@7734gQ?*#{en?WW~HY4=U0{3t%{k@>VgUQXx2Qj%BzS-dqfkp5iJAA9de+Hfd zugb6d!9-^KN#)s$>2f|F#ANjqY=^>C6RW+WP> zP~1KQCn;hn-Rs$=YlNMVBGzw_S`7EHBSlP0Ip$RK)P^Q0VjATzwZeS_Cn;j`uhLAq zX%Uvh6np&s*>L*UlN2!@vPxs=W|ekH5j8`|lnY0LgOMVZ@_|0S(#_l>k|JsrkO>%W zj3Y(N+zKBUZZf};BG#4szHhi`jueq8-+b1k%Xn|3h;=>EyX@)Kj~pptEk#mZNVo2E zq=?M$GDX9!bEJs%3#7LVx5benGQZ1ojUI+}BSp-3QRT688P8?lCVZH~t%HWc5N;&< zlT&%p{^XPtv5xZlABOwXk+A)c8s0RVa-O7!%)BzG(4&Ot~`W!(Hu25i5rDy5Z(KQp8$_q_QU6y2+6u zGWV#70PYS)idgp|{oZhE9SPG2(rbppaB3t>BS^0r?g>Z2G=lUy!(k9L5~dNPR}6;{ z(@2;`kX|<2pBxF(2$G&ex^=>lFpVI+XgCavM#40LwA*l99SPG2(r*oiA<#&eMv!(H zP9=gQOe07y7;dy9VH!bt-f$`jBw-ps`ZvR2m@^Wl5u}}lt8yevBS^n79ELI@VH!b_ zIRn#(BVigrde(3lyo`it1nC*WZFVF~BS?HR;Fg&gjD%?f=`q7S??@5NB;%A#%pqeW z@~X%6Mf#O-@m=pMbHW%dqFG-Yx950gM|s?6B;}TL^Zj6#dKWlc#G2~qUFArm-9Oi2 z^5}xeBjt`;wnj>OlpZ_%nmo)N$964#=TO%pl~%9N^C`8=7o+|8l;=~HSa)HJ$_Skw zx;S)MsE)Jt-HoJ z+!SIeUTaXx0gd)xy541)-$8w|@1l3NF)QpvS{B+8aojCwIeXcXmb2K0EW?Q7#fm+z z!ahRrO|h^l5c*YZbn+^#yz~QoHTEOtGz>wD!&g>g;As=XX?e^%mW$T6=*T3rlY5UJ zTe!&TYh+&-_vu{VS$=!`6d(WoB3?8mhCVsqzgwO*CbB)zMq?toaofJcuAD39wKb9@ zV~6w6wuZ9gSvy6c;l-x(gCPy|ePHIS=?}!LGp#|rFbb{AdmvWXn^}QdGt#c;9XkBu zu%4XNx;$@sYfAPL%tF_$bW!Uf(;xN$Mu&WKPzJIeFO&OIn;u}?%#Ty(Q@rfmYTR0J zq*)%{mu5!s-IpC(Z}~zvt11{Tf6tJXyjpTTlqYx#9H$o9!@Lu1 z=?jn3r=rcN{%%V&x-o!NE>zdHr4l+9%s1R7q%lU?jI;rtGOevhwxR7Aq!M$MA8(7| zw{1_OAr|Q)e!pvlt(&ao_P4PwXUBfl{(km{*dJwomVGyShfs6-ZtT6;&txCYK9T)$ z_L=NAvtvVRkNvFuBkYf}_fKhVe>VGY_7e8*v0uSHi@l0{0sGDDE7%`q|26xw?7P{2 z&;CApxcSS?wO=>0Cv9;n=_=6H7WXE1Os&xpCNjKR_PWQJrQnP$P8Pdw*oxcsiz^sb z)TV=0!7zK4a-ZwJ-;?bhCN(#@{$Vuxzu#!~k7x9cXXNHr)3{LY9sT3*|5$@a&@^3; ze@@%^TLuv8|2w8>_0a8zTgQa09=biC_`0-;*-y2!t}NZwt9V!XS89k+dpOBuTNT;1 zd*ciJA$XA{w@O6Mww=ZM*WL6kmTkL{y^F&S#75bbJ?fzTDxbIQ-S%IQW?kKgZ!~ z!3*K*9Dbq0F9s*V-|Fzo9DWseG5lJv9Fz@h68JFqJ@6553b-Bo0Vuo0R8V%9%R$+9 zt^{S*`X}%Jcr|zgoCd0k#&qy2a0V#L=}b_z=~qXh(>*kvJG$ zH6K*HQ2N6hz8I|Kc$~wlp;!8sfD6DW;I-gXka0xut3bJ@JEPH)ZEPXOvW#61(rwY` z#X;$<0Oj9$@MiFS@SnlWU>tk|l-^cQdUPMOZUN~oX!z$H{#Ecc_}_!KgR+g?3BCp1 z1%3$9-8J3{E(a5!{QUxyzp2!#?*Zv9XWa|R=B@L2pw1V8t3lbe#gBJ*HEplsc#6ZT zfm`~s!TUhjwxlo1miTMI2f!P^O(5OBtOvoR;4i=@z<&XEft$e-;4i@x^6eI|ANUZ+ zOv74WGCm%Z{}Vy^KLy+hUgq$!CW)T|?f~aHe6_=?tMy~>H-m@4xO0B7bN){7N%$4u zQ{ZawY4AQ!*KGvl{}%8$@DYdK?(olm&%;0G@VgxT_uy~g_d5K3hi?X7hJVlD4>|lX z@KyNF9R3T3Po*r`2d^^a4`2?caOHvu*I@7IM_s}df2$o{Bksg+0$ahIAPaw*F5@O#lyAzLb{mK!yA9+C z!>JgR6frY4KW?}i;3P#fL%-E%IDH99idgHA=$eav8yzWP=B~WYaBBIJ6tOg;oAO$^ zW*0P4#Ci#dZoY78@skuWqq=0JPS^ZjmLz-euQi7I7*0~ejICR3IE_=2#KK&ZMRX&^ zZAV9nSly6h|4z3~b)<-fTv+!QuD>HiG>k%BkDIqGQba=yjFms#Se<3>j~I*kGNUJ}y`+d~o4DO@D#ay5Oxw;O%ElHKi2 z?FZ?s2V**p!i71$)o>jgDWb0N){hO>(~%-pAEYIQJJXROmdf;73|Hhx5o& zBI?R){m^hFjuf#jMp7)LTi}xe%8_XQM5;90%Z^0*C(<>Bd()9<|3sQ& zxQ`r(_D`e=!+qvRw0}}A&o*2;N22``X_nzM&_|NprZUrTYEzL!`zMl88SS5rMEfVw zbi<8tB-%fbrWtOsBhmhebhY88ITG!kNJ_u7e>xKFpGa33?njP9`zO+shSS?l678Qz zR~T-cBhmhebh+X5wv$BrC(=~IJ?TiaeQB{sp0gtlSKO`l5#2SpN>TPC(`!}r?;OZ+K`YY8!q3GX#Ye~D`&b@ z>`1hKA}RmV{^>}xeHNHKao^^^6qvd+CP!bH{57PqWu%; zJi}4*HxliiNaq@k+Psly|3n&PxGG1Y{S#@V;cj#!+CPy-7;c#((f)}v+;D3giS|#V za|}lf(nz#_A`LU#3%a zS=nNxN2nZ*vfa~r*gKn?ku&2C+0XCax{o_wC(Q%sV>`%m-_a~MVU!CY@W=S?iNXEI#EOrRa(nqNravHI?qZsp`UGpS{mnbh)1CzM7_sN0@7 zUSka!eWKx4!_C=t19l#}BOdBwA4PYB9ccVV4+raJzn54dzsWI*Kg0%rNSGi0B)20XDR82VENjA9OweSMfwBtO4&c$b3ArhRu|@7N@`qLdE++s$!%=8 z<}|f>YCgD}){wf(AAGH)>w$KTYvJj{|6%vHB@-D`>I%hOk-F?(BCywmG$IMN3cA6XL*_1&#Jo-0?O zL7^s&`qa}pn0dEFKC+e-AK$ciW6Q|2rbKi(t14{S*fNw-q6Z!I3(}^2JRy8u>&Mxj zw|30FtL0R);=;z3yu%w?27K{OOaCu)hZ|e^zVc2>pI0`voN-_q$D0qQhVN?Wx$HUS z2-Tfuubk1^XKg{OexByCO!;f*Q`%s;26kM*NV&--fB9n5+LP$r{2X&lT1TF} zCB@8}wh&b+zSf!?JlhdYG}=B_M>Hgzi<(#(v9nsM}emc0Udov&4} zet2HmA0Mdw(`e1sM(^@c%{&V3c4us}XGVPaH)gS{!uLnJt7uuwc6g-EoR2OlEh`N* zpNJLCwQ@VINL#zD(wf_D#pzqZD|&57S<(LP{8(;jxAps3C2d1X*R;^x*782g(beIe z)Sn%>Fh90|IHc@N%Q1Jiq2-K`q~eioDjqv>L(A!2x=v9EnHO&6mz3Ih(1w=e9Hr)5 zws(%1EMG|LwWjlWW*Y4rC3WEj{S3{;nWx!Dbp=ZIw5+CoJ3KCB@yGAgKXCZH`tYEP zgQtih4=t1t5>K94`I;7NeJa6tFf`EC<$O+KvxZGr z=JPq@PBTl`^u;}oE)0iOrmZW8y*$@iIf~h$8!s$S+2zfb<#UzudZjgR%$~IM(U_S{ z+RW&6N-uJ4r^VKIXGSkqpW}NpUspj)*LZjCrnw>fZ@h2=xvn5Kp>%xd00!6Sj_v!` zENu4dTFH_!IVV?PO!EaEJ($K^WYOhmD+^6;fSzVv&OBz7YiIrKxycHdtyy!EMVD)~ z*HiZ3mLW@>njSpdG4wrFkO~!yXHMrr%F)l6ZA@iK{p*@#?NetS*_6E-sAsfqKGAw; zt^3p}mnj63OX+ECp4lgT%oGU z(dn};8!q3<8__hNH9f7e^=#(4-8u5X!)e5BTKHbpgn9$__qJT0y|%@or^(>#>8-b< zm9%!rE@9tR}TP@j*V?q>sF8tMxAChrL0r(`p&i^a@xQ zOFNpHwx;B@gPCjU$=5xXh4M4+Uc-E1tNyjAC1XnyrEe2;sPnOYCYKIw+EIDw)A_Lh%o}|XrkeVBr))en?}5XMtg*}t9Hul+ZS<${ zqFC)b`EhJshr_!m9MAi%!kQEAwNgY+P&A&l_HfkER~Cqw=C1Zq4in zsVUkzAdTT%S~b#M2a^0XJ^MH_muU{~dftgk%=~-PSxJXk8;OUydGBVY5WaBbg}l*^ zRfdXIm3+)h=5jHWK0k|=H6@A~(Ti=J7g-bjYwG9Be!1eo!%I`_WqLKY=XmDdUTV_8 z_ShimUha|R@T{aiPJ|v`S9S~)PAvWA`8$tSr5(P_O1Vd&qu!UDU$r9!lM=f7=sZg) zofNhsrg~?mrsL+l9-M==J{BrkU-B?1d~oA_2EyI3ZGYlKJ~P4RTFq8&Pu6AR9+q1x zFF6tlAFEW(GtZ!!P) zr#<MD|C#E;v$~%Y^Bh%_xF|yvQ7+H7Ctu1M5+tz4xCvKV7wnnI#;}%?M z*9${A()@ec0|VM$z5U3Ai$-s%{n2R6@~s{s@3Qx>`t#eFJ=3(PRU7UX{MHyr7FN4A z&iNrMK8Bl!^q!HfLb}FCvpwzxq`iDC^)UUf-!Re&I9s|OX`kUXdwP$0XP@&V^(VIV z)IwyteH+R4`D2g!3Q4vyd#<|oOjrhUY)krr9Ah|ro663XX}+Sbg3B~^ff938mX7y~ zBpZ+ILe`@f*fWit%XT4qU5U|?E%H4hHG0zNSc~2;oO<-yVcz6PYWc7^S)XjZ!Pr7< z?f}x=#;t4v`|*>x@A$H`IYxsxdP9)xr&aE8mv~$wl18ueurvjU?KY*O%k4t4xf4v7 z@ketF<}-JsbCLEKx8srQXZ{@0Cx&CLWoOp914ylg>rX)J6tNKLhlU$Q!m{I~1j&xc zQlwY88ZnM!&#QJB(kNUoU=pdsxUE7OYouBv+ie5V%f_wdxwG9aL9*ShLbBaz>I&QK zglg7dj?K=|bWS;18)|_T5wDm%Bxg!x1yiNfRm_;56RXdeRZ~~DptgY%*2Oh-6*&!+ zGpchMuB*wpE;hSj=8WpuIaM>Ruc)ifnS&4C=KAFM+WeEPEvR;;Q2X0zzUkIHZKA>3 zUgQ4lK5c5HOR*-m&nSA(YVNR|JvG$ap(p!b_7e8V?5DMF?vQ&Z^pTl_?IU{ZQ}>FnRL7F@W^{z2j&(j;j=BL_&NzxDC`@Jqj)Z9|!LRp8&UjwD88agU^D8Kw5gu3X{)+>W%SR zumpS&ECtV`6?8n;2QL9F^_H8gDcX5?QjxEB70 z;C{Nr1}8^I^Qo4}{Qo5AP7IH=whi$L|ZxD|XAybaXoA6f@YuZ!Ek zw>Z8V{199Pwu1M7$3R-f%^JW=S{6^?LDFtudSU23yK}sO<1BC^*dJ^J^FW=~`}Yox zWznY%BCeJK@p{YFbFB8X25_;%F9+}Ecop~%xE8Dg?{m&S4E~Per$AcTO|OX8!2=xs z0sH{m2Oe^cKLKfhk9VZp)Oq!S(6Pn=@y3nkf^UJt!6r~6duY9gtM|hPpn5(03DgL` zKZA?G!{BnT6>J2Lf}25F^5Z+f1o#s8U*KC{s2w8}!4&XIFbsC&ZQl+Y0CohUU>Z0K z>(xlZJBrU2{#7r312i(IkZ6k5+-Rcj%4Gsi918FIVe+AM` z5?71MD6lBe)5?8GH;}488*10`3EsfG5BogYBsq-3n^L zHClM$1>jO}BuGz)co|50PrMeq3%nNmDahIknvFQV0=x%Y3$6z51J{6?LE41k4}h&qsMZ4R0gr%hgP($jKAnjxEAz)un6RWA5F9KDLsgA4oRDD(XZ7{*xNtt8!evuS0 z-%&>lr+%iAB4*t0UktYxPEv#sZj>p8yW5c>X3e@5!!^Q5ikNY~D%aAjU%^R=m~p=t z<>55uT~frX=l8MUUW1cluU`3Q!@UJ3DPqR`s=Q1$Gkr^nm~p=!8SV@8Bt^_5Pahht z6K@4c5i{=hPln5alN2%IepL>qYl>0RXCY$7{l0IwVQ`WnX58<4hPwbxQpB2!^seF5 zUr|!T(zxGd!_9J}h#B|$j^XOyBr$0h(%Xi^nqnk+6d^SkZn-1TqX_9O!)uW}ngstK^6*C%!M5Ek)+-8Q% zuB({UaBT$-mMS_rp|d3hwjq20Ex4xNr6TbhoypYwsGa#XM`wyCUTf%7`OeznkhWtuMc7Q48Xi0#HakSK9 zhBQK_e^>15yIg-{s@vbJB0rDQJBIMvi4p4c<8XYWc)lV zCu|)}{LGqBRaG;~W+*p#g8uZwD+PZx@tf+XbTlFIUyI`YZ(i#O$5ooSmfvRzZCoiV zuFq*F`P{|m=sY)Tt!n<=1&! z@k!Fv=MF0!J3WsI*_5soOwY>q$@IMI>PfTtI<=LpiyT)*hxBZxUZow|AE`}ubnIB2 zQ(G6SZkXe^S3FlNjJcT-Rt!_N50`@O*!Bm;WECHC@i3|Qbo{Z}jWc0Jj8m^RTJooD ztadj#{q@WKcH*P%UaV^5zc!;2C?#xv+;~>l9iM%<`&8I)sF~mP?AmOf{V6I7HXO>; zFZ=JioOj#}F*P{n>RDD!n|tqNT)FRo-<|SrzfHROz;PuV``-0+s7==j-g`Do^4@=R z@CS)3@80`4u8dCL-fe%}dso;UpMCd!n(_H1b47mGY@hx2-W!%T8rM<$99a8CgDT1<;chHDk*NcU%7OA8<khfYFPm$j=l-Vf0n+xngAnyT4bG(dCN+I)yOf0!$H1nV-p*&x6^$Fq^lY zSdS^twWbFcUF#-4ldrp2=x0P&Kk+lVb>@li`D}_3S#i8;nS!j`&zM-1rNz}L(@mJ! zXk4b;JmsFweUauDCTj(%zfdB{3ER!TDt<)I&vh7+R!uzT8aE0LIt6+> z@VajY`!4*YL|>zG2>0EPel_({emOAPSI(XG zwcHrf95e1_pX_xK)6Ze#b1+u>!6ak#w#QD(>g&boP{)ncN5kD>)$SWq z;X%j5hQe;^5MxEk2KrVJW5=p8ShJrQs@$e>JgEa=<*+CHQ4%lqGbYUsc3dgu?Pt-& z$CMA1(gBb0KZ`Rt6Ao=A(jrLO?0fe=i~g|GSNT=Vb?)bz{wet^)DvA>f5K_U{B)0L z8_(ZGFB#8wJbLeEh)gHqk*|pvKvajWTIx4lpAuV2V71D3IokC=|_w`5T zT7%8CC~aodUXPO5boDt^H8piEVRWi$uJMlT5LPU#ZNupBUGFX|{PEY&&f;u1)XQ=6 zE9*f%=j@b$t;KOAouDh#EW@F(j;jen=C>wY$xf?HIzdhP4fwyyu^ju4X%~ zq!VBMcZo_m?Vl$holjShFO0cw1UbNGX z8!Lmo^n(@4Y(__EBdP?%qc!hlI}Kn#b~asWT7B)pWIe^b`h2 z3|8AVuCTkdVX&08VX%p|VPuK6H#dY@%p}OXeG>EeNlc2H4NO{g4l;!B zlORI~r&AQVuFCSyAv{GsraXTbuGae)ba={heGEE;P;c|3Kf}2CE+2yq*HXKiPlsz| z`51KYS#5EyPI>-N?sSfiDa#+qb1(5R=y31qcjI%VryOMPc`s$FPlxcl5@623XT9f= zI;xbYtt`n5$5msH;aYmD`E-a4^`>zd!pw88^fBf6Mcmgy=Ly=i!2+&+m7mEk;=cOx zYIOa<71yGj)6Z~UJAF)9zUp6_eN1`2-m$c5`CRF9YeyR6?r#&t=fzT0ikI zW%+tJ-Q;7+^Hpopa!E;7D*d#;l8+&tKk(m$Zp+eQNv;k)6T)I2Q$B*=SXwyA)hQo= z$4o5jXSfOLt$+>zwA8AXbj8K30RdOsmZc?os#YH8^rmnkpMmt5f8bdIjB<%&EV z6=RkbEOMDL6`7WnIC2@%57e7Jrc6bhrR9!19TjYr7C1^W@<%OiE>kv4F|WmrT&7%w zpH=2#%7!VPwE&W*GgKi|Z!?!EQ*mf%Q6!fsAFBIOUow{|8>;YVfh3nHS7BpmNhFsk zQvqpdu_TwVzqYz#GS7lm6D9ErDcy?rmR3=ZuBwb=Cdv8 zb5&;SNLmERb;X+zS6cSSWy;LwpB6-N8Qz2FXelI*87@~^1j%K}hU*Ec_1tC3MOa$+ z$YYG9OG_iUOqmK%ON%CXjIyAmWs_XSwtj12B#%*WEG?PjF@-82wR*0{$YV>(Bza7s z9`k+vGP97SP_1l#j?;3fR{yT9E58*>9)?5x_@(k;wg2MT^~rCC5tOOgj84FcrMwsp zsRw6?(U8x)paN|idT!xRoVPf|oOR;IWyg|Vk!6n0MV9K={%<`+Lh@U0e^Awzb1!Ov+Siy~mhz*q!I*F%qCwZ>S z`)f#m(bLiMNb2b7+LMf;Lq|zQlERy06s-zDlF|8*0Y*>o+yEmN=LZ;tx!BJPSLjLt zjKVxFz$m<>0Y+gSA7B)+i2+7oE(IqcBhLGp7D?S%6WPrv?~> z`HBFeFv}+8#i1%7*3|(EU=-##0Y+i2^fRUoIXB1<=&B$?psRxn zfvycQ1iCKB5a@;=L!hq>G6Z^IkRi}F1Q`N-Q-IOS33FL8#`0C4j|UmTyg0}Z<|RRf z@TixK7xVe~ghzdGd<@}Hj~yRFc+{IG$*5>+4l;yCJ%bz_a<`tc-Wy`XXV8}Ww?&ou5zEgVpLugWOtzXA{NiFs>CV$C3=3U*qPv-;}-Kp#?NgZ8X z^UipTsZnc&nIxloSD)r2qkE@kw~x`yHwPG{TFsl5bfqVl>W?3tvNT7Urz1z|E1YEH zNWFrSj2^qS%FpDproEK|Yx|?~&0bnn%JkPs^llE;Nk({e66QuTo6(_8qVXGci5N~yrR~}prEJdV+gZK2p@wJ#e|O`%&N)w7(7u;#>Wum;vj>!B|!%DaREjjpQS;D zFsmk$^jQ^g)nt4OVOCAX#}H=KWPA)^o*ZNd^CdxsFi#0Gg!!@{gO^hSj6ON82r`6O zHJRkq_1UkQjE^DA(}N6Qo*85a^Xwo)nCAo;!mOH%&u7A{nv9P@R81zy$iShRjE^DA zwLyk3*995E+z@04^R+>SFfR-;g!zUbLzq>Q@m-xTt0v=P5aR(x2B5`3hA=M)GKBfo zAVZj!1{uPm?eL;pW?+-GB`OP3hm=6RQ!u(c{AhX-p$j=SG!EHpE0)FCwxqq z=^C=s$Jn-9&ED(!Q)aAKyL?Q!`MT+s>eDf{uap3zr=$50J%5Z9R3p+nhVW6l@G<3D zp2AZ9I#&mVn^zl|&G^4%G)6oe+A2@jn!i8y(qw&%^&rh=bOPTp=fa0WvgRvQYO`JW zzh%yYrO!4x6OiuPJ>}2IZ<#)h&*xcfZI$O6S0r4s-9GS{OOm$AL5?fw1TCDJhAkWt zuWiYX8zM%OB!-PZMHD?(!wk$C)>1w0nN;*MTV~ndIj;qJtd8sbx>VV@) zIy?Zj9vux>ij81RxCACx6F$$Y39H3bo6#{fVKSWQVPgBEbHg1S)xGU&U3?N#c@lHu zNzC$-nEL|^Uz!E7I%@oueRac7*6GaEDkc<`?w%O zn8ybg6*rTE3}K!cWC-*0AVZjE2N}Y%ig_^`(4KjphkDoE+n7(0s&x>na=4VXV zE8C8zGhF$wpI@gy#ppiAXO*;Nrj7NGkD(2k@JtUdD#X|NeKsw{>S^g+%k;aL?bpfI z=eqh)dpaW&9$DjEhBjzoW1-(4V+ED9$JHr62Nkm(VUkffsPWAnlb?^*9eqrhX$Aho z=TF%=+=Q{ud#=noPL_%!qkO87&@NM^&Mao>bC)SM_Hd1k_84Qy+39Br6o=%aj@0mqt>%jNQ{)W2arF%-B~K`};}7xeVnzIvN+9WRwnz{fw!3YV5P8 zW7^|1O4?=Y_T_3HLq8(?QBMq4htdW{W1wBew(e?lw9C+E2_21tc9}9Id8@$B7+aIZ zV7ofyiVRDmq&>#;_L&)ExYgM~hKp%Twa*nkX>_&6C<-l&ul5*4n57ZcE@O|I(AaC2 zvBynll(o(HYjI<7ZTJ1AD702Rc;;8hx`f8nYco25THH9;a7aC7ilxA2yZQ|-W;8TZ zR49@{n`r%*>V|3cvu0EkPMfLuf4=e5H<9^& zTR-2budS$9IIWJ!g^ZEA*neyWkmmREQMPCguJp+St8PZatV+i>Gj7p7Ezvtmzg%5x z4g+wjtkI*VjV+!Q9a~mBsch`UV=tUIrnpomMh_j`Z|nrd<5kpEbJTC_#L+`5>gsCh zMh}fuo0FyWqobpTR>g`H;&Yr3%TueL6XL*yrcI00%$zo7LG>&rc-PIStBzG)!w`iA zHxwmfipNfxFsZb(*f}}6(7lv`Q#yO}u+ja-j4@Xn=3G&l-WBaT^ZRTw)in*VIoEra z8CzUhKDKmR`S^*&=1gpsdFIKhoqQSTwYiMrsW<=8w5po=21Q1pZ+4w&o})H;8j!u9 zp<-Iy{CY}-SgdXuec+M$EvUXORz16*UmJbz&>7S*ZCV}aaCYokU9n)e7EzjAF^j3K z>Q26*Cpw#Yi((CF3StTzcV{ zi;BGoyhab5Gb2`2F=r01wF=KZP5PBL~!{}~G!YBY12NiPjG)2ixgEp}z^in`jG zDlNyQIRr8H#{a&m;v+v*(bS<7E>) z;~A7p*Vo7DodU&8z_S{v9A;*$p?+HJ4DQ0sZ80)kRXw?`qQ17Ky1v3vNp2VFR(8i;6YH-sqv4V~^kKYDN!rXW8T3Vy4+6Q`LAb$Br*9y>N2rgp%%-U zbULYc!lVl(jGb`NxWDVv%{nI1e5JWR@!N6jPib`(^Qj{6PVt`@@k5XeAlNORPu%(e28)78nncwipt+cc0t(W85 z@(YKKhz>6pR#@aC5$Sv~Y}ha%pMU1m^t4@!K3#Sq^t}bA+ig;+75Qfa(ec^rtN1bu zY-t&Rx|Pm-LJ!Lq(EC+aTQdhJwlYebv13zg)@~#EOE>q(Mx*B&Q7?8EeqGs}*>_I0 zbySTkwu+1Wef@N%7kj>bd|Pow^dvovo1OSgdcGMz7d~N)bjifU=e{}TtWcfz_s^GsyXI^gvHtBuS{pP^0baW8SX5#r9?so@zPdmDQ z>wX(J@mq98koL5>_e;_|d)x)3W4>QDrEEgU$XtHLUOXi?NKPsnS3c(A3ogygQE>kk zd+!2QRh9OSugyV)qaMIC5w$sjn&BmGDuU?|fy@xCtZC8$1Pl^|0L!xGJ(ii7HB?TS zU1ZFurfEv6>3*TIrfIBEv$4r2rh5`+@KRAW_4|I;TKjU&;Z#=d`~UxbpLdeS=Bv+EkG7gt}5hQK==qdbfV>Sfr@#q>T&^i7D7r3;uM=@Fk~M0}DN@ktiWj_i{VYel?a0TR4~{zxl9 z50;uwn2zsTK~pU#dMIhDyJx07rg5k}%h4ftm|%xPHp_Ieq^24p`=dpSOi3#Z>&oiO zFe-?|KL+xAHzNELS2Ybv#B=JJ%&DgyBa0Maqp( zVU``7CJ>YGS#app+*eNF2IJ{acx#4754V+j9y}a|;9po?RaOtDhT@(o^eTvUbaiZ* z4*zt-jqj{0hnNn%VG#pCCXr5u1CZsgQ6Gt`M9lCht?tq7Qz zXr@_ECNc~M83s84;i8Ak_}*YMISWrJDv&AAsLLtF`Lf)YxoJ9T=O)wZ9k{5@fezTc&m#!vOyMe=K3KW$e`kYHX5oJ7&@@qi8n4=pAh}gi%%5Hc=o-@ zn-^A~yWz%IywOm3+CQ&LST=Ich>w;ZzNBNeQnH9Q{`7gv@;+B}OrF@&w<~kgGjq`; zOZf$V7=O*ior|x$bjiP`w%m2;R=hw458{nCTOXOf>(o>3|HG+Md_AixkHu1wvx`_KRPW4Eq*H^XQ+eB$7g+prk?hU8CoufBH2O`k7F zy!6HM&U*IXA8^D3;t+4-q^!xF;!a)t*M)@D^>(}DN zevE74jTLpJF>C&iGVjeRuDEg4SA#pyXi5HYyRSK=_~U~6?%#jDcgzsqU!c$-`Rg@YxmKc|I~S3)Supma<1f$EZWn%G5yJPJCpllf3f@PM{#%}DgzE%I{)DQZ7+8I z*Bx=YpZ_Ace-pM!B>%zOFTZ?p{)AuD|rGq-851k3&k~ewC+c)3JXW`^wtCU9x7=^&@hiP$T(S zO&@HX^x>Hk27YkK*36U2AkSs^cw_AB8S&e*bE8IH(9kks_`IjExQlT|ym6?a?Y5fQ zMNdrnqwDe}S0Xl4D6wV>mMKB zzxUTT+*R_=`nu$}d4GQL^UXJ;9(D5*p8JJ3i1L%w3xDM~^SSb34@$7c(%qoM8jjR9 zpxdphtF3PwS4G=(^|j}s-|=F)T-o3qwJdwWaq|~j|uSazR@1Mm)9;?SpB1lH3r2El}G5gRY_$bI)YGllLtS| zb_rJ$j=%{k%a}( zx~keGmEJ{&(EMyP&Q?JvtBIUu-(weL9_zdH7;#Y9swOyR`*7}oZq+vI*;Pf?Wc8b*6tKyx)HPAYhk@<>&X5t6q9|D-(P6a3R&ocuru zDSQGMBLgkDtdSh0m4af1wyK;EVI0e(JHL_h z`n%Ep3}bB?y8FY7|Cu_6;E~vC395iKMEJqWZ}Yv{M_NxfsdRri8NT> zX)wH&X-B)rNWpuiA=8f+hMn?a8k^}%Z$mHIHSL>jfYoh2n0dtK-(`I8WDW#E1%Xk#QxOhJO6ec$s$SKQBWb@W|G~kgu&^ zdH`xN{;}o_isef2I4M@Vm7vgM;puApb8X3x>i=w845$)Wn&vC zwory>!@sieJ}6~_b6sVl3zV|)H7I2x2Fb%V!w@`*kL{Ns(m=7*GUSm%Y^x9>@Yq5b zVlybVs)o216k8}mYyp)osfR#uE!hw)pfHsN#RG?iO6nz0T*)=Wc2HbwH^dH5UP1f{~V7SwT)w;q%V3tz@lVQB`X z!m=5Z3JZ@D^hz64`cq-y!I#OB_YkNQNj(ZmrP`CARH#}&u~jvMxku$4g%#1U@|#f8 z3yS6(C$L3RUp6-4`N`g3FhdQkW_^Pko%mGeyKiT=>uz z{?lSGF|Jo0068IrdM|D-%}oS@_$!o8A< z8rAa+q`LgT=xJSEQFo&7)}0uQ=jx6efi^6E%W(C?HCgj8Lh+Lv31q183ag)~eH^f# z<}-Y}XF5&6rP7I%N4~OcDXpBkNp+6rO^4aMWSw8u}=%+qTTzynk z%45+fN0kaM@9@EK*WmL;KZd6+lQ(aX@E%plr_-zE36mQSUsc&=C{M(dAnR?qq(t`CefGjnAfij|~@y{HIlXa4mN2+csxtDOS~>FZ{8MbMu+4OLw27pmelt1v%r~>g5xc!OiILpl&`XJ5|xZ4rL z`3vq$qr&sLc?(pW_dszxpMV344X`HXEbIh$?)?p<0A%b4kJYl)EC1vok4qG18#xl%|Ek1muWmI_% z|Ga~FU_axhY&n%7*w(p>HvB8sD8mxuOdpPLU4|N`3Gutp9j|b7rcAT;y*JWF9v#6h zMvjhY3o&&lO7sE8Wo*Yk^MIyzm|q;Rt9FAj|M+r^*Y@i{?N?vvmoqOs(iTLeSz7w` z3NzjD0WEEdGK&0<sS^ilN|OEisMYfcyMt*2$J8-FBQV!D7p@H1#9qLE3Qc{7MG;VM{H+vaMEfOB$-m>Y(@x%`5DsYt09nXYL?NU2nCW zn&F@`9dwpf(lS*Hf)zI$8Vk0rU-9%gg?U9Mo#-=X14^YDVVydOGlr?-Ic1QV)l#P! zjyU&Bh2vgt%-Sqc=GMDB;@xrY5LP0#wR)+J=#ZtppC0;a-3dm_p>+aTOFP1h+8p2P zf;q+0W=|{f$?4A2Nk24(a*|=Wr#$BHSM8OD&p}Kde}1*_Fm3dp;k!Mw!=Tetcbq=W zcjAocMYB$Z4x**L86+7&i!*4bXewO>S)}&fgdjb=@6+DPo{%}wD-E^xdP(iQccC>l zo%Iu@JMBGA|AS07+Iul*i{?SDoNWmV2a>)B+Iu(H18FHMi{k+gA4hqr%lP{{2S1ecr-D#QZ zkbLKbs#2j(CuHe|;a0Ot(lfFnK6SS7;db$q8cNdJ@TVCe>TK(*f=A^PrG>?)4uKk3 zx6dwMWCurj`kfCKLuGd;Y<8nUhrU2M9QpB5mB^87^C?yAx^-K|rrRgbkgtejuVI0F zVk_+-kXG*)tj=dY$&P3zRGrVZ6ROTs7KS6Dd zd3PFn{$g9bt2)-6s&kRFIV16Zj1nC++!}QW`f+-5uzUzt7rJWp z>fLFqam^>*2-jG=J2zsyS5w3yuspN-ippC&?DBcLyK&zJga1FFgk{_;t)+YJk8fYmPn#3F78fg5q zcXt|Pf0X=ijk0egKU||M7t_S!_k*+C^ z{7@%n_Hpu~qNF_HJUksJc}p~fT}M!yiO0#kdr}_3{+fCOapF!*c?9>`lO?Z3Qy%dT zP$MLdpI;~C5uKn$N!}q%d4wDNFm(aq1lL1JdE`;^sggGeJW?Jp1=Lu{%hQxcoC#{2 zB#*lBr2c0$tl*(sJ?9EK4Tl7#A?@Uo z=DIqD8q%29A9qMdX-xZ0Ig>|Z>8CMQd3kR>clu?@nMgY*U`Js5&y3d6M`lkGDJS;CPi;Nd9mQh}O&Wq*FEN37s zW0qx$5rLrlhHSanW*f5gRn&0YD=Hfl+g(Ex;h(LoAxiPjdSXaD7PjL`r;F{lA&*dH zdvC}CMTbc0N&Iss7@AV}KSom9@UJwHwuACY-VXc^lT;`Em0iy6l-({+%I?>olwIuM zYdt0I#xmT95h%9LhCJ3>xx#XyT%pF-Ncl7i)UlG{o-2C@=&*rGk(3XVa*w?b^BFM* zrQE9krQE9mrQBngQtol)$36uq1WLKb{aEE5`z`hmhFA|uxpyll^vl>%7_xsGBdIs=RJr#SDCJ%oDE5+u^(k9JejG))$1=`- z%MdXre#*T*pp<*@pp<*myjAW|^H#Yx1e6M&7nE{uI4Gqj=L4nO%Lk?0n*mC>R|HDA zHwTn*Z!Re1-kG43d-Fl5@T~=vEJNA^ignVEujaGQL+XOZo(^Ra6ni>DG=pOQ2HieT z?8~5g2x^3+xT6Kxl48}%l2jj1<0TajYJ#NrQJ0C5N(9B)0^LYZlO*K@l_M$c z{pCuE{qJN+Eh)n>LKkueOt=aYtL9ZDO7*M#c=&r<6GBvXSY2s);yS=Osf=UuNU8>* zKtzrGNBj=|q~c`ENnr?te^POxMN=3W^7xW*)fLCS_$r!xHjBQ6 zm1T|N($bpXvf?;*d{C0H70YZ6HqKoVh6@|YsISaE+i01&_+cf`xF!^&n(DVZ>oSO3229X9OBu*s+CDO29rlJo-CWxOw+QGzmz{Rr5w_ZzW4 zXYa>wx6XdVeK5x}xvA#34|&YpFK$&j_Y5uN4&oj@M84?wL)BxDsCo}ETgY>`^ox=unT=(2nqx*ovTO?(+_2M@GaYo6BPCce z90`G2+s=3gJ;6awBrR1(RPV1fMT&gI(~3^an|0#JK6{v<&TWHyka~^d-qe_}SajUE zYv#On2y68k%bHTJaoDxhYrvFx-eJQQXnthlG$z}8pXNvAq^$I8DNfCgnNstk0bNhB zuIJ8i0P7-00h`UHiVT`=G(V~^uX_!0xt!U+^ugtep!xBjmXU&{T!`ie`)l*eCR+~Y zF*({B^4aE0#JKhZj%{Js-gKwYu^IdmA=9qq*m`w$E)w}i!SjI(0L*u}Hw-c_Xt_x4 zCBuyl$i#830mEjnyK|8^ks7OIC`S|NT%;VxlHj(=s5Xi4?xgkh@pQMhagWTzD8VH*$^x6DfRa@obltk%IV>>DSG9 zQRiS*xDXdjB!5@pK^^DDIPUmOe=8FM2ZK;b-(uFC7fYWEMod`dh)84QIe6!2gq$ zQIa~o-GuK|$o)ghMnSl{^1>p&FU&opi$g7+{%}$3=;`Pen2<17u;{kDd;|Ug$aEG` zN~KGr^70jAqE58sx+|xCq)Q*jtYt?66S2HtN$4fWG@qs9I6Ubt{Yt=JHBZTy|I*)X z((ePvb!gd0>Bo9w%r{+9*j+r{iovogJAkcmA{ipdwkyG!Sj@VH#d zC`n!ZLhA1bJiIqd4)wR2{MZS(e`;CAqq}rweR~fw6Kj;OW_iI-{l{n={|2s{@-u22 zS1kPL`o>(M%|Lk^0FBIscoj`FTqhNm6ctQ687p*7_8HSoO)oiZ*6i7HXM{h=i1;ME zo{B$gug4^8MvasThXv(TwWl@W;OP>$7U`@- z>f*tI)aHaPp48Ahl0y|kRXpV(c%dgCQfR66WT~m~_dUlVQvWgd@WYU!3>os!GYRQ& z==p;_?J>@m$60_s>}WuyKzKT0cj9|a|BG-=pVC%rLlt55i8t0S-tPNmams^zR!tmw z%IHxThA@!bouhY?^}8DHKlRNE%KLqB`m&4viD8T6ulC;l&NI)QFn7-fM@@fg z!%#L4@Sr>GJuZKCcP<`>1>K#0$6-`=+KSxO>F(S;E*-`ji~l_~an^?3{_ASqJiYz# zn=ix%wj@9N{J{?-Km7c`Yz&X$jc_ePY94fVZrw|gAAW9K9NOP_BV5aHf#ip48QvxN z%O32!_KtgEFRD(v?eFK`*$=}Yb?#pHd3@^Jz3}t+4kBNgIEFZ4twicbm6X-tJf>xl zPeS?;M;JBywA10xaQ+C5#f1wSFRU;7c~92**_Fr|j_`=KpG~Xq2(=llGqM~9-#HGf zJ2Fkmx`xW76}1a-475H^@yM+I51hvMzbBG?*SVGd->3+7R|G3Dy!d%rs>c7mqw_d+ zi@`;W#+?}N+zZ-`D^BV*lJbb>@z0gwIPn)vc|qzoO{n5xu2f$=#=L_%jRSm7Z1Yl`;1{Y;e@IaQeURO z+z4a(aHf(Ta$XLH@idg~X^naHOS9?=Op!GYcv4RAVJ|$88E(x^H~{xX(P3@qPbV(= z!=(yg0oskm~I1JR>JYE-~A?~A|-xyh~3w`~cC zoGo7p-)kMh{aS~SD%!Ca7Koo|aFXwCKb0`%|o0oLy_!}@=-%kO)g8MumCbj-T;4WY(a5s=1z7G5~a1U?{ za564cze%amb)w`g!aph1gyu`0AOEC0;!6C}zc_KVraWQ@@>03y)s#nU?1<0l3`|cw zEq>sR9Vk!N;o5@x9Vju^;SvFVs*xL$ZUk1O#-xeS^?}P$_wC#gSm3TZ5pwwd=52T& z*c|T1bq}trkT!J&cr?Vf?eem?Vj(^mwgle+!!Wqwy9x{X){w$7KD4l4SR%_#BitW| z){^%Ole)i1W;64}&Um{EI}?1 z_kmQN{0PWAq&q4PNqIyC{^v+um8Lx6B2e5Hh!dA;$|G7pDZAS=g;z5^>BIqU@x7an zPp2JYj5Ln*2JmHq(Wu$(qg$hL=f#{oWRW;$NS~omLu-dz5ALoG!yS`hoIp7dXm+mz zFM5A;bmvadzRG2^Um0}+IDC2;@TreGSHm;$*HX1vbOva9H7D^E1_|VDX@5$Y;s&3nsIVr0w+#U$+JXZZ7@WdC*`?>}x-~~fvZ83t&69=W% zrZZ<5KIRU?%2cIkM-K761K0-`03M_7hwFQ8N_B!i2Z$Cx)>bTi$ecYLJe9MgRL(NR z;$%BPN@;m2xfa|jIcF~JM5?Qt^vRrj7WYYxoOBP3Moz8+cQgv8F(KjJPYq|P!inKHySq`WqEzA#ry%F4^X zJ8#j<|NME&cG#J-3}a}{V&Wom_Ddjx{}nJ9$oo7Q z6kc`0KT|DEEYXyzpGs~UcuH>UCtb7q9`N?Qz3}M5K80d*Olv}+NFKe_z_E$bx}rzl zoOgIwzaon6v;DXZw%*<^TrusJ$B0|d zA0&zPYejVXwb765H)7H5Brz7v7*TX_Cqw+FY{GwtOijCty^Oo;kTQlemt~CjFJ_W5 zs?EUX8Sxc7M+rl9@5Xq;N*F$nYP%pC2j;ix2hNoD%wKi?E7>ok;ob-52MUyDDUn49 zTmwb1?Sj0YrJEO)!75y)VI1g=b1X0!8rvT5rU2QRAgJ<~#ysE*+)oFx)IfvRzY16g zd>V-E&i@bKOd!gwC;~FfwYXH7B;}F*GnM0{J~AnfXv4pfdtX!RGrmEY9K}8(75Sfo zmLavzt;rZgrUW*n4k%o3OiCas730pC#>m;7M(pi{#toN41|_g{-7yt0M%DsxM|%&~ z8AFaA8oxg}W@~#7_n`LZSaHMch3@uVQ8#rMEOGAjC<}XVvD7RGcvFW3qI0HU{NQQt z<%)s51m}U5Rcp&`H^rf2wUmtUUzK@0sdxvIddDvG(})OWxO- zVyRRuCFVa#Xc3z`1Jja3>dl2W7EW*dWnojHaX9L8@Z4-E<6EN(XBCR$Vp>xQ-Gyk! z+|ijv4tuw*ozd;9qKy+ecRmtmL-}dx{Rpmy(DGdgsr`ZYuZ-5tfG;U};-mYG7}35$ z?B4k_Tuf-)*fGX^T48-*8A=XaG;-2V0$GM!`=edy2-U%zBAK#NTHopLx}V-39e3<& z34!>W&4H%el6^~Dhrg{D;c362A^+b8;%@QnAvfmJ}dT@4(k?>R;|5BD4eE&|Tb z&*uQ^aL*cYK9J*sdLTy!boXLlBXBM70^sdHd_cm#8F&#e0K{h`{5=s)-uDCYJ{9<1 zK&HtxxKzy|p|kTlJ{#(dBjzq)=3`ik@CoYmXeGeq|p4};8cA)KzE^O)Q<8SFo^fy<1Sbgky;;?7`#*Q*K7O9Tw)ta)z zg|cg8u&l1h`(m%+mWObs4{^bkepVA~Bc)1=_yYAm#%3ju!l#tMz z&&4;iGP}E4;Hw?8&l$6E9`GNMe8zWo*A|D&19_d4Ii7a!b?_fYNK&e{b@lge>x%cg z+NZn3=#?FP-P<~j#WfPMvB9{Ka1F&Z#Eo>1iiI27(o(wm`BSQl4BFX{_nCBMyMLb8 z*7Z^v##&dYc{egroL-(K`?|Y9+pWQ$a5p*R4LfQe#(+=!&~6PdUaDMH!c7i*mXb;o z_-1w`zYFiu=V6yPPm5kQX0Mgp6F#{zE!jsk80rUD-YjsbFXI}W%Th402E71oZLkqr4H{_?!AP2p} z>MOSl#jM6(7}aD9+u;?zy}q!=^%yvHmF$}l8`Btr11;H zV_&{a8LUvQ+1SyNw6Wvq4I%|AmF|P34P_6O`2#E5y$WX^`s%b9g{wN;SbY-iM@l)K zTh-BbL&Jhq9i9#B4_9^cc0Y_~e4_6Axan@}VfUdIyY3doux1Y8aNpx#XSp$Ky}XM# z>^_)QVcu=2Xoei6IxQ+@ztJPDlJ?1ev1>I_#iUn)Ldr<~S_glfMK4F&7JES4@?uvL zWTOtd4k~}^Ecfdwo3(qr4#ytcQfUlx9d^S8WWOrew??`i-ITVFwDPwO^i`Vfv_iJ! zTr*s*rp|M138U%7u4cT7uI%vs(fP3_1f!@6t*O>N|E^i=au#r_%kR6!D5!GO{cu61cZS9Kji{wY)8b)nv zdhK=HY?!U&n!JLpR+0QTp7m;tw)q=QE$G?{UoL*9;{-Q+Lf-i?PV>3ps?5KQ9TSp_ zBL*A;)# z?xxPO9=E>ObuZFIm5Uda}_Vo-Ko>}tWb3tQbY z@ieP!RmZVwR&|WTHF(3SjwD<|aShp^O2syjh7^AZd9dBrYs*ug#$1iHmfv7e9b>hk zsr)Ps4x8{Lj?JHYc-SDHkmjobFYqW_14KUl|0XH6Ew4%HUi_=4k6RS$qvGwdsJAR? zpGAFcQBj6z1IPVqyGa(6VNq;*l*@${RccX7Eb3y5T4_<&S`=F*<;p!4^|(a^Ky63J z1_-{|{)(g?2BmClv#1>w^|3`Ix=cA(v&^fYRA2Xrq&67M$-UnD`kimzd*|C|aQ5Tk zvGP+wdO+&Jd+?0-K|Ba$?7m6&fbv_mi_2vnIK-3+MxXILG*_p*#m0o6kvjP+>o)u4%-IEcQIkZLC7dCnQu^&-l(-bvbrl6B25i zOe9O$B7DKr9%IKNUrfU^Ov4SgkD@hyJ;tsabEC(Sy)y5;`hGa@54ax%{3DQdDaSE3 zK9(!j%nDNDz^8#*fX@J*2DSiM7M=yZ0elYF27DfP0Jsgv-uDHd z8|C3e;L*Up0NMNEjb=aR3NHiM`~D3$6Sy6S`G9y8h;ckWY~=R?cLLV{cL8q%z6NA( zyc_rs5bs0#5k`L8&5ujG17w>03y6`2co&EfgLn^!5dn{<@aF?R29^Rp0agIpfy;m$ zK&*TS)FA&_U?-4=JsbdT0e%jA9QXzBNqyg<@3#ZHz~2r068IL-z^I{3-@gw$3_j}` z`JV#u$pZg3z$hR$pk2TiU{4?qh3Exjjij6x7zZ4K^yLUhjY3G_NG1GZ-vqo1G^Iu% zZ%Q6VA*4KV>;WB5$Z?)R3VTxcXI{pMJ2d5yqZjOnf%gFZNqNLm`2UCGJ*z48alqFl zZwLNKd89PUNSq82DUUqpM1{Emxun8us~zmXc!KSF+amsZYxv(R|J&rhcQHA;F;-Bx zQsY{Uh>LvQB(YT5DV27b<-d0cpO?!2HpQQ8gCD zvZ4G~W>LSkD5Rx+y4IrBSrmIoWfy6qse3KzA&Yv_qL3z9j=8Mtf)KwiQ=b(2H)wm- z#KptVK4TYnF}R2y#p6$zus*|lU--M{O~Fn1gfwSUZfv6UcV=SHL;I zvw&v;(Qo_D0iF%40G01&xN53I2v6( z3`u0S_>_5mEUp1^#f!@UN>gW;q(0PjN z;lj##@2HDvm)3is0$x*HUe;J$yTn`FfM@5PdyyBX1>wA6@42;&-evVmmoywFW|UQU z8*9DVD{ondCr9QOLN2zJWiW;KeJn@SzYUy8A;ZNtz>C2}{3ITK$~daN8R73)EeWpm z8IwY5eIgvTYCRV@hk(&6mq+LWf@y7PH>)tne}*d!7X)PoO6EFL5r+9jAdAI%Ae)Lm z=&JKaAnn`&oD94jm=D|tWEF1)vTFYhxCD3ya5ZovUi zMZdzOswgRs;G!i{JWedult+HmSIIpJo|40Y!^vEN9NQ6fb)UjPV~)lb6wi6o_EAY&Gvaw@g2nVmgc{5AR=ZnsB-VGje(vG2Hj{5%Z?P-5s$3**eET)X9 z;$%Awn-xiG#Id87yx!&azK+4kmx*i+M6wu@(3)Ndu3mEFgm@Ds%`xt$Fujh)W(78# za|3&OwO`e%XZy;Y+yvRX(~jRgRimr8XpvcJ^Tapb7CwCN(y3=vET77W>|4kg)fBXW zN|a5($Dq=2CCK5$C{P3B`KBCF4-n=T{T$T<=VOF?(hqi|8Dv#L&Pk(03ufQ>qAlta zTxa1b!&QaLj|(&QsHbtYef`Hy?9_{BT%74~4ww~Eb(`Q?AMlAC@gS554wJ04=A#hw z{j~XAaE;H*3a#->G^@t*8-lDejktnOC}T|x)w`9tEprer(=d({WH#k%{;Sby_xbNY zFZg?a!+~!B>31t|3h*7^#lSWod+g{Q!q0x72XHO$U*L26^)7I|etx@tekbsK@Yx*D z-WJVgWqu9($2I?H&1Vnt5%@1@{&vl0v%zq(s2Oml3m66bT0dvA@ozl$0QUp?>-!|& zm$**_9tNiAdzPfHaX%MG`2|3RuL8(;)d1VU$Igu8FVlQx0hQWSv!&GAtH4Wrtt=GDGwy&1Em7mM?Sfx4k+YV3CLuhol=Ni?@JsnpY*K*5np=rb}O~1W2(v=LZ z*O|=|8u1*i3NkdKtD+}t$osUFyBmc_8-AF50FXK*YKMa}b$hJ-BxOQs{Wsvn;39t7 zZLQ~*Td}`UU4e6|kF3*{iX{=ZFu2;n`sIsORap5TcU7d8$tXNi)thRk?9UH?!y026 zhMBdPt70r0G=D-Vbpsy&qMV371N#FX22KG!2Am0e9Jo;5vz+ptBRoFmxSaQN^En_& zg}kTVynh<_Jn%W-HsChk3qaP+mw>FDe+9C8{u_|BWTGs=3@s^-?9!P#apHXNNO|N( zCzTvsP;&NeLj2V?ZQ0Qk)3mX}80>1J9`eG4|CqW1dk5He^rKvC=v9bSW_08&y|d5z zx+?aD=%y6`(c8$12fw9v@50VNo?DD~r7N-NnvQ;M=uf*}>FVEnO-Jw4YdR7@kMc(~ z#ocgChbQ&xQm#u+ZuJ!I>1q)YJK!=I1Od&X|34bixtVeu7@up#OSH5t=JX3zHn7xZq;P$MaD** zGH7nsu(bRxciPim3hy55CA#-VqXx#Oy4qJ6xmD2L;VOF4O$gT{X=BbHhQw(13u8P( zf?d-j*iD07ucv*6hczq;b}>wHQ@1b|`=)=vO8zK+uMG^BF(C@IIV$bGyl3-!T_4r7 z70(iz5KgxkJEgV9;h2Me*l!qO_-p$`Y|M4N*7b!R#<0E7>y5+W4%gwB12>A9L!vZY zvhOkv2Q0Cz=NG0G<`-UEbJUs9X{XJJPB$iZ?S#hSSWo*^o}TSj^=yB$*R9KI_MnAI z8kAczXb{_}=-b@;4R>_=>gbr8?u z=I0wH?AjT98~nJZ#|F5*LB<}XsPCG_)}FVB;WF1o_BiZ15Vg*AA0u8(bZ zMNKcfN{0RLqKg(YHsqa@PghkAAA=l@X)7+ARP{v7*Ncq9?o;Kya=QmP9Sv=i*AQx! zsyhZ5RuHr)e&qHik2G~Y3wmT71YEjA9=0eXG zL*JNmQ%^hkww^aLP4n}695xPI6xg&O3i%neF1CGjY|r+~d-k}+b>oJD8~46~owlUH z-0GgUpS*QX*XFeBCDRJU4LuG=9n6q*VtI9ISN}FKx=iZM_zphcXSoo=>I&=8vxr!f z4R_RauBMplS<0ui_AeBvIeU!^)R}UYk>3iqDjr{acrogkI5qL28pgS+_M}0mdw!;t z7{+pw*cyFHYYln-M4+)Qzts;3!&tI)QKQOg4U zHNRjT@~b*z9FAcPiZ4LXn*Jpn0#mie~4_hn1>lWWoK zsEg~FW-LWU7HiS31Dp2YW9R}cLeq2ktWk{x-+q4j{Tn+*VXt%Kd3!pNQa5&_xJL!9 zOg%1eC0gvkXYJ`2a@IT0^uT*QIimu1&a4jH3I5RY-sw0x=b}L1;spU?W-`Wd!vn)+ zj(`qiWx$(sY~aq+bK%CqKnk>ZqjS;&QAufm%`?vrY)bkp&~ou#I)>z2*^!iVWyjE& z9DDtxV{lU3uC0M{-JZ5@-sTIDd@*vv&A;MKBsIuD51O(C&qoFR0By5lxvT!wXSg21 zRGBV_gS-5HMmoxo99){_HZYQ#2CYm3Q|sTj51}Vfa!>ma0!yw;%9TNGn0t8Oc!%6Q zev!hknl7H3N*B*fWhnQfkM}}Lxjc~U#`saW+-jr*g+R(rgZwneZGsL!RFG^?D3a)Q zS<==(nY#jRdJ$^V-Ke+3Xwmr)S})H*;dLQDk&}nS7`u^!%UT<#ItLnW`8OB1+gH1{?d=Ry@4K>N@EYVZuA#VwteMkh$HMuH zG2(N^O2)^KadX6qF-q5MUv3p+CPt5FJ)!EWMSHrMeX-E=Ma;zEny7YvPmK0uJ?F@M z7wS|G#5o$h?sXj^m9^Qk-|%=*Vxt1Xk}!rxox8o@pL?IpXIr*oXOCM^w)Uc*dKvA& z%fNk1Q8DJ4j{bXn2TxiNdrRES^gpSPY5OfVnTDa*?a1^&8*CDgNPOJHX2!LqMt`Su;3_|LbTj=;3F;85-t z4+TDva#5{Y0w?$G)%Hl>W4wpaSL#l%x5wP3w=sc>FQfeoLyz{EJzVWqxt>QWjr7Ue zB-^A`#7dQueywxSwsy(#bjl#;sJg_jjPZ%3hZiLcik59VTe6P5Q>y+W$38vVJ<)r* zCb!ka_kgB`2R(yP*nbCdN6rS3%GAbAvc^D@Vlw5ZAj521rv#GsAwN=S8y9RhZ~fu6 zpQz~xjh9OTn_fn`8*~TgYTnAyfKnkxC2ZTRx5u*e+hdtxlxo|bkRv5eyBj6T9W^|iXk5;Kt|?;b3*VhrPo!q^3M zGie7d(aa!vyKmxy73GpVx>z2hVeZG*}kL)%5pH)N!7CPH+8sEA&2+Yq&tjp zQax53mSQeginkby$9VO@sw@pL`Q@z&CG0n=`%*Guk}i8zSp-yJ`GoFK{#hm43J%)Bk?waonxrNjd&esgR#hH1cC3+iH(@<5CdKS=__&(%cOAuPtxUqsNO|^`;ri|lUJbkN4cG;!i91>^HAXL>JFOt zvuEa3KmSotT5xhzLMD6gv zaA=`DPrFgbAIS8|JzR^P0wvXN)CESlqXIp1O9LzE!eG`6BaN}+S{O_F(-;M?&FT%z zSv)T>3fljJtMV{^XW6+K+WooJd$&RcBZh&ku{X!va(2?plJqa5a(5-gUWb$LFssj9 z95cwsLVc&7Tsd%a93Ol0zP)x?+K3V3D3vDnFjf1trUs5j%mS%@#(D^2fV{yw4=sab znj>~Cxt9mVq3z_V+fk^=F>9WHZuMm@)I9g$+BC$BcSgo)loV>$GVSK`A+`+iLf21*KfM50rZP z7Mg#&9|gNd_c7)2Eov?(6@m(jTG!X)J&gr5wXyLWsM&BOLA(rV7{Zbuc7x)Y-2m|> zsJkRJ7dx0#llGREEh(?8sliSr6sGI(nvl1wypemH3zsfgBKI)m24+JIwm9){lvJob zZk+d|MsLG~IFY@hhgXwm!wjMXe zwDlPH5ft4%vK8H+Djc>D`UbWH5pF?jkGI@)Zhxpa$n96T5IWzI3L>x%5+C%cepW_i z7$^OIP8aT{=+XV(Xm_xc_yXr7WM+pgL$@HiteqsPkZc2^8Tl?xM&Q=cOBQ2cSv?NN zuaGO!+ri~a^6F>=#}2c|ge;W{X{T~9efL*`|z(i!=M4%VQ`!rxS@Khk>7657Q zJRse<7&sZY5_ke|H4tA%^sfiz12+K+f%gDs0$YG*1K$Ro1AHG?3j7?n0O&?jO!;^q z?eiPPbZ-psJYW`Z5wH|^KJXIYV&Ga}1F#v`2z&sz6!^I2KMA}5_n!hU1dc)3TLzo} zV&Fsi{$+jtF7Qh5_W`d07WcvnQ^31{HvxA5Zw7V&{{Z|7i0?o9 zN5$aeEMO||Pr$jr`+#Qv?*~%FVk>YJ@FC!O;Gco_0UrUj03QRs1biI$A@B)cC-6z& z$XF#e0r)iTbAZnP^MEbDBH$+A65t)cmB8Nvn}Bx$HvsPfeyI5Y;ETBTphJ8Cm;?MP zun4#l$X%q@fa`#-1J?up0lXFX2Cx(OPoSqawtRt!!1sV-fbRn*13v+-2JQns2W$sM zqhk#KlYsvQCIiVI4(tR@05V)T!2Q6Pz(c^ZfS&=^0!1{^AJ`Mv58ZPtFcIhmCIR~Z zj{zPHoD4*n_vh*Rd|(ppS8Dz$;9%U}4n&>sKLi{GYy%Dlb^?zDb^(tEW}_iPo$)sT zUBK&s(ZEgm{!U;I+&>KT06A!g2fhJBpe^uc0c(KSzt^?i*L|Y^` z8L7apw&F>tO-8okYLk(aNBkFx50sd}yIfOh+nrndae~|Kq?9t?BFVcOJW?Ls z?-5OT#B-qV0x0ahs40)w393r+s8CEwy=ae*zCrGN@JM;Yzd^BIiW3Jl<&hiFm68{Q ze^MUN7ynd6KwqsXbvRGCNiNs^Loto5P@fi7QTi$&r+Y%JO_29lZB6j} z(GlY77qs4pE9~_Py00Guy?$YC|Bs?gZ5XCBT!<39ROSXl_(>u4WsQi&LscV4dGHz< zS}V!BS5s(q^tpgc7dsWGk~1+R6&O0x?CUla)I8^VQh-BFIukSorQ1PcP)1KNoMTY7 z{`MHuIzbV(2Z~?u#IEjAif)Id)cqI(f-Ue;giNVeE2T)O7XuV;2c#6wJch?e=~1|& z>m^?cl!8ZB9bFh#cx&E}y*r@dn<P{rD^3(Bf% z$`;gA9+`?QPCc)zUs6_MJEygN%WLcFm)23;m#++=oh{3hH~?X?)q4H}UUo=HeF!`j zAmYanN@`u>()!BpDXPIrc^N_PQLz{&!hNe4^RPHpL{)0*E6e4q$qSBMVjZ)lCOj|= z!^skgPFFCkX)Z;{WE}iJ7W);zV}O?fnFA|<@LJ#|;BSCifV4LT=t1hLHiMKpHijv#j*TIuUi?*ZFKHW||He;|@&jZ{ z0o(kLPmwx5qY@3PE`zy6^T9Kpu2Pisg#z448ObJPUYIt)um~|PY#C-W!(?-qCzP`} zS-9(Oah#tw!z2aa!4yNFYKkkyPe4W?VWr8_*h6@QOO&gVWHrwVDd%TU=z`1GjDPw{ z(*r-u1RbAJ!vqB~d``dCwf(KY_Ny2inqJZ`d9R#2@2ho)~>`k;@7EtV~sZ*$H&%C@yzF;OQ? z9#ukV=vQ$1uywK1r@rXWM}4jIp^7YxlnF{7<&GJ5hF!bth&#jPGTQKO#$CDWj63^$ zm$4TAH1ph_tujN5@~VALkZ~_rSks8J*DI8yDdn?dLgUpBf_A)aI^)Ji6RdchqHReT z#4A0GuCk0UJUz)tCx_wE92_pnd|s(JE-s@<8Lm~CGDWg0n&RN_NKzp#vpCLriVQ;t zS0XGd$22O0&h%kR;WB2(r&#Oy_>5=Fn5+2*AM}^$!|<^D=1UH2F@&fyYDt~$AYMg9 z8RW23nj96cJd5KDAr)uQLL!7r8=C%MwfksrU51%0&rXax+YTXT12jj=5R&3tfQGh$ z%i%z9?EJbl?#oAxw(@I(wk2hP@=Lj6<`+YuIXZWW92}K9>>ai5j1JK#(thoR7%qT-A!+zk)nu*&hd zB|{PU7Ldh}_4H|nj7pycPLA|_vc+-Mf@8o%9dx9aiiI=9ej#N#@lW$;-#fP2DVC{Y z`U@+?iY-oPig{t%PO;ZT!5P1>QVg$2N+V^0$_9P6TP=n{b9C8gad1@J=UW_SOoxH% zGC1ou%ZBpZ8PjAblMNY~6OAdK+cD)jH%+n?)9WoxXiQTeXUFt|J;Sq;t(f9%F=?a> zVwxp$kY$6uGp1Rx9b+gor>HoKS(v6dvh~Yi0m=&EfFU;HvTVtQeohdFPP4@|Wr}3? zkQ2mVsiT}Jqgv4=4o;D5`B_#?nWBtIxMQDUa#Rn(-3W`5NmqM1I4Zx;)L1e_nM{s; z4w+&cr>6Q#<&HB?83LEF8`5m`X;eBp^K=BbE@KO1XmtxPt5ZNO0^tedddbS4UWR`kuBWWsrjttv*+|1CGpPhC*|SiYKzqy;pN&p31mS zv3y65mdU(et8UrKU~0^DaEdbNS-yi)oI#iC9GoKA+>|;v#Tm?tEe=kRY=16saEjBJ zr!PA=MH!67qYjQ51HA9x6s0qSyB(b3bjE^hof(TFIo@Eto19`<4%u>>oT7BIw3wV? z*=A05$}oU(quY{^E#zFMjBNe#92`|L+3%XRR5@Jb;1uJ$E*#cvah#=&YYHyoQ#>=r zHmW2zOWi0bGZ%wiwpIl@UeB{jT@;7HFr$Q7>IQ3$nuCBCzOpY2ujtP=sE+6CI6w5X<-@z%8rI)*)mOG3(R~0OdYDMcEoMKi%uC>`Rvh?De zW6c@o_-Je@WL<{YhE@JOZO1!xKgKFiTeK}HgAz4frcVrP(0A3_Vuwu| zmR`unn#*u08E5@sd*?FPGMYWL^2-^or){!xdAE-H_^@1N;9bTr{L?gVcwv>9%Gj~hwkV@gelVSepb-Dt8*{mX%cF%Xdo33%?*ETUy3O$)FX@Vk-DGM~&1?}<&C@RD2<9M7gT)CgExCAV*VEj7 zQwwse(y~(9k}|BPGBsFF>3dJX(qa`B>6clTIciceNM~t_<3p39YGr>1NA+Lp9URqv zUF_hfzG<72!)%ua(3vi)G16BK88t>?8B;ROx;z%2;s_L z4#ML{%WnIX0pAmKeyLWJ(-N=d$W|+T0{rR<=D@FjgM)c4LU>Ow2fq6q9L$d4``sw} z^j*2k5fIyXlY{vV(vY(o2M75TB1zINCuO6NiVcm7Qo z_=UK?8_YpWpL1~FGUC0Twc^q6mBZ$N9%IDxdb)>Fk)PL1?;z_8GoY z2hhQR@6---aNu%_(^h6S07b6P^(LfcjvLP)JclY?0a{CYo#!)5e)f;q6YDTu?m z0}Ug~9gG-ZtJL8aTt=9wxoG+Y8N`&jgce865UHJLa$pNCvyC=6#TjfNM>%YvBp{~W zIAzEX)M7Mk6-`2r1@#+E4%|U_sM%<8;11%xCWw;;zt%ckPM?6%vRbz!x=nzswN6eZ zmuaYLXu6DXFJkeiQzo6OJ5L64Q0m%(Iq?1cU=C8%jSk4+GW_y5ITH~;K@CfX3}TuS z%t3NYadIXyeW-`&umy(}26GV8^PHSawgA-Dv~0;0D(X$z97Ib{gVW>`O++LFbvsQ? z@dP+5sI_Tx;IN>6r^zW|!V7ACnw(;}WJaA&lT$Q-`A%(6iz64&S{$5W*)LP`(~`-i z%hU-qImOuwA+7d1vL zPC7l?7R*6uc|Vwg61CgGDU#D;YNlH5uyYX9F*P|w<58dlwNOn?ab_AKztX`e%3zs4 z%fTtmWWP+^RMQq@5V7?R4rCDKXh+=bGHGULm-B>I1Z%uZm$r7` zA6>FEd2*iObU7bGC<+<@_+03#6?>_%~h74|BOt$~=UBG>&3OzeE4D!(69b zE>tc%R?JS6wobx7&6am={JTBNx?J0$Oz_NZ1~@Kb1g*eKz2-NwY+KK0Ta>||5atWZ z_t2Rg{k7BizDwpDE|l@2tr(;^jg;X`oJCCT%oYOCBF&Q9AX1M`bF`+xnRsq-Sj6P+ ziOEqVoHJvSQ_QL();lz%MT2G2JKiE8VYRPn8Nm{XQ*36UW}I(*tRAE%KMe70pVyso0Gu`GSK&B9xLqNJp{c0mc=^()u@ zYv=Gi(?+2^%bVt#KKrEEg@xgMNiQpo$V=(6{Q+F_3%dwzdeDb)&G3echJ0={_)CtA zHypB=R>Wl+-ttG*nbyz`O}Q z@js%Ird_?@hC&1N_2EmGTv)xNB14y9M~H24^UFN?>j&mZ*6=y_fa-`on>I|J?R(2< z>!e(>g3R&Fm^mYF_Kc!wKI<6aspI82!c)ha(qQn52C8;yn+1iwnbYS?pI%rn$HxnqP+TG`OZ zMoIb^d}wGle$xH!vX^{^<3UFrB2QIaGfy(?#@!$b4u|w>&+3(7of(C5d_^ZtLyFEQ z@ZtUFspA>*spG9Tq!CT^iZl|J??|hd1;54GO%Q^->Nbwf*Owh(biBCX;OZ9{f;dWH z+$>WweJ9SCmX}|Aa-Odk;Wx9>EPvxIWq7MxSw(6(%HxSA=S?d4_q^K#P~kg1D{X?;VX#g#DJ?r=LS~kO2@Vs_^uid{L6g1lf=bdf$K!en%LYNl9UnCOqGZhfNdA5Sxo@>>B!B1NLF{n6)TT%7s0Q7}Hw|)6X_@cyw__wWiwx zqhenTndjwH8_IdG*Il_v`#c;f8X49Li#$?kpVu}?du|{MBEB5#MJ?GBM9l&go z&F}yJyzl2dpSkm#^W5i@d&+bA^B|&|F#~#T1Y?!$@>1#Rj@f!2&e<mA(kP8?Mm^ zLj1Ltf82h!3Umz)N#&`3VEKc_jCGFs-NY#q$7f|G;BWMmQxg18Z? zS6n)I%Jh=r83H?f)Z{CtPcAGe%&RP%UQ$&)ux!SS*fbr%v;GhV&yf3kqI%(##rYLw zm1Q%l?0qNqvtNblU$cvErKptAWwXnRAwor_i>Ie!6mwVvx`dK4+>$9QE}cnzlofOG zt8fp;9Ogj499~uy-;h&^;s!$`VPBu9J{bcD4}!F<%BLOFP23kI6s;T%74tjPZ= zEo(eELw`09X!(zniu@Nk0$NbM_$fB^?!{rI1E0J zZR(RTe|+}wsNM(9eEd<~eQMw&taJ+eUFEsv1uyite*66SkKcEub0c=%(3Wj#k+tZl zK3@#j@X!~xFL-KEFR%pM>;pc1;l9^~?Vma%df)A@rH#*f4ssU+e!x}ZY+q&!H}sxc zxu#do>p#SO8#HN~dc2_i$&#{J?+<&)c+Wy(4EQ$BQ`*$hlEi-wkDRw;NMgAAZ*N_E zM96snzA%4F_uYRDtN-%a#qUMBUcM9Q6!ZlLI=ubXz<=}{_2@lMIloQ``yI)+owKEv^{nzG8A$~oobWffHe zi+;IpGN*icgO2MPQ1_vurlhda-gjQckbcvl@J{1PbBik>3m%f3<`fi{*;7&mCQqN6 zKmF$N%7R(=&q$tLT$*1pr=V~;S~wWjuSp3eCHb@DD%G#?E?09ZrPtr;V{VrB;RY6$ zmi(r9giQPe--xA&iYi~T7x|Mvr=p^;H2;>$p97)Np#AE-`O=0{Lj8(V`BwrDVD9&a^>(!)UjXS>;}ty{mSW zyTDR@#VYq0{7Z%EOmj1yXYnMrl0uLR98E5sKVh7snc~t?C{{)06yOv($Di$*aVqZO z1|YX+Y*>ZEC6QL*=&T-5A_yZIavSJoda8u`77Xvg!kF(IcSS26H6oCY1~-buYjR=Z z^oLW0>3C=`YjF``CgEZjI78^-dyKtYoXTYZ($8qXo`7QjIlCJRI1ca%Kn#tPYzDFtDXe~#V(6vngu}!#AMLFZ(tQKe zpoN7odIz3pMMjHGqN<{-1XE9`WM(Sfc?{DVgNJosqK14DWlHOEK$h1EKu%Bp4v68o z@)TeO;7UN$3kt&&n&4glWE~-`tP8YBO>bN^lbYUWvnqGsKT_cC(ri*Di}bq*IO*4? zAja?@<)qxVs?+kgrBq*ZTT#@q%Zj?4F&=|h-s2H94>;c~s%x3D0!I<6A;vl&*}2M{ zyC6bHY`LY#2n8hJ4JI?g2!L?d>eH&D`m`ZA^0eK)yz!=4n#MTPEn6all;8G_`=jCS zxYtdHSpscw*ROJ45sarZo+OhyFxco0ObT!ZLj3c(q*D;D`nG%Ra0LoNOo z^`oaj+;rw@w<3hN8X&}VPqq=F#rIJ7?*z~%3VPtz#Sy=bc!c~hM7ElOArzQu+93q? z2Mg&!>h4B6$pL3h0Zh|w@sX8ev_iH?+RCSmGf{8zZ-Pmk0 z9)+4Hv+>ESeomz>)_H$c)OKU%mB7%a1!8i8AnY~>BFcqOd5bAc`lk3>L$k?nv{oHq z8fvq9heDS+0m}@m!V|5C{TtzTiWf&2qLh49PQQZ6!+Hv5 zdZQVS?*~uHs}LAQBLgh0oQZquBYcB$8uo?kFyR*vS6sUjnN09`}0B8WXaw*_dAVO?NJvlbrKkSh$5$5MM{U*KK= zbOKV26~F&2Kz{Jsfc(mL09}B%)9YFTh~-?@CcuvYe*pXha6jOufS04je-4P=Mfnnt zTLl{d3jn_boC!$TtBV1D0OUFd?)bWv0qzA{0k{wFRlxm#p8`TjxN9@ukAS?93^}JR zu9Hx9YaqU_4zLs85y1XP2W1t=K7lr?kV1vkXW(wfKW$d!&-mxJhbj+hHmmYDY<&c7 ziDt73Sub{hdj|isS(UzsOUA)f85zfbA1^|4Xy4$7rJbH!-gsqFURGF>Q3YSjRH2~9 z8Vh0M;KS>NFLRPdKI(KipKX}mfgE|1C3I=XVkKS~FsLrF#^78D5%Yh~>bRX8N=-4P zy#Sq>E}?LU{Hb|Ir}`JNY}ztyjB^|p)S+8rgJ~% zJyX?TSxYj>JfQOBtVUfA_?`5hx)z2f^@BVIi+@*U(d#(bjB z2GC3vpyZX;3mZlZ@lQZ?#&+)pDXa3htPJa%s&SSrge{2)CdqYi4FyMSfv{ z*5(9@6x`8A;2{*y(Rw6}!0$-yLncs;CsGs$Z$D^XFxvQNM_5B$bj_B*5So@n5`WcVtwO0 zFk4O%#sDe3mwTD7bd%MROOg4u;+Nd)B2I zGRP=rG93Xs0v86zob3e2{EPsc3>XD?BVY{R?SOHBivYU-GAv4E=4`JU;0J)+0Y3r6 zMy%_g<|fysI}qvM`v^d~Dd#8wkQ{Fm9?9`&lXBLWc~Z_AZE_TxEpT_?pEj$wk2qf7 z7UG{aD_DY6%1xxF{zSIcbUxc0(~@2dE9P z)vai_&lD6#^`F5prgZf(@~L~^f^rQDb)+`enrnifbSJ>lEq7g`3O->Fyn@Qb<;+;m z9grwxL$1`Kod>(*3C*yXk+#fM^X7TP<00H?!=E(1Mu@4BHZ&6Lo*bkd)27|yK<`ht z`&MuLhej!BdN#mz8G}f@wOI-zM=FKXpZ{BQg$qW@ww9;y5lvW?6(bPZq{LO$_)z6#{L=>6y#`ObcFks0JhDXt(fU#_!idXWZZkB@H)6#p z+u}4iFL!o$oyzMtgKBaYWPXG7D=Kp2`qej>i7mqOn6`eks1fT|m)las`c=9zkn30J z?jBgbGB&E&rr}Vp2?dsvJStl%5~Vce%6;@o*nO?js8VnD6@Dujw}XPMlW-G@S{gYd zpT{#xqEUMAtzer*i37$z+3Zr2wHXP6MmEZ3CzrT#<_Uyo4oFF~l5>mbz3hlo)_Rc~ zHW^=g<2o2;4XjyOBbp(H5@L$L!1V1vNbEccBuyAixpi}+;a1d;1)Cd9P;(ZrWOHNS zl0{H!wYky!;_k)_tgH>Wad~6pX_+|{ZI+` zRAR3Cc}qGJ7|nn^!5w6|$(n6N2+rLW>K! zEzaa~=HB!lx~*0X;ukqvby`ET)+2^W>?v4{DN9n$KXb@~F&)wmDMfk(Z?43azZf7o z;K_juz=|SdU9t5{BnD5kGCOacZy*NDQ9P^gcntG|?I9e`(;5=0x?M3;8{;}5%a(YyLE>E+{$4=hAJW_lHTPaXNP%>jkdDcK zX25F!Er5*I1~?Uv?U?*swo%%wqTM|#a5v+hHmh#om6!0(bcQPb&}>#wXJowTNQsPBzpDB0s?N)va6Z+b8mqD*nvA9=yOrpElZ%SnZ{p>_9nUfTH@XR7mGRQeRdu^;Aw z3&yk<>bZJ%qW1ZQM@;cfyE9v?pav|@c8+p7oPP!#=cmRR(~`i&7+)@^&g#DXg$AP$ zvs5G303)z=7~ZHt>7atPZ%7>NHYTRJ*Kv(A@owPRlGV+yEijERrJ9DT!}isV?gF9z zOD8z%TDmNJ9%|nlh!rzo#|s|xO<=!6Ys$`ltU zbuIQ4!H-%Vd$GY_eX7A?UfEy?I)!!4poM`oR91Nn#;`T9Q_!Pg4iAN?30Un{!Kdti zcViVmDjL12PDKhyA5^2*l>wwP!RP1})9s_U&IvA+5NB;L7}-yArPB_TY<3ZXRHtUz zsV19JpU*nHqi_BEtjIbGRvP-psSResbf^<8H!LyLs6$OdmSvn_B)>8SgriC^o@5OH>JCUZWys#9jcxB}| zr896mUhCVrtHNPxI|f{+6^r#}qJvW%zA({t!@_bAisXlw>vKY00E8S&_=fl#6iS>& zgHnkX!$AoB%^un-Y;DTv$!tM)dlJLfW+6+RmIhpsmO4*;$MJO~IH zf!_((0QYgg!+-|F-3Z9pFzLu~PXHzY27vRD@6pY5NV-b^g8;eC*b$KHjL?DMdI}JJ zUDOmo{AxhRMs)4e@Ow4)en8B)T}^;dfILeU0~m$;hy$cN($0X1fEYiyG65McWp(xh zoD7JX>dFN~8ig*W{(w)zJpk}|K+NP_SaVg<0Q=)R7vqsV2W?iNcn+&wz;WzGn^lbI zSl2_vXpc6lkXb4HW+0W)uaEni#Gcm6tAZDeTs~@9=%XDPt_YC4o_)ZO*iO}%HDi}l zWpN(Ays^K9{X<>L@p@bJm>Ls$fv`nbu`~>ct!rs+aAchK4^wUFW|o9Ul#PbVEy*6&qUmt}riB26d>5bFPUSrdyG$)cTP7jVEKQ zk3S1l)~|xgDuepgWi3l^TA>gav6_mrxH|A`!#x3)JEvwT{erglC<@OFfs$!_IL&Aj z`8X`hZchSUttSstQ@|b5O@q>8+wVqBDGUnOtJ4Geb`wON*+7aZ3XX6bWZI&vGaK6Juw(< zi#}i_l+&u(ewS*&Zq?<=z*iB@_U%wi>{5D~Ux|1%_YaxqKiQ+Lgc4u&wjKK)-;wYV z6dfa8yTw$U@FL@i-eG>Vi__5XKmZigntzX+nAXxy$rL{4!`HodOz9m5zk|0&YE3l> zFH)gx$23#*yUoVXx*bt9G1ZYZvDFbZan*flI#>6o=~CUZrfapc#*n0LH}o*ncS}<0 zy7j<5XXf(8x!1q#R%Sifn22%qx}>_s-cVASkd6J%2Mz9kSyYtS+ieEiL&cfXhA&NU z2TmCA1ZDt9y`TzH?tXrhgm)8SUR>oKZ?QWcZtRY|MLYIFyJhohO>(c*7IE5c=YH$* z#_O)fYy&d~8)p}Yw|)X<8^gnD-hsMYD05y2g|*mc9hYQu2Rs;)tGENO;~IcI>eB}i zU(G4^+6Ujm=zSbwidgV)W7Lujjgbo&Q(a4pD~tW%il|qfYPjFntvmNAxnG&#e9pU9 ziE_nWW$J(2t6ZKnOxvrBLn)g7F83?xoBNfFHlRZ56KWqaHtJ3-(RKFK{rr*mw)6d%7GyMXwjc7I7 z;?e(32#4?+n>Uj7XIo;bwaQE6XVLae6?`T4P5sqYra*X3t6{-^KaP! z9dMu^Kclqp<{T|sxG>4}bUADi^HiLlES!f=z@iRc$kh379dOp?5HECF2b>Rc0Y&<# z-U&Da&;?ilco!g7itYux6>vV_Lx6t<|P~1v~>t|16rn1NH@6 z3COY9(|}_%_cXv~;jRFD4iIUk6fhUkLb<_WkN9Ok_)-1|2)pt+;3t4@0M=`ChXCJ( z`#9h`fEMJ*yMP?Cy$8rK+xvhVs}VmPa6Moy;KzUkfC$r71o&^j62MOZ%K<+FtOEQB z@K(T0fVTtI0^SX{8Sq{}=oND<21J@%O98(JdPn%Ww7XRe@p~^PR20eJl zFPXl*noX>IUlnq+OYne3!-G$(s%u&7imFz6Y;7?)I#q{OTdUO`D;>#8BdVhp;Uw3I ztu2b<5og#!jDU@UmSS~cL1eY1zglPMX{cBGE8Eqc{g?Dv=2_>s*SI{U?~>;l?hX29 zR`hm^&+JLux5sz@;d||gHN6%u!Ki`wWM`~*9$Vd6ODlpZ0~sWnkcqMry`%o7DEH5QClyR7I~9sW{q^}w2d zziw#h=nASHP^0|KT%A-CSlzG2gb|$qBRdtNIflWNmp5>-j3a#0*H~LwKwGEHwwf0) z#$DMkpL*X~UQ|+?FKYJinpN(i1shs2T%pzKh}UcTEMrL|)mWckuEjVX=u97>OJ%;r zi?K!OvgM7PE#D!Ho)r>xCr;H_P)5mEJ&0T0*eTeEvk}#&jma-6@i?u+bYmUGsM>Lo@!q!Pu;>RoX z0amp>Ahy-o#YlwET9+QL2XY=x_^r(wtQ^DW7K_F3rNH~%&*EsaZqaIh;=hcM3V|Ks zm??u7=NJ|uIN87Ih8&N1k=i*1W~QXl#vn_52+tVA7m{}j;tR)fj)4LBHZnQDU`SPX z^ye5>cyXScQFg@+Jf6)>-hxBsg@rxsC6(tGp7**vW09AEX*CuhA8S1pc>_54iQcgY z8J9%Ku?VY`Olqrh3~PKZTAgDcSCw8`on!bEFJ#!d!3c*h6TLok;~MX{VH|3j$FSbS zz|kAe2o2vG{GWAdC}2;(48Tl4tZ#^IkKuq$(gSk5aT(wwK79iJ(&}WM^qEf)AaF+p=0Nw<6D_{lSeSmWS7Xi}$GQe8^Ij%t8?!s6> zxf5_dAo_M!N95N%fH8nfe}BY>H7Tv1q|K_#!v86OE7NRp&4yzkxn@Hf^qu0L?H~G1 zHJeqLf^cPcQ#G6Qe^DbIg)8_Qy;ubd6%?ad;!gmVUIc@fSHA;*HL5*PT4va2 zOhQVPKFxu^8dY);nx`7-@S(_TVL~++h%}4z3?bq%Ji-@KIFuNUc8Gy&bKS-B4#4=w z9@r*!rpu^u9?Y~l59}!LM2i*^koa&>Sj zeDw6gqyf`kj}a<-3bc|Gh6rVa9>ah+Pw<8_QRK#}I*gQH_KhBsk_=ygx*U@-%`iXkg(Kwe zE%svcVm{c2rB+J3R-RFMeda4cjL^2`k-qe`#RjZVohRO658ih4Dqn43IndY? zPi^^w7t^}7V4Xv&EhI_m^Ux1iQKM&=8#P~o2DL>r3sGAbJ0%SY1xMn{pN2s%!yGHZ zBT`5nP9dgBi64fIxm=GS+faIH7}@U-Gf{_;rIW0~NbOEDy%>G(&GP1M8;t7h;w|P7*FO(NseLlnWrPV=Jb8$f77f!n4yqWh+uB@(>QO3+ts3SFtMFI;=6G*RTpd!CQpJP#iCRzKY`>weW*{nIZ@*_-?Vn=UIgS8o9=*zz!j0VP^ zNBOi#?$LY+8s?a&8*B+O9AE_JXDT!da*XxDu3-d668c1X`e9JK3R|7{3g)WF=l*(( z$kiAPBkG~ZLyHb0rMzD4O^?34Gp~K^{hwn4hWWlL0CkZ@(D=3YSYVB6J>u}x)wbF# z;{?rmgu%SE_Pwdfm-BtKkmD3jUB&D`82a+h`Od)j=R78yl32M)^Cf7I^MjeGB26+J zU_@WQRA?BCH&_^JG>k9jp9a=LGm#?pvFzf*OcKq&hA;Ne$hJ)W?7={)Gkomy^Tn#b zRYVVs)a!@2k`E)~A@A3RBg%BO4kPvPVW#EtH3R`GVy_vH{>fr>BY3JE!{;pj7KBEK9Q%kys4oC4cjS&aEtLO zW0zxzZ#>=*m$dHk!_Zd-sF_mfi~R))Y`TUKHA-j-DDcOi+SS9S_)@_k+41c4#~?um z^%zlo=V}j08BEq=M4i81hmkVC@6=%+SsgKx$9O`PBbiV17@@s! zg&rgHFmher<7<-Ot89ZFjMP%cHGVHf%pEvu_h96x0CRgChJ1tlvyX<%g=_6z46BB+ zLWhxB>bMT?rD3I0xB~CRh><7P;60d$EF6Wa^InYTRJh*n!ANaES-N^C#~WO`_tB7T z?Lt@*qi@T0V14s~Q&+~X^R*P*pA$yV__gJD;fvzQI!O|Q%=V>k%L#&pYe(z@t47w3 z^|j?-d;v{@!uEwZY<~GI5`$W#wK&{;5r*OT_XRzG@$U%tC)$%eAQy=J?j7gkR2D*p46beEl+URw z%E>P)n^jy0nbtluj@o&#S6n+Tue1PSz(yAp;)X5C&HqlZM|5dBF-d8wysV4sJ>`^u zG^Z5O+e)Dc-Ye0y9dCa3g5+&L#_D%#&l77qw3WA%=9CxWLScE%t%Vh3VEx|6+M)JC zc`hNbqw%{P)NXVhYWWHBrUa|C-vtMcPd$;ei(}ckodF&rXT*Ldy#2km>%}A9`O=~K z4m;`(P$I6ueg`2vab1Gk6HoiE+mBs*kpIyLPb`=4P+VM*173wv(?pm{hqnkX;Z34- zxyhLQH%R;=)|2Y$DQl^(zO)T>PTQz4cqfd_k@KHT{N~VT>t4^9pk=}((|&I#Gfll$tN(% zFWd4FL^B?a*eSW`t1!8n&#DvZmCIvQHp0y{$xvmpX0s|k!p0FssMr&s&8nD?V6GL0 z3b~84S;gp-^VCowwwX52;s5`Xbf|9Oy%YM{2PS1gTFZg0yFdFfBB9ISwacHrZ1A9z z!4r;t@%n4Z`Lp3sai_lcENj}h-;K#mKey$R@7>>bws-3kV>AaGKOfg6d*p>}AHM$h zTf>KsAJxC_72_sfJ7ek}Mx6P+cGIzKr#cv}y0~rqk?XD*l{z52;lpQM*s`%hr#{)1 z@AvkJ35gEK7|_*n_SlI!cgx9^1Mj}xV6df*yzaVy`mGy2P&x()~#B+J7f58OW441QwrzYcH51ocYn3vy$|<&?;PE~%KDd!vkosJOs0-)u01T9T7e5*pXN z{M?d*=CI4g^ofZMx1H@6+Bvl4o3GZp>-VM)xx8i5>+fY1UOV!#UdK1Sxh6g=BsTO) z^}9Xe90OCjU)H~+_Vdj@ghyO#Qf$ZFr}pnVd1&x}leKTY`nPIxY|53XqblayKDRP= z+GVG{Uc3Iyf186Nx+-;FecN|XkG?~DAAIA9h5L-r3F#Bed%o>BvUiWJG3MA{wb}jc z>0W&!4}aR&c;%KX;HcOxy%Un-JM7sX7JAW&5#O0D9|m4H6>j)l_Ms17es`lW_>|%DU0*g2FhobD z$Lv0JG3c8u$By)mI&$XR#i-tKHbZLXx?QKX1S(Ct(#%J{|0;C%fRy+XJJx+ZAo%P% z!55F8i0ORd+kr{($4^~U&;9uCcZ1Egu$IH$ZyB82WE^#{<;VIR^+x{WlPyBf5 z#IAQ6cGV3{?Rse6#_hx66Ne?o1uI{DA9wC(z@%Pb%2&sKjI$aH-yS(`X*p-^)bUKj z@iWH`B!u=&>0l0th-f@?p~aB4;mqKMgQmE!b30zdgipXca*ZppdM?qpI;w*rPn%;%2p39n6QK4;sr z&H95W_SD%8N6&AqN6xjJyLjk|^VT@`p_nZP4hBYtpX{@L->3nG)B9VZj@v?Qb!X!n zT9oMcguuw2fu|3dcO32BJNVrBZS^hoAI}`OMeIEn9rESHsKDJ@&zRPQ1nlq8C)hCT zM9|^AyVK8}xe#@5eZp zH2<)D%bvZRgL($leRoYmL~PU9BXyCXdy@?pf*QMS?dEoOYWjER;p5Fan&Y=c9y-<| zIAr_UuF?DKos9bv$!v9t^Rg>_=R5mPVQL0rqiJ-$M=mjg*UFg5F8L`jXUt-xlU@_4ok0# zF~>hX5pgD=sVOmh?}ov4ljZWr*{Kl@#DWLCi5h@c5wPk*;9)c9j$V6eK!I?^&E z?%;;6I{dgHbhSDn)}s7yt~o4xcwf`m_`pM-ymvPG%!vMbnrio?H>P&6_2}MHX$Xw$ z9F^E%_12aS;RBU(BYF-vz2{8*Hbda4_=pX=I-Lm*3=U}Ab0P7>*A1Ty>t#6lVbi|t zW0S)TM^YPXw#|IPe87FI(L7{W&m;TK1vd0eJQvY@uw~a5 z-H-H8LeCst`*u`p*D&**ZSQvqZ9W@3$aZRTecYOav%OCbiZHzWlixM$P?JKB)it_9qxTP28wQ)VY&^Qx6dAjBYrxhm zrnKEHEo#{MjTyvRAcV`gDq)xhNBg*fvlG5R4d$2>-L5dQs*e(!;!SEI@SuV?lvX*HTD zbaCX`?glJQ~s z1L45(ro?2zrG+j>k2*)H_l+DOdS20$s#pf45B^2-4CpW&I@CMQh!FFPCy~DUm_!(T zrqj(VPj5BeSK66p9LMLiofovP_2W98PS6=K&uFEkV=3N$)QV0>(bpZ`U=SH7?i`f& z-#8M5;SyMTQu#}OpTO~`&a@XEH*($v-5!opVK@kGFT54Nr*Yh>Gwp@PZPc$p7p+Yb zE)^cPC~ojhC1jwN(i$)tHEaTF84QANR~tYTUi=O;pJ{7?TuN{6JEnjxARJmNA{d$s z?^5yRgJzaS$I9=Z7KeG%dnUY!KW6ctG#U?9(6uVJFA?v9pt~+gQi*wKJK9=4McsQJ zH1}|K1P0zNsg2@c(EL@SyHxs^v==lQhDXz0`Y2-kL(qkZw#(^>%)ehb&;1L$|CZVm zDt{ww3J)P&?P*A8t@Ys2st`yy2cb~Ef>-syB~%wUG`bSbH$}Wv8pfj;;5giD(ky11 zdhEv9{T=O}c8T0~{QTNMf2xzRIBaTLiT*bW`nD3~-xBz?68cXHd|L_qS0Li{B=pw^ zd|L_qTLiwXg#K=*f9*-=$4N%u+e+x?{+~^K@a=1EbyRJioZhMU_Ocsy-+_~b0^e40 ze=k(e_9XWo!*>;vUH_Uj04W3im&uyOt>^znV7GJ(AoaHs?ZW$MVK5mfel9 ziOUE$?j3X%Nv8^b~gsa@n!}? zq6CW++%cyVINmaKAcWW4Glb;p`;K3{+XU*Z|i>Lw?LcQl0SeZwAhBKc*N;_icZ-{#NmXf4#St$6fSmm&TeCoda_AsZ4x zN$VbIWm9zt<2NMZA>Bj`PdPWVUJfXRq<|dhi~`IAL_Z^B4~_;L1NT_Kc^bYypj>NZ zsI*y?|G_^-X;?4K(`;68k_*)hxViYJP0Ea7c1oF1v{}WO8Ezwlic`_FSv9!?#H|!= z;$DSKuG9WgvsuNx;Er&GDr@mi8*XypU#4%bX0s}+ZL1(v#p1NP4RNd7GcuKa);gmz z!F`vw39n|F(vl%DUA%z=DSKk`PDmGt!;Ny>0{Q{6p0JeMaF-D`%TZ$uNxc2U`ia`= zm08_d^8RYXp4O^fl>kRW_%T0Un*5?di25okxh1D?Zr)GSE@fPs+LhM&E-DB5*foHhEJpR^V>OKW$d!8~jVZTQwW% z5~Rbdg8Z&Gz;mQD7#Htvq2wS}A_>xcvQes;EH&Ky2Ul7n0(2LpuspOFGwMN`oGj66#3(7(G8qyY0+-tpWI@G1OSAYwR0yi=U3dqsT z+*!+d;o&_dq?A18O+2k-%B}#8W(A&4eRYF_(L$*I!bWh;Y)Ey5Am>X9;-}y$f9(u7 zuh5FYQ0g4xaUd}e5?v{;C^2Om?Mi(Ny!YLaGyh8CLypD-o0kSX38@ls-JQ4#mPOWk@`RiJd0v-=B1DAEAKEyP{mNFW+XR{i1tj>zu9?)=~I;QjQI=|C7#hpiq3zp#6>{v~n zlLhh9dFkf~2jMX&o*H-ouEDJ&DDDJ~Etv2#{~Cx1P+WW%!t~9D zY_^XZ4GXRr3+bfrU$CG0ZGNIX8{fK|4SYlZDOWkrIq)s5LY zylJgXhf7pe;0gcj-)gGLa!ShcMT6-GigrvJevM?BiE_G%DvNhtm zw$>VHlUje6?og!w|FlW1KTd(W1^={J6&L;;ctVA=MB1$4+=C3S1#TIhuhrVnY7LMY z03j9)wN+i7%sEsLw7gMWqSk|0DG}}2)bN0*AhuW6X8?OcG9smANnAv;$^1O9Z$K&& zqylCxa)vrLLbe^oAdrzgenD#2PvBDj##Y#`t{QUu|7~F3_kOXw@va7p_+En4hWEf5cVNtaCZb6VRW~`DN__@2 z@{GrEMLRfS31sApD-~oL{y!#ko7@);xZRg9}4rs>N z*xBw54d&<;{(=KG;~yhV3quJ`gFFQ-t(iscen=-%+%~P8>5R&3l~%;ZP(BjzVH}H@ zjfuK{APZr>1(F)X_}BFHDtGQQ%2<5nfbyiFMjZ^%qDiB7{GkiKCJl0QJ@GSLGJb}O za2_l|&i!wsr6`k{hl&=c!&cW)k|g`CCU;RLb7TSP45oxns_AcJQ8LxVli~m9>tv5$ zlX9o*KKq4TOP-+lY~+S7X%3IP6Kj=!Ks)vCDW(Ast z)M%ZD=sVbN`1Kv^bmn=9yq(VNUOF5-bi zGYSuS6k+x#QZg@QPp$}HjsvnsIt9p{2fSBE<^}h66~WyZkdaZ2;#|PJc<<8O_X2hW zej#8tz|R2_0P6vJ0`ewr4?y-Lbh8IRZ{kV@BweQVK3jV~39uLN(*Z#vWDTVN&VxG* z5PQbTV8F)!abHu&1fWFWm*Iwt1lM{%3ECDp3T)9NDOj(S2##+y0zm8P%Qmr+Mz~``+?>X)lRH z=gcpq8SKS~TrKx)+)K#lBvI#|*JDzc^H=*}=xw?VBX3W+^q34dxDu+xuFtWKz#3KXJETe)`4#$m zP+Z?Os^Hz?OLJGQ?&r&~KWe^0yg9~|0~-4BzxBk?h5xOm5O0pLZP5rCM-(t>C1Xwq6B;EX+*nNp{Efya@jY_ko8AFLP6)dm3q^|ufFEXpNH{|M$q`RZX2*h zmAx}-5{>kwFTpTijVeblAX8Sp_(g_yvEZC_?0va$G=R;8~n>O z%v+{da~DR?piGB~oM)NJaDWjtoaxdq6DMV`nBUPbqD(Vb7;F4645+6Tj-(;G>8oJ` z{}DGKKi6TT^oo0R7BCSKZD~hZ#bfP^R}A@ zGjRyH`a&IM(olXEB^i2XBt>_$=xRG_OXGEn1D(G|rQKC%<>tC(t zE_H(MBaHCA;3yAgU=+?D75_xH(~k*3S={QT2(?Hr_ofAa8o zc$k$o^{s&q3>~!RV(EAD1{?2Bi67%RCD-=U8~xbSSM5jg@0>L5>qAx6Wjhb-Ye1F@ zeA`oI2LyiUg@?C}HcnkXCog|%-YY>UqGP}(G4h{#V9R^*1`YBToHF}~b6&sflp3Qg z`sJzpEzb$D?AZc%qizG3K3i;ir-ZXd{*uVG!==x8w|EyfNObbwjJ-eyl_(A2u+ zjRPkHIG=A&tkmzI^smNh_iH!-5L{<)#ydA-^^Ysa&@G3RUj-*NPSh@jn;HVRI?FZ6 zJR5{nx=l$+zq_!`ign7QkFhEq1OG`*D>Z}1U5hZ)VOTM>DDJ1ksx(gqa8+7`jvJgC zu&jix@E>crV%%Yq(r_Pl&~S<=A(7f}65RJBs?Z%_z^RiDvR>K&9qA(d7j~Vw^TrRV zs*AW~AWWmSQ%ja6*B4nT8}JNlwNp!`%F-fS!(pj3Ih^66GW~}wTK^LQ5cJV%g|L+~ zS_wdf5QZIOhQkvJcVg|pJ5X70ZUFIe^Qk8=n%MVzbmVduw+cvzNyTSz<5lc2eG2F? z{0^EZJRb-fWZ)=r=k*#ue&V%&ae%)A90+(FAUnHCK#szu0dh8o3BM~F5c4IWS&?qM zQ!o%0JGS|Ncfx%G;NyUFFVWmf0Wqs`tpL0c@SlLQ0GZa=fExiz0e1nG1G)hje}6!B z2y$hLHY?*7GBiTP3RE|N1FabMgeo^{HmSF(6I@bn7j0IBa}d^oP@%z#Hmi{PBI7s+ zw~Pb(Oyfe1+JX`}sha+a*AP*_x+udIbu9)_%gX0d!RQdxGf(O)wvzx4>TBK&!i%V{ z0#mA0&!ccn#p5x#nuXssQL{r1qKod;fUK2k024HKBH&uMF9%!)$XdA`@b`cp1G2XC zz$0r5ZSvI9Ab~@@)XoF2KV(=^*Enrfq2Yol4i#F*X|oDl>@vJ2xMg_%d+U=NAo?3^ zh&F{-BcGooyvnechV60&yhKHlyhW;_w?A_k#dEQ z^lVu)f`;oJWEzr-0&=BDOs51-l_7)MrKjRu3m#&`{5L%fHYV4L5ps4InAewBKp~Iv zVd$&39+LrwLjK{U5%V%|7cWLiyCd)N(l9y7r#j3;F-s-i^3tS`W|s~l=aQ_2UK%0Y z>7*B6yhg`-Z!dk=tW<_YK+t)ljF?rwz4TF-;+q}1ambE$aKLFYi`RCSSbKNatLpjoHUT`FFF@0XyN*iD9asd%S?ZWUT|1Glc)m9jT#NC!n9ZKxw&zt9mD&0Ny84Ly?WIVbT^{%&(-=0 zGSK$wRWIN-dHNF>q^wu%l-mi=o!4kD^&KpJF+b75B53bB4kLa2dg9mzD=ZA#J-_2u zuJ!yC-mm-ZqzKI_uB^qW}qvKez`D!frz0w?@c6wb^q zn^Rha6F%m!!8)&+Po|USRp#d9loVH1iIC1d#Ct$oOy#t7w0BgPN$_Jh6wn|*AZ6aTV@+b=OK38Pz^1mndjXNwhwX*QqZI6b{>%FDdf!ogB-guQb4GMhv!hNp|+dp+k z^uF6)OB_s2*EDn|X9fQAZ{x;3v;WMN;EFq@#m&1H>7mXmo7#50@;-rY zyI%RZz>j}mdGU#WrH0V!A`-sHJ+d65NDQrP>i9c)B^7lod*PY7z2`~{`!Q%AE%0q` z2OmRuJ;vb});-HB%5JF0n{9{mxxz|&-+38B`c0o*oL^B^SvIrEKDW4XPF{( zTcxQAiT*X~r8%DTBm={|9LS@Ua}X;lFl z-KBHvR|Hv7JR5}~gZyQ+^f%m=_{AGIo)%v5YZC79{F~+@Sq1`Z23zJZlKU%PqCW@A z|39|BqEde#4}*$RQV}9so1iY z*9$q2f%-J6Y~`Z=Q8@eRs2R^fJd8)1_3+%C3r^gOY=1@lcD&=1CsdHpMjefJVg)=V zI1+m`CZYS!aa2*);Bh1;L0>YC8}cTTo&OhhS>cCsyGV?+E3~KYpqxKVVpd$#^`5-@qcoC`cR;BEB3&$4tHnkdvnh zttb(rw%kpdRcwiL6}XxBr%hfMXH}3F#%YtABg|E~IYOJf;4Q=33%3k!z>hJg2Ik<_ zRUkoBi4PCP+|QDdMbGpxZDH8`kSYrzm7DV_O3?@UigavlvM5pvk99?QFI=tfbSD7E zA|(uBYNV0*u7&#(8*(gD|1uk*l^OktGGm~=GV`>iWKT?hjC&y-eNoIq*7Kup1>|}G zTF)hS9{81^+!0e~vx z85L`6__{I-yP-L@tD3M2HHiC3yh%g~;`57=vEORx*cAk5sg*W%}i*N%c6JaJA zL1}QW%&fpJRyuC0RJpU_aE}laX}Hl_4w(|9utKN#-MICXSG0O;Aa2-xgm7mR1vVJe zwFo^QHly+^(zOt2$i>aVHGr?yp9K^{t!3&#BD2p-?iaOndQcj4U8M+%8zQ34_6}BN*j!(=Rt@i@^ptUa1hH)W6pcYr;vHtm0zSKTH%co zu`WwATYZ^mfrFp(kcLE&xVT1z0uk5Kanw*;D#7}#*vyLn zoP_tp{~j;~a2jAN;9Njn9zpX`aLLED2+$7rGGIJlJs>ZIv;g)6G$4LVki~VyV8H&s zr{IyBfV5e~wFHO272=;Z$rX7*KypRemr@C|TZf|B{%uP5tk?uC)^6%QXD)(q!7EZ)vVNeES#=GZdrp1DFBxa#u znv=~V)RChR6OL14uEWLlbNByrGkmj$ejglj=_25FfJU?>mg<{uvrUc1Bij^h?O*M^32(5T1Ujze(I!V4OqU#K&?eiI z43BL}hWGQjLA0xOyFubF-3_Xu8$@@Q_%-ON8`Vp8gURl@|3f!8*xmF0S~vJetM-R7 z`-Pn#IHuPA2EyiRf5loKHVq;Ebo=Ap3tJcA`|Y&9;{Q8c*r>3d--Rhhk^aSaJci%G z_NVW|9zebC2poDcdljQ*gvCP@dEt6(NAH}7xzCLh?>!#Jy==vT2Y6F z&jQT2xNdCt%>VRTO>Y@bn;+g z^H}zRAE7sVrq19IZ1Lbv_lHwkwMS&Gm@-@r7%7y}#tIvUp0ZC&g-!N}ylf%+#Bs32 z3A#zJ`Pw859L5JDu)MBgdG7S~YGveeB6jwR?XI-fozWx)ma%Ab(eKJ4V={_@n9unr) zs(m9+moBaRF1AeW=2vO>$!JCV)awA*YyJ_CbJJqLzJO?X_6D2^$X1H*@KMQ{O&&L^5V#xgPn(qo8##Xm9o@89l|SLX zOyCfMut|Y!ENdySjW#I+L&nhpH*K6SdRnd-Em!Gj!|~Xz&V>+R(P@)bU;U;}a?FOC z;HcGRUe15eX-js_aw-YK#PqAKMOhfs5Evfb+)?TEuF6HN7L(IdpHy^Dmh$x&XWv|< z|L#o@%^eMfh9F~pt`XzbmASK=!<@;^gj`ZXFwVe1brA1# z*yRp}$b%q=JFq+$`tED)aSyI?j|-;1l|>LL)|oD}*d$}a$40clMEM47xic^Zb?}>6 zoLp|%VR!nzz$5sJWh>j59k#pigo))QmUWo8vmsm7M7ZzA6Dc@nu&{yCYPe5eyHnum z@z1h}R3;Z5680C!6XXHq||TP1Oym){>&QfzPH&_^u5WX}oi|9N$Xe&u*~(!`aj!zUG*NED8%7 zhd9`5qLorichQoG8Q!%@xzu%#FEzvOWYc9K?bLAbXj;sJ9)QdO6s2gweE^5R-4`$e5W`DX z7GNUa7(g^fAtPr1;B>eL0ixNnak^##rT`WJrUI4%rU8}%rUSBJB5cud4+Fdv?o2=z z;BdhE07n2W0(1gC4>%6+Wx(-(s{ykC*8xrdWMgIekS660Jd#DwW)+QifxykiKW$c# z*{naI;(iBhQh$#0%jtpi`@eVklt<3|&96Is8i+uUTxI^?A;?sN79{G2Fg$%~RB)<* z>)o2MgGzr8jT^1dQHp<`FXHsKK^cot9jMWa{3zfXUtFv+G=U;6{ZXk7z#7#g@fKY| z#k9jdUtKjUX=JMNGz{bNKMiXJ#&^1M{U5I?khjt4;U@mU2pXKO9PD+;aOk{G;P}UH zpDA~OH5@U8^NQK}bQpB3tny-cTZSXnsQoclvUTWb^tl>@H%1i;Fk+>jbZu|YvkDm1 z1pedM*zq#V89gQVC@?gZHn~b>YE;?z(nQCkqXBt*Etg2KKO%9TX&A=kpQ{~#@#X3r zJFaW--A3Q0`4Tk9RkT?c=CKUNlg~`M7P9Vo8`Fln!}w?3(X_oGPL5+#xtPToFz%U| zMY0}~`UwAEtfIX1H7XQXqsk#0P0i;M4*I_RtVE(s6Q}pZ8fsK~YwzFrSMcXPUyx@a z3~4TPPP<&AVVeE(kc`)thYx@I-db#Hi12W+PxB>ccq$u=Q0Acw$J5D3ayw#|D~fWt zQqsr)o*zcL=gyq-(xfFL5U$I5G2%8cxuOR%Q5-w|y%(detDS&_CJy*#S<=X_&~pF| zo$;lhVR`j_@fhY~a0v5P%@VHgD`-}DF|Bhf0&jgeW`FQtflvSXYnm@X!;{h+!;4zS z*ySBCGbX!S>j!8*35{&;

yHQHt3MK>&z~5PW_|r>s}r4rMx)B91M}xV_`_fw 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\=uj@uRH2OVZ=`zm?0sy(t8-6#=%;fh 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 DX^C}S literal 0 HcmV?d00001 diff --git a/branches/2.0/doubango/thirdparties/winrt/lib/x86/libspeex.lib b/branches/2.0/doubango/thirdparties/winrt/lib/x86/libspeex.lib new file mode 100644 index 0000000000000000000000000000000000000000..30eee347994dca5e1be67426292584480208f8ff GIT binary patch literal 637882 zcmeEv3t&{mx&K)bAcQ~?4Ty>wF)F?wZvsem^V%ekmmp8Ub(7sS!Mw-|u%NN=g^`M_ zTI;o5Yt`1)TWf9As#OpapRHQ2k5*f)t)<1b_$;jA6g_W*7?~^?Z*G~Yh=$XBkpz6rN&5o{bZ^!@^idK zwImsbd_8rgG0J_t{GKstKiB9n+YIwM>Wjwc{ap>m8l(4h-S&bp`VgBK)9NvGX1yw~-+jHCm-o^CLb;$82}GLk;rZ6xjf#2DlGp)qFk2gaC` zUB;O7y7*V*A!E!x{|dAQ&kw9_X%BU*HUh1kO{PE46%Mxg@*>&78G*o>wl-gp3}wfI zMxeVX*cw>X8*J~f`}1;*K;NoBdtxx18UOltoS|`}vaAQ$Hj{dRmO*ZnGHu_MW-C6XZIP_tC3%bTs4TkN> zK^cSKnDNSt&c`f0fGjl?WxzAB|o7vUTmp?Uwn$4oarJEzHhqgFaHWh?A_ zF8SF(NBQ!z8+kwZ7JcK48McHiym&sga>;tO;=^bu7Nd#J$#v$Jms3cD8DEgs$P!xN zMrXJX?aUru7!EQ4lYT~_BiyJSgN|>q?w37hM#SmdVf2c|u0XIo*t)j6rCWwV=q+6x zYh|FhG0@Z874B}9!It(G_9XDMJ0p5+gsKlW1@l5PvdtRIi_8dybMlLHN%JBh+?VAn zyz2ZaO5@Q2EMoXfe2%2Ig+&uUm^F~Eq8+@p0OUnyIJ_nh3O99x!h!Cda96k^CNj_> zq>G>qx5uD%AnnxMJt37as%BL$>Nn6FY!9`DyL3h}TMz|%!YGP*0J3C`IQal#MBo{P zdkn8PQ05C{7uD3vt(sdqug154#q}15zpRoHpQb1+^ZDz_{N;63bA9a{JuQ)zreIG? zN4qx(P-Tpmg#&B7zoDw8vb;|5w&B@$ z3z$k<7($+zdJ7tX>g^7PkVvb=Tjldt`%6ma*46u}+xvp8Er^%wsI?~CC>dJX&1_B1 zI$!PFnud9$mGgY7gI(<{?dQjL-o9p@)EyKJPGg29B+PZW4I@nC#yiUDOp2- zNLM(lAGAXCbObtsO&8#aDN;VyfQ-~ANe}?3!mEdyTUAnDJ$GJpnU4>u$&q6y90~Te z_5@HZUG6s4(%y(h=f<*aHZ=#MsEH4^H^*jtIK^0 z+b?MESdDfBNhodr9lL9-w?LIZwjEnu;H|7GtErt=R%P+7-Vd*urQ{bvjAH=OGOkGt zSq8^T|0VwpV=}cvMbQk)9U2xatkC)X_rM(_Gv~X38Mw3GfPS4 z$Wo(RGEk%KS+=$`>cT>NcSU*vjp$P7x|pPOcPdmuhQh&5jdOBJlARp|k&TTk&qZ#Iw~8z; z;w+3itjOGDbBA>!VKeIL3b$g&i-C&O=oEFJJ-pf+$L9KK=FTmzt*Mx2^(u4g?ZEbWpl07@eApEq$t%b% z$en4%N95$&3O5#H=NIMJ!nRql{k0(67|Ac15ov0inVT0hr}LaD+MP}Z_{PS)|rl;BYGqWQhvpqMu?yoT%&W{u|78DhQ^9qY1W;q)pjWNsFq-O7UppAHf zoFv)2x~J+X5jo{Z4p@yo8hLU*=CB6l{O-uYs71h4dASMx*as}HuF^gjpK`VCC z&-2YKtEs7|@;CTu!)+ZL956}hP!p|!2xN_DW%dGejlCEMx-bvw=nHqX20P8!OL>j2u5@l~bxFN#cnNoPb#$>Ei}K1)0V@^!T~?zG z=LUm~Mb=C`9E8g=8%18YF&lzqMlidvARH>Py#qHDNLM%`STwUhH$Kel6+XWyx3SU0 z=Vym7j9D*DnqG`)rtH}7v_iOHvah9uS^sWXVMUxD?!mx^n!|!a4;l#GYQ&5U z^91$m0u~8o-7TWMiYdO6Le~GjQ&BYgN=D6MVwa-JCJCLnBc{cCDY2sLqoEUvIcKmb zI+xC_4t9b-q_rbxPCYG79c>%8V@9Iog@b+J&=ArwNn@so)bW7Y!fnw-WrTck@#>Ql z`>Ar0#I15h#;$T56Q>rtFKFouTo~@^zzegxHKDMgo9VWk7s=-vcrchVvnhYZ3{w#2 zMG82jE66R%4iy&Un*u#AB1Z5S_>e=^Tj_`6te51*q|eW`uXb2{uArze4-$z36=wwQ zV!Oj8ne#4U+?7nt`Klk|)nAc0$_z3`*v!;<%a~KStAMF#)_72*=B^NT7|WC0opNbW zyztn=t&NykTG8#0m<;u{iiDb=EvaHm=UDuIS?iL#!_=%V{8fWCpKt;$U z!(dTfPHthu3^(OE7jWbXq%};0!i`Nc^DX|cSkbfM!}*O(g+X)9niqC0tzu%_R20S< zt;#|@^WUH!(@JLlV0c&&o95AFhqpOhf$dcS>aHSgRdDjUm|7w=g%x?Yy^iH zA1=fb$~Et^(OQ%j`87u561H4mwfLH{(TYTMFn58My<6TdUZn)u4Uw%Rb1whkB}0(w zA1!jNUJ;GauZ3LKv*-d?R%>a)7#ryA4B3WS8%0+yHU^@4UCdQE8<&i?PdiKJ`YNmE z`Ws5?8hn_3<$H7GFJ4(i>fT(wqJ&#Jz4>bWMoR(AF)JGC>q_R;`GVb8#1U(9da9U* zMXQCSwe{r{Sox`L?V(&UMF9kezp}w!U0PK=B-Y+`i?zmAUsG0FRynuC=MVM-@#@43 zFl2|jurv(+TyKGzJ#yuY>rUO?Y%bwhY1H}}Dl4n}^XjVhn|(`rdq-c;V#P{beMNOy z^}O-}Wi7Aw)z{WH)YX;F^VN2AK>+q(Wfi}xu|BvOvpFt#p`5|BV$vMxFf*+v_m!5{ z*ZM0<=EcsmyT?1zn^j&fcc~V%To^VbXKvxl?3~aHOLBz6MUBB6OL9gED9S9!6`8@6 zaNFQt1TB{!UX7IGi!|oIK~^^69V_34my>0SE?j_ggcQS%`8I|TFy`AB@KR)|EgV}q z;x$$MSoaZ$#M_jyX6>>^ONo=6%_L0z{2VD#bUux)&9p{LFl^4OA1z5#oDCo6MIh?! zHrRvNeXm%-HUi-_O@Z@+E$wR5=H4KxDi$`-h?jj7KSmsenOIoOf&QysZ%wayy|snS zRV*7$PTGOcueYYx;@7XTc7Ba>$(g#c20w=XN}tu**>}5p8@)4S<1eeIX%Jo5{+?Od z;H$4_s4J;2sqtaKxGU(LIm85%eB|mIU!A!6sAZ;DiEM4*W~&sUy=r|^hs~g4-BVA2 z@CI8_Q(0Pz1^D(L-dtCU@{3Zd^rDwKQF)>SN`B(Ds^(Ue)>qY(_(Cms@?9a$eIhMg z=*|V03a#ZDArM``wyW~8OHm75L_VUS~*j}LQgM=#bG zY%lv27+D)I~U@l}zNsa`pjO%>!YHR!zb*SblE@N;jMb(v2;8<9@coUsiy@4j23W>uD!q}xzK6Gs~Nl%7JKG+ zgVh2uk4vMrsb9#xiCw7aFolY_EJ{3_DOmDznnF!@@3JNpY6=9YOq`h>MqWp_5F4lv zg@~7P6)D%TwJGGg8=7QJF$S@$GZs*hxeMrN!wqp0&3D6Df}8_yNd+0)x)_EO!R z9W?C9cpGmCVVlJfp<9Ck8FNM?(zVTnRG)RB18wHIge^ua1n64Ni#C4#pN z?jc7n!n^BJ(c|sGB)5j!e614|q2*rCIF9Y&vy&TxAGd!n6EQ$?~HDwS^RUm&r(o?xd&>6b@4ZVly& z5x{%N1xUs8h<8v7ehM#wctO!YY|hyt5wc!hg26(({+K;0FO)ko9Lct(CSfdJXuqQ*vrHVvV2Ppw~Lwyv|+im1r3&O&O(58cE~LOBFNBb69a`s zGxKJM*Glzf$c>&L#HYM{G`Tf`K@SHQQflift1u^xJq^F0g{xta9xReZO~lLUOB!lR z%d36!p_1e+@cYlks%a-)AzCgJeGJ>my&P4z4ISg^$T&u!(@G zw>x+~3B`&mCh{$9c=(-MJH|v7=2c;N+B*}{p$T^->IP~ASP1X!?CcOjfPJ=6R_<%4 zsjjN7z`!*RbwYa7L0b^230=WZ3xLHaw)xGWqcQ6JPl{^1Wx7PYt_ACs-PHm83bDeg zTSqloN14C0s;V?jHLPsGyfV6NRQPJkYs<^Z%ja5i1xXr^!?u08U^a|$zpu2SVQyKy zzsBdJhVbPuFD7YvC>ApT>lLlM($`Q{RaRbKRksgj)Tz`O;HZv~*~)va5ATK5RSorX zW54ZmcA%l+b*C0r9k?-j}4F2};`REyaYW9Lh z=)6s_dE-Qx6I>@672;;*02M?NYo^jn6m_7pL&%N*x+h-qu`S~!lGAP{BlZQ{WL@Dl zyg8uqAxeUfN=^nfOgWJ~Eln4=3FQg{UJ)?kG=$U@@{MxW6-4)K=8HxTx1E(gCp(ar zt1;qDMhI-NdT0eH=JoWb(Nr+Rwz5rLM(nzW*obLdE#+xbM;mTF9Do$+ZSAH4M|WpO zdp8Q8W4hY99f2H(db9>~2d>x4km;o+NGH}SFs`+jNGZ(qXx4_ej20x0La%Czh?gfm zB>KD8w)a54Oin+-0SLvWuv}ngHr+v}#^CKc09_uaPEn_`ySW9s{VWaqQ09d0XQ-vm z^dl?y*S5P;Qk8{)ER27%@`6wiYbvr{-owFgD7VPAWt*LyABtEnxzJqXx}e@n*XiVE z=LUspp%UP_y6_Tnfmy2z#Esys$trg6bao@}*m&!q2oAG1*{Hc!Zs+doUK{9c>p(}+ zqXCs#s!J+sv5@Q&g1o!Aqqh}vcp=a^x`jI0@r#uoCGYhs*%}U=sA>$l@Yr|ZB*NTg zl0n%8N!?=d(WkeO*bRyTIk`o;=@U^9D9m?;a|;UXh+KPTA%~;)C`69Qq8fqPkWeG9 zdSqJRAqqOl^eSx>ggQ<~3wjfGSR0|^rl)`|tT_qn?u1HHps6vSCVAb>!A__k3iV_w z&P3{s1^wVk>wV>=HD%THRoFWa`@%}>OJzLqV#nbCV!EZL+xfPOv8cYZyks7RuyPC( z;!z82Cb8#c3U&-AA_~cv;{X;K=T_C#)mLB+&>)o9q-I_#CUQa_P^`eIoo>DhTAbXY zuBt09tDWa7v$Zky{0l`3v+Z$nf?yl}N_@2qb8G$3z8V^<^`;GNkE$AI%$1il?C)NC zumFthd9%Q%omx)i%4(=D8In2 zZtj4RRCIRc@aakjJE|@WmsK4oZn`3aSa;pq&f5?j!&O8T6SMfMyIL&GB2jdK3E0bi zz&40^1x2~a263uk7?W2SM$cNqShUG7ZrN%Wr+#V}A7y%sQB@w}xdD&y==c#vRmlkB zvmGOhS8h%)GWI4I?YAZxvwB7vm)-r?4;prq})_Y0D?hliUPj)96 zKlF?-J{Ud5*p)KIs7oJXJQNvY{KaD!qm5C@Qg+3j7Ky#St|^U5$P~h#xTtC9*Zj(*Kq%T zWogEubmTbnW=27QFj(f#M9Wvgay8jb#v zidN2cF59mBW&axL-zcOc{}Kgc>qr#o@~)HAUncsc{$mTY{&?T1dM*%0!8xX`xO)BF zzmY)E{`9`xEA zI1gqKs`TKe%cTdstpv`4+-Fn0^dR5PY~24+g9V-M!S1FVtorN0tT5`b9+IKb!K?(9 z9g2O^p}e{IVeWEpi`oad%Zc65gVtv`h;?-RL=Q@r?obqH4%+DKb9tFA`}fuN`FxfE z4%}WuwZwn-HUEQI0MWP3#hwE+NYJbYt<_b2F#516*Mrgs)4ZRXHpc;P%IFgRE7d?$ zo@f#A6nqrLaN6MR$D~j1v+DKxD5XC4K0%bav}@nMtv>DEL66dbaj93k?d9D%GS-r{ z)NXL^$h(y7@}ktWg}R@)kC7LpzAbA+*GFEII=9irfw0!aZU`8T9{_JqD%wbI!{tEWZJHRRY@ySMW4Yp1pBHL6ruw*6jz-Rl1FOnzf4x8^|y$-WC~r5jJ_H{NFMP)$YMO2hHY6XIF##XXrOPW{9^ zu|{u@x#}~vbs(&LV(Rn(uk?Ziu=TSjEjracM=p()+RI~OOe zIgwj&O4o-=M>g(>OKubLIOa*&@hlMCdJ;N+`2?(bcbcY08|G;~=eRL^CqBioR#w)@ zRyl`w5|qn0BCZZ{{PT>2JlU`Is@p8gt)2)qwwd?=8D(E$ZpGo}NYK;0Bu`Y?3+0+i0^6(cav{n>(yi+wXC9A~p9pf9|kK%~7|wOLy2s zrlZ}^2srHTOeNDpH%8Ffs0XH}8m06XQ!Ow`aj+oZQZ01r9!4oA{lHa7*=D zhi>TqD1B0>nVQPK4yzY&90IgZ?bb1-5~QWj97DfZs75;!IvvW=Jb;d7B60MpV{0W_ zhBr`p9`i!SIe>lARXD33d`AzbDtQKtZ#_CdB2f%$xgWGm!8 zbVG*CBR6DFpV6TWi%vO zLOLI@0~wu!;}J_*`^kjj$!oOz5g*X;z?kVpo!u*}1e}Kk+YUvgF~N{dX^4NSf@((8 zzK3=`#!P2s))_du+gO;-?+hMQXc(2q(;4k{Nvsnqf;NT!cRHY1Px_QG(`?IGTRPe% zC9SHoMVd$c?LQrpG-jGe9S`V#=jnh_DE&JezO9a*cOR^+dKvHF5RT_IQ{k!mhkpFM zN-plPGnP@EJXK++26ssJ(2tmA8m8UjaM(-6FmdIh80N1z=+CC$vk&T1D#}99d4|t) zmnqf$zUDS#hWwUWX6AXx^TRk#v^%_99Cqj9C7QL^rW zG$uZ=wX&4J?}+#Oim7>#sb#Gx28 z74OE&pCiV6>yC+aAmvJj10~M#w-R^8arsQxr$?i0Ycq~Wv8p3@0(gmz6Xih5wJzsV zv+S6iq>-N0T|sC4v5dC$IR`!CthKxtQRcc|RGe**Fe)zIy{pwmZFB74GmU*6SiUm} z#B}|!Lt$f>nQ8W-LWR)y>}>4$XJ+PR&nS?n^O9>kiALkkJ!hRf+JI%1bkjmz;ieuO z@~_-hRJEhG$@1ho}aZqqe3GL;~fMl6C@@Pz-OeDD!Q{ZT{Ao#ibmrET^CMR z3~G#FG=S#SC_0}HWuIPN;V)TOb9PO2>8vUEDXTquiW6C1Q(jk6Td`nDCX4Ytt}o$g zFg)qZplsIig)oZkUfvdL3x+y+mzTqi8Rr{^x|fSV_Kciqxm`^;%NMt_&p&&)K7nz$ z7BDuMGs`$L9ky05?qb3xKj|@HZA%kQ`|XJIWKNxbN@l%01O|shWR~F^1)SpD1$vgN z64w#Nxb%d>;1SODohwExKHQA3mbeZ#lG1&^bAVXg(G_CDff*?<=i&0;O7mpRs6OV| zqgOus*>_GlGUp$mcMW5ry@1}!_0SHC&u?Ne@_v-tQs=6vDNJLh3&Uy4#KbiCJuB~&vaoaO<-uU3fIl;GHpL27|Z|3Z|dgq+(>W}CA z;pV+_ZYv#Ge4#P6_|K!#i)So6qImNkjw!xqYgTdi?bC|0O7n`p|Jzx`x!X&N|8vLO z;yWuB6tDWtImP!q5GsD3z=@KXAi~#jjrWYViXX zzgb*8@J{i0*ZiS)*KL0(9{-b%i?4p;@5R#$kN2*_6TS1Nj`psalkB}_{y1;Z`Dxz! zE+j7@rZ_a(kdFT9iig(n*Cwf15V5;}>drtHEzA?>v&DA;HJ)QYp zPu&dfDJRVGzWJ9ky${^y^-gIo^*(rPh4-UvmEO+t=6dhkRpULrx8A$%PiJ|{mY(fR zeQ=Stb<9%l$2I48E55kGyZhS#??an|-U&}Pd4IGe>|OGm^SxJovBf)L?gideMw|D# zJKDV`&Fu7UeQ1?;=BeG@@+*40_r2KbEgiGk`@J*Pc>lY2t@rXXFZ6Ca=?mUx_I$yc z{Mb70?6&pZGe%$J{q@xsd5`_!T6nOuB!s*_BOqk;R(|;V{?S3@H`^(Ec-pai@i{ER0xwtm+Nb$&{ZZ97D!@=Tf z{vIj*!e3_;H(Z@k97=q7j*oka(^^6&KlxK*?_L82wZ2F=*fT9V`&y6DFERFElkzvg z!-3Q3>_a9-OVDu8q*Sn+eYoW4m*C-m>2%XT~Bxo#zxbH;QOVEE;Fs+Jp02TaVwsp7gGMaVD51LhYW_0HL+8P`2Y&zdmGz`=E(z1Q_MoAo-+P9+U8V+{; zb`_GV8J_u@Y|+M{&)rT%nPSew+(;hH1zOI}HsRtUP4k@k(|;JVADDSdQubBPr6)gH z!09satJ+VyYTEc;)W4be@h3}v`qsUM(I@cH^S1j1{;I;ePM-68Z^4g#_O}Ilx20TX z81D&u^n5N08K-$-&*#2F2{P14h&ijmxoJ3MMeNxgz~stg$CLORrh>@z^PNCuot>ST z6>jXzoCDC(naOZ|=4qMd3Iy;($UwIY6d`s_rg5;0nOV7cDwi`v!iSO)%8ugYn2^)ajnSoYd(hiG63{H>ochzbSoL1CJ+e^#5aEOWN!g*1a+NmG$E{ zkua%rU`yicSJr(v`1rXiwr(s<5WgeDuLr-pmydCkaD>x*DNuqf!lml9*|dw-MI~W{k)7W$4MqVI0Ry$J~_bAAw_B#-{T<(1#1>(H@Q< zlUoHAaY}r!Yb_3;8Jo@|DF5++u&x%Iwl%`2PyYbneq7qIER%3?)F&-nK1e8*3jwDA z76I}dp5Y1=t_1|HzX9+}!1*ek^}+BG6<)5w=c+L8nei+z^BrxhQNFRpI^|0iBMD>2 z8oNx~ziSKN3Q+DoTEKm=S^y4M{O7d+!x%~{;Hw*3K?xvRK^Y)h0mEzs46_yZ0oe+$ zq9j@Ye5m0RPTYOF7d)Q>-yt1-k!x2!I*dj)AJ2HDN>rfb=^*o3|34UteuS5lud&bSs-}! z!_?)^%zkm*Sm4U9+><(eOW*wJfloc_iU-$c4zAcU*qgcWti7l0-k7mz_Olm{0o4f7 zWDJhjP?|WHc*KUpFI5lxF%cZ=e~p{PJ)Xm*Ucn?*SAp;%)#b@VHP!TH=m&#qUH|3%sfDO?1T< zj$k}fG>p@6rMu$4BI4N)q`+i{pXTZ=EECJ%1uRV?C7nm_@`$b?bC5AIHQ~35OWcA> zTMfDC+RmF*ZGuA;h&e;#^;x z6*e}V^+jqTaPBLxq+>000xKr5rck~SSnYVf%!#*pwL+q+^|KBd0J8xhaQpKB7XZ#t zVZ<3{Bh0o<{H-edAm9>&9|l|o_$DB_WWNXbpiB0T0t^5i57-1a9gz93z9WFF&!cdS zHkcB9V~t0YFWJ}xDv7&J`BXPeiRz{y5TGTW2wuW72t`*NT%VS@_?PIZQ-40NH*sBf zur_JqVs_SnElH)Sv+hh*eQaYjnTMgKGlG~vdWn}fy6tw+ZBwWJyf0;Y1?7*C zy7=Xtqv6Lr7*XB%c?bkocfLS$=Q4I@t1qitm|eSP-+lU5?9=Gb>(gYP9$5bo3TgK1 zp7Dbf8Av(d@ePUBfXM9UKNkI5ck?MI>L?u1=I-zzV6@|lIv+3_E1kW=pN{YXSNsSL z3I^IQ92;VtE5265%kKC-;zuJs&()!sCmZv{fE8)*2xoR^xoyhv z2|`IGvR_XCg5;bAO*G7&odz^>U{9WCuy5mZ$Mg&nqkA__Jv4jwMD%Zlb^o4d)IlPo zr)QE&u2KzY*{nKrSY+Tzqa{24sC7jcc@Vqw_w^j$&W7VR2+Zv?*9?Ur7-85K z^Vqf$JUX8_XGHFoWhG?^f8a>t_Vx5!WHgpvBF(?qG4RCZYS0X_jPPb zb{AuX`$n|Mt)M$+yd-23^~Kpa|Ei+VNeVjG3hh&9D0`#md_H^gC4V#8@OHfPOy{Hl zZZ57^E5pCVKyo-{^ncAHm2G9%)*XoV;5y}a`YabKy%!LDD(L>EXxTYpt*qY({OMB+ z<0V{ltjbvFr6A);Ct%>r5@e!li1b|b!X~^((MU?>8@+N(x@AM4qX;-RiVpQ0Bi~3A zU39)oZ)Fr+bb6%g8Y10=L!|rS5b3TOBHfpVNO#i^>24b$-FJpa_k$tQJv2nR$A>_d zi0Af96kY6g@Y5)|*zMqzA=3S72y}@k-@8$C(d8rEABRZy=ONO4Fa$cb`%j|iqU$9Q zbe~1h#lDXbkl%I}OCB)aQBicU^Bo^W7dzj>hDbMYh;&B{k?zHCx`rY^y z-`Vi?16RDedGVs!JH*N~@X>n-?c`_Ac>d~V*IjknmrtB!80!Q+f79>oo%!yP!XtjS?%urW;I|Cp z1%W@KzAEjxqS+%(>g(QoV%9l7!8{dHqcqP)p|`%?+Ht|dGryZKuqj~@rb-J0zPr)lBH&G@WQ<^@o_U0#IZ z=>l~_1^i%nq0!jX3#+~MrnUP_<{;{+4_}NwguB8`2RmCL!M2vxwYWWQ`cCT#E)ZrA z*o-!Jt{ofI+{T`hdC=R-2hC`19p?|*R&M_A?FySonOnK}W;q?&q+=n4zYVd%Re`al zUTLziO@xViO8JtFx8UP@_gLe%%J(nTFntV*M?<}QcyYsJ_-^{z*SPA$i|#R;_x9NH z&(%DJV|r9tnI(|kzDVRwA9Q6vzZUR3Ts~ZxzP!A{5%(_msnM8S^89ltpx=eK7jWGw z=*i>cleDCdM2-c060WyEzZusiT>ZAofIl1Y_G^;j;c|!OyA^c47_^#C^VsQiTx|IK zbCZ!i`FKC%+vI!xxmJ}=CLq)f#l3G<_YaKehWsp4Jr9*$msQ^n%eEPptZP{Z2EtYy zyX!75Z*0j;U;7j^yeB@Veq1`;*ihC5^ZGt6x}lc0|1tUOGkt<>pFjPNiCxSrDl()l z-aPoz)TujCr@n_%b@zcDQ77wmZ!E%4wF8qYCjTLyL~u3I?x%4siR*AW{tC;~QSuH2Y% zt=x{;NB-~F@_$R_|2DGt&D`GY;`V0$RAzn+GcQ5RTeE*EG7o>0I&~YuPp|^Gm~t*idpg- zrU`=Oe(cJ!dX}J=X%l2^ifUsS@lei{+|$VrPU{;9un?7&Rxt^ge~`LdlqrJLBdKR| z_0jkM3BU0{>QWH__!OQo3c3Y6wcMMn-~+;b^Kz7TDX>cy;bF-w=X_-6FJcbRc1ibV zgX@FTG?6O8ixS0sgS)N>=mJ^Rv=w_&mpz@j_)o}V2hgfK*egCVbvl;Muw#&xy6g!Q zJ*nFL2sf$sHW$0eIR<__~`o@{}JoTxa zbynn4eIwCZc8*M){#@S_lZGu_JQvkWmZ2f0FWkKo;|uVCVaH$ zVoT95MIF4jlZ{)%kuWKB`nJ9)@X7l{V@9Ro9-l%xvU8Dk7k+9Xa7C|D)vFusQ+AbKLk|1s2Zv50u#Sg`SD#lNdsNlgJoQsmk=OQX7-9Hr~LzaV?FR7)Z5Mk0G z9slV_{KeGikMs6%^XUtd`ZDchU5c(O@6w_GpU4nwtlSqwt*N_x5&dQAiy|SxFnH0K z1A7zJ0V!%&W^vixp2gzc(kpgEQrjVy-$jMWRv}t~5^6FVg-NS@0~xQ_gFAW(^P$RzcIh^(0O zI{RI^KZ^kfiu6UN5Beu<@J}A}XKe6K8uX`a@MjGAQ#Sb10;EehmpTB{p2B`I_T*-w znz4WYUkQAZ;ma_%(|EkV-2~sM!uLJ+xOy_mcpko)!uL9Sn}qLO_!bM_^btZIkSW8* zVJ5@y!*_;=T>)RV@U4VT=DPvDLV>#$zAEAS7JO7<8D+d^#(o0dJb_EX29PWP?Mx~J zt{Fa=-gn`lXny`eQV%r5*+uyS0{Y$z$a@6i7Q_kd}oW;v*9~W_#*K23g2Du$tU#v0iWcUW#YUhZW(;C%pLH_r*O4NcY{gyO%wNR6US{x z$-4u-E|Kpp_)ZqSkKvQ~j!4pN=ot8}60xXUp~Myf)Q($>SqNk(#3VfLDe#jPi5V+g z@&AGNqeZNwJJS{aF5lIko}HsO6rOlM0^Q!^}kl`@N<5;%P7IUM0v zBTd!ei3W}WXf?D}@Qvtq+VNiK8gN~$@aqkupLKTyAlux0gV4Ojq(<<9;Jz)gTR0Dc+p5x}nia;}6l`#%P}0Wbq)`6?iF z8=!I0Ukdm&z)nDH^!K9@jsFBZ8_x@Cz5V9^{s6EY5M}EB3gC|bzXkYXz|DY<0R95- zCxE{Pd=&5lz|DXL>isdmR6vH00K6UWbii)`P6zxpU>@Li03(3k1-uaOzW^@=d>ruG zfLj4y0elkhUBIURxo7+|U;^N?fXRSpTm5GOJ`d;z{3+l{z@Gu)TfD}LfR_Ni1b8Xn z&jD`$d=>D&0e=Db5#TQYC!s&T378G|E5HW8UjwcHd<*bAz_$TA0Dl9x4)8s|O9B4` zcrD;x0Ivt!1^6By+JFE1fFA&U2KW(RDjLQofEj>)1-t-oH{g1}PXS*B{2SmKfPV*k z8*mTck!WY10iFc77jPP2f(P{pi0$=$_N8%v>;p&Pl6pq;Nj)R_l8qX)4vA|}zGP!7 zYFLPcEI{oLD;(qKcA~k^F^tAHD!pH8rYKjxHW@zdM= zMOZom?U^!S8Rvc?7tA~A_y#MoVjx@bs`rM$ilhxncM$!H?l9$EDq!$|G(UehvZ|fD98t;0UMV z&qBP6m93!>A-5(n(QT|HE11a6p`30>gp%NJ z_%=aoSePlma43`*yWSQ1CrrANq_)+xuW#v#R`+As6Fk(q61^EAenZ-+e#inPP;Fee z(XUb|Zn!D3syG-y<%Sxv+#`NVPj&6*R zscJ(=BVb0Fn7M+2IcOU89O*QsLnBO@D@+XQ*{)MH7BQAWq9l_~!qUYfjgyPL(c=33 zgu+RrknS4_lE%qJ5t`s(P14QUc}~RQx>q8V8l%00;}K)!)%T;{ZM3+aR$QcU=0&+{ z<+bY;|LYbPyuy*j$(06-#g#tgdI)TNU++sMOjg}o6qy#+;*TGG#Nry`k!+-K=7o{d z#?`blGR@+m%>o^1oLuZ5R$ilizZNqTT|&MN(~-u>Md@yFz4)t1J1j1$L(`GQ$u$8O zi)+)HnWzGtSBv5zjgxDlgKNQS&A+g?E>T>hadI8u;5ujiy|{Iq*VhymX`EbWcD533 z`PpwCwz%$9T%>VwaeT1u>q>vZN{j1h#YGw?7bjyD*X>*X(PVMGt++_zHBip82Y;lcI?4)sWadu&G-T3UtM=h@76&GooT*o@No}c_( zOd)g$xeP)_8YkCrz*zTn{rEdBx46zyT%>VwWjeTi`Fa3T0G(G*c}U~rI^Myx_8-4| z&Ei_6xJcvVn&RMk`O1d3EUrrw7ipYaCkQSrqaI7YYlFqbB_2A`IJvTbv1()LJ-@86 zxb9M1q;Ybc=-^uSgWINBTt8M^q;YbcB)D`5uYd6B-&$NxD=yMFxlVTEb^F4=br#p# ziiXiU;ntH_Ct&7eZ@r@C)X(su5Xp({L-NE%v{-@m*SB~N$jg#vP2UqdU>%A6NiQ*!SlM7fhg{WaOU)Sf&+@BR|$~Hf@#ZMr)KLq3s8`E=UX4>8U z?Pv<~G~*%gT7?AQJ4}odDD|s{qA_CF(X1JVlaoMq4kwdveEagnv7;GK zG=fmm+1>z&=WJzX6dm-rU3M>=@s7q+^hi!e;W$N#Wv7BEfN=t7{;ueFOR?-;o(294 zOj37qq6)`1vsmd>A){hUOE2dn6E0qQ?;!3$(EJCdm2mOW?GNhYb{r-vcH*qMoIiXe-d9`iZo1Z)D} zqC@hr%Ln}FpxLeH;+5|P(4C5@&}L4D;4oarOz%o$L_Pf5IF*5mmmcvigXVQb7q5J8 zf$km9Y~>^eE?#X7cadx5LW=2bWUX8;-!~^xH3f}2=No^`C?Vn=mFiO zoZ`Tl>ACt5`{DhHMiAmBmYoIZ9vULuqeGxeLVAx!(fOk6vq<;M5b0hTBHb^BK*#(2 zO%z>hdy#jCNcYDf&~dKy=P0^{sCpsYXEEp?>p$lccx^{~ACjqs*laivV&y0!C4G@8 z>cfGqU{6a&KzBcr+Qo0}P3wX}>0(@~T+#wAq;zmpYM+Oqb z$F72{;g#suJa5K$-1KZ2pQ#wKzcz}a)-k-+gt zbahj6unT9=(F~+lWzvgW!~u230J##m$V{w~se+{;dMu(bNoJXm$~a(7B&MaKu{VNM zrlj;D1Vt^BLPcw6v@V|KTf#omF zKkJ^m<`?@$wS*zE{~*(uaQ#uo&2LPae9yLb(_j4=-p5Wr2C?j2dIUb&-sLHQkG6M7 zL|J3myYN8GG*7g>%Pj&QZSV4qz<+(xxp&?$@uVGpdtz(wa?hwb3?~Up=f<|@e4n+Q za9_&hGmbgyw5i!>LINLc-*dOXN81U#C-8q*Hsy(ht&5NR!`%<>x%4l)Qm_e#W)bVe z!d`(lR(<&XwkLO8{LR#txBhiX#wJX21pb!E(|u`;pB*voD;>tH{$-f@jK$cL=9zWE zRYk?gr(XGV_k9cQzqj&MG*y9r=D&}sxZ~Zwy*jpQ{j#IhT>358{RsR?HLs5C$$8|u z7pJ5Y{q^NN55hiQ;G<7m{1DIaLXIN`Y!B4Y9q8`u?Cj|3iEl!35Vjxavp8&gc#~Y+ zi8Om6(^}eF5Bxrr$QH*v4wKo=|JeZz&0cDF?SSH#NF7ugg`t;hq6c=0JRf`@*okJe z=3v+l@F;lKiR%Y^1ifh`#>s&?N?!GbpswlxcI9JACCF{*=s8 zIuF(zvc;uTmEjbGU!_RKn$+F!C*!hzmEtK8Chj@q`-y{~?A zQ}JyT_ZL6=jo%eRMQWvIZ*S5LL>L3xl2&XTLlRt;N>LW$l;e^c9j1H29W@FY7AlM# zU!iB5WBB~5d>P`401X0HjbDjthHtLGb(+2}z*j49eEc8d z($x$v)i*`6VD-}7f~JuK3~AXk{u9?smu?|>l5jnV>u$5rsHP!5wTjnszSd(=_^>o4 zrJc?18)2#S0zJ_XA2gy0Fw4SLGtr2^{ymIi_0W2F{2kjuIbL-q;%k^PebJ`aqd+)y!5NY@S2oSF<{k&h) zpJJ~SXuvq|Av0?D@IEnziiT5*|5ZOE{OXW5L z@Xdoy@-BmKtiXlgD;6B>W-NOm2NCA29k;mH+H?=)`~v@?*IoihdVBl=Mv7QD$ov2y z_aMVGN!ADW9d{3Qd@ouIGCFH3Vfv`OY}$^Xm5Z_*cbK>j7f``g ze$d-Cm%%cZ=~(6}ggC(5t*~t<1n*-NU^ZYkAp2GiAeIEhd8p?D_946ma4jI~Y#ksa z+j_t!0WSu89dH2f&w!T#?gG3F@E?Ge1D=ljuK=6{cqL#d;8lS2fExj+()T4m*6B5X zysw$Kq{=mY@*H#el8p>dN!%pmQxYPB{dDolk?2n=$Fq}Gz?@WAx~EsTdnpbCfG{}& z31Xr;Devja_NIR6Mg-*O6yAd&%zi*}>SKvlVJLbb^|A7+Mx>tek{XtjbSXi1k1btb zTq=g6xu4w#md&Z>U>YZcOa+W$QL5QLTX%cvbl80gX_LNUci+U7o|T5xPjLq@3Ei0i ztW79DzND?#EzDS97^&@v<>V0^8@7_d92=rTNCqu&gwWtja@l6LJfSdo?@jzGVe;mR z_kMgF>I3DkcyHy%f!)WZ)^D-oM=i_6GX&BWexwa`Wie8h(FF6Ufo&N|yr3{Io&_6L z&KzTinShWpCm<`?%lSy8uLwRVAzn0bzc+n*;aiFeHiu{h(svYm?Ee`CWr~zNw26`u zXAXQay;}JEf{rau=5{%JGL^5wC*{m{;FEIZK9df;RmhDHpmv)Pn}LAt?36Q1fwZG> z{m2!+7x8i`E9t)Pil0j+F;9?k=vIW>GYRI&JZRhX-F?a-b0)zeYL}!v=x&xQ8p=!} zhAh%HZ*N(N8Y~}W&XKrYR`{w*xi<-T?^tAZ)-8N14_C z2;lbsp9TCr;C}<&3-}8_$m#xH1KtPtHsB8dcLM$hkh180K+5{9fD=)!ZGa~MJ^^?( z;FEyo0%Gjy=UHSZZ~t|GuL9D7_jN$lGx8F$X%^Cwwo~*;+bQ~zjZ9EUT$b`Bi`^ju zAt9<`zX*>+EFBvR9UBlG!|&q?;mUTs2x}g~q%`~pr`~oVUE#18e>C0+`5vqdsS=P$ zXOA?b!dr#Iic04(0{F=)i3U^xy=SS)D1~26<>-@BIr@@?Rgc7d8)1pV8wchaa#FGg z$Fd}?^eh%adIw0jW^mc&9-jIjauyLQM=lm|K-TV|5T!BwmL125vl^BpK0!VRxN(FK zGdN^mv-$pv@qn++D@QPoQ7VhH!Nki*yuqIs$lEN$PZEN-F9?&P@XKK^L+FWy1+LJ< z&4;g9;FjTcf$*)wZyBx(4vC8Q3iy(7S>J@<6V&bocu?sMaWP)ucpEI8J^owhGaiA# zL>h6IxZ>YupR$PybT5dv%5-A2W1i&wGOq8LF{-ujTki736)KFYdii;U=3sk>pSN|t zfv~2OgWS+-DV&#xSqVSLKq<&Zg%2`_LkQ)kAczrf($;bdYf?LwuL>7yje?u*aJ($A z9wq>??2`dc1Uv>X7w}lXxq#?&{k?$ba{ZSAo(PC(gmE$;?{_L73pEFq?6&mDZcCr+ zwi3r~D{vT(JcqyPDnAA|*Pe`#!E9F84^NdDv~gW!5M(FR)Rgo3*Ubm^Ovr z(he^ZQ zg+b?#>(TnWRu+=bE=PG-Ogi_1Y9DaLt_De-1YFeV{kh(G2>h0yYA& z+#x_#`3zjL%IT9;PM>VR62}HCarj{JnN@FJh}J09GJt=9Efel71$QZ!=EDkH33Lo` z(GJq?c9m#bNDcpaHj!&EJm_aD%W!Zuky-#`d4FuX6`e96pMtdKV(*n0yT&ZLaf0VC z{CaS8th;2Q6fJhkMNVQ8Jg?!G)O7JIAUUbyAa?!SOQy&a?dh`#_ zop1i*DKvGK%$^R%mIM#=V|6;x0@8k8oKh!v_`=Mta8=@X+`c;8#Jbao7o-1wll^&H2dt-vfSss?mUe6Tt37)s`tIKnER5}v`O(A~C zz5D!BBQRy5ZXedkQUVS<1@#u6WAqF3@u-(@YW{Rf>KK^9#LBMhP zE}h0KQsD_EO^3o9VPZBY%;6^H4uu(OVjfbMaVF;H3NzZo>`<67CI(Bc!lj!Ss+CE{ z5(c=<-qB>oh}plLhJJp9ijEe&vUi`UFsUYneM~xi@8?Bf);KWud`Cw|mz(Qalg2;^ z?KZW19kgt%)-@Dk^py1u&345_8YdTJzr~fKb-aV?zM~#})8d+~xJcvVn&RMcTAt~z zfRo0_b%NlcG^2Bt@EnyFX`EbHz*wKCaax{zQE`!Ggh6}AfJ5`w71WBr0XcW%8%>}S zpGL+^MocCJqPLx>KyN$F4{8tNyEXA9nz16}6e?DXX~!m$bFL&S1_x3s>!=9l=4LFU zoq8Xyd(JQTh?|zuMWrbui`}Fyyr$D;QfHak#WTU{Ue(oOV{qBv2a<#4K#mKbo)y0bj)mWaM8s}4-1aQ zY|x~NcVs!=iFLoHfvyBJt%{D~E!O>V!=)cIcXOHr7q5JrTm1?&4{@pm#~FL9^qxX` zpMd63PNm@DrN^;q7ih+F2#4c5BUXBR9;bsQk%Kl|y!3vIxI)nUMbU9q9V@*zP`*_d z%4<2q!o^FE<+~U(UsrVdD&NDP`3f1}%=BC~Q7q3BibfFPCzeeVo5@QyL5T)_DD-Y&aQ5j+kFm`aS`wTb(BTT zfJ7C#4USld`sZ3eRR~d;}?H-V)v}WzFhTD$LWUgdx4L(U81H%tZ)8Y zB=FI;KlclK^tXNfCh*V9OWV@ zE{+$&YGGk2;}4V3%>gUXn`-b50Xm#^K-~vpm~^OC9p-HvpfyP>bBEzDMMr0didg_b+Ox z0Df6Z^vPPHPgJ-?IhL-(&W2(+*4K1;aJ{9R|$2{1d?3MDQ zs+8@jg-l1htQ7iW3!yJrXah^!_YsyjNR&m;?P%BmjIpu-_FRLzq(bUoEi}wC2A|yS zLA4t=ZJO&9vV(B}X%;T4tCb_99oMbs*!k%wh;UQpb)vvp@$-0BB37z>T#C?{u1aQ_ zOyd+>x5TOBo({2oA46+_oXYi6|50i!tM6`kpmiq7;&QwWLUqmVd09Gp77 zc>5^6=Hl@2HCR*0+q`r1#@n+%WL$M6e=mKyC;7^n>?Gg7?!(u;H?TWn{p25K0Dsz3 zgD-BpC@Eq0mOqTh+x+2o2cH>uJK@9c46e_B9ocq26s)l3>d)lU-Qdp}ti<8`7Xt-a*q8B}D}3L>FYDiGbs>bb z&<;YAL{j>xAC&Hb8 ztix4+KLP9p+y;mO3pL(ez?Ts217v-z24s&o9hcP8qfhGT(U(k3J`p?C;0m|Ip+`VO zH6uQ{QOfi1eTW)`YSHb7_a@s9@AhL{S-7;*%cYE?b5EK$Ey#6En#jYUdNM9-qbR3z zsM0W_q5tfC&sfiOw!kit*HBVguXK z@-_$dK?bQJ3C1ABGF+pC;&Q$4aY&NGQZan9aAk~ z5Meg<41NhkD5i~~zPjT0CVY~ERp)F(Az-xovGOD-$VNoz!A8aFK84ru6g^tSmvr~K z;@zU>QpCFlMCM7}2XOsoI(~#xjgWiR;hq2n!~>E)JkUw9S_2}Ibqt8FshkK{1~%A9 zxSqpB_hmFlmg@$k(EltIMb2#Dw1&*yRz zAZP_X1(0Qt;)p&ej_8BUJ({z`B`KfiNc#~-ayVnkIk+;g72s}3S-@y_tn%PN2$@h$$X}OKzo?xDFc5_R2CihM<3B$qm zp3I((%*JpgPNoTE23zsnZ%GsC2zR%i+>;6Ar3*4!TP_G^1~X-%{HnR!LdcXo1u1l7 zcDF$d!l-WV3%0g|WDc0kH?>4skZw!6;#FPipQr!H{dlKSdUt0N%WB70DVzid+4U0H zj4bV@o`xqeP*XzN_4n9WonM?t6oSQ`4rjdk)BhYTXkNoFQ=}Uel@0}}+!sp^tm+=M%wR6)bNb)C-msC3wS6Fd|Ge7be(ztS1~yeR9PdbVj%=^Q3#D4tpR z4S)Ume?^yv!a2diy>wlk!=lp35H$NP4+WaDJQ-$+T8xc1GDQs=ICW9F6caODVGc7f zl?nq(4aK!gVGI+~>c9jd@|ZJ;B-c>&Bq6|r8-~c?RK-OaCl`nL z1dkrhj`;hds`Zjd^uP-UCczT<7-Fd5Nj5#6D?0VI;q?Z}e1YsbU+vtQhIyrx^L&cVo98X?W|jH7y@lSa zk`kYxC`-$H{<<=Md0o|9pMAiMM_*J^Gq-AP?YtVF7&nn9|LiF?_{tip=arO~_f~{t$!CN}7 zVqRr+rD7EWySE5D9NO`Vu^k-V0#(Y0$y!?FtDIL~QCrQvqF8+@PEcpxEtZWsDVE!xCg04N`8krBntVqJO}=9?<+=!4 zXe>>>JyJ|DTDlmTe7{A9KTQi?Mdpj6$(PE(%jN`~OOuZhVm0WlQMBwcu{5)G0RK(U z3@XvVktLR98+-dtK=ZbuiVq?<3G8QC!2tE8kSa%>qrMqKkLGoMrTZ<~AkR_Lbht zpxLA7;-$wo@H9L;AB8pCzS8Rg%}t7KU+H}hG{2%4-%omJ5ZXl)+;H*I&t)Ny_{F4Ll+&zIKVgA6zrO}VdveW~FQjlOKw@`c^uuI}Y+!M0$iqj!0E$LjXh zj$o);9$(4Vrmm)(<%?U|=bydY)P$I?b{U1t7L%q%tQ~Y8va+1emg~Udh_5Xd=YVXt z-dYCKsH)Isg-9>Mz{mn(E*1;BA04-7O}1fDSaU0<4NdWEzq(~{&a^%X_g;n?aXvFS ze-Nkdd>{3We`q*GYjn*N_~=uxR||Z!Ce||oAFYW6b8Ms^t%2|lgamg8b51_ z3Qt)MwTn>4>h8?WW~>)wUI6Wtr2hgtsjarNSI>s675G<+M{q+Z!DW6_H!y**9)*{>L9 zQ$1^HHaDxNIwMx}ZQJ14$U{5ktMk_PaGfD{Fm3>3c`&CII~c|A%N-2* z<7=nHVOx4-BI;4p-^RozIFM79M%5>_H>LUvOOqi^$;uHv*3!qgbZOu<{al=;bJysN zz`4(vAwO$$3a;a<8kHhG6pjRYTYCZ=9vnygfH;=xKlr15K0tatTbeA_W?Za~d|Y%_ zs~X=3$VJdE0cHYT1IY4k0_43H;gU~)KKqvTYbtiE@rLqQTiPoVKc0iox5QKE=jufs;0b^QfVqIxfNaUL0QoL88;~-<4_F0= ztG@=2bajAd0xkfA1npk}NV-Nq(nSDC*9?d>`r81#fL(y3TL(zGen8TF5zq&C1t3~V z|J8t`gX|J?Hvy9FX24RwyHz}&H`C#>VSEZ8??LW!(bKAJkXfjgJQK;uBi-Q_esb%f)JbLpr5bHC|MzF+oXuu80kpLJ ze*drEdF|QH%yXVIXRgmYGxN+j&76rPGmo5C`WAqS{`KIgAWbo>G}VF151PAEGIH5Y zNv?FyUgv5by}iBTjq4LT^a8hJ(hpKH{kgwuWy{Uw?n*}8!k7b;%vZW9nb|eh%(lx> z2YVeLp}WVYEFbL|aLdQBR!nX;U6oEbxv$c>8dMUdfhwKpph~9_RGtjvwCzSNTRL*3 zn=-Mq{SKegZsJ;-TRKt^cEe*OSZcfZ^riDN0v&yT()n^%r89@GSev!N|4QK)1N36$ zhI4dPI#-bUDxE7qC1EnC(xJOEr85;&>8QK3r6ZRu9l31jSei=5(&%2gXgfXsZKd-Q zo;>0JrE^zTrSreMWX6*7Dj5_JQ!?X0mCOWC?PemVl0ms~N=7bQGICj|W@(aYme#ps z5?<2EtDx;0T1^LZ6h)<1v?jjr6`i1Si;@af!r9Y=-F@2{4v$iz*y@m0AivIioGUpm zODaA09;s({cU5}&zC7Oxol{ePLowE;n>C4pgFjUYP?ZL>=838J^BHA7{~rcl|0goIbkh zl^K8=pYDtd)p06aUwv>o!@=bEXdcApJrpBDH=OIweVybbhZ8X2XpH8@r#mAU*%s;ixkEyoup-XJqJx^TjLro{$>OF)8Wl&d6}MI5}t3|M{8JaE>+MXnEgFmo+j> zG*Ugz@VN2$pBKJKZ&uyE_Wy$hLKb*b95LzKJ8FsnrOp$%b^706u!7)j^pAKrAr8X_7HH<(u@LM(df50emtHpJ zl498pR$0@yX}kcmUS@gDyX_A83cU352Nz)6(s3NjBCcRS|DyheT^4a?8H>2(`B(_4 zMsajy5w}=!KJn zzXnflNgfV~udXcOByfi~JmS;QRe0)Z#=3zWAv7B9p7bLxp z!ng6%1BchZ<=|=TGv?GGk=#{zY$LpT;R&5?*bZ2}&pJGov+M9wzB}P-J;QPxD7_b* z>4s#ntN5vW$HRA>`fZK_h4*uZ$8vTZKb7wq_bzA@Gq5&x91dU~!`Apl2z46I1x|Q~0vsn|=sQ%c(ynVK(?Ka;RqBy!i{w z_Bvi`%tXXI=RJSjTWZQ~vY3?BE#MOyHP=k5H*X`9NE3xO#S{#L=Drm$LF4Lp>0K9Z zKRhNO)J5}aXPQ8|dnIBrb76m;*pCq2>71g3^tkW!bK}$Ly?)77rU$Vcb>H&mhSl+w zzf_x2<-^~J)ttHooio_Ypad<|W>At9YGy*lRL!rRMN0LQK|#j|cDTL>m`c(62Is)T z>)~swXI0G)@dh8!J|ZrYwC7~p@KU`eu{+w~c;jMXO;P&m&8si>I=PWhI4aM7xDlHa znjy{G(%o{{l10xV^A3CbCwdhh%8lmDS-V zwZDu%{C}~L^C4x%ziLPt&j<-hy~piP&i-8Xr+%L$?~Y6fEdD-8 z9x(7f^#C4P=%i}!;Y`(_{KJ@ncwh;!9pt`-^Kg{G0UwZ1E`#E)`ZUYS8g|MuyVucn zs_#Gbu1}0uS2ynV)K3~+f6Bz!M562Wu>~79v{$T+mIkAlP0xkW*PBmv$^4F&g+@m# z&u(fCrLFhsC2f$3iy~h4TAE(uhRtimS`wyLevwMeLQXd>=J7n2b7pxoGsLo0H)cti z4AtQ-&QD+#0wv5$itYpN;4Dm9oYy_#nZw!6sKp*$UTtP3;mzCd4`2nJXec^{+s*hv zpCeQp>N%a6a`WL^1uqj(_qB>zbpJ7@dnhjXoXUgmIKECmn?0I!)HvJRP<>P{)XjNwC^PKDTd~m&~zwx9m&P^O=$g-icR+@ zTZBjWLCLRYUdCy&RW6&Ya;58qQs!zO zeK^{<(v7*f<=YvjVMlTE-e9_UlNHtc2`nilMJs~5w=qLsJdVZo|D(M<+G}F8IR9E7 zw&&4au~?f(#kmu&l>c{P&}Zr2i!`<3Y-(Tf#Z~P$>GfLS_V(p`33=(SbVJ~LP40OX z_M8>**X=2V&YA`@Z0BzfDWh)Bg&5nIkG@YajC|z1sfGLgX#bs0y<_6OTem5Yj;D+q z^8Vtxqvr9^(za<=7e0NJ;c|_2=5j|*(^l2CddlQPFYv?lHU6(RuAlO+nw@3dcXp+5 zy~KZ+ak&+6DL(gj9fxu*u>wlwh?lh$wY^T)A7lY1&0MwnIDVIO{R6K19XoY}vnuKO z=QTQWp0*FyA2|mmRdB^g_o^-3p&Dh5P8B@_=c`@v%H2jFz@M_?_8%rvind;o01{}V6*Qu5&__#pTMsQWg8KLeGI z4};2|v7Eh3smRsG*x}2Cyz<(seLPbgSGuP zAqS}8bGplNXDanT*&gmH+Y_@?Un%+oS$c_+r6ZgyEpf6`er4&UoHk44vRNuux(Cr@ zuJ-Xf^uj?*DHI00b+>}a` zMi}O;zS60bnMXpSw=hveV5Cm7k8}`uPoL2huhpZUC;fX=mjRl98#>Kzm0O zhhp-mW*#MFb!TZNnSccBYEZ5^G0&oY?jMrvs^YyElpW! zY1kh{&BL_4qVkd z45RF&F|iEUxcJShqrE0Yi~CuU3_kk_y*VwUSDw{I)9HG59*Gbljshezx;$SEHNl_}!XlHe^h3BM2&O zYVpdUv79=VQRPkqzYLxOeg*9B_y;)tV(_cbKM#HlRNmYTD$S!ft)3>A)zjok_e?_T zvb4#LE8SBSr(F}LEsoQqvDteMi^|pH z3gvqV?m&9lNnL06|4KdWS5B7y+R5@qoGh1LSw5Q6X1QE8%jL3qnx#GM@L4_0(ssvb zowB^|L9*P6ywra1W`aAAo_1|_S^i(p(-?1>T70pSrNvH`%C9U%Z*#I#E}NxtSv}3t zq^DWhI>*(=j72QXW~tHBvbxDo={!2R%g}@AX|ub_(EqTWRz#*rBp{(p<_!d;r@8(S zxNZHE%VwrrR!_4u>1meM?6~?E_1DsrnWbs5VeO5rX^V!m=QP3N(YHX14T7B$#-j|4 zd&H9BIrvm`yY4&Kp^R5w*3)c|o@HFa_^&Z8M4_2+>S+e8(+#bR|I0bE%-5_Y8P^>C zr*ihx=3P&PajBQJv>W2I#kkbl_4I_}w57PDarE@u7N^~TtK881{QrY9htoZlJB~C5 zlhxRb(39u7b&pC`7)!2gtnBJTu?Nv(kMv~3ZzL3Ub-3P~vEv3N`HPbLg-QPY%yirF zh4LwJrd*9Sai-j3^o@IrzSIoz8+7=?0Z6R`{O9L`B zt&iUCVqEFwI}fTOeLVN^FIT!|tV|v0PR203m8|r zC&O!F&<86M>oSuiyj912!4BzUTXDx{bb@wI{&c84O{=q2yDxrQwY#c-r*KtAcNOr9 zT)QCY69KwM74T%vyMp|g! zJFOvQJJtKbY*{N}1=sQY0GEGJ;+j(;KTq;_c3$lHxLpIV_5Z$2c-o!N`S^63@a7SS z>dehAPI)0@|gneN7?yG?j*I8R>EOf}_(PMZQ%2tKbY z(%o>nd(*!g&QXoOMUEwhqyE$9ZR6h!r@KvfuIjS6uI~G(;pizoZ)-w0-EG2i<5N5- z2jP(%pJPlo5=w4-y4!>&Rf*#8JbL^igHywiX!m)wqd+C6qq|Lb2aeD2+-Wy)y794_ z@Dj^iGSKIB!+HIu0c2-#x;|rg63eS^O8q&ZQ#i-38;Sf+4(CL}lUQCSq=eJY@VMo5 zVZRG^q=xfZ!;@HE{ZhhFx9Ib#6O|Yq^1>v7OpcEvqR*?H0`BupN(m?1@SLK5&WrxO zrrnlY;$~TM)w`GLZhOy;yCfxa^z&q!61Nj1qMQ(?oG&j&$F{}KSpwzm-ZkE#^o>(y zIFw+Vve2P)Y<7$}l#Z>9-*zY+nil^njOkXamup}rDOZ!E{D>wjq(GBqOFap z+ejI&Lo$@EH$-MRJlXIlhuQtq=`K-*ccQR0ZvOmQ(RJuqXl4aPxaV-1au)@y-eW!j zBuYf)>ey=8e&MwU0Go2u5+}~$>AXSn zG;>!r|2npg)Hg%iyYzW@9pdSHmwI%cH=Yq4beYG#r#$~?TafqjLd~(fQ zZc93H)aqY$+;y#Umv}ngbylalj+v|`=|1ZVjzc^>Jh$U>c4j78peNJZaepV)&P+zP z>vY}D&^V;TT@CJyE-fi^OYY2+7`l5~!ggDCfYa&u)0_#pPBDlRJ85uTeIFxHXDw#? zYBlfZ)muEOW>;5TH?4|~LDW`In5FFmCv;(b_|sKtAM8 zWeh7GHTsgVrI%eYy5rHEl+`XC&BsJKa>L|ion54nr>*IBS+J zx&EpPESKl}g8ac9dw8?654MZ9aKM0q{P-^3T(gUJ#}e~ZRBCqDyLhkYX)bmAb+L=L z2!)_AiLbbuUA&J-%}6*bUuAt|0__~!Cri~xIEp>_&54?bE@jXXFN1Hg)Cmp=o33`_ z6~k8v&%II?IHccnwYyJS9o~fJ8Flp>c)JYm3NE|>&%jd+TerJ6^`^?@@Qjv_;^;2C zRa_{CC+lp>Cq1sK`2FNaJ~9eV-$9m7GOnxi-a!J3;n{q#<&%ckRd}cI-2W-&BYndy z-+}UP6FhxNEMIr|S4D&-!n0BxAP2#B8Na@C-5cQ9Io7asn}2(cVmY+b<2j?;@^zQq z`-#vvc;2b9d;y@V^u9>~Z<~oN&n(NQD%(~5JxIiV3eV&k%SX0%8Qu$o_YyomyUy~_ zWpo+d9fY?No;ex_a&#BJ7Q*W>pL8s+eBFhYMgHYn&oXzt63 z!#jg(v*B6h@O2m7e)zrt&mA`^wC=+@pKHH|=dTW5cl9}!2YJ6hdNs+z(Or5KzpLQ6 z+2K1-{G#yOwAcjKZFrY)`RDMoIeb)$F6*C`{Z3#Ic{j3NM?8K>yOGttHaI+nk-x5X zBWsMbIfd_2e=p@uf}41lcIWC7k+bUm_5Hc~h!c|_|N3`Q4zhzab)Ra|uG8+ekKRim z%&eVNKTV(53N2s~FfCIbid|S~-@$um`!hT3we04*CgwF|-%u4NPlDdm9d?rpeR291 zE{v?4Kk}uMbH4t&4chCL5ylom| zTYaylt8aolZ0M;w5IwZhpf_~~qPp#_zKycn&{KCHzG&#FI}p#NoprTybB3X(?)0?Z zE=k?7xX19P?({s1VhnmycX}>1^wgc0?~iB3(;+I_x zX?tkA)IZ@q*DiK4PQzy-kJ#4&P?Hcu?`( za{~_F_QC@M9^W@N@Nnz}w7V4JkNa14{UrqzkLO{@78`is;mF~npyKf?Ivn|Fx1S!y zji&LS;?*p^tMXqdtfY9R1|H9r!?GjP=6T0H&rd4>I^yYW8I8yDukxU6Xp0@>uPi*#g3+`X9z44&p5ik5V#4|PUc(xoCab#QKVQFPaLB(T! zSlZn|1CM9RVQh*0-Maa&)E3*Q<3SNmo0fR}`L_lh&z6qL*=d)1Pv+k=Mf0E7<*w&2 z{56ZLnl5@J@Ko`;{s9*Y@jm|IFDov7*Z(Wy$9}PKZ#E{3*epi31|HsW<>bQm3fm)P zEltf!rbbIzqGegJtXsGmDcc_{3r0#>WB&2c(k%AMj<}`mU0zTBC>tOAKgTauImBqm zeggFEiw%wOI1iUSzV+>;t&x)bv7rM)j}utq2R#CJ+{zq4VCk{^7q+ugx1qJEIj~Fv zVxAdoXo-}y#j+lCAG<5cM_9&qq7ALOci97CYiNu4$3+_U#{9R$vVIW_^^M*5QM7db z*1tDC=^qto*bP6?D&9{lhx?-qdmDGBHLgi(T%XpsI*nM3BKpA|#93UQ$5TF~t?|jU z_R`&4>;)~zjYosy2q8GK_1(bKO`L0ZBD@=58lw<8u5RS&TJF)M-l3(+)rMBZJIiE* zw`{-f1K*nV(p}2P2J)jVR&;ToDVLWBL|30qK7?;PVszt%kBb{yz4g~c8#36pJQLn% zNZGAf0#D5Uv;gbfnBN2%q1;MZ8rKl>w$Z-Tv8>x;Maw9knEz(J*QKq_q;QJ97|;{< zaKEpNq)%z~?F&p^4bkIUJwEjEw5zo%S>_RU5O_~hQ)Q(&Q_pe^E!bq^&T{!? z_#XrB0(XMn1V0A94W2-mdKokMnYR6W!of4egeDG@@Nl{vb|CG{EtLmiw(Ui zTDCXRuo(do-51OFO@tO%nh`189WC9wr+4iB96c%8&a+0Vf%|AMPemJc1#s#-84Ix8h zL*H>EZ)i*72j0Naw@JIA{svh1N~B^}%-_54xk$;XSido=|J1{6@)et-6x_7e^YlM;q2fDv(q=tSlYlCvoHVM=N$lOOS`b zOZ}Ml;JcIux4^uf^Gz=7fc{1xS5JBYFE>x!L`eX{iJXzp zrT~W{zo&j)@|$Z@kkFZ`M}49d+aYbnIpP>ye8RbBoFX~)m{$8RT_-wIpCFCxrF!Is zh+>g>RG{hYkCEJDc|%a$X9aSd-2jjI%C`AJn|%$Ny`{T-6{{%X(Y9zJRL_cCNbEq< zbncvX^;HtPk~l1uB6cM*v>w>~0K`A7L!7D~u7v^17n9YPPxA6~q$53alSD7Lyx`D*IzgpOION-yZdqq1seZ zjVCU=cet^!D)=<`2KXoNFW@o6dp9VH zr??wJ3k=m&_V2m(xs=M(zak8gFfbX^3^6roqL1qrg87CK#RwlC-L zXhVTq{>+ z7_x6oZ0N1gk}U*Rw#{515Buen^o^8kAQWw8kIJa}QNU4s%)v#IG_1_TX!Q&g>N;4hn{zzyi{?A1B*$|efsIG5| zmhK4TqEAa(E=LdtN3{iVVJt_KPdT5=FI|P_V>}D#qv)%5MnkX$$8&r6>$(q(K9Kt) zE*0TE?ifZ0j)X6NIgqOYraXg}@+=;ZS+O#Z`x>l&w zqo$s~>2@1l@|+v}$MKgjm((ZmhqXM^*=K7(TK|JbB{BRj+#nr-lGJTIjXZ>+T1Y&mV#Xjz0{3gue;=7>t1J;8#Fq zKEl#~ec*lI5#SHNo?s8c?hW<<)4@zI1MCYP31&Nf^~Oixmvwg#{Ji6r1-AU^b&mo6 z0%Fq@ehb7lE_?=3`vg$7(kFq}fMbTnqB~sIao| zbKvFRFt7|90oH&e;630-Q1xRpsNQ`RryX+1WrtjH*&!E3PS7^MQof8b#R8AFz`mRQD#Op*ka-AnLv(nfCWpo@;{5jm*bMwQsi4ZauY znMNZHqa`~cWxMEaeH-#x8ykY2Na>a(V`KhbDVnjO?+SR+935?RO{8KwDU7~Iq%~|Y zb13RgJie06^7;_%nLT`eXfNF!dL>%AB}%|0JA7q(8QbxY&^Jw->0;X&|H;^HGX)zh z-8rN*7>J=RdQ9{m5wR?XJ|O1*qaLm&qy1#4T6>~v%(Pb9xJcN|qnGbtH?C(Uk#4b^n9etLxy2C&cp-!2JuP4*!lTE4{c16n8X*fvo>!n%^ zH4lvWJ92=r*{(>%4pYcx95zL{kf}b=Ziz~(1vK)I>yo}j6hSRX1*xdlICdHW6{!8^m^k+XrQSt7vB07xn!pN zf`#uzH$=BYLM@H${>4*ci|A$huKrt(k&zG@q$xX;vUqy^U-y-@MngFf|FWoY`!;p! z^lf4~E<~R1r3?slNGRA)5G|oZf_W55*4I(7Vnc1N^oTMN_QvxljU;Xv7otw>Emn

Kzzqw$~q#got; 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�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 z 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%0AR5EZ>(Sr8Z+p1bs_MoHvj67PF3Lri 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 YMXIM)*GxF8X6nb?tI0l65D66iHzHu!&Hw-a literal 0 HcmV?d00001 diff --git a/branches/2.0/doubango/thirdparties/winrt/lib/x86/libspeexdsp.lib b/branches/2.0/doubango/thirdparties/winrt/lib/x86/libspeexdsp.lib new file mode 100644 index 0000000000000000000000000000000000000000..73a59cef1b80a603172e1faf43e591a11ddf4624 GIT binary patch literal 273724 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 literal 0 HcmV?d00001 diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/directsound/tdav_producer_dsound.h b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/directsound/tdav_producer_dsound.h index b02f1db0..d8b9944b 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/directsound/tdav_producer_dsound.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/directsound/tdav_producer_dsound.h @@ -25,14 +25,13 @@ * * @author Mamadou Diop * - - */ + */ #ifndef TINYDAV_PRODUCER_DSOUND_H #define TINYDAV_PRODUCER_DSOUND_H #include "tinydav_config.h" -#if HAVE_DSOUND_H +#if HAVE_DSOUND_H || HAVE_DSOUND #include "tinydav/audio/tdav_producer_audio.h" @@ -62,6 +61,6 @@ TINYDAV_GEXTERN const tmedia_producer_plugin_def_t *tdav_producer_dsound_plugin_ TDAV_END_DECLS -#endif /* HAVE_DSOUND_H */ +#endif /* HAVE_DSOUND_H || HAVE_DSOUND */ #endif /* TINYDAV_PRODUCER_DSOUND_H */ diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_speex_resampler.h b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_speex_resampler.h index 9c9fd38b..a877336a 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_speex_resampler.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_speex_resampler.h @@ -45,7 +45,13 @@ typedef struct tdav_speex_resampler_s tsk_size_t in_size; tsk_size_t out_size; - int8_t channels; + uint32_t in_channels; + uint32_t out_channels; + + struct{ + spx_int16_t* ptr; + tsk_size_t size_in_samples; + } tmp_buffer; SpeexResamplerState *state; } diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_webrtc_denoise.h b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_webrtc_denoise.h index 09bb2741..096cbac2 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_webrtc_denoise.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/tdav_webrtc_denoise.h @@ -38,7 +38,7 @@ #include "tsk_safeobj.h" -/* Speex denoiser works better than WebRTC's denoiser. This is flagrant on Android. */ +/* Speex denoiser works better than WebRTC's denoiser. This is obvious on Android. */ #if !defined(PREFER_SPEEX_DENOISER) # define PREFER_SPEEX_DENOISER 1 #endif diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/wasapi/tdav_consumer_wasapi.h b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/wasapi/tdav_consumer_wasapi.h new file mode 100644 index 00000000..1e4660aa --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/wasapi/tdav_consumer_wasapi.h @@ -0,0 +1,39 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +/**@file tdav_consumer_wasapi.h + * @brief Microsoft Windows Audio Session API (WASAPI) consumer. + * + */ +#ifndef TINYDAV_CONSUMER_WASAPI_H +#define TINYDAV_CONSUMER_WASAPI_H + +#include "tinydav_config.h" + +#if HAVE_WASAPI + +#include "tinydav/audio/tdav_consumer_audio.h" + +TDAV_BEGIN_DECLS + +TINYDAV_GEXTERN const struct tmedia_consumer_plugin_def_s *tdav_consumer_wasapi_plugin_def_t; + +TDAV_END_DECLS + +#endif /* HAVE_WASAPI */ + +#endif /* TINYDAV_CONSUMER_WASAPI_H */ diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/audio/wasapi/tdav_producer_wasapi.h b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/wasapi/tdav_producer_wasapi.h new file mode 100644 index 00000000..29edcb0a --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/audio/wasapi/tdav_producer_wasapi.h @@ -0,0 +1,40 @@ +/*Copyright (C) 2013 Mamadou Diop +* Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +/**@file tdav_producer_wasapi.h + * @brief Microsoft Windows Audio Session API (WASAPI) producer. + * + */ +#ifndef TINYDAV_PRODUCER_WASAPI_H +#define TINYDAV_PRODUCER_WASAPI_H + +#include "tinydav_config.h" + +#if HAVE_WASAPI + +#include "tinydav/audio/tdav_producer_audio.h" + +TDAV_BEGIN_DECLS + +TINYDAV_GEXTERN const struct tmedia_producer_plugin_def_s *tdav_producer_wasapi_plugin_def_t; + +TDAV_END_DECLS + +#endif /* HAVE_WASAPI */ + +#endif /* TINYDAV_PRODUCER_WASAPI_H */ diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264.h b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264.h index f17c2c38..f193d201 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/codecs/h264/tdav_codec_h264.h @@ -32,7 +32,7 @@ #include "tinydav_config.h" -#if HAVE_FFMPEG && (!defined(HAVE_H264) || HAVE_H264) +#if (HAVE_FFMPEG && (!defined(HAVE_H264) || HAVE_H264)) || HAVE_H264_PASSTHROUGH #include "tinydav/codecs/h264/tdav_codec_h264_common.h" @@ -48,6 +48,6 @@ static inline tsk_bool_t tdav_codec_h264_is_ffmpeg_plugin(const tmedia_codec_plu TDAV_END_DECLS -#endif /* HAVE_FFMPEG */ +#endif /* HAVE_FFMPEG || HAVE_H264_PASSTHROUGH */ #endif /* TINYDAV_CODEC_H264_H */ \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/video/winm/tdav_consumer_winm.h b/branches/2.0/doubango/tinyDAV/include/tinydav/video/winm/tdav_consumer_winm.h new file mode 100644 index 00000000..41e7ce3b --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/video/winm/tdav_consumer_winm.h @@ -0,0 +1,39 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +/**@file tdav_consumer_winm.h + * @brief Microsoft Windows Media (WinM) consumer. + * + */ +#ifndef TINYDAV_CONSUMER_WINM_H +#define TINYDAV_CONSUMER_WINM_H + +#include "tinydav_config.h" + +#if HAVE_WINM + +#include "tinydav/video/tdav_consumer_video.h" + +TDAV_BEGIN_DECLS + +TINYDAV_GEXTERN const struct tmedia_consumer_plugin_def_s *tdav_consumer_winm_plugin_def_t; + +TDAV_END_DECLS + +#endif /* HAVE_WINM */ + +#endif /* TINYDAV_CONSUMER_WINM_H */ diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav/video/winm/tdav_producer_winm.h b/branches/2.0/doubango/tinyDAV/include/tinydav/video/winm/tdav_producer_winm.h new file mode 100644 index 00000000..10aa4ae9 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/include/tinydav/video/winm/tdav_producer_winm.h @@ -0,0 +1,39 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +/**@file tdav_producer_winm.h + * @brief Microsoft Windows Media (WinM) producer. + * + */ +#ifndef TINYDAV_PRODUCER_WINM_H +#define TINYDAV_PRODUCER_WINM_H + +#include "tinydav_config.h" + +#if HAVE_WINM + +#include "tinymedia/tmedia_producer.h" + +TDAV_BEGIN_DECLS + +TINYDAV_GEXTERN const struct tmedia_producer_plugin_def_s *tdav_producer_winm_plugin_def_t; + +TDAV_END_DECLS + +#endif /* HAVE_WINM */ + +#endif /* TINYDAV_PRODUCER_WINM_H */ diff --git a/branches/2.0/doubango/tinyDAV/include/tinydav_config.h b/branches/2.0/doubango/tinyDAV/include/tinydav_config.h index 35967300..71000fc6 100644 --- a/branches/2.0/doubango/tinyDAV/include/tinydav_config.h +++ b/branches/2.0/doubango/tinyDAV/include/tinydav_config.h @@ -29,7 +29,13 @@ // Windows (XP/Vista/7/CE and Windows Mobile) macro definition #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) -# define TDAV_UNDER_WINDOWS 1 +# define TDAV_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TDAV_UNDER_WINDOWS_RT 1 +# if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +# define TDAV_UNDER_WINDOWS_PHONE 1 +# endif +# endif #endif // OS X or iOS @@ -58,8 +64,8 @@ #if (TDAV_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYDAV_EXPORTS) # define TINYDAV_API __declspec(dllexport) -# define TINYDAV_GEXTERN __declspec(dllexport) -#elif (TDAV_UNDER_WINDOWS || defined(__SYMBIAN32__)) /*&& defined(TINYDAV_IMPORTS)*/ +# define TINYDAV_GEXTERN extern __declspec(dllexport) +#elif (TDAV_UNDER_WINDOWS || defined(__SYMBIAN32__)) && !defined(TINYDAV_IMPORTS_IGNORE) # define TINYDAV_API __declspec(dllimport) # define TINYDAV_GEXTERN __declspec(dllimport) #else @@ -80,7 +86,9 @@ #if HAVE_FFMPEG // FFMPeg warnings (treated as errors) # pragma warning (disable:4244) #endif +# if !defined(__cplusplus) # define inline __inline +# endif # define _CRT_SECURE_NO_WARNINGS #endif diff --git a/branches/2.0/doubango/tinyDAV/src/audio/coreaudio/tdav_audiounit.c b/branches/2.0/doubango/tinyDAV/src/audio/coreaudio/tdav_audiounit.c index 4440a353..1f9eb6d9 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/coreaudio/tdav_audiounit.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/coreaudio/tdav_audiounit.c @@ -21,6 +21,8 @@ */ #include "tinydav/audio/coreaudio/tdav_audiounit.h" +#if HAVE_COREAUDIO_AUDIO_UNIT + #include "tsk_string.h" #include "tsk_list.h" #include "tsk_safeobj.h" @@ -31,18 +33,17 @@ static UInt32 kOne = 1; static UInt32 kZero = 0; #endif /* TARGET_OS_IPHONE */ -#if HAVE_COREAUDIO_AUDIO_UNIT - #if TARGET_OS_IPHONE - #if TARGET_IPHONE_SIMULATOR // VoiceProcessingIO will give unexpected result on the simulator when using iOS 5 - #define kDoubangoAudioUnitSubType kAudioUnitSubType_RemoteIO - #else // Echo cancellation, AGC, ... - #define kDoubangoAudioUnitSubType kAudioUnitSubType_VoiceProcessingIO - #endif - #elif TARGET_OS_MAC - #define kDoubangoAudioUnitSubType kAudioUnitSubType_HALOutput - #else - #error "Unknown target" +#if TARGET_OS_IPHONE + #if TARGET_IPHONE_SIMULATOR // VoiceProcessingIO will give unexpected result on the simulator when using iOS 5 + #define kDoubangoAudioUnitSubType kAudioUnitSubType_RemoteIO + #else // Echo cancellation, AGC, ... + #define kDoubangoAudioUnitSubType kAudioUnitSubType_VoiceProcessingIO #endif +#elif TARGET_OS_MAC + #define kDoubangoAudioUnitSubType kAudioUnitSubType_HALOutput +#else + #error "Unknown target" +#endif #undef kInputBus #define kInputBus 1 diff --git a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c index cedee17b..e840cdc6 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c @@ -49,7 +49,7 @@ static _inline int32_t __convert_volume(int32_t volume) return (volume * __step) + DSBVOLUME_MIN; } -static void *_tdav_consumer_dsound_playback_thread(void *param) +static void* TSK_STDCALL _tdav_consumer_dsound_playback_thread(void *param) { tdav_consumer_dsound_t* dsound = (tdav_consumer_dsound_t*)param; diff --git a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_producer_dsound.c b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_producer_dsound.c index abb35f31..a14d4036 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_producer_dsound.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_producer_dsound.c @@ -47,7 +47,7 @@ extern void tdav_win32_print_error(const char* func, HRESULT hr); -static void *_tdav_producer_dsound_record_thread(void *param) +static void* TSK_STDCALL _tdav_producer_dsound_record_thread(void *param) { tdav_producer_dsound_t* dsound = (tdav_producer_dsound_t*)param; diff --git a/branches/2.0/doubango/tinyDAV/src/audio/tdav_session_audio.c b/branches/2.0/doubango/tinyDAV/src/audio/tdav_session_audio.c index 208cb70b..d106e547 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/tdav_session_audio.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/tdav_session_audio.c @@ -50,7 +50,7 @@ static int _tdav_session_audio_dtmfe_timercb(const void* arg, tsk_timer_id_t timer_id); static struct tdav_session_audio_dtmfe_s* _tdav_session_audio_dtmfe_create(const tdav_session_audio_t* session, uint8_t event, uint16_t duration, uint32_t seq, uint32_t timestamp, uint8_t format, tsk_bool_t M, tsk_bool_t E); static void _tdav_session_audio_apply_gain(void* buffer, int len, int bps, int gain); -static tmedia_resampler_t* _tdav_session_audio_resampler_create(int32_t bytes_per_sample, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t channels, uint32_t quality, void** resampler_buffer, tsk_size_t *resampler_buffer_size); +static tmedia_resampler_t* _tdav_session_audio_resampler_create(int32_t bytes_per_sample, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t in_channels, uint32_t out_channels, uint32_t quality, void** resampler_buffer, tsk_size_t *resampler_buffer_size); /* DTMF event object */ typedef struct tdav_session_audio_dtmfe_s @@ -115,7 +115,7 @@ static int tdav_session_audio_rtp_cb(const void* callback_data, const struct trt int bytesPerSample = (base->consumer->audio.bits_per_sample >> 3); if(!audio->decoder.resampler.instance){ - audio->decoder.resampler.instance = _tdav_session_audio_resampler_create(bytesPerSample, audio->decoder.codec->plugin->rate, base->consumer->audio.out.rate, base->consumer->audio.ptime, base->consumer->audio.out.channels, TDAV_AUDIO_RESAMPLER_DEFAULT_QUALITY, &audio->decoder.resampler.buffer, &audio->decoder.resampler.buffer_size); + audio->decoder.resampler.instance = _tdav_session_audio_resampler_create(bytesPerSample, audio->decoder.codec->plugin->rate, base->consumer->audio.out.rate, base->consumer->audio.ptime, base->consumer->audio.in.channels, base->consumer->audio.out.channels, TDAV_AUDIO_RESAMPLER_DEFAULT_QUALITY, &audio->decoder.resampler.buffer, &audio->decoder.resampler.buffer_size); } if(!audio->decoder.resampler.instance){ TSK_DEBUG_ERROR("No resampler to handle data"); @@ -184,7 +184,7 @@ static int tdav_session_audio_producer_enc_cb(const void* callback_data, const v int bytesPerSample = (base->producer->audio.bits_per_sample >> 3); if(!audio->encoder.resampler.instance){ - audio->encoder.resampler.instance = _tdav_session_audio_resampler_create(bytesPerSample, base->producer->audio.rate, audio->encoder.codec->plugin->rate,base->producer->audio.ptime, base->producer->audio.channels, TDAV_AUDIO_RESAMPLER_DEFAULT_QUALITY, &audio->encoder.resampler.buffer, &audio->encoder.resampler.buffer_size); + audio->encoder.resampler.instance = _tdav_session_audio_resampler_create(bytesPerSample, base->producer->audio.rate, audio->encoder.codec->plugin->rate,base->producer->audio.ptime, base->producer->audio.channels, base->producer->audio.channels, TDAV_AUDIO_RESAMPLER_DEFAULT_QUALITY, &audio->encoder.resampler.buffer, &audio->encoder.resampler.buffer_size); } if(!audio->encoder.resampler.instance){ TSK_DEBUG_ERROR("No resampler to handle data"); @@ -636,9 +636,9 @@ static int _tdav_session_audio_dtmfe_timercb(const void* arg, tsk_timer_id_t tim return 0; } -static tmedia_resampler_t* _tdav_session_audio_resampler_create(int32_t bytes_per_sample, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t channels, uint32_t quality, void** resampler_buffer, tsk_size_t *resampler_buffer_size) +static tmedia_resampler_t* _tdav_session_audio_resampler_create(int32_t bytes_per_sample, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t in_channels, uint32_t out_channels, uint32_t quality, void** resampler_buffer, tsk_size_t *resampler_buffer_size) { - uint32_t resampler_buff_size = ((out_freq * frame_duration)/1000) * bytes_per_sample; + uint32_t resampler_buff_size = (((out_freq * frame_duration)/1000) * bytes_per_sample) * (out_channels / in_channels); tmedia_resampler_t* resampler; int ret; @@ -647,8 +647,8 @@ static tmedia_resampler_t* _tdav_session_audio_resampler_create(int32_t bytes_pe return tsk_null; } else { - if((ret = tmedia_resampler_open(resampler, in_freq, out_freq, frame_duration, channels, quality))){ - TSK_DEBUG_ERROR("Failed to open audio resampler (%d, %d, %d, %d, %d) with retcode=%d", in_freq, out_freq, frame_duration, channels, quality, ret); + if((ret = tmedia_resampler_open(resampler, in_freq, out_freq, frame_duration, in_channels, out_channels, quality))){ + TSK_DEBUG_ERROR("Failed to open audio resampler (%d, %d, %d, %d, %d,%d) with retcode=%d", in_freq, out_freq, frame_duration, in_channels, out_channels, quality, ret); TSK_OBJECT_SAFE_FREE(resampler); goto done; } diff --git a/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_resampler.c b/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_resampler.c index 35aa80f6..ee024142 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_resampler.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/tdav_speex_resampler.c @@ -35,19 +35,37 @@ #define TDAV_SPEEX_RESAMPLER_MAX_QUALITY 10 -int tdav_speex_resampler_open(tmedia_resampler_t* self, uint32_t in_freq, uint32_t out_freq, tsk_size_t frame_duration, int8_t _channels, uint32_t quality) +int tdav_speex_resampler_open(tmedia_resampler_t* self, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t in_channels, uint32_t out_channels, uint32_t quality) { tdav_speex_resampler_t *resampler = (tdav_speex_resampler_t *)self; int ret = 0; - if(!(resampler->state = speex_resampler_init(_channels, in_freq, out_freq, quality>10 ? TDAV_SPEEX_RESAMPLER_MAX_QUALITY : quality, &ret))){ + if(in_channels != 1 && in_channels != 2){ + TSK_DEBUG_ERROR("%d not valid as input channel", in_channels); + return -1; + } + if(out_channels != 1 && out_channels != 2){ + TSK_DEBUG_ERROR("%d not valid as output channel", out_channels); + return -1; + } + + if(!(resampler->state = speex_resampler_init(in_channels, in_freq, out_freq, quality>10 ? TDAV_SPEEX_RESAMPLER_MAX_QUALITY : quality, &ret))){ TSK_DEBUG_ERROR("speex_resampler_init() returned %d", ret); return -2; } resampler->in_size = (in_freq * frame_duration)/1000; - resampler->out_size = (out_freq * frame_duration) / 1000; - resampler->channels = _channels; + resampler->out_size = ((out_freq * frame_duration) / 1000) * (out_channels / in_channels); + resampler->in_channels = in_channels; + resampler->out_channels = out_channels; + + if(in_channels != out_channels){ + resampler->tmp_buffer.size_in_samples = TSK_MAX(resampler->out_size, resampler->in_size); + if(!(resampler->tmp_buffer.ptr = (spx_int16_t*)tsk_realloc(resampler->tmp_buffer.ptr, resampler->tmp_buffer.size_in_samples * sizeof(spx_int16_t)))){ + resampler->tmp_buffer.size_in_samples = 0; + return -2; + } + } return 0; } @@ -72,7 +90,31 @@ tsk_size_t tdav_speex_resampler_process(tmedia_resampler_t* self, const uint16_t return 0; } - err = speex_resampler_process_int(resampler->state, 0, (const spx_int16_t *)in_data, (spx_uint32_t *)&in_size, (spx_int16_t *)out_data, &out_len); + if(resampler->out_channels != resampler->in_channels){ + spx_uint32_t i, j; + spx_int16_t* pout_data = (spx_int16_t*)(out_data); + out_len = resampler->tmp_buffer.size_in_samples; + err = speex_resampler_process_int(resampler->state, 0, (const spx_int16_t *)in_data, (spx_uint32_t *)&in_size, resampler->tmp_buffer.ptr, &out_len); + + if(err == RESAMPLER_ERR_SUCCESS){ + if(resampler->in_channels == 1){ + // in_channels = 1, out_channels = 2 + for(i = 0, j = 0; i < out_len; ++i, j+=2){ + pout_data[j] = pout_data[j + 1] = resampler->tmp_buffer.ptr[i]; + } + } + else{ + // in_channels = 2, out_channels = 1 + for(i = 0, j = 0; i < out_len; ++i, j+=2){ + pout_data[i] = resampler->tmp_buffer.ptr[j]; + } + } + } + } + else{ + err = speex_resampler_process_int(resampler->state, 0, (const spx_int16_t *)in_data, (spx_uint32_t *)&in_size, (spx_int16_t *)out_data, &out_len); + } + if(err != RESAMPLER_ERR_SUCCESS){ TSK_DEBUG_ERROR("speex_resampler_process_int() failed with error code %d", err); return 0; @@ -100,7 +142,7 @@ int tdav_speex_resampler_close(tmedia_resampler_t* self) /* constructor */ static tsk_object_t* tdav_speex_resampler_ctor(tsk_object_t * self, va_list * app) { - tdav_speex_resampler_t *resampler = self; + tdav_speex_resampler_t *resampler = (tdav_speex_resampler_t *)self; if(resampler){ /* init base */ tmedia_resampler_init(TMEDIA_RESAMPLER(resampler)); @@ -111,7 +153,7 @@ static tsk_object_t* tdav_speex_resampler_ctor(tsk_object_t * self, va_list * ap /* destructor */ static tsk_object_t* tdav_speex_resampler_dtor(tsk_object_t * self) { - tdav_speex_resampler_t *resampler = self; + tdav_speex_resampler_t *resampler = (tdav_speex_resampler_t *)self; if(resampler){ /* deinit base */ tmedia_resampler_deinit(TMEDIA_RESAMPLER(resampler)); @@ -120,6 +162,7 @@ static tsk_object_t* tdav_speex_resampler_dtor(tsk_object_t * self) speex_resampler_destroy(resampler->state); resampler->state = tsk_null; } + TSK_FREE(resampler->tmp_buffer.ptr); } return self; diff --git a/branches/2.0/doubango/tinyDAV/src/audio/wasapi/tdav_consumer_wasapi.cxx b/branches/2.0/doubango/tinyDAV/src/audio/wasapi/tdav_consumer_wasapi.cxx new file mode 100644 index 00000000..27930f56 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/src/audio/wasapi/tdav_consumer_wasapi.cxx @@ -0,0 +1,671 @@ +/*Copyright (C) 2013 Mamadou Diop +* Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +/**@file tdav_consumer_wasapi.h + * @brief Microsoft Windows Audio Session API (WASAPI) consumer. + * http://msdn.microsoft.com/en-us/library/windows/desktop/dd316551(v=vs.85).aspx + */ +#include "tinydav/audio/wasapi/tdav_consumer_wasapi.h" + +#if HAVE_WASAPI + +#include "tinydav/audio/tdav_consumer_audio.h" + +#include "tsk_memory.h" +#include "tsk_string.h" +#include "tsk_condwait.h" +#include "tsk_debug.h" + +#include +#include +#include + +#include + +#if !defined(TDAV_WASAPI_CONSUMER_NOTIF_POS_COUNT) +# define TDAV_WASAPI_CONSUMER_NOTIF_POS_COUNT 13 +#endif +#define WASAPI_MILLIS_TO_100NS(MILLIS) (((LONGLONG)(MILLIS)) * 10000ui64) +#define WASAPI_100NS_TO_MILLIS(NANOS) (((LONGLONG)(NANOS)) / 10000ui64) + +struct tdav_consumer_wasapi_s; + +namespace Doubango +{ + namespace VoIP + { + ref class AudioRender sealed + { + public: + virtual ~AudioRender(); + internal: + AudioRender(); + + int Prepare(struct tdav_consumer_wasapi_s* wasapi, const tmedia_codec_t* codec); + int UnPrepare(); + int Start(); + int Stop(); + int Pause(); + int Consume(const void* buffer, tsk_size_t size, const tsk_object_t* proto_hdr); + private: + tsk_size_t Read(void* data, tsk_size_t size); + void AsyncThread(Windows::Foundation::IAsyncAction^ operation); + + private: + tsk_mutex_handle_t* m_hMutex; + const struct tdav_consumer_wasapi_s* m_pWrappedConsumer; // Must not take ref() otherwise dtor() will be never called (circular reference) + IAudioClient2* m_pDevice; + IAudioRenderClient* m_pClient; + tsk_condwait_handle_t* m_hCondWait; + Windows::Foundation::IAsyncAction^ m_pAsyncThread; + INT32 m_nBytesPerNotif; + INT32 m_nSourceFrameSizeInBytes; + UINT32 m_nMaxFrameCount; + UINT32 m_nPtime; + + struct { + struct { + void* buffer; + tsk_size_t size; + } chunck; + tsk_ssize_t leftBytes; + SpeexBuffer* buffer; + tsk_size_t size; + tsk_mutex_handle_t* mutex; + } m_ring; + + bool m_bStarted; + bool m_bPrepared; + bool m_bPaused; + }; + } +} + +typedef struct tdav_consumer_wasapi_s +{ + TDAV_DECLARE_CONSUMER_AUDIO; + + Doubango::VoIP::AudioRender ^AudioRender; +} +tdav_consumer_wasapi_t; + +extern "C" void tdav_win32_print_error(const char* func, HRESULT hr); + + +/* ============ Media consumer Interface ================= */ + +static int tdav_consumer_wasapi_set(tmedia_consumer_t* self, const tmedia_param_t* param) +{ + return tdav_consumer_audio_set(TDAV_CONSUMER_AUDIO(self), param); +} + +static int tdav_consumer_wasapi_prepare(tmedia_consumer_t* self, const tmedia_codec_t* codec) +{ + tdav_consumer_wasapi_t* wasapi = (tdav_consumer_wasapi_t*)self; + + if(!wasapi || !codec || !wasapi->AudioRender){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + TMEDIA_CONSUMER(wasapi)->audio.ptime = codec->plugin->audio.ptime; + TMEDIA_CONSUMER(wasapi)->audio.in.channels = TMEDIA_CONSUMER(wasapi)->audio.out.channels = codec->plugin->audio.channels; + TMEDIA_CONSUMER(wasapi)->audio.in.rate = TMEDIA_CONSUMER(wasapi)->audio.out.rate = codec->plugin->rate; + + return wasapi->AudioRender->Prepare(wasapi, codec); +} + +static int tdav_consumer_wasapi_start(tmedia_consumer_t* self) +{ + tdav_consumer_wasapi_t* wasapi = (tdav_consumer_wasapi_t*)self; + + TSK_DEBUG_INFO("tdav_consumer_wasapi_start()"); + + if(!wasapi || !wasapi->AudioRender){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + return wasapi->AudioRender->Start(); +} + + +static int tdav_consumer_wasapi_consume(tmedia_consumer_t* self, const void* buffer, tsk_size_t size, const tsk_object_t* proto_hdr) +{ + tdav_consumer_wasapi_t* wasapi = (tdav_consumer_wasapi_t*)self; + if(!wasapi || !wasapi->AudioRender || !buffer || !size){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + return wasapi->AudioRender->Consume(buffer, size, proto_hdr); +} + +static int tdav_consumer_wasapi_pause(tmedia_consumer_t* self) +{ + tdav_consumer_wasapi_t* wasapi = (tdav_consumer_wasapi_t*)self; + + if(!wasapi || !wasapi->AudioRender){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + return wasapi->AudioRender->Pause(); +} + +static int tdav_consumer_wasapi_stop(tmedia_consumer_t* self) +{ + tdav_consumer_wasapi_t* wasapi = (tdav_consumer_wasapi_t*)self; + + TSK_DEBUG_INFO("tdav_consumer_wasapi_stop()"); + + if(!wasapi || !wasapi->AudioRender){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + return wasapi->AudioRender->Stop(); +} + + + + + + + +Doubango::VoIP::AudioRender::AudioRender() + : m_pDevice(nullptr) + , m_hMutex(nullptr) + , m_pClient(nullptr) + , m_hCondWait(nullptr) + , m_pAsyncThread(nullptr) + , m_pWrappedConsumer(nullptr) + , m_nBytesPerNotif(0) + , m_nSourceFrameSizeInBytes(0) + , m_nMaxFrameCount(0) + , m_nPtime(0) + , m_bStarted(false) + , m_bPrepared(false) + , m_bPaused(false) +{ + memset(&m_ring, 0, sizeof(m_ring)); + + if(!(m_hMutex = tsk_mutex_create())){ + throw ref new Platform::FailureException(L"Failed to create mutex"); + } +} + +Doubango::VoIP::AudioRender::~AudioRender() +{ + Stop(); + UnPrepare(); + + tsk_mutex_destroy(&m_hMutex); +} + +int Doubango::VoIP::AudioRender::Prepare(tdav_consumer_wasapi_t* wasapi, const tmedia_codec_t* codec) +{ + HRESULT hr = E_FAIL; + int ret = 0; + WAVEFORMATEX wfx = {0}; + AudioClientProperties properties = {0}; + LPCWSTR pwstrRenderId = nullptr; + + #define WASAPI_SET_ERROR(code) ret = (code); goto bail; + + tsk_mutex_lock(m_hMutex); + + if(m_bPrepared) + { + TSK_DEBUG_INFO("#WASAPI: Audio consumer already prepared"); + goto bail; + } + + if(!wasapi || !codec) + { + TSK_DEBUG_ERROR("Invalid parameter"); + WASAPI_SET_ERROR(-1); + } + + if(m_pDevice || m_pClient){ + TSK_DEBUG_ERROR("consumer already prepared"); + WASAPI_SET_ERROR(-2); + } + + pwstrRenderId = GetDefaultAudioRenderId(AudioDeviceRole::Communications); + + if (NULL == pwstrRenderId){ + tdav_win32_print_error("GetDefaultAudioRenderId", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-3); + } + + hr = ActivateAudioInterface(pwstrRenderId, __uuidof(IAudioClient2), (void**)&m_pDevice); + if(!SUCCEEDED(hr)){ + tdav_win32_print_error("ActivateAudioInterface", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-4); + } + + if (SUCCEEDED(hr)){ + properties.cbSize = sizeof AudioClientProperties; + properties.eCategory = AudioCategory_Communications; + hr = m_pDevice->SetClientProperties(&properties); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("SetClientProperties", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-5); + } + } + else{ + tdav_win32_print_error("ActivateAudioInterface", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-6); + } + + /* Set best format */ + { + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.nChannels = TMEDIA_CONSUMER(wasapi)->audio.in.channels; + wfx.nSamplesPerSec = TMEDIA_CONSUMER(wasapi)->audio.in.rate; + wfx.wBitsPerSample = TMEDIA_CONSUMER(wasapi)->audio.bits_per_sample; + wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample/8); + wfx.nAvgBytesPerSec = (wfx.nSamplesPerSec * wfx.nBlockAlign); + + PWAVEFORMATEX pwfxClosestMatch = NULL; + hr = m_pDevice->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, &wfx, &pwfxClosestMatch); + if(hr != S_OK && hr != S_FALSE) + { + tdav_win32_print_error("IsFormatSupported", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-8); + } + + if(hr == S_FALSE) + { + if(!pwfxClosestMatch) + { + TSK_DEBUG_ERROR("malloc(%d) failed", sizeof(WAVEFORMATEX)); + WASAPI_SET_ERROR(-7); + } + + wfx.nSamplesPerSec = pwfxClosestMatch->nSamplesPerSec; + wfx.nChannels = pwfxClosestMatch->nChannels; +#if 0 + wfx.wBitsPerSample = pwfxClosestMatch->wBitsPerSample; +#endif + wfx.nBlockAlign = wfx.nChannels * (wfx.wBitsPerSample / 8); + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + // Request resampler + TMEDIA_CONSUMER(wasapi)->audio.out.rate = (uint32_t)wfx.nSamplesPerSec; + TMEDIA_CONSUMER(wasapi)->audio.bits_per_sample = (uint8_t)wfx.wBitsPerSample; + TMEDIA_CONSUMER(wasapi)->audio.out.channels = (uint8_t)wfx.nChannels; + + TSK_DEBUG_INFO("Audio device format fallback: rate=%d, bps=%d, channels=%d", wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nChannels); + } + if(pwfxClosestMatch) + { + CoTaskMemFree(pwfxClosestMatch); + } + } + + m_nSourceFrameSizeInBytes = (wfx.wBitsPerSample >> 3) * wfx.nChannels; + m_nBytesPerNotif = ((wfx.nAvgBytesPerSec * TMEDIA_CONSUMER(wasapi)->audio.ptime)/1000); + + // Initialize + hr = m_pDevice->Initialize( + AUDCLNT_SHAREMODE_SHARED, + 0x00000000, + (TDAV_WASAPI_CONSUMER_NOTIF_POS_COUNT * WASAPI_MILLIS_TO_100NS(TMEDIA_CONSUMER(wasapi)->audio.ptime)) , + 0, + &wfx, + NULL); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("#WASAPI: Render::Initialize", hr); + WASAPI_SET_ERROR(-9); + } + + REFERENCE_TIME DefaultDevicePeriod, MinimumDevicePeriod; + hr = m_pDevice->GetDevicePeriod(&DefaultDevicePeriod, &MinimumDevicePeriod); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("GetDevicePeriod", hr); + WASAPI_SET_ERROR(-10); + } + hr = m_pDevice->GetBufferSize(&m_nMaxFrameCount); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("GetBufferSize", hr); + WASAPI_SET_ERROR(-10); + } + + TSK_DEBUG_INFO("#WASAPI (Playback): BufferSize=%u, DefaultDevicePeriod=%lld ms, MinimumDevicePeriod=%lldms", m_nMaxFrameCount, WASAPI_100NS_TO_MILLIS(DefaultDevicePeriod), WASAPI_100NS_TO_MILLIS(MinimumDevicePeriod)); + + if(!m_hCondWait){ + if(!(m_hCondWait = tsk_condwait_create())){ + tdav_win32_print_error("tsk_condwait_create(Render)", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-11); + } + } + + hr = m_pDevice->GetService(__uuidof(IAudioRenderClient), (void**)&m_pClient); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("GetService", hr); + WASAPI_SET_ERROR(-14); + } + + int packetperbuffer = (1000 / TMEDIA_CONSUMER(wasapi)->audio.ptime); + m_ring.chunck.size = wfx.nSamplesPerSec * (wfx.wBitsPerSample >> 3) / packetperbuffer; + m_ring.size = TDAV_WASAPI_CONSUMER_NOTIF_POS_COUNT * m_ring.chunck.size; + if(!(m_ring.chunck.buffer = tsk_realloc(m_ring.chunck.buffer, m_ring.chunck.size))){ + m_ring.size = 0; + TSK_DEBUG_ERROR("Failed to allocate new buffer"); + WASAPI_SET_ERROR(-15); + } + if(!m_ring.buffer){ + m_ring.buffer = speex_buffer_init(m_ring.size); + } + else { + int sret; + if((sret = speex_buffer_resize(m_ring.buffer, m_ring.size)) < 0){ + TSK_DEBUG_ERROR("speex_buffer_resize(%d) failed with error code=%d", m_ring.size, sret); + WASAPI_SET_ERROR(-16); + } + } + if(!m_ring.buffer){ + TSK_DEBUG_ERROR("Failed to create a new ring buffer with size = %d", m_ring.size); + WASAPI_SET_ERROR(-17); + } + if(!m_ring.mutex && !(m_ring.mutex = tsk_mutex_create_2(tsk_false))){ + TSK_DEBUG_ERROR("Failed to create mutex"); + WASAPI_SET_ERROR(-18); + } + +bail: + if (pwstrRenderId){ + CoTaskMemFree((LPVOID)pwstrRenderId); + } + if(ret != 0){ + UnPrepare(); + } + + if((m_bPrepared = (ret == 0))) + { + m_pWrappedConsumer = wasapi; + m_nPtime = TMEDIA_CONSUMER(wasapi)->audio.ptime; + } + + tsk_mutex_unlock(m_hMutex); + + return ret; +} + +int Doubango::VoIP::AudioRender::UnPrepare() +{ + tsk_mutex_lock(m_hMutex); + + if(m_hCondWait) + { + tsk_condwait_destroy(&m_hCondWait); + } + if(m_pDevice) + { + m_pDevice->Release(), m_pDevice = nullptr; + } + if(m_pClient) + { + m_pClient->Release(), m_pClient = nullptr; + } + + TSK_FREE(m_ring.chunck.buffer); + if(m_ring.buffer){ + speex_buffer_destroy(m_ring.buffer); + m_ring.buffer = nullptr; + } + if(m_ring.mutex){ + tsk_mutex_destroy(&m_ring.mutex); + } + + m_pWrappedConsumer = nullptr; + + m_bPrepared = false; + + tsk_mutex_unlock(m_hMutex); + + return 0; +} + +int Doubango::VoIP::AudioRender::Start() +{ + tsk_mutex_lock(m_hMutex); + + if(m_bStarted) + { + TSK_DEBUG_INFO("#WASAPI: Audio consumer already started"); + goto bail; + } + if(!m_bPrepared) + { + TSK_DEBUG_ERROR("Audio consumer not prepared"); + goto bail; + } + + m_pAsyncThread = Windows::System::Threading::ThreadPool::RunAsync(ref new Windows::System::Threading::WorkItemHandler(this, &Doubango::VoIP::AudioRender::AsyncThread), + Windows::System::Threading::WorkItemPriority::High, + Windows::System::Threading::WorkItemOptions::TimeSliced); + + if((m_bStarted = (m_pAsyncThread != nullptr))) + { + HRESULT hr = m_pDevice->Start(); + if(!SUCCEEDED(hr)) + { + tdav_win32_print_error("Device::Start", hr); + Stop(); + } + m_bPaused = false; + } + +bail: + tsk_mutex_unlock(m_hMutex); + + return (m_bStarted ? 0 : -2); +} + +int Doubango::VoIP::AudioRender::Stop() +{ + m_bStarted = false; + + tsk_mutex_lock(m_hMutex); + + if (m_hCondWait) + { + tsk_condwait_broadcast(m_hCondWait); + } + + if (m_pAsyncThread) + { + m_pAsyncThread->Cancel(); + m_pAsyncThread->Close(); + m_pAsyncThread = nullptr; + } + + if(m_pDevice) + { + m_pDevice->Stop(); + } + + // will be prepared again before next start() + UnPrepare(); + + tsk_mutex_unlock(m_hMutex); + + return 0; +} + +int Doubango::VoIP::AudioRender::Pause() +{ + m_bPaused = true; + + return 0; +} + +int Doubango::VoIP::AudioRender::Consume(const void* buffer, tsk_size_t size, const tsk_object_t* proto_hdr) +{ + tsk_mutex_lock(m_ring.mutex); + speex_buffer_write(m_ring.buffer, (void*)buffer, size); + tsk_mutex_unlock(m_ring.mutex); + return 0; +} + +tsk_size_t Doubango::VoIP::AudioRender::Read(void* data, tsk_size_t size) +{ + tsk_ssize_t retSize = 0; + + m_ring.leftBytes += size; + while (m_ring.leftBytes >= (tsk_ssize_t)m_ring.chunck.size) { + m_ring.leftBytes -= m_ring.chunck.size; + retSize = (tsk_ssize_t)tdav_consumer_audio_get(TDAV_CONSUMER_AUDIO(m_pWrappedConsumer), m_ring.chunck.buffer, m_ring.chunck.size); + tdav_consumer_audio_tick(TDAV_CONSUMER_AUDIO(m_pWrappedConsumer)); + speex_buffer_write(m_ring.buffer, m_ring.chunck.buffer, retSize); + } + // IMPORTANT: looks like there is a bug in speex: continously trying to read more than avail + // many times can corrupt the buffer. At least on OS X 1.5 + if(speex_buffer_get_available(m_ring.buffer) >= (tsk_ssize_t)size){ + retSize = speex_buffer_read(m_ring.buffer, data, size); + } + else{ + memset(data, 0, size); + } + + return retSize; +} + +void Doubango::VoIP::AudioRender::AsyncThread(Windows::Foundation::IAsyncAction^ operation) +{ + HRESULT hr = S_OK; + INT32 nFramesToWrite; + UINT32 nPadding, nRead; + int waitResult = 0; + + TSK_DEBUG_INFO("#WASAPI: __playback_thread -- START"); + + #define BREAK_WHILE tsk_mutex_unlock(m_hMutex); break; + + while(m_bStarted && SUCCEEDED(hr)){ + waitResult = tsk_condwait_timedwait(m_hCondWait, m_nPtime); + + tsk_mutex_lock(m_hMutex); + + if(!m_bStarted){ + BREAK_WHILE; + } + + if(waitResult == 0) { + hr = m_pDevice->GetCurrentPadding(&nPadding); + if (SUCCEEDED(hr)){ + BYTE* pRenderBuffer = NULL; + nFramesToWrite = m_nMaxFrameCount - nPadding; + + if (nFramesToWrite > 0){ + hr = m_pClient->GetBuffer(nFramesToWrite, &pRenderBuffer); + if (SUCCEEDED(hr)){ + nRead = Read(pRenderBuffer, (nFramesToWrite * m_nSourceFrameSizeInBytes)); + + // Release the buffer + hr = m_pClient->ReleaseBuffer(nFramesToWrite, (nRead == 0) ? AUDCLNT_BUFFERFLAGS_SILENT: 0); + } + } + } + } + else{ + BREAK_WHILE; + } + + tsk_mutex_lock(m_hMutex); + }// end-of-while + + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("AsyncThread: ", hr); + } + + + TSK_DEBUG_INFO("WASAPI: __playback_thread(%s) -- STOP", (SUCCEEDED(hr) && waitResult == 0) ? "OK": "NOK"); +} + + + + + + + +// +// WaveAPI consumer object definition +// +/* constructor */ +static tsk_object_t* tdav_consumer_wasapi_ctor(tsk_object_t * self, va_list * app) +{ + tdav_consumer_wasapi_t *wasapi = (tdav_consumer_wasapi_t*)self; + if(wasapi){ + /* init base */ + tdav_consumer_audio_init(TDAV_CONSUMER_AUDIO(wasapi)); + /* init self */ + + wasapi->AudioRender = ref new Doubango::VoIP::AudioRender(); + } + return self; +} +/* destructor */ +static tsk_object_t* tdav_consumer_wasapi_dtor(tsk_object_t * self) +{ + tdav_consumer_wasapi_t *wasapi = (tdav_consumer_wasapi_t*)self; + if(wasapi){ + /* stop */ + tdav_consumer_wasapi_stop((tmedia_consumer_t*)self); + /* deinit base */ + tdav_consumer_audio_deinit(TDAV_CONSUMER_AUDIO(wasapi)); + /* deinit self */ + if(wasapi->AudioRender){ + delete wasapi->AudioRender; + wasapi->AudioRender = nullptr; + } + } + + return self; +} +/* object definition */ +static const tsk_object_def_t tdav_consumer_wasapi_def_s = +{ + sizeof(tdav_consumer_wasapi_t), + tdav_consumer_wasapi_ctor, + tdav_consumer_wasapi_dtor, + tdav_consumer_audio_cmp, +}; +/* plugin definition*/ +static const tmedia_consumer_plugin_def_t tdav_consumer_wasapi_plugin_def_s = +{ + &tdav_consumer_wasapi_def_s, + + tmedia_audio, + "Microsoft Windows Audio Session API (WASAPI) consumer", + + tdav_consumer_wasapi_set, + tdav_consumer_wasapi_prepare, + tdav_consumer_wasapi_start, + tdav_consumer_wasapi_consume, + tdav_consumer_wasapi_pause, + tdav_consumer_wasapi_stop +}; +const tmedia_consumer_plugin_def_t *tdav_consumer_wasapi_plugin_def_t = &tdav_consumer_wasapi_plugin_def_s; + + + + +#endif /* HAVE_WASAPI */ diff --git a/branches/2.0/doubango/tinyDAV/src/audio/wasapi/tdav_producer_wasapi.cxx b/branches/2.0/doubango/tinyDAV/src/audio/wasapi/tdav_producer_wasapi.cxx new file mode 100644 index 00000000..8ef27cbc --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/src/audio/wasapi/tdav_producer_wasapi.cxx @@ -0,0 +1,669 @@ +/*Copyright (C) 2013 Mamadou Diop +* Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +/**@file tdav_producer_wasapi.h + * @brief Microsoft Windows Audio Session API (WASAPI) producer. + * http://msdn.microsoft.com/en-us/library/windows/desktop/dd316551(v=vs.85).aspx + */ +#include "tinydav/audio/wasapi/tdav_producer_wasapi.h" + +#if HAVE_WASAPI + +#include "tinydav/audio/tdav_producer_audio.h" + +#include "tsk_memory.h" +#include "tsk_string.h" +#include "tsk_debug.h" + +#include +#include +#include + +#include + +#if !defined(TDAV_WASAPI_PRODUCER_NOTIF_POS_COUNT) +# define TDAV_WASAPI_PRODUCER_NOTIF_POS_COUNT 10 +#endif +#define WASAPI_MILLIS_TO_100NS(MILLIS) (((LONGLONG)(MILLIS)) * 10000ui64) +#define WASAPI_100NS_TO_MILLIS(NANOS) (((LONGLONG)(NANOS)) / 10000ui64) + +struct tdav_producer_wasapi_s; + +namespace Doubango +{ + namespace VoIP + { + ref class AudioCapture sealed + { + public: + virtual ~AudioCapture(); + internal: + AudioCapture(); + + int Prepare(struct tdav_producer_wasapi_s* wasapi, const tmedia_codec_t* codec); + int UnPrepare(); + int Start(); + int Stop(); + int Pause(); + + private: + void AsyncThread(Windows::Foundation::IAsyncAction^ operation); + + private: + tsk_mutex_handle_t* m_hMutex; + IAudioClient2* m_pDevice; + IAudioCaptureClient* m_pClient; + HANDLE m_hCaptureEvent; + HANDLE m_hShutdownEvent; + Windows::Foundation::IAsyncAction^ m_pAsyncThread; + INT32 m_nBytesPerNotif; + INT32 m_nSourceFrameSizeInBytes; + + struct{ + tmedia_producer_enc_cb_f fn; + const void* pcData; + } m_callback; + + struct { + struct { + void* buffer; + tsk_size_t size; + } chunck; + SpeexBuffer* buffer; + tsk_size_t size; + } m_ring; + bool m_bStarted; + bool m_bPrepared; + bool m_bPaused; + }; + } +} + +typedef struct tdav_producer_wasapi_s +{ + TDAV_DECLARE_PRODUCER_AUDIO; + + Doubango::VoIP::AudioCapture ^audioCapture; +} +tdav_producer_wasapi_t; + +extern "C" void tdav_win32_print_error(const char* func, HRESULT hr); + + +/* ============ Media Producer Interface ================= */ +static int tdav_producer_wasapi_set(tmedia_producer_t* self, const tmedia_param_t* param) +{ + tdav_producer_wasapi_t* wasapi = (tdav_producer_wasapi_t*)self; + if(param->plugin_type == tmedia_ppt_producer){ + if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "volume")){ + return 0; + } + else if(tsk_striequals(param->key, "mute")){ + //wasapi->mute = (TSK_TO_INT32((uint8_t*)param->value) != 0); +#if !FIXME_SEND_SILENCE_ON_MUTE + //if(wasapi->started){ + // if(wasapi->mute){ + //IDirectSoundCaptureBuffer_Stop(wasapi->captureBuffer); + // } + // else{ + //IDirectSoundCaptureBuffer_Start(wasapi->captureBuffer, DSBPLAY_LOOPING); + // } + //} +#endif + return 0; + } + } + } + return tdav_producer_audio_set(TDAV_PRODUCER_AUDIO(self), param); +} + + + +static int tdav_producer_wasapi_prepare(tmedia_producer_t* self, const tmedia_codec_t* codec) +{ + tdav_producer_wasapi_t* wasapi = (tdav_producer_wasapi_t*)self; + + if(!wasapi || !codec || !wasapi->audioCapture){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + TMEDIA_PRODUCER(wasapi)->audio.channels = codec->plugin->audio.channels; + TMEDIA_PRODUCER(wasapi)->audio.rate = codec->plugin->rate; + TMEDIA_PRODUCER(wasapi)->audio.ptime = codec->plugin->audio.ptime; + + return wasapi->audioCapture->Prepare(wasapi, codec); +} + +static int tdav_producer_wasapi_start(tmedia_producer_t* self) +{ + tdav_producer_wasapi_t* wasapi = (tdav_producer_wasapi_t*)self; + + TSK_DEBUG_INFO("tdav_producer_wasapi_start()"); + + if(!wasapi || !wasapi->audioCapture){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + return wasapi->audioCapture->Start(); +} + +static int tdav_producer_wasapi_pause(tmedia_producer_t* self) +{ + tdav_producer_wasapi_t* wasapi = (tdav_producer_wasapi_t*)self; + + if(!wasapi || !wasapi->audioCapture){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + return wasapi->audioCapture->Pause(); +} + +static int tdav_producer_wasapi_stop(tmedia_producer_t* self) +{ + tdav_producer_wasapi_t* wasapi = (tdav_producer_wasapi_t*)self; + + TSK_DEBUG_INFO("tdav_producer_wasapi_stop()"); + + if(!wasapi || !wasapi->audioCapture){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + return wasapi->audioCapture->Stop(); +} + + + + + + + +Doubango::VoIP::AudioCapture::AudioCapture() + : m_pDevice(nullptr) + , m_hMutex(nullptr) + , m_pClient(nullptr) + , m_hCaptureEvent(nullptr) + , m_hShutdownEvent(nullptr) + , m_pAsyncThread(nullptr) + , m_nBytesPerNotif(0) + , m_nSourceFrameSizeInBytes(0) + , m_bStarted(false) + , m_bPrepared(false) + , m_bPaused(false) +{ + m_callback.fn = nullptr, m_callback.pcData = nullptr; + + if(!(m_hMutex = tsk_mutex_create())){ + throw ref new Platform::FailureException(L"Failed to create mutex"); + } +} + +Doubango::VoIP::AudioCapture::~AudioCapture() +{ + Stop(); + UnPrepare(); + + tsk_mutex_destroy(&m_hMutex); +} + +int Doubango::VoIP::AudioCapture::Prepare(tdav_producer_wasapi_t* wasapi, const tmedia_codec_t* codec) +{ + HRESULT hr = E_FAIL; + int ret = 0; + WAVEFORMATEX wfx = {0}; + AudioClientProperties properties = {0}; + LPCWSTR pwstrCaptureId = nullptr; + + #define WASAPI_SET_ERROR(code) ret = (code); goto bail; + + tsk_mutex_lock(m_hMutex); + + if(m_bPrepared) + { + TSK_DEBUG_INFO("#WASAPI: Audio producer already prepared"); + goto bail; + } + + if(!wasapi || !codec) + { + TSK_DEBUG_ERROR("Invalid parameter"); + WASAPI_SET_ERROR(-1); + } + + if(m_pDevice || m_pClient){ + TSK_DEBUG_ERROR("Producer already prepared"); + WASAPI_SET_ERROR(-2); + } + + pwstrCaptureId = GetDefaultAudioCaptureId(AudioDeviceRole::Communications); + + if (NULL == pwstrCaptureId){ + tdav_win32_print_error("GetDefaultAudioCaptureId", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-3); + } + + hr = ActivateAudioInterface(pwstrCaptureId, __uuidof(IAudioClient2), (void**)&m_pDevice); + if(!SUCCEEDED(hr)){ + tdav_win32_print_error("ActivateAudioInterface", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-4); + } + + if (SUCCEEDED(hr)){ + properties.cbSize = sizeof AudioClientProperties; + properties.eCategory = AudioCategory_Communications; + hr = m_pDevice->SetClientProperties(&properties); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("SetClientProperties", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-5); + } + } + else{ + tdav_win32_print_error("ActivateAudioInterface", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-6); + } + + /* Set best format */ + { + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.nChannels = TMEDIA_PRODUCER(wasapi)->audio.channels; + wfx.nSamplesPerSec = TMEDIA_PRODUCER(wasapi)->audio.rate; + wfx.wBitsPerSample = TMEDIA_PRODUCER(wasapi)->audio.bits_per_sample; + wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample/8); + wfx.nAvgBytesPerSec = (wfx.nSamplesPerSec * wfx.nBlockAlign); + + PWAVEFORMATEX pwfxClosestMatch = NULL; + hr = m_pDevice->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, &wfx, &pwfxClosestMatch); + if(hr != S_OK && hr != S_FALSE) + { + tdav_win32_print_error("IsFormatSupported", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-8); + } + + if(hr == S_FALSE) + { + if(!pwfxClosestMatch) + { + TSK_DEBUG_ERROR("malloc(%d) failed", sizeof(WAVEFORMATEX)); + WASAPI_SET_ERROR(-7); + } + wfx.nChannels = pwfxClosestMatch->nChannels; + wfx.nSamplesPerSec = pwfxClosestMatch->nSamplesPerSec; +#if 0 + wfx.wBitsPerSample = pwfxClosestMatch->wBitsPerSample; +#endif + wfx.nBlockAlign = wfx.nChannels * (wfx.wBitsPerSample / 8); + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + // Request resampler + TMEDIA_PRODUCER(wasapi)->audio.rate = (uint32_t)wfx.nSamplesPerSec; + TMEDIA_PRODUCER(wasapi)->audio.bits_per_sample = (uint8_t)wfx.wBitsPerSample; + TMEDIA_PRODUCER(wasapi)->audio.channels = (uint8_t)wfx.nChannels; + + TSK_DEBUG_INFO("Audio device format fallback: rate=%d, bps=%d, channels=%d", wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nChannels); + } + if(pwfxClosestMatch) + { + CoTaskMemFree(pwfxClosestMatch); + } + } + + m_nSourceFrameSizeInBytes = (wfx.wBitsPerSample >> 3) * wfx.nChannels; + m_nBytesPerNotif = ((wfx.nAvgBytesPerSec * TMEDIA_PRODUCER(wasapi)->audio.ptime)/1000); + + // Initialize + hr = m_pDevice->Initialize( + AUDCLNT_SHAREMODE_SHARED, + AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + (TDAV_WASAPI_PRODUCER_NOTIF_POS_COUNT * WASAPI_MILLIS_TO_100NS(TMEDIA_PRODUCER(wasapi)->audio.ptime)), + 0, + &wfx, + NULL); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("#WASAPI: Capture::SetClientProperties", hr); + WASAPI_SET_ERROR(-9); + } + + REFERENCE_TIME DefaultDevicePeriod, MinimumDevicePeriod; + hr = m_pDevice->GetDevicePeriod(&DefaultDevicePeriod, &MinimumDevicePeriod); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("GetDevicePeriod", hr); + WASAPI_SET_ERROR(-10); + } + TSK_DEBUG_INFO("#WASAPI(Capture): DefaultDevicePeriod=%lld ms, MinimumDevicePeriod=%lldms", WASAPI_100NS_TO_MILLIS(DefaultDevicePeriod), WASAPI_100NS_TO_MILLIS(MinimumDevicePeriod)); + + if(!m_hCaptureEvent){ + if(!(m_hCaptureEvent = CreateEventEx(NULL, NULL, 0, EVENT_ALL_ACCESS))){ + tdav_win32_print_error("CreateEventEx(Capture)", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-11); + } + } + if(!m_hShutdownEvent){ + if(!(m_hShutdownEvent = CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS))){ + tdav_win32_print_error("CreateEventEx(Shutdown)", HRESULT_FROM_WIN32(GetLastError())); + WASAPI_SET_ERROR(-12); + } + } + + hr = m_pDevice->SetEventHandle(m_hCaptureEvent); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("SetEventHandle", hr); + WASAPI_SET_ERROR(-13); + } + + hr = m_pDevice->GetService(__uuidof(IAudioCaptureClient), (void**)&m_pClient); + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("GetService", hr); + WASAPI_SET_ERROR(-14); + } + + int packetperbuffer = (1000 / codec->plugin->audio.ptime); + m_ring.chunck.size = wfx.nSamplesPerSec * (wfx.wBitsPerSample >> 3) / packetperbuffer; + TSK_DEBUG_INFO("#WASAPI: Audio producer ring chunk size = %u", m_ring.chunck.size); + // allocate our chunck buffer + if(!(m_ring.chunck.buffer = tsk_realloc(m_ring.chunck.buffer, m_ring.chunck.size))){ + TSK_DEBUG_ERROR("Failed to allocate new buffer"); + WASAPI_SET_ERROR(-15); + } + // create ringbuffer + m_ring.size = TDAV_WASAPI_PRODUCER_NOTIF_POS_COUNT * m_ring.chunck.size; + TSK_DEBUG_INFO("#WASAPI: Audio producer ring size = %u", m_ring.size); + if(!m_ring.buffer){ + m_ring.buffer = speex_buffer_init(m_ring.size); + } + else { + int sret; + if((sret = speex_buffer_resize(m_ring.buffer, m_ring.size)) < 0){ + TSK_DEBUG_ERROR("speex_buffer_resize(%d) failed with error code=%d", m_ring.size, sret); + WASAPI_SET_ERROR(-16); + } + } + if(!m_ring.buffer){ + TSK_DEBUG_ERROR("Failed to create a new ring buffer with size = %d", m_ring.size); + WASAPI_SET_ERROR(-17); + } + + m_callback.fn = TMEDIA_PRODUCER(wasapi)->enc_cb.callback; + m_callback.pcData = TMEDIA_PRODUCER(wasapi)->enc_cb.callback_data; + +bail: + if (pwstrCaptureId){ + CoTaskMemFree((LPVOID)pwstrCaptureId); + } + if(ret != 0){ + UnPrepare(); + } + m_bPrepared = (ret == 0); + + tsk_mutex_unlock(m_hMutex); + + return ret; +} + +int Doubango::VoIP::AudioCapture::UnPrepare() +{ + tsk_mutex_lock(m_hMutex); + + if(m_hCaptureEvent) + { + CloseHandle(m_hCaptureEvent), m_hCaptureEvent = nullptr; + } + if(m_hShutdownEvent) + { + CloseHandle(m_hShutdownEvent), m_hShutdownEvent = nullptr; + } + if(m_pDevice) + { + m_pDevice->Release(), m_pDevice = nullptr; + } + if(m_pClient) + { + m_pClient->Release(), m_pClient = nullptr; + } + + TSK_FREE(m_ring.chunck.buffer); + if(m_ring.buffer){ + speex_buffer_destroy(m_ring.buffer); + m_ring.buffer = nullptr; + } + + m_callback.fn = nullptr; + m_callback.pcData = nullptr; + + m_bPrepared = false; + + tsk_mutex_unlock(m_hMutex); + + return 0; +} + +int Doubango::VoIP::AudioCapture::Start() +{ + tsk_mutex_lock(m_hMutex); + + if(m_bStarted) + { + TSK_DEBUG_INFO("#WASAPI: Audio producer already started"); + goto bail; + } + if(!m_bPrepared) + { + TSK_DEBUG_ERROR("Audio producer not prepared"); + goto bail; + } + + m_pAsyncThread = Windows::System::Threading::ThreadPool::RunAsync(ref new Windows::System::Threading::WorkItemHandler(this, &Doubango::VoIP::AudioCapture::AsyncThread), + Windows::System::Threading::WorkItemPriority::High, + Windows::System::Threading::WorkItemOptions::TimeSliced); + + if((m_bStarted = (m_pAsyncThread != nullptr))) + { + HRESULT hr = m_pDevice->Start(); + if(!SUCCEEDED(hr)) + { + tdav_win32_print_error("Device::Start", hr); + Stop(); + } + m_bPaused = false; + } + +bail: + tsk_mutex_unlock(m_hMutex); + + return (m_bStarted ? 0 : -2); +} + +int Doubango::VoIP::AudioCapture::Stop() +{ + m_bStarted = false; + + tsk_mutex_lock(m_hMutex); + + if (m_hShutdownEvent) + { + SetEvent(m_hShutdownEvent); + } + + if (m_pAsyncThread) + { + m_pAsyncThread->Cancel(); + m_pAsyncThread->Close(); + m_pAsyncThread = nullptr; + } + + if(m_pDevice) + { + m_pDevice->Stop(); + } + + // will be prepared again before next start() + UnPrepare(); + + tsk_mutex_unlock(m_hMutex); + + return 0; +} + +int Doubango::VoIP::AudioCapture::Pause() +{ + tsk_mutex_lock(m_hMutex); + + m_bPaused = true; + + tsk_mutex_unlock(m_hMutex); + + return 0; +} + +void Doubango::VoIP::AudioCapture::AsyncThread(Windows::Foundation::IAsyncAction^ operation) +{ + HRESULT hr = S_OK; + BYTE* pbData = nullptr; + UINT32 nFrames = 0; + DWORD dwFlags = 0; + UINT32 incomingBufferSize; + INT32 avail; + UINT32 nNextPacketSize; + + HANDLE eventHandles[] = { + m_hCaptureEvent, // WAIT_OBJECT0 + m_hShutdownEvent // WAIT_OBJECT1 + }; + + TSK_DEBUG_INFO("#WASAPI: __record_thread -- START"); + + #define BREAK_WHILE tsk_mutex_unlock(m_hMutex); break; + + while(m_bStarted && SUCCEEDED(hr)){ + DWORD waitResult = WaitForMultipleObjectsEx(SIZEOF_ARRAY(eventHandles), eventHandles, FALSE, INFINITE, FALSE); + + tsk_mutex_lock(m_hMutex); + + if(!m_bStarted){ + BREAK_WHILE; + } + + if(waitResult == WAIT_OBJECT_0 && m_callback.fn) { + hr = m_pClient->GetNextPacketSize(&nNextPacketSize); + while(SUCCEEDED(hr) && nNextPacketSize >0){ + hr = m_pClient->GetBuffer(&pbData, &nFrames, &dwFlags, nullptr, nullptr); + if(SUCCEEDED(hr) && pbData && nFrames){ + if((dwFlags & AUDCLNT_BUFFERFLAGS_SILENT) != AUDCLNT_BUFFERFLAGS_SILENT){ + incomingBufferSize = nFrames * m_nSourceFrameSizeInBytes; + speex_buffer_write(m_ring.buffer, pbData, incomingBufferSize); + avail = speex_buffer_get_available(m_ring.buffer); + while (m_bStarted && avail >= (INT32)m_ring.chunck.size) { + avail -= speex_buffer_read(m_ring.buffer, m_ring.chunck.buffer, m_ring.chunck.size); + m_callback.fn(m_callback.pcData, m_ring.chunck.buffer, m_ring.chunck.size); + } + } + + if (SUCCEEDED(hr)){ + hr = m_pClient->ReleaseBuffer(nFrames); + } + if (SUCCEEDED(hr)){ + hr = m_pClient->GetNextPacketSize(&nNextPacketSize); + } + } + } + } + else if(waitResult != WAIT_OBJECT_0){ + BREAK_WHILE; + } + + tsk_mutex_unlock(m_hMutex); + }// end-of-while + + if (!SUCCEEDED(hr)){ + tdav_win32_print_error("AsyncThread: ", hr); + } + + + TSK_DEBUG_INFO("WASAPI: __record_thread(%s) -- STOP", SUCCEEDED(hr) ? "OK": "NOK"); +} + + + + + + + +// +// WaveAPI producer object definition +// +/* constructor */ +static tsk_object_t* tdav_producer_wasapi_ctor(tsk_object_t * self, va_list * app) +{ + tdav_producer_wasapi_t *wasapi = (tdav_producer_wasapi_t*)self; + if(wasapi){ + /* init base */ + tdav_producer_audio_init(TDAV_PRODUCER_AUDIO(wasapi)); + /* init self */ + + wasapi->audioCapture = ref new Doubango::VoIP::AudioCapture(); + } + return self; +} +/* destructor */ +static tsk_object_t* tdav_producer_wasapi_dtor(tsk_object_t * self) +{ + tdav_producer_wasapi_t *wasapi = (tdav_producer_wasapi_t*)self; + if(wasapi){ + /* stop */ + tdav_producer_wasapi_stop((tmedia_producer_t*)self); + /* deinit base */ + tdav_producer_audio_deinit(TDAV_PRODUCER_AUDIO(wasapi)); + /* deinit self */ + if(wasapi->audioCapture){ + delete wasapi->audioCapture; + wasapi->audioCapture = nullptr; + } + } + + return self; +} +/* object definition */ +static const tsk_object_def_t tdav_producer_wasapi_def_s = +{ + sizeof(tdav_producer_wasapi_t), + tdav_producer_wasapi_ctor, + tdav_producer_wasapi_dtor, + tdav_producer_audio_cmp, +}; +/* plugin definition*/ +static const tmedia_producer_plugin_def_t tdav_producer_wasapi_plugin_def_s = +{ + &tdav_producer_wasapi_def_s, + + tmedia_audio, + "Microsoft Windows Audio Session API (WASAPI) producer", + + tdav_producer_wasapi_set, + tdav_producer_wasapi_prepare, + tdav_producer_wasapi_start, + tdav_producer_wasapi_pause, + tdav_producer_wasapi_stop +}; +const tmedia_producer_plugin_def_t *tdav_producer_wasapi_plugin_def_t = &tdav_producer_wasapi_plugin_def_s; + + + + +#endif /* HAVE_WASAPI */ diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264.c b/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264.c index 8fc37038..f2f81891 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/h264/tdav_codec_h264.c @@ -30,7 +30,7 @@ */ #include "tinydav/codecs/h264/tdav_codec_h264.h" -#if HAVE_FFMPEG && (!defined(HAVE_H264) || HAVE_H264) +#if (HAVE_FFMPEG && (!defined(HAVE_H264) || HAVE_H264)) || HAVE_H264_PASSTHROUGH #include "tinydav/codecs/h264/tdav_codec_h264_rtp.h" #include "tinydav/video/tdav_converter_video.h" @@ -43,7 +43,9 @@ #include "tsk_memory.h" #include "tsk_debug.h" +#if HAVE_FFMPEG #include +#endif typedef struct tdav_codec_h264_s { @@ -51,9 +53,11 @@ typedef struct tdav_codec_h264_s // Encoder struct{ +#if HAVE_FFMPEG AVCodec* codec; AVCodecContext* context; AVFrame* picture; +#endif void* buffer; int64_t frame_count; tsk_bool_t force_idr; @@ -63,10 +67,11 @@ typedef struct tdav_codec_h264_s // decoder struct{ +#if HAVE_FFMPEG AVCodec* codec; AVCodecContext* context; AVFrame* picture; - +#endif void* accumulator; tsk_size_t accumulator_pos; tsk_size_t accumulator_size; @@ -107,13 +112,17 @@ static int tdav_codec_h264_set(tmedia_codec_t* self, const tmedia_param_t* param case tmedia_codec_action_bw_down: { h264->encoder.quality = TSK_CLAMP(1, (h264->encoder.quality + 1), 31); +#if HAVE_FFMPEG h264->encoder.context->global_quality = FF_QP2LAMBDA * h264->encoder.quality; +#endif break; } case tmedia_codec_action_bw_up: { h264->encoder.quality = TSK_CLAMP(1, (h264->encoder.quality - 1), 31); +#if HAVE_FFMPEG h264->encoder.context->global_quality = FF_QP2LAMBDA * h264->encoder.quality; +#endif break; } } @@ -201,8 +210,11 @@ static int tdav_codec_h264_close(tmedia_codec_t* self) static tsk_size_t tdav_codec_h264_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) { int ret = 0; + +#if HAVE_FFMPEG int size; tsk_bool_t send_idr, send_hdr; +#endif tdav_codec_h264_t* h264 = (tdav_codec_h264_t*)self; @@ -215,6 +227,8 @@ static tsk_size_t tdav_codec_h264_encode(tmedia_codec_t* self, const void* in_da TSK_DEBUG_ERROR("Codec not opened"); return 0; } + +#if HAVE_FFMPEG // wrap yuv420 buffer size = avpicture_fill((AVPicture *)h264->encoder.picture, (uint8_t*)in_data, PIX_FMT_YUV420P, h264->encoder.context->width, h264->encoder.context->height); @@ -260,13 +274,19 @@ static tsk_size_t tdav_codec_h264_encode(tmedia_codec_t* self, const void* in_da } h264 ->encoder.force_idr = tsk_false; +#elif HAVE_H264_PASSTHROUGH + + tdav_codec_h264_encap(h264, (const uint8_t*)in_data, in_size); + +#endif + return 0; } static tsk_size_t tdav_codec_h264_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) { tdav_codec_h264_t* h264 = (tdav_codec_h264_t*)self; - const trtp_rtp_header_t* rtp_hdr = proto_hdr; + const trtp_rtp_header_t* rtp_hdr = (const trtp_rtp_header_t*)proto_hdr; const uint8_t* pay_ptr = tsk_null; tsk_size_t pay_size = 0; @@ -275,9 +295,16 @@ static tsk_size_t tdav_codec_h264_decode(tmedia_codec_t* self, const void* in_da tsk_size_t retsize = 0, size_to_copy = 0; static tsk_size_t xmax_size = (1920 * 1080 * 3) >> 3; static tsk_size_t start_code_prefix_size = sizeof(H264_START_CODE_PREFIX); +#if HAVE_FFMPEG int got_picture_ptr; +#endif - if(!h264 || !in_data || !in_size || !out_data || !h264->decoder.context){ + if(!h264 || !in_data || !in_size || !out_data +#if HAVE_FFMPEG + || !h264->decoder.context +#endif + ) + { TSK_DEBUG_ERROR("Invalid parameter"); return 0; } @@ -349,6 +376,7 @@ static tsk_size_t tdav_codec_h264_decode(tmedia_codec_t* self, const void* in_da // end-accumulator if(rtp_hdr->marker){ +#if HAVE_FFMPEG AVPacket packet; @@ -356,7 +384,7 @@ static tsk_size_t tdav_codec_h264_decode(tmedia_codec_t* self, const void* in_da av_init_packet(&packet); packet.size = h264->decoder.accumulator_pos; packet.data = h264->decoder.accumulator; - ret = avcodec_decode_video2(h264->decoder.context, h264->decoder.picture, &got_picture_ptr, &packet); + ret = avcodec_decode_video2(h264->decoder.context, h264->decoder.picture, &got_picture_ptr, &packet); if(ret <0){ TSK_DEBUG_INFO("Failed to decode the buffer with error code =%d", ret); @@ -386,6 +414,19 @@ static tsk_size_t tdav_codec_h264_decode(tmedia_codec_t* self, const void* in_da avpicture_layout((AVPicture *)h264->decoder.picture, h264->decoder.context->pix_fmt, h264->decoder.context->width, h264->decoder.context->height, *out_data, retsize); } +#elif HAVE_H264_PASSTHROUGH + if(*out_max_size < h264->decoder.accumulator_pos){ + if((*out_data = tsk_realloc(*out_data, h264->decoder.accumulator_pos))){ + *out_max_size = h264->decoder.accumulator_pos; + } + else{ + *out_max_size = 0; + return 0; + } + } + memcpy(*out_data, h264->decoder.accumulator, h264->decoder.accumulator_pos); + retsize = h264->decoder.accumulator_pos; +#endif h264->decoder.accumulator_pos = 0; } @@ -518,7 +559,7 @@ static char* tdav_codec_h264_sdp_att_get(const tmedia_codec_t* self, const char* /* constructor */ static tsk_object_t* tdav_codec_h264_base_ctor(tsk_object_t * self, va_list * app) { - tdav_codec_h264_t *h264 = self; + tdav_codec_h264_t *h264 = (tdav_codec_h264_t*)self; if(h264){ /* init base: called by tmedia_codec_create() */ /* init self */ @@ -531,7 +572,7 @@ static tsk_object_t* tdav_codec_h264_base_ctor(tsk_object_t * self, va_list * ap /* destructor */ static tsk_object_t* tdav_codec_h264_base_dtor(tsk_object_t * self) { - tdav_codec_h264_t *h264 = self; + tdav_codec_h264_t *h264 = (tdav_codec_h264_t*)self; if(h264){ /* deinit base */ tdav_codec_h264_common_deinit(self); @@ -597,7 +638,7 @@ static tsk_object_t* tdav_codec_h264_main_ctor(tsk_object_t * self, va_list * ap /* destructor */ static tsk_object_t* tdav_codec_h264_main_dtor(tsk_object_t * self) { - tdav_codec_h264_t *h264 = self; + tdav_codec_h264_t *h264 = (tdav_codec_h264_t*)self; if(h264){ /* deinit base */ tdav_codec_h264_common_deinit(self); @@ -685,6 +726,7 @@ const tmedia_codec_plugin_def_t *tdav_codec_h264_main_plugin_def_t = &tdav_codec int tdav_codec_h264_open_encoder(tdav_codec_h264_t* self) { +#if HAVE_FFMPEG int ret; tsk_size_t size; @@ -786,10 +828,17 @@ int tdav_codec_h264_open_encoder(tdav_codec_h264_t* self) } return ret; +#elif HAVE_H264_PASSTHROUGH + return 0; +#endif + + TSK_DEBUG_ERROR("Not expected code called"); + return -1; } int tdav_codec_h264_close_encoder(tdav_codec_h264_t* self) { +#if HAVE_FFMPEG if(self->encoder.context){ avcodec_close(self->encoder.context); av_free(self->encoder.context); @@ -799,6 +848,7 @@ int tdav_codec_h264_close_encoder(tdav_codec_h264_t* self) av_free(self->encoder.picture); self->encoder.picture = tsk_null; } +#endif if(self->encoder.buffer){ TSK_FREE(self->encoder.buffer); } @@ -809,6 +859,7 @@ int tdav_codec_h264_close_encoder(tdav_codec_h264_t* self) int tdav_codec_h264_open_decoder(tdav_codec_h264_t* self) { +#if HAVE_FFMPEG int ret; if(self->decoder.context){ @@ -842,10 +893,19 @@ int tdav_codec_h264_open_decoder(tdav_codec_h264_t* self) } return ret; + +#elif HAVE_H264_PASSTHROUGH + return 0; +#endif + + TSK_DEBUG_ERROR("Unexpected code called"); + return -1; + } int tdav_codec_h264_close_decoder(tdav_codec_h264_t* self) { +#if HAVE_FFMPEG if(self->decoder.context){ avcodec_close(self->decoder.context); av_free(self->decoder.context); @@ -855,6 +915,7 @@ int tdav_codec_h264_close_decoder(tdav_codec_h264_t* self) av_free(self->decoder.picture); self->decoder.picture = tsk_null; } +#endif TSK_FREE(self->decoder.accumulator); self->decoder.accumulator_pos = 0; @@ -887,6 +948,7 @@ int tdav_codec_h264_init(tdav_codec_h264_t* self, profile_idc_t profile) TMEDIA_CODEC_VIDEO(self)->in.max_mbps = TMEDIA_CODEC_VIDEO(self)->out.max_mbps = H264_MAX_MBPS*1000; TMEDIA_CODEC_VIDEO(self)->in.max_br = TMEDIA_CODEC_VIDEO(self)->out.max_br = H264_MAX_BR*1000; +#if HAVE_FFMPEG if(!(self->encoder.codec = avcodec_find_encoder(CODEC_ID_H264))){ TSK_DEBUG_ERROR("Failed to find H.264 encoder"); ret = -2; @@ -896,6 +958,9 @@ int tdav_codec_h264_init(tdav_codec_h264_t* self, profile_idc_t profile) TSK_DEBUG_ERROR("Failed to find H.264 decoder"); ret = -3; } +#elif HAVE_H264_PASSTHROUGH + TMEDIA_CODEC(self)->passthrough = tsk_true; +#endif self->encoder.quality = 1; @@ -910,10 +975,12 @@ int tdav_codec_h264_deinit(tdav_codec_h264_t* self) return -1; } +#if HAVE_FFMPEG self->encoder.codec = tsk_null; self->decoder.codec = tsk_null; // FFMpeg resources are destroyed by close() +#endif return 0; } diff --git a/branches/2.0/doubango/tinyDAV/src/tdav.c b/branches/2.0/doubango/tinyDAV/src/tdav.c index 46a37296..635ce6c3 100644 --- a/branches/2.0/doubango/tinyDAV/src/tdav.c +++ b/branches/2.0/doubango/tinyDAV/src/tdav.c @@ -77,6 +77,8 @@ #include "tinydav/audio/directsound/tdav_consumer_dsound.h" #include "tinydav/audio/coreaudio/tdav_consumer_audioqueue.h" #include "tinydav/audio/coreaudio/tdav_consumer_audiounit.h" +#include "tinydav/audio/wasapi/tdav_consumer_wasapi.h" +#include "tinydav/video/winm/tdav_consumer_winm.h" #include "tinydav/t140/tdav_consumer_t140.h" #if HAVE_TINYDSHOW // DirectShow # include "tinydshow/plugin/DSConsumer.h" @@ -87,6 +89,8 @@ #include "tinydav/audio/directsound/tdav_producer_dsound.h" #include "tinydav/audio/coreaudio/tdav_producer_audioqueue.h" #include "tinydav/audio/coreaudio/tdav_producer_audiounit.h" +#include "tinydav/audio/wasapi/tdav_producer_wasapi.h" +#include "tinydav/video/winm/tdav_producer_winm.h" #include "tinydav/t140/tdav_producer_t140.h" #if HAVE_TINYDSHOW // DirectShow # include "tinydshow/plugin/DSProducer.h" @@ -225,7 +229,11 @@ int tdav_init() # endif tmedia_codec_plugin_register(tdav_codec_h263_plugin_def_t); tmedia_codec_plugin_register(tdav_codec_h261_plugin_def_t); +#elif HAVE_H264_PASSTHROUGH + tmedia_codec_plugin_register(tdav_codec_h264_base_plugin_def_t); + tmedia_codec_plugin_register(tdav_codec_h264_main_plugin_def_t); #endif + /* === Register converters === */ #if HAVE_LIBYUV @@ -240,9 +248,13 @@ int tdav_init() tmedia_consumer_plugin_register(tdav_consumer_dsound_plugin_def_t); #elif HAVE_WAVE_API tmedia_consumer_plugin_register(tdav_consumer_waveapi_plugin_def_t); +#elif HAVE_WASAPI + tmedia_consumer_plugin_register(tdav_consumer_wasapi_plugin_def_t); #endif #if HAVE_TINYDSHOW // DirectShow tmedia_consumer_plugin_register(tdshow_consumer_plugin_def_t); +#elif HAVE_WINM + tmedia_consumer_plugin_register(tdav_consumer_winm_plugin_def_t); #endif #if HAVE_COREAUDIO_AUDIO_UNIT // CoreAudio based on AudioUnit @@ -261,9 +273,13 @@ int tdav_init() tmedia_producer_plugin_register(tdav_producer_dsound_plugin_def_t); #elif HAVE_WAVE_API // WaveAPI tmedia_producer_plugin_register(tdav_producer_waveapi_plugin_def_t); +#elif HAVE_WASAPI // WASAPI + tmedia_producer_plugin_register(tdav_producer_wasapi_plugin_def_t); #endif #if HAVE_TINYDSHOW // DirectShow tmedia_producer_plugin_register(tdshow_producer_plugin_def_t); +#elif HAVE_WINM + tmedia_producer_plugin_register(tdav_producer_winm_plugin_def_t); #endif #if HAVE_COREAUDIO_AUDIO_UNIT // CoreAudio based on AudioUnit @@ -350,6 +366,9 @@ static tdav_codec_decl_t __codecs[] = { # endif { tdav_codec_id_h263, &tdav_codec_h263_plugin_def_t }, { tdav_codec_id_h261, &tdav_codec_h261_plugin_def_t }, +#elif HAVE_H264_PASSTHROUGH + { tdav_codec_id_h264_bp, &tdav_codec_h264_base_plugin_def_t }, + { tdav_codec_id_h264_mp, &tdav_codec_h264_main_plugin_def_t }, #endif { tdav_codec_id_t140, &tdav_codec_t140_plugin_def_t }, @@ -494,13 +513,15 @@ tsk_bool_t _tdav_codec_is_supported(tdav_codec_id_t codec, const tmedia_codec_pl #endif #if HAVE_FFMPEG && (!defined(HAVE_H264) || HAVE_H264) if(tdav_codec_h264_is_ffmpeg_plugin(plugin)) return tsk_true; +#elif HAVE_H264_PASSTHROUGH + return tsk_true; #endif } else{ #if HAVE_CUDA if(tdav_codec_h264_cuda_is_supported()) return tsk_true; #endif -#if HAVE_FFMPEG && (!defined(HAVE_H264) || HAVE_H264) +#if (HAVE_FFMPEG && (!defined(HAVE_H264) || HAVE_H264)) || HAVE_H264_PASSTHROUGH return tsk_true; #endif } @@ -599,7 +620,9 @@ int tdav_deinit() # if !defined(HAVE_THEORA) || HAVE_THEORA tmedia_codec_plugin_unregister(tdav_codec_theora_plugin_def_t); # endif - +#elif HAVE_H264_PASSTHROUGH + tmedia_codec_plugin_unregister(tdav_codec_h264_base_plugin_def_t); + tmedia_codec_plugin_unregister(tdav_codec_h264_main_plugin_def_t); #endif /* === unRegister converters === */ @@ -613,15 +636,22 @@ int tdav_deinit() tmedia_consumer_plugin_unregister(tdav_consumer_t140_plugin_def_t); /* T140 */ #if HAVE_DSOUND_H tmedia_consumer_plugin_unregister(tdav_consumer_dsound_plugin_def_t); -#elif HAVE_WAVE_API +#endif +#if HAVE_WAVE_API tmedia_consumer_plugin_unregister(tdav_consumer_waveapi_plugin_def_t); #endif +#if HAVE_WASAPI + tmedia_consumer_plugin_unregister(tdav_consumer_wasapi_plugin_def_t); +#endif #if HAVE_TINYDSHOW // DirectShow tmedia_consumer_plugin_unregister(tdshow_consumer_plugin_def_t); +#elif HAVE_WINM + tmedia_consumer_plugin_unregister(tdav_consumer_winm_plugin_def_t); #endif #if HAVE_COREAUDIO_AUDIO_UNIT // CoreAudio based on AudioUnit tmedia_consumer_plugin_unregister(tdav_consumer_audiounit_plugin_def_t); -#elif HAVE_COREAUDIO_AUDIO_QUEUE // CoreAudio based on AudioQueue +#endif +#if HAVE_COREAUDIO_AUDIO_QUEUE // CoreAudio based on AudioQueue tmedia_consumer_plugin_unregister(tdav_consumer_audioqueue_plugin_def_t); #endif @@ -629,11 +659,17 @@ int tdav_deinit() tmedia_producer_plugin_unregister(tdav_producer_t140_plugin_def_t); /* T140 */ #if HAVE_DSOUND_H // DirectSound tmedia_producer_plugin_unregister(tdav_producer_dsound_plugin_def_t); -#elif HAVE_WAVE_API // WaveAPI +#endif +#if HAVE_WAVE_API // WaveAPI tmedia_producer_plugin_unregister(tdav_producer_waveapi_plugin_def_t); #endif +#if HAVE_WASAPI // WASAPI + tmedia_producer_plugin_unregister(tdav_producer_wasapi_plugin_def_t); +#endif #if HAVE_TINYDSHOW // DirectShow tmedia_producer_plugin_unregister(tdshow_producer_plugin_def_t); +#elif HAVE_WINM + tmedia_producer_plugin_unregister(tdav_producer_winm_plugin_def_t); #endif #if HAVE_COREAUDIO_AUDIO_UNIT // CoreAudio based on AudioUnit diff --git a/branches/2.0/doubango/tinyDAV/src/tdav_session_av.c b/branches/2.0/doubango/tinyDAV/src/tdav_session_av.c index 444406f0..60e3f2db 100644 --- a/branches/2.0/doubango/tinyDAV/src/tdav_session_av.c +++ b/branches/2.0/doubango/tinyDAV/src/tdav_session_av.c @@ -64,7 +64,7 @@ static const tsk_bool_t __have_libsrtp = tsk_false; #define TDAV_FIXME_MEDIA_LEVEL_DTLS_ATT 0 #endif /* TDAV_FIXME_MEDIA_LEVEL_DTLS_ATT */ -static void* _tdav_session_av_error_async_thread(void* usrdata); +static void* TSK_STDCALL _tdav_session_av_error_async_thread(void* usrdata); static int _tdav_session_av_raise_error_async(struct tdav_session_av_s* self, tsk_bool_t is_fatal, const char* reason); #if HAVE_SRTP static int _tdav_session_av_srtp_dtls_cb(const void* usrdata, enum trtp_srtp_dtls_event_type_e type, const char* reason); @@ -277,12 +277,12 @@ tsk_bool_t tdav_session_av_set(tdav_session_av_t* self, const tmedia_param_t* pa if(param->value_type == tmedia_pvt_pchar){ if(tsk_striequals(param->key, "remote-ip")){ if(param->value){ - tsk_strupdate(&self->remote_ip, param->value); + tsk_strupdate(&self->remote_ip, (const char*)param->value); return tsk_true; } } else if(tsk_striequals(param->key, "local-ip")){ - tsk_strupdate(&self->local_ip, param->value); + tsk_strupdate(&self->local_ip, (const char*)param->value); return tsk_true; } else if(tsk_striequals(param->key, "local-ipver")){ @@ -342,12 +342,12 @@ tsk_bool_t tdav_session_av_set(tdav_session_av_t* self, const tmedia_param_t* pa } else if(tsk_striequals(param->key, "remote-sdp-message")){ TSK_OBJECT_SAFE_FREE(self->remote_sdp); - self->remote_sdp = tsk_object_ref(param->value); + self->remote_sdp = (struct tsdp_message_s*)tsk_object_ref(param->value); return tsk_true; } else if(tsk_striequals(param->key, "local-sdp-message")){ TSK_OBJECT_SAFE_FREE(self->local_sdp); - self->local_sdp = tsk_object_ref(param->value); + self->local_sdp = (struct tsdp_message_s*)tsk_object_ref(param->value); return tsk_true; } } @@ -1478,7 +1478,7 @@ const tmedia_codec_t* tdav_session_av_get_red_codec(const tdav_session_av_t* sel return tsk_null; } -static void* _tdav_session_av_error_async_thread(void* usrdata) +static void* TSK_STDCALL _tdav_session_av_error_async_thread(void* usrdata) { if(usrdata){ tdav_session_av_t* self = (tdav_session_av_t*)usrdata; diff --git a/branches/2.0/doubango/tinyDAV/src/tdav_win32.c b/branches/2.0/doubango/tinyDAV/src/tdav_win32.c index 9038fbf8..1053f41e 100644 --- a/branches/2.0/doubango/tinyDAV/src/tdav_win32.c +++ b/branches/2.0/doubango/tinyDAV/src/tdav_win32.c @@ -30,11 +30,15 @@ #if TDAV_UNDER_WINDOWS +#include "tsk_string.h" +#include "tsk_memory.h" #include "tsk_debug.h" + #include int tdav_win32_init() { +#if !TDAV_UNDER_WINDOWS_RT MMRESULT result; // Timers accuracy @@ -42,34 +46,52 @@ int tdav_win32_init() if(result){ TSK_DEBUG_ERROR("timeBeginPeriod(1) returned result=%u", result); } +#endif return 0; } -void tdav_win32_print_error(const char* func, HRESULT hr) +TINYDAV_API void tdav_win32_print_error(const char* func, HRESULT hr) { - CHAR* message = tsk_null; + CHAR message[1024] = {0}; + +#if TDAV_UNDER_WINDOWS_RT + // FormatMessageA not allowed on the Store + static WCHAR wBuff[1024] = {0}; + FormatMessageW( + FORMAT_MESSAGE_FROM_SYSTEM, + tsk_null, + hr, + 0, + wBuff, + sizeof(wBuff)-1, + tsk_null); + WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, wBuff, wcslen(wBuff), message, sizeof(message) - 1, NULL, NULL); +#else #ifdef _WIN32_WCE FormatMessage #else FormatMessageA #endif ( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, +#if !TDAV_UNDER_WINDOWS_RT + FORMAT_MESSAGE_ALLOCATE_BUFFER | +#endif + FORMAT_MESSAGE_FROM_SYSTEM, tsk_null, hr, 0, message, - 0, + sizeof(message) - 1, tsk_null); +#endif - TSK_DEBUG_ERROR("%s():", message); - - LocalFree(message); + TSK_DEBUG_ERROR("%s(): %s", func, message); } int tdav_win32_deinit() { +#if !TDAV_UNDER_WINDOWS_RT MMRESULT result; // Timers accuracy @@ -77,6 +99,8 @@ int tdav_win32_deinit() if(result){ TSK_DEBUG_ERROR("timeEndPeriod(1) returned result=%u", result); } +#endif + return 0; } diff --git a/branches/2.0/doubango/tinyDAV/src/video/tdav_session_video.c b/branches/2.0/doubango/tinyDAV/src/video/tdav_session_video.c index cad647fb..e12b80a3 100644 --- a/branches/2.0/doubango/tinyDAV/src/video/tdav_session_video.c +++ b/branches/2.0/doubango/tinyDAV/src/video/tdav_session_video.c @@ -266,13 +266,14 @@ static int tdav_session_video_producer_enc_cb(const void* callback_data, const v //base->producer->video.rotation = ((__rotation_counter++ % 150) < 75) ? 90 : 0; +#define PRODUCER_NEED_ENCODER (base->producer->encoder.codec_id == tmedia_codec_id_none) // Otherwise, frames from the producer are already encoded #define PRODUCER_SIZE_CHANGED (video->conv.producerWidth != base->producer->video.width) || (video->conv.producerHeight != base->producer->video.height) \ || (video->conv.xProducerSize != size) #define ENCODED_NEED_FLIP TMEDIA_CODEC_VIDEO(video->encoder.codec)->out.flip #define PRODUCED_FRAME_NEED_ROTATION (base->producer->video.rotation != 0) #define PRODUCED_FRAME_NEED_CHROMA_CONVERSION (base->producer->video.chroma != TMEDIA_CODEC_VIDEO(video->encoder.codec)->out.chroma) // Video codecs only accept YUV420P buffers ==> do conversion if needed or producer doesn't have the right size - if(PRODUCED_FRAME_NEED_CHROMA_CONVERSION || PRODUCER_SIZE_CHANGED || ENCODED_NEED_FLIP || PRODUCED_FRAME_NEED_ROTATION){ + if(PRODUCER_NEED_ENCODER && (PRODUCED_FRAME_NEED_CHROMA_CONVERSION || PRODUCER_SIZE_CHANGED || ENCODED_NEED_FLIP || PRODUCED_FRAME_NEED_ROTATION)){ // Create video converter if not already done or producer size have changed if(!video->conv.toYUV420 || PRODUCER_SIZE_CHANGED){ TSK_OBJECT_SAFE_FREE(video->conv.toYUV420); @@ -641,13 +642,14 @@ static int _tdav_session_video_decode(tdav_session_video_t* self, const trtp_rtp } // Convert decoded data to the consumer chroma and size +#define CONSUMER_NEED_DECODER (base->consumer->decoder.codec_id == tmedia_codec_id_none) // Otherwise, the consumer requires encoded frames #define CONSUMER_IN_N_DISPLAY_MISMATCH (base->consumer->video.in.width != base->consumer->video.display.width || base->consumer->video.in.height != base->consumer->video.display.height) #define CONSUMER_DISPLAY_N_CODEC_MISMATCH (base->consumer->video.display.width != TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.width || base->consumer->video.display.height != TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.height) #define CONSUMER_DISPLAY_N_CONVERTER_MISMATCH ( (self->conv.fromYUV420 && self->conv.fromYUV420->dstWidth != base->consumer->video.display.width) || (self->conv.fromYUV420 && self->conv.fromYUV420->dstHeight != base->consumer->video.display.height) ) #define CONSUMER_CHROMA_MISMATCH (base->consumer->video.display.chroma != TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.chroma) #define DECODED_NEED_FLIP (TMEDIA_CODEC_VIDEO(self->decoder.codec)->in.flip) - if((CONSUMER_CHROMA_MISMATCH || CONSUMER_DISPLAY_N_CODEC_MISMATCH || CONSUMER_IN_N_DISPLAY_MISMATCH || CONSUMER_DISPLAY_N_CONVERTER_MISMATCH || DECODED_NEED_FLIP)){ + if(CONSUMER_NEED_DECODER && (CONSUMER_CHROMA_MISMATCH || CONSUMER_DISPLAY_N_CODEC_MISMATCH || CONSUMER_IN_N_DISPLAY_MISMATCH || CONSUMER_DISPLAY_N_CONVERTER_MISMATCH || DECODED_NEED_FLIP)){ // Create video converter if not already done if(!self->conv.fromYUV420 || CONSUMER_DISPLAY_N_CONVERTER_MISMATCH){ diff --git a/branches/2.0/doubango/tinyDAV/src/video/winm/tdav_consumer_winm.cxx b/branches/2.0/doubango/tinyDAV/src/video/winm/tdav_consumer_winm.cxx new file mode 100644 index 00000000..42b4bf24 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/src/video/winm/tdav_consumer_winm.cxx @@ -0,0 +1,214 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +/**@file tdav_consumer_winm.cxx + * @brief Microsoft Windows Media (WinM) consumer. + * + */ +#include "tinydav/video/winm/tdav_consumer_winm.h" + +#if HAVE_WINM + +#include "tsk_string.h" +#include "tsk_debug.h" + +#if TDAV_UNDER_WINDOWS_PHONE +#include "Globals.h" + +using namespace doubango_rt::BackEnd; +#endif + + +typedef struct tdav_consumer_winm_s +{ + TMEDIA_DECLARE_CONSUMER; +} +tdav_consumer_winm_t; + + + +/* ============ Media Producer Interface ================= */ +int tdav_consumer_winm_set(tmedia_consumer_t *self, const tmedia_param_t* param) +{ + int ret = 0; + + if(!self || !param){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + return ret; +} + + +int tdav_consumer_winm_prepare(tmedia_consumer_t* self, const tmedia_codec_t* codec) +{ + tdav_consumer_winm_t* consumer = (tdav_consumer_winm_t*)self; + + if(!consumer || !codec && codec->plugin){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + TMEDIA_CONSUMER(consumer)->decoder.codec_id = (tmedia_codec_id_t)(tmedia_codec_id_h264_bp | tmedia_codec_id_h264_mp); + + TMEDIA_CONSUMER(consumer)->video.fps = TMEDIA_CODEC_VIDEO(codec)->in.fps; + TMEDIA_CONSUMER(consumer)->video.in.width = TMEDIA_CODEC_VIDEO(codec)->in.width; + TMEDIA_CONSUMER(consumer)->video.in.height = TMEDIA_CODEC_VIDEO(codec)->in.height; + + if(!TMEDIA_CONSUMER(consumer)->video.display.width){ + TMEDIA_CONSUMER(consumer)->video.display.width = TMEDIA_CONSUMER(consumer)->video.in.width; + } + if(!TMEDIA_CONSUMER(consumer)->video.display.height){ + TMEDIA_CONSUMER(consumer)->video.display.height = TMEDIA_CONSUMER(consumer)->video.in.height; + } + + return 0; +} + +int tdav_consumer_winm_start(tmedia_consumer_t* self) +{ + tdav_consumer_winm_t* consumer = (tdav_consumer_winm_t*)self; + + if(!consumer){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + +#if TDAV_UNDER_WINDOWS_PHONE + if(Globals::Instance->VideoRenderer != nullptr) + { + Globals::Instance->VideoRenderer->Start(); + } +#endif + + return 0; +} + +int tdav_consumer_winm_consume(tmedia_consumer_t* self, const void* buffer, tsk_size_t size, const tsk_object_t* proto_hdr) +{ + tdav_consumer_winm_t* consumer = (tdav_consumer_winm_t*)self; + +#if TDAV_UNDER_WINDOWS_PHONE + static const UINT64 hnsPresenationTime = 0; + static const UINT64 hnsSampleDuration = 0; + + Globals::Instance->ReceiveVideoFrame((BYTE*)buffer, size, hnsPresenationTime, hnsSampleDuration); +#endif + + return 0; +} + +int tdav_consumer_winm_pause(tmedia_consumer_t* self) +{ + tdav_consumer_winm_t* consumer = (tdav_consumer_winm_t*)self; + + if(!consumer){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + return 0; +} + +int tdav_consumer_winm_stop(tmedia_consumer_t* self) +{ + tdav_consumer_winm_t* consumer = (tdav_consumer_winm_t*)self; + + TSK_DEBUG_INFO("tdav_consumer_winm_stop"); + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + +#if TDAV_UNDER_WINDOWS_PHONE + if(Globals::Instance->VideoRenderer != nullptr) + { + Globals::Instance->VideoRenderer->Stop(); + } +#endif + + return 0; +} + + +// +// Windows Media video consumer object definition +// +/* constructor */ +static tsk_object_t* tdav_consumer_winm_ctor(tsk_object_t * self, va_list * app) +{ + tdav_consumer_winm_t *consumer = (tdav_consumer_winm_t *)self; + if(consumer){ + /* init base */ + tmedia_consumer_init(TMEDIA_CONSUMER(consumer)); + TMEDIA_CONSUMER(consumer)->video.display.chroma = tmedia_chroma_yuv420p; // To avoid chroma conversion + + /* init self */ + TMEDIA_CONSUMER(consumer)->video.fps = 15; + TMEDIA_CONSUMER(consumer)->video.display.width = 352; + TMEDIA_CONSUMER(consumer)->video.display.height = 288; + TMEDIA_CONSUMER(consumer)->video.display.auto_resize = tsk_true; + } + return self; +} +/* destructor */ +static tsk_object_t* tdav_consumer_winm_dtor(tsk_object_t * self) +{ + tdav_consumer_winm_t *consumer = (tdav_consumer_winm_t *)self; + if(consumer){ + + /* stop */ + //if(consumer->started){ + tdav_consumer_winm_stop((tmedia_consumer_t*)self); + //} + + /* deinit base */ + tmedia_consumer_deinit(TMEDIA_CONSUMER(consumer)); + /* deinit self */ + } + + return self; +} +/* object definition */ +static const tsk_object_def_t tdav_consumer_winm_def_s = +{ + sizeof(tdav_consumer_winm_t), + tdav_consumer_winm_ctor, + tdav_consumer_winm_dtor, + tsk_null, +}; +/* plugin definition*/ +static const tmedia_consumer_plugin_def_t tdav_consumer_winm_plugin_def_s = +{ + &tdav_consumer_winm_def_s, + + tmedia_video, + "Microsoft Windows Media consumer (Video)", + + tdav_consumer_winm_set, + tdav_consumer_winm_prepare, + tdav_consumer_winm_start, + tdav_consumer_winm_consume, + tdav_consumer_winm_pause, + tdav_consumer_winm_stop +}; +extern const tmedia_consumer_plugin_def_t *tdav_consumer_winm_plugin_def_t = &tdav_consumer_winm_plugin_def_s; + + +#endif /* HAVE_WINM */ diff --git a/branches/2.0/doubango/tinyDAV/src/video/winm/tdav_producer_winm.cxx b/branches/2.0/doubango/tinyDAV/src/video/winm/tdav_producer_winm.cxx new file mode 100644 index 00000000..055bdca3 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/src/video/winm/tdav_producer_winm.cxx @@ -0,0 +1,732 @@ +/*Copyright (C) 2013 Doubango Telecom +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +*/ +/**@file tdav_producer_winm.cxx +* @brief Microsoft Windows Media (WinM) video producer. +* +*/ +#include "tinydav/video/winm/tdav_producer_winm.h" + +#if HAVE_WINM + +#include "tsk_string.h" +#include "tsk_debug.h" + +#if TDAV_UNDER_WINDOWS_PHONE + +#include +#include +#include +#include + +using namespace Windows::System::Threading; +using namespace Microsoft::WRL; +using namespace Windows::Foundation; +using namespace Platform; +using namespace Windows::Phone::Media::Capture; +using namespace Windows::Storage::Streams; + +struct tdav_producer_winm_s; + +namespace Doubango +{ + namespace VoIP + { + class CaptureSampleSink : + public Microsoft::WRL::RuntimeClass< + Microsoft::WRL::RuntimeClassFlags, + ICameraCaptureSampleSink> + { + DWORD m_dwSampleCount; + const struct tdav_producer_winm_s* m_pProducer; + + public: + + STDMETHODIMP RuntimeClassInitialize(const struct tdav_producer_winm_s* pProducer) + { + m_dwSampleCount = 0; + m_pProducer = pProducer; + return S_OK; + } + + DWORD GetSampleCount() + { + return m_dwSampleCount; + } + + IFACEMETHODIMP_(void) + OnSampleAvailable( + ULONGLONG hnsPresentationTime, + ULONGLONG hnsSampleDuration, + DWORD cbSample, + BYTE* pSample) + { + m_dwSampleCount++; + if(m_pProducer && TMEDIA_PRODUCER(m_pProducer)->enc_cb.callback) + { + TMEDIA_PRODUCER(m_pProducer)->enc_cb.callback(TMEDIA_PRODUCER(m_pProducer)->enc_cb.callback_data, pSample, cbSample); + } + } + }; + + ref class VideoCapturePhone sealed + { + public: + virtual ~VideoCapturePhone(); + internal: + VideoCapturePhone(); + + int Prepare(const struct tdav_producer_winm_s* winm); + int Start(); + int Pause(); + int Stop(); + void SetCameraLocation(Windows::Phone::Media::Capture::CameraSensorLocation cameraLocation); + void ToggleCamera(); + + private: + int UnPrepare(); + void ToggleCameraThread(Windows::Foundation::IAsyncAction^ operation); + + tsk_mutex_handle_t* m_hMutex; + + const tdav_producer_winm_s* m_pWrappedPlugin; + + // Has capture started? + bool m_bStarted, m_bPrepared; + + // Events to signal whether capture has stopped/started + HANDLE m_hStopCompleted; + HANDLE m_hStartCompleted; + + IAsyncOperation ^m_pOpenOperation; + + Windows::Foundation::IAsyncAction^ m_ToggleThread; + + // Native sink and video device + CaptureSampleSink *m_pVideoSink; + IAudioVideoCaptureDeviceNative *m_pVideoDevice; + + Windows::Phone::Media::Capture::CameraSensorLocation m_eCameraLocation; + + Windows::Phone::Media::Capture::AudioVideoCaptureDevice ^m_pVideoOnlyDevice; + Windows::Foundation::IAsyncAction ^m_pVideoCaptureAction; + }; + } +} + +using namespace Doubango::VoIP; + +#endif + + +typedef struct tdav_producer_winm_s +{ + TMEDIA_DECLARE_PRODUCER; +#if TDAV_UNDER_WINDOWS_PHONE + VideoCapturePhone^ videoCapturePhone; +#endif +} +tdav_producer_winm_t; + + +/* ============ Media Producer Interface ================= */ +static int tdav_producer_winm_set(tmedia_producer_t *self, const tmedia_param_t* param) +{ + int ret = 0; + tdav_producer_winm_t* producer = (tdav_producer_winm_t*)self; + + if(!producer || !param){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + if(param->value_type == tmedia_pvt_int32){ + if(tsk_striequals(param->key, "camera-location")){ + Windows::Phone::Media::Capture::CameraSensorLocation cameraLocation = (Windows::Phone::Media::Capture::CameraSensorLocation)*((int32_t*)param->value); + if(producer->videoCapturePhone) + { + producer->videoCapturePhone->SetCameraLocation(cameraLocation); + return 0; + } + } + } + + return ret; +} + +static int tdav_producer_winm_prepare(tmedia_producer_t* self, const tmedia_codec_t* codec) +{ + tdav_producer_winm_t* producer = (tdav_producer_winm_t*)self; + + if(!producer || !codec && codec->plugin){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + TMEDIA_PRODUCER(producer)->encoder.codec_id = (tmedia_codec_id_t)(tmedia_codec_id_h264_bp | tmedia_codec_id_h264_mp); + TMEDIA_PRODUCER(producer)->video.fps = TMEDIA_CODEC_VIDEO(codec)->out.fps; + TMEDIA_PRODUCER(producer)->video.width = TMEDIA_CODEC_VIDEO(codec)->out.width; + TMEDIA_PRODUCER(producer)->video.height = TMEDIA_CODEC_VIDEO(codec)->out.height; + + +#if TDAV_UNDER_WINDOWS_PHONE + return producer->videoCapturePhone->Prepare(producer); +#else + TSK_DEBUG_ERROR("Unexpected code called"); + return -1; +#endif +} + +static int tdav_producer_winm_start(tmedia_producer_t* self) +{ + tdav_producer_winm_t* producer = (tdav_producer_winm_t*)self; + + if(!producer){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + +#if TDAV_UNDER_WINDOWS_PHONE + return producer->videoCapturePhone->Start(); +#else + TSK_DEBUG_ERROR("Unexpected code called"); + return -1; +#endif +} + +static int tdav_producer_winm_pause(tmedia_producer_t* self) +{ + tdav_producer_winm_t* producer = (tdav_producer_winm_t*)self; + + if(!producer){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + +#if TDAV_UNDER_WINDOWS_PHONE + return producer->videoCapturePhone->Pause(); +#else + TSK_DEBUG_ERROR("Unexpected code called"); + return -1; +#endif +} + +static int tdav_producer_winm_stop(tmedia_producer_t* self) +{ + tdav_producer_winm_t* producer = (tdav_producer_winm_t*)self; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + +#if TDAV_UNDER_WINDOWS_PHONE + return producer->videoCapturePhone->Stop(); +#else + TSK_DEBUG_ERROR("Unexpected code called"); + return -1; +#endif +} + + +#if TDAV_UNDER_WINDOWS_PHONE + +VideoCapturePhone::VideoCapturePhone() : + m_bStarted(false), + m_bPrepared(false), + m_pVideoOnlyDevice(nullptr), + m_pVideoSink(NULL), + m_pVideoDevice(NULL), + m_pWrappedPlugin(NULL), + m_pOpenOperation(nullptr), + m_eCameraLocation(CameraSensorLocation::Front) +{ + if(!(m_hMutex = tsk_mutex_create())){ + throw ref new Platform::FailureException(L"Failed to create mutex"); + } + + m_hStopCompleted = CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); + if (!m_hStopCompleted) + { + throw ref new Platform::Exception(HRESULT_FROM_WIN32(GetLastError()), L"Could not create shutdown event"); + } + + m_hStartCompleted = CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); + if (!m_hStartCompleted) + { + throw ref new Platform::Exception(HRESULT_FROM_WIN32(GetLastError()), L"Could not create start event"); + } +} + +VideoCapturePhone::~VideoCapturePhone() +{ + Stop(); + + if(m_ToggleThread) + { + m_ToggleThread->Cancel(); + m_ToggleThread->Close(); + m_ToggleThread = nullptr; + } + + tsk_mutex_destroy(&m_hMutex); +} + +int VideoCapturePhone::Prepare(const struct tdav_producer_winm_s* winm) +{ + HRESULT hr = E_FAIL; + int ret = 0; + Windows::Foundation::Size dimensionsRequested, dimensionsClosest; + Collections::IVectorView ^availableSizes; + Collections::IIterator ^availableSizesIterator; + bool bClosestFound = false; + + #define WINM_SET_ERROR(code) ret = (code); goto bail; + + tsk_mutex_lock(m_hMutex); + + if(m_bPrepared) + { + TSK_DEBUG_INFO("#WASAPI: Audio producer already prepared"); + goto bail; + } + + if(!winm) + { + TSK_DEBUG_ERROR("Invalid parameter"); + WINM_SET_ERROR(-1); + } + + if(m_pVideoCaptureAction || m_pVideoDevice || m_pVideoOnlyDevice || m_pVideoSink || m_pOpenOperation){ + TSK_DEBUG_ERROR("Producer already prepared"); + WINM_SET_ERROR(-2); + } + + dimensionsClosest.Width = dimensionsRequested.Width = (float)TMEDIA_PRODUCER(winm)->video.width; + dimensionsClosest.Height = dimensionsRequested.Height = (float)TMEDIA_PRODUCER(winm)->video.height; + availableSizes = AudioVideoCaptureDevice::GetAvailableCaptureResolutions(m_eCameraLocation); + availableSizesIterator = availableSizes->First(); + + while(!m_pOpenOperation && availableSizesIterator->HasCurrent) + { + TSK_DEBUG_INFO("Camera Supported size: (%f, %f)", availableSizesIterator->Current.Width, availableSizesIterator->Current.Height); + if(availableSizesIterator->Current.Height == dimensionsRequested.Width && availableSizesIterator->Current.Width == dimensionsRequested.Height) + { + m_pOpenOperation = AudioVideoCaptureDevice::OpenForVideoOnlyAsync(m_eCameraLocation, dimensionsRequested); + TSK_DEBUG_INFO("Camera::Open(%d, %d)", dimensionsRequested.Width, dimensionsRequested.Height); + break; + } + else if(!bClosestFound && (availableSizesIterator->Current.Height <= dimensionsRequested.Height && availableSizesIterator->Current.Width <= dimensionsRequested.Width)) + { + dimensionsClosest.Height = availableSizesIterator->Current.Height; + dimensionsClosest.Width = availableSizesIterator->Current.Width; + bClosestFound = true; + } + availableSizesIterator->MoveNext(); + } + + if(!m_pOpenOperation) + { + m_pOpenOperation = AudioVideoCaptureDevice::OpenForVideoOnlyAsync(m_eCameraLocation, dimensionsClosest); + TSK_DEBUG_INFO("Camera::Open(%f, %f)", dimensionsClosest.Width, dimensionsClosest.Height); + } + +bail: + if(ret != 0){ + UnPrepare(); + } + if((m_bPrepared = (ret == 0))) + { + m_pWrappedPlugin = winm; + } + + tsk_mutex_unlock(m_hMutex); + + return ret; +} + +int VideoCapturePhone::Start() +{ + tsk_mutex_lock(m_hMutex); + + if(m_bStarted) + { + TSK_DEBUG_INFO("#WINM: Video producer already started"); + goto bail; + } + if(!m_bPrepared) + { + TSK_DEBUG_ERROR("#WINM: Video producer not prepared"); + goto bail; + } + + m_bStarted = true; + + m_pOpenOperation->Completed = ref new AsyncOperationCompletedHandler([this] (IAsyncOperation ^operation, Windows::Foundation::AsyncStatus status) + { + tsk_mutex_lock(m_hMutex); + if(m_bStarted) + { + + if(status == Windows::Foundation::AsyncStatus::Completed) + { + + TSK_DEBUG_INFO("+[VideoCapturePhone::Prepare] => OpenAsyncOperation started"); + + auto videoDevice = operation->GetResults(); + + m_pVideoOnlyDevice = videoDevice; + IAudioVideoCaptureDeviceNative *pNativeDevice = NULL; + HRESULT hr = reinterpret_cast(videoDevice)->QueryInterface(__uuidof(IAudioVideoCaptureDeviceNative), (void**) &pNativeDevice); + + if (NULL == pNativeDevice || FAILED(hr)) + { + throw ref new FailureException("Unable to QI IAudioVideoCaptureDeviceNative"); + } + + // Save off the native device + m_pVideoDevice = pNativeDevice; + + // Set Fps + CameraCapturePropertyRange^ cameraCapturePropertyRange = m_pVideoOnlyDevice->GetSupportedPropertyRange(m_eCameraLocation, KnownCameraAudioVideoProperties::VideoFrameRate); + if(cameraCapturePropertyRange) + { + try + { + Windows::Foundation::IPropertyValue^ vMin = dynamic_cast(cameraCapturePropertyRange->Min); + Windows::Foundation::IPropertyValue^ vMax = dynamic_cast(cameraCapturePropertyRange->Max); + UINT32 nFps = TSK_CLAMP(vMin->GetUInt32(), (UINT32)TMEDIA_PRODUCER(m_pWrappedPlugin)->video.fps, vMax->GetUInt32()); + m_pVideoOnlyDevice->SetProperty(KnownCameraAudioVideoProperties::VideoFrameRate, nFps); + } + catch(...){ } + } + + // Set Camera Rotation + try + { + m_pVideoOnlyDevice->SetProperty( + KnownCameraGeneralProperties::EncodeWithOrientation, + m_eCameraLocation == Windows::Phone::Media::Capture::CameraSensorLocation::Back ? 90 : -90 + ); + } + catch(...){ } + + // Create the sink + MakeAndInitialize(&(m_pVideoSink), m_pWrappedPlugin); + pNativeDevice->SetVideoSampleSink(m_pVideoSink); + + // Use the same encoding format as in VideoMediaStreamSource.cs + videoDevice->VideoEncodingFormat = CameraCaptureVideoFormat::H264; + + SetEvent(m_hStartCompleted); + + // Start recording to our sink + m_pVideoCaptureAction = videoDevice->StartRecordingToSinkAsync(); + m_pVideoCaptureAction->Completed = ref new AsyncActionCompletedHandler([this] (IAsyncAction ^asyncInfo, Windows::Foundation::AsyncStatus status) + { + if(status == Windows::Foundation::AsyncStatus::Completed) + { + TSK_DEBUG_INFO("[VideoCapturePhone::Prepare] => StartRecordingToSinkAsync completed"); + } + else if(status == Windows::Foundation::AsyncStatus::Error || status == Windows::Foundation::AsyncStatus::Canceled) + { + TSK_DEBUG_INFO("[VideoCapturePhone::Prepare] => StartRecordingToSinkAsync did not complete"); + } + }); + + TSK_DEBUG_INFO("-[VideoCapturePhone::Prepare] => OpenAsyncOperation Completed"); + } + else if(status == Windows::Foundation::AsyncStatus::Canceled) + { + TSK_DEBUG_INFO("[VideoCapturePhone::Prepare] => OpenAsyncOperation Canceled"); + } + else if(status == Windows::Foundation::AsyncStatus::Error) + { + TSK_DEBUG_INFO("[VideoCapturePhone::Prepare] => OpenAsyncOperation encountered an error"); + } + } + + tsk_mutex_unlock(m_hMutex); + }); + +bail: + tsk_mutex_unlock(m_hMutex); + + return (m_bStarted ? 0 : -2); +} + +int VideoCapturePhone::Pause() +{ + tsk_mutex_lock(m_hMutex); + + if(m_bStarted) + { + + } + + tsk_mutex_unlock(m_hMutex); + + return 0; +} + +int VideoCapturePhone::Stop() +{ + tsk_mutex_lock(m_hMutex); + + TSK_DEBUG_INFO("+[VideoCapturePhone::Stop] => Trying to stop capture"); + if (m_pVideoOnlyDevice) + { + TSK_DEBUG_INFO("Destroying VideoCaptureDevice"); + + try + { + if(m_bStarted) + { + m_pVideoOnlyDevice->StopRecordingAsync()->Completed = ref new AsyncActionCompletedHandler([this] (IAsyncAction ^action, Windows::Foundation::AsyncStatus status){ + if(status == Windows::Foundation::AsyncStatus::Completed) + { + TSK_DEBUG_INFO("[VideoCapturePhone::StopRecordingAsync] Video successfully stopped"); + } + else + { + TSK_DEBUG_INFO("[VideoCapturePhone::StopRecordingAsync] Error occurred while stopping recording"); + } + m_pVideoCaptureAction = nullptr; + m_pVideoOnlyDevice = nullptr; + m_bStarted = false; + SetEvent(m_hStopCompleted); + }); + } + } + catch(...) + { + // A Platform::ObjectDisposedException can be raised if the app has had its access + // to video revoked (most commonly when the app is going out of the foreground) + TSK_DEBUG_ERROR("Exception caught while destroying video capture"); + m_pVideoCaptureAction = nullptr; + m_pVideoOnlyDevice = nullptr; + m_bStarted = false; + SetEvent(m_hStopCompleted); + } + + if (m_pVideoDevice) + { + m_pVideoDevice->Release(); + m_pVideoDevice = NULL; + } + + if (m_pVideoSink) + { + m_pVideoSink->Release(); + m_pVideoSink = NULL; + } + } + else + { + m_bStarted = false; + } + + TSK_DEBUG_INFO("-[VideoCapturePhone::Stop] => finished stopping capture\n"); + + // will be prepared again before next start() + UnPrepare(); + + tsk_mutex_unlock(m_hMutex); + + return 0; +} + +void VideoCapturePhone::SetCameraLocation(Windows::Phone::Media::Capture::CameraSensorLocation cameraLocation) +{ + if(m_eCameraLocation != cameraLocation) + { + if(m_bStarted) + { + ToggleCamera(); + } + else + { + m_eCameraLocation = cameraLocation; + } + } +} + +int VideoCapturePhone::UnPrepare() +{ + tsk_mutex_lock(m_hMutex); + + if(m_bStarted) + { + ResetEvent(m_hStopCompleted); + Stop(); + DWORD waitResult = WaitForSingleObjectEx(m_hStopCompleted, 5000, FALSE); + if(waitResult != WAIT_OBJECT_0) + { + TSK_DEBUG_ERROR("Failed to stop video producer"); + } + } + + if (m_pVideoDevice) + { + m_pVideoDevice->Release(); + m_pVideoDevice = NULL; + } + + if (m_pVideoSink) + { + m_pVideoSink->Release(); + m_pVideoSink = NULL; + } + + m_pOpenOperation = nullptr; + + m_bPrepared = false; + + tsk_mutex_unlock(m_hMutex); + + return 0; +} + +void VideoCapturePhone::ToggleCamera() +{ + tsk_mutex_lock(m_hMutex); + + if(m_ToggleThread) + { + m_ToggleThread->Cancel(); + m_ToggleThread->Close(); + m_ToggleThread = nullptr; + } + + m_ToggleThread = ThreadPool::RunAsync(ref new WorkItemHandler(this, &VideoCapturePhone::ToggleCameraThread), WorkItemPriority::High, WorkItemOptions::TimeSliced); + + tsk_mutex_unlock(m_hMutex); +} + + +void VideoCapturePhone::ToggleCameraThread(Windows::Foundation::IAsyncAction^ operation) +{ + TSK_DEBUG_INFO("+[VideoCapturePhone::ToggleCamera] => Toggling camera"); + + ResetEvent(m_hStopCompleted); + Stop(); + DWORD waitResult = WaitForSingleObjectEx(m_hStopCompleted, INFINITE, FALSE); + if(waitResult == WAIT_OBJECT_0) + { + ResetEvent(m_hStartCompleted); + if(m_eCameraLocation == Windows::Phone::Media::Capture::CameraSensorLocation::Back) + { + m_eCameraLocation = Windows::Phone::Media::Capture::CameraSensorLocation::Front; + } + else + { + m_eCameraLocation = Windows::Phone::Media::Capture::CameraSensorLocation::Back; + } + Prepare(m_pWrappedPlugin); + Start(); + } + else + { + throw ref new Platform::Exception(HRESULT_FROM_WIN32(waitResult), L"Error waiting for capture to stop when toggling cameras"); + } + + waitResult = WaitForSingleObjectEx(m_hStartCompleted, INFINITE, FALSE); + if(waitResult == WAIT_OBJECT_0) + { + // CameraLocationChanged(newCameraLocation); + } + else + { + throw ref new Platform::Exception(HRESULT_FROM_WIN32(waitResult), L"Error waiting for capture to start when toggling cameras"); + } + TSK_DEBUG_INFO("-[VideoCapturePhone::ToggleCamera] => Toggling camera"); +} + +#endif /* TDAV_UNDER_WINDOWS_PHONE */ + + +// +// Windows Media video producer object definition +// +/* constructor */ +static tsk_object_t* tdav_producer_winm_ctor(tsk_object_t * self, va_list * app) +{ + tdav_producer_winm_t *producer = (tdav_producer_winm_t *)self; + if(producer){ + /* init base */ + tmedia_producer_init(TMEDIA_PRODUCER(producer)); + TMEDIA_PRODUCER(producer)->video.chroma = tmedia_chroma_yuv420p; // To avoid chroma conversion + /* init self with default values*/ + + TMEDIA_PRODUCER(producer)->video.fps = 15; + TMEDIA_PRODUCER(producer)->video.width = 352; + TMEDIA_PRODUCER(producer)->video.height = 288; + +#if TDAV_UNDER_WINDOWS_PHONE + producer->videoCapturePhone = ref new VideoCapturePhone(); +#endif + } + return self; +} +/* destructor */ +static tsk_object_t* tdav_producer_winm_dtor(tsk_object_t * self) +{ + tdav_producer_winm_t *producer = (tdav_producer_winm_t *)self; + if(producer){ + /* stop */ + //if(producer->started){ + tdav_producer_winm_stop((tmedia_producer_t*)self); + //} + + /* deinit base */ + tmedia_producer_deinit(TMEDIA_PRODUCER(producer)); + /* deinit self */ +#if TDAV_UNDER_WINDOWS_PHONE + if(producer->videoCapturePhone) + { + delete producer->videoCapturePhone; + } +#endif + } + + return self; +} +/* object definition */ +static const tsk_object_def_t tdav_producer_winm_def_s = +{ + sizeof(tdav_producer_winm_t), + tdav_producer_winm_ctor, + tdav_producer_winm_dtor, + tsk_null, +}; +/* plugin definition*/ +static const tmedia_producer_plugin_def_t tdav_producer_winm_plugin_def_s = +{ + &tdav_producer_winm_def_s, + + tmedia_video, + "Microsoft Windows Media producer (Video)", + + tdav_producer_winm_set, + tdav_producer_winm_prepare, + tdav_producer_winm_start, + tdav_producer_winm_pause, + tdav_producer_winm_stop +}; +const tmedia_producer_plugin_def_t *tdav_producer_winm_plugin_def_t = &tdav_producer_winm_plugin_def_s; + +#endif /* HAVE_WINM */ diff --git a/branches/2.0/doubango/tinyDAV/winrt/tinyDAV.sln b/branches/2.0/doubango/tinyDAV/winrt/tinyDAV.sln new file mode 100644 index 00000000..013627cc --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/winrt/tinyDAV.sln @@ -0,0 +1,142 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyDAV", "tinyDAV.vcxproj", "{0F2C458A-1EDB-4E09-9A22-C2209731CFF2}" + ProjectSection(ProjectDependencies) = postProject + {BE41D117-1D61-4C12-AD9D-B20D02C79687} = {BE41D117-1D61-4C12-AD9D-B20D02C79687} + {1A27423C-6535-4A49-96EC-5D209FE125F2} = {1A27423C-6535-4A49-96EC-5D209FE125F2} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {77A24977-079C-4E02-9717-8B2F684BAA21} = {77A24977-079C-4E02-9717-8B2F684BAA21} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + {52E43EEB-A549-4159-B254-DCA225D7638B} = {52E43EEB-A549-4159-B254-DCA225D7638B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIGCOMP", "..\..\tinySIGCOMP\winrt\tinySIGCOMP.vcxproj", "{F623CBDB-707A-4FDC-ACE0-3D616E239F16}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyHTTP", "..\..\tinyHTTP\winrt\tinyHTTP.vcxproj", "{1A27423C-6535-4A49-96EC-5D209FE125F2}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMEDIA", "..\..\tinyMEDIA\winrt\tinyMEDIA.vcxproj", "{52E43EEB-A549-4159-B254-DCA225D7638B}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMSRP", "..\..\tinyMSRP\winrt\tinyMSRP.vcxproj", "{BE41D117-1D61-4C12-AD9D-B20D02C79687}" + ProjectSection(ProjectDependencies) = postProject + {1A27423C-6535-4A49-96EC-5D209FE125F2} = {1A27423C-6535-4A49-96EC-5D209FE125F2} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "..\..\tinyNET\winrt\tinyNET.vcxproj", "{06E58F9D-28A1-4DD4-AF11-2F5239222CCC}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyRTP", "..\..\tinyRTP\winrt\tinyRTP.vcxproj", "{77A24977-079C-4E02-9717-8B2F684BAA21}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + {52E43EEB-A549-4159-B254-DCA225D7638B} = {52E43EEB-A549-4159-B254-DCA225D7638B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySDP", "..\..\tinySDP\winrt\tinySDP.vcxproj", "{982D737A-0649-4C32-A00E-08992A0B7673}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Debug|ARM.ActiveCfg = Debug|ARM + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Debug|ARM.Build.0 = Debug|ARM + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Debug|Win32.ActiveCfg = Debug|Win32 + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Debug|Win32.Build.0 = Debug|Win32 + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Release|ARM.ActiveCfg = Release|ARM + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Release|ARM.Build.0 = Release|ARM + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Release|Win32.ActiveCfg = Release|Win32 + {0F2C458A-1EDB-4E09-9A22-C2209731CFF2}.Release|Win32.Build.0 = Release|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|ARM.ActiveCfg = Debug|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|ARM.Build.0 = Debug|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|Win32.ActiveCfg = Debug|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|Win32.Build.0 = Debug|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|ARM.ActiveCfg = Release|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|ARM.Build.0 = Release|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|Win32.ActiveCfg = Release|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|Win32.Build.0 = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.ActiveCfg = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.Build.0 = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.Build.0 = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.ActiveCfg = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.Build.0 = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.ActiveCfg = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.Build.0 = Release|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.ActiveCfg = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.Build.0 = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.ActiveCfg = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.Build.0 = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.ActiveCfg = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.Build.0 = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.ActiveCfg = Release|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.Build.0 = Release|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|ARM.ActiveCfg = Debug|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|ARM.Build.0 = Debug|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|Win32.ActiveCfg = Debug|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|Win32.Build.0 = Debug|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|ARM.ActiveCfg = Release|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|ARM.Build.0 = Release|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|Win32.ActiveCfg = Release|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|Win32.Build.0 = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.ActiveCfg = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.Build.0 = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.Build.0 = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.ActiveCfg = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.Build.0 = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.ActiveCfg = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.Build.0 = Release|Win32 + {77A24977-079C-4E02-9717-8B2F684BAA21}.Debug|ARM.ActiveCfg = Debug|ARM + {77A24977-079C-4E02-9717-8B2F684BAA21}.Debug|ARM.Build.0 = Debug|ARM + {77A24977-079C-4E02-9717-8B2F684BAA21}.Debug|Win32.ActiveCfg = Debug|Win32 + {77A24977-079C-4E02-9717-8B2F684BAA21}.Debug|Win32.Build.0 = Debug|Win32 + {77A24977-079C-4E02-9717-8B2F684BAA21}.Release|ARM.ActiveCfg = Release|ARM + {77A24977-079C-4E02-9717-8B2F684BAA21}.Release|ARM.Build.0 = Release|ARM + {77A24977-079C-4E02-9717-8B2F684BAA21}.Release|Win32.ActiveCfg = Release|Win32 + {77A24977-079C-4E02-9717-8B2F684BAA21}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.ActiveCfg = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.Build.0 = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.ActiveCfg = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.Build.0 = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.ActiveCfg = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.Build.0 = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.ActiveCfg = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinyDAV/winrt/tinyDAV.vcxproj b/branches/2.0/doubango/tinyDAV/winrt/tinyDAV.vcxproj new file mode 100644 index 00000000..9543a61a --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/winrt/tinyDAV.vcxproj @@ -0,0 +1,315 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {0f2c458a-1edb-4e09-9a22-c2209731cff2} + tinyDAV + en-US + true + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + HAVE_SRTP=0;HAVE_CUDA=0;HAVE_G729=0;HAVE_BV16=0;HAVE_OPENCORE_AMR=0;HAVE_H264=0;HAVE_ILBC=0;HAVE_LIBGSM=0;HAVE_TINYDSHOW=0;HAVE_DSOUND=0;HAVE_WASAPI=1;HAVE_WAVE_API=0;HAVE_FFMPEG=0;HAVE_SPEEX_DSP=1;HAVE_WEBRTC=0;HAVE_SPEEX_JB=1;HAVE_LIB_SPEEX=1;HAVE_LIBVPX=0;HAVE_LIBYUV=0;G192BITSTREAM=0;DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYDAV_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + ..\..\thirdparties\common\include;..\..\thirdparties\winrt\include;..\include;..\..\tinyMSRP\include;..\..\tinyRTP\include;..\..\tinyMEDIA\include;..\..\tinySDP\include;..\..\tinyNET\src;..\..\tinyDSHOW\include;..\..\tinySAK\src;..\..\thirdparties\winrt\include\BroadVoice16\bvcommon;..\..\thirdparties\winrt\include\BroadVoice16\bv16;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories) + false + Default + + + Console + false + false + true + PhoneAudioSes.lib;"$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyRTP\tinyRTP.lib";"$(SolutionDir)$(Configuration)\tinyMSRP\tinyMSRP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"..\..\thirdparties\winrt\lib\x86\libspeex.lib";"..\..\thirdparties\winrt\lib\x86\libspeexdsp.lib";%(AdditionalDependencies) + LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) + + + + + HAVE_SRTP=0;HAVE_CUDA=0;HAVE_G729=0;HAVE_BV16=0;HAVE_OPENCORE_AMR=0;HAVE_H264=0;HAVE_ILBC=0;HAVE_LIBGSM=0;HAVE_TINYDSHOW=0;HAVE_DSOUND=0;HAVE_WASAPI=1;HAVE_WAVE_API=0;HAVE_FFMPEG=0;HAVE_SPEEX_DSP=1;HAVE_WEBRTC=0;HAVE_SPEEX_JB=1;HAVE_LIB_SPEEX=1;HAVE_LIBVPX=0;HAVE_LIBYUV=0;G192BITSTREAM=0;DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYDAV_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + ..\..\thirdparties\common\include;..\..\thirdparties\winrt\include;..\include;..\..\tinyMSRP\include;..\..\tinyRTP\include;..\..\tinyMEDIA\include;..\..\tinySDP\include;..\..\tinyNET\src;..\..\tinyDSHOW\include;..\..\tinySAK\src;..\..\thirdparties\winrt\include\BroadVoice16\bvcommon;..\..\thirdparties\winrt\include\BroadVoice16\bv16;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories) + Default + + + Console + false + false + true + PhoneAudioSes.lib;"$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyRTP\tinyRTP.lib";"$(SolutionDir)$(Configuration)\tinyMSRP\tinyMSRP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib" + LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) + + + + + HAVE_SRTP=0;HAVE_CUDA=0;HAVE_G729=0;HAVE_BV16=0;HAVE_OPENCORE_AMR=0;HAVE_H264=0;HAVE_ILBC=0;HAVE_LIBGSM=0;HAVE_TINYDSHOW=0;HAVE_DSOUND=0;HAVE_WASAPI=1;HAVE_WAVE_API=0;HAVE_FFMPEG=0;HAVE_SPEEX_DSP=1;HAVE_WEBRTC=0;HAVE_SPEEX_JB=1;HAVE_LIB_SPEEX=1;HAVE_LIBVPX=0;HAVE_LIBYUV=0;G192BITSTREAM=0;DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYDAV_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + ..\..\thirdparties\common\include;..\..\thirdparties\winrt\include;..\include;..\..\tinyMSRP\include;..\..\tinyRTP\include;..\..\tinyMEDIA\include;..\..\tinySDP\include;..\..\tinyNET\src;..\..\tinyDSHOW\include;..\..\tinySAK\src;..\..\thirdparties\winrt\include\BroadVoice16\bvcommon;..\..\thirdparties\winrt\include\BroadVoice16\bv16;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories) + false + Default + + + Console + false + false + true + PhoneAudioSes.lib;"$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyRTP\tinyRTP.lib";"$(SolutionDir)$(Configuration)\tinyMSRP\tinyMSRP.lib";"..\..\thirdparties\winrt\lib\arm\libspeex.lib";"..\..\thirdparties\winrt\lib\arm\libspeexdsp.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib" + LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) + + + + + HAVE_SRTP=0;HAVE_CUDA=0;HAVE_G729=0;HAVE_BV16=0;HAVE_OPENCORE_AMR=0;HAVE_H264=0;HAVE_ILBC=0;HAVE_LIBGSM=0;HAVE_TINYDSHOW=0;HAVE_DSOUND=0;HAVE_WASAPI=1;HAVE_WAVE_API=0;HAVE_FFMPEG=0;HAVE_SPEEX_DSP=1;HAVE_WEBRTC=0;HAVE_SPEEX_JB=1;HAVE_LIB_SPEEX=1;HAVE_LIBVPX=0;HAVE_LIBYUV=0;G192BITSTREAM=0;DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYDAV_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories) + ..\..\thirdparties\common\include;..\..\thirdparties\winrt\include;..\include;..\..\tinyMSRP\include;..\..\tinyRTP\include;..\..\tinyMEDIA\include;..\..\tinySDP\include;..\..\tinyNET\src;..\..\tinyDSHOW\include;..\..\tinySAK\src;..\..\thirdparties\winrt\include\BroadVoice16\bvcommon;..\..\thirdparties\winrt\include\BroadVoice16\bv16;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories) + Default + + + Console + false + false + true + PhoneAudioSes.lib;"$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyRTP\tinyRTP.lib";"$(SolutionDir)$(Configuration)\tinyMSRP\tinyMSRP.lib";"..\..\thirdparties\winrt\lib\arm\libspeex.lib";"..\..\thirdparties\winrt\lib\arm\libspeexdsp.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib" + LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) + + + + + true + false + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + + + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDAV/winrt/tinyDAV.vcxproj.filters b/branches/2.0/doubango/tinyDAV/winrt/tinyDAV.vcxproj.filters new file mode 100644 index 00000000..01007920 --- /dev/null +++ b/branches/2.0/doubango/tinyDAV/winrt/tinyDAV.vcxproj.filters @@ -0,0 +1,571 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {91ae2aff-abf7-4be7-ae92-929c6c0757d2} + + + {2bdf9697-d119-4375-838f-8d96f3b92d2c} + + + {ed6bc633-78b1-4c4b-904e-83014ccdaa7f} + + + {ae21225f-9d4f-413f-be58-d4aebb6056ae} + + + {32b13a77-8afa-454c-b450-e132400322aa} + + + {5d0301e5-b817-4cc7-aaca-f5be841c7ad4} + + + {cf00c044-d934-420c-aadd-3e371eb1a60a} + + + {91e1abd4-abe1-4002-83e0-8199a1dcadd1} + + + {fb9c9c47-f74a-4183-91a2-07e33c3c4010} + + + {b84ecdca-47b8-462d-92d3-a085d58f80dd} + + + {c8cc313e-1fe5-4e00-a2ad-b562d2df6e9b} + + + {e72cf212-b085-4a2c-9334-672ee681fb4b} + + + {734bf1ba-5e70-4f42-8bf4-486b03a13294} + + + {307e4928-4dce-486c-bb89-d65ff671b435} + + + {75adb661-0216-4da7-839e-b32fea9ce316} + + + {f3f9093c-15c3-4975-9637-427a88e522c7} + + + {81fe902c-4cbb-49ab-96e1-b7939d26a73b} + + + {d51722e9-78f0-4b03-b434-3b9c7e00cce7} + + + {effd93f7-1ac8-41e0-8f03-d4106283b1d1} + + + {64e9a7bf-e6b4-41a2-901f-1eeb1ed77a09} + + + {0ff7c06d-017e-48ed-bb99-8d53cbc558d5} + + + {ca98fd86-ede9-4101-ac83-80c3a81fb354} + + + {86432ad4-f891-4faa-ade8-abc4be369a7b} + + + {c4866ac1-114b-464e-9138-ca6f1565159e} + + + {16ae33a2-b133-40a9-a316-2ecea1ae1e5a} + + + {5635ab9e-205a-424b-8887-fb3419752f31} + + + {84e0ef45-0650-4c3b-8635-2bb549a63476} + + + {1065df10-0638-48fd-9d5d-17f7fbee456f} + + + {df2e307a-0e89-495d-a476-8759233edff9} + + + {c5296e69-98fd-4b7a-a50a-9ab83ea2389e} + + + {0142f341-cd21-447a-86e1-5afe48552aa1} + + + {16a3ac83-8653-47ce-9321-f2a6e0e2c940} + + + {de003914-b489-4d75-8956-88d7f8a92ae2} + + + {42776eb4-0f55-4612-a972-d3ba8cbc516d} + + + {a4b4e81f-a75f-49bc-b5ea-4c540cc57a59} + + + {d87495d4-2f54-4cc1-8c97-2b51dac6f274} + + + {cb8beb57-a3c6-48c3-854e-2eb806ae6368} + + + {1c04d58e-a2f9-4fbf-a09f-82c54152cfc1} + + + {5aa9fca2-9736-4847-82b9-8b6ec661f3ea} + + + {242aa391-53ba-448b-8675-df3d3b76d457} + + + {419d8f63-0cd8-4f93-8e78-72e94a0844c6} + + + {41171757-2466-426b-9605-56de38b572a6} + + + {8a8c95e7-a82b-4eac-9e03-590577c59788} + + + {75a9530b-ad6b-4877-8631-b2a5ecc323ff} + + + {1615bb41-f385-4146-a833-be4d1d596acb} + + + {d6697037-0de3-4913-aac5-f2711f8a7b4e} + + + {55fa33ea-df98-40e0-aace-8fda2c42e5c8} + + + {adc18bff-c4af-4fa7-8819-45617c2a00be} + + + {81a86200-e2db-40b0-8b64-5ff4fc3032a0} + + + {960f0f40-e50c-46c7-98f3-3c72102f69ba} + + + {b04afc73-09b5-4e2c-938b-8eabfca3bcaf} + + + {f6669e0f-9d9b-47d6-b23b-45b83524021a} + + + {4375a26a-b096-4629-8629-7363e3779259} + + + {b4fca93a-2d7d-4b7a-887d-c77a3f6ad3c1} + + + {9a4b3771-911d-45f4-878c-24b3b72a0095} + + + {c504db68-5fee-43d9-aa41-81181dcebea9} + + + {027bad53-6055-4c06-a52c-3c88a5dd51ac} + + + {a66f8969-d191-4178-9ccf-46a1e6d87e39} + + + {8559189f-951a-48e8-a662-902f38bf40a2} + + + {90bbc85a-20d3-43aa-b5d5-3ced47011e3a} + + + {c4d8c96b-0744-43e0-9915-7af04371a763} + + + {d2c14c22-142c-47bb-b5a7-e5ef707fa05e} + + + {b4d1028f-270b-465d-baf6-255dacdfe8a0} + + + + + include + + + include + + + include\tinydav + + + include\tinydav + + + include\tinydav + + + include\tinydav + + + include\tinydav\audio + + + include\tinydav\audio + + + include\tinydav\audio + + + include\tinydav\audio + + + include\tinydav\audio + + + include\tinydav\audio + + + include\tinydav\audio + + + include\tinydav\audio + + + include\tinydav\audio + + + include\tinydav\audio\coreaudio + + + include\tinydav\audio\coreaudio + + + include\tinydav\audio\coreaudio + + + include\tinydav\audio\coreaudio + + + include\tinydav\audio\coreaudio + + + include\tinydav\audio\directsound + + + include\tinydav\audio\directsound + + + include\tinydav\audio\waveapi + + + include\tinydav\audio\waveapi + + + include\tinydav\codecs\amr + + + include\tinydav\codecs\bv + + + include\tinydav\codecs\bv + + + include\tinydav\codecs\dtmf + + + include\tinydav\codecs\fec + + + include\tinydav\codecs\fec + + + include\tinydav\codecs\g711 + + + include\tinydav\codecs\g711 + + + include\tinydav\codecs\g722 + + + include\tinydav\codecs\g722 + + + include\tinydav\codecs\g729 + + + include\tinydav\codecs\gsm + + + include\tinydav\codecs\h261 + + + include\tinydav\codecs\h263 + + + include\tinydav\codecs\h264 + + + include\tinydav\codecs\h264 + + + include\tinydav\codecs\h264 + + + include\tinydav\codecs\h264 + + + include\tinydav\codecs\ilbc + + + include\tinydav\codecs\mp4ves + + + include\tinydav\codecs\msrp + + + include\tinydav\codecs\vpx + + + include\tinydav\codecs\theora + + + include\tinydav\codecs\t140 + + + include\tinydav\codecs\speex + + + include\tinydav\msrp + + + include\tinydav\msrp + + + include\tinydav\msrp + + + include\tinydav\video + + + include\tinydav\video + + + include\tinydav\video + + + include\tinydav\video + + + include\tinydav\video\jb + + + include\tinydav\video\jb + + + include\tinydav\t140 + + + include\tinydav\t140 + + + include\tinydav\t140 + + + include\tinydav\audio\wasapi + + + include\tinydav\audio\wasapi + + + + + src + + + src + + + src + + + src\audio + + + src\audio + + + src\audio + + + src\audio + + + src\audio + + + src\audio + + + src\audio + + + src\audio + + + src\audio + + + src\audio\coreaudio + + + src\audio\coreaudio + + + src\audio\coreaudio + + + src\audio\coreaudio + + + src\audio\coreaudio + + + src\audio\directsound + + + src\audio\directsound + + + src\audio\waveapi + + + src\audio\waveapi + + + src\codecs\amr + + + src\codecs\bv + + + src\codecs\bv + + + src\codecs\dtmf + + + src\codecs\fec + + + src\codecs\fec + + + src\codecs\g711 + + + src\codecs\g711 + + + src\codecs\g722 + + + src\codecs\g722 + + + src\codecs\g722 + + + src\codecs\g729 + + + src\codecs\gsm + + + src\codecs\h261 + + + src\codecs\h263 + + + src\codecs\h264 + + + src\codecs\h264 + + + src\codecs\h264 + + + src\codecs\ilbc + + + src\codecs\mp4ves + + + src\codecs\msrp + + + src\codecs\vpx + + + src\codecs\theora + + + src\codecs\t140 + + + src\codecs\speex + + + src\msrp + + + src\msrp + + + src\msrp + + + src\t140 + + + src\t140 + + + src\t140 + + + src\video + + + src\video + + + src\video + + + src\video + + + src\video\jb + + + src\video\jb + + + src\audio\wasapi + + + src\audio\wasapi + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj b/branches/2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj index 5a4d2fba..9f747c66 100644 --- a/branches/2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj +++ b/branches/2.0/doubango/tinyDSHOW/tinyDSHOW.vcproj @@ -1,7 +1,7 @@ + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {1a27423c-6535-4a49-96ec-5d209fe125f2} + tinyHTTP + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + _USRDLL;DEBUG_LEVEL=DEBUG_LEVEL_INFO;TINYHTTP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinyHTTP\include;..\..\tinySAK\src;..\..\tinyNET\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";%(AdditionalDependencies) + + + + + _USRDLL;DEBUG_LEVEL=DEBUG_LEVEL_INFO;TINYHTTP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinyHTTP\include;..\..\tinySAK\src;..\..\tinyNET\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";%(AdditionalDependencies) + + + + + _USRDLL;DEBUG_LEVEL=DEBUG_LEVEL_INFO;TINYHTTP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinyHTTP\include;..\..\tinySAK\src;..\..\tinyNET\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";%(AdditionalDependencies) + + + + + _USRDLL;DEBUG_LEVEL=DEBUG_LEVEL_INFO;TINYHTTP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinyHTTP\include;..\..\tinySAK\src;..\..\tinyNET\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyHTTP/winrt/tinyHTTP.vcxproj.filters b/branches/2.0/doubango/tinyHTTP/winrt/tinyHTTP.vcxproj.filters new file mode 100644 index 00000000..ac255332 --- /dev/null +++ b/branches/2.0/doubango/tinyHTTP/winrt/tinyHTTP.vcxproj.filters @@ -0,0 +1,190 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {4611bad8-e0cf-4382-95ae-927ea2b13a3f} + + + {b249deed-a615-4893-b37e-7a4ddc5979a5} + + + {f219d33f-676c-44a2-bc54-56b3a50c9717} + + + {3354f132-438e-4ac9-bb47-1bcfc24e647d} + + + {dfb8f1c2-a18b-4615-bc7c-d218b96fa19c} + + + {46325458-d103-481c-b638-a474bf2179da} + + + {cc075687-9a1f-4345-8f96-79b1a32bd768} + + + {fa637b4f-9147-498a-b8ab-7bb9074978ac} + + + {4f2ab383-72bd-4596-adf1-863817561296} + + + + + include + + + include + + + include + + + include\tinyhttp + + + include\tinyhttp + + + include\tinyhttp + + + include\tinyhttp + + + include\tinyhttp + + + include\tinyhttp + + + include\tinyhttp\auth + + + include\tinyhttp\auth + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\headers + + + include\tinyhttp\parsers + + + include\tinyhttp\parsers + + + include\tinyhttp\parsers + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src\auth + + + src\auth + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\parsers + + + src\parsers + + + src\parsers + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyIPSec/src/tinyipsec_config.h b/branches/2.0/doubango/tinyIPSec/src/tinyipsec_config.h index ede3c2d3..02db1dff 100644 --- a/branches/2.0/doubango/tinyIPSec/src/tinyipsec_config.h +++ b/branches/2.0/doubango/tinyIPSec/src/tinyipsec_config.h @@ -27,10 +27,12 @@ #undef _WIN32 /* Because of WINSCW */ #endif -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TIPSEC_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TIPSEC_UNDER_WINDOWS_RT 1 +# endif #endif /* Used on Windows and Symbian systems to export/import public functions and global variables. @@ -38,7 +40,7 @@ #if !defined(__GNUC__) && defined(TINYIPSEC_EXPORTS) # define TINYIPSEC_API __declspec(dllexport) # define TINYIPSEC_GEXTERN __declspec(dllexport) -#elif !defined(__GNUC__) /*&& defined(TINYIPSEC_IMPORTS)*/ +#elif !defined(__GNUC__) && !defined(TINYIPSEC_IMPORTS_IGNORE) # define TINYIPSEC_API __declspec(dllimport) # define TINYIPSEC_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.sln b/branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.sln new file mode 100644 index 00000000..c48527d4 --- /dev/null +++ b/branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyIPSec", "tinyIPSec.vcxproj", "{0875A083-5118-40CC-941E-722B00295A5B}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|ARM.ActiveCfg = Debug|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|ARM.Build.0 = Debug|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|Win32.ActiveCfg = Debug|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|Win32.Build.0 = Debug|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Release|ARM.ActiveCfg = Release|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Release|ARM.Build.0 = Release|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Release|Win32.ActiveCfg = Release|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.vcxproj b/branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.vcxproj new file mode 100644 index 00000000..6df6aecb --- /dev/null +++ b/branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.vcxproj @@ -0,0 +1,173 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {0875a083-5118-40cc-941e-722b00295a5b} + tinyIPSec + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + HAVE_IPSEC=0;WIN32;_USRDLL;TINYIPSEC_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + HAVE_IPSEC=0;WIN32;_USRDLL;TINYIPSEC_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + HAVE_IPSEC=0;WIN32;_USRDLL;TINYIPSEC_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + HAVE_IPSEC=0;WIN32;_USRDLL;TINYIPSEC_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.vcxproj.filters b/branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.vcxproj.filters new file mode 100644 index 00000000..62709fed --- /dev/null +++ b/branches/2.0/doubango/tinyIPSec/winrt/tinyIPSec.vcxproj.filters @@ -0,0 +1,52 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {a0b96d43-37de-447f-99c2-62e98492f21e} + + + {23d25157-a053-4dce-8dfa-dbb71fe17a05} + + + + + src + + + src + + + src + + + src + + + src + + + + + include + + + include + + + include + + + include + + + include + + + include + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec.h index a1b4329f..b50d4895 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_codec.h @@ -215,6 +215,8 @@ typedef struct tmedia_codec_s tmedia_bandwidth_level_t bl; // @deprecated //! the negociated format (only useful for codecs with dyn. payload type) char* neg_format; + //! whether this is a passthrough codec + tsk_bool_t passthrough; //! plugin used to create the codec const struct tmedia_codec_plugin_def_s* plugin; diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_consumer.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_consumer.h index bcb934bc..b67cd439 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_consumer.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_consumer.h @@ -96,6 +96,12 @@ typedef struct tmedia_consumer_s tsk_bool_t is_started; tsk_bool_t is_prepared; uint64_t session_id; + + struct{ + enum tmedia_codec_id_e codec_id; + // other options to be added + } decoder; + const struct tmedia_consumer_plugin_def_s* plugin; } tmedia_consumer_t; diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_producer.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_producer.h index e056733e..86be93aa 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_producer.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_producer.h @@ -85,6 +85,11 @@ typedef struct tmedia_producer_s tsk_bool_t is_started; uint64_t session_id; + struct{ + enum tmedia_codec_id_e codec_id; + // other options to be added + } encoder; + struct{ tmedia_producer_enc_cb_f callback; const void* callback_data; diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_resampler.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_resampler.h index ebd0f513..8b3e8c97 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_resampler.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_resampler.h @@ -64,14 +64,14 @@ typedef struct tmedia_resampler_plugin_def_s const char* desc; // ! quality is from 0-10 - int (* open) (tmedia_resampler_t*, uint32_t in_freq, uint32_t out_freq, tsk_size_t frame_duration, int8_t channels, uint32_t quality); + int (* open) (tmedia_resampler_t* self, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t in_channels, uint32_t out_channels, uint32_t quality); tsk_size_t (* process) (tmedia_resampler_t*, const uint16_t* in_data, tsk_size_t in_size_in_short, uint16_t* out_data, tsk_size_t out_size_in_short); int (* close) (tmedia_resampler_t* ); } tmedia_resampler_plugin_def_t; TINYMEDIA_API int tmedia_resampler_init(tmedia_resampler_t* self); -TINYMEDIA_API int tmedia_resampler_open(tmedia_resampler_t* self, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t channels, uint32_t quality); +TINYMEDIA_API int tmedia_resampler_open(tmedia_resampler_t* self, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t in_channels, uint32_t out_channels, uint32_t quality); TINYMEDIA_API tsk_size_t tmedia_resampler_process(tmedia_resampler_t* self, const uint16_t* in_data, tsk_size_t in_size_in_short, uint16_t* out_data, tsk_size_t out_size_in_short); TINYMEDIA_API int tmedia_resampler_close(tmedia_resampler_t* self); TINYMEDIA_API int tmedia_resampler_deinit(tmedia_resampler_t* self); diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia_config.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia_config.h index 459aa51f..207ae683 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia_config.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia_config.h @@ -27,16 +27,18 @@ #undef _WIN32 /* Because of WINSCW */ #endif -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition. #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TMEDIA_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TMEDIA_UNDER_WINDOWS_RT 1 +# endif #endif #if (TMEDIA_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYMEDIA_EXPORTS) # define TINYMEDIA_API __declspec(dllexport) -# define TINYMEDIA_GEXTERN __declspec(dllexport) -#elif (TMEDIA_UNDER_WINDOWS || defined(__SYMBIAN32__)) /*&& defined(TINYMEDIA_IMPORTS)*/ +# define TINYMEDIA_GEXTERN extern __declspec(dllexport) +#elif (TMEDIA_UNDER_WINDOWS || defined(__SYMBIAN32__)) && !defined(TINYMEDIA_IMPORTS_IGNORE) # define TINYMEDIA_API __declspec(dllimport) # define TINYMEDIA_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_content_cpim.rl b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_content_cpim.rl index f3b8d2d9..357d57db 100644 --- a/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_content_cpim.rl +++ b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_content_cpim.rl @@ -136,7 +136,7 @@ static int tmedia_content_cpim_parse(tmedia_content_t* self, const void* in_data const char *pe = p + in_size; const char *eof = pe; - const char *tag_start; + const char *tag_start = tsk_null; char* hname = tsk_null; char* hvalue = tsk_null; diff --git a/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_imageattr.rl b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_imageattr.rl index 8429b955..4da345bb 100644 --- a/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_imageattr.rl +++ b/branches/2.0/doubango/tinyMEDIA/ragel/tmedia_imageattr.rl @@ -160,12 +160,12 @@ int tmedia_imageattr_parse(tmedia_imageattr_xt* self, const void* in_data, tsk_s const char *pe = p + in_size; const char *eof = pe; - const char *tag_start; + const char *tag_start = tsk_null; - tmedia_imageattr_set_xt* sets; - tsk_size_t* sets_count; - tmedia_imageattr_xyrange_xt* xyrange; - tmedia_imageattr_srange_xt* srange; + tmedia_imageattr_set_xt* sets = tsk_null; + tsk_size_t* sets_count = tsk_null; + tmedia_imageattr_xyrange_xt* xyrange = tsk_null; + tmedia_imageattr_srange_xt* srange = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content_cpim.c b/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content_cpim.c index 66d82b2e..634f46d0 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content_cpim.c +++ b/branches/2.0/doubango/tinyMEDIA/src/content/tmedia_content_cpim.c @@ -77,7 +77,7 @@ static int tmedia_content_cpim_parse(tmedia_content_t* self, const void* in_data const char *pe = p + in_size; const char *eof = pe; - const char *tag_start; + const char *tag_start = tsk_null; char* hname = tsk_null; char* hvalue = tsk_null; diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_imageattr.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_imageattr.c index a65ae2d4..21c5459c 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_imageattr.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_imageattr.c @@ -63,12 +63,12 @@ int tmedia_imageattr_parse(tmedia_imageattr_xt* self, const void* in_data, tsk_s const char *pe = p + in_size; const char *eof = pe; - const char *tag_start; + const char *tag_start = tsk_null; - tmedia_imageattr_set_xt* sets; - tsk_size_t* sets_count; - tmedia_imageattr_xyrange_xt* xyrange; - tmedia_imageattr_srange_xt* srange; + tmedia_imageattr_set_xt* sets = tsk_null; + tsk_size_t* sets_count = tsk_null; + tmedia_imageattr_xyrange_xt* xyrange = tsk_null; + tmedia_imageattr_srange_xt* srange = tsk_null; /* #line 75 "./src/tmedia_imageattr.c" */ diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_resampler.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_resampler.c index 2190a24a..a7c70316 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_resampler.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_resampler.c @@ -40,7 +40,7 @@ int tmedia_resampler_init(tmedia_resampler_t* self) return 0; } -int tmedia_resampler_open(tmedia_resampler_t* self, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t channels, uint32_t quality) +int tmedia_resampler_open(tmedia_resampler_t* self, uint32_t in_freq, uint32_t out_freq, uint32_t frame_duration, uint32_t in_channels, uint32_t out_channels, uint32_t quality) { int ret; @@ -53,7 +53,7 @@ int tmedia_resampler_open(tmedia_resampler_t* self, uint32_t in_freq, uint32_t o return 0; } - if((ret = self->plugin->open(self, in_freq, out_freq, frame_duration, channels, quality))){ + if((ret = self->plugin->open(self, in_freq, out_freq, frame_duration, in_channels, out_channels, quality))){ TSK_DEBUG_ERROR("Failed to open [%s] resamplerr", self->plugin->desc); return ret; } @@ -142,7 +142,7 @@ tmedia_resampler_t* tmedia_resampler_create() tmedia_resampler_t* resampler = tsk_null; if(__tmedia_resampler_plugin){ - if((resampler = tsk_object_new(__tmedia_resampler_plugin->objdef))){ + if((resampler = (tmedia_resampler_t*)tsk_object_new(__tmedia_resampler_plugin->objdef))){ resampler->plugin = __tmedia_resampler_plugin; } } diff --git a/branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.sln b/branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.sln new file mode 100644 index 00000000..a07b884a --- /dev/null +++ b/branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.sln @@ -0,0 +1,67 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMEDIA", "tinyMEDIA.vcxproj", "{52E43EEB-A549-4159-B254-DCA225D7638B}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySDP", "..\..\tinySDP\winrt\tinySDP.vcxproj", "{982D737A-0649-4C32-A00E-08992A0B7673}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "..\..\tinyNET\winrt\tinyNET.vcxproj", "{06E58F9D-28A1-4DD4-AF11-2F5239222CCC}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.ActiveCfg = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.Build.0 = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.ActiveCfg = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.Build.0 = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.ActiveCfg = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.Build.0 = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.ActiveCfg = Release|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.ActiveCfg = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.Build.0 = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.ActiveCfg = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.Build.0 = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.ActiveCfg = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.Build.0 = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.ActiveCfg = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.Build.0 = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.ActiveCfg = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.Build.0 = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.Build.0 = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.ActiveCfg = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.Build.0 = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.ActiveCfg = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.vcxproj b/branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.vcxproj new file mode 100644 index 00000000..92a53589 --- /dev/null +++ b/branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.vcxproj @@ -0,0 +1,208 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {52e43eeb-a549-4159-b254-dca225d7638b} + tinyMEDIA + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYMEDIA_EXPORTS;FLIP_ENCODED_PICT=1;FLIP_DECODED_PICT=1;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\include;..\..\tinySAK\src;..\..\tinySDP\include;..\..\tinyNET\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYMEDIA_EXPORTS;FLIP_ENCODED_PICT=1;FLIP_DECODED_PICT=1;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\include;..\..\tinySAK\src;..\..\tinySDP\include;..\..\tinyNET\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYMEDIA_EXPORTS;FLIP_ENCODED_PICT=1;FLIP_DECODED_PICT=1;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\include;..\..\tinySAK\src;..\..\tinySDP\include;..\..\tinyNET\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYMEDIA_EXPORTS;FLIP_ENCODED_PICT=1;FLIP_DECODED_PICT=1;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\include;..\..\tinySAK\src;..\..\tinySDP\include;..\..\tinyNET\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.vcxproj.filters b/branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.vcxproj.filters new file mode 100644 index 00000000..0fade0c0 --- /dev/null +++ b/branches/2.0/doubango/tinyMEDIA/winrt/tinyMEDIA.vcxproj.filters @@ -0,0 +1,166 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {c89a9764-c625-4c3b-9980-30c97b440ea3} + + + {8f205ba6-84f7-4863-bd40-9d93b94228d5} + + + {1224fd1c-e1b6-4ced-94e1-03465211556c} + + + {c4c0550e-c464-4135-a8a5-502a39b79795} + + + {19e7973f-0178-4b2a-98e2-7b8f0f41672d} + + + + + include + + + include + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia + + + include\tinymedia\content + + + include\tinymedia\content + + + include\tinymedia\content + + + include\tinymedia\content + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src\content + + + src\content + + + src\content + + + src\content + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyMSRP/include/tinymsrp_config.h b/branches/2.0/doubango/tinyMSRP/include/tinymsrp_config.h index 0a324340..f7229936 100644 --- a/branches/2.0/doubango/tinyMSRP/include/tinymsrp_config.h +++ b/branches/2.0/doubango/tinyMSRP/include/tinymsrp_config.h @@ -38,18 +38,20 @@ #undef _WIN32 /* Because of WINSCW */ #endif -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition. #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TMSRP_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TMSRP_UNDER_WINDOWS_RT 1 +# endif #endif /* Used on Windows and Symbian systems to export/import public functions and global variables. */ #if !defined(__GNUC__) && defined(TINYMSRP_EXPORTS) # define TINYMSRP_API __declspec(dllexport) -# define TINYMSRP_GEXTERN __declspec(dllexport) -#elif !defined(__GNUC__) /*&& defined(TINYMSRP_IMPORTS)*/ +# define TINYMSRP_GEXTERN extern __declspec(dllexport) +#elif !defined(__GNUC__) && !defined(TINYMSRP_IMPORTS_IGNORE) # define TINYMSRP_API __declspec(dllimport) # define TINYMSRP_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Byte-Range.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Byte-Range.rl index e22ede2c..0cb7b528 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Byte-Range.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Byte-Range.rl @@ -125,7 +125,7 @@ tmsrp_header_Byte_Range_t *tmsrp_header_Byte_Range_parse(const char *data, tsk_s const char *eof = pe; tmsrp_header_Byte_Range_t *hdr_Byte_Range = tmsrp_header_Byte_Range_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Content-Type.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Content-Type.rl index 421a7cb7..b0cd2c55 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Content-Type.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Content-Type.rl @@ -111,7 +111,7 @@ tmsrp_header_Content_Type_t *tmsrp_header_Content_Type_parse(const char *data, t const char *eof = pe; tmsrp_header_Content_Type_t *hdr_ctype = tmsrp_header_Content_Type_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Dummy.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Dummy.rl index 3a967a25..ce618d80 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Dummy.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Dummy.rl @@ -96,7 +96,7 @@ tmsrp_header_Dummy_t *tmsrp_header_Dummy_parse(const char *data, tsk_size_t size const char *eof = pe; tmsrp_header_Dummy_t *hdr_Dummy = tmsrp_header_Dummy_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Expires.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Expires.rl index 0d1d7cc2..7077d080 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Expires.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Expires.rl @@ -92,7 +92,7 @@ tmsrp_header_Expires_t *tmsrp_header_Expires_parse(const char *data, tsk_size_t const char *eof = pe; tmsrp_header_Expires_t *hdr_Expires = tmsrp_header_Expires_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_From-Path.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_From-Path.rl index 2b6c1b91..80750542 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_From-Path.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_From-Path.rl @@ -111,7 +111,7 @@ tmsrp_header_From_Path_t *tmsrp_header_From_Path_parse(const char *data, tsk_siz const char *eof = pe; tmsrp_header_From_Path_t *header = tmsrp_header_From_Path_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Max-Expires.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Max-Expires.rl index e3f8e7d9..54d9066a 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Max-Expires.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Max-Expires.rl @@ -92,7 +92,7 @@ tmsrp_header_Max_Expires_t *tmsrp_header_Max_Expires_parse(const char *data, tsk const char *eof = pe; tmsrp_header_Max_Expires_t *hdr_Max_Expires = tmsrp_header_Max_Expires_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Message-ID.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Message-ID.rl index 3f666b33..1f55eeb1 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Message-ID.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Message-ID.rl @@ -94,7 +94,7 @@ tmsrp_header_Message_ID_t *tmsrp_header_Message_ID_parse(const char *data, tsk_s const char *eof = pe; tmsrp_header_Message_ID_t *hdr_Message_Id = tmsrp_header_Message_ID_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Min-Expires.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Min-Expires.rl index 6945bbaa..21f23530 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Min-Expires.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Min-Expires.rl @@ -92,7 +92,7 @@ tmsrp_header_Min_Expires_t *tmsrp_header_Min_Expires_parse(const char *data, tsk const char *eof = pe; tmsrp_header_Min_Expires_t *hdr_Min_Expires = tmsrp_header_Min_Expires_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Status.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Status.rl index 770ab208..4c948ca1 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Status.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Status.rl @@ -108,7 +108,7 @@ tmsrp_header_Status_t *tmsrp_header_Status_parse(const char *data, tsk_size_t si const char *eof = pe; tmsrp_header_Status_t *hdr_Status = tmsrp_header_Status_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_To-Path.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_To-Path.rl index e3c39bb4..4e3333cb 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_To-Path.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_To-Path.rl @@ -110,7 +110,7 @@ tmsrp_header_To_Path_t *tmsrp_header_To_Path_parse(const char *data, tsk_size_t const char *eof = pe; tmsrp_header_To_Path_t *header = tmsrp_header_To_Path_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Use-Path.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Use-Path.rl index 934e56e4..079ed18b 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Use-Path.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_header_Use-Path.rl @@ -112,7 +112,7 @@ tmsrp_header_Use_Path_t *tmsrp_header_Use_Path_parse(const char *data, tsk_size_ const char *eof = pe; tmsrp_header_Use_Path_t *header = tmsrp_header_Use_Path_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_uri.rl b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_uri.rl index 30e53b86..3d90c459 100644 --- a/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_uri.rl +++ b/branches/2.0/doubango/tinyMSRP/ragel/tmsrp_parser_uri.rl @@ -119,7 +119,7 @@ tmsrp_uri_t *tmsrp_uri_parse(const char *data, tsk_size_t size) const char *eof = pe; tmsrp_uri_t *uri = tmsrp_uri_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Byte-Range.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Byte-Range.c index 8df9575d..efb247f1 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Byte-Range.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Byte-Range.c @@ -88,7 +88,7 @@ tmsrp_header_Byte_Range_t *tmsrp_header_Byte_Range_parse(const char *data, tsk_s const char *eof = pe; tmsrp_header_Byte_Range_t *hdr_Byte_Range = tmsrp_header_Byte_Range_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 95 "./src/headers/tmsrp_header_Byte-Range.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Content-Type.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Content-Type.c index 4936008c..acb0f472 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Content-Type.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Content-Type.c @@ -85,7 +85,7 @@ tmsrp_header_Content_Type_t *tmsrp_header_Content_Type_parse(const char *data, t const char *eof = pe; tmsrp_header_Content_Type_t *hdr_ctype = tmsrp_header_Content_Type_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 92 "./src/headers/tmsrp_header_Content-Type.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Dummy.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Dummy.c index 3775f134..4cb38f3c 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Dummy.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Dummy.c @@ -76,7 +76,7 @@ tmsrp_header_Dummy_t *tmsrp_header_Dummy_parse(const char *data, tsk_size_t size const char *eof = pe; tmsrp_header_Dummy_t *hdr_Dummy = tmsrp_header_Dummy_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 83 "./src/headers/tmsrp_header_Dummy.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Expires.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Expires.c index c45794a8..7376b0f3 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Expires.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Expires.c @@ -76,7 +76,7 @@ tmsrp_header_Expires_t *tmsrp_header_Expires_parse(const char *data, tsk_size_t const char *eof = pe; tmsrp_header_Expires_t *hdr_Expires = tmsrp_header_Expires_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 83 "./src/headers/tmsrp_header_Expires.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_From-Path.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_From-Path.c index b541cb6c..21dffb11 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_From-Path.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_From-Path.c @@ -81,7 +81,7 @@ tmsrp_header_From_Path_t *tmsrp_header_From_Path_parse(const char *data, tsk_siz const char *eof = pe; tmsrp_header_From_Path_t *header = tmsrp_header_From_Path_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 88 "./src/headers/tmsrp_header_From-Path.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Max-Expires.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Max-Expires.c index bb6fecc4..292f3dc0 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Max-Expires.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Max-Expires.c @@ -76,7 +76,7 @@ tmsrp_header_Max_Expires_t *tmsrp_header_Max_Expires_parse(const char *data, tsk const char *eof = pe; tmsrp_header_Max_Expires_t *hdr_Max_Expires = tmsrp_header_Max_Expires_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 83 "./src/headers/tmsrp_header_Max-Expires.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Message-ID.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Message-ID.c index caeb74b3..0356d74b 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Message-ID.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Message-ID.c @@ -78,7 +78,7 @@ tmsrp_header_Message_ID_t *tmsrp_header_Message_ID_parse(const char *data, tsk_s const char *eof = pe; tmsrp_header_Message_ID_t *hdr_Message_Id = tmsrp_header_Message_ID_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 85 "./src/headers/tmsrp_header_Message-ID.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Min-Expires.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Min-Expires.c index 3bc31694..22ce4ed5 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Min-Expires.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Min-Expires.c @@ -76,7 +76,7 @@ tmsrp_header_Min_Expires_t *tmsrp_header_Min_Expires_parse(const char *data, tsk const char *eof = pe; tmsrp_header_Min_Expires_t *hdr_Min_Expires = tmsrp_header_Min_Expires_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 83 "./src/headers/tmsrp_header_Min-Expires.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Status.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Status.c index abd1c66a..ef5d4d19 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Status.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Status.c @@ -82,7 +82,7 @@ tmsrp_header_Status_t *tmsrp_header_Status_parse(const char *data, tsk_size_t si const char *eof = pe; tmsrp_header_Status_t *hdr_Status = tmsrp_header_Status_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 89 "./src/headers/tmsrp_header_Status.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_To-Path.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_To-Path.c index 5b2fe4dc..b5f0e15d 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_To-Path.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_To-Path.c @@ -80,7 +80,7 @@ tmsrp_header_To_Path_t *tmsrp_header_To_Path_parse(const char *data, tsk_size_t const char *eof = pe; tmsrp_header_To_Path_t *header = tmsrp_header_To_Path_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 87 "./src/headers/tmsrp_header_To-Path.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Use-Path.c b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Use-Path.c index 62ffe9bf..631abcd6 100644 --- a/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Use-Path.c +++ b/branches/2.0/doubango/tinyMSRP/src/headers/tmsrp_header_Use-Path.c @@ -82,7 +82,7 @@ tmsrp_header_Use_Path_t *tmsrp_header_Use_Path_parse(const char *data, tsk_size_ const char *eof = pe; tmsrp_header_Use_Path_t *header = tmsrp_header_Use_Path_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 89 "./src/headers/tmsrp_header_Use-Path.c" */ diff --git a/branches/2.0/doubango/tinyMSRP/src/parsers/tmsrp_parser_uri.c b/branches/2.0/doubango/tinyMSRP/src/parsers/tmsrp_parser_uri.c index 20625476..13656df0 100644 --- a/branches/2.0/doubango/tinyMSRP/src/parsers/tmsrp_parser_uri.c +++ b/branches/2.0/doubango/tinyMSRP/src/parsers/tmsrp_parser_uri.c @@ -52,7 +52,7 @@ tmsrp_uri_t *tmsrp_uri_parse(const char *data, tsk_size_t size) const char *eof = pe; tmsrp_uri_t *uri = tmsrp_uri_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 59 "./src/parsers/tmsrp_parser_uri.c" */ 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 66152c06..5fdf86fe 100644 --- a/branches/2.0/doubango/tinyMSRP/src/session/tmsrp_sender.c +++ b/branches/2.0/doubango/tinyMSRP/src/session/tmsrp_sender.c @@ -38,12 +38,12 @@ #include "tsk_debug.h" -static void *run(void* self); +static void* TSK_STDCALL run(void* self); tmsrp_sender_t* tmsrp_sender_create(tmsrp_config_t* config, tnet_fd_t fd) { - return tsk_object_new(tmsrp_sender_def_t, config, fd); + return (tmsrp_sender_t*)tsk_object_new(tmsrp_sender_def_t, config, fd); } int tmsrp_sender_set_fd(tmsrp_sender_t* self, tnet_fd_t fd) @@ -138,10 +138,10 @@ bail: -void *run(void* self) +static void* TSK_STDCALL run(void* self) { tsk_list_item_t *curr; - tmsrp_sender_t *sender = self; + tmsrp_sender_t *sender = (tmsrp_sender_t*)self; tmsrp_data_out_t *data_out; tsk_buffer_t* chunck, *message = tsk_buffer_create_null(); tsk_size_t start; @@ -252,9 +252,9 @@ void *run(void* self) // static void* tmsrp_sender_ctor(tsk_object_t * self, va_list *app) { - tmsrp_sender_t *sender = self; + tmsrp_sender_t *sender = (tmsrp_sender_t*)self; if(sender){ - sender->config = tsk_object_ref(va_arg(*app, tmsrp_config_t*)); + sender->config = (tmsrp_config_t*)tsk_object_ref(va_arg(*app, tmsrp_config_t*)); sender->fd = va_arg(*app, tnet_fd_t); sender->outgoingList = tsk_list_create(); diff --git a/branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.sln b/branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.sln new file mode 100644 index 00000000..e7dd0b31 --- /dev/null +++ b/branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.sln @@ -0,0 +1,98 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMSRP", "tinyMSRP.vcxproj", "{BE41D117-1D61-4C12-AD9D-B20D02C79687}" + ProjectSection(ProjectDependencies) = postProject + {1A27423C-6535-4A49-96EC-5D209FE125F2} = {1A27423C-6535-4A49-96EC-5D209FE125F2} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + {52E43EEB-A549-4159-B254-DCA225D7638B} = {52E43EEB-A549-4159-B254-DCA225D7638B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyHTTP", "..\..\tinyHTTP\winrt\tinyHTTP.vcxproj", "{1A27423C-6535-4A49-96EC-5D209FE125F2}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMEDIA", "..\..\tinyMEDIA\winrt\tinyMEDIA.vcxproj", "{52E43EEB-A549-4159-B254-DCA225D7638B}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "..\..\tinyNET\winrt\tinyNET.vcxproj", "{06E58F9D-28A1-4DD4-AF11-2F5239222CCC}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySDP", "..\..\tinySDP\winrt\tinySDP.vcxproj", "{982D737A-0649-4C32-A00E-08992A0B7673}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|ARM.ActiveCfg = Debug|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|ARM.Build.0 = Debug|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|Win32.ActiveCfg = Debug|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Debug|Win32.Build.0 = Debug|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|ARM.ActiveCfg = Release|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|ARM.Build.0 = Release|ARM + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|Win32.ActiveCfg = Release|Win32 + {BE41D117-1D61-4C12-AD9D-B20D02C79687}.Release|Win32.Build.0 = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.ActiveCfg = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.Build.0 = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.Build.0 = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.ActiveCfg = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.Build.0 = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.ActiveCfg = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.Build.0 = Release|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.ActiveCfg = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.Build.0 = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.ActiveCfg = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.Build.0 = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.ActiveCfg = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.Build.0 = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.ActiveCfg = Release|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.Build.0 = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.ActiveCfg = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.Build.0 = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.Build.0 = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.ActiveCfg = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.Build.0 = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.ActiveCfg = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.ActiveCfg = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.Build.0 = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.ActiveCfg = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.Build.0 = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.ActiveCfg = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.Build.0 = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.ActiveCfg = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.vcxproj b/branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.vcxproj new file mode 100644 index 00000000..b3450d46 --- /dev/null +++ b/branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.vcxproj @@ -0,0 +1,219 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {be41d117-1d61-4c12-ad9d-b20d02c79687} + tinyMSRP + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYMSRP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\tinyMSRP\include;..\..\tinyHTTP\include;..\..\tinySDP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYMSRP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\tinyMSRP\include;..\..\tinyHTTP\include;..\..\tinySDP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYMSRP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\tinyMSRP\include;..\..\tinyHTTP\include;..\..\tinySDP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYMSRP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\tinyMSRP\include;..\..\tinyHTTP\include;..\..\tinySDP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.vcxproj.filters b/branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.vcxproj.filters new file mode 100644 index 00000000..21cf25e5 --- /dev/null +++ b/branches/2.0/doubango/tinyMSRP/winrt/tinyMSRP.vcxproj.filters @@ -0,0 +1,211 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {853b18fb-34e8-44f2-9a5b-0eade8e7858f} + + + {7ef27753-df61-4d45-abbb-3f639acd2892} + + + {aabeec17-337d-475d-9cde-c17c139826e2} + + + {813128d9-dd0b-46d9-a774-c98c92b6aa5d} + + + {21a9c2fb-9a88-4cab-a5c7-a44d2f0baad2} + + + {7d09c5c6-dd16-4909-a8c9-12aecddd4d3c} + + + {69800e5a-93d6-4382-98e1-b2289757b80c} + + + {b8638ea1-2bce-4eeb-ae3e-ebefdc0e7ae5} + + + {fbed83b7-4542-4c62-95cb-7d403f3834b1} + + + + + include + + + include + + + include + + + include\tinymsrp + + + include\tinymsrp + + + include\tinymsrp + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\headers + + + include\tinymsrp\session + + + include\tinymsrp\session + + + include\tinymsrp\session + + + include\tinymsrp\session + + + include\tinymsrp\parsers + + + include\tinymsrp\parsers + + + include\tinymsrp\parsers + + + + + src + + + src + + + src + + + src + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\parsers + + + src\parsers + + + src\session + + + src\session + + + src\session + + + src\session + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyNET/ragel/tnet_dns_resolvconf.rl b/branches/2.0/doubango/tinyNET/ragel/tnet_dns_resolvconf.rl index 7f0bfd7a..85f8d5cd 100644 --- a/branches/2.0/doubango/tinyNET/ragel/tnet_dns_resolvconf.rl +++ b/branches/2.0/doubango/tinyNET/ragel/tnet_dns_resolvconf.rl @@ -92,7 +92,7 @@ tnet_addresses_L_t * tnet_dns_resolvconf_parse(const char* path) tnet_addresses_L_t* servers = tsk_null; tnet_ip_t ip; const char* fullpath = path; - const char* tag_start; + const char* tag_start = tsk_null; FILE* fd; char* buf = tsk_null; diff --git a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.c b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.c index c10dd60b..f36b3cff 100644 --- a/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.c +++ b/branches/2.0/doubango/tinyNET/src/dns/tnet_dns_resolvconf.c @@ -59,7 +59,7 @@ tnet_addresses_L_t * tnet_dns_resolvconf_parse(const char* path) tnet_addresses_L_t* servers = tsk_null; tnet_ip_t ip; const char* fullpath = path; - const char* tag_start; + const char* tag_start = tsk_null; FILE* fd; char* buf = tsk_null; diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c index 15ca50e4..16568dfe 100644 --- a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c @@ -70,7 +70,7 @@ static int _tnet_ice_ctx_fsm_act_async(struct tnet_ice_ctx_s* self, tsk_fsm_acti static int _tnet_ice_ctx_signal_async(struct tnet_ice_ctx_s* self, tnet_ice_event_type_t type, const char* phrase); static int _tnet_ice_ctx_restart(struct tnet_ice_ctx_s* self); static int _tnet_ice_ctx_build_pairs(tnet_ice_candidates_L_t* local_candidates, tnet_ice_candidates_L_t* remote_candidates, tnet_ice_pairs_L_t* result_pairs, tsk_bool_t is_controlling, uint64_t tie_breaker, tsk_bool_t is_ice_jingle); -static void *_tnet_ice_ctx_run(void* self); +static void* TSK_STDCALL _tnet_ice_ctx_run(void* self); static int _tnet_ice_ctx_fsm_Started_2_GatheringHostCandidates_X_GatherHostCandidates(va_list *app); static int _tnet_ice_ctx_fsm_GatheringHostCandidates_2_GatheringHostCandidatesDone_X_Success(va_list *app); @@ -1501,7 +1501,7 @@ static int _tnet_ice_ctx_signal_async(tnet_ice_ctx_t* self, tnet_ice_event_type_ } } -static void *_tnet_ice_ctx_run(void* self) +static void* TSK_STDCALL _tnet_ice_ctx_run(void* self) { tsk_list_item_t *curr; tnet_ice_ctx_t *ctx = tsk_object_ref(self); diff --git a/branches/2.0/doubango/tinyNET/src/tinynet_config.h b/branches/2.0/doubango/tinyNET/src/tinynet_config.h index 2a5bc40a..40444d12 100644 --- a/branches/2.0/doubango/tinyNET/src/tinynet_config.h +++ b/branches/2.0/doubango/tinyNET/src/tinynet_config.h @@ -38,10 +38,15 @@ #undef _WIN32 /* Because of WINSCW */ #endif -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition. #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TNET_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TNET_UNDER_WINDOWS_RT 1 +# if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +# define TNET_UNDER_WINDOWS_PHONE 1 +# endif +# endif #endif #if defined(__APPLE__) @@ -67,8 +72,8 @@ */ #if !defined(__GNUC__) && defined(TINYNET_EXPORTS) # define TINYNET_API __declspec(dllexport) -# define TINYNET_GEXTERN __declspec(dllexport) -#elif !defined(__GNUC__) /*&& defined(TINYNET_IMPORTS)*/ +# define TINYNET_GEXTERN extern __declspec(dllexport) +#elif !defined(__GNUC__) && !defined(TINYNET_IMPORTS_IGNORE) # define TINYNET_API __declspec(dllimport) # define TINYNET_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinyNET/src/tnet_endianness.h b/branches/2.0/doubango/tinyNET/src/tnet_endianness.h index a082a1f9..80a12327 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_endianness.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_endianness.h @@ -36,6 +36,11 @@ TNET_BEGIN_DECLS +#if defined(TINYNET_IMPORTS_IGNORE) +#undef TNET_INLINE +#define TNET_INLINE +#endif + TINYNET_API TNET_INLINE unsigned short tnet_htons(unsigned short x); TINYNET_API TNET_INLINE unsigned short tnet_htons_2(const void* px); TINYNET_API TNET_INLINE unsigned long tnet_htonl(unsigned long x); diff --git a/branches/2.0/doubango/tinyNET/src/tnet_transport.c b/branches/2.0/doubango/tinyNET/src/tnet_transport.c index 8423c7a5..c1cfcd6e 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_transport.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_transport.c @@ -49,10 +49,10 @@ extern int tnet_transport_prepare(tnet_transport_t *transport); extern int tnet_transport_unprepare(tnet_transport_t *transport); -extern void *tnet_transport_mainthread(void *param); +extern void* TSK_STDCALL tnet_transport_mainthread(void *param); extern int tnet_transport_stop(tnet_transport_t *transport); -static void *run(void* self); +static void* TSK_STDCALL run(void* self); static int _tnet_transport_dtls_cb(const void* usrdata, tnet_dtls_socket_event_type_t e, const tnet_dtls_socket_handle_t* handle, const void* data, tsk_size_t size); static int _tnet_transport_ssl_init(tnet_transport_t* transport) @@ -824,7 +824,7 @@ static int _tnet_transport_dtls_cb(const void* usrdata, tnet_dtls_socket_event_t /* * Runnable interface implementation. */ -static void *run(void* self) +static void* TSK_STDCALL run(void* self) { int ret = 0; tsk_list_item_t *curr; 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 0df828b7..f1a28ba2 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_transport_win32.c @@ -532,10 +532,10 @@ int tnet_transport_unprepare(tnet_transport_t *transport) } /*=== Main thread */ -void *tnet_transport_mainthread(void *param) +void* TSK_STDCALL tnet_transport_mainthread(void *param) { - tnet_transport_t *transport = param; - transport_context_t *context = transport->context; + tnet_transport_t *transport = (tnet_transport_t*)param; + transport_context_t *context = (transport_context_t*)transport->context; DWORD evt; WSANETWORKEVENTS networkEvents; DWORD flags = 0; diff --git a/branches/2.0/doubango/tinyNET/src/tnet_types.h b/branches/2.0/doubango/tinyNET/src/tnet_types.h index a330b063..0836fb5d 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_types.h +++ b/branches/2.0/doubango/tinyNET/src/tnet_types.h @@ -35,7 +35,9 @@ #if TNET_UNDER_WINDOWS # include # include -# include +# if !TNET_UNDER_WINDOWS_RT +# include +# endif #else # include # include @@ -118,8 +120,23 @@ static const char* TNET_DTLS_HASH_NAMES[TNET_DTLS_HASH_TYPE_MAX] = # define TNET_ERROR_INTR WSAEINTR # define TNET_ERROR_ISCONN WSAEISCONN # define TNET_ERROR_EAGAIN TNET_ERROR_WOULDBLOCK /* WinSock FIX */ -# if defined(_WIN32_WCE) -# define tnet_gai_strerror(...) "FIXME" +# if TNET_UNDER_WINDOWS_RT /* gai_strerrorA() links against FormatMessageA which is not allowed on the store */ + static TNET_INLINE const char* tnet_gai_strerror(int ecode) + { + static char aBuff[1024] = {0}; + + WCHAR *wBuff = gai_strerrorW(ecode); + int len; + if((len = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, wBuff, wcslen(wBuff), aBuff, sizeof(aBuff) - 1, NULL, NULL)) > 0) + { + aBuff[len] = '\0'; + } + else + { + aBuff[0] = '\0'; + } + return aBuff; + } # else # define tnet_gai_strerror gai_strerrorA # endif diff --git a/branches/2.0/doubango/tinyNET/src/tnet_utils.c b/branches/2.0/doubango/tinyNET/src/tnet_utils.c index 14594cb0..5d8bc6d0 100644 --- a/branches/2.0/doubango/tinyNET/src/tnet_utils.c +++ b/branches/2.0/doubango/tinyNET/src/tnet_utils.c @@ -41,29 +41,36 @@ #include +#if TSK_UNDER_WINDOWS_RT +#include +extern std::vector rt_tsk_str_to_native(Platform::String^ str); +extern Platform::String^ rt_tsk_str_to_managed(char const* str); + +#endif /* TSK_UNDER_WINDOWS_RT */ + #if HAVE_NET_ROUTE_H # if defined(__APPLE__) && __IPHONE_OS_VERSION_MIN_REQUIRED <= __IPHONE_3_2 # include "net/route.h" // from Doubango 3rd parties folder beacuse the one from iOS SDK is incomplete # else # include # endif -#endif +#endif /* HAVE_NET_ROUTE_H */ #if HAVE_NET_IF_TYPES_H # include -#endif +#endif /* HAVE_NET_IF_TYPES_H */ #if HAVE_NET_IF_DL_H # include -#endif +#endif /* HAVE_NET_IF_DL_H */ #if HAVE_NETPACKET_PACKET_H # include -#endif +#endif /* HAVE_NETPACKET_PACKET_H */ #ifndef AF_LINK # define AF_LINK AF_PACKET -#endif +#endif /* AF_LINK */ /**@defgroup tnet_utils_group Network utility functions. */ @@ -74,7 +81,7 @@ */ tnet_interface_t* tnet_interface_create(const char* description, const void* mac_address, tsk_size_t mac_address_length) { - return tsk_object_new(tnet_interface_def_t, description, mac_address, mac_address_length); + return (tnet_interface_t*)tsk_object_new(tnet_interface_def_t, description, mac_address, mac_address_length); } /**@ingroup tnet_utils_group @@ -82,7 +89,7 @@ tnet_interface_t* tnet_interface_create(const char* description, const void* mac */ tnet_address_t* tnet_address_create(const char* ip) { - return tsk_object_new(tnet_address_def_t, ip); + return (tnet_address_t*)tsk_object_new(tnet_address_def_t, ip); } /**@ingroup tnet_utils_group @@ -96,7 +103,19 @@ void tnet_getlasterror(tnet_error_t *error) int err = tnet_geterrno(); memset(*error, 0, sizeof(*error)); -#if TNET_UNDER_WINDOWS +#if TNET_UNDER_WINDOWS_RT + // FormatMessageA Not allowed on Market + static WCHAR wBuff[1024] = {0}; + FormatMessageW( + FORMAT_MESSAGE_FROM_SYSTEM, + tsk_null, + err, + 0, + wBuff, + sizeof(wBuff)-1, + tsk_null); + WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, wBuff, wcslen(wBuff), *error, sizeof(*error) - 1, NULL, NULL); +#elif TNET_UNDER_WINDOWS { #ifdef _WIN32_WCE FormatMessage @@ -142,8 +161,11 @@ tnet_interfaces_L_t* tnet_get_interfaces() { tnet_interfaces_L_t * ifaces = tsk_list_create(); -#if TNET_UNDER_WINDOWS /*=== WINDOWS XP/VISTA/7/CE===*/ - +#if TNET_UNDER_WINDOWS/*=== WINDOWS XP/VISTA/7/CE===*/ +#if TNET_UNDER_WINDOWS_RT + TSK_DEBUG_ERROR("Not implemented on your OS"); + goto bail; +#else /* !TNET_UNDER_WINDOWS_RT */ #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) #define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) @@ -197,7 +219,7 @@ tnet_interfaces_L_t* tnet_get_interfaces() #undef MALLOC #undef FREE - +#endif /* !TNET_UNDER_WINDOWS_RT */ #elif HAVE_IFADDRS_H && HAVE_GETIFADDRS /*=== Using getifaddrs ===*/ @@ -331,6 +353,9 @@ tnet_addresses_L_t* tnet_get_addresses(tnet_family_t family, tsk_bool_t unicast, tnet_addresses_L_t *addresses = tsk_list_create(); #if TSK_UNDER_WINDOWS +#if TSK_UNDER_WINDOWS_RT + TSK_DEBUG_ERROR("Not implemented on your OS"); +#else /* !TSK_UNDER_WINDOWS_RT */ #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) #define FREE(x) HeapFree(GetProcessHeap(), 0, (x)) @@ -458,6 +483,8 @@ next: #undef FREE bail: + +#endif /* !TSK_UNDER_WINDOWS_RT */ #else /* !TSK_UNDER_WINDOWS (MAC OS X, UNIX, ANDROID ...) */ @@ -607,17 +634,95 @@ int tnet_getbestsource(const char* destination, tnet_port_t port, tnet_socket_ty #if TNET_UNDER_WINDOWS long dwBestIfIndex = -1; #endif +#if TNET_UNDER_WINDOWS_RT + Windows::Networking::Connectivity::ConnectionProfile^ profile; +#endif if(!destination || !source){ TSK_DEBUG_ERROR("Invalid parameter"); goto bail; } + memset(*source, '\0', sizeof(*source)); + + // special cases for Windows Phone device and emulator +#if TNET_UNDER_WINDOWS_PHONE + if(tsk_strequals(destination, "127.0.0.1")){ + memcpy(*source, "127.0.0.1", 9); + ret = 0; goto bail; + } + if(tsk_strequals(destination, "::1")){ + memcpy(*source, "::1", 3); + ret = 0; goto bail; + } +#endif + if((ret = tnet_sockaddr_init(destination, port, type, &destAddr))){ goto bail; } -#if TNET_UNDER_WINDOWS /* Windows XP/Vista/7 and Windows Mobile */ +#if TNET_UNDER_WINDOWS_RT /* Windows Phone 8, Surface or any RT */ + profile = Windows::Networking::Connectivity::NetworkInformation::GetInternetConnectionProfile(); + + if (profile != nullptr && profile->NetworkAdapter != nullptr){ + TSK_DEBUG_INFO("Network profile IanaInterfaceType = %d", profile->NetworkAdapter->IanaInterfaceType); + Windows::Foundation::Collections::IVectorView^ HostNames = Windows::Networking::Connectivity::NetworkInformation::GetHostNames(); + + if(HostNames->Size > 0) + { + Windows::Foundation::Collections::IIterator^ HostName = HostNames->First(); + do + { + std::vector CanonicalName = rt_tsk_str_to_native(HostName->Current->CanonicalName); + TSK_DEBUG_INFO("Checking IP address = %s", CanonicalName.data()); + if((TNET_SOCKET_TYPE_IS_IPV4(type) && HostName->Current->IPInformation->PrefixLength->Value > 32) || (TNET_SOCKET_TYPE_IS_IPV6(type) && HostName->Current->IPInformation->PrefixLength->Value > 128)) + { + TSK_DEBUG_INFO("Type mismatch - Skiping IP address=%s, IanaInterfaceType=%d, PrefixLength=%d", CanonicalName.data(), HostName->Current->IPInformation->NetworkAdapter->IanaInterfaceType, HostName->Current->IPInformation->PrefixLength->Value); + continue; + } + + + if(HostName->Current->IPInformation != nullptr) + { + // http://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.connectivity.networkadapter.networkadapterid.aspx + // HostName->Current->IPInformation->NetworkAdapter->NetworkAdapterId not implemented on WP8 + #if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP + tnet_socket_t* ss = tnet_socket_create(CanonicalName.data(), TNET_SOCKET_PORT_ANY, type); + if(ss) + { + ret = connect(ss->fd, (const sockaddr*)&destAddr, tnet_get_sockaddr_size((const sockaddr*)&destAddr)); + if(ret && tnet_geterrno() == TNET_ERROR_EAGAIN) + { + ret = tnet_sockfd_waitUntilWritable(ss->fd, 500); + } + TSK_OBJECT_SAFE_FREE(ss); + } + # else + if(HostName->Current->IPInformation->NetworkAdapter->IanaInterfaceType == profile->NetworkAdapter->IanaInterfaceType) + { + ret = 0; + } + #endif /* */ + + if(ret == 0) + { + TSK_DEBUG_INFO("Using best IP address = %s :)", CanonicalName.data()); + memcpy(*source, CanonicalName.data(), TSK_MIN(tsk_strlen(CanonicalName.data()), sizeof(*source))); + ret = 0; + goto bail; + } + TSK_DEBUG_INFO("Connection check - Skiping IP address = %s", CanonicalName.data()); + } + } + while(HostName->MoveNext()); + } + } + else + { + TSK_DEBUG_ERROR("No network connection available"); + } + +#elif TNET_UNDER_WINDOWS /* Windows XP/Vista/7 and Windows Mobile */ if(GetBestInterfaceEx((struct sockaddr*)&destAddr, &dwBestIfIndex) != NO_ERROR){ ret = tnet_geterrno(); TNET_PRINT_LAST_ERROR("GetBestInterfaceEx() failed."); @@ -636,7 +741,6 @@ int tnet_getbestsource(const char* destination, tnet_port_t port, tnet_socket_ty tsk_list_foreach(item, addresses){ const tnet_address_t* address = item->data; if(address && address->ip){ - memset(*source, '\0', sizeof(*source)); memcpy(*source, address->ip, tsk_strlen(address->ip) > sizeof(*source) ? sizeof(*source) : tsk_strlen(address->ip)); ret = 0; break; // First is good for us. @@ -766,7 +870,6 @@ int tnet_getbestsource(const char* destination, tnet_port_t port, tnet_socket_ty tnet_get_sockip((struct sockaddr *) ifa->ifa_addr, &ip); - memset(*source, '\0', sizeof(*source)); memcpy(*source, ip, tsk_strlen(ip) > sizeof(*source) ? sizeof(*source) : tsk_strlen(ip)); ret = 0; goto bail; // First is good for us. @@ -1381,7 +1484,7 @@ int tnet_sockfd_recvfrom(tnet_fd_t fd, void* buf, tsk_size_t size, int flags, st } fromlen = tnet_get_sockaddr_size(from); - return recvfrom(fd, buf, size, flags, from, &fromlen); + return recvfrom(fd, (char*)buf, size, flags, from, &fromlen); } /**@ingroup tnet_utils_group @@ -1404,7 +1507,7 @@ tsk_size_t tnet_sockfd_send(tnet_fd_t fd, const void* buf, tsk_size_t size, int } while(sent < size){ - if((ret = send(fd, (((const uint8_t*)buf)+sent), (size-sent), flags)) <= 0){ + if((ret = send(fd, (((const char*)buf)+sent), (size-sent), flags)) <= 0){ if(tnet_geterrno() == TNET_ERROR_WOULDBLOCK){ // FIXME: HORRIBLE HACK if((ret = tnet_sockfd_waitUntilWritable(fd, TNET_CONNECT_TIMEOUT))){ @@ -1448,7 +1551,7 @@ int tnet_sockfd_recv(tnet_fd_t fd, void* buf, tsk_size_t size, int flags) goto bail; } - if((ret = recv(fd, buf, size, flags)) <= 0){ + if((ret = recv(fd, (char*)buf, size, flags)) <= 0){ TNET_PRINT_LAST_ERROR("recv failed."); goto bail; } @@ -1592,14 +1695,14 @@ int tnet_sockfd_close(tnet_fd_t *fd) // static tsk_object_t* tnet_interface_ctor(tsk_object_t * self, va_list * app) { - tnet_interface_t *iface = self; + tnet_interface_t *iface = (tnet_interface_t *)self; if(iface){ const char* description = va_arg(*app, const char*); const void* mac_address = va_arg(*app, const void*); tsk_size_t mac_address_length = va_arg(*app, tsk_size_t); iface->description = tsk_strdup(description); - if((iface->mac_address = tsk_calloc(mac_address_length, sizeof(uint8_t)))){ + if((iface->mac_address = (uint8_t*)tsk_calloc(mac_address_length, sizeof(uint8_t)))){ memcpy(iface->mac_address, mac_address, mac_address_length); } iface->mac_address_length = mac_address_length; @@ -1609,7 +1712,7 @@ static tsk_object_t* tnet_interface_ctor(tsk_object_t * self, va_list * app) static tsk_object_t* tnet_interface_dtor(tsk_object_t * self) { - tnet_interface_t *iface = self; + tnet_interface_t *iface = (tnet_interface_t *)self; if(iface){ TSK_FREE(iface->description); TSK_FREE(iface->mac_address); @@ -1620,8 +1723,8 @@ static tsk_object_t* tnet_interface_dtor(tsk_object_t * self) static int tnet_interface_cmp(const tsk_object_t *if1, const tsk_object_t *if2) { - const tnet_interface_t *iface1 = if1; - const tnet_interface_t *iface2 = if2; + const tnet_interface_t *iface1 = (const tnet_interface_t *)if1; + const tnet_interface_t *iface2 = (const tnet_interface_t *)if2; if(iface1 && iface2){ return tsk_stricmp(iface1->description, iface1->description); @@ -1647,7 +1750,7 @@ const tsk_object_def_t *tnet_interface_def_t = &tnet_interface_def_s; // static tsk_object_t* tnet_address_ctor(tsk_object_t * self, va_list * app) { - tnet_address_t *address = self; + tnet_address_t *address = (tnet_address_t *)self; if(address){ address->ip = tsk_strdup(va_arg(*app, const char*)); } @@ -1656,7 +1759,7 @@ static tsk_object_t* tnet_address_ctor(tsk_object_t * self, va_list * app) static tsk_object_t* tnet_address_dtor(tsk_object_t * self) { - tnet_address_t *address = self; + tnet_address_t *address = (tnet_address_t *)self; if(address){ TSK_FREE(address->ip); } @@ -1666,8 +1769,8 @@ static tsk_object_t* tnet_address_dtor(tsk_object_t * self) static int tnet_address_cmp(const tsk_object_t *_a1, const tsk_object_t *_a2) { - const tnet_address_t *a1 = _a1; - const tnet_address_t *a2 = _a2; + const tnet_address_t *a1 = (const tnet_address_t *)_a1; + const tnet_address_t *a2 = (const tnet_address_t *)_a2; if(a1 && a2){ // to have AF_UNSPEC, AF_UNIX, AF_INET, ... first diff --git a/branches/2.0/doubango/tinyNET/winrt/tinyNET.sln b/branches/2.0/doubango/tinyNET/winrt/tinyNET.sln new file mode 100644 index 00000000..8e1379bd --- /dev/null +++ b/branches/2.0/doubango/tinyNET/winrt/tinyNET.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "tinyNET.vcxproj", "{06E58F9D-28A1-4DD4-AF11-2F5239222CCC}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.ActiveCfg = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.Build.0 = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.Build.0 = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.ActiveCfg = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.Build.0 = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.ActiveCfg = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinyNET/winrt/tinyNET.vcxproj b/branches/2.0/doubango/tinyNET/winrt/tinyNET.vcxproj new file mode 100644 index 00000000..3b8ab888 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/winrt/tinyNET.vcxproj @@ -0,0 +1,273 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {06e58f9d-28a1-4dd4-af11-2f5239222ccc} + tinyNET + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + _USRDLL;TINYNET_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\src;..\..\thirdparties\win32\include;..\..\tinySAK\src + + + Console + false + false + true + ws2_32.lib;"$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYNET_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\src;..\..\thirdparties\win32\include;..\..\tinySAK\src + + + Console + false + false + true + ws2_32.lib;"$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYNET_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\src;..\..\thirdparties\win32\include;..\..\tinySAK\src + + + Console + false + false + true + ws2_32.lib;"$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYNET_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\src;..\..\thirdparties\win32\include;..\..\tinySAK\src + + + Console + false + false + true + ws2_32.lib;"$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + false + false + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyNET/winrt/tinyNET.vcxproj.filters b/branches/2.0/doubango/tinyNET/winrt/tinyNET.vcxproj.filters new file mode 100644 index 00000000..8b0b9d07 --- /dev/null +++ b/branches/2.0/doubango/tinyNET/winrt/tinyNET.vcxproj.filters @@ -0,0 +1,361 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {47f38206-11cf-484b-bb21-41f9fc8ad1e7} + + + {487af1d7-a6a5-4e50-aa56-3e93a4b1af2b} + + + {823fe823-12d9-4e4d-ab93-c5133352f255} + + + {cb7d0bec-d40a-400b-8eb9-5997db656b63} + + + {9ccf87f0-6e7f-4c8d-91f1-74575af88fa3} + + + {282952bf-02ca-4eaf-8200-6ac829dbdff3} + + + {665f9d4d-326f-43d9-8c69-e41082a796bf} + + + {79d8933a-c689-418c-a94f-a5c0f034ea06} + + + {64ea99a0-485d-49e2-ad73-b537d2684891} + + + {b2cde3ed-acb7-44c9-a22f-0d5c8778bbf2} + + + {3c2e591f-39ec-4dde-adee-c8f23a35a2f1} + + + {7719f54d-3ff7-44c7-8e00-333ad4e25f8a} + + + {7ba51cd7-7828-4a91-b613-34050785d8b6} + + + {12dcf1c9-283d-4abb-b91b-7dcfc913a94c} + + + {ce5dd118-cde0-4d23-a1b5-ac936cae3834} + + + {cbbc38d6-4e5e-42dd-9924-1d0c3cc0542f} + + + + + src + + + src + + + src\dhcp + + + src\dhcp + + + src\dhcp + + + src\dhcp + + + src\dhcp6 + + + src\dhcp6 + + + src\dhcp6 + + + src\dhcp6 + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\dns + + + src\ice + + + src\ice + + + src\ice + + + src\ice + + + src\ice + + + src\ice + + + src\stun + + + src\stun + + + src\stun + + + src\tls + + + src\tls + + + src\turn + + + src\turn + + + src\turn + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + + + include\dhcp + + + include\dhcp + + + include\dhcp + + + include\dhcp + + + include\dhcp6 + + + include\dhcp6 + + + include\dhcp6 + + + include\dhcp6 + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\dns + + + include\ice + + + include\ice + + + include\ice + + + include\ice + + + include\ice + + + include\ice + + + include\turn + + + include\turn + + + include\turn + + + include\tls + + + include\tls + + + include\stun + + + include\stun + + + include\stun + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyRTP/include/tinyrtp_config.h b/branches/2.0/doubango/tinyRTP/include/tinyrtp_config.h index cbb2782e..62fe825b 100644 --- a/branches/2.0/doubango/tinyRTP/include/tinyrtp_config.h +++ b/branches/2.0/doubango/tinyRTP/include/tinyrtp_config.h @@ -27,16 +27,18 @@ #undef _WIN32 /* Because of WINSCW */ #endif -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition. #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TRTP_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TRTP_UNDER_WINDOWS_RT 1 +# endif #endif #if (TRTP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYRTP_EXPORTS) # define TINYRTP_API __declspec(dllexport) # define TINYRTP_GEXTERN __declspec(dllexport) -#elif (TRTP_UNDER_WINDOWS || defined(__SYMBIAN32__)) /*&& defined(TINYRTP_IMPORTS)*/ +#elif (TRTP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && !defined(TINYRTP_IMPORTS_IGNORE) # define TINYRTP_API __declspec(dllimport) # define TINYRTP_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinySAK/src/tinysak_config.h b/branches/2.0/doubango/tinySAK/src/tinysak_config.h index efdb28e0..91fc0e16 100644 --- a/branches/2.0/doubango/tinySAK/src/tinysak_config.h +++ b/branches/2.0/doubango/tinySAK/src/tinysak_config.h @@ -41,6 +41,12 @@ // Windows (XP/Vista/7/CE and Windows Mobile) macro definition. #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TSK_UNDER_WINDOWS 1 +# define TSK_STDCALL __stdcall +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TSK_UNDER_WINDOWS_RT 1 +# endif +#else +# define TSK_STDCALL #endif // OS X or iOS @@ -61,8 +67,8 @@ */ #if !defined(__GNUC__) && defined(TINYSAK_EXPORTS) # define TINYSAK_API __declspec(dllexport) -# define TINYSAK_GEXTERN __declspec(dllexport) -#elif !defined(__GNUC__) /*&& defined(TINYSAK_IMPORTS)*/ +# define TINYSAK_GEXTERN extern __declspec(dllexport) +#elif !defined(__GNUC__) && !defined(TINYSAK_IMPORTS_IGNORE) # define TINYSAK_API __declspec(dllimport) # define TINYSAK_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinySAK/src/tsk_base64.c b/branches/2.0/doubango/tinySAK/src/tsk_base64.c index 9543eb56..39569fbf 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_base64.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_base64.c @@ -97,7 +97,7 @@ tsk_size_t tsk_base64_encode(const uint8_t* input, tsk_size_t input_size, char * /* Caller provided his own buffer? */ if(!*output){ - *output = tsk_calloc(1, (TSK_BASE64_ENCODE_LEN(input_size)+1)); + *output = (char*)tsk_calloc(1, (TSK_BASE64_ENCODE_LEN(input_size)+1)); } /* Too short? */ @@ -187,7 +187,7 @@ tsk_size_t tsk_base64_decode(const uint8_t* input, tsk_size_t input_size, char * /* Caller provided his own buffer? */ if(!*output){ - *output = tsk_calloc(1, (TSK_BASE64_DECODE_LEN(input_size)+1)); + *output = (char*)tsk_calloc(1, (TSK_BASE64_DECODE_LEN(input_size)+1)); } /* Count pads and remove them from the base64 string */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_buffer.c b/branches/2.0/doubango/tinySAK/src/tsk_buffer.c index d798fb20..7eddd5f0 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_buffer.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_buffer.c @@ -56,7 +56,7 @@ */ tsk_buffer_t* tsk_buffer_create(const void* data, tsk_size_t size) { - return tsk_object_new(tsk_buffer_def_t, data, size); + return (tsk_buffer_t*)tsk_object_new(tsk_buffer_def_t, data, size); } /**@ingroup tsk_buffer_group @@ -126,7 +126,7 @@ int tsk_buffer_append_2(tsk_buffer_t* self, const char* format, ...) } #else len = vsnprintf(tsk_null, 0, format, ap); - buffer = tsk_realloc(buffer, oldsize+len+1); + buffer = (char*)tsk_realloc(buffer, oldsize+len+1); vsnprintf((buffer + oldsize), len #if !defined(_MSC_VER) || defined(__GNUC__) +1 @@ -349,7 +349,7 @@ int tsk_buffer_takeownership(tsk_buffer_t* self, void** data, tsk_size_t size) // static tsk_object_t* tsk_buffer_ctor(tsk_object_t * self, va_list * app) { - tsk_buffer_t *buffer = self; + tsk_buffer_t *buffer = (tsk_buffer_t *)self; const void *data = va_arg(*app, const void *); tsk_size_t size = va_arg(*app, tsk_size_t); @@ -365,7 +365,7 @@ static tsk_object_t* tsk_buffer_ctor(tsk_object_t * self, va_list * app) static tsk_object_t* tsk_buffer_dtor(tsk_object_t * self) { - tsk_buffer_t *buffer = self; + tsk_buffer_t *buffer = (tsk_buffer_t *)self; if(buffer){ TSK_FREE(buffer->data); buffer->size = 0; diff --git a/branches/2.0/doubango/tinySAK/src/tsk_condwait.c b/branches/2.0/doubango/tinySAK/src/tsk_condwait.c index ab57fead..74b6389b 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_condwait.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_condwait.c @@ -95,12 +95,16 @@ tsk_condwait_t; */ tsk_condwait_handle_t* tsk_condwait_create() { - tsk_condwait_t *condwait = tsk_calloc(1, sizeof(tsk_condwait_t)); + tsk_condwait_t *condwait = (tsk_condwait_t*)tsk_calloc(1, sizeof(tsk_condwait_t)); if(condwait) { #if TSK_UNDER_WINDOWS +# if TSK_UNDER_WINDOWS_RT + condwait->pcond = CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); + #else condwait->pcond = CreateEvent(NULL, TRUE, FALSE, NULL); +# endif if(!condwait->pcond) { TSK_FREE(condwait); @@ -145,7 +149,11 @@ int tsk_condwait_wait(tsk_condwait_handle_t* handle) } #if TSK_UNDER_WINDOWS +# if TSK_UNDER_WINDOWS_RT + if((ret = (WaitForSingleObjectEx(condwait->pcond, INFINITE, TRUE) == WAIT_FAILED) ? -1 : 0)){ +# else if((ret = (WaitForSingleObject(condwait->pcond, INFINITE) == WAIT_FAILED) ? -1 : 0)){ +#endif TSK_DEBUG_ERROR("WaitForSingleObject function failed: %d", ret); } #else @@ -178,7 +186,11 @@ int tsk_condwait_timedwait(tsk_condwait_handle_t* handle, uint64_t ms) tsk_condwait_t *condwait = (tsk_condwait_t*)handle; #if TSK_UNDER_WINDOWS - if((ret = WaitForSingleObject(condwait->pcond, (DWORD)ms)) != WAIT_OBJECT_0){ +# if TSK_UNDER_WINDOWS_RT + if((ret = WaitForSingleObjectEx(condwait->pcond, (DWORD)ms, TRUE)) != WAIT_OBJECT_0){ +# else + if((ret = WaitForSingleObject(condwait->pcond, (DWORD)ms)) != WAIT_OBJECT_0){ +#endif if(ret == TIMED_OUT){ /* TSK_DEBUG_INFO("WaitForSingleObject function timedout: %d", ret); */ } diff --git a/branches/2.0/doubango/tinySAK/src/tsk_fsm.c b/branches/2.0/doubango/tinySAK/src/tsk_fsm.c index cfb84855..d2d0816b 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_fsm.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_fsm.c @@ -1,332 +1,332 @@ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file tsk_fsm.c - * @brief Finite-state machine (FSM) implementation. - * @sa http://en.wikipedia.org/wiki/Finite-state_machine. - * - * @author Mamadou Diop - * - - */ -#include "tsk_fsm.h" -#include "tsk_memory.h" -#include "tsk_debug.h" - -/**@defgroup tsk_fsm_group Finite-state machine (FSM) implementation. -*/ - -int tsk_fsm_exec_nothing(va_list *app){ return 0/*success*/; } -tsk_bool_t tsk_fsm_cond_always(const void* data1, const void* data2) { return tsk_true; } - -/**@ingroup tsk_fsm_group -*/ -tsk_fsm_t* tsk_fsm_create(tsk_fsm_state_id state_curr, tsk_fsm_state_id state_term) -{ - return tsk_object_new(tsk_fsm_def_t, state_curr, state_term); -} - -/**@ingroup tsk_fsm_group -*/ -tsk_fsm_entry_t* tsk_fsm_entry_create() -{ - return tsk_object_new(tsk_fsm_entry_def_t); -} - -/**@ingroup tsk_fsm_group -* Add entries (states) to the FSM. -* @param self The FSM. -* @param ... One of these helper macros: @b TSK_FSM_ADD_*. MUST end with -* @b TSK_FSM_ADD_NULL. -* @retval Zero if succeed and non-zero error code otherwise. -*/ -int tsk_fsm_set(tsk_fsm_t* self, ...) -{ - va_list args; - int guard; - - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - - va_start(args, self); - while((guard = va_arg(args, int)) == 1){ - tsk_fsm_entry_t* entry; - if((entry = tsk_fsm_entry_create())){ - entry->from = va_arg(args, tsk_fsm_state_id); - entry->action = va_arg(args, tsk_fsm_action_id); - entry->cond = va_arg(args, tsk_fsm_cond); - entry->to = va_arg(args, tsk_fsm_state_id); - entry->exec = va_arg(args, tsk_fsm_exec); - entry->desc = va_arg(args, const char*); - - tsk_list_push_descending_data(self->entries, (void**)&entry); - } - } - va_end(args); - - return 0; -} - -/**@ingroup tsk_fsm_group -* Sets the @a callback function to call when the FSM enter in the final state. -* @param self The FSM. -* @param callback The callback function to call. -* @param callbackdata Opaque data (user-data) to pass to the callback function. -* @retval Zero if succeed and non-zero error code otherwise. -*/ -int tsk_fsm_set_callback_terminated(tsk_fsm_t* self, tsk_fsm_onterminated_f callback, const void* callbackdata) -{ - if(self){ - self->callback_term = callback; - self->callback_data = callbackdata; - return 0; - } - else{ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } -} - -/**@ingroup tsk_fsm_group -* Execute an @a action. This action will probably change the current state of the FSM. -* @param self The FSM. -* @param action The id of the action to execute. -* @param cond_data1 The first opaque data to pass to the @a condition function. -* @param cond_data2 The first opaque data to pass to the @a condition function. -* @param ... Variable parameters to pass to the @a exec function. -* @retval Zero if succeed and non-zero error code otherwise. -*/ -int tsk_fsm_act(tsk_fsm_t* self, tsk_fsm_action_id action, const void* cond_data1, const void* cond_data2, ...) -{ - tsk_list_item_t *item; - va_list ap; - tsk_bool_t found = tsk_false; - tsk_bool_t terminates = tsk_false; /* thread-safeness -> DO NOT REMOVE THIS VARIABLE */ - int ret_exec = 0; /* success */ - - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - if(tsk_fsm_terminated(self)){ - TSK_DEBUG_WARN("The FSM is in the final state."); - return -2; - } - - // lock - tsk_safeobj_lock(self); - - va_start(ap, cond_data2); - tsk_list_foreach(item, self->entries) - { - tsk_fsm_entry_t* entry = item->data; - if(((entry->from != tsk_fsm_state_any) && (entry->from != tsk_fsm_state_current)) && (entry->from != self->current)){ - continue; - } - - if((entry->action != tsk_fsm_action_any) && (entry->action != action)){ - continue; - } - - // check condition - if(entry->cond(cond_data1, cond_data2)){ - // For debug information - if(self->debug){ - TSK_DEBUG_INFO("State machine: %s", entry->desc); - } - - if(entry->to != tsk_fsm_state_any && entry->to != tsk_fsm_state_current){ /* Stay at the current state if destination state is Any or Current */ - self->current = entry->to; - } - - if(entry->exec){ - if((ret_exec = entry->exec(&ap))){ - TSK_DEBUG_INFO("State machine: Exec function failed. Moving to terminal state."); - } - } - else{ /* Nothing to execute */ - ret_exec = 0; - } - - terminates = (ret_exec || (self->current == self->term)); - found = tsk_true; - break; - } - } - va_end(ap); - - // unlock - tsk_safeobj_unlock(self); - - /* Only call the callback function after unlock. */ - if(terminates){ - self->current = self->term; - if(self->callback_term){ - self->callback_term(self->callback_data); - } - } - if(!found){ - TSK_DEBUG_INFO("State machine: No matching state found."); - } - - return ret_exec; -} - -tsk_fsm_state_id tsk_fsm_get_current_state(tsk_fsm_t* self) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_fsm_state_any; - } - return self->current; -} - -int tsk_fsm_set_current_state(tsk_fsm_t* self, tsk_fsm_state_id new_state) -{ - if(!self){ - TSK_DEBUG_ERROR("Invalid parameter"); - return -1; - } - self->current = new_state; - return 0; -} - -tsk_bool_t tsk_fsm_terminated(tsk_fsm_t* self) -{ - if(self){ - return (self->current == self->term); - } - else{ - TSK_DEBUG_ERROR("Invalid parameter"); - return tsk_true; - } -} - - -//================================================================================================= -// fsm object definition -// -static tsk_object_t* tsk_fsm_ctor(tsk_object_t * self, va_list * app) -{ - tsk_fsm_t *fsm = self; - if(fsm){ - fsm->current = va_arg(*app, tsk_fsm_state_id); - fsm->term = va_arg(*app, tsk_fsm_state_id); - - fsm->entries = tsk_list_create(); - -#if defined(DEBUG) || defined(_DEBUG) - fsm->debug = 1; /* default value, could be changed at any time */ -#endif - tsk_safeobj_init(fsm); - } - - return self; -} - -static tsk_object_t* tsk_fsm_dtor(tsk_object_t * self) -{ - tsk_fsm_t *fsm = self; - if(fsm){ - /* If not in the terminal state ==>do it */ - /*if(fsm->current != fsm->term){ - tsk_safeobj_lock(fsm); - if(fsm->callback_term){ - fsm->callback_term(fsm->callback_data); - } - tsk_safeobj_unlock(fsm); - }*/ - tsk_safeobj_deinit(fsm); - - TSK_OBJECT_SAFE_FREE(fsm->entries); - } - - return self; -} - -static const tsk_object_def_t tsk_fsm_def_s = -{ - sizeof(tsk_fsm_t), - tsk_fsm_ctor, - tsk_fsm_dtor, - tsk_null, -}; -const tsk_object_def_t *tsk_fsm_def_t = &tsk_fsm_def_s; - -//================================================================================================= -// fsm entry object definition -// -static tsk_object_t* tsk_fsm_entry_ctor(tsk_object_t * self, va_list * app) -{ - tsk_fsm_entry_t *fsm_entry = self; - if(fsm_entry){ - } - - return self; -} - -static tsk_object_t* tsk_fsm_entry_dtor(tsk_object_t * self) -{ - tsk_fsm_entry_t *fsm_entry = self; - if(fsm_entry){ - /* desc is "const char*" => should not be deleted */ - /* TSK_FREE(fsm_entry->desc); */ - } - - return self; -} -static int tsk_fsm_entry_cmp(const tsk_object_t *_entry1, const tsk_object_t *_entry2) -{ - const tsk_fsm_entry_t* entry1 = _entry1; - const tsk_fsm_entry_t* entry2 = _entry2; - if(entry1 && entry2){ - /* Put "Any" states at the bottom (Strong)*/ - if(entry1->from == tsk_fsm_state_any){ - return -20; - } - else if(entry2->from == tsk_fsm_state_any){ - return +20; - } - - /* Put "Any" actions at the bottom (Weak)*/ - if(entry1->action == tsk_fsm_action_any){ - return -10; - } - else if(entry1->action == tsk_fsm_action_any){ - return +10; - } +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tsk_fsm.c + * @brief Finite-state machine (FSM) implementation. + * @sa http://en.wikipedia.org/wiki/Finite-state_machine. + * + * @author Mamadou Diop + * + + */ +#include "tsk_fsm.h" +#include "tsk_memory.h" +#include "tsk_debug.h" + +/**@defgroup tsk_fsm_group Finite-state machine (FSM) implementation. +*/ + +int tsk_fsm_exec_nothing(va_list *app){ return 0/*success*/; } +tsk_bool_t tsk_fsm_cond_always(const void* data1, const void* data2) { return tsk_true; } + +/**@ingroup tsk_fsm_group +*/ +tsk_fsm_t* tsk_fsm_create(tsk_fsm_state_id state_curr, tsk_fsm_state_id state_term) +{ + return (tsk_fsm_t*)tsk_object_new(tsk_fsm_def_t, state_curr, state_term); +} + +/**@ingroup tsk_fsm_group +*/ +tsk_fsm_entry_t* tsk_fsm_entry_create() +{ + return (tsk_fsm_entry_t*)tsk_object_new(tsk_fsm_entry_def_t); +} + +/**@ingroup tsk_fsm_group +* Add entries (states) to the FSM. +* @param self The FSM. +* @param ... One of these helper macros: @b TSK_FSM_ADD_*. MUST end with +* @b TSK_FSM_ADD_NULL. +* @retval Zero if succeed and non-zero error code otherwise. +*/ +int tsk_fsm_set(tsk_fsm_t* self, ...) +{ + va_list args; + int guard; + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + + va_start(args, self); + while((guard = va_arg(args, int)) == 1){ + tsk_fsm_entry_t* entry; + if((entry = tsk_fsm_entry_create())){ + entry->from = va_arg(args, tsk_fsm_state_id); + entry->action = va_arg(args, tsk_fsm_action_id); + entry->cond = va_arg(args, tsk_fsm_cond); + entry->to = va_arg(args, tsk_fsm_state_id); + entry->exec = va_arg(args, tsk_fsm_exec); + entry->desc = va_arg(args, const char*); + + tsk_list_push_descending_data(self->entries, (void**)&entry); + } + } + va_end(args); + + return 0; +} + +/**@ingroup tsk_fsm_group +* Sets the @a callback function to call when the FSM enter in the final state. +* @param self The FSM. +* @param callback The callback function to call. +* @param callbackdata Opaque data (user-data) to pass to the callback function. +* @retval Zero if succeed and non-zero error code otherwise. +*/ +int tsk_fsm_set_callback_terminated(tsk_fsm_t* self, tsk_fsm_onterminated_f callback, const void* callbackdata) +{ + if(self){ + self->callback_term = callback; + self->callback_data = callbackdata; + return 0; + } + else{ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } +} + +/**@ingroup tsk_fsm_group +* Execute an @a action. This action will probably change the current state of the FSM. +* @param self The FSM. +* @param action The id of the action to execute. +* @param cond_data1 The first opaque data to pass to the @a condition function. +* @param cond_data2 The first opaque data to pass to the @a condition function. +* @param ... Variable parameters to pass to the @a exec function. +* @retval Zero if succeed and non-zero error code otherwise. +*/ +int tsk_fsm_act(tsk_fsm_t* self, tsk_fsm_action_id action, const void* cond_data1, const void* cond_data2, ...) +{ + tsk_list_item_t *item; + va_list ap; + tsk_bool_t found = tsk_false; + tsk_bool_t terminates = tsk_false; /* thread-safeness -> DO NOT REMOVE THIS VARIABLE */ + int ret_exec = 0; /* success */ + + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + if(tsk_fsm_terminated(self)){ + TSK_DEBUG_WARN("The FSM is in the final state."); + return -2; + } + + // lock + tsk_safeobj_lock(self); + + va_start(ap, cond_data2); + tsk_list_foreach(item, self->entries) + { + tsk_fsm_entry_t* entry = (tsk_fsm_entry_t*)item->data; + if(((entry->from != tsk_fsm_state_any) && (entry->from != tsk_fsm_state_current)) && (entry->from != self->current)){ + continue; + } + + if((entry->action != tsk_fsm_action_any) && (entry->action != action)){ + continue; + } + + // check condition + if(entry->cond(cond_data1, cond_data2)){ + // For debug information + if(self->debug){ + TSK_DEBUG_INFO("State machine: %s", entry->desc); + } + + if(entry->to != tsk_fsm_state_any && entry->to != tsk_fsm_state_current){ /* Stay at the current state if destination state is Any or Current */ + self->current = entry->to; + } + + if(entry->exec){ + if((ret_exec = entry->exec(&ap))){ + TSK_DEBUG_INFO("State machine: Exec function failed. Moving to terminal state."); + } + } + else{ /* Nothing to execute */ + ret_exec = 0; + } + + terminates = (ret_exec || (self->current == self->term)); + found = tsk_true; + break; + } + } + va_end(ap); + + // unlock + tsk_safeobj_unlock(self); + + /* Only call the callback function after unlock. */ + if(terminates){ + self->current = self->term; + if(self->callback_term){ + self->callback_term(self->callback_data); + } + } + if(!found){ + TSK_DEBUG_INFO("State machine: No matching state found."); + } + + return ret_exec; +} + +tsk_fsm_state_id tsk_fsm_get_current_state(tsk_fsm_t* self) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_fsm_state_any; + } + return self->current; +} + +int tsk_fsm_set_current_state(tsk_fsm_t* self, tsk_fsm_state_id new_state) +{ + if(!self){ + TSK_DEBUG_ERROR("Invalid parameter"); + return -1; + } + self->current = new_state; + return 0; +} + +tsk_bool_t tsk_fsm_terminated(tsk_fsm_t* self) +{ + if(self){ + return (self->current == self->term); + } + else{ + TSK_DEBUG_ERROR("Invalid parameter"); + return tsk_true; + } +} + + +//================================================================================================= +// fsm object definition +// +static tsk_object_t* tsk_fsm_ctor(tsk_object_t * self, va_list * app) +{ + tsk_fsm_t *fsm = (tsk_fsm_t*)self; + if(fsm){ + fsm->current = va_arg(*app, tsk_fsm_state_id); + fsm->term = va_arg(*app, tsk_fsm_state_id); + + fsm->entries = tsk_list_create(); + +#if defined(DEBUG) || defined(_DEBUG) + fsm->debug = 1; /* default value, could be changed at any time */ +#endif + tsk_safeobj_init(fsm); + } + + return self; +} + +static tsk_object_t* tsk_fsm_dtor(tsk_object_t * self) +{ + tsk_fsm_t *fsm = (tsk_fsm_t*)self; + if(fsm){ + /* If not in the terminal state ==>do it */ + /*if(fsm->current != fsm->term){ + tsk_safeobj_lock(fsm); + if(fsm->callback_term){ + fsm->callback_term(fsm->callback_data); + } + tsk_safeobj_unlock(fsm); + }*/ + tsk_safeobj_deinit(fsm); + + TSK_OBJECT_SAFE_FREE(fsm->entries); + } + + return self; +} + +static const tsk_object_def_t tsk_fsm_def_s = +{ + sizeof(tsk_fsm_t), + tsk_fsm_ctor, + tsk_fsm_dtor, + tsk_null, +}; +const tsk_object_def_t *tsk_fsm_def_t = &tsk_fsm_def_s; + +//================================================================================================= +// fsm entry object definition +// +static tsk_object_t* tsk_fsm_entry_ctor(tsk_object_t * self, va_list * app) +{ + tsk_fsm_entry_t *fsm_entry = (tsk_fsm_entry_t*)self; + if(fsm_entry){ + } + + return self; +} + +static tsk_object_t* tsk_fsm_entry_dtor(tsk_object_t * self) +{ + tsk_fsm_entry_t *fsm_entry = (tsk_fsm_entry_t*)self; + if(fsm_entry){ + /* desc is "const char*" => should not be deleted */ + /* TSK_FREE(fsm_entry->desc); */ + } + + return self; +} +static int tsk_fsm_entry_cmp(const tsk_object_t *_entry1, const tsk_object_t *_entry2) +{ + const tsk_fsm_entry_t* entry1 = (const tsk_fsm_entry_t*)_entry1; + const tsk_fsm_entry_t* entry2 = (const tsk_fsm_entry_t*)_entry2; + if(entry1 && entry2){ + /* Put "Any" states at the bottom (Strong)*/ + if(entry1->from == tsk_fsm_state_any){ + return -20; + } + else if(entry2->from == tsk_fsm_state_any){ + return +20; + } + + /* Put "Any" actions at the bottom (Weak)*/ + if(entry1->action == tsk_fsm_action_any){ + return -10; + } + else if(entry1->action == tsk_fsm_action_any){ + return +10; + } // put conditions first - return entry1->cond ? -1 : (entry2->cond ? 1 : 0); - } - return 0; -} - -static const tsk_object_def_t tsk_fsm_entry_def_s = -{ - sizeof(tsk_fsm_entry_t), - tsk_fsm_entry_ctor, - tsk_fsm_entry_dtor, - tsk_fsm_entry_cmp, -}; -const tsk_object_def_t *tsk_fsm_entry_def_t = &tsk_fsm_entry_def_s; + return entry1->cond ? -1 : (entry2->cond ? 1 : 0); + } + return 0; +} + +static const tsk_object_def_t tsk_fsm_entry_def_s = +{ + sizeof(tsk_fsm_entry_t), + tsk_fsm_entry_ctor, + tsk_fsm_entry_dtor, + tsk_fsm_entry_cmp, +}; +const tsk_object_def_t *tsk_fsm_entry_def_t = &tsk_fsm_entry_def_s; diff --git a/branches/2.0/doubango/tinySAK/src/tsk_list.c b/branches/2.0/doubango/tinySAK/src/tsk_list.c index 3bf935eb..457be911 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_list.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_list.c @@ -53,7 +53,7 @@ static int tsk_list_find_by_item(const tsk_list_item_t* item, const void* _item) */ tsk_list_t* tsk_list_create() { - return tsk_object_new(tsk_list_def_t); + return (tsk_list_t*)tsk_object_new(tsk_list_def_t); } /**@ingroup tsk_list_group @@ -62,7 +62,7 @@ tsk_list_t* tsk_list_create() */ tsk_list_item_t* tsk_list_item_create() { - return tsk_object_new(tsk_list_item_def_t); + return (tsk_list_item_t*)tsk_object_new(tsk_list_item_def_t); } /**@ingroup tsk_list_group @@ -541,7 +541,7 @@ tsk_size_t tsk_list_count(const tsk_list_t* list, tsk_list_func_predicate predic // static tsk_object_t* tsk_list_item_ctor(tsk_object_t * self, va_list * app) { - tsk_list_item_t *item = self; + tsk_list_item_t *item = (tsk_list_item_t*)self; if(item){ } return self; @@ -549,7 +549,7 @@ static tsk_object_t* tsk_list_item_ctor(tsk_object_t * self, va_list * app) static tsk_object_t* tsk_list_item_dtor(tsk_object_t *self) { - tsk_list_item_t *item = self; + tsk_list_item_t *item = (tsk_list_item_t*)self; if(item){ item->data = tsk_object_unref(item->data); } @@ -561,8 +561,8 @@ static tsk_object_t* tsk_list_item_dtor(tsk_object_t *self) static int tsk_list_item_cmp(const tsk_object_t *_item1, const tsk_object_t *_item2) { - const tsk_list_item_t* item1 = _item1; - const tsk_list_item_t* item2 = _item2; + const tsk_list_item_t* item1 = (const tsk_list_item_t*)_item1; + const tsk_list_item_t* item2 = (const tsk_list_item_t*)_item2; if(item1 && item2){ return tsk_object_cmp(item1->data, item2->data); @@ -584,7 +584,7 @@ const tsk_object_def_t *tsk_list_item_def_t = &tsk_list_item_def_s; // static tsk_object_t* tsk_list_ctor(tsk_object_t *self, va_list *app) { - tsk_list_t *list = self; + tsk_list_t *list = (tsk_list_t *)self; if(list){ } @@ -593,7 +593,7 @@ static tsk_object_t* tsk_list_ctor(tsk_object_t *self, va_list *app) static tsk_object_t* tsk_list_dtor(tsk_object_t *self) { - tsk_list_t *list = self; + tsk_list_t *list = (tsk_list_t *)self; if(list){ #if 0 /* Not thread-safe */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_mutex.c b/branches/2.0/doubango/tinySAK/src/tsk_mutex.c index 6f21abfb..c7dad460 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_mutex.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_mutex.c @@ -81,7 +81,11 @@ tsk_mutex_handle_t* tsk_mutex_create_2(tsk_bool_t recursive) MUTEX_T handle = tsk_null; #if TSK_UNDER_WINDOWS +# if TSK_UNDER_WINDOWS_RT + handle = CreateMutexEx(NULL, NULL, 0x00000000, MUTEX_ALL_ACCESS); +# else handle = CreateMutex(NULL, FALSE, NULL); +# endif #else int ret; pthread_mutexattr_t mta; @@ -121,8 +125,13 @@ int tsk_mutex_lock(tsk_mutex_handle_t* handle) int ret = EINVAL; if(handle) { + #if TSK_UNDER_WINDOWS - if((ret = WaitForSingleObject((MUTEX_T)handle , INFINITE)) == WAIT_FAILED) +# if TSK_UNDER_WINDOWS_RT + if((ret = WaitForSingleObjectEx((MUTEX_T)handle, INFINITE, TRUE)) == WAIT_FAILED) +# else + if((ret = WaitForSingleObject((MUTEX_T)handle, INFINITE)) == WAIT_FAILED) +#endif #else if((ret = pthread_mutex_lock((MUTEX_T)handle))) #endif diff --git a/branches/2.0/doubango/tinySAK/src/tsk_object.c b/branches/2.0/doubango/tinySAK/src/tsk_object.c index 249e3294..4b302746 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_object.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_object.c @@ -211,7 +211,7 @@ tsk_size_t tsk_object_get_refcount(tsk_object_t *self) */ void tsk_object_delete(tsk_object_t *self) { - const tsk_object_def_t ** objdef = self; + const tsk_object_def_t ** objdef = (const tsk_object_def_t **)self; if(self && *objdef){ if((*objdef)->destructor){ self = (*objdef)->destructor(self); diff --git a/branches/2.0/doubango/tinySAK/src/tsk_options.c b/branches/2.0/doubango/tinySAK/src/tsk_options.c index 2301a4c2..8ef3358d 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_options.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_options.c @@ -42,7 +42,7 @@ static int pred_find_option_by_id(const tsk_list_item_t *item, const void *id) { if(item && item->data){ - tsk_option_t *option = item->data; + tsk_option_t *option = (tsk_option_t*)item->data; return (option->id - *((int*)id)); } return -1; @@ -52,7 +52,7 @@ static int pred_find_option_by_id(const tsk_list_item_t *item, const void *id) */ tsk_option_t* tsk_option_create(int id, const char* value) { - return tsk_object_new(TSK_OPTION_VA_ARGS(id, value)); + return (tsk_option_t*)tsk_object_new(TSK_OPTION_VA_ARGS(id, value)); } /**@ingroup tsk_options_group @@ -146,7 +146,7 @@ const tsk_option_t *tsk_options_get_option_by_id(const tsk_options_L_t *self, in if(self){ const tsk_list_item_t *item_const = tsk_list_find_item_by_pred(self, pred_find_option_by_id, &id); if(item_const){ - return item_const->data; + return (const tsk_option_t*)item_const->data; } } return 0; @@ -207,7 +207,7 @@ int tsk_options_get_option_value_as_int(const tsk_options_L_t *self, int id) // static tsk_object_t* tsk_option_ctor(tsk_object_t * self, va_list * app) { - tsk_option_t *option = self; + tsk_option_t *option = (tsk_option_t*)self; if(option){ int id = va_arg(*app, int); const char* value = va_arg(*app, const char *); @@ -223,7 +223,7 @@ static tsk_object_t* tsk_option_ctor(tsk_object_t * self, va_list * app) static tsk_object_t* tsk_option_dtor(tsk_object_t * self) { - tsk_option_t *option = self; + tsk_option_t *option = (tsk_option_t*)self; if(option){ TSK_FREE(option->value); } diff --git a/branches/2.0/doubango/tinySAK/src/tsk_params.c b/branches/2.0/doubango/tinySAK/src/tsk_params.c index 06376007..cf25197c 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_params.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_params.c @@ -43,8 +43,8 @@ static int pred_find_param_by_name(const tsk_list_item_t *item, const void *name) { if(item && item->data){ - tsk_param_t *param = item->data; - return tsk_stricmp(param->name, name); + tsk_param_t *param = (tsk_param_t*)item->data; + return tsk_stricmp(param->name, (const char*)name); } return -1; } @@ -53,7 +53,7 @@ static int pred_find_param_by_name(const tsk_list_item_t *item, const void *name */ tsk_param_t* tsk_param_create(const char* name, const char* value) { - return tsk_object_new(TSK_PARAM_VA_ARGS(name, value)); + return (tsk_param_t*)tsk_object_new(TSK_PARAM_VA_ARGS(name, value)); } /**@ingroup tsk_params_group @@ -78,16 +78,16 @@ tsk_param_t *tsk_params_parse_param(const char* line, tsk_size_t size) tsk_param_t *param = tsk_param_create_null(); if(param && equal && equalname = tsk_calloc((equal-start)+1, sizeof(const char)))){ + if((param->name = (char*)tsk_calloc((equal-start)+1, sizeof(const char)))){ memcpy(param->name, start, (equal-start)); } - if((param->value = tsk_calloc((end-equal-1)+1, sizeof(const char)))){ + if((param->value = (char*)tsk_calloc((end-equal-1)+1, sizeof(const char)))){ memcpy(param->value, equal+1, (end-equal-1)); } } else if(param){ - if((param->name = tsk_calloc((end-start)+1, sizeof(const char)))){ + if((param->name = (char*)tsk_calloc((end-start)+1, sizeof(const char)))){ memcpy(param->name, start, (end-start)); } } @@ -192,7 +192,7 @@ const tsk_param_t *tsk_params_get_param_by_name(const tsk_params_L_t *self, cons if(self){ const tsk_list_item_t *item_const = tsk_list_find_item_by_pred(self, pred_find_param_by_name, name); if(item_const){ - return item_const->data; + return (const tsk_param_t*)item_const->data; } } else{ @@ -262,7 +262,7 @@ int tsk_params_tostring(const tsk_params_L_t *self, const char separator, tsk_bu tsk_list_item_t *item; ret = 0; // for empty lists tsk_list_foreach(item, self){ - tsk_param_t* param = item->data; + tsk_param_t* param = (tsk_param_t*)item->data; //tsk_params_param_tostring(param, output); if(TSK_LIST_IS_FIRST(self, item)){ if((ret = tsk_buffer_append_2(output, param->value?"%s=%s":"%s", param->name, param->value))){ @@ -347,7 +347,7 @@ tsk_params_L_t* tsk_params_fromstring(const char* string, const char* separator, // static tsk_object_t* tsk_param_ctor(tsk_object_t* self, va_list * app) { - tsk_param_t *param = self; + tsk_param_t *param = (tsk_param_t*)self; if(param){ const char* name = va_arg(*app, const char *); const char* value = va_arg(*app, const char *); @@ -365,7 +365,7 @@ static tsk_object_t* tsk_param_ctor(tsk_object_t* self, va_list * app) static tsk_object_t* tsk_param_dtor(tsk_object_t* self) { - tsk_param_t *param = self; + tsk_param_t *param = (tsk_param_t*)self; if(param){ TSK_FREE(param->name); TSK_FREE(param->value); diff --git a/branches/2.0/doubango/tinySAK/src/tsk_plugin.c b/branches/2.0/doubango/tinySAK/src/tsk_plugin.c index 2d12d99b..bf9d7c74 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_plugin.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_plugin.c @@ -80,11 +80,20 @@ tsk_plugin_t* tsk_plugin_create(const char* path) { tsk_plugin_t* plugin; symbol_get_def_count funcptr_get_def_count; - tsk_plugin_handle_t* handle = + tsk_plugin_handle_t* handle; + #if TSK_UNDER_WINDOWS - LoadLibraryA(path); +# if TSK_UNDER_WINDOWS_RT + wchar_t* szPath = (wchar_t*)tsk_calloc(tsk_strlen(path) + 1, sizeof(wchar_t)); + static const wchar_t* szFormat = L"%hs"; + swprintf(szPath, tsk_strlen(path) * sizeof(wchar_t), szFormat, path); + handle = LoadPackagedLibrary(szPath, 0x00000000); + TSK_FREE(szPath); +# else + handle = LoadLibraryA(path); +# endif #else - dlopen(path, RTLD_NOW); + handle = dlopen(path, RTLD_NOW); #endif if(!handle){ @@ -92,13 +101,13 @@ tsk_plugin_t* tsk_plugin_create(const char* path) return tsk_null; } - if(!(funcptr_get_def_count = _tsk_plugin_handle_get_symbol(handle, TSK_PLUGIN_FUNC_NAME_DEF_COUNT))){ + if(!(funcptr_get_def_count = (symbol_get_def_count)_tsk_plugin_handle_get_symbol(handle, TSK_PLUGIN_FUNC_NAME_DEF_COUNT))){ TSK_DEBUG_ERROR("Cannot find function with name=%s", TSK_PLUGIN_FUNC_NAME_DEF_COUNT); _tsk_plugin_handle_destroy(&handle); return tsk_null; } - if(!(plugin = tsk_object_new(&tsk_plugin_def_s))){ + if(!(plugin = (tsk_plugin_t*)tsk_object_new(&tsk_plugin_def_s))){ TSK_DEBUG_ERROR("Failed to create plugin object"); _tsk_plugin_handle_destroy(&handle); return tsk_null; diff --git a/branches/2.0/doubango/tinySAK/src/tsk_plugin.h b/branches/2.0/doubango/tinySAK/src/tsk_plugin.h index a19e5e69..cae938f1 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_plugin.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_plugin.h @@ -23,6 +23,8 @@ #include "tinysak_config.h" #include "tsk_object.h" +TSK_BEGIN_DECLS + typedef enum tsk_plugin_def_type_e { tsk_plugin_def_type_none = 0, @@ -55,4 +57,6 @@ TINYSAK_API struct tsk_plugin_s* tsk_plugin_create(const char* path); TINYSAK_API tsk_plugin_def_ptr_const_t tsk_plugin_get_def(struct tsk_plugin_s* self, tsk_plugin_def_type_t type, tsk_plugin_def_media_type_t media_type); TINYSAK_API tsk_plugin_symbol_t* tsk_plugin_get_symbol(struct tsk_plugin_s* self, const char* symbol_name); +TSK_END_DECLS + #endif /* _TINYSAK_PLUGIN_H_ */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_runnable.c b/branches/2.0/doubango/tinySAK/src/tsk_runnable.c index 844c3c7c..45e289f3 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_runnable.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_runnable.c @@ -40,7 +40,7 @@ */ tsk_runnable_t* tsk_runnable_create() { - return tsk_object_new(tsk_runnable_def_t); + return (tsk_runnable_t*)tsk_object_new(tsk_runnable_def_t); } /**@ingroup tsk_runnable_group @@ -215,7 +215,7 @@ stop: // static tsk_object_t* tsk_runnable_ctor(tsk_object_t * self, va_list * app) { - tsk_runnable_t* runnable = self; + tsk_runnable_t* runnable = (tsk_runnable_t*)self; if(runnable){ } return self; @@ -223,7 +223,7 @@ static tsk_object_t* tsk_runnable_ctor(tsk_object_t * self, va_list * app) static tsk_object_t* tsk_runnable_dtor(tsk_object_t * self) { - tsk_runnable_t* runnable = self; + tsk_runnable_t* runnable = (tsk_runnable_t*)self; if(runnable){ /* stops runnable object (if running or started) */ tsk_runnable_stop(runnable); diff --git a/branches/2.0/doubango/tinySAK/src/tsk_runnable.h b/branches/2.0/doubango/tinySAK/src/tsk_runnable.h index 70c74759..fe04e7eb 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_runnable.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_runnable.h @@ -41,7 +41,7 @@ TSK_BEGIN_DECLS /**@ingroup tsk_runnable_group */ -typedef void * (*tsk_runnable_func_run)(void* self); +typedef void* (TSK_STDCALL *tsk_runnable_func_run)(void* self); /**@ingroup tsk_runnable_group */ diff --git a/branches/2.0/doubango/tinySAK/src/tsk_semaphore.c b/branches/2.0/doubango/tinySAK/src/tsk_semaphore.c index d98c38ab..bada91c4 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_semaphore.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_semaphore.c @@ -46,6 +46,11 @@ # include "tsk_errno.h" # define SEMAPHORE_S void typedef HANDLE SEMAPHORE_T; +# if TSK_UNDER_WINDOWS_RT +# if !defined(CreateSemaphoreEx) +# define CreateSemaphoreEx CreateSemaphoreExW +# endif +# endif //#else if define(__APPLE__) /* Mac OSX/Darwin/Iphone/Ipod Touch */ //# include //# include @@ -98,7 +103,11 @@ tsk_semaphore_handle_t* tsk_semaphore_create_2(int initial_val) SEMAPHORE_T handle = tsk_null; #if TSK_UNDER_WINDOWS +# if TSK_UNDER_WINDOWS_RT + handle = CreateSemaphoreEx(NULL, initial_val, 0x7FFFFFFF, NULL, 0x00000000, SEMAPHORE_ALL_ACCESS); +# else handle = CreateSemaphore(NULL, initial_val, 0x7FFFFFFF, NULL); +# endif #else handle = tsk_calloc(1, sizeof(SEMAPHORE_S)); @@ -135,7 +144,7 @@ int tsk_semaphore_increment(tsk_semaphore_handle_t* handle) if(handle) { #if TSK_UNDER_WINDOWS - if((ret = ReleaseSemaphore((SEMAPHORE_T)handle, 1L, 0L) ? 0 : -1)) + if((ret = ReleaseSemaphore((SEMAPHORE_T)handle, 1L, NULL) ? 0 : -1)) #else if((ret = sem_post((SEMAPHORE_T)GET_SEM(handle)))) #endif @@ -155,14 +164,16 @@ int tsk_semaphore_increment(tsk_semaphore_handle_t* handle) int tsk_semaphore_decrement(tsk_semaphore_handle_t* handle) { int ret = EINVAL; - if(handle) - { + if(handle){ #if TSK_UNDER_WINDOWS - ret = (WaitForSingleObject((SEMAPHORE_T)handle, INFINITE) == WAIT_OBJECT_0 ? 0 : -1); +# if TSK_UNDER_WINDOWS_RT + ret = (WaitForSingleObjectEx((SEMAPHORE_T)handle, INFINITE, TRUE) == WAIT_OBJECT_0) ? 0 : -1; +# else + ret = (WaitForSingleObject((SEMAPHORE_T)handle, INFINITE) == WAIT_OBJECT_0) ? 0 : -1; +#endif if(ret) TSK_DEBUG_ERROR("sem_wait function failed: %d", ret); #else - do - { + do { ret = sem_wait((SEMAPHORE_T)GET_SEM(handle)); } while ( errno == EINTR ); diff --git a/branches/2.0/doubango/tinySAK/src/tsk_sha1.c b/branches/2.0/doubango/tinySAK/src/tsk_sha1.c index ad6b734a..f9c696e9 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_sha1.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_sha1.c @@ -170,7 +170,7 @@ tsk_sha1_errcode_t tsk_sha1result( tsk_sha1context_t *context, tsk_sha1digest_t } if (context->Corrupted){ - return context->Corrupted; + return (tsk_sha1_errcode_t)context->Corrupted; } if (!context->Computed){ @@ -221,7 +221,7 @@ tsk_sha1_errcode_t tsk_sha1input(tsk_sha1context_t *context, } if (context->Corrupted){ - return context->Corrupted; + return (tsk_sha1_errcode_t)context->Corrupted; } while(length-- && !context->Corrupted) { diff --git a/branches/2.0/doubango/tinySAK/src/tsk_string.c b/branches/2.0/doubango/tinySAK/src/tsk_string.c index 335ab18a..f5b80cfa 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_string.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_string.c @@ -38,6 +38,11 @@ #include #include +#if TSK_UNDER_WINDOWS_RT +#include /* MultiByteToWideChar */ +#include +#endif + #if defined(_MSC_VER) # define snprintf _snprintf @@ -59,13 +64,13 @@ */ tsk_string_t* tsk_string_create(const char* str) { - return tsk_object_new(tsk_string_def_t, str); + return (tsk_string_t*)tsk_object_new(tsk_string_def_t, str); } int tsk_string_pred_icmp(const tsk_list_item_t* item, const void* str) { if(item && str){ - return tsk_stricmp(TSK_STRING_STR(item->data), str); + return tsk_stricmp(TSK_STRING_STR(item->data), (const char*)str); } return -1; } @@ -73,7 +78,7 @@ int tsk_string_pred_icmp(const tsk_list_item_t* item, const void* str) int tsk_string_pred_cmp(const tsk_list_item_t* item, const void* str) { if(item && str){ - return tsk_strcmp(TSK_STRING_STR(item->data), str); + return tsk_strcmp(TSK_STRING_STR(item->data), (const char*)str); } return -1; } @@ -194,7 +199,7 @@ char* tsk_strndup(const char *s1, tsk_size_t n) tsk_size_t len = tsk_strlen(s1); tsk_size_t nret = (n > len) ? (len) : (n); - if((ret = tsk_calloc((nret+1), sizeof(uint8_t)))){ + if((ret = (char*)tsk_calloc((nret+1), sizeof(uint8_t)))){ memcpy(ret, s1, nret); } } @@ -305,7 +310,7 @@ void tsk_strncat(char** destination, const char* source, tsk_size_t n) strncpy(*destination, source, tsk_size_to_cat+1); }else{ index = tsk_strlen(*destination); - *destination = tsk_realloc(*destination, index + tsk_size_to_cat+1); + *destination = (char*)tsk_realloc(*destination, index + tsk_size_to_cat+1); strncpy(((*destination)+index), source, tsk_size_to_cat+1); } (*destination)[index + tsk_size_to_cat] = '\0'; @@ -585,7 +590,43 @@ void tsk_str_to_hex(const char *str, tsk_size_t size, uint8_t* hex) +#if TSK_UNDER_WINDOWS_RT +TINYSAK_API std::vector rt_tsk_str_to_native(Platform::String^ str) +{ + if(str != nullptr && !str->IsEmpty()) + { + int len = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, str->Data(), str->Length(), nullptr, 0, nullptr, nullptr); + if (len > 0) + { + std::vector vec(len + 1); + if (WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, str->Data(), str->Length(), vec.data(), len, nullptr, nullptr) == len) + { + return std::move(vec); + } + } + } + return std::move(std::vector(0)); +} + +TINYSAK_API Platform::String^ rt_tsk_str_to_managed(char const* str) +{ + if(str) + { + int len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, -1, nullptr, 0); + if (len > 0) + { + std::vector vec(len); + if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, -1, vec.data(), len) == len) + { + return ref new Platform::String(vec.data()); + } + } + } + return nullptr; +} + +#endif /* TSK_UNDER_WINDOWS_RT */ @@ -597,7 +638,7 @@ void tsk_str_to_hex(const char *str, tsk_size_t size, uint8_t* hex) // static tsk_object_t* tsk_string_ctor(tsk_object_t * self, va_list * app) { - tsk_string_t *string = self; + tsk_string_t *string = (tsk_string_t*)self; const char *value = va_arg(*app, const char *); if(value){ string->value = tsk_strdup(value); @@ -607,7 +648,7 @@ static tsk_object_t* tsk_string_ctor(tsk_object_t * self, va_list * app) static tsk_object_t* tsk_string_dtor(tsk_object_t * self) { - tsk_string_t *string = self; + tsk_string_t *string = (tsk_string_t*)self; if(string){ TSK_FREE(string->value); } @@ -617,8 +658,8 @@ static tsk_object_t* tsk_string_dtor(tsk_object_t * self) static int tsk_string_cmp(const tsk_object_t *_s1, const tsk_object_t *_s2) { - const tsk_string_t *s1 = _s1; - const tsk_string_t *s2 = _s2; + const tsk_string_t *s1 = (const tsk_string_t *)_s1; + const tsk_string_t *s2 = (const tsk_string_t *)_s2; if(s1 && s2){ return tsk_stricmp(s1->value, s2->value); diff --git a/branches/2.0/doubango/tinySAK/src/tsk_thread.c b/branches/2.0/doubango/tinySAK/src/tsk_thread.c index aa52e5e9..4fcf84a5 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_thread.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_thread.c @@ -34,6 +34,10 @@ #if TSK_UNDER_WINDOWS # include #endif +#if TSK_UNDER_WINDOWS_RT +# include "../winrt/ThreadEmulation.h" + using namespace ThreadEmulation; +#endif #include @@ -62,11 +66,10 @@ void tsk_thread_sleep(uint64_t ms) * @param arg An address for the argument for the thread's start routine * @retval If successful, returns zero. Otherwise, an error number is returned to indicate the error */ -int tsk_thread_create(tsk_thread_handle_t** handle, void *(*start) (void *), void *arg) +int tsk_thread_create(tsk_thread_handle_t** handle, void *(TSK_STDCALL *start) (void *), void *arg) { #if TSK_UNDER_WINDOWS - DWORD ThreadId; - *((HANDLE*)handle) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start, arg, 0, &ThreadId); + *((HANDLE*)handle) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start, arg, 0, NULL); return *((HANDLE*)handle) ? 0 : -1; #else *handle = tsk_calloc(1, sizeof(pthread_t)); @@ -151,7 +154,11 @@ int tsk_thread_join(tsk_thread_handle_t** handle) } #if TSK_UNDER_WINDOWS +# if TSK_UNDER_WINDOWS_RT + ret = (WaitForSingleObjectEx(*((HANDLE*)handle), INFINITE, TRUE) == WAIT_FAILED) ? -1 : 0; +# else ret = (WaitForSingleObject(*((HANDLE*)handle), INFINITE) == WAIT_FAILED) ? -1 : 0; +#endif if(ret == 0){ ret = tsk_thread_destroy(handle); } diff --git a/branches/2.0/doubango/tinySAK/src/tsk_thread.h b/branches/2.0/doubango/tinySAK/src/tsk_thread.h index 0e30596f..140ce0eb 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_thread.h +++ b/branches/2.0/doubango/tinySAK/src/tsk_thread.h @@ -43,7 +43,7 @@ typedef pthread_t tsk_thread_id_t; TSK_BEGIN_DECLS TINYSAK_API void tsk_thread_sleep(uint64_t ms); -TINYSAK_API int tsk_thread_create(tsk_thread_handle_t** handle, void *(*start) (void *), void *arg); +TINYSAK_API int tsk_thread_create(tsk_thread_handle_t** handle, void *(TSK_STDCALL *start) (void *), void *arg); TINYSAK_API int tsk_thread_set_priority(tsk_thread_handle_t* handle, int32_t priority); TINYSAK_API int tsk_thread_set_priority_2(int32_t priority); TINYSAK_API tsk_thread_id_t tsk_thread_get_id(); diff --git a/branches/2.0/doubango/tinySAK/src/tsk_time.c b/branches/2.0/doubango/tinySAK/src/tsk_time.c index 58bc86ef..7514e29c 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_time.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_time.c @@ -1,210 +1,220 @@ -/* -* Copyright (C) 2010-2011 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -/**@file tsk_time.c -* @brief Datetime functions. -* -* @author Mamadou Diop -* -* @date Created: Sat Nov 8 16:54:58 2009 mdiop -*/ -#include "tsk_time.h" - -#include "tsk_debug.h" - -#if TSK_UNDER_WINDOWS -# include // timeval -# include -#elif defined(__SYMBIAN32__) -# include <_timeval.h> -#else -# include -#endif - -#include -#if defined (__APPLE__) -# include -# include -#endif - -/**@defgroup tsk_time_group Datetime functions. -*/ - -#if !HAVE_GETTIMEOFDAY -#if TSK_UNDER_WINDOWS - -/* For windows implementation of "gettimeofday" Thanks to "http://www.cpp-programming.net/c-tidbits/gettimeofday-function-for-windows" */ -#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) -#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 -#else -#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL -#endif - -struct timezone -{ - int tz_minuteswest; /* minutes W of Greenwich */ - int tz_dsttime; /* type of dst correction */ -}; - -int gettimeofday(struct timeval *tv, struct timezone *tz) -{ - FILETIME ft; - uint64_t tmpres = 0; - static int tzflag = 0; - - if(tv) - { -#ifdef _WIN32_WCE - SYSTEMTIME st; - GetSystemTime(&st); - SystemTimeToFileTime(&st, &ft); -#else - GetSystemTimeAsFileTime(&ft); -#endif - - tmpres |= ft.dwHighDateTime; - tmpres <<= 32; - tmpres |= ft.dwLowDateTime; - - /*converting file time to unix epoch*/ - tmpres /= 10; /*convert into microseconds*/ - tmpres -= DELTA_EPOCH_IN_MICROSECS; - tv->tv_sec = (long)(tmpres / 1000000UL); - tv->tv_usec = (long)(tmpres % 1000000UL); - } - - if (tz){ - if (!tzflag){ - _tzset(); - tzflag++; - } - tz->tz_minuteswest = _timezone / 60; - tz->tz_dsttime = _daylight; - } - - return 0; -} - -#else -#pragma error "You MUST provide an implement for 'gettimeofday'" -#endif /* WIN32 */ - -#endif /* !HAVE_GETTIMEOFDAY */ - -/**@ingroup tsk_time_group -* The tsk_gettimeofday() function shall obtain the current time, expressed as seconds and microseconds since EPOCH (00:00:00 UTC on 1 January 1970). -* The resolution of the system clock is unspecified. -* @param tv The current time, expressed as seconds and microseconds since EPOCH(00:00:00 UTC on 1 January 1970). -* @param tz The timezone. -* @retval The tsk_gettimeofday() function shall return 0 and no value shall be reserved to indicate an error. -*/ -int tsk_gettimeofday(struct timeval *tv, struct timezone *tz) -{ - return gettimeofday(tv, tz); -} - -/**@ingroup tsk_time_group -* Gets the number of milliseconds in @a tv -* @retval The number of milliseconds -*/ -uint64_t tsk_time_get_ms(const struct timeval* tv) -{ - if(!tv){ - TSK_DEBUG_ERROR("Invalid parameter"); - return 0; - } - return (((uint64_t)tv->tv_sec)*(uint64_t)1000) + (((uint64_t)tv->tv_usec)/(uint64_t)1000); -} - -/**@ingroup tsk_time_group -* Gets the number of milliseconds since the EPOCH. -* @retval The number of milliseconds since EPOCH. -*/ -uint64_t tsk_time_epoch() -{ - struct timeval tv; - gettimeofday(&tv, tsk_null); - return (((uint64_t)tv.tv_sec)*(uint64_t)1000) + (((uint64_t)tv.tv_usec)/(uint64_t)1000); -} - -// /!\ NOT CURRENT TIME -// only make sense when comparing two values (e.g. for duration) -uint64_t tsk_time_now() -{ -#if TSK_UNDER_WINDOWS - static int __cpu_count = 0; - if(__cpu_count == 0){ - SYSTEM_INFO SystemInfo; - GetSystemInfo(&SystemInfo); - __cpu_count = SystemInfo.dwNumberOfProcessors; - } - if(__cpu_count == 1){ - 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); - } - else{ - return timeGetTime(); - } -#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__) - static mach_timebase_info_data_t __apple_timebase_info = {0, 0}; - if (__apple_timebase_info.denom == 0) { - (void) mach_timebase_info(&__apple_timebase_info); - } - return (uint64_t)((mach_absolute_time() * __apple_timebase_info.numer) / (1e+6 * __apple_timebase_info.denom)); -#else - struct timeval tv; - gettimeofday(&tv, tsk_null); - return (((uint64_t)tv.tv_sec)*(uint64_t)1000) + (((uint64_t)tv.tv_usec)/(uint64_t)1000); -#endif -} - -// http://en.wikipedia.org/wiki/Network_Time_Protocol -uint64_t tsk_time_ntp() +/* +* Copyright (C) 2010-2011 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tsk_time.c +* @brief Datetime functions. +* +* @author Mamadou Diop +* +* @date Created: Sat Nov 8 16:54:58 2009 mdiop +*/ +#include "tsk_time.h" + +#include "tsk_debug.h" + +#if TSK_UNDER_WINDOWS +# include // timeval +# include +#elif defined(__SYMBIAN32__) +# include <_timeval.h> +#else +# include +#endif + +#include +#if defined (__APPLE__) +# include +# include +#endif + +/**@defgroup tsk_time_group Datetime functions. +*/ + +#if !HAVE_GETTIMEOFDAY +#if TSK_UNDER_WINDOWS + +/* For windows implementation of "gettimeofday" Thanks to "http://www.cpp-programming.net/c-tidbits/gettimeofday-function-for-windows" */ +#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) +#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 +#else +#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL +#endif + +struct timezone +{ + int tz_minuteswest; // minutes W of Greenwich + int tz_dsttime; // type of dst correction +}; + +int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + FILETIME ft; + uint64_t tmpres = 0; + static int tzflag = 0; + + if(tv) + { +#ifdef _WIN32_WCE + SYSTEMTIME st; + GetSystemTime(&st); + SystemTimeToFileTime(&st, &ft); +#else + GetSystemTimeAsFileTime(&ft); +#endif + + tmpres |= ft.dwHighDateTime; + tmpres <<= 32; + tmpres |= ft.dwLowDateTime; + + /*converting file time to unix epoch*/ + tmpres /= 10; /*convert into microseconds*/ + tmpres -= DELTA_EPOCH_IN_MICROSECS; + tv->tv_sec = (long)(tmpres / 1000000UL); + tv->tv_usec = (long)(tmpres % 1000000UL); + } + + if (tz){ + if (!tzflag){ +#if !TSK_UNDER_WINDOWS_RT + _tzset(); +#endif + tzflag++; + } + tz->tz_minuteswest = _timezone / 60; + tz->tz_dsttime = _daylight; + } + + return 0; +} + +#else +#pragma error "You MUST provide an implement for 'gettimeofday'" +#endif /* WIN32 */ + +#endif /* !HAVE_GETTIMEOFDAY */ + +/**@ingroup tsk_time_group +* The tsk_gettimeofday() function shall obtain the current time, expressed as seconds and microseconds since EPOCH (00:00:00 UTC on 1 January 1970). +* The resolution of the system clock is unspecified. +* @param tv The current time, expressed as seconds and microseconds since EPOCH(00:00:00 UTC on 1 January 1970). +* @param tz The timezone. +* @retval The tsk_gettimeofday() function shall return 0 and no value shall be reserved to indicate an error. +*/ +int tsk_gettimeofday(struct timeval *tv, struct timezone *tz) +{ + return gettimeofday(tv, tz); +} + +/**@ingroup tsk_time_group +* Gets the number of milliseconds in @a tv +* @retval The number of milliseconds +*/ +uint64_t tsk_time_get_ms(const struct timeval* tv) +{ + if(!tv){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; + } + return (((uint64_t)tv->tv_sec)*(uint64_t)1000) + (((uint64_t)tv->tv_usec)/(uint64_t)1000); +} + +/**@ingroup tsk_time_group +* Gets the number of milliseconds since the EPOCH. +* @retval The number of milliseconds since EPOCH. +*/ +uint64_t tsk_time_epoch() { struct timeval tv; - gettimeofday(&tv, tsk_null); - return tsk_time_get_ntp_ms(&tv); -} - -uint64_t tsk_time_get_ntp_ms(const struct timeval *tv) -{ + gettimeofday(&tv, (struct timezone *)tsk_null); + return (((uint64_t)tv.tv_sec)*(uint64_t)1000) + (((uint64_t)tv.tv_usec)/(uint64_t)1000); +} + +// /!\ NOT CURRENT TIME +// only make sense when comparing two values (e.g. for duration) +uint64_t tsk_time_now() +{ +#if TSK_UNDER_WINDOWS + static int __cpu_count = 0; + if(__cpu_count == 0){ + SYSTEM_INFO SystemInfo; +# if TSK_UNDER_WINDOWS_RT + GetNativeSystemInfo(&SystemInfo); +# else + GetSystemInfo(&SystemInfo); +# endif + __cpu_count = SystemInfo.dwNumberOfProcessors; + } + if(__cpu_count == 1){ + 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); + } + else{ +# if TSK_UNDER_WINDOWS_RT + return tsk_time_epoch(); +# else + return timeGetTime(); +# endif + } +#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__) + static mach_timebase_info_data_t __apple_timebase_info = {0, 0}; + if (__apple_timebase_info.denom == 0) { + (void) mach_timebase_info(&__apple_timebase_info); + } + return (uint64_t)((mach_absolute_time() * __apple_timebase_info.numer) / (1e+6 * __apple_timebase_info.denom)); +#else + struct timeval tv; + gettimeofday(&tv, tsk_null); + return (((uint64_t)tv.tv_sec)*(uint64_t)1000) + (((uint64_t)tv.tv_usec)/(uint64_t)1000); +#endif +} + +// http://en.wikipedia.org/wiki/Network_Time_Protocol +uint64_t tsk_time_ntp() +{ + struct timeval tv; + gettimeofday(&tv, (struct timezone *)tsk_null); + return tsk_time_get_ntp_ms(&tv); +} + +uint64_t tsk_time_get_ntp_ms(const struct timeval *tv) +{ static const unsigned long __epoch = 2208988800UL; - static const double __ntp_scale_frac = 4294967295.0; - + static const double __ntp_scale_frac = 4294967295.0; + uint64_t tv_ntp; - uint64_t tv_usecs; - - if(!tv){ - TSK_DEBUG_ERROR("Invalid parameter"); - return 0; + uint64_t tv_usecs; + + if(!tv){ + TSK_DEBUG_ERROR("Invalid parameter"); + return 0; } tv_ntp = tv->tv_sec + __epoch; @@ -214,5 +224,5 @@ uint64_t tsk_time_get_ntp_ms(const struct timeval *tv) #else tv_usecs = ((uint64_t)tv->tv_usec * (uint64_t)__ntp_scale_frac) / (uint64_t)1000000; return ((((uint64_t)tv_ntp) << 32) | (uint32_t)tv_usecs); -#endif +#endif } \ No newline at end of file diff --git a/branches/2.0/doubango/tinySAK/src/tsk_timer.c b/branches/2.0/doubango/tinySAK/src/tsk_timer.c index 661a7209..0426b9e8 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_timer.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_timer.c @@ -82,10 +82,10 @@ tsk_timer_manager_t; typedef tsk_list_t tsk_timer_manager_L_t; /**< List of @ref tsk_timer_manager_t elements. */ /*== Definitions */ -static void *__tsk_timer_manager_mainthread(void *param); +static void* TSK_STDCALL __tsk_timer_manager_mainthread(void *param); static int __tsk_pred_find_timer_by_id(const tsk_list_item_t *item, const void *id); static void __tsk_timer_manager_raise(tsk_timer_t *timer); -static void *run(void* self); +static void* TSK_STDCALL run(void* self); /**@ingroup tsk_timer_group */ @@ -100,7 +100,7 @@ tsk_timer_manager_handle_t* tsk_timer_manager_create() int tsk_timer_manager_start(tsk_timer_manager_handle_t *self) { int err = -1; - tsk_timer_manager_t *manager = self; + tsk_timer_manager_t *manager = (tsk_timer_manager_t*)self; TSK_DEBUG_INFO("tsk_timer_manager_start"); @@ -132,7 +132,7 @@ bail: */ void tsk_timer_manager_debug(tsk_timer_manager_handle_t *self) { - tsk_timer_manager_t *manager = self; + tsk_timer_manager_t *manager = (tsk_timer_manager_t*)self; if(manager){ //int index = 0; tsk_list_item_t *item = tsk_null; @@ -140,7 +140,7 @@ void tsk_timer_manager_debug(tsk_timer_manager_handle_t *self) tsk_mutex_lock(manager->mutex); tsk_list_foreach(item, manager->timers){ - tsk_timer_t* timer = item->data; + tsk_timer_t* timer = (tsk_timer_t*)item->data; TSK_DEBUG_INFO("timer [%llu]- %llu, %llu", timer->id, timer->timeout, tsk_time_now()); } @@ -154,7 +154,7 @@ void tsk_timer_manager_debug(tsk_timer_manager_handle_t *self) int tsk_timer_manager_stop(tsk_timer_manager_handle_t *self) { int ret = -1; - tsk_timer_manager_t *manager = self; + tsk_timer_manager_t *manager = (tsk_timer_manager_t*)self; if(!manager){ TSK_DEBUG_ERROR("Invalid paramater"); @@ -190,13 +190,13 @@ bail: 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) { tsk_timer_id_t timer_id = TSK_INVALID_TIMER_ID; - tsk_timer_manager_t *manager = self; + tsk_timer_manager_t *manager = (tsk_timer_manager_t*)self; //FIXME if(manager && (TSK_RUNNABLE(manager)->running || TSK_RUNNABLE(manager)->started)){ tsk_timer_t *timer; - timer = TSK_TIMER_CREATE(timeout, callback, arg); + timer = (tsk_timer_t*)TSK_TIMER_CREATE(timeout, callback, arg); timer_id = timer->id; tsk_mutex_lock(manager->mutex); tsk_list_push_ascending_data(manager->timers, ((void**) &timer)); @@ -216,7 +216,7 @@ tsk_timer_id_t tsk_timer_manager_schedule(tsk_timer_manager_handle_t *self, uint int tsk_timer_manager_cancel(tsk_timer_manager_handle_t *self, tsk_timer_id_t id) { int ret = -1; - tsk_timer_manager_t *manager = self; + tsk_timer_manager_t *manager = (tsk_timer_manager_t*)self; /* Check validity. */ if(!TSK_TIMER_ID_IS_VALID(id)){ /* Very common. */ @@ -228,7 +228,7 @@ int tsk_timer_manager_cancel(tsk_timer_manager_handle_t *self, tsk_timer_id_t id tsk_mutex_lock(manager->mutex); item = tsk_list_find_item_by_pred(manager->timers, __tsk_pred_find_timer_by_id, &id); if(item && item->data){ - tsk_timer_t *timer = item->data; + tsk_timer_t *timer = (tsk_timer_t*)item->data; timer->canceled = 1; timer->callback = tsk_null; @@ -254,11 +254,11 @@ int tsk_timer_manager_destroy(tsk_timer_manager_handle_t **self) return 0; } -static void *run(void* self) +static void* TSK_STDCALL run(void* self) { int ret; tsk_list_item_t *curr; - tsk_timer_manager_t *manager = self; + tsk_timer_manager_t *manager = (tsk_timer_manager_t*)self; TSK_RUNNABLE(manager)->running = tsk_true; // VERY IMPORTANT --> needed by the main thread @@ -291,18 +291,18 @@ static int __tsk_pred_find_timer_by_id(const tsk_list_item_t *item, const void * { tsk_timer_t *timer; if(item && item->data){ - timer = item->data; + timer = (tsk_timer_t*)item->data; return (int)(timer->id - *((tsk_timer_id_t*)id)); } return -1; } -static void *__tsk_timer_manager_mainthread(void *param) +static void* TSK_STDCALL __tsk_timer_manager_mainthread(void *param) { int ret; tsk_timer_t *curr; uint64_t now; - tsk_timer_manager_t *manager = param; + tsk_timer_manager_t *manager = (tsk_timer_manager_t*)param; TSK_DEBUG_INFO("TIMER MANAGER -- START"); @@ -321,7 +321,7 @@ peek_first: if(curr && !curr->canceled) { now = tsk_time_now(); if(now >= curr->timeout){ - tsk_timer_t *timer = tsk_object_ref(curr); + tsk_timer_t *timer = (tsk_timer_t*)tsk_object_ref(curr); //TSK_DEBUG_INFO("Timer raise %llu", timer->id); TSK_RUNNABLE_ENQUEUE_OBJECT_SAFE(TSK_RUNNABLE(manager), timer); @@ -364,10 +364,10 @@ static int __timer_mgr_start_count = 0; int tsk_timer_mgr_global_ref() { if(!__timer_mgr){ - __timer_mgr = tsk_timer_manager_create(); + __timer_mgr = (tsk_timer_manager_t*)tsk_timer_manager_create(); } else{ - __timer_mgr = tsk_object_ref(__timer_mgr); + __timer_mgr = (tsk_timer_manager_t*)tsk_object_ref(__timer_mgr); } return 0; } @@ -441,7 +441,7 @@ int tsk_timer_mgr_global_unref() return -1; } - __timer_mgr = tsk_object_unref(__timer_mgr); + __timer_mgr = (tsk_timer_manager_t*)tsk_object_unref(__timer_mgr); return 0; } @@ -457,7 +457,7 @@ int tsk_timer_mgr_global_unref() // static tsk_object_t* tsk_timer_manager_ctor(tsk_object_t * self, va_list * app) { - tsk_timer_manager_t *manager = self; + tsk_timer_manager_t *manager = (tsk_timer_manager_t*)self; if(manager){ manager->timers = tsk_list_create(); manager->sem = tsk_semaphore_create(); @@ -469,7 +469,7 @@ static tsk_object_t* tsk_timer_manager_ctor(tsk_object_t * self, va_list * app) static tsk_object_t* tsk_timer_manager_dtor(tsk_object_t * self) { - tsk_timer_manager_t *manager = self; + tsk_timer_manager_t *manager = (tsk_timer_manager_t*)self; if(manager){ tsk_timer_manager_stop(manager); @@ -503,7 +503,7 @@ const tsk_object_def_t * tsk_timer_manager_def_t = &tsk_timer_manager_def_s; static tsk_object_t* tsk_timer_ctor(tsk_object_t * self, va_list * app) { static tsk_timer_id_t tsk_unique_timer_id = 1; - tsk_timer_t *timer = self; + tsk_timer_t *timer = (tsk_timer_t*)self; if(timer){ timer->id = tsk_unique_timer_id++; timer->timeout = va_arg(*app, uint64_t); @@ -517,7 +517,7 @@ static tsk_object_t* tsk_timer_ctor(tsk_object_t * self, va_list * app) static tsk_object_t* tsk_timer_dtor(tsk_object_t * self) { - tsk_timer_t *timer = self; + tsk_timer_t *timer = (tsk_timer_t*)self; if(timer){ } @@ -526,8 +526,8 @@ static tsk_object_t* tsk_timer_dtor(tsk_object_t * self) static int tsk_timer_cmp(const tsk_object_t *obj1, const tsk_object_t *obj2) { - const tsk_timer_t *t1 = obj1; - const tsk_timer_t *t2 = obj2; + const tsk_timer_t *t1 = (const tsk_timer_t *)obj1; + const tsk_timer_t *t2 = (const tsk_timer_t *)obj2; if(t1 && t2){ return (int)(t1->timeout - t2->timeout); diff --git a/branches/2.0/doubango/tinySAK/src/tsk_url.c b/branches/2.0/doubango/tinySAK/src/tsk_url.c index 6bd90ab2..05034832 100644 --- a/branches/2.0/doubango/tinySAK/src/tsk_url.c +++ b/branches/2.0/doubango/tinySAK/src/tsk_url.c @@ -47,7 +47,7 @@ * */ char* tsk_url_encode(const char* url) { - char *purl = (char*)url, *buf = tsk_malloc(tsk_strlen(url) * 3 + 1), *pbuf = buf; + char *purl = (char*)url, *buf = (char*)tsk_malloc(tsk_strlen(url) * 3 + 1), *pbuf = buf; while (*purl) { if (isalnum(*purl) || *purl == '-' || *purl == '_' || *purl == '.' || *purl == '~'){ *pbuf++ = *purl; @@ -72,7 +72,7 @@ char* tsk_url_encode(const char* url) { * @sa tsk_url_encode */ char* tsk_url_decode(const char* url) { - char *purl = (char*)url, *buf = tsk_malloc(tsk_strlen(url) + 1), *pbuf = buf; + char *purl = (char*)url, *buf = (char*)tsk_malloc(tsk_strlen(url) + 1), *pbuf = buf; while (*purl) { if (*purl == '%') { if (purl[1] && purl[2]) { diff --git a/branches/2.0/doubango/tinySAK/winrt/ThreadEmulation.cxx b/branches/2.0/doubango/tinySAK/winrt/ThreadEmulation.cxx new file mode 100644 index 00000000..406badd1 --- /dev/null +++ b/branches/2.0/doubango/tinySAK/winrt/ThreadEmulation.cxx @@ -0,0 +1,356 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. + +#include "ThreadEmulation.h" + +#include +#include +#include +#include +#include + +using namespace std; +using namespace Platform; +using namespace Windows::Foundation; +using namespace Windows::System::Threading; + + +namespace ThreadEmulation +{ + // Stored data for CREATE_SUSPENDED and ResumeThread. + struct PendingThreadInfo + { + LPTHREAD_START_ROUTINE lpStartAddress; + LPVOID lpParameter; + HANDLE completionEvent; + int nPriority; + }; + + static map pendingThreads; + static mutex pendingThreadsLock; + + + // Thread local storage. + typedef vector ThreadLocalData; + + static __declspec(thread) ThreadLocalData* currentThreadData = nullptr; + static set allThreadData; + static DWORD nextTlsIndex = 0; + static vector freeTlsIndices; + static mutex tlsAllocationLock; + + + // Converts a Win32 thread priority to WinRT format. + static WorkItemPriority GetWorkItemPriority(int nPriority) + { + if (nPriority < 0) + return WorkItemPriority::Low; + else if (nPriority > 0) + return WorkItemPriority::High; + else + return WorkItemPriority::Normal; + } + + + // Helper shared between CreateThread and ResumeThread. + static void StartThread(LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, HANDLE completionEvent, int nPriority) + { + auto workItemHandler = ref new WorkItemHandler([=](IAsyncAction^) + { + // Run the user callback. + try + { + lpStartAddress(lpParameter); + } + catch (...) { } + + // Clean up any TLS allocations made by this thread. + TlsShutdown(); + + // Signal that the thread has completed. + SetEvent(completionEvent); + CloseHandle(completionEvent); + + }, CallbackContext::Any); + + ThreadPool::RunAsync(workItemHandler, GetWorkItemPriority(nPriority), WorkItemOptions::TimeSliced); + } + + + _Use_decl_annotations_ HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES unusedThreadAttributes, SIZE_T unusedStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD unusedThreadId) + { + // Validate parameters. + assert(unusedThreadAttributes == nullptr); + assert(unusedStackSize == 0); + assert((dwCreationFlags & ~CREATE_SUSPENDED) == 0); + assert(unusedThreadId == nullptr); + + // Create a handle that will be signalled when the thread has completed. + HANDLE threadHandle = CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); + + if (!threadHandle) + return nullptr; + + // Make a copy of the handle for internal use. This is necessary because + // the caller is responsible for closing the handle returned by CreateThread, + // and they may do that before or after the thread has finished running. + HANDLE completionEvent; + + if (!DuplicateHandle(GetCurrentProcess(), threadHandle, GetCurrentProcess(), &completionEvent, 0, false, DUPLICATE_SAME_ACCESS)) + { + CloseHandle(threadHandle); + return nullptr; + } + + try + { + if (dwCreationFlags & CREATE_SUSPENDED) + { + // Store info about a suspended thread. + PendingThreadInfo info; + + info.lpStartAddress = lpStartAddress; + info.lpParameter = lpParameter; + info.completionEvent = completionEvent; + info.nPriority = 0; + + lock_guard lock(pendingThreadsLock); + + pendingThreads[threadHandle] = info; + } + else + { + // Start the thread immediately. + StartThread(lpStartAddress, lpParameter, completionEvent, 0); + } + + return threadHandle; + } + catch (...) + { + // Clean up if thread creation fails. + CloseHandle(threadHandle); + CloseHandle(completionEvent); + + return nullptr; + } + } + + + _Use_decl_annotations_ DWORD WINAPI ResumeThread(HANDLE hThread) + { + lock_guard lock(pendingThreadsLock); + + // Look up the requested thread. + auto threadInfo = pendingThreads.find(hThread); + + if (threadInfo == pendingThreads.end()) + { + // Can only resume threads while they are in CREATE_SUSPENDED state. + assert(false); + return (DWORD)-1; + } + + // Start the thread. + try + { + PendingThreadInfo& info = threadInfo->second; + + StartThread(info.lpStartAddress, info.lpParameter, info.completionEvent, info.nPriority); + } + catch (...) + { + return (DWORD)-1; + } + + // Remove this thread from the pending list. + pendingThreads.erase(threadInfo); + + return 0; + } + + + _Use_decl_annotations_ BOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority) + { + lock_guard lock(pendingThreadsLock); + + // Look up the requested thread. + auto threadInfo = pendingThreads.find(hThread); + + if (threadInfo == pendingThreads.end()) + { + // Can only set priority on threads while they are in CREATE_SUSPENDED state. + assert(false); + return false; + } + + // Store the new priority. + threadInfo->second.nPriority = nPriority; + + return true; + } + + + _Use_decl_annotations_ VOID WINAPI Sleep(DWORD dwMilliseconds) + { + static HANDLE singletonEvent = nullptr; + + HANDLE sleepEvent = singletonEvent; + + // Demand create the event. + if (!sleepEvent) + { + sleepEvent = CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); + + if (!sleepEvent) + return; + + HANDLE previousEvent = InterlockedCompareExchangePointerRelease(&singletonEvent, sleepEvent, nullptr); + + if (previousEvent) + { + // Back out if multiple threads try to demand create at the same time. + CloseHandle(sleepEvent); + sleepEvent = previousEvent; + } + } + + // Emulate sleep by waiting with timeout on an event that is never signalled. + WaitForSingleObjectEx(sleepEvent, dwMilliseconds, false); + } + + + DWORD WINAPI TlsAlloc() + { + lock_guard lock(tlsAllocationLock); + + // Can we reuse a previously freed TLS slot? + if (!freeTlsIndices.empty()) + { + DWORD result = freeTlsIndices.back(); + freeTlsIndices.pop_back(); + return result; + } + + // Allocate a new TLS slot. + return nextTlsIndex++; + } + + + _Use_decl_annotations_ BOOL WINAPI TlsFree(DWORD dwTlsIndex) + { + lock_guard lock(tlsAllocationLock); + + assert(dwTlsIndex < nextTlsIndex); + assert(find(freeTlsIndices.begin(), freeTlsIndices.end(), dwTlsIndex) == freeTlsIndices.end()); + + // Store this slot for reuse by TlsAlloc. + try + { + freeTlsIndices.push_back(dwTlsIndex); + } + catch (...) + { + return false; + } + + // Zero the value for all threads that might be using this now freed slot. + for each (auto threadData in allThreadData) + { + if (threadData->size() > dwTlsIndex) + { + threadData->at(dwTlsIndex) = nullptr; + } + } + + return true; + } + + + _Use_decl_annotations_ LPVOID WINAPI TlsGetValue(DWORD dwTlsIndex) + { + ThreadLocalData* threadData = currentThreadData; + + if (threadData && threadData->size() > dwTlsIndex) + { + // Return the value of an allocated TLS slot. + return threadData->at(dwTlsIndex); + } + else + { + // Default value for unallocated slots. + return nullptr; + } + } + + + _Use_decl_annotations_ BOOL WINAPI TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) + { + ThreadLocalData* threadData = currentThreadData; + + if (!threadData) + { + // First time allocation of TLS data for this thread. + try + { + threadData = new ThreadLocalData(dwTlsIndex + 1, nullptr); + + lock_guard lock(tlsAllocationLock); + + allThreadData.insert(threadData); + + currentThreadData = threadData; + } + catch (...) + { + if (threadData) + delete threadData; + + return false; + } + } + else if (threadData->size() <= dwTlsIndex) + { + // This thread already has a TLS data block, but it must be expanded to fit the specified slot. + try + { + lock_guard lock(tlsAllocationLock); + + threadData->resize(dwTlsIndex + 1, nullptr); + } + catch (...) + { + return false; + } + } + + // Store the new value for this slot. + threadData->at(dwTlsIndex) = lpTlsValue; + + return true; + } + + + // Called at thread exit to clean up TLS allocations. + void WINAPI TlsShutdown() + { + ThreadLocalData* threadData = currentThreadData; + + if (threadData) + { + { + lock_guard lock(tlsAllocationLock); + + allThreadData.erase(threadData); + } + + currentThreadData = nullptr; + + delete threadData; + } + } +} \ No newline at end of file diff --git a/branches/2.0/doubango/tinySAK/winrt/ThreadEmulation.h b/branches/2.0/doubango/tinySAK/winrt/ThreadEmulation.h new file mode 100644 index 00000000..5a009b9c --- /dev/null +++ b/branches/2.0/doubango/tinySAK/winrt/ThreadEmulation.h @@ -0,0 +1,53 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// +// Emulates a subset of the Win32 threading API as a layer on top of WinRT threadpools. +// +// Supported features: +// +// - CreateThread (returns a standard Win32 handle which can be waited on, then closed) +// - CREATE_SUSPENDED and ResumeThread +// - Partial support for SetThreadPriority (see below) +// - Sleep +// - Thread local storage (TlsAlloc, TlsFree, TlsGetValue, TlsSetValue) +// +// Differences from Win32: +// +// - If using TLS other than from this CreateThread emulation, call TlsShutdown before thread/task exit +// - No ExitThread or TerminateThread (just return from the thread function to exit) +// - No SuspendThread, so ResumeThread is only useful in combination with CREATE_SUSPENDED +// - SetThreadPriority is only available while a thread is in CREATE_SUSPENDED state +// - SetThreadPriority only supports three priority levels (negative, zero, or positive) +// - No thread identifier APIs (GetThreadId, GetCurrentThreadId, OpenThread) +// - No affinity APIs +// - No GetExitCodeThread +// - Failure cases return error codes but do not always call SetLastError + +#pragma once + +#include + +namespace ThreadEmulation +{ + #ifndef CREATE_SUSPENDED + #define CREATE_SUSPENDED 0x00000004 + #endif + + HANDLE WINAPI CreateThread(_In_opt_ LPSECURITY_ATTRIBUTES unusedThreadAttributes, _In_ SIZE_T unusedStackSize, _In_ LPTHREAD_START_ROUTINE lpStartAddress, _In_opt_ LPVOID lpParameter, _In_ DWORD dwCreationFlags, _Out_opt_ LPDWORD unusedThreadId); + DWORD WINAPI ResumeThread(_In_ HANDLE hThread); + BOOL WINAPI SetThreadPriority(_In_ HANDLE hThread, _In_ int nPriority); + + VOID WINAPI Sleep(_In_ DWORD dwMilliseconds); + + DWORD WINAPI TlsAlloc(); + BOOL WINAPI TlsFree(_In_ DWORD dwTlsIndex); + LPVOID WINAPI TlsGetValue(_In_ DWORD dwTlsIndex); + BOOL WINAPI TlsSetValue(_In_ DWORD dwTlsIndex, _In_opt_ LPVOID lpTlsValue); + + void WINAPI TlsShutdown(); +} diff --git a/branches/2.0/doubango/tinySAK/winrt/tinySAK.sln b/branches/2.0/doubango/tinySAK/winrt/tinySAK.sln new file mode 100644 index 00000000..48b99ad4 --- /dev/null +++ b/branches/2.0/doubango/tinySAK/winrt/tinySAK.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinySAK/winrt/tinySAK.vcxproj b/branches/2.0/doubango/tinySAK/winrt/tinySAK.vcxproj new file mode 100644 index 00000000..0318b0cb --- /dev/null +++ b/branches/2.0/doubango/tinySAK/winrt/tinySAK.vcxproj @@ -0,0 +1,498 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {19279f5b-cdaf-4187-9f09-2a896a828b05} + tinySAK + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + + + DynamicLibrary + true + v110_wp80 + + + DynamicLibrary + false + true + v110_wp80 + + + DynamicLibrary + false + true + v110_wp80 + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + _USRDLL;TINYSAK_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + + + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories);$(ReferencePath)\platform.winmd + false + false + true + + + Console + false + ole32.lib;%(IgnoreSpecificDefaultLibraries) + false + true + + + + + _USRDLL;TINYSAK_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + pch.h + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories);$(ReferencePath)\platform.winmd + false + true + + + Console + false + ole32.lib;%(IgnoreSpecificDefaultLibraries) + false + + + + + _USRDLL;TINYSAK_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + + + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories);$(ReferencePath)\platform.winmd + false + true + + + false + + + Console + false + ole32.lib;%(IgnoreSpecificDefaultLibraries) + false + + + + + _USRDLL;TINYSAK_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + pch.h + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories);$(ReferencePath)\platform.winmd + false + true + + + Console + false + ole32.lib;%(IgnoreSpecificDefaultLibraries) + false + + + + + true + false + + + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + true + true + true + true + CompileAsCpp + CompileAsCpp + CompileAsCpp + CompileAsCpp + + + CompileAsCpp + CompileAsCpp + true + true + true + true + CompileAsCpp + CompileAsCpp + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + false + false + false + false + Default + Default + Default + Default + + + true + false + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinySAK/winrt/tinySAK.vcxproj.filters b/branches/2.0/doubango/tinySAK/winrt/tinySAK.vcxproj.filters new file mode 100644 index 00000000..e35ca7d6 --- /dev/null +++ b/branches/2.0/doubango/tinySAK/winrt/tinySAK.vcxproj.filters @@ -0,0 +1,220 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {14a86895-6244-4a99-9e61-cbd96bf19be9} + + + {b68f6986-dd43-4556-bc50-e8d4d11b99f4} + + + {68ddbf5e-dc6c-49fb-8861-6ef6af0e0f28} + + + {1d5f9aa6-82a9-4fd4-96f4-c8a6359b5d8b} + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src\winrt + + + src + + + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include\winrt + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinySDP/include/tinysdp_config.h b/branches/2.0/doubango/tinySDP/include/tinysdp_config.h index 55f66220..dd06a7a3 100644 --- a/branches/2.0/doubango/tinySDP/include/tinysdp_config.h +++ b/branches/2.0/doubango/tinySDP/include/tinysdp_config.h @@ -27,16 +27,19 @@ #undef _WIN32 /* Because of WINSCW */ #endif -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition. #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TSDP_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TSDP_UNDER_WINDOWS_RT 1 +# endif #endif + #if (TSDP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYSDP_EXPORTS) # define TINYSDP_API __declspec(dllexport) -# define TINYSDP_GEXTERN __declspec(dllexport) -#elif (TSDP_UNDER_WINDOWS || defined(__SYMBIAN32__)) /*&& defined(TINYSDP_IMPORTS)*/ +# define TINYSDP_GEXTERN extern __declspec(dllexport) +#elif (TSDP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && !defined(TINYSDP_IMPORTS_IGNORE) # define TINYSDP_API __declspec(dllimport) # define TINYSDP_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_A.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_A.rl index 2105d9f7..5da29737 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_A.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_A.rl @@ -113,7 +113,7 @@ tsdp_header_A_t *tsdp_header_A_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_A_t *hdr_A = tsdp_header_A_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; %%write init; diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_B.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_B.rl index c08aa860..d3d3866e 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_B.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_B.rl @@ -111,7 +111,7 @@ tsdp_header_B_t *tsdp_header_B_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_B_t *hdr_B = tsdp_header_B_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_B_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_C.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_C.rl index 5027846f..83da5981 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_C.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_C.rl @@ -116,7 +116,7 @@ tsdp_header_C_t *tsdp_header_C_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_C_t *hdr_C = tsdp_header_c_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_C_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Dummy.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Dummy.rl index 85fd7e4d..0a57879e 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Dummy.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Dummy.rl @@ -106,7 +106,7 @@ tsdp_header_Dummy_t *tsdp_header_Dummy_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_Dummy_t *hdr_Dummy = tsdp_header_dummy_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_Dummy_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_E.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_E.rl index ff5ca0f6..659f96d1 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_E.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_E.rl @@ -102,7 +102,7 @@ tsdp_header_E_t *tsdp_header_E_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_E_t *hdr_E = tsdp_header_E_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_E_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_I.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_I.rl index 1bc11c23..1eceb758 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_I.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_I.rl @@ -102,7 +102,7 @@ tsdp_header_I_t *tsdp_header_I_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_I_t *hdr_I = tsdp_header_I_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_I_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_K.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_K.rl index 34a3b0c6..7316a762 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_K.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_K.rl @@ -102,7 +102,7 @@ tsdp_header_K_t *tsdp_header_K_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_K_t *hdr_K = tsdp_header_K_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_K_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_M.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_M.rl index 9d9b8924..85bf7db8 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_M.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_M.rl @@ -218,7 +218,7 @@ tsdp_header_M_t *tsdp_header_M_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_M_t *hdr_M = tsdp_header_M_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_M_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_O.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_O.rl index 219f6f3d..0853953e 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_O.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_O.rl @@ -142,7 +142,7 @@ tsdp_header_O_t *tsdp_header_O_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_O_t *hdr_O = tsdp_header_O_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_O_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_P.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_P.rl index c78c8652..063275fe 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_P.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_P.rl @@ -101,7 +101,7 @@ tsdp_header_P_t *tsdp_header_P_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_P_t *hdr_P = tsdp_header_P_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_P_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_R.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_R.rl index d6b6ea0a..55bea0ab 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_R.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_R.rl @@ -141,7 +141,7 @@ tsdp_header_R_t *tsdp_header_R_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_R_t *hdr_R = tsdp_header_R_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_R_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_S.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_S.rl index f26664c5..2fd0422e 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_S.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_S.rl @@ -100,7 +100,7 @@ tsdp_header_S_t *tsdp_header_S_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_S_t *hdr_S = tsdp_header_S_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_S_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_T.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_T.rl index 458678d4..16854235 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_T.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_T.rl @@ -155,7 +155,7 @@ tsdp_header_T_t *tsdp_header_T_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_T_t *hdr_T = tsdp_header_T_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_T_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_U.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_U.rl index 7b5ef570..cb2f2e4a 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_U.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_U.rl @@ -102,7 +102,7 @@ tsdp_header_U_t *tsdp_header_U_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_U_t *hdr_U = tsdp_header_U_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_U_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_V.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_V.rl index 8e8e08c3..dcfcb274 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_V.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_V.rl @@ -101,7 +101,7 @@ tsdp_header_V_t *tsdp_header_V_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_V_t *hdr_V = tsdp_header_V_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_V_first_final); diff --git a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Z.rl b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Z.rl index c92c47ad..e8d3770d 100644 --- a/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Z.rl +++ b/branches/2.0/doubango/tinySDP/ragel/tsdp_parser_header_Z.rl @@ -122,7 +122,7 @@ int tsdp_header_Z_tostring(const tsdp_header_t* header, tsk_buffer_t* output) const tsdp_zone_t* zone; tsk_list_foreach(item, Z->zones){ - zone = item->data; + zone = (const tsdp_zone_t*)item->data; // time SP ["-"] typed-time tsk_buffer_append_2(output, "%s%llu %s%s", TSK_LIST_IS_FIRST(Z->zones, item) ? "" : " ", @@ -145,7 +145,7 @@ tsdp_header_Z_t *tsdp_header_Z_parse(const char *data, tsk_size_t size) tsdp_header_Z_t *hdr_Z = tsdp_header_Z_create_null(); tsdp_zone_t* zone = tsk_null; - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(tsdp_machine_parser_header_Z_first_final); diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_A.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_A.c index f069778b..923d99f8 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_A.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_A.c @@ -91,7 +91,7 @@ tsdp_header_A_t *tsdp_header_A_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_A_t *hdr_A = tsdp_header_A_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 98 "./src/headers/tsdp_header_A.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_B.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_B.c index f2c1fb41..e6d44445 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_B.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_B.c @@ -89,7 +89,7 @@ tsdp_header_B_t *tsdp_header_B_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_B_t *hdr_B = tsdp_header_B_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 96 "./src/headers/tsdp_header_B.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_C.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_C.c index 055fa171..ec8d1db9 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_C.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_C.c @@ -90,7 +90,7 @@ tsdp_header_C_t *tsdp_header_C_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_C_t *hdr_C = tsdp_header_c_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 97 "./src/headers/tsdp_header_C.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Dummy.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Dummy.c index 9c3d3759..197833a2 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Dummy.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Dummy.c @@ -87,7 +87,7 @@ tsdp_header_Dummy_t *tsdp_header_Dummy_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_Dummy_t *hdr_Dummy = tsdp_header_dummy_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 94 "./src/headers/tsdp_header_Dummy.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_E.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_E.c index 9d1c9e03..9d80d7f4 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_E.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_E.c @@ -87,7 +87,7 @@ tsdp_header_E_t *tsdp_header_E_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_E_t *hdr_E = tsdp_header_E_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 94 "./src/headers/tsdp_header_E.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_I.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_I.c index 1c83606f..b9443866 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_I.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_I.c @@ -87,7 +87,7 @@ tsdp_header_I_t *tsdp_header_I_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_I_t *hdr_I = tsdp_header_I_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 94 "./src/headers/tsdp_header_I.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_K.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_K.c index 0ba1c51d..7d76eafb 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_K.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_K.c @@ -87,7 +87,7 @@ tsdp_header_K_t *tsdp_header_K_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_K_t *hdr_K = tsdp_header_K_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 94 "./src/headers/tsdp_header_K.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_M.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_M.c index e8a15173..a0503b24 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_M.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_M.c @@ -181,7 +181,7 @@ tsdp_header_M_t *tsdp_header_M_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_M_t *hdr_M = tsdp_header_M_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 188 "./src/headers/tsdp_header_M.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_O.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_O.c index 267b74f9..58ce5452 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_O.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_O.c @@ -101,7 +101,7 @@ tsdp_header_O_t *tsdp_header_O_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_O_t *hdr_O = tsdp_header_O_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 108 "./src/headers/tsdp_header_O.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_P.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_P.c index 0303c3a0..5e93da76 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_P.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_P.c @@ -86,7 +86,7 @@ tsdp_header_P_t *tsdp_header_P_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_P_t *hdr_P = tsdp_header_P_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 93 "./src/headers/tsdp_header_P.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_R.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_R.c index e50253aa..e59705a9 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_R.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_R.c @@ -112,7 +112,7 @@ tsdp_header_R_t *tsdp_header_R_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_R_t *hdr_R = tsdp_header_R_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 119 "./src/headers/tsdp_header_R.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_S.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_S.c index f5d152b4..20254f53 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_S.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_S.c @@ -85,7 +85,7 @@ tsdp_header_S_t *tsdp_header_S_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_S_t *hdr_S = tsdp_header_S_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 92 "./src/headers/tsdp_header_S.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_T.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_T.c index c8222a4c..0908bf05 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_T.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_T.c @@ -122,7 +122,7 @@ tsdp_header_T_t *tsdp_header_T_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_T_t *hdr_T = tsdp_header_T_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 129 "./src/headers/tsdp_header_T.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_U.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_U.c index 78eace2e..3e8204f7 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_U.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_U.c @@ -87,7 +87,7 @@ tsdp_header_U_t *tsdp_header_U_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_U_t *hdr_U = tsdp_header_U_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 94 "./src/headers/tsdp_header_U.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_V.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_V.c index f79c8775..107885d9 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_V.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_V.c @@ -86,7 +86,7 @@ tsdp_header_V_t *tsdp_header_V_parse(const char *data, tsk_size_t size) const char *eof = pe; tsdp_header_V_t *hdr_V = tsdp_header_V_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 93 "./src/headers/tsdp_header_V.c" */ diff --git a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Z.c b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Z.c index e654c706..7105dfdd 100644 --- a/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Z.c +++ b/branches/2.0/doubango/tinySDP/src/headers/tsdp_header_Z.c @@ -75,7 +75,7 @@ int tsdp_header_Z_tostring(const tsdp_header_t* header, tsk_buffer_t* output) const tsdp_zone_t* zone; tsk_list_foreach(item, Z->zones){ - zone = item->data; + zone = (const tsdp_zone_t*)item->data; // time SP ["-"] typed-time tsk_buffer_append_2(output, "%s%llu %s%s", TSK_LIST_IS_FIRST(Z->zones, item) ? "" : " ", @@ -98,7 +98,7 @@ tsdp_header_Z_t *tsdp_header_Z_parse(const char *data, tsk_size_t size) tsdp_header_Z_t *hdr_Z = tsdp_header_Z_create_null(); tsdp_zone_t* zone = tsk_null; - const char *tag_start; + const char *tag_start = tsk_null; /* #line 105 "./src/headers/tsdp_header_Z.c" */ diff --git a/branches/2.0/doubango/tinySDP/winrt/tinySDP.sln b/branches/2.0/doubango/tinySDP/winrt/tinySDP.sln new file mode 100644 index 00000000..12ff45e9 --- /dev/null +++ b/branches/2.0/doubango/tinySDP/winrt/tinySDP.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySDP", "tinySDP.vcxproj", "{982D737A-0649-4C32-A00E-08992A0B7673}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.ActiveCfg = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.Build.0 = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.ActiveCfg = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.Build.0 = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.ActiveCfg = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.Build.0 = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.ActiveCfg = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinySDP/winrt/tinySDP.vcxproj b/branches/2.0/doubango/tinySDP/winrt/tinySDP.vcxproj new file mode 100644 index 00000000..3cba79d9 --- /dev/null +++ b/branches/2.0/doubango/tinySDP/winrt/tinySDP.vcxproj @@ -0,0 +1,206 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {982d737a-0649-4c32-a00e-08992a0b7673} + tinySDP + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYSDP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src;..\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYSDP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src;..\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYSDP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src;..\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;_USRDLL;TINYSDP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src;..\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinySDP/winrt/tinySDP.vcxproj.filters b/branches/2.0/doubango/tinySDP/winrt/tinySDP.vcxproj.filters new file mode 100644 index 00000000..340710c7 --- /dev/null +++ b/branches/2.0/doubango/tinySDP/winrt/tinySDP.vcxproj.filters @@ -0,0 +1,163 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {6c2faa44-5090-44b2-91e6-7ce9f6fd9a02} + + + {5cd1b5d6-dc8a-4af0-812f-759f106f3866} + + + {8e666991-781a-484c-b418-f459aebe9f07} + + + {bef68431-49a9-480b-9ffb-b874fdcc2bae} + + + {342545e6-db3c-4de2-8893-975a82c6345c} + + + {41f36a8f-315b-4cf6-80b0-e4ef5f321d7f} + + + {0bbe2e42-02e7-4259-8519-a75cb32c121d} + + + + + source + + + source + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\headers + + + source\parsers + + + + + include + + + include + + + include + + + include\tinysdp + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\headers + + + include\tinysdp\parsers + + + include\tinysdp\parsers + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinySIGCOMP/src/tinysigcomp_config.h b/branches/2.0/doubango/tinySIGCOMP/src/tinysigcomp_config.h index d30bf179..833b7b2e 100644 --- a/branches/2.0/doubango/tinySIGCOMP/src/tinysigcomp_config.h +++ b/branches/2.0/doubango/tinySIGCOMP/src/tinysigcomp_config.h @@ -27,16 +27,18 @@ #undef _WIN32 /* Because of WINSCW */ #endif -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition. #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TCOMP_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TCOMP_UNDER_WINDOWS_RT 1 +# endif #endif #if !defined(__GNUC__) && defined(TINYSIGCOMP_EXPORTS) # define TINYSIGCOMP_API __declspec(dllexport) # define TINYSIGCOMP_GEXTERN __declspec(dllexport) -#elif !defined(__GNUC__) /*&& defined(TINYSIGCOMP_IMPORTS)*/ +#elif !defined(__GNUC__) && !defined(TINYSIGCOMP_IMPORTS_IGNORE) # define TINYSIGCOMP_API __declspec(dllimport) # define TINYSIGCOMP_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.sln b/branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.sln new file mode 100644 index 00000000..daa42c0c --- /dev/null +++ b/branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIGCOMP", "tinySIGCOMP.vcxproj", "{F623CBDB-707A-4FDC-ACE0-3D616E239F16}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|ARM.ActiveCfg = Debug|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|ARM.Build.0 = Debug|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|Win32.ActiveCfg = Debug|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|Win32.Build.0 = Debug|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|ARM.ActiveCfg = Release|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|ARM.Build.0 = Release|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|Win32.ActiveCfg = Release|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.vcxproj b/branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.vcxproj new file mode 100644 index 00000000..5595b76b --- /dev/null +++ b/branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.vcxproj @@ -0,0 +1,227 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {f623cbdb-707a-4fdc-ace0-3d616e239f16} + tinySIGCOMP + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + _USRDLL;TINYSIGCOMP_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYSIGCOMP_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYSIGCOMP_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYSIGCOMP_EXPORTS;DEBUG_LEVEL=DEBUG_LEVEL_INFO;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySAK\src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.vcxproj.filters b/branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.vcxproj.filters new file mode 100644 index 00000000..9bc69239 --- /dev/null +++ b/branches/2.0/doubango/tinySIGCOMP/winrt/tinySIGCOMP.vcxproj.filters @@ -0,0 +1,238 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {143487cc-1033-429c-b222-89f7cb4c2167} + + + {7c383d7a-b088-4590-96db-0dd591683d6c} + + + {34e75bcd-00af-4dc3-8d0e-618269904e41} + + + {6e651f90-931e-40f7-a1ac-f73954d0a703} + + + {48a334f9-b115-4a04-ba23-4bc9ffdc5279} + + + {0d888b78-7e4d-4f4a-9a90-1287b08c4c22} + + + {124d42c8-d6f6-4858-8556-e3824c72eeb6} + + + {5d208235-8063-42f0-b84b-6a355b830aee} + + + {6bc14be1-4658-4e46-bb83-cd6cb005b500} + + + {a9353dd8-c3ef-4c3b-a5af-eca077aebb44} + + + + + src\Compressors + + + src\Compressors + + + src\Compressors + + + src\Compressors + + + src\Compressors + + + src\Compressors + + + src\Compressors + + + src\Compressors + + + src\zlib + + + src\zlib + + + src\zlib + + + src\zlib + + + src\zlib + + + src\Dictionaries + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src\SigCompLayer + + + src + + + src + + + src + + + + + include\Compressors + + + include\Compressors + + + include\Compressors + + + include\Compressors + + + include\Dictionaries + + + include\Dictionaries + + + include\Dictionaries + + + include\zlib + + + include\zlib + + + include\zlib + + + include\zlib + + + include\zlib + + + include\SigCompLayer + + + include\SigCompLayer + + + include\SigCompLayer + + + include\SigCompLayer + + + include\SigCompLayer + + + include\SigCompLayer + + + include\SigCompLayer + + + include\SigCompLayer + + + include\SigCompLayer + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include + + + include\Compressors + + + include\SigCompLayer + + + include\SigCompLayer + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_info.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_info.h index 422d5682..5c7f08ed 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_info.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_info.h @@ -38,6 +38,7 @@ TSIP_BEGIN_DECLS #define TSIP_INFO_EVENT(self) ((tsip_info_event_t*)(self)) +//@rinyWRAP typedef enum tsip_info_event_type_e { tsip_i_info, diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h index e6d3939c..7fa5b011 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h @@ -40,6 +40,7 @@ TSIP_BEGIN_DECLS #define TSIP_INVITE_EVENT(self) ((tsip_invite_event_t*)(self)) +//@tinyWRAP typedef enum tsip_invite_event_type_e { // ============================ diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_message.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_message.h index a80a26d8..e52c9140 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_message.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_message.h @@ -38,6 +38,7 @@ TSIP_BEGIN_DECLS #define TSIP_MESSAGE_EVENT(self) ((tsip_message_event_t*)(self)) +//@tinyWRAP typedef enum tsip_message_event_type_e { tsip_i_message, diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_options.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_options.h index 6ddf39d7..1f622114 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_options.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_options.h @@ -38,6 +38,7 @@ TSIP_BEGIN_DECLS #define TSIP_OPTIONS_EVENT(self) ((tsip_options_event_t*)(self)) +//@tinyWRAP typedef enum tsip_options_event_type_e { tsip_i_options, diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_publish.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_publish.h index 971f88e7..c37f2396 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_publish.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_publish.h @@ -38,6 +38,7 @@ TSIP_BEGIN_DECLS #define TSIP_PUBLISH_EVENT(self) ((tsip_publish_event_t*)(self)) +//@tinyWRAP typedef enum tsip_publish_event_type_e { tsip_i_publish, diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_register.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_register.h index aea38118..d1160060 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_register.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_register.h @@ -38,6 +38,7 @@ TSIP_BEGIN_DECLS #define TSIP_REGISTER_EVENT(self) ((tsip_register_event_t*)(self)) +//@tinyWRAP typedef enum tsip_register_event_type_e { tsip_i_newreg, diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_subscribe.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_subscribe.h index 6d2112c4..da7f8c94 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_subscribe.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_subscribe.h @@ -38,6 +38,7 @@ TSIP_BEGIN_DECLS #define TSIP_SUBSCRIBE_EVENT(self) ((tsip_subscribe_event_t*)(self)) +//@tinyWRAP typedef enum tsip_subscribe_event_type_e { tsip_i_subscribe, diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_action.h b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_action.h index ac2761ba..62cbe812 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_action.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_action.h @@ -111,6 +111,7 @@ typedef enum tsip_action_param_type_e aptype_config, aptype_payload, aptype_resp_line, + aptype_media_type, aptype_media, } tsip_action_param_type_t; @@ -119,6 +120,7 @@ tsip_action_param_type_t; #define TSIP_ACTION_SET_PAYLOAD(PAY_PTR, PAY_SIZE) aptype_payload, (const void*)PAY_PTR, (tsk_size_t)PAY_SIZE #define TSIP_ACTION_SET_RESP_LINE(CODE_INT, PHRASE_STR) aptype_resp_line, (int32_t)CODE_INT, (const char*)PHRASE_STR #define TSIP_ACTION_SET_CONFIG(ACTION_CONFIG_HANDLE) aptype_config, (const tsip_action_handle_t*)ACTION_CONFIG_HANDLE +#define TSIP_ACTION_SET_MEDIA_TYPE(TYPE_ENUM) aptype_media_type, (enum tmedia_type_e)TYPE_ENUM #define TSIP_ACTION_SET_MEDIA(...) aptype_media, ##__VA_ARGS__ #define TSIP_ACTION_SET_NULL() aptype_null diff --git a/branches/2.0/doubango/tinySIP/include/tinysip_config.h b/branches/2.0/doubango/tinySIP/include/tinysip_config.h index 4635893b..3359c1be 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip_config.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip_config.h @@ -34,10 +34,20 @@ # define TSIP_UNDER_APPLE 1 #endif +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition +#if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) +# define TSIP_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TSIP_UNDER_WINDOWS_RT 1 +# endif +#elif __APPLE__ +# define TSIP_UNDER_APPLE 1 +#endif + #if !defined(__GNUC__) && defined(TINYSIP_EXPORTS) # define TINYSIP_API __declspec(dllexport) -# define TINYSIP_GEXTERN __declspec(dllexport) -#elif !defined(__GNUC__) /*&& defined(TINYSIP_IMPORTS)*/ +# define TINYSIP_GEXTERN extern __declspec(dllexport) +#elif !defined(__GNUC__) && !defined(TINYSIP_IMPORTS_IGNORE) # define TINYSIP_API __declspec(dllimport) # define TINYSIP_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow.rl index 712713c7..c68239a4 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow.rl @@ -103,7 +103,7 @@ tsip_header_Allow_t *tsip_header_Allow_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Allow_t *hdr_allow = tsip_header_Allow_create(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow_Events.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow_Events.rl index 1eacaeee..72dbab09 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow_Events.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Allow_Events.rl @@ -105,7 +105,7 @@ tsip_header_Allow_Events_t *tsip_header_Allow_Events_parse(const char *data, tsk const char *eof = pe; tsip_header_Allow_Events_t *hdr_allow_events = tsip_header_Allow_Events_create(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Authorization.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Authorization.rl index 66ca369e..ef6b2234 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Authorization.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Authorization.rl @@ -212,7 +212,7 @@ // const char *eof = pe; // tsip_header_Authorization_t *hdr_Authorization = tsip_header_Authorization_create(); // -// const char *tag_start; +// const char *tag_start = tsk_null; // // %%write data; // %%write init; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_CSeq.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_CSeq.rl index 8115ab02..72c8a5d4 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_CSeq.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_CSeq.rl @@ -90,7 +90,7 @@ tsip_header_CSeq_t *tsip_header_CSeq_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_CSeq_t *hdr_cseq = tsip_header_CSeq_create(TSIP_HEADER_CSEQ_NONE, tsk_null); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Call_ID.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Call_ID.rl index d4f3aa5d..b2c2c789 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Call_ID.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Call_ID.rl @@ -97,7 +97,7 @@ tsip_header_Call_ID_t *tsip_header_Call_ID_parse(const char *data, tsk_size_t si const char *eof = pe; tsip_header_Call_ID_t *hdr_call_id = tsip_header_Call_ID_create(0); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Contact.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Contact.rl index a122262d..07571a91 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Contact.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Contact.rl @@ -144,7 +144,7 @@ tsip_header_Contacts_L_t *tsip_header_Contact_parse(const char *data, tsk_size_t const char *eof = pe; tsip_header_Contacts_L_t *hdr_contacts = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Contact_t *curr_contact = 0; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Length.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Length.rl index fa9d1602..fdb08cc8 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Length.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Length.rl @@ -90,7 +90,7 @@ tsip_header_Content_Length_t *tsip_header_Content_Length_parse(const char *data, const char *eof = pe; tsip_header_Content_Length_t *hdr_clength = tsip_header_Content_Length_create(0); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Type.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Type.rl index 55ecca4e..49039969 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Type.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Content_Type.rl @@ -113,7 +113,7 @@ tsip_header_Content_Type_t *tsip_header_Content_Type_parse(const char *data, tsk const char *eof = pe; tsip_header_Content_Type_t *hdr_ctype = tsip_header_Content_Type_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Date.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Date.rl index f338b29a..2fd4300d 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Date.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Date.rl @@ -128,7 +128,7 @@ tsip_header_Date_t *tsip_header_Date_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Date_t *hdr_Date = tsip_header_Date_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Dummy.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Dummy.rl index 1996a27f..d9dff8a4 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Dummy.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Dummy.rl @@ -100,7 +100,7 @@ tsip_header_Dummy_t *tsip_header_Dummy_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Dummy_t *hdr_Dummy = tsip_header_Dummy_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Event.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Event.rl index 947d7bb4..42bfe34f 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Event.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Event.rl @@ -101,7 +101,7 @@ tsip_header_Event_t *tsip_header_Event_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Event_t *hdr_event = tsip_header_Event_create(tsk_null); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Expires.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Expires.rl index 88d3a6d8..786bb4f2 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Expires.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Expires.rl @@ -89,7 +89,7 @@ tsip_header_Expires_t *tsip_header_Expires_parse(const char *data, tsk_size_t si const char *eof = pe; tsip_header_Expires_t *hdr_expires = tsip_header_Expires_create(TSIP_HEADER_EXPIRES_NONE); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_From.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_From.rl index 80b782c8..09c1588e 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_From.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_From.rl @@ -119,7 +119,7 @@ tsip_header_From_t *tsip_header_From_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_From_t *hdr_from = tsip_header_From_create(tsk_null, tsk_null, tsk_null); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Max_Forwards.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Max_Forwards.rl index 7363da8a..17d337ac 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Max_Forwards.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Max_Forwards.rl @@ -90,7 +90,7 @@ tsip_header_Max_Forwards_t *tsip_header_Max_Forwards_parse(const char *data, tsk const char *eof = pe; tsip_header_Max_Forwards_t *hdr_maxf = tsip_header_Max_Forwards_create(TSIP_HEADER_MAX_FORWARDS_NONE); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_Expires.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_Expires.rl index 36914bae..857db8d6 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_Expires.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_Expires.rl @@ -94,7 +94,7 @@ tsip_header_Min_Expires_t *tsip_header_Min_Expires_parse(const char *data, tsk_s const char *eof = pe; tsip_header_Min_Expires_t *hdr_minE = tsip_header_Min_Expires_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_SE.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_SE.rl index 4b07c29c..bac17d20 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_SE.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Min_SE.rl @@ -94,7 +94,7 @@ tsip_header_Min_SE_t *tsip_header_Min_SE_parse(const char *data, tsk_size_t size const char *eof = pe; tsip_header_Min_SE_t *hdr_minse = tsip_header_Min_SE_create(TSIP_SESSION_EXPIRES_MIN_VALUE); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Access_Network_Info.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Access_Network_Info.rl index cc03257f..042ae85e 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Access_Network_Info.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Access_Network_Info.rl @@ -105,7 +105,7 @@ tsip_header_P_Access_Network_Info_t *tsip_header_P_Access_Network_Info_parse(con const char *eof = pe; tsip_header_P_Access_Network_Info_t *hdr_ani = tsip_header_P_Access_Network_Info_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Asserted_Identity.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Asserted_Identity.rl index 7fd4bb18..9f61e702 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Asserted_Identity.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Asserted_Identity.rl @@ -129,7 +129,7 @@ tsip_header_P_Asserted_Identities_L_t *tsip_header_P_Asserted_Identity_parse(con const char *eof = pe; tsip_header_P_Asserted_Identities_L_t *hdr_p_asserted_identities = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_P_Asserted_Identity_t *curr_p_asserted_identity = 0; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Associated_URI.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Associated_URI.rl index ac2393bf..5fb4afd1 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Associated_URI.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Associated_URI.rl @@ -140,7 +140,7 @@ tsip_header_P_Associated_URIs_L_t *tsip_header_P_Associated_URI_parse(const char const char *eof = pe; tsip_header_P_Associated_URIs_L_t *hdr_p_associated_uris = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_P_Associated_URI_t *curr_p_associated_uri = tsk_null; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Charging_Function_Addresses.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Charging_Function_Addresses.rl index d57f5a24..429acac9 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Charging_Function_Addresses.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Charging_Function_Addresses.rl @@ -128,7 +128,7 @@ tsip_header_P_Charging_Function_Addressess_L_t *tsip_header_P_Charging_Function_ const char *eof = pe; tsip_header_P_Charging_Function_Addressess_L_t *hdr_p_charging_function_addressess = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_P_Charging_Function_Addresses_t *curr_p_charging_function_addresses = 0; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Preferred_Identity.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Preferred_Identity.rl index f8ca50a2..03e17202 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Preferred_Identity.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_P_Preferred_Identity.rl @@ -127,7 +127,7 @@ tsip_header_P_Preferred_Identity_t *tsip_header_P_Preferred_Identity_parse(const const char *eof = pe; tsip_header_P_Preferred_Identity_t *hdr_pi = tsip_header_P_Preferred_Identity_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Path.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Path.rl index edd96b96..e4fadad7 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Path.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Path.rl @@ -142,7 +142,7 @@ tsip_header_Paths_L_t *tsip_header_Path_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Paths_L_t *hdr_paths = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Path_t *curr_path = tsk_null; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Privacy.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Privacy.rl index a47172c3..75e7ade9 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Privacy.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Privacy.rl @@ -112,7 +112,7 @@ tsip_header_Privacy_t *tsip_header_Privacy_parse(const char *data, tsk_size_t si const char *eof = pe; tsip_header_Privacy_t *hdr_privacy = tsip_header_Privacy_create(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authenticate.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authenticate.rl index 3e744c84..0a8de4c3 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authenticate.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authenticate.rl @@ -176,7 +176,7 @@ // const char *eof = pe; // tsip_header_Proxy_Authenticate_t *hdr_Proxy_Authenticate = TSIP_HEADER_PROXY_AUTHENTICATE_CREATE(); // -// const char *tag_start; +// const char *tag_start = tsk_null; // // %%write data; // %%write init; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authorization.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authorization.rl index 770b9d86..1e8437bd 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authorization.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Authorization.rl @@ -213,7 +213,7 @@ // const char *eof = pe; // tsip_header_Proxy_Authorization_t *hdr_Proxy_Authorization = TSIP_HEADER_PROXY_AUTHORIZATION_CREATE(); // -// const char *tag_start; +// const char *tag_start = tsk_null; // // %%write data; // %%write init; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Require.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Require.rl index 2995ec17..37998725 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Require.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Proxy_Require.rl @@ -108,7 +108,7 @@ tsip_header_Proxy_Require_t *tsip_header_Proxy_Require_parse(const char *data, t const char *eof = pe; tsip_header_Proxy_Require_t *hdr_proxyrequire = tsip_header_Proxy_Require_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RAck.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RAck.rl index e27b9a10..f96e28e3 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RAck.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RAck.rl @@ -100,7 +100,7 @@ tsip_header_RAck_t *tsip_header_RAck_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_RAck_t *hdr_rack = tsip_header_RAck_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RSeq.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RSeq.rl index 1e6d6bf3..e5a04e39 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RSeq.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_RSeq.rl @@ -92,7 +92,7 @@ tsip_header_RSeq_t *tsip_header_RSeq_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_RSeq_t *hdr_rseq = tsip_header_RSeq_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Record_Route.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Record_Route.rl index 54762fd0..45ac8097 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Record_Route.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Record_Route.rl @@ -139,7 +139,7 @@ int tsip_header_Record_Route_serialize(const tsip_header_t* header, tsk_buffer_t tsip_header_Record_Routes_L_t *hdr_record_routes = tsk_list_create(); tsip_header_Record_Route_t *curr_route = tsk_null; - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_Sub.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_Sub.rl index 2b128d8f..dfe72d1c 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_Sub.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_Sub.rl @@ -100,7 +100,7 @@ tsip_header_Refer_Sub_t *tsip_header_Refer_Sub_parse(const char *data, tsk_size_ const char *eof = pe; tsip_header_Refer_Sub_t *hdr_rsub = tsip_header_Refer_Sub_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_To.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_To.rl index ccf8c2ee..70ce44f5 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_To.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Refer_To.rl @@ -122,7 +122,7 @@ tsip_header_Refer_To_t *tsip_header_Refer_To_parse(const char *data, tsk_size_t const char *eof = pe; tsip_header_Refer_To_t *r_to = tsip_header_Refer_To_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Referred_By.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Referred_By.rl index aa26602c..7e9334fe 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Referred_By.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Referred_By.rl @@ -132,7 +132,7 @@ tsip_header_Referred_By_t *tsip_header_Referred_By_parse(const char *data, tsk_s const char *eof = pe; tsip_header_Referred_By_t *r_by = tsip_header_Referred_By_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Require.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Require.rl index 51dc5701..a3ee3e22 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Require.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Require.rl @@ -107,7 +107,7 @@ tsip_header_Require_t *tsip_header_Require_parse(const char *data, tsk_size_t si const char *eof = pe; tsip_header_Require_t *hdr_require = tsip_header_Require_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Route.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Route.rl index e6238b85..b7773030 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Route.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Route.rl @@ -145,7 +145,7 @@ tsip_header_Routes_L_t *tsip_header_Route_parse(const char *data, tsk_size_t siz const char *eof = pe; tsip_header_Routes_L_t *hdr_routes = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Route_t *curr_route = tsk_null; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_ETag.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_ETag.rl index 2a1d7b17..84e68edf 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_ETag.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_ETag.rl @@ -97,7 +97,7 @@ tsip_header_SIP_ETag_t *tsip_header_SIP_ETag_parse(const char *data, tsk_size_t const char *eof = pe; tsip_header_SIP_ETag_t *hdr_etag = tsip_header_SIP_ETag_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_If_Match.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_If_Match.rl index 4e505954..4fbea6ae 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_If_Match.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_SIP_If_Match.rl @@ -98,7 +98,7 @@ tsip_header_SIP_If_Match_t *tsip_header_SIP_If_Match_parse(const char *data, tsk const char *eof = pe; tsip_header_SIP_If_Match_t *hdr_ifmatch = tsip_header_SIP_If_Match_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Client.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Client.rl index d15ce89a..a49b761c 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Client.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Client.rl @@ -206,7 +206,7 @@ tsip_header_Security_Clients_L_t *tsip_header_Security_Client_parse(const char * const char *eof = pe; tsip_header_Security_Clients_L_t *hdr_securityclients = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Security_Client_t *curr_securityclient = tsk_null; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Server.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Server.rl index 017b085c..06933628 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Server.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Server.rl @@ -207,7 +207,7 @@ tsip_header_Security_Servers_L_t *tsip_header_Security_Server_parse(const char * const char *eof = pe; tsip_header_Security_Servers_L_t *hdr_securityservers = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Security_Server_t *curr_securityserver = tsk_null; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Verify.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Verify.rl index 6a5e90d6..ea24ee1c 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Verify.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Security_Verify.rl @@ -205,7 +205,7 @@ tsip_header_Security_Verifies_L_t *tsip_header_Security_Verify_parse(const char const char *eof = pe; tsip_header_Security_Verifies_L_t *hdr_securityverifies = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Security_Verify_t *curr_securityverify = tsk_null; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Server.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Server.rl index 547881d8..fdee795b 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Server.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Server.rl @@ -101,7 +101,7 @@ tsip_header_Server_t *tsip_header_Server_parse(const char *data, tsk_size_t size const char *eof = pe; tsip_header_Server_t *hdr_server = tsip_header_server_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Service_Route.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Service_Route.rl index f209b8b9..eacc654a 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Service_Route.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Service_Route.rl @@ -141,7 +141,7 @@ tsip_header_Service_Routes_L_t *tsip_header_Service_Route_parse(const char *data const char *eof = pe; tsip_header_Service_Routes_L_t *hdr_services = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Service_Route_t *curr_service = tsk_null; %%write data; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Session_Expires.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Session_Expires.rl index e0d9332a..9b266a41 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Session_Expires.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Session_Expires.rl @@ -105,7 +105,7 @@ tsip_header_Session_Expires_t *tsip_header_Session_Expires_parse(const char *dat const char *eof = pe; tsip_header_Session_Expires_t *hdr_session_expires = tsip_header_Session_Expires_create(TSIP_SESSION_EXPIRES_DEFAULT_VALUE, tsk_false); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Subscription_State.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Subscription_State.rl index d0302b0d..d310f9b9 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Subscription_State.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Subscription_State.rl @@ -119,7 +119,7 @@ tsip_header_Subscription_State_t *tsip_header_Subscription_State_parse(const cha const char *eof = pe; tsip_header_Subscription_State_t *hdr_Subscription_State = tsip_header_Subscription_State_create(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Supported.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Supported.rl index ae9a16a7..6ee87d38 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Supported.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Supported.rl @@ -107,7 +107,7 @@ tsip_header_Supported_t *tsip_header_Supported_parse(const char *data, tsk_size_ const char *eof = pe; tsip_header_Supported_t *hdr_supported = tsip_header_Supported_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_To.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_To.rl index 34fe020d..9099469b 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_To.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_To.rl @@ -124,7 +124,7 @@ tsip_header_To_t *tsip_header_To_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_To_t *hdr_to = tsip_header_To_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_User_Agent.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_User_Agent.rl index f5819beb..028ecff6 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_User_Agent.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_User_Agent.rl @@ -94,7 +94,7 @@ tsip_header_User_Agent_t *tsip_header_User_Agent_parse(const char *data, tsk_siz const char *eof = pe; tsip_header_User_Agent_t *hdr_user_agent = tsip_header_User_Agent_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Via.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Via.rl index d0b1f7e6..d7a0b56c 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Via.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Via.rl @@ -247,7 +247,7 @@ tsip_header_Vias_L_t *tsip_header_Via_parse(const char *data, tsk_size_t size) tsip_header_Vias_L_t *hdr_vias = tsk_list_create(); tsip_header_Via_t *curr_via = tsk_null; - const char *tag_start; + const char *tag_start = tsk_null; %%write data; (void)(eof); diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_WWW_Authenticate.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_WWW_Authenticate.rl index e32d2ea6..5c8200d9 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_WWW_Authenticate.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_WWW_Authenticate.rl @@ -175,7 +175,7 @@ // const char *eof = pe; // tsip_header_WWW_Authenticate_t *hdr_WWW_Authenticate = TSIP_HEADER_WWW_AUTHENTICATE_CREATE(); // -// const char *tag_start; +// const char *tag_start = tsk_null; // // %%write data; // %%write init; diff --git a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Warning.rl b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Warning.rl index 5a407dd0..8158a7d1 100644 --- a/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Warning.rl +++ b/branches/2.0/doubango/tinySIP/ragel/tsip_parser_header_Warning.rl @@ -121,7 +121,7 @@ tsip_header_Warnings_L_t *tsip_header_Warning_parse(const char *data, tsk_size_t const char *eof = pe; tsip_header_Warnings_L_t *hdr_warnings = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Warning_t *curr_warning = 0; %%write data; diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.server.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.server.c index dd5492c4..348849da 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.server.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.server.c @@ -579,6 +579,7 @@ int s0000_Ringing_2_Connected_X_Accept(va_list *app) tsip_dialog_invite_t *self; const tsip_action_t* action; + tsk_bool_t mediaType_changed; self = va_arg(*app, tsip_dialog_invite_t *); va_arg(*app, const tsip_message_t *); @@ -587,14 +588,20 @@ int s0000_Ringing_2_Connected_X_Accept(va_list *app) /* Determine whether the remote party support UPDATE */ self->support_update = tsip_message_allowed(self->last_iInvite, "UPDATE"); + /* Get Media type from the action */ + mediaType_changed = (TSIP_DIALOG_GET_SS(self)->media.type != action->media.type && action->media.type != tmedia_none); + if(self->msession_mgr && mediaType_changed){ + ret = tmedia_session_mgr_set_media_type(self->msession_mgr, action->media.type); + } + /* Appy media params received from the user */ if(!TSK_LIST_IS_EMPTY(action->media.params)){ - tmedia_session_mgr_set_3(self->msession_mgr, action->media.params); + ret = tmedia_session_mgr_set_3(self->msession_mgr, action->media.params); } /* set MSRP callback */ if((self->msession_mgr->type & tmedia_msrp) == tmedia_msrp){ - tmedia_session_mgr_set_msrp_cb(self->msession_mgr, TSIP_DIALOG_GET_SS(self)->userdata, TSIP_DIALOG_GET_SS(self)->media.msrp.callback); + ret = tmedia_session_mgr_set_msrp_cb(self->msession_mgr, TSIP_DIALOG_GET_SS(self)->userdata, TSIP_DIALOG_GET_SS(self)->media.msrp.callback); } /* Cancel 100rel timer */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow.c index 42ceb225..db0930b7 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow.c @@ -82,7 +82,7 @@ tsip_header_Allow_t *tsip_header_Allow_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Allow_t *hdr_allow = tsip_header_Allow_create(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 89 "./src/headers/tsip_header_Allow.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow_Events.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow_Events.c index 5e13d082..e86a9c4d 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow_Events.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Allow_Events.c @@ -83,7 +83,7 @@ tsip_header_Allow_Events_t *tsip_header_Allow_Events_parse(const char *data, tsk const char *eof = pe; tsip_header_Allow_Events_t *hdr_allow_events = tsip_header_Allow_Events_create(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 90 "./src/headers/tsip_header_Allow_Events.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_CSeq.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_CSeq.c index 8588e3b2..405b9ea8 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_CSeq.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_CSeq.c @@ -68,7 +68,7 @@ tsip_header_CSeq_t *tsip_header_CSeq_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_CSeq_t *hdr_cseq = tsip_header_CSeq_create(TSIP_HEADER_CSEQ_NONE, tsk_null); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 75 "./src/headers/tsip_header_CSeq.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Call_ID.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Call_ID.c index 03e4db54..3920b53e 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Call_ID.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Call_ID.c @@ -78,7 +78,7 @@ tsip_header_Call_ID_t *tsip_header_Call_ID_parse(const char *data, tsk_size_t si const char *eof = pe; tsip_header_Call_ID_t *hdr_call_id = tsip_header_Call_ID_create(0); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 85 "./src/headers/tsip_header_Call_ID.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Contact.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Contact.c index 858581ce..e7abd80f 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Contact.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Contact.c @@ -82,7 +82,7 @@ tsip_header_Contacts_L_t *tsip_header_Contact_parse(const char *data, tsk_size_t const char *eof = pe; tsip_header_Contacts_L_t *hdr_contacts = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Contact_t *curr_contact = 0; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Length.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Length.c index 57e92b31..d209be87 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Length.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Length.c @@ -72,7 +72,7 @@ tsip_header_Content_Length_t *tsip_header_Content_Length_parse(const char *data, const char *eof = pe; tsip_header_Content_Length_t *hdr_clength = tsip_header_Content_Length_create(0); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 79 "./src/headers/tsip_header_Content_Length.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Type.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Type.c index a2054242..2dda9108 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Type.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Content_Type.c @@ -78,7 +78,7 @@ tsip_header_Content_Type_t *tsip_header_Content_Type_parse(const char *data, tsk const char *eof = pe; tsip_header_Content_Type_t *hdr_ctype = tsip_header_Content_Type_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 85 "./src/headers/tsip_header_Content_Type.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Date.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Date.c index 91c468ef..f457c30c 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Date.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Date.c @@ -80,7 +80,7 @@ tsip_header_Date_t *tsip_header_Date_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Date_t *hdr_Date = tsip_header_Date_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 87 "./src/headers/tsip_header_Date.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Dummy.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Dummy.c index 01ca6769..9c5dd18d 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Dummy.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Dummy.c @@ -78,7 +78,7 @@ tsip_header_Dummy_t *tsip_header_Dummy_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Dummy_t *hdr_Dummy = tsip_header_Dummy_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 85 "./src/headers/tsip_header_Dummy.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Event.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Event.c index 3edc7dcc..8268fa5d 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Event.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Event.c @@ -74,7 +74,7 @@ tsip_header_Event_t *tsip_header_Event_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Event_t *hdr_event = tsip_header_Event_create(tsk_null); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 81 "./src/headers/tsip_header_Event.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Expires.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Expires.c index b392c19b..8516b742 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Expires.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Expires.c @@ -71,7 +71,7 @@ tsip_header_Expires_t *tsip_header_Expires_parse(const char *data, tsk_size_t si const char *eof = pe; tsip_header_Expires_t *hdr_expires = tsip_header_Expires_create(TSIP_HEADER_EXPIRES_NONE); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 78 "./src/headers/tsip_header_Expires.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_From.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_From.c index fcb89169..1877356a 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_From.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_From.c @@ -76,7 +76,7 @@ tsip_header_From_t *tsip_header_From_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_From_t *hdr_from = tsip_header_From_create(tsk_null, tsk_null, tsk_null); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 83 "./src/headers/tsip_header_From.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Max_Forwards.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Max_Forwards.c index b8e5fd51..c4e47f02 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Max_Forwards.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Max_Forwards.c @@ -72,7 +72,7 @@ tsip_header_Max_Forwards_t *tsip_header_Max_Forwards_parse(const char *data, tsk const char *eof = pe; tsip_header_Max_Forwards_t *hdr_maxf = tsip_header_Max_Forwards_create(TSIP_HEADER_MAX_FORWARDS_NONE); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 79 "./src/headers/tsip_header_Max_Forwards.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_Expires.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_Expires.c index 64f521b2..70dfed94 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_Expires.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_Expires.c @@ -76,7 +76,7 @@ tsip_header_Min_Expires_t *tsip_header_Min_Expires_parse(const char *data, tsk_s const char *eof = pe; tsip_header_Min_Expires_t *hdr_minE = tsip_header_Min_Expires_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 83 "./src/headers/tsip_header_Min_Expires.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_SE.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_SE.c index 2cf71ea1..7d2dd662 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_SE.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Min_SE.c @@ -72,7 +72,7 @@ tsip_header_Min_SE_t *tsip_header_Min_SE_parse(const char *data, tsk_size_t size const char *eof = pe; tsip_header_Min_SE_t *hdr_minse = tsip_header_Min_SE_create(TSIP_SESSION_EXPIRES_MIN_VALUE); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 79 "./src/headers/tsip_header_Min_SE.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Access_Network_Info.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Access_Network_Info.c index 11ed1d91..54e95c71 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Access_Network_Info.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Access_Network_Info.c @@ -87,7 +87,7 @@ tsip_header_P_Access_Network_Info_t *tsip_header_P_Access_Network_Info_parse(con const char *eof = pe; tsip_header_P_Access_Network_Info_t *hdr_ani = tsip_header_P_Access_Network_Info_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 94 "./src/headers/tsip_header_P_Access_Network_Info.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Asserted_Identity.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Asserted_Identity.c index 0d3550c1..e7fbf577 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Asserted_Identity.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Asserted_Identity.c @@ -78,7 +78,7 @@ tsip_header_P_Asserted_Identities_L_t *tsip_header_P_Asserted_Identity_parse(con const char *eof = pe; tsip_header_P_Asserted_Identities_L_t *hdr_p_asserted_identities = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_P_Asserted_Identity_t *curr_p_asserted_identity = 0; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Associated_URI.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Associated_URI.c index 06524df5..54c5e199 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Associated_URI.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Associated_URI.c @@ -83,7 +83,7 @@ tsip_header_P_Associated_URIs_L_t *tsip_header_P_Associated_URI_parse(const char const char *eof = pe; tsip_header_P_Associated_URIs_L_t *hdr_p_associated_uris = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_P_Associated_URI_t *curr_p_associated_uri = tsk_null; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Charging_Function_Addresses.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Charging_Function_Addresses.c index 204397e9..6cd979a3 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Charging_Function_Addresses.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Charging_Function_Addresses.c @@ -80,7 +80,7 @@ tsip_header_P_Charging_Function_Addressess_L_t *tsip_header_P_Charging_Function_ const char *eof = pe; tsip_header_P_Charging_Function_Addressess_L_t *hdr_p_charging_function_addressess = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_P_Charging_Function_Addresses_t *curr_p_charging_function_addresses = 0; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Preferred_Identity.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Preferred_Identity.c index 17e4fd86..334cfe69 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Preferred_Identity.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_P_Preferred_Identity.c @@ -87,7 +87,7 @@ tsip_header_P_Preferred_Identity_t *tsip_header_P_Preferred_Identity_parse(const const char *eof = pe; tsip_header_P_Preferred_Identity_t *hdr_pi = tsip_header_P_Preferred_Identity_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 94 "./src/headers/tsip_header_P_Preferred_Identity.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Path.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Path.c index b020baaf..e8cca534 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Path.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Path.c @@ -84,7 +84,7 @@ tsip_header_Paths_L_t *tsip_header_Path_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_Paths_L_t *hdr_paths = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Path_t *curr_path = tsk_null; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Privacy.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Privacy.c index bb8a1c79..905b28c3 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Privacy.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Privacy.c @@ -93,7 +93,7 @@ tsip_header_Privacy_t *tsip_header_Privacy_parse(const char *data, tsk_size_t si const char *eof = pe; tsip_header_Privacy_t *hdr_privacy = tsip_header_Privacy_create(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 100 "./src/headers/tsip_header_Privacy.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Require.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Require.c index 59eaa1f1..a0d69f43 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Require.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Proxy_Require.c @@ -90,7 +90,7 @@ tsip_header_Proxy_Require_t *tsip_header_Proxy_Require_parse(const char *data, t const char *eof = pe; tsip_header_Proxy_Require_t *hdr_proxyrequire = tsip_header_Proxy_Require_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 97 "./src/headers/tsip_header_Proxy_Require.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RAck.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RAck.c index f6785928..0113d700 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RAck.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RAck.c @@ -74,7 +74,7 @@ tsip_header_RAck_t *tsip_header_RAck_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_RAck_t *hdr_rack = tsip_header_RAck_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 81 "./src/headers/tsip_header_RAck.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RSeq.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RSeq.c index b7efd9e9..7de7f07c 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RSeq.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_RSeq.c @@ -74,7 +74,7 @@ tsip_header_RSeq_t *tsip_header_RSeq_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_RSeq_t *hdr_rseq = tsip_header_RSeq_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 81 "./src/headers/tsip_header_RSeq.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Record_Route.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Record_Route.c index ea9b7ea5..08e610f6 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Record_Route.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Record_Route.c @@ -83,7 +83,7 @@ int tsip_header_Record_Route_serialize(const tsip_header_t* header, tsk_buffer_t tsip_header_Record_Routes_L_t *hdr_record_routes = tsk_list_create(); tsip_header_Record_Route_t *curr_route = tsk_null; - const char *tag_start; + const char *tag_start = tsk_null; /* #line 90 "./src/headers/tsip_header_Record_Route.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_Sub.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_Sub.c index f186b3c2..10628c3c 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_Sub.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_Sub.c @@ -74,7 +74,7 @@ tsip_header_Refer_Sub_t *tsip_header_Refer_Sub_parse(const char *data, tsk_size_ const char *eof = pe; tsip_header_Refer_Sub_t *hdr_rsub = tsip_header_Refer_Sub_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 81 "./src/headers/tsip_header_Refer_Sub.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_To.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_To.c index a5a41624..1e3d2592 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_To.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Refer_To.c @@ -80,7 +80,7 @@ tsip_header_Refer_To_t *tsip_header_Refer_To_parse(const char *data, tsk_size_t const char *eof = pe; tsip_header_Refer_To_t *r_to = tsip_header_Refer_To_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 87 "./src/headers/tsip_header_Refer_To.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Referred_By.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Referred_By.c index cb2441d0..47fae1df 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Referred_By.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Referred_By.c @@ -84,7 +84,7 @@ tsip_header_Referred_By_t *tsip_header_Referred_By_parse(const char *data, tsk_s const char *eof = pe; tsip_header_Referred_By_t *r_by = tsip_header_Referred_By_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 91 "./src/headers/tsip_header_Referred_By.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Require.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Require.c index c606b7cb..6f2e4a17 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Require.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Require.c @@ -89,7 +89,7 @@ tsip_header_Require_t *tsip_header_Require_parse(const char *data, tsk_size_t si const char *eof = pe; tsip_header_Require_t *hdr_require = tsip_header_Require_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 96 "./src/headers/tsip_header_Require.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Route.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Route.c index 779af3bd..02ad3123 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Route.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Route.c @@ -84,7 +84,7 @@ tsip_header_Routes_L_t *tsip_header_Route_parse(const char *data, tsk_size_t siz const char *eof = pe; tsip_header_Routes_L_t *hdr_routes = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Route_t *curr_route = tsk_null; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_ETag.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_ETag.c index 84fe4917..f48a26aa 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_ETag.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_ETag.c @@ -79,7 +79,7 @@ tsip_header_SIP_ETag_t *tsip_header_SIP_ETag_parse(const char *data, tsk_size_t const char *eof = pe; tsip_header_SIP_ETag_t *hdr_etag = tsip_header_SIP_ETag_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 86 "./src/headers/tsip_header_SIP_ETag.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_If_Match.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_If_Match.c index a3e5b96f..9bcc1c14 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_If_Match.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_SIP_If_Match.c @@ -80,7 +80,7 @@ tsip_header_SIP_If_Match_t *tsip_header_SIP_If_Match_parse(const char *data, tsk const char *eof = pe; tsip_header_SIP_If_Match_t *hdr_ifmatch = tsip_header_SIP_If_Match_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 87 "./src/headers/tsip_header_SIP_If_Match.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Client.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Client.c index f44585a1..095db275 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Client.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Client.c @@ -108,7 +108,7 @@ tsip_header_Security_Clients_L_t *tsip_header_Security_Client_parse(const char * const char *eof = pe; tsip_header_Security_Clients_L_t *hdr_securityclients = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Security_Client_t *curr_securityclient = tsk_null; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Server.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Server.c index 8d640f06..7554571e 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Server.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Server.c @@ -109,7 +109,7 @@ tsip_header_Security_Servers_L_t *tsip_header_Security_Server_parse(const char * const char *eof = pe; tsip_header_Security_Servers_L_t *hdr_securityservers = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Security_Server_t *curr_securityserver = tsk_null; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Verify.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Verify.c index 01cf94b5..fc871640 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Verify.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Security_Verify.c @@ -107,7 +107,7 @@ tsip_header_Security_Verifies_L_t *tsip_header_Security_Verify_parse(const char const char *eof = pe; tsip_header_Security_Verifies_L_t *hdr_securityverifies = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Security_Verify_t *curr_securityverify = tsk_null; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Server.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Server.c index f279e662..130aa051 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Server.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Server.c @@ -78,7 +78,7 @@ tsip_header_Server_t *tsip_header_Server_parse(const char *data, tsk_size_t size const char *eof = pe; tsip_header_Server_t *hdr_server = tsip_header_server_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 85 "./src/headers/tsip_header_Server.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Service_Route.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Service_Route.c index fb5cef4c..0ff19474 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Service_Route.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Service_Route.c @@ -83,7 +83,7 @@ tsip_header_Service_Routes_L_t *tsip_header_Service_Route_parse(const char *data const char *eof = pe; tsip_header_Service_Routes_L_t *hdr_services = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Service_Route_t *curr_service = tsk_null; diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Session_Expires.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Session_Expires.c index 4fb9a2dd..567aefda 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Session_Expires.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Session_Expires.c @@ -74,7 +74,7 @@ tsip_header_Session_Expires_t *tsip_header_Session_Expires_parse(const char *dat const char *eof = pe; tsip_header_Session_Expires_t *hdr_session_expires = tsip_header_Session_Expires_create(TSIP_SESSION_EXPIRES_DEFAULT_VALUE, tsk_false); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 81 "./src/headers/tsip_header_Session_Expires.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Subscription_State.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Subscription_State.c index 6ab875c6..bfb3b309 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Subscription_State.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Subscription_State.c @@ -84,7 +84,7 @@ tsip_header_Subscription_State_t *tsip_header_Subscription_State_parse(const cha const char *eof = pe; tsip_header_Subscription_State_t *hdr_Subscription_State = tsip_header_Subscription_State_create(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 91 "./src/headers/tsip_header_Subscription_State.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Supported.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Supported.c index 9a61920e..2028bfd7 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Supported.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Supported.c @@ -89,7 +89,7 @@ tsip_header_Supported_t *tsip_header_Supported_parse(const char *data, tsk_size_ const char *eof = pe; tsip_header_Supported_t *hdr_supported = tsip_header_Supported_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 96 "./src/headers/tsip_header_Supported.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_To.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_To.c index e60aeea0..0c053a6d 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_To.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_To.c @@ -81,7 +81,7 @@ tsip_header_To_t *tsip_header_To_parse(const char *data, tsk_size_t size) const char *eof = pe; tsip_header_To_t *hdr_to = tsip_header_To_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 88 "./src/headers/tsip_header_To.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_User_Agent.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_User_Agent.c index 418a3a21..a054de7d 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_User_Agent.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_User_Agent.c @@ -76,7 +76,7 @@ tsip_header_User_Agent_t *tsip_header_User_Agent_parse(const char *data, tsk_siz const char *eof = pe; tsip_header_User_Agent_t *hdr_user_agent = tsip_header_User_Agent_create_null(); - const char *tag_start; + const char *tag_start = tsk_null; /* #line 83 "./src/headers/tsip_header_User_Agent.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Via.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Via.c index 9ad62ca3..aef8ce8c 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Via.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Via.c @@ -149,7 +149,7 @@ tsip_header_Vias_L_t *tsip_header_Via_parse(const char *data, tsk_size_t size) tsip_header_Vias_L_t *hdr_vias = tsk_list_create(); tsip_header_Via_t *curr_via = tsk_null; - const char *tag_start; + const char *tag_start = tsk_null; /* #line 156 "./src/headers/tsip_header_Via.c" */ diff --git a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Warning.c b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Warning.c index 6ce1dbbc..ed7b3d9d 100644 --- a/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Warning.c +++ b/branches/2.0/doubango/tinySIP/src/headers/tsip_header_Warning.c @@ -72,7 +72,7 @@ tsip_header_Warnings_L_t *tsip_header_Warning_parse(const char *data, tsk_size_t const char *eof = pe; tsip_header_Warnings_L_t *hdr_warnings = tsk_list_create(); - const char *tag_start; + const char *tag_start = tsk_null; tsip_header_Warning_t *curr_warning = 0; diff --git a/branches/2.0/doubango/tinySIP/src/tsip.c b/branches/2.0/doubango/tinySIP/src/tsip.c index a740e71c..5ea2dc62 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip.c +++ b/branches/2.0/doubango/tinySIP/src/tsip.c @@ -45,7 +45,7 @@ #include #include -static void *run(void* self); +static void* TSK_STDCALL run(void* self); /* For tests: * http://www.voip-info.org/wiki/view/PROTOS+Test-Suite @@ -593,7 +593,7 @@ int tsip_stack_start(tsip_stack_handle_t *self) } if(stack->started){ - TSK_DEBUG_WARN("Stack Already started"); + TSK_DEBUG_INFO("Stack Already started"); return 0; } @@ -747,7 +747,7 @@ int tsip_stack_start(tsip_stack_handle_t *self) if(transport){ tnet_ip_t ip; - if(!tnet_transport_get_ip_n_port_2(transport, &ip, tsk_null)){ + if(!tnet_transport_get_ip_n_port_2(transport->net_transport, &ip, tsk_null)){ tsk_strupdate(&stack->network.local_ip[t_idx], ip); } else{ @@ -1058,7 +1058,7 @@ tsip_uri_t* tsip_stack_get_pcscf_uri(const tsip_stack_t *stack, tnet_socket_type -static void *run(void* self) +static void* TSK_STDCALL run(void* self) { tsk_list_item_t *curr; tsip_stack_t *stack = self; diff --git a/branches/2.0/doubango/tinySIP/src/tsip_action.c b/branches/2.0/doubango/tinySIP/src/tsip_action.c index fd6c2ab2..d34235b0 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip_action.c +++ b/branches/2.0/doubango/tinySIP/src/tsip_action.c @@ -148,6 +148,8 @@ int _tsip_action_set(tsip_action_handle_t* self, va_list* app) /* Copy resp line */ action->line_resp.code = handle->line_resp.code; tsk_strupdate(&action->line_resp.phrase, handle->line_resp.phrase); + /* Copy media type */ + action->media.type = handle->media.type; /* Copy media params */ if(!TSK_LIST_IS_EMPTY(handle->media.params)){ if(!action->media.params){ @@ -182,6 +184,12 @@ int _tsip_action_set(tsip_action_handle_t* self, va_list* app) break; } + case aptype_media_type: + { /* (enum tmedia_type_e)TYPE_ENUM */ + action->media.type = va_arg(*app, tmedia_type_t); + break; + } + case aptype_media: { /* ... */ tmedia_params_L_t* params; diff --git a/branches/2.0/doubango/tinySIP/src/tsip_ssession.c b/branches/2.0/doubango/tinySIP/src/tsip_ssession.c index 1475adfc..82eddae0 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip_ssession.c +++ b/branches/2.0/doubango/tinySIP/src/tsip_ssession.c @@ -507,8 +507,9 @@ bail: const void* tsip_ssession_get_userdata(const tsip_ssession_handle_t *self) { - if(self){ - return ((const tsip_ssession_t*)self)->userdata; + const tsip_ssession_t* ss = (const tsip_ssession_t*)self; + if(ss){ + return ss->userdata; } else{ TSK_DEBUG_ERROR("Invalid parameter"); diff --git a/branches/2.0/doubango/tinySIP/winrt/tinySIP.sln b/branches/2.0/doubango/tinySIP/winrt/tinySIP.sln new file mode 100644 index 00000000..fbc24de4 --- /dev/null +++ b/branches/2.0/doubango/tinySIP/winrt/tinySIP.sln @@ -0,0 +1,126 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIP", "tinySIP.vcxproj", "{1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}" + ProjectSection(ProjectDependencies) = postProject + {1A27423C-6535-4A49-96EC-5D209FE125F2} = {1A27423C-6535-4A49-96EC-5D209FE125F2} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {0875A083-5118-40CC-941E-722B00295A5B} = {0875A083-5118-40CC-941E-722B00295A5B} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + {F623CBDB-707A-4FDC-ACE0-3D616E239F16} = {F623CBDB-707A-4FDC-ACE0-3D616E239F16} + {52E43EEB-A549-4159-B254-DCA225D7638B} = {52E43EEB-A549-4159-B254-DCA225D7638B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyHTTP", "..\..\tinyHTTP\winrt\tinyHTTP.vcxproj", "{1A27423C-6535-4A49-96EC-5D209FE125F2}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyIPSec", "..\..\tinyIPSec\winrt\tinyIPSec.vcxproj", "{0875A083-5118-40CC-941E-722B00295A5B}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyMEDIA", "..\..\tinyMEDIA\winrt\tinyMEDIA.vcxproj", "{52E43EEB-A549-4159-B254-DCA225D7638B}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {982D737A-0649-4C32-A00E-08992A0B7673} = {982D737A-0649-4C32-A00E-08992A0B7673} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "..\..\tinyNET\winrt\tinyNET.vcxproj", "{06E58F9D-28A1-4DD4-AF11-2F5239222CCC}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySDP", "..\..\tinySDP\winrt\tinySDP.vcxproj", "{982D737A-0649-4C32-A00E-08992A0B7673}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySIGCOMP", "..\..\tinySIGCOMP\winrt\tinySIGCOMP.vcxproj", "{F623CBDB-707A-4FDC-ACE0-3D616E239F16}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Debug|ARM.ActiveCfg = Debug|ARM + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Debug|ARM.Build.0 = Debug|ARM + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Debug|Win32.ActiveCfg = Debug|Win32 + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Debug|Win32.Build.0 = Debug|Win32 + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Release|ARM.ActiveCfg = Release|ARM + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Release|ARM.Build.0 = Release|ARM + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Release|Win32.ActiveCfg = Release|Win32 + {1137A808-DAC8-4AF7-B8BB-AEE8ABFF2F67}.Release|Win32.Build.0 = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.ActiveCfg = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.Build.0 = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.Build.0 = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.ActiveCfg = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.Build.0 = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.ActiveCfg = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.Build.0 = Release|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|ARM.ActiveCfg = Debug|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|ARM.Build.0 = Debug|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|Win32.ActiveCfg = Debug|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Debug|Win32.Build.0 = Debug|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Release|ARM.ActiveCfg = Release|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Release|ARM.Build.0 = Release|ARM + {0875A083-5118-40CC-941E-722B00295A5B}.Release|Win32.ActiveCfg = Release|Win32 + {0875A083-5118-40CC-941E-722B00295A5B}.Release|Win32.Build.0 = Release|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.ActiveCfg = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|ARM.Build.0 = Debug|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.ActiveCfg = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Debug|Win32.Build.0 = Debug|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.ActiveCfg = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|ARM.Build.0 = Release|ARM + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.ActiveCfg = Release|Win32 + {52E43EEB-A549-4159-B254-DCA225D7638B}.Release|Win32.Build.0 = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.ActiveCfg = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.Build.0 = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.Build.0 = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.ActiveCfg = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.Build.0 = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.ActiveCfg = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.ActiveCfg = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|ARM.Build.0 = Debug|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.ActiveCfg = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Debug|Win32.Build.0 = Debug|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.ActiveCfg = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|ARM.Build.0 = Release|ARM + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.ActiveCfg = Release|Win32 + {982D737A-0649-4C32-A00E-08992A0B7673}.Release|Win32.Build.0 = Release|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|ARM.ActiveCfg = Debug|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|ARM.Build.0 = Debug|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|Win32.ActiveCfg = Debug|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Debug|Win32.Build.0 = Debug|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|ARM.ActiveCfg = Release|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|ARM.Build.0 = Release|ARM + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|Win32.ActiveCfg = Release|Win32 + {F623CBDB-707A-4FDC-ACE0-3D616E239F16}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinySIP/winrt/tinySIP.vcxproj b/branches/2.0/doubango/tinySIP/winrt/tinySIP.vcxproj new file mode 100644 index 00000000..a7aec4ed --- /dev/null +++ b/branches/2.0/doubango/tinySIP/winrt/tinySIP.vcxproj @@ -0,0 +1,450 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {1137a808-dac8-4af7-b8bb-aee8abff2f67} + tinySIP + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;BODILESS_INVITE=0;_USRDLL;TINYSIP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySIP\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinySIGCOMP\src;..\..\tinyIPSec\src;..\..\tinySDP\include;..\..\tinyMEDIA\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyIPSec\tinyIPSec.lib ";"$(SolutionDir)$(Configuration)\tinySIGCOMP\tinySigComp.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;BODILESS_INVITE=0;_USRDLL;TINYSIP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySIP\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinySIGCOMP\src;..\..\tinyIPSec\src;..\..\tinySDP\include;..\..\tinyMEDIA\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyIPSec\tinyIPSec.lib ";"$(SolutionDir)$(Configuration)\tinySIGCOMP\tinySigComp.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;BODILESS_INVITE=0;_USRDLL;TINYSIP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySIP\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinySIGCOMP\src;..\..\tinyIPSec\src;..\..\tinySDP\include;..\..\tinyMEDIA\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyIPSec\tinyIPSec.lib ";"$(SolutionDir)$(Configuration)\tinySIGCOMP\tinySigComp.lib";%(AdditionalDependencies) + + + + + DEBUG_LEVEL=DEBUG_LEVEL_INFO;BODILESS_INVITE=0;_USRDLL;TINYSIP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\..\tinySIP\include;..\..\tinySAK\src;..\..\tinyNET\src;..\..\tinyHTTP\include;..\..\tinySIGCOMP\src;..\..\tinyIPSec\src;..\..\tinySDP\include;..\..\tinyMEDIA\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";"$(SolutionDir)$(Configuration)\tinySDP\tinySDP.lib";"$(SolutionDir)$(Configuration)\tinyMEDIA\tinyMEDIA.lib";"$(SolutionDir)$(Configuration)\tinyIPSec\tinyIPSec.lib ";"$(SolutionDir)$(Configuration)\tinySIGCOMP\tinySigComp.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinySIP/winrt/tinySIP.vcxproj.filters b/branches/2.0/doubango/tinySIP/winrt/tinySIP.vcxproj.filters new file mode 100644 index 00000000..44e254c5 --- /dev/null +++ b/branches/2.0/doubango/tinySIP/winrt/tinySIP.vcxproj.filters @@ -0,0 +1,934 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {b853bf68-174e-4f09-99ab-4ea6ed7e4b56} + + + {1cab826e-35a2-48d3-ba58-87278974416e} + + + {5a09c00a-01e5-4931-a925-c55c6e12e23a} + + + {531afae2-fc26-498a-b7e5-6bdecebaebe8} + + + {a38c634b-3ae1-4a9f-859d-d20daba0c2fd} + + + {bb7effe6-dca5-47b1-b563-b95d668e4d7c} + + + {58044e0c-c572-4285-8866-5fd48d9bbfb3} + + + {4fcd7f67-95a2-400f-9aca-c1ac33ea91bf} + + + {a53c41bf-a96a-4268-968c-98a3e08ad7d8} + + + {f0b8b691-41fa-4a7b-98ee-fe08cdc50df6} + + + {b78e099f-c1b3-43cf-912b-72d5b7321d41} + + + {7dd6984a-b065-4ae4-ac32-721469046c40} + + + {a929bed2-4fbe-4f6a-b32e-2725628e2e0f} + + + {c8bc4063-3a8c-4ce8-8259-85f41d67a61c} + + + {58c81bf8-de54-4316-8bc3-03e858010daf} + + + {d10a2d2f-41b9-4686-9377-b2808f0f97d0} + + + {5c9fa014-d3e7-4f07-9658-0e26153859e7} + + + {7e1756b3-a18a-487c-8f64-365d65399848} + + + {9a0c86d3-8bec-4263-a723-c36f0e49d487} + + + + + include + + + include + + + include + + + include\tinysip + + + include\tinysip + + + include\tinysip + + + include\tinysip + + + include\tinysip + + + include\tinysip + + + include\tinysip + + + include\tinysip\api + + + include\tinysip\api + + + include\tinysip\api + + + include\tinysip\api + + + include\tinysip\api + + + include\tinysip\api + + + include\tinysip\api + + + include\tinysip\api + + + include\tinysip\authentication + + + include\tinysip\authentication + + + include\tinysip\authentication + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\dialogs + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\headers + + + include\tinysip\transports + + + include\tinysip\transports + + + include\tinysip\transports + + + include\tinysip\transports + + + include\tinysip\transactions + + + include\tinysip\transactions + + + include\tinysip\transactions + + + include\tinysip\transactions + + + include\tinysip\transactions + + + include\tinysip\transactions + + + include\tinysip\sigcomp + + + include\tinysip\parsers + + + include\tinysip\parsers + + + include\tinysip\parsers + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src\api + + + src\api + + + src\api + + + src\api + + + src\api + + + src\api + + + src\api + + + src\api + + + src\authentication + + + src\authentication + + + src\authentication + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\dialogs + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\headers + + + src\transports + + + src\transports + + + src\transports + + + src\transports + + + src\transactions + + + src\transactions + + + src\transactions + + + src\transactions + + + src\transactions + + + src\transactions + + + src\sigcomp + + + src\parsers + + + src\parsers + + + src\parsers + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinySMS/include/tinysms_config.h b/branches/2.0/doubango/tinySMS/include/tinysms_config.h index ac44dba1..b1018a5a 100644 --- a/branches/2.0/doubango/tinySMS/include/tinysms_config.h +++ b/branches/2.0/doubango/tinySMS/include/tinysms_config.h @@ -1,78 +1,80 @@ -/* -* Copyright (C) 2009 Mamadou Diop. -* -* Contact: Mamadou Diop -* -* This file is part of Open Source Doubango Framework. -* -* DOUBANGO is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* DOUBANGO is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with DOUBANGO. -* -*/ - -#ifndef TINYSMS_CONFIG_H -#define TINYSMS_CONFIG_H - -#ifdef __SYMBIAN32__ -#undef _WIN32 /* Because of WINSCW */ -#endif - -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ -#if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) -# define TSMS_UNDER_WINDOWS 1 -#endif - -#if (TSMS_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYSMS_EXPORTS) -# define TINYSMS_API __declspec(dllexport) -# define TINYSMS_GEXTERN __declspec(dllexport) -#elif (TSMS_UNDER_WINDOWS || defined(__SYMBIAN32__)) /*&& defined(TINYSMS_IMPORTS)*/ -# define TINYSMS_API __declspec(dllimport) -# define TINYSMS_GEXTERN __declspec(dllimport) -#else -# define TINYSMS_API -# define TINYSMS_GEXTERN extern -#endif - -/* Guards against C++ name mangling -*/ -#ifdef __cplusplus -# define TSMS_BEGIN_DECLS extern "C" { -# define TSMS_END_DECLS } -#else -# define TSMS_BEGIN_DECLS -# define TSMS_END_DECLS -#endif - -/* Disable some well-known warnings -*/ -#ifdef _MSC_VER -# define _CRT_SECURE_NO_WARNINGS -#endif - -/* Detecting C99 compilers - */ -#if (__STDC_VERSION__ == 199901L) && !defined(__C99__) -# define __C99__ -#endif - -#include -#ifdef __SYMBIAN32__ -#include -#endif - -#if HAVE_CONFIG_H - #include -#endif - -#endif // TINYSMS_CONFIG_H +/* +* Copyright (C) 2009 Mamadou Diop. +* +* Contact: Mamadou Diop +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +#ifndef TINYSMS_CONFIG_H +#define TINYSMS_CONFIG_H + +#ifdef __SYMBIAN32__ +#undef _WIN32 /* Because of WINSCW */ +#endif + +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition. +#if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) +# define TSMS_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TSMS_UNDER_WINDOWS_RT 1 +# endif +#endif + +#if (TSMS_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYSMS_EXPORTS) +# define TINYSMS_API __declspec(dllexport) +# define TINYSMS_GEXTERN extern __declspec(dllexport) +#elif (TSMS_UNDER_WINDOWS || defined(__SYMBIAN32__)) && !defined(TINYSMS_IMPORTS_IGNORE) +# define TINYSMS_API __declspec(dllimport) +# define TINYSMS_GEXTERN __declspec(dllimport) +#else +# define TINYSMS_API +# define TINYSMS_GEXTERN extern +#endif + +/* Guards against C++ name mangling +*/ +#ifdef __cplusplus +# define TSMS_BEGIN_DECLS extern "C" { +# define TSMS_END_DECLS } +#else +# define TSMS_BEGIN_DECLS +# define TSMS_END_DECLS +#endif + +/* Disable some well-known warnings +*/ +#ifdef _MSC_VER +# define _CRT_SECURE_NO_WARNINGS +#endif + +/* Detecting C99 compilers + */ +#if (__STDC_VERSION__ == 199901L) && !defined(__C99__) +# define __C99__ +#endif + +#include +#ifdef __SYMBIAN32__ +#include +#endif + +#if HAVE_CONFIG_H + #include +#endif + +#endif // TINYSMS_CONFIG_H diff --git a/branches/2.0/doubango/tinySMS/winrt/tinySMS.sln b/branches/2.0/doubango/tinySMS/winrt/tinySMS.sln new file mode 100644 index 00000000..ef0af3fc --- /dev/null +++ b/branches/2.0/doubango/tinySMS/winrt/tinySMS.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySMS", "tinySMS.vcxproj", "{65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Debug|ARM.ActiveCfg = Debug|ARM + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Debug|ARM.Build.0 = Debug|ARM + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Debug|Win32.ActiveCfg = Debug|Win32 + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Debug|Win32.Build.0 = Debug|Win32 + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Release|ARM.ActiveCfg = Release|ARM + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Release|ARM.Build.0 = Release|ARM + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Release|Win32.ActiveCfg = Release|Win32 + {65CDF0FF-3B84-45F3-9BB6-468C79B8E0BC}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinySMS/winrt/tinySMS.vcxproj b/branches/2.0/doubango/tinySMS/winrt/tinySMS.vcxproj new file mode 100644 index 00000000..65574078 --- /dev/null +++ b/branches/2.0/doubango/tinySMS/winrt/tinySMS.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {65cdf0ff-3b84-45f3-9bb6-468c79b8e0bc} + tinySMS + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + _USRDLL;TINYSMS_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\include;..\..\tinySAK/src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYSMS_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\include;..\..\tinySAK/src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYSMS_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\include;..\..\tinySAK/src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYSMS_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\..\thirdparties\winrt\include;..\include;..\..\tinySAK/src + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinySMS/winrt/tinySMS.vcxproj.filters b/branches/2.0/doubango/tinySMS/winrt/tinySMS.vcxproj.filters new file mode 100644 index 00000000..90633e80 --- /dev/null +++ b/branches/2.0/doubango/tinySMS/winrt/tinySMS.vcxproj.filters @@ -0,0 +1,103 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {5215a6e5-180a-4ff9-8578-a8f5a3a026da} + + + {acc14f20-428c-4461-8098-c72dcb784449} + + + {73a0f76a-e417-4556-bb2c-62e99793a905} + + + {ae0dc84b-3812-4a01-9904-dbae4eb1f7f8} + + + {a1b2fbd8-d455-43c2-85c1-e125737cac05} + + + {6f4767dd-5fbf-4aae-83c7-621c3592c1cf} + + + {e70fa535-4e7d-4c46-bd91-ed76b9c0d140} + + + + + include + + + include + + + include\tinysms + + + include\tinysms + + + include\tinysms + + + include\tinysms + + + include\tinysms + + + include\tinysms\tpdu + + + include\tinysms\rpdu + + + include\tinysms\rpdu + + + include\tinysms\rpdu + + + include\tinysms\rpdu + + + include\tinysms\rpdu + + + + + src + + + src + + + src + + + src + + + src\tpdu + + + src\tpdu + + + src\tpdu + + + src\tpdu + + + src\tpdu + + + src\rpdu + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyXCAP/include/tinyxcap_config.h b/branches/2.0/doubango/tinyXCAP/include/tinyxcap_config.h index 7b203770..3d3fc18a 100644 --- a/branches/2.0/doubango/tinyXCAP/include/tinyxcap_config.h +++ b/branches/2.0/doubango/tinyXCAP/include/tinyxcap_config.h @@ -27,16 +27,18 @@ #undef _WIN32 /* Because of WINSCW */ #endif -/* Windows (XP/Vista/7/CE and Windows Mobile) macro definition. -*/ +// Windows (XP/Vista/7/CE and Windows Mobile) macro definition #if defined(WIN32)|| defined(_WIN32) || defined(_WIN32_WCE) # define TXCAP_UNDER_WINDOWS 1 +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define TXCAP_UNDER_WINDOWS_RT 1 +# endif #endif #if (TXCAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && defined(TINYXCAP_EXPORTS) # define TINYXCAP_API __declspec(dllexport) -# define TINYXCAP_GEXTERN __declspec(dllexport) -#elif (TXCAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) /*&& defined(TINYXCAP_IMPORTS)*/ +# define TINYXCAP_GEXTERN extern __declspec(dllexport) +#elif (TXCAP_UNDER_WINDOWS || defined(__SYMBIAN32__)) && !defined(TINYXCAP_IMPORTS_IGNORE) # define TINYXCAP_API __declspec(dllimport) # define TINYXCAP_GEXTERN __declspec(dllimport) #else diff --git a/branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.sln b/branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.sln new file mode 100644 index 00000000..0c080e23 --- /dev/null +++ b/branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.sln @@ -0,0 +1,68 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Phone +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyXCAP", "tinyXCAP.vcxproj", "{49843B78-0CEB-445D-BACC-C5C5C2F6C26F}" + ProjectSection(ProjectDependencies) = postProject + {1A27423C-6535-4A49-96EC-5D209FE125F2} = {1A27423C-6535-4A49-96EC-5D209FE125F2} + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinySAK", "..\..\tinySAK\winrt\tinySAK.vcxproj", "{19279F5B-CDAF-4187-9F09-2A896A828B05}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyNET", "..\..\tinyNET\winrt\tinyNET.vcxproj", "{06E58F9D-28A1-4DD4-AF11-2F5239222CCC}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tinyHTTP", "..\..\tinyHTTP\winrt\tinyHTTP.vcxproj", "{1A27423C-6535-4A49-96EC-5D209FE125F2}" + ProjectSection(ProjectDependencies) = postProject + {19279F5B-CDAF-4187-9F09-2A896A828B05} = {19279F5B-CDAF-4187-9F09-2A896A828B05} + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} = {06E58F9D-28A1-4DD4-AF11-2F5239222CCC} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|Win32 = Debug|Win32 + Release|ARM = Release|ARM + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Debug|ARM.ActiveCfg = Debug|ARM + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Debug|ARM.Build.0 = Debug|ARM + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Debug|Win32.ActiveCfg = Debug|Win32 + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Debug|Win32.Build.0 = Debug|Win32 + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Release|ARM.ActiveCfg = Release|ARM + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Release|ARM.Build.0 = Release|ARM + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Release|Win32.ActiveCfg = Release|Win32 + {49843B78-0CEB-445D-BACC-C5C5C2F6C26F}.Release|Win32.Build.0 = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.ActiveCfg = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|ARM.Build.0 = Debug|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.ActiveCfg = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Debug|Win32.Build.0 = Debug|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.ActiveCfg = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|ARM.Build.0 = Release|ARM + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.ActiveCfg = Release|Win32 + {19279F5B-CDAF-4187-9F09-2A896A828B05}.Release|Win32.Build.0 = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.ActiveCfg = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|ARM.Build.0 = Debug|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Debug|Win32.Build.0 = Debug|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.ActiveCfg = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|ARM.Build.0 = Release|ARM + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.ActiveCfg = Release|Win32 + {06E58F9D-28A1-4DD4-AF11-2F5239222CCC}.Release|Win32.Build.0 = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.ActiveCfg = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|ARM.Build.0 = Debug|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Debug|Win32.Build.0 = Debug|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.ActiveCfg = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|ARM.Build.0 = Release|ARM + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.ActiveCfg = Release|Win32 + {1A27423C-6535-4A49-96EC-5D209FE125F2}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.vcxproj b/branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.vcxproj new file mode 100644 index 00000000..825d2245 --- /dev/null +++ b/branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.vcxproj @@ -0,0 +1,176 @@ + + + + + Debug + Win32 + + + Debug + ARM + + + Release + Win32 + + + Release + ARM + + + + {49843b78-0ceb-445d-bacc-c5c5c2f6c26f} + tinyXCAP + en-US + 11.0 + + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + DynamicLibrary + false + true + v110_wp80 + false + + + + + + + + false + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + $(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + $(SolutionDir)$(Configuration)\$(MSBuildProjectName)\ + + + + _USRDLL;TINYXCAP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\include;..\..\thirdparties\winrt\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\tinyHTTP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYXCAP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\include;..\..\thirdparties\winrt\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\tinyHTTP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYXCAP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\include;..\..\thirdparties\winrt\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\tinyHTTP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";%(AdditionalDependencies) + + + + + _USRDLL;TINYXCAP_EXPORTS;%(PreprocessorDefinitions) + NotUsing + pch.h + false + $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories) + ..\include;..\..\thirdparties\winrt\include;..\..\tinyNET\src;..\..\tinySAK\src;..\..\tinyHTTP\include + + + Console + false + false + true + "$(SolutionDir)$(Configuration)\tinySAK\tinySAK.lib";"$(SolutionDir)$(Configuration)\tinyNET\tinyNET.lib";"$(SolutionDir)$(Configuration)\tinyHTTP\tinyHTTP.lib";%(AdditionalDependencies) + + + + + true + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.vcxproj.filters b/branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.vcxproj.filters new file mode 100644 index 00000000..22464dbf --- /dev/null +++ b/branches/2.0/doubango/tinyXCAP/winrt/tinyXCAP.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {25b3a3ba-679b-41a9-b1e1-b8f1cf7d71c1} + + + {0add7c3e-36a6-448d-bf8f-4f331ac8a299} + + + {d95441d1-7dbb-4d1a-ae40-fbd0dfb7c161} + + + + + include + + + include + + + include + + + include\tinyxcap + + + include\tinyxcap + + + include\tinyxcap + + + include\tinyxcap + + + include\tinyxcap + + + + + src + + + src + + + src + + + src + + + src + + + src + + + \ No newline at end of file