diff --git a/.gitignore b/.gitignore
index 304b42c1f9..c53d07d8a9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,6 +33,12 @@
*.ilk
*.bsc
*.pch
+*.tar
+*.gz
+*.tgz
+*.xz
+*.bz2
+*.tbz2
core.*
/Path
/w32/Library/lastversion
@@ -79,7 +85,6 @@ configure.lineno
/scripts/fsxs
/scripts/gentls_cert
/a.out.dSYM
-/freeswitch-sounds-*
src/mod/applications/mod_easyroute/Makefile
src/mod/applications/mod_lcr/Makefile
src/mod/applications/mod_nibblebill/Makefile
diff --git a/conf/freeswitch.xml b/conf/freeswitch.xml
index 80e7728e0d..6914128e55 100644
--- a/conf/freeswitch.xml
+++ b/conf/freeswitch.xml
@@ -61,7 +61,4 @@
-
-
-
diff --git a/libs/freetdm/msvc/freetdm.2010.vcxproj b/libs/freetdm/msvc/freetdm.2010.vcxproj
index 71eb6dbf22..aecb9ef79c 100644
--- a/libs/freetdm/msvc/freetdm.2010.vcxproj
+++ b/libs/freetdm/msvc/freetdm.2010.vcxproj
@@ -188,6 +188,7 @@
+
@@ -209,6 +210,7 @@
+
diff --git a/libs/freetdm/msvc/freetdm.2010.vcxproj.filters b/libs/freetdm/msvc/freetdm.2010.vcxproj.filters
index ed642baf3d..e6dc40d372 100644
--- a/libs/freetdm/msvc/freetdm.2010.vcxproj.filters
+++ b/libs/freetdm/msvc/freetdm.2010.vcxproj.filters
@@ -71,6 +71,9 @@
Header Files
+
+ Header Files
+
@@ -124,5 +127,8 @@
Source Files
+
+ Source Files
+
\ No newline at end of file
diff --git a/libs/freetdm/msvc/testboost/testboost.2010.vcxproj b/libs/freetdm/msvc/testboost/testboost.2010.vcxproj
index 62061485c2..314440bf9f 100644
--- a/libs/freetdm/msvc/testboost/testboost.2010.vcxproj
+++ b/libs/freetdm/msvc/testboost/testboost.2010.vcxproj
@@ -105,7 +105,7 @@
4100;%(DisableSpecificWarnings)
- ..\..\debug\freetdm.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
true
Console
false
@@ -162,7 +162,7 @@
4100;%(DisableSpecificWarnings)
- freetdm.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
true
Console
false
@@ -199,7 +199,7 @@
MachineX64
- freetdm.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
../../$(PlatformName)\$(Configuration);%(AdditionalLibraryDirectories)
diff --git a/libs/freetdm/msvc/testboost/testsangomaboost.2010.vcxproj b/libs/freetdm/msvc/testboost/testsangomaboost.2010.vcxproj
index 5994da6f1a..4077a60aba 100644
--- a/libs/freetdm/msvc/testboost/testsangomaboost.2010.vcxproj
+++ b/libs/freetdm/msvc/testboost/testsangomaboost.2010.vcxproj
@@ -105,7 +105,7 @@
4100;%(DisableSpecificWarnings)
- ..\..\debug\freetdm.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
true
Console
false
@@ -162,7 +162,7 @@
4100;%(DisableSpecificWarnings)
- freetdm.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
true
Console
false
@@ -199,7 +199,7 @@
MachineX64
- freetdm.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
../../$(PlatformName)\$(Configuration);%(AdditionalLibraryDirectories)
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.2010.vcxproj b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.2010.vcxproj
index 78689c36db..684e4326cb 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.2010.vcxproj
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.2010.vcxproj
@@ -61,11 +61,11 @@
<_ProjectFileVersion>10.0.30319.1
- $(SolutionDir)$(Configuration)\
- $(Configuration)\
+ $(SolutionDir)$(Platform)\$(Configuration)\
+ $(Platform)\$(Configuration)\
true
- $(SolutionDir)$(Configuration)\
- $(Configuration)\
+ $(SolutionDir)$(Platform)\$(Configuration)\
+ $(Platform)\$(Configuration)\
false
$(SolutionDir)$(Platform)\$(Configuration)\
$(Platform)\$(Configuration)\
@@ -102,7 +102,7 @@
4100;%(DisableSpecificWarnings)
- freetdm.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
$(OutDir);%(AdditionalLibraryDirectories)
true
Windows
@@ -151,7 +151,7 @@
4100;%(DisableSpecificWarnings)
- freetdm.lib;%(AdditionalDependencies)
+ %(AdditionalDependencies)
$(OutDir);%(AdditionalLibraryDirectories)
true
Windows
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
index 0b52011d42..578677a39f 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
@@ -385,8 +385,12 @@ void sngisdn_process_cnst_ind (sngisdn_event_data_t *sngisdn_event)
case FTDM_CHANNEL_STATE_DIALING:
case FTDM_CHANNEL_STATE_PROCEED:
case FTDM_CHANNEL_STATE_PROGRESS:
- case FTDM_CHANNEL_STATE_RINGING:
- if (cnStEvnt->progInd.eh.pres && cnStEvnt->progInd.progDesc.val == IN_PD_IBAVAIL) {
+ case FTDM_CHANNEL_STATE_RINGING:
+ if ((cnStEvnt->progInd.eh.pres && cnStEvnt->progInd.progDesc.val == IN_PD_IBAVAIL) ||
+ (cnStEvnt->progInd1.eh.pres && cnStEvnt->progInd1.progDesc.val == IN_PD_IBAVAIL) ||
+ (cnStEvnt->progInd2.eh.pres && cnStEvnt->progInd2.progDesc.val == IN_PD_IBAVAIL) ||
+ (cnStEvnt->progInd3.eh.pres && cnStEvnt->progInd3.progDesc.val == IN_PD_IBAVAIL)) {
+
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Early media available\n");
sngisdn_set_flag(sngisdn_info, FLAG_MEDIA_READY);
} else {
diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.2010.vcxproj b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.2010.vcxproj
index 40d0a73a5b..a21be2232f 100644
--- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.2010.vcxproj
+++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.2010.vcxproj
@@ -61,14 +61,14 @@
<_ProjectFileVersion>10.0.30319.1
- $(SolutionDir)$(Configuration)\
- $(Configuration)\
+ $(SolutionDir)$(Platform)\$(Configuration)\
+ $(Platform)\$(Configuration)\
true
$(SolutionDir)$(Platform)\$(Configuration)\
$(Platform)\$(Configuration)\
true
- $(SolutionDir)$(Configuration)\
- $(Configuration)\
+ $(SolutionDir)$(Platform)\$(Configuration)\
+ $(Platform)\$(Configuration)\
false
$(SolutionDir)$(Platform)\$(Configuration)\
$(Platform)\$(Configuration)\
diff --git a/src/include/switch_core.h b/src/include/switch_core.h
index 29e8b43526..109a16901b 100644
--- a/src/include/switch_core.h
+++ b/src/include/switch_core.h
@@ -24,6 +24,7 @@
* Contributor(s):
*
* Anthony Minessale II
+ * Luke Dashjr (OpenMethods, LLC)
*
*
* switch_core.h -- Core Library
@@ -1734,6 +1735,15 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_close(switch_asr_handle_t *ah, s
*/
SWITCH_DECLARE(switch_status_t) switch_core_asr_feed(switch_asr_handle_t *ah, void *data, unsigned int len, switch_asr_flag_t *flags);
+/*!
+ \brief Feed DTMF to an asr handle
+ \param ah the handle to feed data to
+ \param dtmf a string of DTMF digits
+ \param flags flags to influence behaviour
+ \return SWITCH_STATUS_SUCCESS
+*/
+SWITCH_DECLARE(switch_status_t) switch_core_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags);
+
/*!
\brief Check an asr handle for results
\param ah the handle to check
@@ -1768,6 +1778,29 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_load_grammar(switch_asr_handle_t
*/
SWITCH_DECLARE(switch_status_t) switch_core_asr_unload_grammar(switch_asr_handle_t *ah, const char *name);
+/*!
+ \brief Enable a grammar from an asr handle
+ \param ah the handle to enable the grammar from
+ \param name the name of the grammar to enable
+ \return SWITCH_STATUS_SUCCESS
+*/
+SWITCH_DECLARE(switch_status_t) switch_core_asr_enable_grammar(switch_asr_handle_t *ah, const char *name);
+
+/*!
+ \brief Disable a grammar from an asr handle
+ \param ah the handle to disable the grammar from
+ \param name the name of the grammar to disable
+ \return SWITCH_STATUS_SUCCESS
+*/
+SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_grammar(switch_asr_handle_t *ah, const char *name);
+
+/*!
+ \brief Disable all grammars from an asr handle
+ \param ah the handle to disable the grammars from
+ \return SWITCH_STATUS_SUCCESS
+*/
+SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_all_grammars(switch_asr_handle_t *ah);
+
/*!
\brief Pause detection on an asr handle
\param ah the handle to pause
diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h
index 46c9c91670..9b353f3ded 100644
--- a/src/include/switch_ivr.h
+++ b/src/include/switch_ivr.h
@@ -26,6 +26,7 @@
* Anthony Minessale II
* Neal Horman
* Bret McDanel
+ * Luke Dashjr (OpenMethods, LLC)
*
* switch_ivr.h -- IVR Library
*
@@ -198,8 +199,38 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_load_grammar(switch_cor
*/
SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_unload_grammar(switch_core_session_t *session, const char *name);
+/*!
+ \brief Enable a grammar on a background speech detection handle
+ \param session The session to change the grammar on
+ \param name the grammar name
+ \return SWITCH_STATUS_SUCCESS if all is well
+*/
+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_enable_grammar(switch_core_session_t *session, const char *name);
+
+/*!
+ \brief Disable a grammar on a background speech detection handle
+ \param session The session to change the grammar on
+ \param name the grammar name
+ \return SWITCH_STATUS_SUCCESS if all is well
+*/
+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_grammar(switch_core_session_t *session, const char *name);
+
+/*!
+ \brief Disable all grammars on a background speech detection handle
+ \param session The session to change the grammar on
+ \return SWITCH_STATUS_SUCCESS if all is well
+*/
+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_all_grammars(switch_core_session_t *session);
+
SWITCH_DECLARE(switch_status_t) switch_ivr_set_param_detect_speech(switch_core_session_t *session, const char *name, const char *val);
+/*!
+ \brief Start input timers on a background speech detection handle
+ \param session The session to start the timers on
+ \return SWITCH_STATUS_SUCCESS if all is well
+*/
+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_start_input_timers(switch_core_session_t *session);
+
/*!
\brief Record a session to disk
\param session the session to record
diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h
index 114e594c0c..90d7342ef4 100644
--- a/src/include/switch_module_interfaces.h
+++ b/src/include/switch_module_interfaces.h
@@ -24,6 +24,7 @@
* Contributor(s):
*
* Anthony Minessale II
+ * Luke Dashjr (OpenMethods, LLC)
*
*
* switch_module_interfaces.h -- Module Interface Definitions
@@ -396,6 +397,14 @@ struct switch_asr_interface {
switch_mutex_t *reflock;
switch_loadable_module_interface_t *parent;
struct switch_asr_interface *next;
+ /*! function to enable a grammar to the asr interface */
+ switch_status_t (*asr_enable_grammar) (switch_asr_handle_t *ah, const char *name);
+ /*! function to disable a grammar to the asr interface */
+ switch_status_t (*asr_disable_grammar) (switch_asr_handle_t *ah, const char *name);
+ /*! function to disable all grammars to the asr interface */
+ switch_status_t (*asr_disable_all_grammars) (switch_asr_handle_t *ah);
+ /*! function to feed DTMF to the ASR */
+ switch_status_t (*asr_feed_dtmf) (switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags);
};
/*! an abstract representation of an asr speech interface. */
diff --git a/src/mod/applications/mod_callcenter/mod_callcenter.c b/src/mod/applications/mod_callcenter/mod_callcenter.c
index d1de632ee6..61305bbbb5 100644
--- a/src/mod/applications/mod_callcenter/mod_callcenter.c
+++ b/src/mod/applications/mod_callcenter/mod_callcenter.c
@@ -2625,8 +2625,10 @@ SWITCH_STANDARD_API(cc_config_api_function)
cc_queue_t *queue = NULL;
if ((queue = get_queue(queue_name))) {
queue_rwunlock(queue);
+ stream->write_function(stream, "%s", "+OK\n");
+ } else {
+ stream->write_function(stream, "%s", "-ERR Invalid Queue not found!\n");
}
- stream->write_function(stream, "%s", "+OK\n");
}
} else if (action && !strcasecmp(action, "unload")) {
if (argc-initial_argc < 1) {
@@ -2648,8 +2650,10 @@ SWITCH_STANDARD_API(cc_config_api_function)
destroy_queue(queue_name, SWITCH_FALSE);
if ((queue = get_queue(queue_name))) {
queue_rwunlock(queue);
+ stream->write_function(stream, "%s", "+OK\n");
+ } else {
+ stream->write_function(stream, "%s", "-ERR Invalid Queue not found!\n");
}
- stream->write_function(stream, "%s", "+OK\n");
}
} else if (action && !strcasecmp(action, "list")) {
if (argc-initial_argc < 1) {
@@ -2671,7 +2675,6 @@ SWITCH_STANDARD_API(cc_config_api_function)
goto done;
} else {
const char *queue_name = argv[0 + initial_argc];
-
struct list_result cbt;
cbt.row_process = 0;
cbt.stream = stream;
diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c
index 5a3be0328d..928a9b8549 100755
--- a/src/mod/applications/mod_dptools/mod_dptools.c
+++ b/src/mod/applications/mod_dptools/mod_dptools.c
@@ -28,6 +28,7 @@
* Michael Murdock
* Neal Horman
* Bret McDanel
+ * Luke Dashjr (OpenMethods, LLC)
*
* mod_dptools.c -- Raw Audio File Streaming Application Module
*
@@ -269,7 +270,7 @@ SWITCH_STANDARD_APP(bind_digit_action_function)
}
-#define DETECT_SPEECH_SYNTAX " [] OR grammar [] OR nogrammar OR pause OR resume OR stop OR param "
+#define DETECT_SPEECH_SYNTAX " [] OR grammar [] OR nogrammar OR grammaron/grammaroff OR grammarsalloff OR pause OR resume OR start_input_timers OR stop OR param "
SWITCH_STANDARD_APP(detect_speech_function)
{
char *argv[4];
@@ -282,6 +283,12 @@ SWITCH_STANDARD_APP(detect_speech_function)
switch_ivr_detect_speech_load_grammar(session, argv[1], argv[2]);
} else if (!strcasecmp(argv[0], "nogrammar")) {
switch_ivr_detect_speech_unload_grammar(session, argv[1]);
+ } else if (!strcasecmp(argv[0], "grammaron")) {
+ switch_ivr_detect_speech_enable_grammar(session, argv[1]);
+ } else if (!strcasecmp(argv[0], "grammaroff")) {
+ switch_ivr_detect_speech_disable_grammar(session, argv[1]);
+ } else if (!strcasecmp(argv[0], "grammarsalloff")) {
+ switch_ivr_detect_speech_disable_all_grammars(session);
} else if (!strcasecmp(argv[0], "pause")) {
switch_ivr_pause_detect_speech(session);
} else if (!strcasecmp(argv[0], "resume")) {
@@ -290,6 +297,8 @@ SWITCH_STANDARD_APP(detect_speech_function)
switch_ivr_stop_detect_speech(session);
} else if (!strcasecmp(argv[0], "param")) {
switch_ivr_set_param_detect_speech(session, argv[1], argv[2]);
+ } else if (!strcasecmp(argv[0], "start_input_timers")) {
+ switch_ivr_detect_speech_start_input_timers(session);
} else if (argc >= 3) {
switch_ivr_detect_speech(session, argv[0], argv[1], argv[2], argv[3], NULL);
}
diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c
index 21c6a68a0e..4dd936b8c6 100644
--- a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c
+++ b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c
@@ -40,6 +40,9 @@
#define MAX_FEC_ENTRIES 4
#define MAX_FEC_SPAN 4
+#define SPANDSP_EVENT_TXFAXRESULT "spandsp::txfaxresult"
+#define SPANDSP_EVENT_RXFAXRESULT "spandsp::rxfaxresult"
+
/*****************************************************************************
OUR DEFINES AND STRUCTS
*****************************************************************************/
@@ -305,7 +308,14 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result)
switch_core_session_t *session;
switch_channel_t *channel;
pvt_t *pvt;
- char *tmp;
+ char *fax_document_transferred_pages = NULL;
+ char *fax_document_total_pages = NULL;
+ char *fax_image_resolution = NULL;
+ char *fax_image_size = NULL;
+ char *fax_bad_rows = NULL;
+ char *fax_transfer_rate = NULL;
+ char *fax_result_code = NULL;
+ switch_event_t *event;
pvt = (pvt_t *) user_data;
switch_assert(pvt);
@@ -353,13 +363,12 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result)
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "==============================================================================\n");
/*
- Set our channel variables
+ Set our channel variables, variables are also used in event
*/
- tmp = switch_mprintf("%i", result);
- if (tmp) {
- switch_channel_set_variable(channel, "fax_result_code", tmp);
- switch_safe_free(tmp);
+ fax_result_code = switch_core_session_sprintf(session, "%i", result);
+ if (fax_result_code) {
+ switch_channel_set_variable(channel, "fax_result_code", fax_result_code);
}
switch_channel_set_variable(channel, "fax_result_text", t30_completion_code_to_str(result));
@@ -368,49 +377,56 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result)
switch_channel_set_variable(channel, "fax_local_station_id", local_ident);
switch_channel_set_variable(channel, "fax_remote_station_id", far_ident);
- tmp = switch_mprintf("%i", pvt->app_mode == FUNCTION_TX ? t.pages_tx : t.pages_rx);
- if (tmp) {
- switch_channel_set_variable(channel, "fax_document_transferred_pages", tmp);
- switch_safe_free(tmp);
+ fax_document_transferred_pages = switch_core_session_sprintf(session, "%i", pvt->app_mode == FUNCTION_TX ? t.pages_tx : t.pages_rx);
+ if (fax_document_transferred_pages) {
+ switch_channel_set_variable(channel, "fax_document_transferred_pages", fax_document_transferred_pages);
}
- tmp = switch_mprintf("%i", t.pages_in_file);
- if (tmp) {
- switch_channel_set_variable(channel, "fax_document_total_pages", tmp);
- switch_safe_free(tmp);
+ fax_document_total_pages = switch_core_session_sprintf(session, "%i", t.pages_in_file);
+ if (fax_document_total_pages) {
+ switch_channel_set_variable(channel, "fax_document_total_pages", fax_document_total_pages);
}
- tmp = switch_mprintf("%ix%i", t.x_resolution, t.y_resolution);
- if (tmp) {
- switch_channel_set_variable(channel, "fax_image_resolution", tmp);
- switch_safe_free(tmp);
+ fax_image_resolution = switch_core_session_sprintf(session, "%ix%i", t.x_resolution, t.y_resolution);
+ if (fax_image_resolution) {
+ switch_channel_set_variable(channel, "fax_image_resolution", fax_image_resolution);
}
- tmp = switch_mprintf("%d", t.image_size);
- if (tmp) {
- switch_channel_set_variable(channel, "fax_image_size", tmp);
- switch_safe_free(tmp);
+ fax_image_size = switch_core_session_sprintf(session, "%d", t.image_size);
+ if (fax_image_size) {
+ switch_channel_set_variable(channel, "fax_image_size", fax_image_size);
}
- tmp = switch_mprintf("%d", t.bad_rows);
- if (tmp) {
- switch_channel_set_variable(channel, "fax_bad_rows", tmp);
- switch_safe_free(tmp);
+ fax_bad_rows = switch_core_session_sprintf(session, "%d", t.bad_rows);
+ if (fax_bad_rows) {
+ switch_channel_set_variable(channel, "fax_bad_rows", fax_bad_rows);
}
- tmp = switch_mprintf("%i", t.bit_rate);
- if (tmp) {
- switch_channel_set_variable(channel, "fax_transfer_rate", tmp);
- switch_safe_free(tmp);
+ fax_transfer_rate = switch_core_session_sprintf(session, "%i", t.bit_rate);
+ if (fax_transfer_rate) {
+ switch_channel_set_variable(channel, "fax_transfer_rate", fax_transfer_rate);
}
/* switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); */
pvt->done = 1;
- /*
- TODO Fire events
- */
+ /* Fire event */
+
+ if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, pvt->app_mode == FUNCTION_TX ? SPANDSP_EVENT_TXFAXRESULT : SPANDSP_EVENT_RXFAXRESULT) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-document-transferred-pages", fax_document_transferred_pages);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-document-total-pages", fax_document_total_pages);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-image-resolution", fax_image_resolution);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-image-size", fax_image_size);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-bad-rows", fax_bad_rows);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-transfer-rate", fax_transfer_rate);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-result-code", fax_result_code);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-result-text", t30_completion_code_to_str(result));
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-ecm-used", (t.error_correcting_mode) ? "on" : "off");
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-local-station-id", local_ident);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-remote-station-id", far_ident);
+ switch_core_session_queue_private_event(session, &event, SWITCH_FALSE);
+ }
}
static int t38_tx_packet_handler(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count)
@@ -1026,7 +1042,6 @@ void mod_spandsp_fax_process_fax(switch_core_session_t *session, const char *dat
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Fax TX filename not set.\n");
goto done;
} else if (pvt->app_mode == FUNCTION_RX) {
- char *fname;
const char *prefix;
switch_time_t time;
@@ -1036,11 +1051,7 @@ void mod_spandsp_fax_process_fax(switch_core_session_t *session, const char *dat
prefix = globals.prepend_string;
}
- fname = switch_mprintf("%s/%s-%ld-%ld.tif", globals.spool, prefix, globals.total_sessions, time);
- if (fname) {
- pvt->filename = switch_core_session_strdup(session, fname);
- switch_safe_free(fname);
- } else {
+ if (!(pvt->filename = switch_core_session_sprintf(session, "%s/%s-%ld-%ld.tif", globals.spool, prefix, globals.total_sessions, time))) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot automatically set fax RX destination file\n");
goto done;
}
diff --git a/src/mod/applications/mod_spy/mod_spy.c b/src/mod/applications/mod_spy/mod_spy.c
index 9986703f66..1797539cf0 100644
--- a/src/mod/applications/mod_spy/mod_spy.c
+++ b/src/mod/applications/mod_spy/mod_spy.c
@@ -201,14 +201,14 @@ static void event_handler(switch_event_t *event)
}
if (!(peer_session = switch_core_session_locate(peer_uuid))) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cant locate peer session for uuid %s\n", peer_uuid);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Can't locate peer session for uuid %s\n", peer_uuid);
return;
}
peer_channel = switch_core_session_get_channel(peer_session);
if (switch_event_create(&peer_event, SWITCH_EVENT_CHANNEL_BRIDGE) != SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cant create bridge event for peer channel %s\n", peer_uuid);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't create bridge event for peer channel %s\n", peer_uuid);
goto end;
}
@@ -249,7 +249,7 @@ SWITCH_STANDARD_APP(userspy_function)
status = switch_core_hash_insert(globals.spy_hash, argv[0], (void *) uuid);
if ((status != SWITCH_STATUS_SUCCESS)) {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cant insert to spy hash\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Can't insert to spy hash\n");
switch_channel_hangup(channel, SWITCH_CAUSE_SERVICE_NOT_IMPLEMENTED);
switch_thread_rwlock_unlock(globals.spy_hash_lock);
return;
diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c
index 4b36e1435e..5db1491aac 100644
--- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c
+++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c
@@ -26,6 +26,7 @@
*
* Brian West
* Christopher M. Rienzo
+ * Luke Dashjr (OpenMethods, LLC)
*
* mod_unimrcp.c -- UniMRCP module (MRCP client)
*
@@ -48,6 +49,7 @@
#include "mrcp_resource_loader.h"
#include "mpf_engine.h"
#include "mpf_codec_manager.h"
+#include "mpf_dtmf_generator.h"
#include "mpf_rtp_termination_factory.h"
#include "mrcp_sofiasip_client_agent.h"
#include "mrcp_unirtsp_client_agent.h"
@@ -433,14 +435,20 @@ static const char *grammar_type_to_mime(grammar_type_t type, profile_t *profile)
struct recognizer_data {
/** the available grammars */
switch_hash_t *grammars;
- /** the last grammar used (for pause/resume) */
- grammar_t *last_grammar;
+ /** the enabled grammars */
+ switch_hash_t *enabled_grammars;
/** recognize result */
char *result;
/** true, if voice has started */
int start_of_input;
/** true, if input timers have started */
int timers_started;
+ /** UniMRCP mpf stream */
+ mpf_audio_stream_t *unimrcp_stream;
+ /** DTMF generator */
+ mpf_dtmf_generator_t *dtmf_generator;
+ /** true, if presently transmitting DTMF */
+ char dtmf_generator_active;
};
typedef struct recognizer_data recognizer_data_t;
@@ -451,8 +459,12 @@ static switch_status_t recog_shutdown();
static switch_status_t recog_asr_open(switch_asr_handle_t *ah, const char *codec, int rate, const char *dest, switch_asr_flag_t *flags);
static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const char *grammar, const char *name);
static switch_status_t recog_asr_unload_grammar(switch_asr_handle_t *ah, const char *name);
+static switch_status_t recog_asr_enable_grammar(switch_asr_handle_t *ah, const char *name);
+static switch_status_t recog_asr_disable_grammar(switch_asr_handle_t *ah, const char *name);
+static switch_status_t recog_asr_disable_all_grammars(switch_asr_handle_t *ah);
static switch_status_t recog_asr_close(switch_asr_handle_t *ah, switch_asr_flag_t *flags);
static switch_status_t recog_asr_feed(switch_asr_handle_t *ah, void *data, unsigned int len, switch_asr_flag_t *flags);
+static switch_status_t recog_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags);
#if 0
static switch_status_t recog_asr_start(switch_asr_handle_t *ah, const char *name);
#endif
@@ -468,12 +480,16 @@ static void recog_asr_float_param(switch_asr_handle_t *ah, char *param, double v
/* recognizer's interface for UniMRCP */
static apt_bool_t recog_message_handler(const mrcp_app_message_t *app_message);
static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp_session_t *session, mrcp_channel_t *channel, mrcp_message_t *message);
+static apt_bool_t recog_stream_open(mpf_audio_stream_t *stream, mpf_codec_t *codec);
static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *frame);
/* recognizer specific speech_channel_funcs */
-static switch_status_t recog_channel_start(speech_channel_t *schannel, const char *name);
+static switch_status_t recog_channel_start(speech_channel_t *schannel);
static switch_status_t recog_channel_load_grammar(speech_channel_t *schannel, const char *name, grammar_type_t type, const char *data);
static switch_status_t recog_channel_unload_grammar(speech_channel_t *schannel, const char *name);
+static switch_status_t recog_channel_enable_grammar(speech_channel_t *schannel, const char *name);
+static switch_status_t recog_channel_disable_grammar(speech_channel_t *schannel, const char *name);
+static switch_status_t recog_channel_disable_all_grammars(speech_channel_t *schannel);
static switch_status_t recog_channel_check_results(speech_channel_t *schannel);
static switch_status_t recog_channel_set_start_of_input(speech_channel_t *schannel);
static switch_status_t recog_channel_start_input_timers(speech_channel_t *schannel);
@@ -2055,19 +2071,24 @@ static const char *grammar_type_to_mime(grammar_type_t type, profile_t *profile)
* Start RECOGNIZE request
*
* @param schannel the channel to start
- * @param name the name of the grammar to use or NULL if to reuse the last grammar
* @return SWITCH_STATUS_SUCCESS if successful
*/
-static switch_status_t recog_channel_start(speech_channel_t *schannel, const char *name)
+static switch_status_t recog_channel_start(speech_channel_t *schannel)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_hash_index_t *egk;
mrcp_message_t *mrcp_message;
mrcp_recog_header_t *recog_header;
mrcp_generic_header_t *generic_header;
recognizer_data_t *r;
char *start_input_timers;
const char *mime_type;
- grammar_t *grammar = NULL;
+ char *key;
+ switch_size_t len;
+ grammar_t *grammar;
+ switch_size_t grammar_uri_count = 0;
+ switch_size_t grammar_uri_list_len = 0;
+ char *grammar_uri_list = NULL;
switch_mutex_lock(schannel->mutex);
if (schannel->state != SPEECH_CHANNEL_READY) {
@@ -2088,21 +2109,55 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha
start_input_timers = (char *) switch_core_hash_find(schannel->params, "start-input-timers");
r->timers_started = zstr(start_input_timers) || strcasecmp(start_input_timers, "false");
- /* get the cached grammar */
- if (zstr(name)) {
- grammar = r->last_grammar;
- } else {
- grammar = (grammar_t *) switch_core_hash_find(r->grammars, name);
- r->last_grammar = grammar;
- }
- if (grammar == NULL) {
- if (name) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Undefined grammar, %s\n", schannel->name, name);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) No grammar specified\n", schannel->name);
+ /* count enabled grammars */
+ for (egk = switch_hash_first(NULL, r->enabled_grammars); egk; egk = switch_hash_next(egk)) {
+ // NOTE: This postponed type check is necessary to allow a non-URI-list grammar to execute alone
+ if (grammar_uri_count == 1 && grammar->type != GRAMMAR_TYPE_URI)
+ goto no_grammar_alone;
+ ++grammar_uri_count;
+ switch_hash_this(egk, (void *) &key, NULL, (void *) &grammar);
+ if (grammar->type != GRAMMAR_TYPE_URI && grammar_uri_count != 1) {
+ no_grammar_alone:
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Grammar '%s' can only be used alone (not a URI list)\n", schannel->name, key);
+ status = SWITCH_STATUS_FALSE;
+ goto done;
}
+ len = strlen(grammar->data);
+ if (!len)
+ continue;
+ grammar_uri_list_len += len;
+ if (grammar->data[len - 1] != '\n')
+ grammar_uri_list_len += 2;
+ }
+
+ switch (grammar_uri_count) {
+ case 0:
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) No grammar specified\n", schannel->name);
status = SWITCH_STATUS_FALSE;
goto done;
+ case 1:
+ /* grammar should already be the unique grammar */
+ break;
+ default:
+ /* get the enabled grammars list */
+ grammar_uri_list = switch_core_alloc(schannel->memory_pool, grammar_uri_list_len + 1);
+ grammar_uri_list_len = 0;
+ for (egk = switch_hash_first(NULL, r->enabled_grammars); egk; egk = switch_hash_next(egk)) {
+ switch_hash_this(egk, (void *) &key, NULL, (void *) &grammar);
+ len = strlen(grammar->data);
+ if (!len)
+ continue;
+ memcpy(&(grammar_uri_list[grammar_uri_list_len]), grammar->data, len);
+ grammar_uri_list_len += len;
+ if (grammar_uri_list[grammar_uri_list_len - 1] != '\n')
+ {
+ grammar_uri_list_len += 2;
+ grammar_uri_list[grammar_uri_list_len - 2] = '\r';
+ grammar_uri_list[grammar_uri_list_len - 1] = '\n';
+ }
+ }
+ grammar_uri_list[grammar_uri_list_len++] = '\0';
+ grammar = NULL;
}
/* create MRCP message */
@@ -2120,7 +2175,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha
}
/* set Content-Type */
- mime_type = grammar_type_to_mime(grammar->type, schannel->profile);
+ mime_type = grammar_type_to_mime(grammar ? grammar->type : GRAMMAR_TYPE_URI, schannel->profile);
if (zstr(mime_type)) {
status = SWITCH_STATUS_FALSE;
goto done;
@@ -2129,7 +2184,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha
mrcp_generic_header_property_add(mrcp_message, GENERIC_HEADER_CONTENT_TYPE);
/* set Content-ID for inline grammars */
- if (grammar->type != GRAMMAR_TYPE_URI) {
+ if (grammar && grammar->type != GRAMMAR_TYPE_URI) {
apt_string_assign(&generic_header->content_id, grammar->name, mrcp_message->pool);
mrcp_generic_header_property_add(mrcp_message, GENERIC_HEADER_CONTENT_ID);
}
@@ -2151,7 +2206,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha
recog_channel_set_params(schannel, mrcp_message, generic_header, recog_header);
/* set message body */
- apt_string_assign(&mrcp_message->body, grammar->data, mrcp_message->pool);
+ apt_string_assign(&mrcp_message->body, grammar ? grammar->data : grammar_uri_list, mrcp_message->pool);
/* Empty audio queue and send RECOGNIZE to MRCP server */
audio_queue_clear(schannel->audio_queue);
@@ -2286,12 +2341,84 @@ static switch_status_t recog_channel_unload_grammar(speech_channel_t *schannel,
} else {
recognizer_data_t *r = (recognizer_data_t *) schannel->data;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Unloading grammar %s\n", schannel->name, grammar_name);
+ switch_core_hash_delete(r->enabled_grammars, grammar_name);
switch_core_hash_delete(r->grammars, grammar_name);
}
return status;
}
+/**
+ * Enable speech recognition grammar
+ *
+ * @param schannel the recognizer channel
+ * @param grammar_name the name of the grammar to enable
+ * @return SWITCH_STATUS_SUCCESS if successful
+ */
+static switch_status_t recog_channel_enable_grammar(speech_channel_t *schannel, const char *grammar_name)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ if (zstr(grammar_name)) {
+ status = SWITCH_STATUS_FALSE;
+ } else {
+ recognizer_data_t *r = (recognizer_data_t *) schannel->data;
+ grammar_t *grammar;
+ grammar = (grammar_t *) switch_core_hash_find(r->grammars, grammar_name);
+ if (grammar == NULL)
+ {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Undefined grammar, %s\n", schannel->name, grammar_name);
+ status = SWITCH_STATUS_FALSE;
+ }
+ else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Enabling grammar %s\n", schannel->name, grammar_name);
+ switch_core_hash_insert(r->enabled_grammars, grammar_name, grammar);
+ }
+ }
+
+ return status;
+}
+
+/**
+ * Disable speech recognition grammar
+ *
+ * @param schannel the recognizer channel
+ * @param grammar_name the name of the grammar to disable
+ * @return SWITCH_STATUS_SUCCESS if successful
+ */
+static switch_status_t recog_channel_disable_grammar(speech_channel_t *schannel, const char *grammar_name)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ if (zstr(grammar_name)) {
+ status = SWITCH_STATUS_FALSE;
+ } else {
+ recognizer_data_t *r = (recognizer_data_t *) schannel->data;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Disabling grammar %s\n", schannel->name, grammar_name);
+ switch_core_hash_delete(r->enabled_grammars, grammar_name);
+ }
+
+ return status;
+}
+
+/**
+ * Disable all speech recognition grammars
+ *
+ * @param schannel the recognizer channel
+ * @return SWITCH_STATUS_SUCCESS if successful
+ */
+static switch_status_t recog_channel_disable_all_grammars(speech_channel_t *schannel)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ recognizer_data_t *r = (recognizer_data_t *) schannel->data;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Disabling all grammars\n", schannel->name);
+ switch_core_hash_destroy(&r->enabled_grammars);
+ switch_core_hash_init(&r->enabled_grammars, schannel->memory_pool);
+
+ return status;
+}
+
/**
* Check if recognition is complete
*
@@ -2451,6 +2578,8 @@ static switch_status_t recog_channel_set_params(speech_channel_t *schannel, mrcp
if (id) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) \"%s\": \"%s\"\n", schannel->name, param_name, param_val);
recog_channel_set_header(schannel, id->id, param_val, msg, recog_hdr);
+ } else if (!strcasecmp(param_name, "start-recognize")) {
+ // This parameter is used internally only, not in MRCP headers
} else {
/* this is probably a vendor-specific MRCP param */
apt_str_t apt_param_name = { 0 };
@@ -2737,6 +2866,7 @@ static switch_status_t recog_asr_open(switch_asr_handle_t *ah, const char *codec
schannel->data = r;
memset(r, 0, sizeof(recognizer_data_t));
switch_core_hash_init(&r->grammars, ah->memory_pool);
+ switch_core_hash_init(&r->enabled_grammars, ah->memory_pool);
/* Open the channel */
if (zstr(profile_name)) {
@@ -2782,6 +2912,7 @@ static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const cha
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
const char *grammar_data = NULL;
char *grammar_file_data = NULL;
+ char *start_recognize;
switch_file_t *grammar_file = NULL;
switch_size_t grammar_file_size = 0, to_read = 0;
grammar_type_t type = GRAMMAR_TYPE_UNKNOWN;
@@ -2886,7 +3017,19 @@ static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const cha
goto done;
}
- status = recog_channel_start(schannel, name);
+ start_recognize = (char *) switch_core_hash_find(schannel->params, "start-recognize");
+ if (zstr(start_recognize) || strcasecmp(start_recognize, "false"))
+ {
+ if (recog_channel_disable_all_grammars(schannel) != SWITCH_STATUS_SUCCESS) {
+ status = SWITCH_STATUS_FALSE;
+ goto done;
+ }
+ if (recog_channel_enable_grammar(schannel, name) != SWITCH_STATUS_SUCCESS) {
+ status = SWITCH_STATUS_FALSE;
+ goto done;
+ }
+ status = recog_channel_start(schannel);
+ }
done:
@@ -2914,6 +3057,57 @@ static switch_status_t recog_asr_unload_grammar(switch_asr_handle_t *ah, const c
return status;
}
+/**
+ * Process asr_enable_grammar request from FreeSWITCH.
+ *
+ * FreeSWITCH sends this request to enable recognition on this grammar.
+ * @param ah the FreeSWITCH speech recognition handle
+ * @param name the grammar name.
+ */
+static switch_status_t recog_asr_enable_grammar(switch_asr_handle_t *ah, const char *name)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
+ if (zstr(name) || speech_channel_stop(schannel) != SWITCH_STATUS_SUCCESS || recog_channel_enable_grammar(schannel, name) != SWITCH_STATUS_SUCCESS) {
+ status = SWITCH_STATUS_FALSE;
+ }
+ return status;
+}
+
+/**
+ * Process asr_disable_grammar request from FreeSWITCH.
+ *
+ * FreeSWITCH sends this request to disable recognition on this grammar.
+ * @param ah the FreeSWITCH speech recognition handle
+ * @param name the grammar name.
+ */
+static switch_status_t recog_asr_disable_grammar(switch_asr_handle_t *ah, const char *name)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
+ if (zstr(name) || speech_channel_stop(schannel) != SWITCH_STATUS_SUCCESS || recog_channel_disable_grammar(schannel, name) != SWITCH_STATUS_SUCCESS) {
+ status = SWITCH_STATUS_FALSE;
+ }
+ return status;
+}
+
+/**
+ * Process asr_disable_all_grammars request from FreeSWITCH.
+ *
+ * FreeSWITCH sends this request to disable recognition of all grammars.
+ * @param ah the FreeSWITCH speech recognition handle
+ * @param name the grammar name.
+ */
+static switch_status_t recog_asr_disable_all_grammars(switch_asr_handle_t *ah)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
+ if (speech_channel_stop(schannel) != SWITCH_STATUS_SUCCESS || recog_channel_disable_all_grammars(schannel) != SWITCH_STATUS_SUCCESS) {
+ status = SWITCH_STATUS_FALSE;
+ }
+ return status;
+}
+
/**
* Process asr_close request from FreeSWITCH
*
@@ -2928,6 +3122,10 @@ static switch_status_t recog_asr_close(switch_asr_handle_t *ah, switch_asr_flag_
speech_channel_stop(schannel);
speech_channel_destroy(schannel);
switch_core_hash_destroy(&r->grammars);
+ switch_core_hash_destroy(&r->enabled_grammars);
+ if (r->dtmf_generator) {
+ mpf_dtmf_generator_destroy(r->dtmf_generator);
+ }
/* this lets FreeSWITCH's speech_thread know the handle is closed */
switch_set_flag(ah, SWITCH_ASR_FLAG_CLOSED);
@@ -2948,18 +3146,50 @@ static switch_status_t recog_asr_feed(switch_asr_handle_t *ah, void *data, unsig
return speech_channel_write(schannel, data, &slen);
}
+/**
+ * Process asr_feed_dtmf request from FreeSWITCH
+ *
+ * @param ah the FreeSWITCH speech recognition handle
+ * @return SWITCH_STATUS_SUCCESS if successful
+ */
+static switch_status_t recog_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags)
+{
+ speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
+ recognizer_data_t *r = (recognizer_data_t *) schannel->data;
+ char digits[2];
+
+ if (!r->dtmf_generator) {
+ if (!r->unimrcp_stream) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Cannot queue DTMF: No UniMRCP stream object open\n", schannel->name);
+ return SWITCH_STATUS_FALSE;
+ }
+ r->dtmf_generator = mpf_dtmf_generator_create(r->unimrcp_stream, schannel->unimrcp_session->pool);
+ if (!r->dtmf_generator) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Cannot queue DTMF: Failed to create DTMF generator\n", schannel->name);
+ return SWITCH_STATUS_FALSE;
+ }
+ }
+
+ digits[0] = dtmf->digit;
+ digits[1] = '\0';
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Queued DTMF: %s\n", schannel->name, digits);
+ mpf_dtmf_generator_enqueue(r->dtmf_generator, digits);
+ r->dtmf_generator_active = 1;
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
#if 0
/**
* Process asr_start request from FreeSWITCH
* @param ah the FreeSWITCH speech recognition handle
- * @param name name of the grammar to use
* @return SWITCH_STATUS_SUCCESS if successful
*/
-static switch_status_t recog_asr_start(switch_asr_handle_t *ah, const char *name)
+static switch_status_t recog_asr_start(switch_asr_handle_t *ah)
{
switch_status_t status;
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
- status = recog_channel_start(schannel, name);
+ status = recog_channel_start(schannel);
return status;
}
#endif
@@ -2972,7 +3202,7 @@ static switch_status_t recog_asr_start(switch_asr_handle_t *ah, const char *name
static switch_status_t recog_asr_resume(switch_asr_handle_t *ah)
{
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
- return recog_channel_start(schannel, NULL);
+ return recog_channel_start(schannel);
}
/**
@@ -3194,6 +3424,23 @@ static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp
return TRUE;
}
+/**
+ * UniMRCP callback requesting open for speech recognition
+ *
+ * @param stream the UniMRCP stream
+ * @param codec the codec
+ * @return TRUE
+ */
+static apt_bool_t recog_stream_open(mpf_audio_stream_t *stream, mpf_codec_t *codec)
+{
+ speech_channel_t *schannel = (speech_channel_t *) stream->obj;
+ recognizer_data_t *r = (recognizer_data_t *) schannel->data;
+
+ r->unimrcp_stream = stream;
+
+ return TRUE;
+}
+
/**
* UniMRCP callback requesting next frame for speech recognition
*
@@ -3204,6 +3451,7 @@ static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp
static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *frame)
{
speech_channel_t *schannel = (speech_channel_t *) stream->obj;
+ recognizer_data_t *r = (recognizer_data_t *) schannel->data;
switch_size_t to_read = frame->codec_frame.size;
/* grab the data. pad it if there isn't enough */
@@ -3213,6 +3461,13 @@ static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *fra
}
frame->type |= MEDIA_FRAME_TYPE_AUDIO;
}
+
+ if (r->dtmf_generator_active) {
+ if (!mpf_dtmf_generator_put_frame(r->dtmf_generator, frame)) {
+ if (!mpf_dtmf_generator_sending(r->dtmf_generator))
+ r->dtmf_generator_active = 0;
+ }
+ }
return TRUE;
}
@@ -3231,8 +3486,12 @@ static switch_status_t recog_load(switch_loadable_module_interface_t *module_int
asr_interface->asr_open = recog_asr_open;
asr_interface->asr_load_grammar = recog_asr_load_grammar;
asr_interface->asr_unload_grammar = recog_asr_unload_grammar;
+ asr_interface->asr_enable_grammar = recog_asr_enable_grammar;
+ asr_interface->asr_disable_grammar = recog_asr_disable_grammar;
+ asr_interface->asr_disable_all_grammars = recog_asr_disable_all_grammars;
asr_interface->asr_close = recog_asr_close;
asr_interface->asr_feed = recog_asr_feed;
+ asr_interface->asr_feed_dtmf = recog_asr_feed_dtmf;
#if 0
asr_interface->asr_start = recog_asr_start;
#endif
@@ -3255,7 +3514,7 @@ static switch_status_t recog_load(switch_loadable_module_interface_t *module_int
globals.recog.dispatcher.on_channel_remove = speech_on_channel_remove;
globals.recog.dispatcher.on_message_receive = recog_on_message_receive;
globals.recog.audio_stream_vtable.destroy = NULL;
- globals.recog.audio_stream_vtable.open_rx = NULL;
+ globals.recog.audio_stream_vtable.open_rx = recog_stream_open;
globals.recog.audio_stream_vtable.close_rx = NULL;
globals.recog.audio_stream_vtable.read_frame = recog_stream_read;
globals.recog.audio_stream_vtable.open_tx = NULL;
diff --git a/src/mod/endpoints/mod_gsmopen/.gitignore b/src/mod/endpoints/mod_gsmopen/.gitignore
index 9fdeeb1412..fe8dc68bd5 100644
--- a/src/mod/endpoints/mod_gsmopen/.gitignore
+++ b/src/mod/endpoints/mod_gsmopen/.gitignore
@@ -1,2 +1,4 @@
!/gsmlib/gsmlib-*/aclocal.m4
!/gsmlib/gsmlib-*/configure
+!/gsmlib/gsmlib-1.10.tar.gz
+!/gsmlib/gsmlib_1.10-12ubuntu1.diff.gz
diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c
index aa57668718..727de27138 100644
--- a/src/mod/endpoints/mod_loopback/mod_loopback.c
+++ b/src/mod/endpoints/mod_loopback/mod_loopback.c
@@ -77,11 +77,11 @@ struct private_object {
switch_frame_t cng_frame;
unsigned char cng_databuf[SWITCH_RECOMMENDED_BUFFER_SIZE];
+ switch_timer_t timer;
switch_caller_profile_t *caller_profile;
int32_t bowout_frame_count;
char *other_uuid;
switch_queue_t *frame_queue;
- switch_codec_implementation_t read_impl;
};
typedef struct private_object private_t;
@@ -111,6 +111,7 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
int interval = 20;
switch_status_t status = SWITCH_STATUS_SUCCESS;
switch_channel_t *channel = switch_core_session_get_channel(session);
+ const switch_codec_implementation_t *read_impl;
if (codec) {
iananame = codec->implementation->iananame;
@@ -165,7 +166,15 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
switch_core_session_set_read_codec(session, &tech_pvt->read_codec);
switch_core_session_set_write_codec(session, &tech_pvt->write_codec);
- tech_pvt->read_impl = *tech_pvt->read_codec.implementation;
+ if (tech_pvt->flag_mutex) {
+ switch_core_timer_destroy(&tech_pvt->timer);
+ }
+
+ read_impl = tech_pvt->read_codec.implementation;
+
+ switch_core_timer_init(&tech_pvt->timer, "soft",
+ read_impl->microseconds_per_packet / 1000, read_impl->samples_per_packet * 4, switch_core_session_get_pool(session));
+
if (!tech_pvt->flag_mutex) {
switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
@@ -367,6 +376,7 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)
tech_pvt = switch_core_session_get_private(session);
if (tech_pvt) {
+ switch_core_timer_destroy(&tech_pvt->timer);
if (switch_core_codec_ready(&tech_pvt->read_codec)) {
switch_core_codec_destroy(&tech_pvt->read_codec);
@@ -558,10 +568,12 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
goto end;
}
+ switch_core_timer_next(&tech_pvt->timer);
+
mutex = tech_pvt->mutex;
+ switch_mutex_lock(mutex);
-
- if (switch_queue_pop_timeout(tech_pvt->frame_queue, &pop, tech_pvt->read_impl.microseconds_per_packet) == SWITCH_STATUS_SUCCESS && pop) {
+ if (switch_queue_trypop(tech_pvt->frame_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
if (tech_pvt->write_frame) {
switch_frame_free(&tech_pvt->write_frame);
}
@@ -573,8 +585,6 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
switch_set_flag(tech_pvt, TFLAG_CNG);
}
- switch_mutex_lock(mutex);
-
if (switch_test_flag(tech_pvt, TFLAG_CNG)) {
unsigned char data[SWITCH_RECOMMENDED_BUFFER_SIZE];
uint32_t flag = 0;
@@ -598,9 +608,9 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
if (encode_status != SWITCH_STATUS_SUCCESS) {
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
}
-
+ } else {
+ switch_set_flag((&tech_pvt->cng_frame), SFF_CNG);
}
- //switch_set_flag((&tech_pvt->cng_frame), SFF_CNG);
switch_clear_flag_locked(tech_pvt, TFLAG_CNG);
}
@@ -632,7 +642,10 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
tech_pvt = switch_core_session_get_private(session);
switch_assert(tech_pvt != NULL);
- if (switch_test_flag(frame, SFF_CNG) || switch_test_flag(tech_pvt, TFLAG_CNG) || (switch_test_flag(tech_pvt, TFLAG_BOWOUT) && switch_test_flag(tech_pvt, TFLAG_BOWOUT_USED))) {
+ if (switch_test_flag(frame, SFF_CNG) ||
+ switch_test_flag(tech_pvt, TFLAG_CNG) || (switch_test_flag(tech_pvt, TFLAG_BOWOUT) && switch_test_flag(tech_pvt, TFLAG_BOWOUT_USED))) {
+ switch_core_timer_sync(&tech_pvt->timer);
+ switch_core_timer_sync(&tech_pvt->other_tech_pvt->timer);
return SWITCH_STATUS_SUCCESS;
}
@@ -765,6 +778,8 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
switch_frame_free(&frame);
}
+ switch_core_timer_sync(&tech_pvt->timer);
+
}
break;
default:
diff --git a/src/mod/endpoints/mod_skinny/skinny_protocol.h b/src/mod/endpoints/mod_skinny/skinny_protocol.h
index 20e7d7f92f..1a26558ffc 100644
--- a/src/mod/endpoints/mod_skinny/skinny_protocol.h
+++ b/src/mod/endpoints/mod_skinny/skinny_protocol.h
@@ -68,6 +68,13 @@ struct PACKED keypad_button_message {
uint32_t call_id;
};
+/* EnblocCallMessage */
+#define ENBLOC_CALL_MESSAGE 0x0004
+struct PACKED enbloc_call_message {
+ char called_party[24];
+ uint32_t line_instance;
+};
+
/* StimulusMessage */
#define STIMULUS_MESSAGE 0x0005
struct PACKED stimulus_message {
@@ -562,6 +569,7 @@ union skinny_data {
struct register_message reg;
struct port_message port;
struct keypad_button_message keypad_button;
+ struct enbloc_call_message enbloc_call;
struct stimulus_message stimulus;
struct off_hook_message off_hook;
struct on_hook_message on_hook;
diff --git a/src/mod/endpoints/mod_skinny/skinny_server.c b/src/mod/endpoints/mod_skinny/skinny_server.c
index 5874be4c6c..e7c761dfca 100644
--- a/src/mod/endpoints/mod_skinny/skinny_server.c
+++ b/src/mod/endpoints/mod_skinny/skinny_server.c
@@ -1171,6 +1171,29 @@ switch_status_t skinny_handle_keypad_button_message(listener_t *listener, skinny
return SWITCH_STATUS_SUCCESS;
}
+switch_status_t skinny_handle_enbloc_call_message(listener_t *listener, skinny_message_t *request)
+{
+ uint32_t line_instance = 1;
+ switch_core_session_t *session = NULL;
+
+ skinny_check_data_length(request, sizeof(request->data.enbloc_call.called_party));
+
+ if(skinny_check_data_length_soft(request, sizeof(request->data.enbloc_call))) {
+ if (request->data.enbloc_call.line_instance > 0) {
+ line_instance = request->data.enbloc_call.line_instance;
+ }
+ }
+
+ session = skinny_profile_find_session(listener->profile, listener, &line_instance, 0);
+
+ if(session) {
+ skinny_session_process_dest(session, listener, line_instance, request->data.enbloc_call.called_party, '\0', 0);
+ switch_core_session_rwunlock(session);
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
switch_status_t skinny_handle_stimulus_message(listener_t *listener, skinny_message_t *request)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
@@ -2004,6 +2027,8 @@ switch_status_t skinny_handle_request(listener_t *listener, skinny_message_t *re
return skinny_handle_port_message(listener, request);
case KEYPAD_BUTTON_MESSAGE:
return skinny_handle_keypad_button_message(listener, request);
+ case ENBLOC_CALL_MESSAGE:
+ return skinny_handle_enbloc_call_message(listener, request);
case STIMULUS_MESSAGE:
return skinny_handle_stimulus_message(listener, request);
case OFF_HOOK_MESSAGE:
diff --git a/src/mod/endpoints/mod_skinny/skinny_tables.c b/src/mod/endpoints/mod_skinny/skinny_tables.c
index 053b350b46..466a70538d 100644
--- a/src/mod/endpoints/mod_skinny/skinny_tables.c
+++ b/src/mod/endpoints/mod_skinny/skinny_tables.c
@@ -39,6 +39,7 @@ struct skinny_table SKINNY_MESSAGE_TYPES[] = {
{"RegisterMessage", REGISTER_MESSAGE},
{"PortMessage", PORT_MESSAGE},
{"KeypadButtonMessage", KEYPAD_BUTTON_MESSAGE},
+ {"EnblocCallMessage", ENBLOC_CALL_MESSAGE},
{"StimulusMessage", STIMULUS_MESSAGE},
{"OffHookMessage", OFF_HOOK_MESSAGE},
{"OnHookMessage", ON_HOOK_MESSAGE},
diff --git a/src/mod/endpoints/mod_skinny/skinny_tables.h b/src/mod/endpoints/mod_skinny/skinny_tables.h
index c119e1f141..bc92f9f4bf 100644
--- a/src/mod/endpoints/mod_skinny/skinny_tables.h
+++ b/src/mod/endpoints/mod_skinny/skinny_tables.h
@@ -87,7 +87,7 @@ uint32_t func(const char *str)\
}
-extern struct skinny_table SKINNY_MESSAGE_TYPES[66];
+extern struct skinny_table SKINNY_MESSAGE_TYPES[67];
const char *skinny_message_type2str(uint32_t id);
uint32_t skinny_str2message_type(const char *str);
#define SKINNY_PUSH_MESSAGE_TYPES SKINNY_DECLARE_PUSH_MATCH(SKINNY_MESSAGE_TYPES)
diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c
index 6c91ce1274..8bceb3bba5 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.c
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.c
@@ -707,11 +707,20 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session)
cid = generate_pai_str(tech_pvt);
- if (switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MODE) && tech_pvt->early_sdp && strcmp(tech_pvt->early_sdp, tech_pvt->local_sdp_str)) {
- /* The SIP RFC for SOA forbids sending a 183 with one sdp then a 200 with another but it won't do us much good unless
- we do so in this case we will abandon the SOA rules and go rogue.
- */
- sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA);
+ if (switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MODE) && tech_pvt->early_sdp) {
+ char *a, *b;
+
+ /* start at the s= line to avoid some devices who update the o= between messages */
+ a = strstr(tech_pvt->early_sdp, "s=");
+ b = strstr(tech_pvt->local_sdp_str, "s=");
+
+ if (!a || !b || strcmp(a, b)) {
+
+ /* The SIP RFC for SOA forbids sending a 183 with one sdp then a 200 with another but it won't do us much good unless
+ we do so in this case we will abandon the SOA rules and go rogue.
+ */
+ sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA);
+ }
}
if (sofia_use_soa(tech_pvt)) {
diff --git a/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB b/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB
index 9584c8bac3..84485269f9 100644
--- a/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB
+++ b/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB
@@ -3,11 +3,14 @@ FREESWITCH-MIB DEFINITIONS ::= BEGIN
IMPORTS
OBJECT-TYPE, MODULE-IDENTITY,
Integer32, Gauge32, Counter32, Counter64, TimeTicks,
- enterprises,
+ enterprises
FROM SNMPv2-SMI
- DisplayString
+ DisplayString, DateAndTime
FROM SNMPv2-TC
+
+ InetAddressType, InetAddress
+ FROM INET-ADDRESS-MIB
;
@@ -107,4 +110,214 @@ maxSessionsPerSecond OBJECT-TYPE
"Maximum permissible sessions per second"
::= { systemStats 7 }
+
+ChannelEntry ::= SEQUENCE {
+ chanIndex Integer32,
+ chanUUID DisplayString,
+ chanDirection DisplayString,
+ chanCreated DateAndTime,
+ chanName DisplayString,
+ chanState DisplayString,
+ chanCIDName DisplayString,
+ chanCIDNum DisplayString,
+ chanInetAddressType InetAddressType,
+ chanInetAddress InetAddress,
+ chanDest DisplayString,
+ chanApplication DisplayString,
+ chanAppData DisplayString,
+ chanDialplan DisplayString,
+ chanContext DisplayString,
+ chanReadCodec DisplayString,
+ chanReadRate Gauge32,
+ chanReadBitRate Gauge32,
+ chanWriteCodec DisplayString,
+ chanWriteRate Gauge32,
+ chanWriteBitRate Gauge32
+}
+
+channelList OBJECT-TYPE
+ SYNTAX SEQUENCE OF ChannelEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A table containing a list of active channels"
+ ::= { core 9 }
+
+channelEntry OBJECT-TYPE
+ SYNTAX ChannelEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A channel entry"
+ INDEX { chanIndex }
+ ::= { channelList 1 }
+
+chanIndex OBJECT-TYPE
+ SYNTAX Integer32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel SNMP index."
+ ::= { channelEntry 1 }
+
+chanUUID OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel UUID."
+ ::= { channelEntry 2 }
+
+chanDirection OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel direction."
+ ::= { channelEntry 3 }
+
+chanCreated OBJECT-TYPE
+ SYNTAX DateAndTime
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel creation timestamp."
+ ::= { channelEntry 4 }
+
+chanName OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel name."
+ ::= { channelEntry 5 }
+
+chanState OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel state."
+ ::= { channelEntry 6 }
+
+chanCIDName OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel caller ID name."
+ ::= { channelEntry 7 }
+
+chanCIDNum OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel caller ID number."
+ ::= { channelEntry 8 }
+
+chanInetAddressType OBJECT-TYPE
+ SYNTAX InetAddressType
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel originator's IP address type (IPv4 or IPv6)."
+ ::= { channelEntry 9 }
+
+chanInetAddress OBJECT-TYPE
+ SYNTAX InetAddress
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel originator's IP address."
+ ::= { channelEntry 10 }
+
+chanDest OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel destination."
+ ::= { channelEntry 11 }
+
+chanApplication OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel application."
+ ::= { channelEntry 12 }
+
+chanAppData OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel application data."
+ ::= { channelEntry 13 }
+
+chanDialplan OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel dialplan."
+ ::= { channelEntry 14 }
+
+chanContext OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel dialplan context."
+ ::= { channelEntry 15 }
+
+chanReadCodec OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel read codec."
+ ::= { channelEntry 16 }
+
+chanReadRate OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel read samples per second."
+ ::= { channelEntry 17 }
+
+chanReadBitRate OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel read bits per second."
+ ::= { channelEntry 18 }
+
+chanWriteCodec OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel write codec."
+ ::= { channelEntry 19 }
+
+chanWriteRate OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel write samples per second."
+ ::= { channelEntry 20 }
+
+chanWriteBitRate OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Channel write bits per second."
+ ::= { channelEntry 21 }
+
END
diff --git a/src/mod/event_handlers/mod_snmp/mod_snmp.c b/src/mod/event_handlers/mod_snmp/mod_snmp.c
index 0310637e52..d415d4fe1c 100644
--- a/src/mod/event_handlers/mod_snmp/mod_snmp.c
+++ b/src/mod/event_handlers/mod_snmp/mod_snmp.c
@@ -48,6 +48,20 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_snmp_runtime);
SWITCH_MODULE_DEFINITION(mod_snmp, mod_snmp_load, mod_snmp_shutdown, mod_snmp_runtime);
+static switch_status_t snmp_manage(char *relative_oid, switch_management_action_t action, char *data, switch_size_t datalen)
+{
+ if (action == SMA_GET) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Mutex lock request from relative OID %s.\n", relative_oid);
+ switch_mutex_lock(globals.mutex);
+ } else if (action == SMA_SET) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Mutex unlock request from relative OID %s.\n", relative_oid);
+ switch_mutex_unlock(globals.mutex);
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+
static int snmp_callback_log(int major, int minor, void *serverarg, void *clientarg)
{
struct snmp_log_message *slm = (struct snmp_log_message *) serverarg;
@@ -71,10 +85,14 @@ static switch_status_t load_config(switch_memory_pool_t *pool)
SWITCH_MODULE_LOAD_FUNCTION(mod_snmp_load)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_management_interface_t *management_interface;
load_config(pool);
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
+ management_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_MANAGEMENT_INTERFACE);
+ management_interface->relative_oid = "1000";
+ management_interface->management_function = snmp_manage;
/* Register callback function so we get Net-SNMP logging handled by FreeSWITCH */
snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_LOGGING, snmp_callback_log, NULL);
@@ -86,12 +104,12 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_snmp_load)
init_agent("mod_snmp");
/*
- * Override master/subagent ping interval to 5s, to ensure that
+ * Override master/subagent ping interval to 2s, to ensure that
* agent_check_and_process() never blocks for longer than that.
*/
- netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_PING_INTERVAL, 5);
+ netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_PING_INTERVAL, 2);
- init_subagent();
+ init_subagent(pool);
init_snmp("mod_snmp");
return status;
@@ -107,6 +125,8 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_snmp_runtime)
switch_mutex_unlock(globals.mutex);
}
+ switch_yield(5000);
+
return SWITCH_STATUS_SUCCESS;
}
diff --git a/src/mod/event_handlers/mod_snmp/subagent.c b/src/mod/event_handlers/mod_snmp/subagent.c
index 2da9ebeda6..43975ee4e0 100644
--- a/src/mod/event_handlers/mod_snmp/subagent.c
+++ b/src/mod/event_handlers/mod_snmp/subagent.c
@@ -36,16 +36,136 @@
#include
#include "subagent.h"
+netsnmp_table_registration_info *ch_table_info;
+netsnmp_tdata *ch_table;
+netsnmp_handler_registration *ch_reginfo;
+uint32_t idx;
-void init_subagent(void)
+
+static void time_t_to_datetime(time_t epoch, char *buf, switch_size_t buflen)
+{
+ struct tm *dt;
+ uint16_t year;
+
+ dt = gmtime(&epoch);
+ year = dt->tm_year + 1900;
+ switch_snprintf(buf, buflen, "%c%c%c%c%c%c%c%c+%c%c", year >> 8, year & 0xff, dt->tm_mon + 1, dt->tm_mday, dt->tm_hour, dt->tm_min, dt->tm_sec, 0, 0, 0);
+}
+
+
+static int sql_count_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ uint32_t *count = (uint32_t *) pArg;
+ *count = atoi(argv[0]);
+ return 0;
+}
+
+
+static int channelList_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ chan_entry_t *entry;
+ netsnmp_tdata_row *row;
+
+ switch_zmalloc(entry, sizeof(chan_entry_t));
+ if (!entry)
+ return 0;
+
+ row = netsnmp_tdata_create_row();
+ if (!row) {
+ switch_safe_free(entry);
+ return 0;
+ }
+ row->data = entry;
+
+ entry->idx = idx++;
+ strncpy(entry->uuid, argv[0], sizeof(entry->uuid));
+ strncpy(entry->direction, argv[1], sizeof(entry->direction));
+ entry->created_epoch = atoi(argv[3]);
+ strncpy(entry->name, argv[4], sizeof(entry->name));
+ strncpy(entry->state, argv[5], sizeof(entry->state));
+ strncpy(entry->cid_name, argv[6], sizeof(entry->cid_name));
+ strncpy(entry->cid_num, argv[7], sizeof(entry->cid_num));
+ strncpy(entry->dest, argv[9], sizeof(entry->dest));
+ strncpy(entry->application, argv[10], sizeof(entry->application));
+ strncpy(entry->application_data, argv[11], sizeof(entry->application_data));
+ strncpy(entry->dialplan, argv[12], sizeof(entry->dialplan));
+ strncpy(entry->context, argv[13], sizeof(entry->context));
+ strncpy(entry->read_codec, argv[14], sizeof(entry->read_codec));
+ entry->read_rate = atoi(argv[15]);
+ entry->read_bitrate = atoi(argv[16]);
+ strncpy(entry->write_codec, argv[17], sizeof(entry->write_codec));
+ entry->write_rate = atoi(argv[18]);
+ entry->write_bitrate = atoi(argv[19]);
+
+ memset(&entry->ip_addr, 0, sizeof(entry->ip_addr));
+ if (strchr(argv[8], ':')) {
+ switch_inet_pton(AF_INET6, argv[8], &entry->ip_addr);
+ entry->addr_family = AF_INET6;
+ } else {
+ switch_inet_pton(AF_INET, argv[8], &entry->ip_addr);
+ entry->addr_family = AF_INET;
+ }
+
+ netsnmp_tdata_row_add_index(row, ASN_INTEGER, &entry->idx, sizeof(entry->idx));
+ netsnmp_tdata_add_row(ch_table, row);
+ return 0;
+}
+
+
+void channelList_free(netsnmp_cache *cache, void *magic)
+{
+ netsnmp_tdata_row *row = netsnmp_tdata_row_first(ch_table);
+
+ /* Delete table rows one by one */
+ while (row) {
+ netsnmp_tdata_remove_and_delete_row(ch_table, row);
+ switch_safe_free(row->data);
+ row = netsnmp_tdata_row_first(ch_table);
+ }
+}
+
+
+int channelList_load(netsnmp_cache *cache, void *vmagic)
+{
+ switch_cache_db_handle_t *dbh;
+ char sql[1024] = "", hostname[256] = "";
+
+ channelList_free(cache, NULL);
+
+ if (switch_core_db_handle(&dbh) != SWITCH_STATUS_SUCCESS) {
+ return 0;
+ }
+
+ idx = 1;
+ gethostname(hostname, sizeof(hostname));
+ sprintf(sql, "SELECT * FROM channels WHERE hostname='%s' ORDER BY created_epoch", hostname);
+ switch_cache_db_execute_sql_callback(dbh, sql, channelList_callback, NULL, NULL);
+
+ switch_cache_db_release_db_handle(&dbh);
+
+ return 0;
+}
+
+
+void init_subagent(switch_memory_pool_t *pool)
{
static oid identity_oid[] = { 1,3,6,1,4,1,27880,1,1 };
static oid systemStats_oid[] = { 1,3,6,1,4,1,27880,1,2 };
+ static oid channelList_oid[] = { 1,3,6,1,4,1,27880,1,9 };
- DEBUGMSGTL(("init_subagent", "Initializing\n"));
+ DEBUGMSGTL(("init_subagent", "mod_snmp subagent initializing\n"));
netsnmp_register_scalar_group(netsnmp_create_handler_registration("identity", handle_identity, identity_oid, OID_LENGTH(identity_oid), HANDLER_CAN_RONLY), 1, 2);
netsnmp_register_scalar_group(netsnmp_create_handler_registration("systemStats", handle_systemStats, systemStats_oid, OID_LENGTH(systemStats_oid), HANDLER_CAN_RONLY), 1, 7);
+
+ ch_table_info = switch_core_alloc(pool, sizeof(netsnmp_table_registration_info));
+ netsnmp_table_helper_add_indexes(ch_table_info, ASN_INTEGER, 0);
+ ch_table_info->min_column = CH_INDEX;
+ ch_table_info->max_column = CH_WRITE_BITRATE;
+ ch_table = netsnmp_tdata_create_table("channelList", 0);
+ ch_reginfo = netsnmp_create_handler_registration("channelList", handle_channelList, channelList_oid, OID_LENGTH(channelList_oid), HANDLER_CAN_RONLY);
+ netsnmp_tdata_register(ch_reginfo, ch_table, ch_table_info);
+ netsnmp_inject_handler(ch_reginfo, netsnmp_get_cache_handler(5, channelList_load, channelList_free, channelList_oid, OID_LENGTH(channelList_oid)));
}
@@ -89,7 +209,7 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio
netsnmp_request_info *request = NULL;
oid subid;
switch_time_t uptime;
- uint32_t int_val;
+ uint32_t int_val = 0;
switch(reqinfo->mode) {
case MODE_GET:
@@ -102,32 +222,39 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio
break;
case SS_SESSIONS_SINCE_STARTUP:
int_val = switch_core_session_id() - 1;
- snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER, (u_char *) &int_val, sizeof(int_val));
+ snmp_set_var_typed_integer(requests->requestvb, ASN_COUNTER, int_val);
break;
case SS_CURRENT_SESSIONS:
int_val = switch_core_session_count();
- snmp_set_var_typed_value(requests->requestvb, ASN_GAUGE, (u_char *) &int_val, sizeof(int_val));
+ snmp_set_var_typed_integer(requests->requestvb, ASN_GAUGE, int_val);
break;
case SS_MAX_SESSIONS:
- switch_core_session_ctl(SCSC_MAX_SESSIONS, &int_val);;
- snmp_set_var_typed_value(requests->requestvb, ASN_GAUGE, (u_char *) &int_val, sizeof(int_val));
+ switch_core_session_ctl(SCSC_MAX_SESSIONS, &int_val);
+ snmp_set_var_typed_integer(requests->requestvb, ASN_GAUGE, int_val);
break;
case SS_CURRENT_CALLS:
- /*
- * This is zero for now, since there is no convenient way to get total call
- * count (not to be confused with session count), without touching the
- * database.
- */
- int_val = 0;
- snmp_set_var_typed_value(requests->requestvb, ASN_GAUGE, (u_char *) &int_val, sizeof(int_val));
+ {
+ switch_cache_db_handle_t *dbh;
+ char sql[1024] = "", hostname[256] = "";
+
+ if (switch_core_db_handle(&dbh) != SWITCH_STATUS_SUCCESS) {
+ return SNMP_ERR_GENERR;
+ }
+
+ gethostname(hostname, sizeof(hostname));
+ sprintf(sql, "SELECT COUNT(*) FROM calls WHERE hostname='%s'", hostname);
+ switch_cache_db_execute_sql_callback(dbh, sql, sql_count_callback, &int_val, NULL);
+ snmp_set_var_typed_integer(requests->requestvb, ASN_GAUGE, int_val);
+ switch_cache_db_release_db_handle(&dbh);
+ }
break;
case SS_SESSIONS_PER_SECOND:
switch_core_session_ctl(SCSC_LAST_SPS, &int_val);
- snmp_set_var_typed_value(requests->requestvb, ASN_GAUGE, (u_char *) &int_val, sizeof(int_val));
+ snmp_set_var_typed_integer(requests->requestvb, ASN_GAUGE, int_val);
break;
case SS_MAX_SESSIONS_PER_SECOND:
switch_core_session_ctl(SCSC_SPS, &int_val);
- snmp_set_var_typed_value(requests->requestvb, ASN_GAUGE, (u_char *) &int_val, sizeof(int_val));
+ snmp_set_var_typed_integer(requests->requestvb, ASN_GAUGE, int_val);
break;
default:
snmp_log(LOG_WARNING, "Unregistered OID-suffix requested (%d)\n", (int) subid);
@@ -145,6 +272,107 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio
}
+int handle_channelList(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)
+{
+ netsnmp_request_info *request;
+ netsnmp_table_request_info *table_info;
+ chan_entry_t *entry;
+ char dt_str[12];
+
+ switch (reqinfo->mode) {
+ case MODE_GET:
+ for (request = requests; request; request = request->next) {
+ table_info = netsnmp_extract_table_info(request);
+ entry = (chan_entry_t *) netsnmp_tdata_extract_entry(request);
+
+ switch (table_info->colnum) {
+ case CH_INDEX:
+ snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, entry->idx);
+ break;
+ case CH_UUID:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->uuid, strlen(entry->uuid));
+ break;
+ case CH_DIRECTION:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->direction, strlen(entry->direction));
+ break;
+ case CH_CREATED:
+ time_t_to_datetime(entry->created_epoch, (char *) &dt_str, sizeof(dt_str));
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) &dt_str, sizeof(dt_str));
+ break;
+ case CH_NAME:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->name, strlen(entry->name));
+ break;
+ case CH_STATE:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->state, strlen(entry->state));
+ break;
+ case CH_CID_NAME:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->cid_name, strlen(entry->cid_name));
+ break;
+ case CH_CID_NUM:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->cid_num, strlen(entry->cid_num));
+ break;
+ case CH_IP_ADDR_TYPE:
+ if (entry->addr_family == AF_INET6) {
+ snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, INETADDRESSTYPE_IPV6);
+ } else {
+ snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, INETADDRESSTYPE_IPV4);
+ }
+ break;
+ case CH_IP_ADDR:
+ if (entry->addr_family == AF_INET6) {
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) &entry->ip_addr.v6, sizeof(entry->ip_addr.v6));
+ } else {
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) &entry->ip_addr.v4, sizeof(entry->ip_addr.v4));
+ }
+ break;
+ case CH_DEST:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->dest, strlen(entry->dest));
+ break;
+ case CH_APPLICATION:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->application, strlen(entry->application));
+ break;
+ case CH_APPLICATION_DATA:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->application_data, strlen(entry->application_data));
+ break;
+ case CH_DIALPLAN:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->dialplan, strlen(entry->dialplan));
+ break;
+ case CH_CONTEXT:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->context, strlen(entry->context));
+ break;
+ case CH_READ_CODEC:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->read_codec, strlen(entry->read_codec));
+ break;
+ case CH_READ_RATE:
+ snmp_set_var_typed_value(request->requestvb, ASN_GAUGE, (u_char *) &entry->read_rate, sizeof(entry->read_rate));
+ break;
+ case CH_READ_BITRATE:
+ snmp_set_var_typed_value(request->requestvb, ASN_GAUGE, (u_char *) &entry->read_bitrate, sizeof(entry->read_bitrate));
+ break;
+ case CH_WRITE_CODEC:
+ snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->write_codec, strlen(entry->write_codec));
+ break;
+ case CH_WRITE_RATE:
+ snmp_set_var_typed_value(request->requestvb, ASN_GAUGE, (u_char *) &entry->write_rate, sizeof(entry->write_rate));
+ break;
+ case CH_WRITE_BITRATE:
+ snmp_set_var_typed_value(request->requestvb, ASN_GAUGE, (u_char *) &entry->write_bitrate, sizeof(entry->write_bitrate));
+ break;
+ default:
+ snmp_log(LOG_WARNING, "Unregistered OID-suffix requested (%d)\n", table_info->colnum);
+ netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
+ }
+ }
+ break;
+ default:
+ /* we should never get here, so this is a really bad error */
+ snmp_log(LOG_ERR, "Unknown mode (%d) in handle_foo\n", reqinfo->mode );
+ return SNMP_ERR_GENERR;
+ }
+
+ return SNMP_ERR_NOERROR;
+}
+
/* For Emacs:
* Local Variables:
diff --git a/src/mod/event_handlers/mod_snmp/subagent.h b/src/mod/event_handlers/mod_snmp/subagent.h
index 33153780b5..5da87a6c4e 100644
--- a/src/mod/event_handlers/mod_snmp/subagent.h
+++ b/src/mod/event_handlers/mod_snmp/subagent.h
@@ -14,9 +14,64 @@
#define SS_SESSIONS_PER_SECOND 6
#define SS_MAX_SESSIONS_PER_SECOND 7
+/* .1.3.6.1.4.1.27880.1.9 */
+#define CH_INDEX 1
+#define CH_UUID 2
+#define CH_DIRECTION 3
+#define CH_CREATED 4
+#define CH_NAME 5
+#define CH_STATE 6
+#define CH_CID_NAME 7
+#define CH_CID_NUM 8
+#define CH_IP_ADDR_TYPE 9
+#define CH_IP_ADDR 10
+#define CH_DEST 11
+#define CH_APPLICATION 12
+#define CH_APPLICATION_DATA 13
+#define CH_DIALPLAN 14
+#define CH_CONTEXT 15
+#define CH_READ_CODEC 16
+#define CH_READ_RATE 17
+#define CH_READ_BITRATE 18
+#define CH_WRITE_CODEC 19
+#define CH_WRITE_RATE 20
+#define CH_WRITE_BITRATE 21
-void init_subagent(void);
+/* Why aren't these in net-snmp-includes.h ? */
+#define INETADDRESSTYPE_UNKNOWN 0
+#define INETADDRESSTYPE_IPV4 1
+#define INETADDRESSTYPE_IPV6 2
+#define INETADDRESSTYPE_IPV4Z 3
+#define INETADDRESSTYPE_IPV6Z 4
+#define INETADDRESSTYPE_DNS 16
+
+typedef struct {
+ uint32_t idx;
+ char uuid[38];
+ char direction[32];
+ time_t created_epoch;
+ char name[1024];
+ char state[64];
+ char cid_name[1024];
+ char cid_num[256];
+ ip_t ip_addr;
+ uint8_t addr_family;
+ char dest[1024];
+ char application[128];
+ char application_data[4096];
+ char dialplan[128];
+ char context[128];
+ char read_codec[128];
+ uint32_t read_rate;
+ uint32_t read_bitrate;
+ char write_codec[128];
+ uint32_t write_rate;
+ uint32_t write_bitrate;
+} chan_entry_t;
+
+void init_subagent(switch_memory_pool_t *pool);
Netsnmp_Node_Handler handle_identity;
Netsnmp_Node_Handler handle_systemStats;
+Netsnmp_Node_Handler handle_channelList;
#endif /* subagent_H */
diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx
index 9ebd6ff9df..808d548bdf 100644
--- a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx
+++ b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx
@@ -8947,6 +8947,22 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_feed(void * jarg1, void * jarg
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_feed_dtmf(void * jarg1, void * jarg2, void * jarg3) {
+ int jresult ;
+ switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
+ switch_dtmf_t *arg2 = (switch_dtmf_t *) 0 ;
+ switch_asr_flag_t *arg3 = (switch_asr_flag_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_asr_handle_t *)jarg1;
+ arg2 = (switch_dtmf_t *)jarg2;
+ arg3 = (switch_asr_flag_t *)jarg3;
+ result = (switch_status_t)switch_core_asr_feed_dtmf(arg1,(switch_dtmf_t const *)arg2,arg3);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_check_results(void * jarg1, void * jarg2) {
int jresult ;
switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
@@ -9007,6 +9023,46 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_unload_grammar(void * jarg1, c
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_enable_grammar(void * jarg1, char * jarg2) {
+ int jresult ;
+ switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_asr_handle_t *)jarg1;
+ arg2 = (char *)jarg2;
+ result = (switch_status_t)switch_core_asr_enable_grammar(arg1,(char const *)arg2);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_disable_grammar(void * jarg1, char * jarg2) {
+ int jresult ;
+ switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_asr_handle_t *)jarg1;
+ arg2 = (char *)jarg2;
+ result = (switch_status_t)switch_core_asr_disable_grammar(arg1,(char const *)arg2);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_disable_all_grammars(void * jarg1) {
+ int jresult ;
+ switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_asr_handle_t *)jarg1;
+ result = (switch_status_t)switch_core_asr_disable_all_grammars(arg1);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_pause(void * jarg1) {
int jresult ;
switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
@@ -18313,6 +18369,94 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_next_get(void * jarg1)
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_enable_grammar_set(void * jarg1, void * jarg2) {
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*arg2)(switch_asr_handle_t *,char const *) = (switch_status_t (*)(switch_asr_handle_t *,char const *)) 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ arg2 = (switch_status_t (*)(switch_asr_handle_t *,char const *))jarg2;
+ if (arg1) (arg1)->asr_enable_grammar = arg2;
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_enable_grammar_get(void * jarg1) {
+ void * jresult ;
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*result)(switch_asr_handle_t *,char const *) = 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ result = (switch_status_t (*)(switch_asr_handle_t *,char const *)) ((arg1)->asr_enable_grammar);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_grammar_set(void * jarg1, void * jarg2) {
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*arg2)(switch_asr_handle_t *,char const *) = (switch_status_t (*)(switch_asr_handle_t *,char const *)) 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ arg2 = (switch_status_t (*)(switch_asr_handle_t *,char const *))jarg2;
+ if (arg1) (arg1)->asr_disable_grammar = arg2;
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_grammar_get(void * jarg1) {
+ void * jresult ;
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*result)(switch_asr_handle_t *,char const *) = 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ result = (switch_status_t (*)(switch_asr_handle_t *,char const *)) ((arg1)->asr_disable_grammar);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_all_grammars_set(void * jarg1, void * jarg2) {
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*arg2)(switch_asr_handle_t *) = (switch_status_t (*)(switch_asr_handle_t *)) 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ arg2 = (switch_status_t (*)(switch_asr_handle_t *))jarg2;
+ if (arg1) (arg1)->asr_disable_all_grammars = arg2;
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_all_grammars_get(void * jarg1) {
+ void * jresult ;
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*result)(switch_asr_handle_t *) = 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ result = (switch_status_t (*)(switch_asr_handle_t *)) ((arg1)->asr_disable_all_grammars);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_feed_dtmf_set(void * jarg1, void * jarg2) {
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*arg2)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *) = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *)) 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ arg2 = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *))jarg2;
+ if (arg1) (arg1)->asr_feed_dtmf = arg2;
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_feed_dtmf_get(void * jarg1) {
+ void * jresult ;
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*result)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *) = 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ result = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *)) ((arg1)->asr_feed_dtmf);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
SWIGEXPORT void * SWIGSTDCALL CSharp_new_switch_asr_interface() {
void * jresult ;
switch_asr_interface *result = 0 ;
@@ -26320,6 +26464,46 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_unload_grammar(void *
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_enable_grammar(void * jarg1, char * jarg2) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ arg2 = (char *)jarg2;
+ result = (switch_status_t)switch_ivr_detect_speech_enable_grammar(arg1,(char const *)arg2);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_disable_grammar(void * jarg1, char * jarg2) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ arg2 = (char *)jarg2;
+ result = (switch_status_t)switch_ivr_detect_speech_disable_grammar(arg1,(char const *)arg2);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_disable_all_grammars(void * jarg1) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ result = (switch_status_t)switch_ivr_detect_speech_disable_all_grammars(arg1);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_set_param_detect_speech(void * jarg1, char * jarg2, char * jarg3) {
int jresult ;
switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
@@ -26336,6 +26520,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_set_param_detect_speech(void * jarg
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_start_input_timers(void * jarg1) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ result = (switch_status_t)switch_ivr_detect_speech_start_input_timers(arg1);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_record_session(void * jarg1, char * jarg2, unsigned long jarg3, void * jarg4) {
int jresult ;
switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.cxx
index aa2a84f3f6..e91de6df46 100644
--- a/src/mod/languages/mod_managed/freeswitch_wrap.cxx
+++ b/src/mod/languages/mod_managed/freeswitch_wrap.cxx
@@ -7413,6 +7413,20 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_core_session_get_dmachine(void * jar
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_set_codec_slin(void * jarg1, void * jarg2) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ switch_slin_data_t *arg2 = (switch_slin_data_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ arg2 = (switch_slin_data_t *)jarg2;
+ result = (switch_status_t)switch_core_session_set_codec_slin(arg1,arg2);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT char * SWIGSTDCALL CSharp_switch_core_get_uuid() {
char * jresult ;
char *result = 0 ;
@@ -9224,6 +9238,22 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_feed(void * jarg1, void * jarg
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_feed_dtmf(void * jarg1, void * jarg2, void * jarg3) {
+ int jresult ;
+ switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
+ switch_dtmf_t *arg2 = (switch_dtmf_t *) 0 ;
+ switch_asr_flag_t *arg3 = (switch_asr_flag_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_asr_handle_t *)jarg1;
+ arg2 = (switch_dtmf_t *)jarg2;
+ arg3 = (switch_asr_flag_t *)jarg3;
+ result = (switch_status_t)switch_core_asr_feed_dtmf(arg1,(switch_dtmf_t const *)arg2,arg3);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_check_results(void * jarg1, void * jarg2) {
int jresult ;
switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
@@ -9284,6 +9314,46 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_unload_grammar(void * jarg1, c
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_enable_grammar(void * jarg1, char * jarg2) {
+ int jresult ;
+ switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_asr_handle_t *)jarg1;
+ arg2 = (char *)jarg2;
+ result = (switch_status_t)switch_core_asr_enable_grammar(arg1,(char const *)arg2);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_disable_grammar(void * jarg1, char * jarg2) {
+ int jresult ;
+ switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_asr_handle_t *)jarg1;
+ arg2 = (char *)jarg2;
+ result = (switch_status_t)switch_core_asr_disable_grammar(arg1,(char const *)arg2);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_disable_all_grammars(void * jarg1) {
+ int jresult ;
+ switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_asr_handle_t *)jarg1;
+ result = (switch_status_t)switch_core_asr_disable_all_grammars(arg1);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_pause(void * jarg1) {
int jresult ;
switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
@@ -18806,6 +18876,98 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_next_get(void * jarg1)
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_enable_grammar_set(void * jarg1, void * jarg2) {
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*arg2)(switch_asr_handle_t *,char const *) = (switch_status_t (*)(switch_asr_handle_t *,char const *)) 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ arg2 = (switch_status_t (*)(switch_asr_handle_t *,char const *))jarg2;
+ if (arg1) (arg1)->asr_enable_grammar = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_enable_grammar_get(void * jarg1) {
+ void * jresult ;
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*result)(switch_asr_handle_t *,char const *) = 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ result = (switch_status_t (*)(switch_asr_handle_t *,char const *)) ((arg1)->asr_enable_grammar);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_grammar_set(void * jarg1, void * jarg2) {
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*arg2)(switch_asr_handle_t *,char const *) = (switch_status_t (*)(switch_asr_handle_t *,char const *)) 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ arg2 = (switch_status_t (*)(switch_asr_handle_t *,char const *))jarg2;
+ if (arg1) (arg1)->asr_disable_grammar = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_grammar_get(void * jarg1) {
+ void * jresult ;
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*result)(switch_asr_handle_t *,char const *) = 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ result = (switch_status_t (*)(switch_asr_handle_t *,char const *)) ((arg1)->asr_disable_grammar);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_all_grammars_set(void * jarg1, void * jarg2) {
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*arg2)(switch_asr_handle_t *) = (switch_status_t (*)(switch_asr_handle_t *)) 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ arg2 = (switch_status_t (*)(switch_asr_handle_t *))jarg2;
+ if (arg1) (arg1)->asr_disable_all_grammars = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_all_grammars_get(void * jarg1) {
+ void * jresult ;
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*result)(switch_asr_handle_t *) = 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ result = (switch_status_t (*)(switch_asr_handle_t *)) ((arg1)->asr_disable_all_grammars);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_feed_dtmf_set(void * jarg1, void * jarg2) {
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*arg2)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *) = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *)) 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ arg2 = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *))jarg2;
+ if (arg1) (arg1)->asr_feed_dtmf = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_feed_dtmf_get(void * jarg1) {
+ void * jresult ;
+ switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;
+ switch_status_t (*result)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *) = 0 ;
+
+ arg1 = (switch_asr_interface *)jarg1;
+ result = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *)) ((arg1)->asr_feed_dtmf);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
SWIGEXPORT void * SWIGSTDCALL CSharp_new_switch_asr_interface() {
void * jresult ;
switch_asr_interface *result = 0 ;
@@ -22794,6 +22956,119 @@ SWIGEXPORT void SWIGSTDCALL CSharp_delete_switch_api_interface(void * jarg1) {
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_slin_data_session_set(void * jarg1, void * jarg2) {
+ switch_slin_data *arg1 = (switch_slin_data *) 0 ;
+ switch_core_session_t *arg2 = (switch_core_session_t *) 0 ;
+
+ arg1 = (switch_slin_data *)jarg1;
+ arg2 = (switch_core_session_t *)jarg2;
+ if (arg1) (arg1)->session = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_slin_data_session_get(void * jarg1) {
+ void * jresult ;
+ switch_slin_data *arg1 = (switch_slin_data *) 0 ;
+ switch_core_session_t *result = 0 ;
+
+ arg1 = (switch_slin_data *)jarg1;
+ result = (switch_core_session_t *) ((arg1)->session);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_slin_data_write_frame_set(void * jarg1, void * jarg2) {
+ switch_slin_data *arg1 = (switch_slin_data *) 0 ;
+ switch_frame_t *arg2 = (switch_frame_t *) 0 ;
+
+ arg1 = (switch_slin_data *)jarg1;
+ arg2 = (switch_frame_t *)jarg2;
+ if (arg1) (arg1)->write_frame = *arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_slin_data_write_frame_get(void * jarg1) {
+ void * jresult ;
+ switch_slin_data *arg1 = (switch_slin_data *) 0 ;
+ switch_frame_t *result = 0 ;
+
+ arg1 = (switch_slin_data *)jarg1;
+ result = (switch_frame_t *)& ((arg1)->write_frame);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_slin_data_codec_set(void * jarg1, void * jarg2) {
+ switch_slin_data *arg1 = (switch_slin_data *) 0 ;
+ switch_codec_t *arg2 = (switch_codec_t *) 0 ;
+
+ arg1 = (switch_slin_data *)jarg1;
+ arg2 = (switch_codec_t *)jarg2;
+ if (arg1) (arg1)->codec = *arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_slin_data_codec_get(void * jarg1) {
+ void * jresult ;
+ switch_slin_data *arg1 = (switch_slin_data *) 0 ;
+ switch_codec_t *result = 0 ;
+
+ arg1 = (switch_slin_data *)jarg1;
+ result = (switch_codec_t *)& ((arg1)->codec);
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_slin_data_frame_data_set(void * jarg1, char * jarg2) {
+ switch_slin_data *arg1 = (switch_slin_data *) 0 ;
+ char *arg2 ;
+
+ arg1 = (switch_slin_data *)jarg1;
+ arg2 = (char *)jarg2;
+ {
+ if (arg2) strncpy((char *)arg1->frame_data, (const char *)arg2, 4096);
+ else arg1->frame_data[0] = 0;
+ }
+}
+
+
+SWIGEXPORT char * SWIGSTDCALL CSharp_switch_slin_data_frame_data_get(void * jarg1) {
+ char * jresult ;
+ switch_slin_data *arg1 = (switch_slin_data *) 0 ;
+ char *result = 0 ;
+
+ arg1 = (switch_slin_data *)jarg1;
+ result = (char *)(char *) ((arg1)->frame_data);
+ jresult = SWIG_csharp_string_callback((const char *)result);
+ return jresult;
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_new_switch_slin_data() {
+ void * jresult ;
+ switch_slin_data *result = 0 ;
+
+ result = (switch_slin_data *)new switch_slin_data();
+ jresult = (void *)result;
+ return jresult;
+}
+
+
+SWIGEXPORT void SWIGSTDCALL CSharp_delete_switch_slin_data(void * jarg1) {
+ switch_slin_data *arg1 = (switch_slin_data *) 0 ;
+
+ arg1 = (switch_slin_data *)jarg1;
+ delete arg1;
+
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_timetable_profile_created_set(void * jarg1, void * jarg2) {
switch_channel_timetable *arg1 = (switch_channel_timetable *) 0 ;
switch_time_t arg2 ;
@@ -26886,6 +27161,46 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_unload_grammar(void *
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_enable_grammar(void * jarg1, char * jarg2) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ arg2 = (char *)jarg2;
+ result = (switch_status_t)switch_ivr_detect_speech_enable_grammar(arg1,(char const *)arg2);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_disable_grammar(void * jarg1, char * jarg2) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ char *arg2 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ arg2 = (char *)jarg2;
+ result = (switch_status_t)switch_ivr_detect_speech_disable_grammar(arg1,(char const *)arg2);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_disable_all_grammars(void * jarg1) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ result = (switch_status_t)switch_ivr_detect_speech_disable_all_grammars(arg1);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_set_param_detect_speech(void * jarg1, char * jarg2, char * jarg3) {
int jresult ;
switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
@@ -26902,6 +27217,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_set_param_detect_speech(void * jarg
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_start_input_timers(void * jarg1) {
+ int jresult ;
+ switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_core_session_t *)jarg1;
+ result = (switch_status_t)switch_ivr_detect_speech_start_input_timers(arg1);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_record_session(void * jarg1, char * jarg2, unsigned long jarg3, void * jarg4) {
int jresult ;
switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
diff --git a/src/mod/languages/mod_managed/managed/swig.2010.cs b/src/mod/languages/mod_managed/managed/swig.2010.cs
index 059fb89a1c..61c0a4e462 100644
--- a/src/mod/languages/mod_managed/managed/swig.2010.cs
+++ b/src/mod/languages/mod_managed/managed/swig.2010.cs
@@ -2000,6 +2000,11 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_core_asr_feed_dtmf(switch_asr_handle ah, switch_dtmf_t dtmf, SWIGTYPE_p_unsigned_long flags) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_feed_dtmf(switch_asr_handle.getCPtr(ah), switch_dtmf_t.getCPtr(dtmf), SWIGTYPE_p_unsigned_long.getCPtr(flags));
+ return ret;
+ }
+
public static switch_status_t switch_core_asr_check_results(switch_asr_handle ah, SWIGTYPE_p_unsigned_long flags) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_check_results(switch_asr_handle.getCPtr(ah), SWIGTYPE_p_unsigned_long.getCPtr(flags));
return ret;
@@ -2020,6 +2025,21 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_core_asr_enable_grammar(switch_asr_handle ah, string name) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_enable_grammar(switch_asr_handle.getCPtr(ah), name);
+ return ret;
+ }
+
+ public static switch_status_t switch_core_asr_disable_grammar(switch_asr_handle ah, string name) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_disable_grammar(switch_asr_handle.getCPtr(ah), name);
+ return ret;
+ }
+
+ public static switch_status_t switch_core_asr_disable_all_grammars(switch_asr_handle ah) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_disable_all_grammars(switch_asr_handle.getCPtr(ah));
+ return ret;
+ }
+
public static switch_status_t switch_core_asr_pause(switch_asr_handle ah) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_pause(switch_asr_handle.getCPtr(ah));
return ret;
@@ -4070,11 +4090,31 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_ivr_detect_speech_enable_grammar(SWIGTYPE_p_switch_core_session session, string name) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_enable_grammar(SWIGTYPE_p_switch_core_session.getCPtr(session), name);
+ return ret;
+ }
+
+ public static switch_status_t switch_ivr_detect_speech_disable_grammar(SWIGTYPE_p_switch_core_session session, string name) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_disable_grammar(SWIGTYPE_p_switch_core_session.getCPtr(session), name);
+ return ret;
+ }
+
+ public static switch_status_t switch_ivr_detect_speech_disable_all_grammars(SWIGTYPE_p_switch_core_session session) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_disable_all_grammars(SWIGTYPE_p_switch_core_session.getCPtr(session));
+ return ret;
+ }
+
public static switch_status_t switch_ivr_set_param_detect_speech(SWIGTYPE_p_switch_core_session session, string name, string val) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_set_param_detect_speech(SWIGTYPE_p_switch_core_session.getCPtr(session), name, val);
return ret;
}
+ public static switch_status_t switch_ivr_detect_speech_start_input_timers(SWIGTYPE_p_switch_core_session session) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_start_input_timers(SWIGTYPE_p_switch_core_session.getCPtr(session));
+ return ret;
+ }
+
public static switch_status_t switch_ivr_record_session(SWIGTYPE_p_switch_core_session session, string file, uint limit, switch_file_handle fh) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_record_session(SWIGTYPE_p_switch_core_session.getCPtr(session), file, limit, switch_file_handle.getCPtr(fh));
return ret;
@@ -7907,6 +7947,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_feed")]
public static extern int switch_core_asr_feed(HandleRef jarg1, HandleRef jarg2, uint jarg3, HandleRef jarg4);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_feed_dtmf")]
+ public static extern int switch_core_asr_feed_dtmf(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_check_results")]
public static extern int switch_core_asr_check_results(HandleRef jarg1, HandleRef jarg2);
@@ -7919,6 +7962,15 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_unload_grammar")]
public static extern int switch_core_asr_unload_grammar(HandleRef jarg1, string jarg2);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_enable_grammar")]
+ public static extern int switch_core_asr_enable_grammar(HandleRef jarg1, string jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_disable_grammar")]
+ public static extern int switch_core_asr_disable_grammar(HandleRef jarg1, string jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_disable_all_grammars")]
+ public static extern int switch_core_asr_disable_all_grammars(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_pause")]
public static extern int switch_core_asr_pause(HandleRef jarg1);
@@ -10196,6 +10248,30 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_next_get")]
public static extern IntPtr switch_asr_interface_next_get(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_enable_grammar_set")]
+ public static extern void switch_asr_interface_asr_enable_grammar_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_enable_grammar_get")]
+ public static extern IntPtr switch_asr_interface_asr_enable_grammar_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_disable_grammar_set")]
+ public static extern void switch_asr_interface_asr_disable_grammar_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_disable_grammar_get")]
+ public static extern IntPtr switch_asr_interface_asr_disable_grammar_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_disable_all_grammars_set")]
+ public static extern void switch_asr_interface_asr_disable_all_grammars_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_disable_all_grammars_get")]
+ public static extern IntPtr switch_asr_interface_asr_disable_all_grammars_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_feed_dtmf_set")]
+ public static extern void switch_asr_interface_asr_feed_dtmf_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_feed_dtmf_get")]
+ public static extern IntPtr switch_asr_interface_asr_feed_dtmf_get(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_new_switch_asr_interface")]
public static extern IntPtr new_switch_asr_interface();
@@ -12140,9 +12216,21 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_unload_grammar")]
public static extern int switch_ivr_detect_speech_unload_grammar(HandleRef jarg1, string jarg2);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_enable_grammar")]
+ public static extern int switch_ivr_detect_speech_enable_grammar(HandleRef jarg1, string jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_disable_grammar")]
+ public static extern int switch_ivr_detect_speech_disable_grammar(HandleRef jarg1, string jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_disable_all_grammars")]
+ public static extern int switch_ivr_detect_speech_disable_all_grammars(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_set_param_detect_speech")]
public static extern int switch_ivr_set_param_detect_speech(HandleRef jarg1, string jarg2, string jarg3);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_start_input_timers")]
+ public static extern int switch_ivr_detect_speech_start_input_timers(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_record_session")]
public static extern int switch_ivr_record_session(HandleRef jarg1, string jarg2, uint jarg3, HandleRef jarg4);
@@ -14967,6 +15055,36 @@ namespace FreeSWITCH.Native {
using System;
using System.Runtime.InteropServices;
+public class SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t {
+ private HandleRef swigCPtr;
+
+ internal SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t(IntPtr cPtr, bool futureUse) {
+ swigCPtr = new HandleRef(this, cPtr);
+ }
+
+ protected SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t() {
+ swigCPtr = new HandleRef(null, IntPtr.Zero);
+ }
+
+ internal static HandleRef getCPtr(SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t obj) {
+ return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
+ }
+}
+
+}
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 2.0.1
+ *
+ * Do not make changes to this file unless you know what you are doing--modify
+ * the SWIG interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+namespace FreeSWITCH.Native {
+
+using System;
+using System.Runtime.InteropServices;
+
public class SWIGTYPE_p_f_p_switch_asr_handle_p_unsigned_long__switch_status_t {
private HandleRef swigCPtr;
@@ -19993,6 +20111,50 @@ public class switch_asr_interface : IDisposable {
}
}
+ public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t asr_enable_grammar {
+ set {
+ freeswitchPINVOKE.switch_asr_interface_asr_enable_grammar_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_enable_grammar_get(swigCPtr);
+ SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t(cPtr, false);
+ return ret;
+ }
+ }
+
+ public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t asr_disable_grammar {
+ set {
+ freeswitchPINVOKE.switch_asr_interface_asr_disable_grammar_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_disable_grammar_get(swigCPtr);
+ SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t(cPtr, false);
+ return ret;
+ }
+ }
+
+ public SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t asr_disable_all_grammars {
+ set {
+ freeswitchPINVOKE.switch_asr_interface_asr_disable_all_grammars_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_disable_all_grammars_get(swigCPtr);
+ SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t(cPtr, false);
+ return ret;
+ }
+ }
+
+ public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t asr_feed_dtmf {
+ set {
+ freeswitchPINVOKE.switch_asr_interface_asr_feed_dtmf_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_feed_dtmf_get(swigCPtr);
+ SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t(cPtr, false);
+ return ret;
+ }
+ }
+
public switch_asr_interface() : this(freeswitchPINVOKE.new_switch_asr_interface(), true) {
}
@@ -28589,7 +28751,8 @@ public enum switch_rtp_bug_flag_t {
RTP_BUG_IGNORE_MARK_BIT = (1 << 2),
RTP_BUG_SEND_LINEAR_TIMESTAMPS = (1 << 3),
RTP_BUG_START_SEQ_AT_ZERO = (1 << 4),
- RTP_BUG_NEVER_SEND_MARKER = (1 << 5)
+ RTP_BUG_NEVER_SEND_MARKER = (1 << 5),
+ RTP_BUG_IGNORE_DTMF_DURATION = (1 << 6)
}
}
@@ -30446,7 +30609,7 @@ public enum switch_status_t {
SWITCH_STATUS_FALSE,
SWITCH_STATUS_TIMEOUT,
SWITCH_STATUS_RESTART,
- SWITCH_STATUS_TERM,
+ SWITCH_STATUS_INTR,
SWITCH_STATUS_NOTIMPL,
SWITCH_STATUS_MEMERR,
SWITCH_STATUS_NOOP,
@@ -30463,6 +30626,7 @@ public enum switch_status_t {
SWITCH_STATUS_TOO_SMALL,
SWITCH_STATUS_FOUND,
SWITCH_STATUS_CONTINUE,
+ SWITCH_STATUS_TERM,
SWITCH_STATUS_NOT_INITALIZED
}
diff --git a/src/mod/languages/mod_managed/managed/swig.cs b/src/mod/languages/mod_managed/managed/swig.cs
index 5a2188ac83..1f02c3f9ee 100644
--- a/src/mod/languages/mod_managed/managed/swig.cs
+++ b/src/mod/languages/mod_managed/managed/swig.cs
@@ -1357,6 +1357,11 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_core_session_set_codec_slin(SWIGTYPE_p_switch_core_session session, switch_slin_data data) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_set_codec_slin(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_slin_data.getCPtr(data));
+ return ret;
+ }
+
public static string switch_core_get_uuid() {
string ret = freeswitchPINVOKE.switch_core_get_uuid();
return ret;
@@ -1985,6 +1990,11 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_core_asr_feed_dtmf(switch_asr_handle ah, switch_dtmf_t dtmf, SWIGTYPE_p_unsigned_long flags) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_feed_dtmf(switch_asr_handle.getCPtr(ah), switch_dtmf_t.getCPtr(dtmf), SWIGTYPE_p_unsigned_long.getCPtr(flags));
+ return ret;
+ }
+
public static switch_status_t switch_core_asr_check_results(switch_asr_handle ah, SWIGTYPE_p_unsigned_long flags) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_check_results(switch_asr_handle.getCPtr(ah), SWIGTYPE_p_unsigned_long.getCPtr(flags));
return ret;
@@ -2005,6 +2015,21 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_core_asr_enable_grammar(switch_asr_handle ah, string name) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_enable_grammar(switch_asr_handle.getCPtr(ah), name);
+ return ret;
+ }
+
+ public static switch_status_t switch_core_asr_disable_grammar(switch_asr_handle ah, string name) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_disable_grammar(switch_asr_handle.getCPtr(ah), name);
+ return ret;
+ }
+
+ public static switch_status_t switch_core_asr_disable_all_grammars(switch_asr_handle ah) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_disable_all_grammars(switch_asr_handle.getCPtr(ah));
+ return ret;
+ }
+
public static switch_status_t switch_core_asr_pause(switch_asr_handle ah) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_pause(switch_asr_handle.getCPtr(ah));
return ret;
@@ -4055,11 +4080,31 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_ivr_detect_speech_enable_grammar(SWIGTYPE_p_switch_core_session session, string name) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_enable_grammar(SWIGTYPE_p_switch_core_session.getCPtr(session), name);
+ return ret;
+ }
+
+ public static switch_status_t switch_ivr_detect_speech_disable_grammar(SWIGTYPE_p_switch_core_session session, string name) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_disable_grammar(SWIGTYPE_p_switch_core_session.getCPtr(session), name);
+ return ret;
+ }
+
+ public static switch_status_t switch_ivr_detect_speech_disable_all_grammars(SWIGTYPE_p_switch_core_session session) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_disable_all_grammars(SWIGTYPE_p_switch_core_session.getCPtr(session));
+ return ret;
+ }
+
public static switch_status_t switch_ivr_set_param_detect_speech(SWIGTYPE_p_switch_core_session session, string name, string val) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_set_param_detect_speech(SWIGTYPE_p_switch_core_session.getCPtr(session), name, val);
return ret;
}
+ public static switch_status_t switch_ivr_detect_speech_start_input_timers(SWIGTYPE_p_switch_core_session session) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_start_input_timers(SWIGTYPE_p_switch_core_session.getCPtr(session));
+ return ret;
+ }
+
public static switch_status_t switch_ivr_record_session(SWIGTYPE_p_switch_core_session session, string file, uint limit, switch_file_handle fh) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_record_session(SWIGTYPE_p_switch_core_session.getCPtr(session), file, limit, switch_file_handle.getCPtr(fh));
return ret;
@@ -7504,6 +7549,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_get_dmachine")]
public static extern IntPtr switch_core_session_get_dmachine(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_set_codec_slin")]
+ public static extern int switch_core_session_set_codec_slin(HandleRef jarg1, HandleRef jarg2);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_get_uuid")]
public static extern string switch_core_get_uuid();
@@ -7885,6 +7933,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_feed")]
public static extern int switch_core_asr_feed(HandleRef jarg1, HandleRef jarg2, uint jarg3, HandleRef jarg4);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_feed_dtmf")]
+ public static extern int switch_core_asr_feed_dtmf(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_check_results")]
public static extern int switch_core_asr_check_results(HandleRef jarg1, HandleRef jarg2);
@@ -7897,6 +7948,15 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_unload_grammar")]
public static extern int switch_core_asr_unload_grammar(HandleRef jarg1, string jarg2);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_enable_grammar")]
+ public static extern int switch_core_asr_enable_grammar(HandleRef jarg1, string jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_disable_grammar")]
+ public static extern int switch_core_asr_disable_grammar(HandleRef jarg1, string jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_disable_all_grammars")]
+ public static extern int switch_core_asr_disable_all_grammars(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_asr_pause")]
public static extern int switch_core_asr_pause(HandleRef jarg1);
@@ -10174,6 +10234,30 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_next_get")]
public static extern IntPtr switch_asr_interface_next_get(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_enable_grammar_set")]
+ public static extern void switch_asr_interface_asr_enable_grammar_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_enable_grammar_get")]
+ public static extern IntPtr switch_asr_interface_asr_enable_grammar_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_disable_grammar_set")]
+ public static extern void switch_asr_interface_asr_disable_grammar_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_disable_grammar_get")]
+ public static extern IntPtr switch_asr_interface_asr_disable_grammar_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_disable_all_grammars_set")]
+ public static extern void switch_asr_interface_asr_disable_all_grammars_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_disable_all_grammars_get")]
+ public static extern IntPtr switch_asr_interface_asr_disable_all_grammars_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_feed_dtmf_set")]
+ public static extern void switch_asr_interface_asr_feed_dtmf_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_asr_feed_dtmf_get")]
+ public static extern IntPtr switch_asr_interface_asr_feed_dtmf_get(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_new_switch_asr_interface")]
public static extern IntPtr new_switch_asr_interface();
@@ -11188,6 +11272,36 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_delete_switch_api_interface")]
public static extern void delete_switch_api_interface(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_slin_data_session_set")]
+ public static extern void switch_slin_data_session_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_slin_data_session_get")]
+ public static extern IntPtr switch_slin_data_session_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_slin_data_write_frame_set")]
+ public static extern void switch_slin_data_write_frame_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_slin_data_write_frame_get")]
+ public static extern IntPtr switch_slin_data_write_frame_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_slin_data_codec_set")]
+ public static extern void switch_slin_data_codec_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_slin_data_codec_get")]
+ public static extern IntPtr switch_slin_data_codec_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_slin_data_frame_data_set")]
+ public static extern void switch_slin_data_frame_data_set(HandleRef jarg1, string jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_slin_data_frame_data_get")]
+ public static extern string switch_slin_data_frame_data_get(HandleRef jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_new_switch_slin_data")]
+ public static extern IntPtr new_switch_slin_data();
+
+ [DllImport("mod_managed", EntryPoint="CSharp_delete_switch_slin_data")]
+ public static extern void delete_switch_slin_data(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_timetable_profile_created_set")]
public static extern void switch_channel_timetable_profile_created_set(HandleRef jarg1, HandleRef jarg2);
@@ -12088,9 +12202,21 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_unload_grammar")]
public static extern int switch_ivr_detect_speech_unload_grammar(HandleRef jarg1, string jarg2);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_enable_grammar")]
+ public static extern int switch_ivr_detect_speech_enable_grammar(HandleRef jarg1, string jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_disable_grammar")]
+ public static extern int switch_ivr_detect_speech_disable_grammar(HandleRef jarg1, string jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_disable_all_grammars")]
+ public static extern int switch_ivr_detect_speech_disable_all_grammars(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_set_param_detect_speech")]
public static extern int switch_ivr_set_param_detect_speech(HandleRef jarg1, string jarg2, string jarg3);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_detect_speech_start_input_timers")]
+ public static extern int switch_ivr_detect_speech_start_input_timers(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_record_session")]
public static extern int switch_ivr_record_session(HandleRef jarg1, string jarg2, uint jarg3, HandleRef jarg4);
@@ -14905,6 +15031,36 @@ namespace FreeSWITCH.Native {
using System;
using System.Runtime.InteropServices;
+public class SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t {
+ private HandleRef swigCPtr;
+
+ internal SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t(IntPtr cPtr, bool futureUse) {
+ swigCPtr = new HandleRef(this, cPtr);
+ }
+
+ protected SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t() {
+ swigCPtr = new HandleRef(null, IntPtr.Zero);
+ }
+
+ internal static HandleRef getCPtr(SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t obj) {
+ return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
+ }
+}
+
+}
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 1.3.35
+ *
+ * Do not make changes to this file unless you know what you are doing--modify
+ * the SWIG interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+namespace FreeSWITCH.Native {
+
+using System;
+using System.Runtime.InteropServices;
+
public class SWIGTYPE_p_f_p_switch_asr_handle_p_unsigned_long__switch_status_t {
private HandleRef swigCPtr;
@@ -19921,6 +20077,50 @@ public class switch_asr_interface : IDisposable {
}
}
+ public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t asr_enable_grammar {
+ set {
+ freeswitchPINVOKE.switch_asr_interface_asr_enable_grammar_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_enable_grammar_get(swigCPtr);
+ SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t(cPtr, false);
+ return ret;
+ }
+ }
+
+ public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t asr_disable_grammar {
+ set {
+ freeswitchPINVOKE.switch_asr_interface_asr_disable_grammar_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_disable_grammar_get(swigCPtr);
+ SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t(cPtr, false);
+ return ret;
+ }
+ }
+
+ public SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t asr_disable_all_grammars {
+ set {
+ freeswitchPINVOKE.switch_asr_interface_asr_disable_all_grammars_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_disable_all_grammars_get(swigCPtr);
+ SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t(cPtr, false);
+ return ret;
+ }
+ }
+
+ public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t asr_feed_dtmf {
+ set {
+ freeswitchPINVOKE.switch_asr_interface_asr_feed_dtmf_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_feed_dtmf_get(swigCPtr);
+ SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t(cPtr, false);
+ return ret;
+ }
+ }
+
public switch_asr_interface() : this(freeswitchPINVOKE.new_switch_asr_interface(), true) {
}
@@ -28401,7 +28601,8 @@ public enum switch_rtp_bug_flag_t {
RTP_BUG_IGNORE_MARK_BIT = (1 << 2),
RTP_BUG_SEND_LINEAR_TIMESTAMPS = (1 << 3),
RTP_BUG_START_SEQ_AT_ZERO = (1 << 4),
- RTP_BUG_NEVER_SEND_MARKER = (1 << 5)
+ RTP_BUG_NEVER_SEND_MARKER = (1 << 5),
+ RTP_BUG_IGNORE_DTMF_DURATION = (1 << 6)
}
}
@@ -29437,6 +29638,96 @@ public enum switch_signal_t {
namespace FreeSWITCH.Native {
+using System;
+using System.Runtime.InteropServices;
+
+public class switch_slin_data : IDisposable {
+ private HandleRef swigCPtr;
+ protected bool swigCMemOwn;
+
+ internal switch_slin_data(IntPtr cPtr, bool cMemoryOwn) {
+ swigCMemOwn = cMemoryOwn;
+ swigCPtr = new HandleRef(this, cPtr);
+ }
+
+ internal static HandleRef getCPtr(switch_slin_data obj) {
+ return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
+ }
+
+ ~switch_slin_data() {
+ Dispose();
+ }
+
+ public virtual void Dispose() {
+ lock(this) {
+ if(swigCPtr.Handle != IntPtr.Zero && swigCMemOwn) {
+ swigCMemOwn = false;
+ freeswitchPINVOKE.delete_switch_slin_data(swigCPtr);
+ }
+ swigCPtr = new HandleRef(null, IntPtr.Zero);
+ GC.SuppressFinalize(this);
+ }
+ }
+
+ public SWIGTYPE_p_switch_core_session session {
+ set {
+ freeswitchPINVOKE.switch_slin_data_session_set(swigCPtr, SWIGTYPE_p_switch_core_session.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_slin_data_session_get(swigCPtr);
+ SWIGTYPE_p_switch_core_session ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_core_session(cPtr, false);
+ return ret;
+ }
+ }
+
+ public switch_frame write_frame {
+ set {
+ freeswitchPINVOKE.switch_slin_data_write_frame_set(swigCPtr, switch_frame.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_slin_data_write_frame_get(swigCPtr);
+ switch_frame ret = (cPtr == IntPtr.Zero) ? null : new switch_frame(cPtr, false);
+ return ret;
+ }
+ }
+
+ public switch_codec codec {
+ set {
+ freeswitchPINVOKE.switch_slin_data_codec_set(swigCPtr, switch_codec.getCPtr(value));
+ }
+ get {
+ IntPtr cPtr = freeswitchPINVOKE.switch_slin_data_codec_get(swigCPtr);
+ switch_codec ret = (cPtr == IntPtr.Zero) ? null : new switch_codec(cPtr, false);
+ return ret;
+ }
+ }
+
+ public string frame_data {
+ set {
+ freeswitchPINVOKE.switch_slin_data_frame_data_set(swigCPtr, value);
+ }
+ get {
+ string ret = freeswitchPINVOKE.switch_slin_data_frame_data_get(swigCPtr);
+ return ret;
+ }
+ }
+
+ public switch_slin_data() : this(freeswitchPINVOKE.new_switch_slin_data(), true) {
+ }
+
+}
+
+}
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 1.3.35
+ *
+ * Do not make changes to this file unless you know what you are doing--modify
+ * the SWIG interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+namespace FreeSWITCH.Native {
+
[System.Flags] public enum switch_speech_flag_enum_t {
SWITCH_SPEECH_FLAG_NONE = 0,
SWITCH_SPEECH_FLAG_HASTEXT = (1 << 0),
@@ -30146,7 +30437,7 @@ public enum switch_status_t {
SWITCH_STATUS_FALSE,
SWITCH_STATUS_TIMEOUT,
SWITCH_STATUS_RESTART,
- SWITCH_STATUS_TERM,
+ SWITCH_STATUS_INTR,
SWITCH_STATUS_NOTIMPL,
SWITCH_STATUS_MEMERR,
SWITCH_STATUS_NOOP,
@@ -30163,6 +30454,7 @@ public enum switch_status_t {
SWITCH_STATUS_TOO_SMALL,
SWITCH_STATUS_FOUND,
SWITCH_STATUS_CONTINUE,
+ SWITCH_STATUS_TERM,
SWITCH_STATUS_NOT_INITALIZED
}
diff --git a/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c b/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c
index 9bf837e1e4..bc143d7e48 100644
--- a/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c
+++ b/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c
@@ -293,12 +293,12 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con
}
if (config_data.err) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error encountered!\n");
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error encountered! [%s]\ndata: [%s]\n", binding->url, data);
xml = NULL;
} else {
if (httpRes == 200) {
if (!(xml = switch_xml_parse_file(filename))) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Parsing Result!\n");
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Parsing Result! [%s]\ndata: [%s]\n", binding->url, data);
}
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received HTTP error %ld trying to fetch %s\ndata: [%s]\n", httpRes, binding->url,
diff --git a/src/switch_channel.c b/src/switch_channel.c
index de472a91d5..70b1879274 100644
--- a/src/switch_channel.c
+++ b/src/switch_channel.c
@@ -2595,14 +2595,15 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready_value(swi
if (var) {
char *arg = NULL;
app = switch_core_session_strdup(channel->session, var);
- if ((arg = strchr(app, ' '))) {
- *arg++ = '\0';
- }
- if (switch_core_session_in_thread(channel->session)) {
- switch_core_session_execute_application(channel->session, app, arg);
- } else {
+ if (strstr(app, "::")) {
switch_core_session_execute_application_async(channel->session, app, arg);
+ } else {
+ if ((arg = strchr(app, ' '))) {
+ *arg++ = '\0';
+ }
+
+ switch_core_session_execute_application(channel->session, app, arg);
}
}
@@ -2653,14 +2654,16 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_pre_answered(switch_
(var = switch_channel_get_variable(channel, SWITCH_CHANNEL_EXECUTE_ON_MEDIA_VARIABLE))) && !zstr(var)) {
char *arg = NULL;
app = switch_core_session_strdup(channel->session, var);
- if ((arg = strchr(app, ' '))) {
- *arg++ = '\0';
- }
- if (switch_core_session_in_thread(channel->session)) {
- switch_core_session_execute_application(channel->session, app, arg);
- } else {
+
+ if (strstr(app, "::")) {
switch_core_session_execute_application_async(channel->session, app, arg);
+ } else {
+ if ((arg = strchr(app, ' '))) {
+ *arg++ = '\0';
+ }
+
+ switch_core_session_execute_application(channel->session, app, arg);
}
}
@@ -2825,27 +2828,17 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_answered(switch_chan
(!switch_channel_test_flag(channel, CF_EARLY_MEDIA) && (var = switch_channel_get_variable(channel, SWITCH_CHANNEL_EXECUTE_ON_MEDIA_VARIABLE))))
&& !zstr(var)) {
char *arg = NULL;
- char *colon = NULL;
app = switch_core_session_strdup(channel->session, var);
- arg = strchr(app, ' ');
- colon = strchr(app, ':');
- if (colon && (!arg || arg > colon) && *(colon + 1) == ':') {
- switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "%s execute on answer: %s (BROADCAST)\n", channel->name, app);
- switch_ivr_broadcast(switch_core_session_get_uuid(channel->session), app, SMF_NONE);
+ if (strstr(app, "::")) {
+ switch_core_session_execute_application_async(channel->session, app, arg);
} else {
- if (arg) {
+ if ((arg = strchr(app, ' '))) {
*arg++ = '\0';
}
- switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, "%s execute on answer: %s(%s)\n", channel->name, app,
- switch_str_nil(arg));
-
- if (switch_core_session_in_thread(channel->session)) {
- switch_core_session_execute_application(channel->session, app, arg);
- } else {
- switch_core_session_execute_application_async(channel->session, app, arg);
- }
+
+ switch_core_session_execute_application(channel->session, app, arg);
}
}
diff --git a/src/switch_core_asr.c b/src/switch_core_asr.c
index a040366ad0..4fb64b0a0a 100644
--- a/src/switch_core_asr.c
+++ b/src/switch_core_asr.c
@@ -27,6 +27,7 @@
* Michael Jerris
* Paul D. Tinsley
* Christopher M. Rienzo
+ * Luke Dashjr (OpenMethods, LLC)
*
*
* switch_core_asr.c -- Main Core Library (Speech Detection Interface)
@@ -160,6 +161,45 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_unload_grammar(switch_asr_handle
return status;
}
+SWITCH_DECLARE(switch_status_t) switch_core_asr_enable_grammar(switch_asr_handle_t *ah, const char *name)
+{
+ switch_status_t status = SWITCH_STATUS_FALSE;
+
+ switch_assert(ah != NULL);
+
+ if (ah->asr_interface->asr_enable_grammar) {
+ status = ah->asr_interface->asr_enable_grammar(ah, name);
+ }
+
+ return status;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_grammar(switch_asr_handle_t *ah, const char *name)
+{
+ switch_status_t status = SWITCH_STATUS_FALSE;
+
+ switch_assert(ah != NULL);
+
+ if (ah->asr_interface->asr_disable_grammar) {
+ status = ah->asr_interface->asr_disable_grammar(ah, name);
+ }
+
+ return status;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_all_grammars(switch_asr_handle_t *ah)
+{
+ switch_status_t status = SWITCH_STATUS_FALSE;
+
+ switch_assert(ah != NULL);
+
+ if (ah->asr_interface->asr_disable_all_grammars) {
+ status = ah->asr_interface->asr_disable_all_grammars(ah);
+ }
+
+ return status;
+}
+
SWITCH_DECLARE(switch_status_t) switch_core_asr_pause(switch_asr_handle_t *ah)
{
switch_assert(ah != NULL);
@@ -199,6 +239,19 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_feed(switch_asr_handle_t *ah, vo
return ah->asr_interface->asr_feed(ah, data, len, flags);
}
+SWITCH_DECLARE(switch_status_t) switch_core_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ switch_assert(ah != NULL);
+
+ if (ah->asr_interface->asr_feed_dtmf) {
+ status = ah->asr_interface->asr_feed_dtmf(ah, dtmf, flags);
+ }
+
+ return status;
+}
+
SWITCH_DECLARE(switch_status_t) switch_core_asr_check_results(switch_asr_handle_t *ah, switch_asr_flag_t *flags)
{
switch_assert(ah != NULL);
diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c
index 4167b4a89c..35311c9b0f 100644
--- a/src/switch_core_sqldb.c
+++ b/src/switch_core_sqldb.c
@@ -1160,15 +1160,14 @@ static void core_event_handler(switch_event_t *event)
case SWITCH_EVENT_CHANNEL_DESTROY:
{
const char *uuid = switch_event_get_header(event, "unique-id");
- const char *sig = switch_event_get_header(event, "signal_bridge");
if (uuid) {
new_sql() = switch_mprintf("delete from channels where uuid='%q' and hostname='%q'",
uuid, switch_core_get_variable("hostname"));
- if (switch_true(sig)) {
- new_sql() = switch_mprintf("delete from calls where (caller_uuid='%q' || callee_uuid='%q') and hostname='%q'",
- uuid, uuid, switch_core_get_variable("hostname"));
- }
+
+ new_sql() = switch_mprintf("delete from calls where (caller_uuid='%q' or callee_uuid='%q') and hostname='%q'",
+ uuid, uuid, switch_core_get_variable("hostname"));
+
}
}
break;
@@ -1410,7 +1409,7 @@ static void core_event_handler(switch_event_t *event)
}
break;
case SWITCH_EVENT_CHANNEL_UNBRIDGE:
- new_sql() = switch_mprintf("delete from calls where caller_uuid='%s' and hostname='%q'",
+ new_sql() = switch_mprintf("delete from calls where (caller_uuid='%s' or callee_uuid='%q') and hostname='%q'",
switch_event_get_header_nil(event, "caller-unique-id"), switch_core_get_variable("hostname"));
break;
case SWITCH_EVENT_SHUTDOWN:
diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c
index 0a646b6d6e..be360138c2 100644
--- a/src/switch_ivr_async.c
+++ b/src/switch_ivr_async.c
@@ -26,6 +26,7 @@
* Anthony Minessale II
* Michael Jerris
* Bret McDanel
+ * Luke Dashjr (OpenMethods, LLC)
*
* switch_ivr_async.c -- IVR Library (async operations)
*
@@ -3208,6 +3209,20 @@ static switch_bool_t speech_callback(switch_media_bug_t *bug, void *user_data, s
return SWITCH_TRUE;
}
+static switch_status_t speech_on_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf, switch_dtmf_direction_t direction)
+{
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE;
+
+ if (switch_core_asr_feed_dtmf(sth->ah, dtmf, &flags) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Error Feeding DTMF\n");
+ }
+
+ return status;
+}
+
SWITCH_DECLARE(switch_status_t) switch_ivr_stop_detect_speech(switch_core_session_t *session)
{
switch_channel_t *channel = switch_core_session_get_channel(session);
@@ -3277,6 +3292,18 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_set_param_detect_speech(switch_core_s
return status;
}
+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_start_input_timers(switch_core_session_t *session)
+{
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);
+
+ if (sth) {
+ switch_core_asr_start_input_timers(sth->ah);
+ return SWITCH_STATUS_SUCCESS;
+ }
+ return SWITCH_STATUS_FALSE;
+}
+
SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_unload_grammar(switch_core_session_t *session, const char *name)
{
switch_channel_t *channel = switch_core_session_get_channel(session);
@@ -3294,6 +3321,57 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_unload_grammar(switch_c
return SWITCH_STATUS_FALSE;
}
+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_enable_grammar(switch_core_session_t *session, const char *name)
+{
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE;
+ struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);
+ switch_status_t status;
+
+ if (sth) {
+ if ((status = switch_core_asr_enable_grammar(sth->ah, name)) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Error enabling Grammar\n");
+ switch_core_asr_close(sth->ah, &flags);
+ }
+ return status;
+ }
+ return SWITCH_STATUS_FALSE;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_grammar(switch_core_session_t *session, const char *name)
+{
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE;
+ struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);
+ switch_status_t status;
+
+ if (sth) {
+ if ((status = switch_core_asr_disable_grammar(sth->ah, name)) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Error disabling Grammar\n");
+ switch_core_asr_close(sth->ah, &flags);
+ }
+ return status;
+ }
+ return SWITCH_STATUS_FALSE;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_all_grammars(switch_core_session_t *session)
+{
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE;
+ struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);
+ switch_status_t status;
+
+ if (sth) {
+ if ((status = switch_core_asr_disable_all_grammars(sth->ah)) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Error disabling all Grammars\n");
+ switch_core_asr_close(sth->ah, &flags);
+ }
+ return status;
+ }
+ return SWITCH_STATUS_FALSE;
+}
+
SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech(switch_core_session_t *session,
const char *mod_name,
const char *grammar, const char *name, const char *dest, switch_asr_handle_t *ah)
@@ -3360,6 +3438,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech(switch_core_session_t *
return status;
}
+ if ((status = switch_core_event_hook_add_recv_dtmf(session, speech_on_dtmf)) != SWITCH_STATUS_SUCCESS) {
+ switch_ivr_stop_detect_speech(session);
+ return status;
+ }
+
switch_channel_set_private(channel, SWITCH_SPEECH_KEY, sth);
return SWITCH_STATUS_SUCCESS;
diff --git a/src/switch_xml.c b/src/switch_xml.c
index fe6a19949d..964a7694b2 100644
--- a/src/switch_xml.c
+++ b/src/switch_xml.c
@@ -1286,9 +1286,7 @@ static int preprocess_glob(const char *cwd, const char *pattern, int write_fd, i
}
if (glob(pattern, GLOB_NOCHECK, NULL, &glob_data) != 0) {
- if (stderr) {
- fprintf(stderr, "Error including %s\n", pattern);
- }
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error including %s\n", pattern);
goto end;
}
@@ -1299,11 +1297,9 @@ static int preprocess_glob(const char *cwd, const char *pattern, int write_fd, i
*e = '\0';
}
if (preprocess(dir_path, glob_data.gl_pathv[n], write_fd, rlevel) < 0) {
- const char *reason = strerror(errno);
if (rlevel > 100) {
- reason = "Maximum recursion limit reached";
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error including %s (Maximum recursion limit reached)\n", pattern);
}
- fprintf(stderr, "Error including %s (%s)\n", pattern, reason);
}
free(dir_path);
}