Author: greenlizard Date: Sun Jul 8 22:28:40 2007 New Revision: 5519 Added: freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/modules/ - copied from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/modules/ freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/modules/configuration.php - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/modules/configuration.php freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/modules/dialplan.php - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/modules/dialplan.php freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/ - copied from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/ freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/conference.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/conference.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/dialplan_directory.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/dialplan_directory.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/dingaling.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/dingaling.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/enum.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/enum.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/event_multicast.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/event_multicast.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/event_socket.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/event_socket.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/iax.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/iax.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/ivr.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/ivr.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/portaudio.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/portaudio.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/post_load_modules.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/post_load_modules.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/rss.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/rss.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/sofia.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/sofia.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/spidermonkey.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/spidermonkey.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/wanpipe.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/wanpipe.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/woomera.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/woomera.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/xml_rpc.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/xml_rpc.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/xmpp_event.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/xmpp_event.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/zeroconf.conf.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/configuration/zeroconf.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/dialplan/ - copied from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/dialplan/ freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/dialplan/fail.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/dialplan/fail.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/dialplan/frompstn.tpl - copied unchanged from r5513, /freeswitch/trunk/scripts/contrib/trixter/xml-curl/templates/switch1/dialplan/frompstn.tpl Removed: freeswitch/branches/greenlizard/scripts/contrib/trixter/Parse_XML_CDR.php freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/conference.conf.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/fail.tpl freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/templates/switch1/frompstn.tpl Modified: freeswitch/branches/greenlizard/libs/win32/etpan/libetpan.vcproj freeswitch/branches/greenlizard/libs/win32/sofia/libsofia_sip_ua_static.vcproj freeswitch/branches/greenlizard/libs/xmlrpc-c/lib/abyss/src/conn.c freeswitch/branches/greenlizard/scripts/contrib/trixter/faxlib.jm freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-cdr/Parse_XML_CDR.php freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-cdr/README freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/README freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/curlrouting.php freeswitch/branches/greenlizard/src/include/switch_loadable_module.h freeswitch/branches/greenlizard/src/include/switch_module_interfaces.h freeswitch/branches/greenlizard/src/include/switch_types.h freeswitch/branches/greenlizard/src/mod/applications/mod_commands/mod_commands.c freeswitch/branches/greenlizard/src/mod/codecs/mod_l16/mod_l16.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_iax/mod_iax.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/mod_portaudio.c freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c freeswitch/branches/greenlizard/src/switch_channel.c freeswitch/branches/greenlizard/src/switch_core.c freeswitch/branches/greenlizard/src/switch_core_file.c freeswitch/branches/greenlizard/src/switch_core_io.c freeswitch/branches/greenlizard/src/switch_core_session.c freeswitch/branches/greenlizard/src/switch_core_state_machine.c freeswitch/branches/greenlizard/src/switch_ivr_bridge.c freeswitch/branches/greenlizard/src/switch_ivr_play_say.c freeswitch/branches/greenlizard/src/switch_rtp.c Log: merge trunk version 5489 to 5513 Modified: freeswitch/branches/greenlizard/libs/win32/etpan/libetpan.vcproj ============================================================================== --- freeswitch/branches/greenlizard/libs/win32/etpan/libetpan.vcproj (original) +++ freeswitch/branches/greenlizard/libs/win32/etpan/libetpan.vcproj Sun Jul 8 22:28:40 2007 @@ -50,7 +50,7 @@ UsePrecompiledHeader="0" WarningLevel="0" Detect64BitPortabilityProblems="false" - DebugInformationFormat="4" + DebugInformationFormat="3" CompileAs="1" ForcedIncludeFiles="$(ProjectDir)../../libetpan/build-windows/StdAfx.h" /> @@ -68,7 +68,7 @@ AdditionalOptions="/DLL" AdditionalDependencies="oldnames.lib Ws2_32.lib mswsock.lib" OutputFile="$(SolutionDir)$(IntDir)/libetpan.dll" - LinkIncremental="2" + LinkIncremental="1" SuppressStartupBanner="true" IgnoreDefaultLibraryNames="C" ModuleDefinitionFile="" @@ -1081,6 +1081,7 @@ > <Tool Name="VCCLCompilerTool" + MinimalRebuild="false" CompileAs="2" /> </FileConfiguration> Modified: freeswitch/branches/greenlizard/libs/win32/sofia/libsofia_sip_ua_static.vcproj ============================================================================== --- freeswitch/branches/greenlizard/libs/win32/sofia/libsofia_sip_ua_static.vcproj (original) +++ freeswitch/branches/greenlizard/libs/win32/sofia/libsofia_sip_ua_static.vcproj Sun Jul 8 22:28:40 2007 @@ -26,7 +26,7 @@ > <Tool Name="VCPreBuildEventTool" - CommandLine="if not exist "$(ProjectDir)..\..\sofia-sip\win32\gawk.exe" cscript /nologo "$(ProjectDir)..\util.vbs" Get http://svn.freeswitch.org/downloads/win32/gawk.exe "$(ProjectDir)..\..\sofia-sip\win32\" cd /D "$(ProjectDir)..\..\sofia-sip\win32\" "autogen.cmd" " + CommandLine="if not exist "$(ProjectDir)..\..\sofia-sip\win32\gawk.exe" cscript /nologo "$(ProjectDir)..\util.vbs" Get http://svn.freeswitch.org/downloads/win32/gawk.exe "$(ProjectDir)..\..\sofia-sip\win32\" cd /D "$(ProjectDir)..\..\sofia-sip\win32\" set AWK="$(ProjectDir)..\..\sofia-sip\win32\gawk.exe" "autogen.cmd" " /> <Tool Name="VCCustomBuildTool" @@ -105,7 +105,7 @@ > <Tool Name="VCPreBuildEventTool" - CommandLine="if not exist "$(ProjectDir)..\..\sofia-sip\win32\gawk.exe" cscript /nologo "$(ProjectDir)..\util.vbs" Get http://svn.freeswitch.org/downloads/win32/gawk.exe "$(ProjectDir)..\..\sofia-sip\win32\" cd /D "$(ProjectDir)..\..\sofia-sip\win32\" "autogen.cmd" " + CommandLine="if not exist "$(ProjectDir)..\..\sofia-sip\win32\gawk.exe" cscript /nologo "$(ProjectDir)..\util.vbs" Get http://svn.freeswitch.org/downloads/win32/gawk.exe "$(ProjectDir)..\..\sofia-sip\win32\" cd /D "$(ProjectDir)..\..\sofia-sip\win32\" set AWK="$(ProjectDir)..\..\sofia-sip\win32\gawk.exe" "autogen.cmd" " /> <Tool Name="VCCustomBuildTool" Modified: freeswitch/branches/greenlizard/libs/xmlrpc-c/lib/abyss/src/conn.c ============================================================================== --- freeswitch/branches/greenlizard/libs/xmlrpc-c/lib/abyss/src/conn.c (original) +++ freeswitch/branches/greenlizard/libs/xmlrpc-c/lib/abyss/src/conn.c Sun Jul 8 22:28:40 2007 @@ -277,7 +277,7 @@ { char *p,*t; abyss_bool first=TRUE; - uint32_t to,start; + clock_t to,start; p=*z=c->buffer+c->bufferpos; start=clock(); Modified: freeswitch/branches/greenlizard/scripts/contrib/trixter/faxlib.jm ============================================================================== --- freeswitch/branches/greenlizard/scripts/contrib/trixter/faxlib.jm (original) +++ freeswitch/branches/greenlizard/scripts/contrib/trixter/faxlib.jm Sun Jul 8 22:28:40 2007 @@ -1,5 +1,13 @@ // -*- mode:c; tab-width:4; c-basic-offset:4; c-indent-level:4; indent-tabs-mode:nil; -*- /* + * + * THIS IS DEPRECATED NOW - THERE IS A FUNCTION IN DPTOOLS THAT LETS YOU DO MOST + * OF THIS WITHOUT USING THIS SCRIPT. DIRECT TRANSFER ON FAX CNG DETECT + * THIS IS HERE FOR REFERENCE AND HOW YOU MIGHT EMAIL A PDF OF A FAX + * + */ + +/* * Version: MPL 1.1 * * The contents of this file are subject to the Mozilla Public License Version Modified: freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-cdr/Parse_XML_CDR.php ============================================================================== --- freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-cdr/Parse_XML_CDR.php (original) +++ freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-cdr/Parse_XML_CDR.php Sun Jul 8 22:28:40 2007 @@ -9,6 +9,7 @@ var $_level = 0; function Parse_CDR_XML(&$data,$showattribs = false) { + $data = preg_replace("/<(.*?)><(.*?)><\/(.*?)>/","<\\1>\\2</\\3>",$data); $this->_showAttribs = $showattribs; $this->_parser = xml_parser_create(); @@ -74,6 +75,8 @@ if (!isset($start[$name])) $start[$name] = ''; $add = ''; } + + $update = &$start[$name]; if ($isattribs && !$this->_showAttribs) return; Modified: freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-cdr/README ============================================================================== --- freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-cdr/README (original) +++ freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-cdr/README Sun Jul 8 22:28:40 2007 @@ -1,11 +1,23 @@ To use this you need to have the mod_xml_cdr loaded and configured. +If you use either errLogDir or logDir then make sure that the directories +exist. In the case of logDir the original code appended "/xml_cdr" onto +the value, so I do that as well. If logDir is set but empty (value="") +it will use the FreeSWITCH default log dir and appent "/xml_cdr" onto +that. + <configuration name="xml_cdr.conf" description="XML CDR CURL logger"> <settings> + <!-- the credentials we may optionally use when POSTing -> <param name="cred" value="user:pass"/> + <!-- url to log to --> <param name="url" value="http://myhost/cdr.php"/> + <!-- how many times we retry not counting the inital try --> <param name="retries" value="2"/> + <!-- how many seconds before we try again --> <param name="delay" value="120"/> + <!-- this is where we log failed POSTs to the webserver --> + <param name="errLogDir" value="/usr/local/freeswitch/log/xml_cdr_errors"/> <!-- optional: if not present we do not log every record to disk --> <!-- per original code base /xml_cdr is appended to the directory name --> Modified: freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/README ============================================================================== --- freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/README (original) +++ freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/README Sun Jul 8 22:28:40 2007 @@ -1 +1,57 @@ +This is an example that will respond to mod_xml_curl requests for information. +It uses modules, which are contained in the modules subdirectory. If a module +(any file ending in .php) is in the dir it will be loaded. If it registers +to handle a specific type of xml_curl request, that will be passed to the function named. +If you dont have a module for a specific type of data, for example directory, then +a 404 will be returned to FreeSWITCH. + +The module nature allows you to more easily turn on/off different components. + +Its a template based system, which relies on someone authenticating, such as with +.htaccess. Their username is used in this default example for their configuration +files. This allows for multiple switches to identify themselves uniquely, as well +as giving you the ability to have different templates for different switches. + + + + + +If you do configuration via mod_xml_curl you only need to load and configure +mod_xml_curl from freeswitch.xml, all other modules and their configs do not +need to be present. I do suggest that you load loggers before xml_curl though. + +If you load modules *before* loading xml_curl they will be loaded from the static +xml file, only *after* loading xml_curl will stuff start to be pulled from the +webserver. Seems logical but some people dont think about it and wonder why +it doesnt work. + + + + + + +The default examples require a .htaccess user to be authed with. If you dont +want to do this (I recommend that you do password protect it) you can optionally +just add the following somewhere near the top of curlrouting.php + +$_SERVER['REMOTE_USER']='switch1'; + +which will set the username to 'switch1' which is the default user in this example + + + + +PREREQUISITES You will need to get smarty from http://smarty.php.net to make this work + +If you install it globally, edit your php.ini to make the Smarty/libs dir as part +of the search path, otherwise add the following to curlrouting.php near the other +ini_set line. Adjust it to suit your particular setup. + +ini_set("include_path",".:/usr/local/lib/php:/usr/share/php:./Smarty-2.6.18/libs"); + + + +You also must create a directory named templates_c where you install this, its a smarty +requirement for caching templates. This directory *must* be writable by the webserver +or Smarty will not properly operate. Modified: freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/curlrouting.php ============================================================================== --- freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/curlrouting.php (original) +++ freeswitch/branches/greenlizard/scripts/contrib/trixter/xml-curl/curlrouting.php Sun Jul 8 22:28:40 2007 @@ -1,65 +1,28 @@ <?php // -*- mode:c; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil; -*- Header("Content-type: text/plain"); -ini_set("include_path",".:/usr/local/lib/php:/usr/share/php:./Smarty-2.6.18/libs"); +$callBacks = Array(); +ini_set("magic_quotes_gpc","Off"); include_once('Smarty.class.php'); - -if (isset($_POST['section']) && $_POST['section']=="dialplan") { - // create a new smarty object - $smarty = new Smarty(); - $template = 'fail.tpl'; - - - // see if they authenticated via .htaccess - if(isset($_SERVER['REMOTE_USER']) && $_SERVER['REMOTE_USER']!="") { - // we might check a database for the route, but in this example we hardcode it - $template = 'frompstn.tpl'; // one can exist for each profile or channel type or ... - - $ACTION['javascript']="somethingcool.js"; - $ACTION['bridge']="sofia/external/".$_POST['destination_number']."@myprovider.tld"; - $smarty->assign('ACTION',$ACTION); - - } // end - they were logged in - $smarty->display($_SERVER['DOCUMENT_ROOT']."/templates/".$_SERVER['REMOTE_USER']."/".$template); -} else if (isset($_POST['section']) && $_POST['section']=="configuration") { - $smarty = new Smarty(); - $template = $_POST['key_value'].".tpl"; - switch($_POST['key_value']) { - case "conference.conf": - // simulate data from a database, perhaps a table with 3 columns did,value,args - $digits['pin'] = '1234'; - $digits['anounce-count'] = '2'; - $digits['max-mmebers'] = '15'; - $digits['energy-level'] = '300'; - $params['0'] = 'event'; - $params['1'] = 'event'; - $params['2'] = 'event'; - $params['3'] = 'event'; - $params['4'] = 'event'; - $params['5'] = 'event'; - $params['6'] = 'event'; - $params['7'] = 'event'; - $params['8'] = 'event'; - $params['9'] = 'event'; - $params['#'] = 'event'; - $params['*'] = 'event'; +// load the modules +$dh = @opendir("./modules") or die("Unable to open modules dir"); +while ($file = readdir($dh)) { + if(preg_match("/.*\.php$/i",$file)) { + include_once("modules/$file"); + } +} - $smarty->assign('CONFNAME',$_POST['conf_name']); - $smarty->assign('digits',$digits); - $smarty->assign('params',$params); - } - if($smarty->template_exists($_SERVER['DOCUMENT_ROOT']."/templates/".$_SERVER['REMOTE_USER']."/".$template)) { - $smarty->display($_SERVER['DOCUMENT_ROOT']."/templates/".$_SERVER['REMOTE_USER']."/".$template); - } else { - // //logCallData(); - error_log("Unable to locate template $template"); - $smarty->assign('CONFNAME',$_POST['key_value']); - $smarty->display($_SERVER['DOCUMENT_ROOT']."/templates/".$_SERVER['REMOTE_USER']."/default.conf.tpl"); - } -} else if (isset($_POST['section']) && $_POST['section']=="directory") { - // we dont do anything but you get the idea +if(isset($_POST['section'])) { + if(isset($callBacks[$_POST['section']])) { + if(call_user_func($callBacks[$_POST['section']])==TRUE) { + exit; + } + } } +Header("HTTP/1.0 404 Not Found"); +echo "Not Found"; +exit; ?> Modified: freeswitch/branches/greenlizard/src/include/switch_loadable_module.h ============================================================================== --- freeswitch/branches/greenlizard/src/include/switch_loadable_module.h (original) +++ freeswitch/branches/greenlizard/src/include/switch_loadable_module.h Sun Jul 8 22:28:40 2007 @@ -256,7 +256,7 @@ \param filename the path to the module's dll or so file \return SWITCH_STATUS_SUCCESS on a successful load */ -SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **module_interface, char *filename); +SWITCH_MOD_DECLARE(switch_status_t) switch_module_load( switch_loadable_module_interface_t **module_interface, char *filename); SWITCH_MOD_DECLARE(switch_status_t) switch_module_runtime(void); /*! Modified: freeswitch/branches/greenlizard/src/include/switch_module_interfaces.h ============================================================================== --- freeswitch/branches/greenlizard/src/include/switch_module_interfaces.h (original) +++ freeswitch/branches/greenlizard/src/include/switch_module_interfaces.h Sun Jul 8 22:28:40 2007 @@ -53,7 +53,8 @@ SWITCH_SHN_ON_LOOPBACK, SWITCH_SHN_ON_TRANSMIT, SWITCH_SHN_ON_HOLD, - SWITCH_SHN_ON_HIBERNATE + SWITCH_SHN_ON_HIBERNATE, + SWITCH_SHN_ON_RESET, } switch_state_handler_name_t; struct switch_state_handler_table { @@ -73,6 +74,8 @@ switch_state_handler_t on_hold; /*! executed when the state changes to hibernate */ switch_state_handler_t on_hibernate; + /*! executed when the state changes to reset */ + switch_state_handler_t on_reset; void *padding[10]; }; @@ -281,6 +284,9 @@ switch_buffer_t *audio_buffer; uint32_t thresh; uint32_t silence_hits; + uint32_t offset_pos; + uint32_t last_pos; + int32_t vol; }; /*! \brief Abstract interface to an asr module */ Modified: freeswitch/branches/greenlizard/src/include/switch_types.h ============================================================================== --- freeswitch/branches/greenlizard/src/include/switch_types.h (original) +++ freeswitch/branches/greenlizard/src/include/switch_types.h Sun Jul 8 22:28:40 2007 @@ -527,6 +527,7 @@ CS_LOOPBACK - Channel is in loopback CS_HOLD - Channel is on hold CS_HIBERNATE - Channel is in a sleep state +CS_RESET - Channel is in a reset state CS_HANGUP - Channel is flagged for hangup and ready to end CS_DONE - Channel is ready to be destroyed and out of the state machine </pre> @@ -540,6 +541,7 @@ CS_LOOPBACK, CS_HOLD, CS_HIBERNATE, + CS_RESET, CS_HANGUP, CS_DONE } switch_channel_state_t; Modified: freeswitch/branches/greenlizard/src/mod/applications/mod_commands/mod_commands.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/applications/mod_commands/mod_commands.c (original) +++ freeswitch/branches/greenlizard/src/mod/applications/mod_commands/mod_commands.c Sun Jul 8 22:28:40 2007 @@ -311,6 +311,19 @@ return SWITCH_STATUS_SUCCESS; } + +SWITCH_STANDARD_API(uuid_function) +{ + switch_uuid_t uuid; + char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1]; + + switch_uuid_get(&uuid); + switch_uuid_format(uuid_str, &uuid); + stream->write_function(stream, "%s", uuid_str); + return SWITCH_STATUS_SUCCESS; +} + + #define SCHED_TRANSFER_SYNTAX "[+]<time> <uuid> <extension> [<dialplan>] [<context>]" SWITCH_STANDARD_API(sched_transfer_function) { @@ -1282,7 +1295,7 @@ SWITCH_ADD_API(commands_api_interface, "break", "Break", break_function, BREAK_SYNTAX); SWITCH_ADD_API(commands_api_interface, "show", "Show", show_function, SHOW_SYNTAX); SWITCH_ADD_API(commands_api_interface, "status", "status", status_function, ""); - SWITCH_ADD_API(commands_api_interface, "uuid_bridge", "uuid_bridge", uuid_bridge_function, UUID_SYNTAX); + SWITCH_ADD_API(commands_api_interface, "uuid_bridge", "uuid_bridge", uuid_bridge_function, ""); SWITCH_ADD_API(commands_api_interface, "session_displace", "session displace", session_displace_function, "<uuid> [start|stop] <path> [<limit>] [mux]"); SWITCH_ADD_API(commands_api_interface, "session_record", "session record", session_record_function, SESS_REC_SYNTAX); SWITCH_ADD_API(commands_api_interface, "broadcast", "broadcast", uuid_broadcast_function, BROADCAST_SYNTAX); @@ -1294,6 +1307,7 @@ SWITCH_ADD_API(commands_api_interface, "sched_hangup", "Schedule a running call to hangup", sched_hangup_function, SCHED_HANGUP_SYNTAX); SWITCH_ADD_API(commands_api_interface, "sched_broadcast", "Schedule a broadcast event to a running call", sched_broadcast_function, SCHED_BROADCAST_SYNTAX); SWITCH_ADD_API(commands_api_interface, "sched_transfer", "Schedule a broadcast event to a running call", sched_transfer_function, SCHED_TRANSFER_SYNTAX); + SWITCH_ADD_API(commands_api_interface, "create_uuid", "Create a uuid", uuid_function, UUID_SYNTAX); SWITCH_ADD_API(commands_api_interface, "sched_api", "Schedule an api command", sched_api_function, "[+]<time> <group_name> <command_string>"); SWITCH_ADD_API(commands_api_interface, "sched_del", "Delete a Scheduled task", sched_del_function, "<task_id>|<group_id>"); SWITCH_ADD_API(commands_api_interface, "xml_wrap", "Wrap another api command in xml", xml_wrap_api_function, "<command> <args>"); Modified: freeswitch/branches/greenlizard/src/mod/codecs/mod_l16/mod_l16.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/codecs/mod_l16/mod_l16.c (original) +++ freeswitch/branches/greenlizard/src/mod/codecs/mod_l16/mod_l16.c Sun Jul 8 22:28:40 2007 @@ -55,7 +55,7 @@ uint32_t decoded_rate, void *encoded_data, uint32_t * encoded_data_len, uint32_t * encoded_rate, unsigned int *flag) { - printf("WTF %d %d\n", codec->implementation->samples_per_second , other_codec->implementation->samples_per_second ); + /* NOOP indicates that the audio in is already the same as the audio out, so no conversion was necessary. */ if (codec && other_codec && codec->implementation && other_codec->implementation && codec->implementation->samples_per_second != other_codec->implementation->samples_per_second) { memcpy(encoded_data, decoded_data, decoded_data_len); Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_iax/mod_iax.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_iax/mod_iax.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_iax/mod_iax.c Sun Jul 8 22:28:40 2007 @@ -345,7 +345,6 @@ unsigned short samples = iax_build_codec_rates(); unsigned short mixed = ((tech_pvt->samprate ? tech_pvt->samprate : *samprate) & samples); - //printf("\n\n******WTF %u %u %u\n******\n", *samprate, samples, mixed); srate = 8000; if (mixed & IAX_RATE_16KHZ) { Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/mod_portaudio.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/mod_portaudio.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/mod_portaudio.c Sun Jul 8 22:28:40 2007 @@ -242,6 +242,8 @@ switch_channel_mark_ring_ready(channel); while (switch_channel_get_state(channel) == CS_INIT && !switch_test_flag(tech_pvt, TFLAG_ANSWER)) { + switch_size_t olen = globals.timer.samples; + if (switch_time_now() - last >= waitsec) { char buf[512]; switch_event_t *event; @@ -254,25 +256,22 @@ switch_channel_event_set_data(channel, event); switch_event_fire(&event); } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s\n", buf); last = switch_time_now(); - if (ring_file) { + } + + if (ring_file) { + if (switch_core_timer_next(&globals.timer) != SWITCH_STATUS_SUCCESS) { + switch_core_file_close(&fh); + break; + } + switch_core_file_read(&fh, abuf, &olen); + if (olen == 0) { unsigned int pos = 0; switch_core_file_seek(&fh, &pos, 0, SEEK_SET); - for (;;) { - switch_size_t olen = 1024; - switch_core_file_read(&fh, abuf, &olen); - if (olen == 0) { - break; - } - WriteAudioStream(globals.ring_stream, abuf, (long) olen, &globals.timer); - } } + WriteAudioStream(globals.ring_stream, abuf, (long) olen, &globals.timer); } - - switch_yield(globals.read_codec.implementation->microseconds_per_frame); - } switch_clear_flag_locked((&globals), GFLAG_RING); } @@ -619,7 +618,7 @@ if ((samples = ReadAudioStream(globals.audio_stream, globals.read_frame.data, globals.read_codec.implementation->samples_per_frame, &globals.timer)) == 0) { - + switch_mutex_unlock(globals.device_lock); goto cng; } else { globals.read_frame.datalen = samples * 2; Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c Sun Jul 8 22:28:40 2007 @@ -865,7 +865,7 @@ } if (!((tech_pvt->profile->pflags & PFLAG_REWRITE_TIMESTAMPS) || - ((val = switch_channel_get_variable(tech_pvt->channel, "rtp_rewrite_timestamps")) && switch_true(val)))) { + ((val = switch_channel_get_variable(tech_pvt->channel, "rtp_rewrite_timestamps")) && !switch_true(val)))) { flags |= SWITCH_RTP_FLAG_RAW_WRITE; } Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c (original) +++ freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c Sun Jul 8 22:28:40 2007 @@ -930,6 +930,29 @@ } return SWITCH_STATUS_FALSE; + } else if (!strncasecmp(ret, "volume", 6)) { + char *p; + + if ((p = strchr(ret, ':'))) { + p++; + if (*p == '+' || *p == '-') { + int step; + if (!(step = atoi(p))) { + step = 1; + } + fh->vol += step; + } else { + int vol = atoi(p); + fh->vol = vol; + } + return SWITCH_STATUS_SUCCESS; + } + + if (fh->vol) { + switch_normalize_volume(fh->vol); + } + + return SWITCH_STATUS_FALSE; } else if (!strcasecmp(ret, "pause")) { if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) { switch_clear_flag(fh, SWITCH_FILE_PAUSE); @@ -1361,8 +1384,8 @@ switch_file_handle_t fh = { 0 }; JSFunction *function; switch_input_args_t args = { 0 }; - char *prebuf; - + char *prebuf, posbuf[35] = ""; + METHOD_SANITY_CHECK(); channel = switch_core_session_get_channel(jss->session); @@ -1420,6 +1443,9 @@ JS_ResumeRequest(cx, cb_state.saveDepth); *rval = cb_state.ret; + snprintf(posbuf, sizeof(posbuf), "%u", fh.offset_pos); + switch_channel_set_variable(channel, "last_file_position", posbuf); + return JS_TRUE; } @@ -1768,15 +1794,19 @@ CHANNEL_SANITY_CHECK(); - if (argc > 1) { + if (argc > 0) { const switch_application_interface_t *application_interface; char *app_name = JS_GetStringBytes(JS_ValueToString(cx, argv[0])); - char *app_arg = JS_GetStringBytes(JS_ValueToString(cx, argv[1])); + char *app_arg = NULL; struct js_session *jss = JS_GetPrivate(cx, obj); jsrefcount saveDepth; METHOD_SANITY_CHECK(); + if (argc > 1) { + app_arg = JS_GetStringBytes(JS_ValueToString(cx, argv[1])); + } + if ((application_interface = switch_loadable_module_get_application_interface(app_name))) { if (application_interface->application_function) { saveDepth = JS_SuspendRequest(cx); Modified: freeswitch/branches/greenlizard/src/switch_channel.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_channel.c (original) +++ freeswitch/branches/greenlizard/src/switch_channel.c Sun Jul 8 22:28:40 2007 @@ -139,9 +139,13 @@ uint8_t x; switch_call_cause_t cause = SWITCH_CAUSE_UNALLOCATED; - for (x = 0; CAUSE_CHART[x].name; x++) { - if (!strcasecmp(CAUSE_CHART[x].name, str)) { - cause = CAUSE_CHART[x].cause; + if (*str > 47 && *str < 58) { + cause = atoi(str); + } else { + for (x = 0; CAUSE_CHART[x].name; x++) { + if (!strcasecmp(CAUSE_CHART[x].name, str)) { + cause = CAUSE_CHART[x].cause; + } } } return cause; @@ -509,7 +513,8 @@ assert(channel != NULL); - if (!channel->hangup_cause && channel->state > CS_RING && channel->state < CS_HANGUP && !switch_test_flag(channel, CF_TRANSFER)) { + if (!channel->hangup_cause && channel->state > CS_RING && channel->state < CS_HANGUP && channel->state != CS_RESET && + !switch_test_flag(channel, CF_TRANSFER)) { ret++; } @@ -525,6 +530,7 @@ "CS_LOOPBACK", "CS_HOLD", "CS_HIBERNATE", + "CS_RESET", "CS_HANGUP", "CS_DONE", NULL @@ -589,6 +595,7 @@ switch (last_state) { case CS_NEW: + case CS_RESET: switch (state) { default: ok++; @@ -604,6 +611,7 @@ case CS_EXECUTE: case CS_HOLD: case CS_HIBERNATE: + case CS_RESET: ok++; default: break; @@ -617,6 +625,7 @@ case CS_EXECUTE: case CS_HOLD: case CS_HIBERNATE: + case CS_RESET: ok++; default: break; @@ -630,6 +639,7 @@ case CS_EXECUTE: case CS_HOLD: case CS_HIBERNATE: + case CS_RESET: ok++; default: break; @@ -643,6 +653,7 @@ case CS_EXECUTE: case CS_TRANSMIT: case CS_HIBERNATE: + case CS_RESET: ok++; default: break; @@ -655,6 +666,7 @@ case CS_EXECUTE: case CS_TRANSMIT: case CS_HOLD: + case CS_RESET: ok++; default: break; @@ -669,6 +681,7 @@ case CS_TRANSMIT: case CS_HOLD: case CS_HIBERNATE: + case CS_RESET: ok++; default: break; @@ -682,6 +695,7 @@ case CS_RING: case CS_HOLD: case CS_HIBERNATE: + case CS_RESET: ok++; default: break; @@ -752,6 +766,7 @@ if (channel->state_flags) { channel->flags |= channel->state_flags; channel->state_flags = 0; + } switch_mutex_unlock(channel->flag_mutex); Modified: freeswitch/branches/greenlizard/src/switch_core.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_core.c (original) +++ freeswitch/branches/greenlizard/src/switch_core.c Sun Jul 8 22:28:40 2007 @@ -398,6 +398,8 @@ switch_uuid_t uuid; memset(&runtime, 0, sizeof(runtime)); + runtime.no_new_sessions = 1; + /* INIT APR and Create the pool context */ if (apr_initialize() != SWITCH_STATUS_SUCCESS) { *err = "FATAL ERROR! Could not initilize APR\n"; @@ -577,6 +579,9 @@ "\nFreeSWITCH Version %s Started.\nCrash Protection [%s]\nMax Sessions[%u]\n\n", SWITCH_VERSION_FULL, runtime.crash_prot ? "Enabled" : "Disabled", switch_core_session_limit(0)); + + runtime.no_new_sessions = 0; + return SWITCH_STATUS_SUCCESS; } Modified: freeswitch/branches/greenlizard/src/switch_core_file.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_core_file.c (original) +++ freeswitch/branches/greenlizard/src/switch_core_file.c Sun Jul 8 22:28:40 2007 @@ -110,11 +110,17 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_seek(switch_file_handle_t *fh, unsigned int *cur_pos, int64_t samples, int whence) { + switch_status_t status; + assert(fh != NULL); assert(fh->file_interface != NULL); switch_set_flag(fh, SWITCH_FILE_SEEK); - return fh->file_interface->file_seek(fh, cur_pos, samples, whence); + status = fh->file_interface->file_seek(fh, cur_pos, samples, whence); + if (samples) { + fh->offset_pos = *cur_pos; + } + return status; } SWITCH_DECLARE(switch_status_t) switch_core_file_set_string(switch_file_handle_t *fh, switch_audio_col_t col, const char *string) Modified: freeswitch/branches/greenlizard/src/switch_core_io.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_core_io.c (original) +++ freeswitch/branches/greenlizard/src/switch_core_io.c Sun Jul 8 22:28:40 2007 @@ -659,8 +659,6 @@ rate = session->write_codec->implementation->samples_per_second; } - printf("WTF %d %d %d\n", rate, enc_frame->datalen, session->enc_write_frame.datalen); - status = switch_core_codec_encode(session->write_codec, frame->codec, enc_frame->data, Modified: freeswitch/branches/greenlizard/src/switch_core_session.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_core_session.c (original) +++ freeswitch/branches/greenlizard/src/switch_core_session.c Sun Jul 8 22:28:40 2007 @@ -767,7 +767,10 @@ switch_uuid_t uuid; uint32_t count = 0; - assert(endpoint_interface != NULL); + if (!switch_core_ready() || endpoint_interface == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "The system cannot create any sessions at this time.\n"); + return NULL; + } switch_mutex_lock(session_manager.session_table_mutex); count = session_manager.session_count; @@ -778,11 +781,6 @@ return NULL; } - if (!switch_core_ready()) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Read my lips: no new sessions!\n"); - return NULL; - } - if (pool && *pool) { usepool = *pool; *pool = NULL; Modified: freeswitch/branches/greenlizard/src/switch_core_state_machine.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_core_state_machine.c (original) +++ freeswitch/branches/greenlizard/src/switch_core_state_machine.c Sun Jul 8 22:28:40 2007 @@ -47,6 +47,14 @@ } +static void switch_core_standard_on_reset(switch_core_session_t *session) +{ + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Standard RESET %s\n", + switch_channel_get_name(session->channel)); + +} + static void switch_core_standard_on_ring(switch_core_session_t *session) { switch_dialplan_interface_t *dialplan_interface = NULL; @@ -433,6 +441,41 @@ } } break; + case CS_RESET: /* Look for a dialplan and find something to do */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) State RESET\n", switch_channel_get_name(session->channel)); + if (!driver_state_handler->on_reset + || (driver_state_handler->on_reset && driver_state_handler->on_reset(session) == SWITCH_STATUS_SUCCESS + && midstate == switch_channel_get_state(session->channel))) { + while ((application_state_handler = switch_channel_get_state_handler(session->channel, index++)) != 0) { + if (!application_state_handler || !application_state_handler->on_reset + || (application_state_handler->on_reset + && application_state_handler->on_reset(session) == SWITCH_STATUS_SUCCESS + && midstate == switch_channel_get_state(session->channel))) { + proceed++; + continue; + } else { + proceed = 0; + break; + } + } + index = 0; + while (proceed && (application_state_handler = switch_core_get_state_handler(index++)) != 0) { + if (!application_state_handler || !application_state_handler->on_reset || + (application_state_handler->on_reset && + application_state_handler->on_reset(session) == SWITCH_STATUS_SUCCESS + && midstate == switch_channel_get_state(session->channel))) { + proceed++; + continue; + } else { + proceed = 0; + break; + } + } + if (proceed) { + switch_core_standard_on_reset(session); + } + } + break; case CS_EXECUTE: /* Execute an Operation */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) State EXECUTE\n", switch_channel_get_name(session->channel)); if (!driver_state_handler->on_execute Modified: freeswitch/branches/greenlizard/src/switch_ivr_bridge.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_ivr_bridge.c (original) +++ freeswitch/branches/greenlizard/src/switch_ivr_bridge.c Sun Jul 8 22:28:40 2007 @@ -262,11 +262,27 @@ }; +static switch_status_t uuid_bridge_on_reset(switch_core_session_t *session) +{ + switch_channel_t *channel = NULL; + + channel = switch_core_session_get_channel(session); + assert(channel != NULL); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "CUSTOM RESET\n"); + + if (switch_channel_test_flag(channel, CF_ORIGINATOR)) { + switch_channel_set_state(channel, CS_TRANSMIT); + } + + return SWITCH_STATUS_SUCCESS; +} static switch_status_t uuid_bridge_on_transmit(switch_core_session_t *session) { switch_channel_t *channel = NULL; switch_core_session_t *other_session; + char *other_uuid = NULL; channel = switch_core_session_get_channel(session); assert(channel != NULL); @@ -274,13 +290,13 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "CUSTOM TRANSMIT\n"); switch_channel_clear_state_handler(channel, NULL); - switch_channel_set_flag(channel, CF_BREAK); - if (!switch_channel_test_flag(channel, CF_ORIGINATOR)) { + switch_channel_set_flag(channel, CF_TAGGED); return SWITCH_STATUS_FALSE; } - - if ((other_session = switch_channel_get_private(channel, SWITCH_UUID_BRIDGE))) { + + if ((other_uuid = switch_channel_get_variable(channel, SWITCH_UUID_BRIDGE)) && + (other_session = switch_core_session_locate(other_uuid))) { switch_channel_t *other_channel = switch_core_session_get_channel(other_session); switch_channel_state_t state = switch_channel_get_state(other_channel); switch_channel_state_t mystate = switch_channel_get_state(channel); @@ -288,20 +304,19 @@ uint8_t ready_a, ready_b; switch_caller_profile_t *profile, *new_profile; - - switch_channel_clear_flag(channel, CF_TRANSFER); - switch_channel_set_private(channel, SWITCH_UUID_BRIDGE, NULL); - - while (mystate <= CS_HANGUP && state <= CS_HANGUP && !switch_channel_test_flag(other_channel, CF_TAGGED)) { + switch_channel_set_variable(channel, SWITCH_UUID_BRIDGE, NULL); + switch_channel_set_state(other_channel, CS_TRANSMIT); + for(;;) { + if (mystate >= CS_HANGUP || state >= CS_HANGUP || switch_channel_test_flag(other_channel, CF_TAGGED)) { + break; + } switch_yield(1000); state = switch_channel_get_state(other_channel); mystate = switch_channel_get_state(channel); } - + switch_channel_clear_flag(channel, CF_TRANSFER); switch_channel_clear_flag(other_channel, CF_TRANSFER); switch_channel_clear_flag(other_channel, CF_TAGGED); - - switch_core_session_reset(session); switch_core_session_reset(other_session); @@ -316,6 +331,7 @@ if (!ready_b) { switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); } + switch_core_session_rwunlock(other_session); return SWITCH_STATUS_FALSE; } @@ -348,6 +364,7 @@ } switch_ivr_multi_threaded_bridge(session, other_session, NULL, NULL, NULL); + switch_core_session_rwunlock(other_session); } else { switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); } @@ -364,7 +381,9 @@ /*.on_hangup */ NULL, /*.on_loopback */ NULL, /*.on_transmit */ uuid_bridge_on_transmit, - /*.on_hold */ NULL + /*.on_hold */ NULL, + /*.on_hibernate*/ NULL, + /*.on_reset*/ uuid_bridge_on_reset }; static switch_status_t signal_bridge_on_hibernate(switch_core_session_t *session) @@ -654,29 +673,21 @@ switch_channel_set_flag(originator_channel, CF_ORIGINATOR); switch_channel_add_state_handler(originator_channel, &uuid_bridge_state_handlers); switch_channel_add_state_handler(originatee_channel, &uuid_bridge_state_handlers); - switch_channel_set_flag(originatee_channel, CF_TAGGED); - switch_channel_set_private(originator_channel, SWITCH_UUID_BRIDGE, originatee_session); - + switch_channel_set_variable(originator_channel, SWITCH_UUID_BRIDGE, switch_core_session_get_uuid(originatee_session)); + switch_channel_set_flag(originator_channel, CF_BREAK); switch_channel_set_flag(originatee_channel, CF_BREAK); - /* switch_channel_set_state_flag sets flags you want to be set when the next state change happens */ - switch_channel_set_state_flag(originator_channel, CF_TRANSFER); - switch_channel_set_state_flag(originatee_channel, CF_TRANSFER); - /* change the states and let the chips fall where they may */ - switch_channel_set_state(originator_channel, CS_TRANSMIT); - switch_channel_set_state(originatee_channel, CS_TRANSMIT); + switch_channel_set_state(originator_channel, CS_RESET); + switch_channel_set_state(originatee_channel, CS_RESET); + + status = SWITCH_STATUS_SUCCESS; /* release the read locks we have on the channels */ switch_core_session_rwunlock(originator_session); switch_core_session_rwunlock(originatee_session); - status = SWITCH_STATUS_SUCCESS; - - while (switch_channel_get_state(originatee_channel) < CS_HANGUP && switch_channel_test_flag(originatee_channel, CF_TAGGED)) { - switch_yield(20000); - } } else { switch_core_session_rwunlock(originator_session); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "no channel for originatee uuid %s\n", originatee_uuid); Modified: freeswitch/branches/greenlizard/src/switch_ivr_play_say.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_ivr_play_say.c (original) +++ freeswitch/branches/greenlizard/src/switch_ivr_play_say.c Sun Jul 8 22:28:40 2007 @@ -394,7 +394,7 @@ for(;;) { switch_size_t len; - + if (!switch_channel_ready(channel)) { status = SWITCH_STATUS_FALSE; break; @@ -547,7 +547,7 @@ for(;;) { switch_status_t status = switch_core_session_read_frame(session, &read_frame, 1000, 0); - + if (!switch_channel_ready(channel)) { status = SWITCH_STATUS_FALSE; break; @@ -556,6 +556,7 @@ if (switch_channel_test_flag(channel, CF_BREAK)) { switch_channel_clear_flag(channel, CF_BREAK); + status = SWITCH_STATUS_BREAK; break; } @@ -691,6 +692,7 @@ if (sample_start > 0) { uint32_t pos = 0; + switch_core_file_seek(fh, &pos, 0, SEEK_SET); switch_core_file_seek(fh, &pos, sample_start, SEEK_CUR); } @@ -799,13 +801,19 @@ ilen = samples; - while (switch_channel_ready(channel)) { + for(;;) { int done = 0; int do_speed = 1; int last_speed = -1; + if (!switch_channel_ready(channel)) { + status = SWITCH_STATUS_FALSE; + break; + } + if (switch_channel_test_flag(channel, CF_BREAK)) { switch_channel_clear_flag(channel, CF_BREAK); + status = SWITCH_STATUS_BREAK; break; } @@ -872,6 +880,7 @@ if (done || olen <= 0) { break; } + if (!asis) { if (fh->speed > 2) { @@ -933,8 +942,15 @@ olen = llen; } - write_frame.datalen = (uint32_t) (olen * (asis ? 1 : 2)); - write_frame.samples = (uint32_t) olen; + write_frame.samples = olen; + + if (asis) { + write_frame.datalen = olen; + } else { + write_frame.datalen = write_frame.samples * 2; + } + + llen = olen; @@ -950,8 +966,13 @@ #endif stream_id = 0; - status = switch_core_session_write_frame(session, &write_frame, -1, stream_id); + if (fh->vol) { + switch_change_sln_volume(write_frame.data, write_frame.datalen / 2, fh->vol); + } + fh->offset_pos += write_frame.samples / 2; + status = switch_core_session_write_frame(session, &write_frame, -1, stream_id); + if (status == SWITCH_STATUS_MORE_DATA) { status = SWITCH_STATUS_SUCCESS; continue; @@ -984,6 +1005,8 @@ } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "done playing file\n"); + switch_core_file_seek(fh, &fh->last_pos, 0, SEEK_CUR); + switch_core_file_close(fh); switch_buffer_destroy(&fh->audio_buffer); if (!asis) { @@ -1176,11 +1199,17 @@ } ilen = len; - while (switch_channel_ready(channel)) { + for(;;) { switch_event_t *event; + if (!switch_channel_ready(channel)) { + status = SWITCH_STATUS_FALSE; + break; + } + if (switch_channel_test_flag(channel, CF_BREAK)) { switch_channel_clear_flag(channel, CF_BREAK); + status = SWITCH_STATUS_BREAK; break; } Modified: freeswitch/branches/greenlizard/src/switch_rtp.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_rtp.c (original) +++ freeswitch/branches/greenlizard/src/switch_rtp.c Sun Jul 8 22:28:40 2007 @@ -110,7 +110,6 @@ unsigned int out_digit_sofar; unsigned int out_digit_dur; uint16_t in_digit_seq; - uint16_t out_digit_seq; uint32_t out_digit_ssrc; int32_t timestamp_dtmf; char last_digit; @@ -135,6 +134,7 @@ uint16_t seq; uint16_t rseq; + uint8_t sending_dtmf; switch_payload_t payload; switch_payload_t rpayload; switch_rtp_invalid_handler_t invalid_handler; @@ -431,7 +431,7 @@ } - + rtp_session->dtmf_data.out_digit_ssrc = ssrc; rtp_session->pool = pool; rtp_session->te = 101; @@ -758,27 +758,26 @@ for (x = 0; x < loops; x++) { - rtp_session->dtmf_data.out_digit_seq++; + rtp_session->seq++; switch_rtp_write_manual(rtp_session, rtp_session->dtmf_data.out_digit_packet, 4, 0, rtp_session->te, - rtp_session->dtmf_data.timestamp_dtmf, rtp_session->dtmf_data.out_digit_seq, rtp_session->dtmf_data.out_digit_ssrc, + rtp_session->dtmf_data.timestamp_dtmf, rtp_session->seq, rtp_session->dtmf_data.out_digit_ssrc, &flags); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Send %s packet for [%c] ts=%d sofar=%u dur=%d seq=%d\n", loops == 1 ? "middle" : "end", rtp_session->dtmf_data.out_digit, rtp_session->dtmf_data.timestamp_dtmf, - rtp_session->dtmf_data.out_digit_sofar, duration, rtp_session->dtmf_data.out_digit_seq); + rtp_session->dtmf_data.out_digit_sofar, duration, rtp_session->seq); } - if (loops == 1) { - rtp_session->last_write_seq = 0; - } else { - rtp_session->dtmf_data.out_digit_seq = 0; + if (loops != 1) { + rtp_session->sending_dtmf = 0; } + } if (!rtp_session->dtmf_data.out_digit_dur && rtp_session->dtmf_data.dtmf_queue && switch_queue_size(rtp_session->dtmf_data.dtmf_queue)) { @@ -800,25 +799,24 @@ } else { rtp_session->dtmf_data.timestamp_dtmf = rtp_session->last_write_ts; } - - rtp_session->dtmf_data.out_digit_seq = rtp_session->last_write_seq; - rtp_session->dtmf_data.out_digit_ssrc = rtp_session->last_write_ssrc; - + + rtp_session->sending_dtmf = 1; for (x = 0; x < 3; x++) { - rtp_session->dtmf_data.out_digit_seq++; + rtp_session->seq++; switch_rtp_write_manual(rtp_session, rtp_session->dtmf_data.out_digit_packet, 4, switch_test_flag(rtp_session, SWITCH_RTP_FLAG_BUGGY_2833) ? 0 : 1, rtp_session->te, rtp_session->dtmf_data.timestamp_dtmf, - rtp_session->dtmf_data.out_digit_seq, rtp_session->dtmf_data.out_digit_ssrc, &flags); + rtp_session->seq, + rtp_session->dtmf_data.out_digit_ssrc, &flags); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Send start packet for [%c] ts=%d sofar=%u dur=%d seq=%d\n", rtp_session->dtmf_data.out_digit, - rtp_session->dtmf_data.timestamp_dtmf, rtp_session->dtmf_data.out_digit_sofar, 0, rtp_session->dtmf_data.out_digit_seq); + rtp_session->dtmf_data.timestamp_dtmf, rtp_session->dtmf_data.out_digit_sofar, 0, rtp_session->seq); } rtp_session->dtmf_data.timestamp_dtmf += samples; free(rdigit); @@ -1027,6 +1025,7 @@ if ((time(NULL) - rtp_session->dtmf_data.last_digit_time) > 2) { rtp_session->dtmf_data.last_digit = 0; rtp_session->dtmf_data.dc = 0; + rtp_session->dtmf_data.in_digit_seq = 0; } if (in_digit_seq > rtp_session->dtmf_data.in_digit_seq) { rtp_session->dtmf_data.in_digit_seq = in_digit_seq; @@ -1295,7 +1294,7 @@ rtp_session->cn = 0; m++; } - + send_msg = &rtp_session->send_msg; send_msg->header.pt = payload; send_msg->header.m = m ? 1 : 0; @@ -1424,8 +1423,7 @@ } } - - if (rtp_session->last_write_seq > 0 && rtp_session->last_write_seq <= rtp_session->dtmf_data.out_digit_seq) { + if (rtp_session->sending_dtmf) { send = 0; }