[commit] r5199 - in freeswitch/branches/greenlizard: libs/iksemel/src libs/libteletone/src libs/sofia-sip/libsofia-sip-ua/su src src/include src/mod/endpoints/mod_woomera src/mod/formats/mod_shout src/mod/languages/mod_python
Author: greenlizard Date: Thu May 17 12:45:24 2007 New Revision: 5199 Modified: freeswitch/branches/greenlizard/libs/iksemel/src/ikstack.c freeswitch/branches/greenlizard/libs/libteletone/src/libteletone.h freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_detect.c freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_detect.h freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_generate.c freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_generate.h freeswitch/branches/greenlizard/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c freeswitch/branches/greenlizard/src/include/switch_cpp.h freeswitch/branches/greenlizard/src/mod/endpoints/mod_woomera/mod_woomera.c freeswitch/branches/greenlizard/src/mod/formats/mod_shout/layer3.c freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch.py freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch_python.cpp freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.i freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python_wrap.cpp freeswitch/branches/greenlizard/src/switch_core_io.c freeswitch/branches/greenlizard/src/switch_core_session.c freeswitch/branches/greenlizard/src/switch_ivr.c freeswitch/branches/greenlizard/src/switch_ivr_bridge.c freeswitch/branches/greenlizard/src/switch_rtp.c Log: Sync up changes from trunk version 5186 to 5198, plus other changes related to getting streamfile working Modified: freeswitch/branches/greenlizard/libs/iksemel/src/ikstack.c ============================================================================== --- freeswitch/branches/greenlizard/libs/iksemel/src/ikstack.c (original) +++ freeswitch/branches/greenlizard/libs/iksemel/src/ikstack.c Thu May 17 12:45:24 2007 @@ -196,6 +196,7 @@ if (!s) { return; } + *sp = NULL; c = s->meta->next; while (c) { tmp = c->next; @@ -209,5 +210,5 @@ c = tmp; } iks_free (s); - *sp = NULL; + } Modified: freeswitch/branches/greenlizard/libs/libteletone/src/libteletone.h ============================================================================== --- freeswitch/branches/greenlizard/libs/libteletone/src/libteletone.h (original) +++ freeswitch/branches/greenlizard/libs/libteletone/src/libteletone.h Thu May 17 12:45:24 2007 @@ -28,6 +28,45 @@ * * libteletone.h -- Tone Generator/Detector * + * + * + * Exception: + * The author hereby grants the use of this source code under the + * following license if and only if the source code is distributed + * as part of the openzap library. Any use or distribution of this + * source code outside the scope of the openzap library will nullify the + * following license and reinact the MPL 1.1 as stated above. + * + * Copyright (c) 2007, Anthony Minessale II + * All rights reserved. + * + * 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 original author; nor the names of any 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 COPYRIGHT OWNER + * 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 LIBTELETONE_H #define LIBTELETONE_H Modified: freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_detect.c ============================================================================== --- freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_detect.c (original) +++ freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_detect.c Thu May 17 12:45:24 2007 @@ -49,7 +49,47 @@ * public domain for the benefit of all mankind - even the slimy * ones who might try to proprietize my work and use it to my * detriment. + * + * + * Exception: + * The author hereby grants the use of this source code under the + * following license if and only if the source code is distributed + * as part of the openzap library. Any use or distribution of this + * source code outside the scope of the openzap library will nullify the + * following license and reinact the MPL 1.1 as stated above. + * + * Copyright (c) 2007, Anthony Minessale II + * All rights reserved. + * + * 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 original author; nor the names of any 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 COPYRIGHT OWNER + * 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. */ + #include <math.h> #ifndef _MSC_VER #include <stdint.h> Modified: freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_detect.h ============================================================================== --- freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_detect.h (original) +++ freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_detect.h Thu May 17 12:45:24 2007 @@ -49,7 +49,47 @@ * public domain for the benefit of all mankind - even the slimy * ones who might try to proprietize my work and use it to my * detriment. + * + * + * Exception: + * The author hereby grants the use of this source code under the + * following license if and only if the source code is distributed + * as part of the openzap library. Any use or distribution of this + * source code outside the scope of the openzap library will nullify the + * following license and reinact the MPL 1.1 as stated above. + * + * Copyright (c) 2007, Anthony Minessale II + * All rights reserved. + * + * 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 original author; nor the names of any 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 COPYRIGHT OWNER + * 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 LIBTELETONE_DETECT_H #define LIBTELETONE_DETECT_H Modified: freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_generate.c ============================================================================== --- freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_generate.c (original) +++ freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_generate.c Thu May 17 12:45:24 2007 @@ -28,7 +28,47 @@ * * libteletone.c -- Tone Generator * + * + * + * Exception: + * The author hereby grants the use of this source code under the + * following license if and only if the source code is distributed + * as part of the openzap library. Any use or distribution of this + * source code outside the scope of the openzap library will nullify the + * following license and reinact the MPL 1.1 as stated above. + * + * Copyright (c) 2007, Anthony Minessale II + * All rights reserved. + * + * 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 original author; nor the names of any 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 COPYRIGHT OWNER + * 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. */ + #include <libteletone.h> #define SMAX 32767 #define SMIN -32768 Modified: freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_generate.h ============================================================================== --- freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_generate.h (original) +++ freeswitch/branches/greenlizard/libs/libteletone/src/libteletone_generate.h Thu May 17 12:45:24 2007 @@ -28,6 +28,45 @@ * * libteletone.h -- Tone Generator * + * + * + * Exception: + * The author hereby grants the use of this source code under the + * following license if and only if the source code is distributed + * as part of the openzap library. Any use or distribution of this + * source code outside the scope of the openzap library will nullify the + * following license and reinact the MPL 1.1 as stated above. + * + * Copyright (c) 2007, Anthony Minessale II + * All rights reserved. + * + * 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 original author; nor the names of any 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 COPYRIGHT OWNER + * 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 LIBTELETONE_GENERATE_H #define LIBTELETONE_GENERATE_H Modified: freeswitch/branches/greenlizard/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c ============================================================================== --- freeswitch/branches/greenlizard/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c (original) +++ freeswitch/branches/greenlizard/libs/sofia-sip/libsofia-sip-ua/su/su_alloc.c Thu May 17 12:45:24 2007 @@ -929,7 +929,7 @@ return 0; } - +#define safe_free(it) if (it) { free(it); it = NULL; } /** Internal deinitialization */ static void _su_home_deinit(su_home_t *home) @@ -965,16 +965,17 @@ } else if (su_is_preloaded(b, b->sub_nodes[i].sua_data)) continue; - free(b->sub_nodes[i].sua_data); + safe_free(b->sub_nodes[i].sua_data); + } } if (b->sub_preload && !b->sub_preauto) - free(b->sub_preload); + safe_free(b->sub_preload); if (b->sub_stats) - free(b->sub_stats); + safe_free(b->sub_stats); if (!b->sub_auto) - free(b); + safe_free(b); home->suh_blocks = NULL; Modified: freeswitch/branches/greenlizard/src/include/switch_cpp.h ============================================================================== --- freeswitch/branches/greenlizard/src/include/switch_cpp.h (original) +++ freeswitch/branches/greenlizard/src/include/switch_cpp.h Thu May 17 12:45:24 2007 @@ -16,6 +16,9 @@ void console_clean_log(char *msg); char *api_execute(char *cmd, char *arg); void api_reply_delete(char *reply); +switch_status_t process_callback_result(char *raw_result, + struct input_callback_state *cb_state, + switch_core_session_t *session); class CoreSession { private: Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_woomera/mod_woomera.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/endpoints/mod_woomera/mod_woomera.c (original) +++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_woomera/mod_woomera.c Thu May 17 12:45:24 2007 @@ -334,7 +334,9 @@ { const char p = 0; switch_size_t len = sizeof(p); - switch_socket_sendto(tech_pvt->udp_socket, tech_pvt->udpwrite, 0, &p, &len); + if (tech_pvt->udp_socket && tech_pvt->udpwrite) { + switch_socket_sendto(tech_pvt->udp_socket, tech_pvt->udpwrite, 0, &p, &len); + } } break; } Modified: freeswitch/branches/greenlizard/src/mod/formats/mod_shout/layer3.c ============================================================================== --- freeswitch/branches/greenlizard/src/mod/formats/mod_shout/layer3.c (original) +++ freeswitch/branches/greenlizard/src/mod/formats/mod_shout/layer3.c Thu May 17 12:45:24 2007 @@ -826,9 +826,23 @@ int x, y; if (!mc) { + unsigned sanity; mc = *m++; - v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; - cb = *m++; + if ((unsigned)*scf < 100 && (unsigned)*pretab < 100) { + sanity = (((*scf++) + (*pretab++)) << shift); + + //v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift]; + if (sanity < 100) { + v = gr_info->pow2gain[sanity]; + cb = *m++; + } else { + return 1; + } + + } else { + return 1; + } + } { register short *val = h->table; Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch.py ============================================================================== --- freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch.py (original) +++ freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch.py Thu May 17 12:45:24 2007 @@ -46,6 +46,7 @@ console_clean_log = _freeswitch.console_clean_log api_execute = _freeswitch.api_execute api_reply_delete = _freeswitch.api_reply_delete +process_callback_result = _freeswitch.process_callback_result class CoreSession(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, CoreSession, name, value) Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch_python.cpp ============================================================================== --- freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch_python.cpp (original) +++ freeswitch/branches/greenlizard/src/mod/languages/mod_python/freeswitch_python.cpp Thu May 17 12:45:24 2007 @@ -27,8 +27,12 @@ sanity_check(-1); if (PyArg_ParseTuple(funcargs, "s", &s)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "funcargs: %s.", s); cb_state.funcargs = s; } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "could not get funcargs"); + } if (!PyCallable_Check(pyfunc)) { dtmfCallbackFunction = NULL; Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.i ============================================================================== --- freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.i (original) +++ freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.i Thu May 17 12:45:24 2007 @@ -14,75 +14,145 @@ %{ -// status = args->input_callback(session, dtmf, SWITCH_INPUT_TYPE_DTMF, args->buf, args->buflen); switch_status_t PythonDTMFCallback(switch_core_session_t *session, void *input, switch_input_type_t itype, - void *buf, // Python function defined in script + void *buf, unsigned int buflen) { PyObject *func, *arglist; PyObject *result; + char *resultStr; + char *funcargs; struct input_callback_state *cb_state; - switch_status_t dres = SWITCH_STATUS_FALSE; + switch_file_handle_t *fh = NULL; PyThreadState *threadState = NULL; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "PythonDTMFCallback CALLED"); if (!buf) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "buf pointer is null"); - return dres; + return SWITCH_STATUS_FALSE; } - // TODO: a struct will be passed, of which one of the members will be - // the actual callback function - cb_state = (input_callback_state *) buf; + cb_state = (input_callback_state *) buf; - func = (PyObject *) cb_state->function; // Get Python function + func = (PyObject *) cb_state->function; if (!func) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "cb_state->function is null"); - return dres; + return SWITCH_STATUS_FALSE; } if (!PyCallable_Check(func)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "function not callable"); - return dres; + return SWITCH_STATUS_FALSE; } - arglist = Py_BuildValue("(si)", input, itype); // Build argument list + funcargs = (char *) cb_state->funcargs; + + arglist = Py_BuildValue("(sis)", input, itype, funcargs); if (!arglist) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "error building arglist"); - return dres; + return SWITCH_STATUS_FALSE; } threadState = (PyThreadState *) cb_state->threadState; if (!threadState) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "error, invalid threadstate"); - return dres; + return SWITCH_STATUS_FALSE; } - // TODO: the python should return string values just like the javascript - // user defined function. then in this function, we act on those values - // by pausing the fh (shit, where is the fh?), fast forwarding, etc. - // then figure out a freeswitch status to return and return it. + PyEval_RestoreThread(threadState); // nasty stuff happens when py interp has no thread state + result = PyEval_CallObject(func, arglist); + threadState = PyEval_SaveThread(); - + Py_DECREF(arglist); // Trash arglist + if (result) { + resultStr = (char *) PyString_AsString(result); + } + Py_XDECREF(result); - PyEval_RestoreThread(threadState); + return process_callback_result(resultStr, cb_state, session); - result = PyEval_CallObject(func, arglist); // Call Python +} - threadState = PyEval_SaveThread(); + +switch_status_t process_callback_result(char *ret, + struct input_callback_state *cb_state, + switch_core_session_t *session) +{ + + switch_file_handle_t *fh = NULL; + fh = (switch_file_handle_t *) cb_state->extra; + + if (!strncasecmp(ret, "speed", 4)) { + char *p; + + if ((p = strchr(ret, ':'))) { + p++; + if (*p == '+' || *p == '-') { + int step; + if (!(step = atoi(p))) { + step = 1; + } + fh->speed += step; + } else { + int speed = atoi(p); + fh->speed = speed; + } + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; + + } else if (!strcasecmp(ret, "pause")) { + if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) { + switch_clear_flag(fh, SWITCH_FILE_PAUSE); + } else { + switch_set_flag(fh, SWITCH_FILE_PAUSE); + } + return SWITCH_STATUS_SUCCESS; + } else if (!strcasecmp(ret, "restart")) { + unsigned int pos = 0; + fh->speed = 0; + switch_core_file_seek(fh, &pos, 0, SEEK_SET); + return SWITCH_STATUS_SUCCESS; + } else if (!strncasecmp(ret, "seek", 4)) { + switch_codec_t *codec; + unsigned int samps = 0; + unsigned int pos = 0; + char *p; + codec = switch_core_session_get_read_codec(session); + + if ((p = strchr(ret, ':'))) { + p++; + if (*p == '+' || *p == '-') { + int step; + if (!(step = atoi(p))) { + step = 1000; + } + if (step > 0) { + samps = step * (codec->implementation->samples_per_second / 1000); + switch_core_file_seek(fh, &pos, samps, SEEK_CUR); + } else { + samps = step * (codec->implementation->samples_per_second / 1000); + switch_core_file_seek(fh, &pos, fh->pos - samps, SEEK_SET); + } + } else { + samps = atoi(p) * (codec->implementation->samples_per_second / 1000); + switch_core_file_seek(fh, &pos, samps, SEEK_SET); + } + } + + return SWITCH_STATUS_SUCCESS; + } + + if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) { + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; - Py_DECREF(arglist); // Trash arglist - if (result) { // If no errors, return double - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "PythonDTMFCallback 5"); - dres = (switch_status_t) PyInt_AsLong(result); - } - Py_XDECREF(result); - return dres; } Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python_wrap.cpp ============================================================================== --- freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python_wrap.cpp (original) +++ freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python_wrap.cpp Thu May 17 12:45:24 2007 @@ -2876,75 +2876,145 @@ -// status = args->input_callback(session, dtmf, SWITCH_INPUT_TYPE_DTMF, args->buf, args->buflen); switch_status_t PythonDTMFCallback(switch_core_session_t *session, void *input, switch_input_type_t itype, - void *buf, // Python function defined in script + void *buf, unsigned int buflen) { PyObject *func, *arglist; PyObject *result; + char *resultStr; + char *funcargs; struct input_callback_state *cb_state; - switch_status_t dres = SWITCH_STATUS_FALSE; + switch_file_handle_t *fh = NULL; PyThreadState *threadState = NULL; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "PythonDTMFCallback CALLED"); if (!buf) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "buf pointer is null"); - return dres; + return SWITCH_STATUS_FALSE; } - // TODO: a struct will be passed, of which one of the members will be - // the actual callback function - cb_state = (input_callback_state *) buf; + cb_state = (input_callback_state *) buf; - func = (PyObject *) cb_state->function; // Get Python function + func = (PyObject *) cb_state->function; if (!func) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "cb_state->function is null"); - return dres; + return SWITCH_STATUS_FALSE; } if (!PyCallable_Check(func)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "function not callable"); - return dres; + return SWITCH_STATUS_FALSE; } - arglist = Py_BuildValue("(si)", input, itype); // Build argument list + funcargs = (char *) cb_state->funcargs; + + arglist = Py_BuildValue("(sis)", input, itype, funcargs); if (!arglist) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "error building arglist"); - return dres; + return SWITCH_STATUS_FALSE; } threadState = (PyThreadState *) cb_state->threadState; if (!threadState) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "error, invalid threadstate"); - return dres; + return SWITCH_STATUS_FALSE; } - // TODO: the python should return string values just like the javascript - // user defined function. then in this function, we act on those values - // by pausing the fh (shit, where is the fh?), fast forwarding, etc. - // then figure out a freeswitch status to return and return it. + PyEval_RestoreThread(threadState); // nasty stuff happens when py interp has no thread state + result = PyEval_CallObject(func, arglist); + threadState = PyEval_SaveThread(); - + Py_DECREF(arglist); // Trash arglist + if (result) { + resultStr = (char *) PyString_AsString(result); + } + Py_XDECREF(result); - PyEval_RestoreThread(threadState); + return process_callback_result(resultStr, cb_state, session); - result = PyEval_CallObject(func, arglist); // Call Python +} - threadState = PyEval_SaveThread(); + +switch_status_t process_callback_result(char *ret, + struct input_callback_state *cb_state, + switch_core_session_t *session) +{ + + switch_file_handle_t *fh = NULL; + fh = (switch_file_handle_t *) cb_state->extra; + + if (!strncasecmp(ret, "speed", 4)) { + char *p; + + if ((p = strchr(ret, ':'))) { + p++; + if (*p == '+' || *p == '-') { + int step; + if (!(step = atoi(p))) { + step = 1; + } + fh->speed += step; + } else { + int speed = atoi(p); + fh->speed = speed; + } + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; + + } else if (!strcasecmp(ret, "pause")) { + if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) { + switch_clear_flag(fh, SWITCH_FILE_PAUSE); + } else { + switch_set_flag(fh, SWITCH_FILE_PAUSE); + } + return SWITCH_STATUS_SUCCESS; + } else if (!strcasecmp(ret, "restart")) { + unsigned int pos = 0; + fh->speed = 0; + switch_core_file_seek(fh, &pos, 0, SEEK_SET); + return SWITCH_STATUS_SUCCESS; + } else if (!strncasecmp(ret, "seek", 4)) { + switch_codec_t *codec; + unsigned int samps = 0; + unsigned int pos = 0; + char *p; + codec = switch_core_session_get_read_codec(session); + + if ((p = strchr(ret, ':'))) { + p++; + if (*p == '+' || *p == '-') { + int step; + if (!(step = atoi(p))) { + step = 1000; + } + if (step > 0) { + samps = step * (codec->implementation->samples_per_second / 1000); + switch_core_file_seek(fh, &pos, samps, SEEK_CUR); + } else { + samps = step * (codec->implementation->samples_per_second / 1000); + switch_core_file_seek(fh, &pos, fh->pos - samps, SEEK_SET); + } + } else { + samps = atoi(p) * (codec->implementation->samples_per_second / 1000); + switch_core_file_seek(fh, &pos, samps, SEEK_SET); + } + } + + return SWITCH_STATUS_SUCCESS; + } + + if (!strcmp(ret, "true") || !strcmp(ret, "undefined")) { + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_FALSE; - Py_DECREF(arglist); // Trash arglist - if (result) { // If no errors, return double - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "PythonDTMFCallback 5"); - dres = (switch_status_t) PyInt_AsLong(result); - } - Py_XDECREF(result); - return dres; } @@ -3104,6 +3174,49 @@ } +SWIGINTERN PyObject *_wrap_process_callback_result(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + char *arg1 = (char *) 0 ; + input_callback_state *arg2 = (input_callback_state *) 0 ; + switch_core_session_t *arg3 = (switch_core_session_t *) 0 ; + switch_status_t result; + int res1 ; + char *buf1 = 0 ; + int alloc1 = 0 ; + void *argp2 = 0 ; + int res2 = 0 ; + void *argp3 = 0 ; + int res3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:process_callback_result",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "process_callback_result" "', argument " "1"" of type '" "char *""'"); + } + arg1 = buf1; + res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_input_callback_state, 0 | 0 ); + if (!SWIG_IsOK(res2)) { + SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "process_callback_result" "', argument " "2"" of type '" "input_callback_state *""'"); + } + arg2 = reinterpret_cast< input_callback_state * >(argp2); + res3 = SWIG_ConvertPtr(obj2, &argp3,SWIGTYPE_p_switch_core_session_t, 0 | 0 ); + if (!SWIG_IsOK(res3)) { + SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "process_callback_result" "', argument " "3"" of type '" "switch_core_session_t *""'"); + } + arg3 = reinterpret_cast< switch_core_session_t * >(argp3); + result = process_callback_result(arg1,arg2,arg3); + resultobj = SWIG_NewPointerObj((new switch_status_t(static_cast< const switch_status_t& >(result))), SWIGTYPE_p_switch_status_t, SWIG_POINTER_OWN | 0 ); + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return resultobj; +fail: + if (alloc1 == SWIG_NEWOBJ) delete[] buf1; + return NULL; +} + + SWIGINTERN PyObject *_wrap_new_CoreSession__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; @@ -4566,6 +4679,7 @@ { (char *)"console_clean_log", _wrap_console_clean_log, METH_VARARGS, NULL}, { (char *)"api_execute", _wrap_api_execute, METH_VARARGS, NULL}, { (char *)"api_reply_delete", _wrap_api_reply_delete, METH_VARARGS, NULL}, + { (char *)"process_callback_result", _wrap_process_callback_result, METH_VARARGS, NULL}, { (char *)"new_CoreSession", _wrap_new_CoreSession, METH_VARARGS, NULL}, { (char *)"delete_CoreSession", _wrap_delete_CoreSession, METH_VARARGS, NULL}, { (char *)"CoreSession_session_set", _wrap_CoreSession_session_set, METH_VARARGS, NULL}, 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 Thu May 17 12:45:24 2007 @@ -730,7 +730,7 @@ switch_io_event_hook_kill_channel_t *ptr; switch_status_t status = SWITCH_STATUS_FALSE; - switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_INFO, "Kill %s [%s]\n", switch_channel_get_name(session->channel), + switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, SWITCH_LOG_DEBUG, "Kill %s [%s]\n", switch_channel_get_name(session->channel), SIG_NAMES[sig]); if (session->endpoint_interface->io_routines->kill_channel) { 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 Thu May 17 12:45:24 2007 @@ -626,7 +626,7 @@ { switch_status_t status = SWITCH_STATUS_SUCCESS; switch_io_event_hook_state_change_t *ptr; - + /* If trylock fails the signal is already awake so we needn't bother */ if (switch_mutex_trylock(session->mutex) == SWITCH_STATUS_SUCCESS) { switch_thread_cond_signal(session->cond); @@ -644,6 +644,7 @@ } } } + switch_core_session_kill_channel(session, SWITCH_SIG_BREAK); } SWITCH_DECLARE(unsigned int) switch_core_session_running(switch_core_session_t *session) Modified: freeswitch/branches/greenlizard/src/switch_ivr.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_ivr.c (original) +++ freeswitch/branches/greenlizard/src/switch_ivr.c Thu May 17 12:45:24 2007 @@ -749,7 +749,6 @@ if (switch_channel_test_flag(channel, CF_BYPASS_MEDIA)) { status = SWITCH_STATUS_SUCCESS; - switch_channel_clear_flag(channel, CF_BYPASS_MEDIA); switch_core_session_receive_message(session, &msg); if ((flags & SMF_REBRIDGE) @@ -765,7 +764,7 @@ switch_channel_clear_state_handler(channel, NULL); } } - + switch_core_session_rwunlock(session); if (other_channel) { @@ -803,22 +802,21 @@ } if ((flags & SMF_FORCE) || !switch_channel_test_flag(channel, CF_BYPASS_MEDIA)) { - switch_ivr_parse_all_events(session); - + //switch_ivr_parse_all_events(session); + switch_core_session_receive_message(session, &msg); + if ((flags & SMF_REBRIDGE) && (other_uuid = switch_channel_get_variable(channel, SWITCH_BRIDGE_VARIABLE)) && (other_session = switch_core_session_locate(other_uuid))) { other_channel = switch_core_session_get_channel(other_session); assert(other_channel != NULL); - - switch_ivr_parse_all_events(other_session); + //switch_ivr_parse_all_events(other_session); switch_core_session_receive_message(other_session, &msg); switch_channel_clear_state_handler(other_channel, NULL); } - switch_channel_set_flag(channel, CF_BYPASS_MEDIA); - switch_core_session_receive_message(session, &msg); + if (other_channel) { switch_channel_clear_state_handler(channel, NULL); 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 Thu May 17 12:45:24 2007 @@ -98,7 +98,7 @@ break; } - if (loop_count > 10 && switch_core_session_private_event_count(session_a)) { + if (loop_count > 50 && switch_core_session_private_event_count(session_a)) { switch_channel_set_flag(chan_b, CF_SUSPEND); msg.string_arg = data->b_uuid; msg.message_id = SWITCH_MESSAGE_INDICATE_UNBRIDGE; @@ -491,7 +491,7 @@ switch_channel_set_state_flag(caller_channel, CF_TRANSFER); switch_channel_set_state_flag(peer_channel, CF_TRANSFER); - + switch_channel_set_state(caller_channel, CS_HIBERNATE); switch_channel_set_state(peer_channel, CS_HIBERNATE); Modified: freeswitch/branches/greenlizard/src/switch_rtp.c ============================================================================== --- freeswitch/branches/greenlizard/src/switch_rtp.c (original) +++ freeswitch/branches/greenlizard/src/switch_rtp.c Thu May 17 12:45:24 2007 @@ -129,6 +129,8 @@ switch_sockaddr_t *remote_addr; rtp_msg_t recv_msg; srtp_ctx_t *recv_ctx; + uint32_t autoadj_window; + uint32_t autoadj_tally; uint16_t seq; uint16_t rseq; @@ -430,12 +432,13 @@ rtp_session->pool = pool; - rtp_session->flags = flags; rtp_session->te = 101; switch_mutex_init(&rtp_session->flag_mutex, SWITCH_MUTEX_NESTED, rtp_session->pool); switch_mutex_init(&rtp_session->dtmf_data.dtmf_mutex, SWITCH_MUTEX_NESTED, rtp_session->pool); switch_buffer_create_dynamic(&rtp_session->dtmf_data.dtmf_buffer, 128, 128, 0); + switch_rtp_set_flag(rtp_session, flags); + /* for from address on recvfrom calls */ switch_sockaddr_info_get(&rtp_session->from_addr, NULL, SWITCH_UNSPEC, 0, 0, rtp_session->pool); @@ -705,7 +708,10 @@ { switch_set_flag_locked(rtp_session, flags); - + if (flags & SWITCH_RTP_FLAG_AUTOADJ) { + rtp_session->autoadj_window = 20; + rtp_session->autoadj_tally = 0; + } } SWITCH_DECLARE(uint8_t) switch_rtp_test_flag(switch_rtp_t *rtp_session, switch_rtp_flag_t flags) @@ -960,30 +966,35 @@ } - - if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) && switch_sockaddr_get_port(rtp_session->from_addr)) { - + if (bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) && switch_sockaddr_get_port(rtp_session->from_addr)) { char *tx_host; char *old_host; char bufa[30], bufb[30]; tx_host = switch_get_addr(bufa, sizeof(bufa), rtp_session->from_addr); old_host = switch_get_addr(bufb, sizeof(bufb), rtp_session->remote_addr); - - if ((switch_sockaddr_get_port(rtp_session->from_addr) != rtp_session->remote_port) - || strcmp(tx_host, old_host)) { + if ((switch_sockaddr_get_port(rtp_session->from_addr) != rtp_session->remote_port) || strcmp(tx_host, old_host)) { const char *err; uint32_t old = rtp_session->remote_port; if (!switch_strlen_zero(tx_host) && switch_sockaddr_get_port(rtp_session->from_addr) > 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, - "Auto Changing port from %s:%u to %s:%u\n", old_host, old, tx_host, - switch_sockaddr_get_port(rtp_session->from_addr)); - switch_rtp_set_remote_address(rtp_session, tx_host, switch_sockaddr_get_port(rtp_session->from_addr), &err); + if (++rtp_session->autoadj_tally >= 10) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, + "Auto Changing port from %s:%u to %s:%u\n", old_host, old, tx_host, + switch_sockaddr_get_port(rtp_session->from_addr)); + switch_rtp_set_remote_address(rtp_session, tx_host, switch_sockaddr_get_port(rtp_session->from_addr), &err); + } } } - switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_AUTOADJ); } + if (rtp_session->autoadj_window) { + if (--rtp_session->autoadj_window == 0) { + switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_AUTOADJ); + } + } + + + if (bytes && rtp_session->cng_pt && rtp_session->recv_msg.header.pt == rtp_session->cng_pt) { continue; }
participants (1)
-
Freeswitch SVN