From 78fbece8865c2bbd5129401a0b452878536d46f8 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 23 Apr 2010 17:34:57 -0400 Subject: [PATCH 1/7] Added signalling state handle for boost modules --- libs/freetdm/mod_freetdm/mod_freetdm.c | 18 ++++++++++++++++++ libs/freetdm/src/ftdm_io.c | 8 +++++--- .../ftmod_sangoma_boost/ftmod_sangoma_boost.c | 17 +++++++++-------- libs/freetdm/src/include/ftdm_types.h | 1 + 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index fc3f1c4ca9..269908ba27 100644 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1950,6 +1950,16 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal) sigmsg->channel->span_id, sigmsg->channel->chan_id, (uuid) ? uuid : "N/A"); } } + break; + case FTDM_SIGEVENT_SIGSTATUS_CHANGED: + { + if (*((ftdm_signaling_status_t*)(sigmsg->raw_data)) == FTDM_SIG_STATE_UP) { + ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP); + } else { + ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP); + } + } + break; default: { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unhandled msg type %d for channel %d:%d\n", @@ -2992,6 +3002,8 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre "chan_id: %u\n" "physical_span_id: %u\n" "physical_chan_id: %u\n" + "physical_state: %s\n" + "signaling_state: %s\n" "type: %s\n" "state: %s\n" "last_state: %s\n" @@ -3009,6 +3021,8 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre span->channels[chan_id]->chan_id, span->channels[chan_id]->physical_span_id, span->channels[chan_id]->physical_chan_id, + (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP", + ftdm_test_flag(span->channels[chan_id], FTDM_CHANNEL_SIG_UP) ? "UP" : "DOWN", ftdm_chan_type2str(span->channels[chan_id]->type), ftdm_channel_state2str(span->channels[chan_id]->state), ftdm_channel_state2str(span->channels[chan_id]->last_state), @@ -3037,6 +3051,8 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t * " %u>\n" " %u\n" " %u\n" + " %s\n" + " %s\n" " %s\n" " %s\n" " %s\n" @@ -3055,6 +3071,8 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t * span->channels[chan_id]->chan_id, span->channels[chan_id]->physical_span_id, span->channels[chan_id]->physical_chan_id, + (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP", + ftdm_test_flag(span->channels[chan_id], FTDM_CHANNEL_SIG_UP) ? "UP" : "DOWN", ftdm_chan_type2str(span->channels[chan_id]->type), ftdm_channel_state2str(span->channels[chan_id]->state), ftdm_channel_state2str(span->channels[chan_id]->last_state), diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index f00e7988e3..86fbd88da4 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -1279,9 +1279,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_group(uint32_t group_id, ftdm_dir if (!(check = group->channels[i])) { status = FTDM_FAIL; break; - } + } - if (ftdm_test_flag(check, FTDM_CHANNEL_READY) && + if (ftdm_test_flag(check, FTDM_CHANNEL_READY) && + ftdm_test_flag(check, FTDM_CHANNEL_SIG_UP) && !ftdm_test_flag(check, FTDM_CHANNEL_INUSE) && !ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) && !ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) && @@ -1401,7 +1402,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_span(uint32_t span_id, ftdm_direc break; } - if (ftdm_test_flag(check, FTDM_CHANNEL_READY) && + if (ftdm_test_flag(check, FTDM_CHANNEL_READY) && + ftdm_test_flag(check, FTDM_CHANNEL_SIG_UP) && !ftdm_test_flag(check, FTDM_CHANNEL_INUSE) && !ftdm_test_flag(check, FTDM_CHANNEL_SUSPENDED) && !ftdm_test_flag(check, FTDM_CHANNEL_IN_ALARM) && diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c index a45c5189d3..ef641deb51 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c @@ -2119,6 +2119,7 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_boost_destroy) static ftdm_status_t ftdm_sangoma_boost_start(ftdm_span_t *span) { int err; + ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data; ftdm_set_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING); err=ftdm_thread_create_detached(ftdm_sangoma_boost_run, span); @@ -2137,23 +2138,23 @@ static ftdm_status_t ftdm_sangoma_boost_start(ftdm_span_t *span) static ftdm_status_t ftdm_sangoma_boost_stop(ftdm_span_t *span) { + int cnt = 10; ftdm_status_t status = FTDM_SUCCESS; ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data; if (sangoma_boost_data->sigmod) { + + /* FIXME: we should make sure the span thread is stopped (use pthread_kill or freetdm thread kill function) */ /* I think stopping the span before destroying the queue makes sense otherwise may be boost events would still arrive when the queue is already destroyed! */ status = sangoma_boost_data->sigmod->stop_span(span); ftdm_queue_enqueue(sangoma_boost_data->boost_queue, NULL); - } - - while (ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING)) { - ftdm_log(FTDM_LOG_DEBUG, "Waiting for boost thread\n"); - ftdm_sleep(100); - } - - if (sangoma_boost_data->sigmod) { + while(ftdm_test_flag(sangoma_boost_data, FTDM_SANGOMA_BOOST_RUNNING) && cnt-- > 0) { + ftdm_log(FTDM_LOG_DEBUG, "Waiting for boost thread\n"); + ftdm_sleep(500); + } ftdm_queue_destroy(&sangoma_boost_data->boost_queue); + return status; } return status; } diff --git a/libs/freetdm/src/include/ftdm_types.h b/libs/freetdm/src/include/ftdm_types.h index bf7720efd1..90562104db 100644 --- a/libs/freetdm/src/include/ftdm_types.h +++ b/libs/freetdm/src/include/ftdm_types.h @@ -415,6 +415,7 @@ typedef enum { FTDM_CHANNEL_USE_RX_GAIN = (1 << 25), FTDM_CHANNEL_USE_TX_GAIN = (1 << 26), FTDM_CHANNEL_IN_ALARM = (1 << 27), + FTDM_CHANNEL_SIG_UP = (1 << 28), } ftdm_channel_flag_t; #if defined(__cplusplus) && defined(WIN32) // fix C2676 From 318866b7f95a5d8119073198a5379f3d9ea02b62 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 27 Apr 2010 14:32:36 -0400 Subject: [PATCH 2/7] freetdm: Added signalling status report Fix for ftmod_libpri not reporting proper physical and protocol alarms on init --- libs/freetdm/mod_freetdm/mod_freetdm.c | 11 ++- libs/freetdm/src/ftdm_io.c | 99 +++++++++++++------ .../src/ftmod/ftmod_analog/ftmod_analog.c | 29 ++++++ .../ftmod/ftmod_analog_em/ftmod_analog_em.c | 28 ++++++ .../src/ftmod/ftmod_libpri/ftmod_libpri.c | 79 ++++++++++++++- .../src/ftmod/ftmod_libpri/lpwrap_pri.c | 2 +- libs/freetdm/src/include/freetdm.h | 11 +++ libs/freetdm/src/include/ftdm_types.h | 1 + 8 files changed, 221 insertions(+), 39 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 269908ba27..733ee84781 100644 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -25,6 +25,7 @@ * * Anthony Minessale II * Moises Silva + * David Yat Sin * * * mod_freetdm.c -- FreeTDM Endpoint Module @@ -3002,8 +3003,8 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre "chan_id: %u\n" "physical_span_id: %u\n" "physical_chan_id: %u\n" - "physical_state: %s\n" - "signaling_state: %s\n" + "physical_status: %s\n" + "signaling_status: %s\n" "type: %s\n" "state: %s\n" "last_state: %s\n" @@ -3051,8 +3052,8 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t * " %u>\n" " %u\n" " %u\n" - " %s\n" - " %s\n" + " %s\n" + " %s\n" " %s\n" " %s\n" " %s\n" @@ -3186,7 +3187,7 @@ SWITCH_STANDARD_API(ft_function) stream->write_function(stream, "+OK\n" "span: %u (%s)\n" - "type: %s\n" + "type: %s\n" "signaling_status: %s\n" "chan_count: %u\n" "dialplan: %s\n" diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 86fbd88da4..ae4385c0a3 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -143,6 +143,8 @@ FTDM_STR2ENUM(ftdm_str2ftdm_chan_type, ftdm_chan_type2str, ftdm_chan_type_t, CHA FTDM_ENUM_NAMES(SIGNALING_STATUS_NAMES, SIGSTATUS_STRINGS) FTDM_STR2ENUM(ftdm_str2ftdm_signaling_status, ftdm_signaling_status2str, ftdm_signaling_status_t, SIGNALING_STATUS_NAMES, FTDM_SIG_STATE_INVALID) +static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name); + static const char *cut_path(const char *in) { const char *p, *ret = in; @@ -775,7 +777,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_add_channel(ftdm_span_t *span, ftdm_socket_t i++; } - ftdm_set_flag(new_chan, FTDM_CHANNEL_CONFIGURED | FTDM_CHANNEL_READY); + ftdm_set_flag(new_chan, FTDM_CHANNEL_CONFIGURED | FTDM_CHANNEL_READY); *chan = new_chan; return FTDM_SUCCESS; } @@ -2853,26 +2855,71 @@ FT_DECLARE(char *) ftdm_api_execute(const char *type, const char *cmd) return rval; } -static void ftdm_set_channels_gains(ftdm_span_t *span, int currindex, float rxgain, float txgain) +static ftdm_status_t ftdm_set_channels_gains(ftdm_span_t *span, int currindex, float rxgain, float txgain) { unsigned chan_index = 0; if (!span->chan_count) { - return; + ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set gains because span has no channels\n"); + return FTDM_FAIL; } for (chan_index = currindex+1; chan_index <= span->chan_count; chan_index++) { if (!FTDM_IS_VOICE_CHANNEL(span->channels[chan_index])) { continue; } - ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_RX_GAIN, &rxgain); - ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_TX_GAIN, &txgain); + if (ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_RX_GAIN, &rxgain) != FTDM_SUCCESS) { + return FTDM_FAIL; + } + if (ftdm_channel_command(span->channels[chan_index], FTDM_COMMAND_SET_TX_GAIN, &txgain) != FTDM_SUCCESS) { + return FTDM_FAIL; + } } + return FTDM_SUCCESS; +} + +static ftdm_status_t ftdm_set_channels_alarms(ftdm_span_t *span, int currindex) { + unsigned chan_index = 0; + + if (!span->chan_count) { + ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set alarms because span has no channels\n"); + return FTDM_FAIL; + } + + if (!span->fio->get_alarms) { + ftdm_log(FTDM_LOG_WARNING, "%d: Span does not support alarms\n", span->span_id); + return FTDM_SUCCESS; + } + + for (chan_index = currindex+1; chan_index <= span->chan_count; chan_index++) { + /* fio->get_alarms will update ftdm_chan->alarm_flags */ + if (span->fio->get_alarms(span->channels[chan_index]) != FTDM_SUCCESS) { + ftdm_log(FTDM_LOG_ERROR, "%d:%d: Failed to get alarms\n", span->channels[chan_index]->physical_span_id, span->channels[chan_index]->physical_chan_id); + return FTDM_FAIL; + } + } + return FTDM_SUCCESS; } +FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, int currindex, ftdm_channel_config_t *chan_config) +{ + if (ftdm_group_add_channels(span, currindex, chan_config->group_name) != FTDM_SUCCESS) { + ftdm_log(FTDM_LOG_ERROR, "%d:Failed to add channels to group %s\n", span->span_id, chan_config->group_name); + return FTDM_FAIL; + } + if (ftdm_set_channels_alarms(span, currindex) != FTDM_SUCCESS) { + ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set channel alarms\n", span->span_id); + return FTDM_FAIL; + } + if (ftdm_set_channels_gains(span, currindex, chan_config->rxgain, chan_config->txgain) != FTDM_SUCCESS) { + ftdm_log(FTDM_LOG_ERROR, "%d:Failed to set channel gains\n", span->span_id); + return FTDM_FAIL; + } + return FTDM_SUCCESS; +} + -static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex); static ftdm_status_t load_config(void) { char cfg_name[] = "freetdm.conf"; @@ -2883,14 +2930,15 @@ static ftdm_status_t load_config(void) int currindex = 0; ftdm_span_t *span = NULL; unsigned configured = 0, d = 0; - char name[80] = ""; + char name[FTDM_MAX_NAME_STR_SZ] = ""; char number[25] = ""; - char group_name[80] = "default"; ftdm_io_interface_t *fio = NULL; ftdm_analog_start_type_t tmp; - float rxgain = 0.0; - float txgain = 0.0; ftdm_size_t len = 0; + ftdm_channel_config_t chan_config; + + memset(&chan_config, 0, sizeof(chan_config)); + sprintf(chan_config.group_name,"default"); if (!ftdm_config_open_file(&cfg, cfg_name)) { return FTDM_FAIL; @@ -2997,8 +3045,7 @@ static ftdm_status_t load_config(void) if (span->trunk_type == FTDM_TRUNK_FXO) { currindex = span->chan_count; configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXO, name, number); - ftdm_set_channels_gains(span, currindex, rxgain, txgain); - ftdm_group_add_channels(group_name, span, currindex); + ftdm_configure_span_channels(span, currindex, &chan_config); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXO channels to an FXS trunk!\n"); } @@ -3011,8 +3058,7 @@ static ftdm_status_t load_config(void) if (span->trunk_type == FTDM_TRUNK_FXS) { currindex = span->chan_count; configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXS, name, number); - ftdm_set_channels_gains(span, currindex, rxgain, txgain); - ftdm_group_add_channels(group_name, span, currindex); + ftdm_configure_span_channels(span, currindex, &chan_config); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXS channels to an FXO trunk!\n"); } @@ -3025,16 +3071,14 @@ static ftdm_status_t load_config(void) if (span->trunk_type == FTDM_TRUNK_EM) { currindex = span->chan_count; configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_EM, name, number); - ftdm_set_channels_gains(span, currindex, rxgain, txgain); - ftdm_group_add_channels(group_name, span, currindex); + ftdm_configure_span_channels(span, currindex, &chan_config); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n"); } } else if (!strcasecmp(var, "b-channel")) { currindex = span->chan_count; configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_B, name, number); - ftdm_set_channels_gains(span, currindex, rxgain, txgain); - ftdm_group_add_channels(group_name, span, currindex); + ftdm_configure_span_channels(span, currindex, &chan_config); } else if (!strcasecmp(var, "d-channel")) { if (d) { ftdm_log(FTDM_LOG_WARNING, "ignoring extra d-channel\n"); @@ -3051,28 +3095,27 @@ static ftdm_status_t load_config(void) } } else if (!strcasecmp(var, "cas-channel")) { currindex = span->chan_count; - configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_CAS, name, number); - ftdm_set_channels_gains(span, currindex, rxgain, txgain); - ftdm_group_add_channels(group_name, span, currindex); + configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_CAS, name, number); + ftdm_configure_span_channels(span, currindex, &chan_config); } else if (!strcasecmp(var, "dtmf_hangup")) { span->dtmf_hangup = ftdm_strdup(val); span->dtmf_hangup_len = strlen(val); } else if (!strcasecmp(var, "txgain")) { - if (sscanf(val, "%f", &txgain) != 1) { + if (sscanf(val, "%f", &(chan_config.txgain)) != 1) { ftdm_log(FTDM_LOG_ERROR, "invalid txgain: '%s'\n", val); } } else if (!strcasecmp(var, "rxgain")) { - if (sscanf(val, "%f", &rxgain) != 1) { + if (sscanf(val, "%f", &(chan_config.rxgain)) != 1) { ftdm_log(FTDM_LOG_ERROR, "invalid rxgain: '%s'\n", val); } } else if (!strcasecmp(var, "group")) { len = strlen(val); - if (len >= sizeof(group_name)) { - len = sizeof(group_name) - 1; + if (len >= FTDM_MAX_NAME_STR_SZ) { + len = FTDM_MAX_NAME_STR_SZ - 1; ftdm_log(FTDM_LOG_WARNING, "Truncating group name %s to %zd length\n", val, len); } - memcpy(group_name, val, len); - group_name[len] = '\0'; + memcpy(chan_config.group_name, val, len); + chan_config.group_name[len] = '\0'; } else { ftdm_log(FTDM_LOG_ERROR, "unknown span variable '%s'\n", var); } @@ -3529,7 +3572,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_remove_from_group(ftdm_group_t* group, ft return FTDM_FAIL; } -static ftdm_status_t ftdm_group_add_channels(const char* name, ftdm_span_t* span, int currindex) +static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name) { unsigned chan_index = 0; diff --git a/libs/freetdm/src/ftmod/ftmod_analog/ftmod_analog.c b/libs/freetdm/src/ftmod/ftmod_analog/ftmod_analog.c index c71b19d202..c7ad6b9870 100644 --- a/libs/freetdm/src/ftmod/ftmod_analog/ftmod_analog.c +++ b/libs/freetdm/src/ftmod/ftmod_analog/ftmod_analog.c @@ -84,6 +84,32 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(analog_fxs_outgoing_call) return FTDM_SUCCESS; } +/** + * \brief Returns the signalling status on a channel + * \param ftdmchan Channel to get status on + * \param status Pointer to set signalling status + * \return Success or failure + */ + +static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(analog_get_channel_sig_status) +{ + *status = FTDM_SIG_STATE_UP; + return FTDM_SUCCESS; +} + +/** + * \brief Returns the signalling status on a span + * \param span Span to get status on + * \param status Pointer to set signalling status + * \return Success or failure + */ + +static FIO_SPAN_GET_SIG_STATUS_FUNCTION(analog_get_span_sig_status) +{ + *status = FTDM_SIG_STATE_UP; + return FTDM_SUCCESS; +} + /** * \brief Starts an analog span thread (monitor) * \param span Span to monitor @@ -181,6 +207,9 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_analog_configure_span) span->signal_type = FTDM_SIGTYPE_ANALOG; span->signal_data = analog_data; span->outgoing_call = span->trunk_type == FTDM_TRUNK_FXS ? analog_fxs_outgoing_call : analog_fxo_outgoing_call; + span->get_channel_sig_status = analog_get_channel_sig_status; + span->get_span_sig_status = analog_get_span_sig_status; + ftdm_span_load_tones(span, tonemap); return FTDM_SUCCESS; diff --git a/libs/freetdm/src/ftmod/ftmod_analog_em/ftmod_analog_em.c b/libs/freetdm/src/ftmod/ftmod_analog_em/ftmod_analog_em.c index bb11798c68..146bcb9ea4 100644 --- a/libs/freetdm/src/ftmod/ftmod_analog_em/ftmod_analog_em.c +++ b/libs/freetdm/src/ftmod/ftmod_analog_em/ftmod_analog_em.c @@ -82,6 +82,32 @@ static ftdm_status_t ftdm_analog_em_start(ftdm_span_t *span) return ftdm_thread_create_detached(ftdm_analog_em_run, span); } +/** + * \brief Returns the signalling status on a channel + * \param ftdmchan Channel to get status on + * \param status Pointer to set signalling status + * \return Success or failure + */ + +static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(analog_em_get_channel_sig_status) +{ + *status = FTDM_SIG_STATE_UP; + return FTDM_SUCCESS; +} + +/** + * \brief Returns the signalling status on a span + * \param span Span to get status on + * \param status Pointer to set signalling status + * \return Success or failure + */ + +static FIO_SPAN_GET_SIG_STATUS_FUNCTION(analog_em_get_span_sig_status) +{ + *status = FTDM_SIG_STATE_UP; + return FTDM_SUCCESS; +} + /** * \brief Initialises an EM span from configuration variables * \param span Span to configure @@ -149,6 +175,8 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_analog_em_configure_span) span->signal_type = FTDM_SIGTYPE_ANALOG; span->signal_data = analog_data; span->outgoing_call = analog_em_outgoing_call; + span->get_channel_sig_status = analog_em_get_channel_sig_status; + span->get_span_sig_status = analog_em_get_span_sig_status; ftdm_span_load_tones(span, tonemap); return FTDM_SUCCESS; diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c index 871769e49e..be9313f1ca 100644 --- a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c +++ b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c @@ -43,6 +43,43 @@ static FIO_IO_UNLOAD_FUNCTION(ftdm_libpri_unload) return FTDM_SUCCESS; } +/** + * \brief Returns the signalling status on a channel + * \param ftdmchan Channel to get status on + * \param status Pointer to set signalling status + * \return Success or failure + */ + +static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(isdn_get_channel_sig_status) +{ + *status = FTDM_SIG_STATE_DOWN; + + ftdm_libpri_data_t *isdn_data = ftdmchan->span->signal_data; + if (ftdm_test_flag(&(isdn_data->spri), LPWRAP_PRI_READY)) { + *status = FTDM_SIG_STATE_UP; + } + return FTDM_SUCCESS; +} + +/** + * \brief Returns the signalling status on a span + * \param span Span to get status on + * \param status Pointer to set signalling status + * \return Success or failure + */ + +static FIO_SPAN_GET_SIG_STATUS_FUNCTION(isdn_get_span_sig_status) +{ + *status = FTDM_SIG_STATE_DOWN; + + ftdm_libpri_data_t *isdn_data = span->signal_data; + if (ftdm_test_flag(&(isdn_data->spri), LPWRAP_PRI_READY)) { + *status = FTDM_SIG_STATE_UP; + } + return FTDM_SUCCESS; +} + + /** * \brief Starts a libpri channel (outgoing call) * \param ftdmchan Channel to initiate call on @@ -937,13 +974,27 @@ static int on_restart(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_eve */ static int on_dchan_up(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent) { - if (!ftdm_test_flag(spri, LPWRAP_PRI_READY)) { + ftdm_signaling_status_t status = FTDM_SIG_STATE_UP; + ftdm_channel_t *ftdmchan = NULL; + ftdm_sigmsg_t sig; + int i; ftdm_log(FTDM_LOG_INFO, "Span %d D-Chan UP!\n", spri->span->span_id); ftdm_set_flag(spri, LPWRAP_PRI_READY); ftdm_set_state_all(spri->span, FTDM_CHANNEL_STATE_RESTART); - } + ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", spri->span->span_id, ftdm_signaling_status2str(status)); + for(i=1; i <= spri->span->chan_count; i++) { + ftdmchan = spri->span->channels[i]; + memset(&sig, 0, sizeof(sig)); + sig.chan_id = ftdmchan->chan_id; + sig.span_id = ftdmchan->span_id; + sig.channel = ftdmchan; + sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED; + sig.raw_data = &status; + ftdm_span_send_signal(spri->span, &sig); + } + } return 0; } @@ -955,13 +1006,28 @@ static int on_dchan_up(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_ev * \return 0 */ static int on_dchan_down(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent) -{ - +{ if (ftdm_test_flag(spri, LPWRAP_PRI_READY)) { + ftdm_signaling_status_t status = FTDM_SIG_STATE_DOWN; + ftdm_channel_t *ftdmchan = NULL; + ftdm_sigmsg_t sig; + int i; ftdm_log(FTDM_LOG_INFO, "Span %d D-Chan DOWN!\n", spri->span->span_id); ftdm_clear_flag(spri, LPWRAP_PRI_READY); ftdm_set_state_all(spri->span, FTDM_CHANNEL_STATE_RESTART); - + + + ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", spri->span->span_id, ftdm_signaling_status2str(status)); + for(i=1; i <= spri->span->chan_count; i++) { + ftdmchan = spri->span->channels[i]; + memset(&sig, 0, sizeof(sig)); + sig.chan_id = ftdmchan->chan_id; + sig.span_id = ftdmchan->span_id; + sig.channel = ftdmchan; + sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED; + sig.raw_data = &status; + ftdm_span_send_signal(spri->span, &sig); + } } return 0; @@ -1329,6 +1395,9 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_libpri_configure_span) span->signal_type = FTDM_SIGTYPE_ISDN; span->outgoing_call = isdn_outgoing_call; + span->get_channel_sig_status = isdn_get_channel_sig_status; + span->get_span_sig_status = isdn_get_span_sig_status; + if ((isdn_data->opts & FTMOD_LIBPRI_OPT_SUGGEST_CHANNEL)) { span->channel_request = isdn_channel_request; ftdm_set_flag(span, FTDM_SPAN_SUGGEST_CHAN_ID); diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c b/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c index de6a311ef9..2a9f1b77c2 100644 --- a/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c +++ b/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c @@ -182,7 +182,7 @@ int lpwrap_init_pri(struct lpwrap_pri *spri, ftdm_span_t *span, ftdm_channel_t * size_t buflen = sizeof(buf), len = 0; pri_set_debug(spri->pri, debug); ret = 0; - ftdm_set_flag(spri, LPWRAP_PRI_READY); + ftdm_channel_write(spri->dchan, buf, buflen, &len); } else { fprintf(stderr, "Unable to create PRI\n"); diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index a924e3587a..870d9bce11 100644 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -198,6 +198,8 @@ extern "C" { #define FTDM_MAX_CHANNELS_GROUP 1024 #define FTDM_MAX_GROUPS_INTERFACE FTDM_MAX_SPANS_INTERFACE +#define FTDM_MAX_NAME_STR_SZ 80 + #define GOTO_STATUS(label,st) status = st; goto label ; #define ftdm_copy_string(x,y,z) strncpy(x, y, z - 1) @@ -611,6 +613,12 @@ struct ftdm_channel { float txgain; }; +struct ftdm_channel_config { + char group_name[FTDM_MAX_NAME_STR_SZ]; + float rxgain; + float txgain; +}; + struct ftdm_sigmsg { ftdm_signal_event_t event_id; @@ -831,6 +839,9 @@ FT_DECLARE(ftdm_status_t) ftdm_conf_node_create(const char *name, ftdm_conf_node FT_DECLARE(ftdm_status_t) ftdm_conf_node_add_param(ftdm_conf_node_t *node, const char *param, const char *val); FT_DECLARE(ftdm_status_t) ftdm_conf_node_destroy(ftdm_conf_node_t *node); + +FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, int currindex, ftdm_channel_config_t *chan_config); + FIO_CODEC_FUNCTION(fio_slin2ulaw); FIO_CODEC_FUNCTION(fio_ulaw2slin); FIO_CODEC_FUNCTION(fio_slin2alaw); diff --git a/libs/freetdm/src/include/ftdm_types.h b/libs/freetdm/src/include/ftdm_types.h index 938f61805d..3230d3c66f 100644 --- a/libs/freetdm/src/include/ftdm_types.h +++ b/libs/freetdm/src/include/ftdm_types.h @@ -468,6 +468,7 @@ typedef struct ftdm_conf_parameter_s { } ftdm_conf_parameter_t; typedef struct ftdm_channel ftdm_channel_t; +typedef struct ftdm_channel_config ftdm_channel_config_t; typedef struct ftdm_event ftdm_event_t; typedef struct ftdm_sigmsg ftdm_sigmsg_t; typedef struct ftdm_span ftdm_span_t; From 72a8517d7163145701a3eff46f20b02848907c63 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 27 Apr 2010 16:12:22 -0400 Subject: [PATCH 3/7] freetdm: fio->configure_span moved inside ftdm_configure_span_channels function --- libs/freetdm/src/ftdm_io.c | 38 +++++++++++------------------- libs/freetdm/src/include/freetdm.h | 5 +++- 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index ae4385c0a3..88a3462fba 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2902,8 +2902,11 @@ static ftdm_status_t ftdm_set_channels_alarms(ftdm_span_t *span, int currindex) } -FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, int currindex, ftdm_channel_config_t *chan_config) +FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char* str, ftdm_channel_config_t *chan_config, ftdm_chan_type_t type, unsigned *configured) { + int currindex = span->chan_count; + *configured += span->fio->configure_span(span, str, type, chan_config->name, chan_config->number); + if (ftdm_group_add_channels(span, currindex, chan_config->group_name) != FTDM_SUCCESS) { ftdm_log(FTDM_LOG_ERROR, "%d:Failed to add channels to group %s\n", span->span_id, chan_config->group_name); return FTDM_FAIL; @@ -2927,11 +2930,8 @@ static ftdm_status_t load_config(void) char *var, *val; int catno = -1; int intparam = 0; - int currindex = 0; ftdm_span_t *span = NULL; unsigned configured = 0, d = 0; - char name[FTDM_MAX_NAME_STR_SZ] = ""; - char number[25] = ""; ftdm_io_interface_t *fio = NULL; ftdm_analog_start_type_t tmp; ftdm_size_t len = 0; @@ -3017,15 +3017,15 @@ static ftdm_status_t load_config(void) ftdm_log(FTDM_LOG_DEBUG, "setting trunk type to '%s'\n", ftdm_trunk_type2str(span->trunk_type)); } else if (!strcasecmp(var, "name")) { if (!strcasecmp(val, "undef")) { - *name = '\0'; + chan_config.name[0] = '\0'; } else { - ftdm_copy_string(name, val, sizeof(name)); + ftdm_copy_string(chan_config.name, val, FTDM_MAX_NAME_STR_SZ); } } else if (!strcasecmp(var, "number")) { if (!strcasecmp(val, "undef")) { - *number = '\0'; + chan_config.number[0] = '\0'; } else { - ftdm_copy_string(number, val, sizeof(number)); + ftdm_copy_string(chan_config.number, val, FTDM_MAX_NUMBER_STR_SZ); } } else if (!strcasecmp(var, "analog-start-type")) { if (span->trunk_type == FTDM_TRUNK_FXS || span->trunk_type == FTDM_TRUNK_FXO || span->trunk_type == FTDM_TRUNK_EM) { @@ -3043,9 +3043,7 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_FXO) { - currindex = span->chan_count; - configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXO, name, number); - ftdm_configure_span_channels(span, currindex, &chan_config); + ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_FXO, &configured); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXO channels to an FXS trunk!\n"); } @@ -3056,9 +3054,7 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_FXS) { - currindex = span->chan_count; - configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_FXS, name, number); - ftdm_configure_span_channels(span, currindex, &chan_config); + ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_FXS, &configured); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXS channels to an FXO trunk!\n"); } @@ -3069,16 +3065,12 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_EM) { - currindex = span->chan_count; - configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_EM, name, number); - ftdm_configure_span_channels(span, currindex, &chan_config); + ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_EM, &configured); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n"); } } else if (!strcasecmp(var, "b-channel")) { - currindex = span->chan_count; - configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_B, name, number); - ftdm_configure_span_channels(span, currindex, &chan_config); + ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_B, &configured); } else if (!strcasecmp(var, "d-channel")) { if (d) { ftdm_log(FTDM_LOG_WARNING, "ignoring extra d-channel\n"); @@ -3090,13 +3082,11 @@ static ftdm_status_t load_config(void) } else { qtype = FTDM_CHAN_TYPE_DQ921; } - configured += fio->configure_span(span, val, qtype, name, number); + ftdm_configure_span_channels(span, val, &chan_config, qtype, &configured); d++; } } else if (!strcasecmp(var, "cas-channel")) { - currindex = span->chan_count; - configured += fio->configure_span(span, val, FTDM_CHAN_TYPE_CAS, name, number); - ftdm_configure_span_channels(span, currindex, &chan_config); + ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_CAS, &configured); } else if (!strcasecmp(var, "dtmf_hangup")) { span->dtmf_hangup = ftdm_strdup(val); span->dtmf_hangup_len = strlen(val); diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index 870d9bce11..53d8e13fb1 100644 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -199,6 +199,7 @@ extern "C" { #define FTDM_MAX_GROUPS_INTERFACE FTDM_MAX_SPANS_INTERFACE #define FTDM_MAX_NAME_STR_SZ 80 +#define FTDM_MAX_NUMBER_STR_SZ 20 #define GOTO_STATUS(label,st) status = st; goto label ; @@ -614,6 +615,8 @@ struct ftdm_channel { }; struct ftdm_channel_config { + char name[FTDM_MAX_NAME_STR_SZ]; + char number[FTDM_MAX_NUMBER_STR_SZ]; char group_name[FTDM_MAX_NAME_STR_SZ]; float rxgain; float txgain; @@ -840,7 +843,7 @@ FT_DECLARE(ftdm_status_t) ftdm_conf_node_add_param(ftdm_conf_node_t *node, const FT_DECLARE(ftdm_status_t) ftdm_conf_node_destroy(ftdm_conf_node_t *node); -FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, int currindex, ftdm_channel_config_t *chan_config); +FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char *str, ftdm_channel_config_t *chan_config, ftdm_chan_type_t type, unsigned *configured); FIO_CODEC_FUNCTION(fio_slin2ulaw); FIO_CODEC_FUNCTION(fio_ulaw2slin); From 51566afb9855156b1be93a20b3dec3b03051e990 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 27 Apr 2010 17:21:57 -0400 Subject: [PATCH 4/7] freetdm: moved type inside ftdm_configure_span_channels --- libs/freetdm/mod_freetdm/mod_freetdm.c | 6 +-- libs/freetdm/src/ftdm_io.c | 53 +++++++++++++++----------- libs/freetdm/src/include/freetdm.h | 5 ++- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 733ee84781..2f8e4260f6 100644 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1954,10 +1954,10 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal) break; case FTDM_SIGEVENT_SIGSTATUS_CHANGED: { + ftdm_signaling_status_t *sigstatus = (ftdm_signaling_status_t*)(sigmsg->raw_data); if (*((ftdm_signaling_status_t*)(sigmsg->raw_data)) == FTDM_SIG_STATE_UP) { - ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP); - } else { - ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%d:%d signalling changed to :%s\n", + sigmsg->channel->span_id, sigmsg->channel->chan_id, ftdm_signaling_status2str(*sigstatus)); } } break; diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 88a3462fba..8cdeafd323 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2902,10 +2902,10 @@ static ftdm_status_t ftdm_set_channels_alarms(ftdm_span_t *span, int currindex) } -FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char* str, ftdm_channel_config_t *chan_config, ftdm_chan_type_t type, unsigned *configured) +FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char* str, ftdm_channel_config_t *chan_config, unsigned *configured) { int currindex = span->chan_count; - *configured += span->fio->configure_span(span, str, type, chan_config->name, chan_config->number); + *configured += span->fio->configure_span(span, str, chan_config->type, chan_config->name, chan_config->number); if (ftdm_group_add_channels(span, currindex, chan_config->group_name) != FTDM_SUCCESS) { ftdm_log(FTDM_LOG_ERROR, "%d:Failed to add channels to group %s\n", span->span_id, chan_config->group_name); @@ -3043,7 +3043,8 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_FXO) { - ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_FXO, &configured); + chan_config.type = FTDM_CHAN_TYPE_FXO; + ftdm_configure_span_channels(span, val, &chan_config, &configured); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXO channels to an FXS trunk!\n"); } @@ -3054,7 +3055,8 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_FXS) { - ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_FXS, &configured); + chan_config.type = FTDM_CHAN_TYPE_FXS; + ftdm_configure_span_channels(span, val, &chan_config, &configured); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXS channels to an FXO trunk!\n"); } @@ -3065,28 +3067,30 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_EM) { - ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_EM, &configured); + chan_config.type = FTDM_CHAN_TYPE_EM; + ftdm_configure_span_channels(span, val, &chan_config, &configured); } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n"); } } else if (!strcasecmp(var, "b-channel")) { - ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_B, &configured); + chan_config.type = FTDM_CHAN_TYPE_B; + ftdm_configure_span_channels(span, val, &chan_config, &configured); } else if (!strcasecmp(var, "d-channel")) { if (d) { ftdm_log(FTDM_LOG_WARNING, "ignoring extra d-channel\n"); } else { - ftdm_chan_type_t qtype; if (!strncasecmp(val, "lapd:", 5)) { - qtype = FTDM_CHAN_TYPE_DQ931; + chan_config.type = FTDM_CHAN_TYPE_DQ931; val += 5; } else { - qtype = FTDM_CHAN_TYPE_DQ921; + chan_config.type = FTDM_CHAN_TYPE_DQ921; } - ftdm_configure_span_channels(span, val, &chan_config, qtype, &configured); + ftdm_configure_span_channels(span, val, &chan_config, &configured); d++; } } else if (!strcasecmp(var, "cas-channel")) { - ftdm_configure_span_channels(span, val, &chan_config, FTDM_CHAN_TYPE_CAS, &configured); + chan_config.type = FTDM_CHAN_TYPE_CAS; + ftdm_configure_span_channels(span, val, &chan_config, &configured); } else if (!strcasecmp(var, "dtmf_hangup")) { span->dtmf_hangup = ftdm_strdup(val); span->dtmf_hangup_len = strlen(val); @@ -3674,19 +3678,24 @@ FT_DECLARE(ftdm_status_t) ftdm_group_create(ftdm_group_t **group, const char *na FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t *sigmsg) { ftdm_status_t status = FTDM_FAIL; - - if (span->signal_cb) { - if (sigmsg->channel) { - ftdm_mutex_lock(sigmsg->channel->mutex); - } - - status = span->signal_cb(sigmsg); - - if (sigmsg->channel) { - ftdm_mutex_unlock(sigmsg->channel->mutex); - } + if (sigmsg->channel) { + ftdm_mutex_lock(sigmsg->channel->mutex); } + if (sigmsg->event_id == FTDM_SIGEVENT_SIGSTATUS_CHANGED) { + if (*((ftdm_signaling_status_t*)(sigmsg->raw_data)) == FTDM_SIG_STATE_UP) { + ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP); + } else { + ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP); + } + } + if (span->signal_cb) { + status = span->signal_cb(sigmsg); + } + + if (sigmsg->channel) { + ftdm_mutex_unlock(sigmsg->channel->mutex); + } return status; } diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h index 53d8e13fb1..34442aa95a 100644 --- a/libs/freetdm/src/include/freetdm.h +++ b/libs/freetdm/src/include/freetdm.h @@ -614,10 +614,11 @@ struct ftdm_channel { float txgain; }; -struct ftdm_channel_config { +struct ftdm_channel_config { char name[FTDM_MAX_NAME_STR_SZ]; char number[FTDM_MAX_NUMBER_STR_SZ]; char group_name[FTDM_MAX_NAME_STR_SZ]; + ftdm_chan_type_t type; float rxgain; float txgain; }; @@ -843,7 +844,7 @@ FT_DECLARE(ftdm_status_t) ftdm_conf_node_add_param(ftdm_conf_node_t *node, const FT_DECLARE(ftdm_status_t) ftdm_conf_node_destroy(ftdm_conf_node_t *node); -FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char *str, ftdm_channel_config_t *chan_config, ftdm_chan_type_t type, unsigned *configured); +FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char *str, ftdm_channel_config_t *chan_config, unsigned *configured); FIO_CODEC_FUNCTION(fio_slin2ulaw); FIO_CODEC_FUNCTION(fio_ulaw2slin); From 19dca2e3e9f5cb9024192e71a9cf1c96d2517c47 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 27 Apr 2010 16:52:29 -0500 Subject: [PATCH 5/7] add callee id to events and add global param verbose-channel-events and fsctl verbose_events [on|off] to globally configure verbose events --- conf/autoload_configs/switch.conf.xml | 2 + src/include/switch_types.h | 6 +- .../applications/mod_commands/mod_commands.c | 10 +++ src/switch_caller.c | 8 ++ src/switch_channel.c | 6 +- src/switch_core.c | 77 +++++++++++++------ 6 files changed, 82 insertions(+), 27 deletions(-) diff --git a/conf/autoload_configs/switch.conf.xml b/conf/autoload_configs/switch.conf.xml index ff44243303..03bc993372 100644 --- a/conf/autoload_configs/switch.conf.xml +++ b/conf/autoload_configs/switch.conf.xml @@ -72,6 +72,8 @@ + + diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 7e9f6ae42b..a3a9599b62 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -248,7 +248,8 @@ typedef enum { SCF_EARLY_HANGUP = (1 << 7), SCF_CALIBRATE_CLOCK = (1 << 8), SCF_USE_HEAVY_TIMING = (1 << 9), - SCF_USE_CLOCK_RT = (1 << 10) + SCF_USE_CLOCK_RT = (1 << 10), + SCF_VERBOSE_EVENTS = (1 << 11) } switch_core_flag_enum_t; typedef uint32_t switch_core_flag_t; @@ -1494,7 +1495,8 @@ typedef enum { SCSC_CALIBRATE_CLOCK, SCSC_SAVE_HISTORY, SCSC_CRASH, - SCSC_MIN_IDLE_CPU + SCSC_MIN_IDLE_CPU, + SCSC_VERBOSE_EVENTS } switch_session_ctl_t; typedef enum { diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 6dc2d8c913..fa8246d44f 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -1500,6 +1500,16 @@ SWITCH_STANDARD_API(ctl_function) } else if (!strcasecmp(argv[0], "crash")) { switch_core_session_ctl(SCSC_CRASH, NULL); stream->write_function(stream, "+OK\n"); + } else if (!strcasecmp(argv[0], "verbose_events")) { + arg = -1; + if (argv[1]) { + arg = switch_true(argv[1]); + } + + switch_core_session_ctl(SCSC_VERBOSE_EVENTS, &arg); + + stream->write_function(stream, "+OK verbose_events is %s \n", arg ? "on" : "off"); + } else if (!strcasecmp(argv[0], "save_history")) { switch_core_session_ctl(SCSC_SAVE_HISTORY, NULL); stream->write_function(stream, "+OK\n"); diff --git a/src/switch_caller.c b/src/switch_caller.c index 16c03f7144..b611b09ebd 100644 --- a/src/switch_caller.c +++ b/src/switch_caller.c @@ -271,6 +271,14 @@ SWITCH_DECLARE(void) switch_caller_profile_event_set_data(switch_caller_profile_ switch_snprintf(header_name, sizeof(header_name), "%s-Caller-ID-Number", prefix); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, header_name, caller_profile->caller_id_number); } + if (!zstr(caller_profile->callee_id_name)) { + switch_snprintf(header_name, sizeof(header_name), "%s-Callee-ID-Name", prefix); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, header_name, caller_profile->callee_id_name); + } + if (!zstr(caller_profile->callee_id_number)) { + switch_snprintf(header_name, sizeof(header_name), "%s-Callee-ID-Number", prefix); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, header_name, caller_profile->callee_id_number); + } if (!zstr(caller_profile->network_addr)) { switch_snprintf(header_name, sizeof(header_name), "%s-Network-Addr", prefix); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, header_name, caller_profile->network_addr); diff --git a/src/switch_channel.c b/src/switch_channel.c index e08bc4f63a..b826da45d5 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -1677,11 +1677,13 @@ SWITCH_DECLARE(void) switch_channel_event_set_basic_data(switch_channel_t *chann SWITCH_DECLARE(void) switch_channel_event_set_extended_data(switch_channel_t *channel, switch_event_t *event) { switch_event_header_t *hi; - int x; + int x, global_verbos_events = 0; switch_mutex_lock(channel->profile_mutex); - if (switch_channel_test_flag(channel, CF_VERBOSE_EVENTS) || + switch_core_session_ctl(SCSC_VERBOSE_EVENTS, &global_verbos_events); + + if (global_verbos_events || switch_channel_test_flag(channel, CF_VERBOSE_EVENTS) || event->event_id == SWITCH_EVENT_CHANNEL_CREATE || event->event_id == SWITCH_EVENT_CHANNEL_ORIGINATE || event->event_id == SWITCH_EVENT_CHANNEL_UUID || diff --git a/src/switch_core.c b/src/switch_core.c index 78296ebe7b..3dfcdb239f 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1448,6 +1448,13 @@ static void switch_load_core_config(const char *file) switch_time_set_matrix(switch_true(var)); } else if (!strcasecmp(var, "max-sessions") && !zstr(val)) { switch_core_session_limit(atoi(val)); + } else if (!strcasecmp(var, "verbose-channel-events") && !zstr(val)) { + int v = switch_true(val); + if (v) { + switch_set_flag((&runtime), SCF_VERBOSE_EVENTS); + } else { + switch_clear_flag((&runtime), SCF_VERBOSE_EVENTS); + } } else if (!strcasecmp(var, "min-idle-cpu") && !zstr(val)) { switch_core_min_idle_cpu(atof(val)); } else if (!strcasecmp(var, "tipping-point") && !zstr(val)) { @@ -1639,12 +1646,29 @@ SWITCH_DECLARE(uint32_t) switch_core_debug_level(void) SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, void *val) { int *intval = (int *) val; + int oldintval = 0, newintval = 0; + + if (intval) { + oldintval = *intval; + } if (switch_test_flag((&runtime), SCF_SHUTTING_DOWN)) { return -1; } switch (cmd) { + case SCSC_VERBOSE_EVENTS: + if (intval) { + if (oldintval > -1) { + if (oldintval) { + switch_set_flag((&runtime), SCF_VERBOSE_EVENTS); + } else { + switch_clear_flag((&runtime), SCF_VERBOSE_EVENTS); + } + } + newintval = switch_test_flag((&runtime), SCF_VERBOSE_EVENTS); + } + break; case SCSC_CALIBRATE_CLOCK: switch_time_calibrate_clock(); break; @@ -1656,10 +1680,10 @@ SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, void * break; case SCSC_SYNC_CLOCK: switch_time_sync(); - *intval = 0; + newintval = 0; break; case SCSC_PAUSE_INBOUND: - if (*intval) { + if (oldintval) { switch_set_flag((&runtime), SCF_NO_NEW_SESSIONS); } else { switch_clear_flag((&runtime), SCF_NO_NEW_SESSIONS); @@ -1710,7 +1734,7 @@ SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, void * win_shutdown(); #endif - if (*intval) { + if (oldintval) { switch_set_flag((&runtime), SCF_RESTART); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Restarting\n"); } else { @@ -1732,7 +1756,7 @@ SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, void * win_shutdown(); #endif - if (*intval) { + if (oldintval) { switch_set_flag((&runtime), SCF_RESTART); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Restarting\n"); } else { @@ -1744,62 +1768,69 @@ SWITCH_DECLARE(int32_t) switch_core_session_ctl(switch_session_ctl_t cmd, void * runtime.running = 0; break; case SCSC_CHECK_RUNNING: - *intval = runtime.running; + newintval = runtime.running; break; case SCSC_LOGLEVEL: - if (*intval > -1) { - runtime.hard_log_level = *intval; + if (oldintval > -1) { + runtime.hard_log_level = oldintval; } if (runtime.hard_log_level > SWITCH_LOG_DEBUG) { runtime.hard_log_level = SWITCH_LOG_DEBUG; } - *intval = runtime.hard_log_level; + newintval = runtime.hard_log_level; break; case SCSC_DEBUG_LEVEL: - if (*intval > -1) { - if (*intval > 10) - *intval = 10; - runtime.debug_level = *intval; + if (oldintval > -1) { + if (oldintval > 10) + newintval = 10; + runtime.debug_level = oldintval; } - *intval = runtime.debug_level; + newintval = runtime.debug_level; break; case SCSC_MIN_IDLE_CPU: { double *dval = (double *) val; - *dval = switch_core_min_idle_cpu(*dval); + if (dval) { + *dval = switch_core_min_idle_cpu(*dval); + } + intval = NULL; } break; case SCSC_MAX_SESSIONS: - *intval = switch_core_session_limit(*intval); + newintval = switch_core_session_limit(oldintval); break; case SCSC_LAST_SPS: - *intval = runtime.sps_last; + newintval = runtime.sps_last; break; case SCSC_MAX_DTMF_DURATION: - *intval = switch_core_max_dtmf_duration(*intval); + newintval = switch_core_max_dtmf_duration(oldintval); break; case SCSC_MIN_DTMF_DURATION: - *intval = switch_core_min_dtmf_duration(*intval); + newintval = switch_core_min_dtmf_duration(oldintval); break; case SCSC_DEFAULT_DTMF_DURATION: - *intval = switch_core_default_dtmf_duration(*intval); + newintval = switch_core_default_dtmf_duration(oldintval); break; case SCSC_SPS: switch_mutex_lock(runtime.throttle_mutex); - if (*intval > 0) { - runtime.sps_total = *intval; + if (oldintval > 0) { + runtime.sps_total = oldintval; } - *intval = runtime.sps_total; + newintval = runtime.sps_total; switch_mutex_unlock(runtime.throttle_mutex); break; case SCSC_RECLAIM: switch_core_memory_reclaim_all(); - *intval = 0; + newintval = 0; break; } + if (intval) { + *intval = newintval; + } + return 0; } From b135ef373df03800437b51734d205e5967c5bc5e Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 27 Apr 2010 18:20:25 -0400 Subject: [PATCH 6/7] Removed use of ftdmchan->flags from mod_freetdm.c as they will be hidden from user in new architecture --- libs/freetdm/mod_freetdm/mod_freetdm.c | 17 ++++++------ libs/freetdm/src/ftdm_io.c | 38 +++++++++++++++++++++----- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index 2f8e4260f6..a4aa659f5c 100644 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -1955,10 +1955,8 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal) case FTDM_SIGEVENT_SIGSTATUS_CHANGED: { ftdm_signaling_status_t *sigstatus = (ftdm_signaling_status_t*)(sigmsg->raw_data); - if (*((ftdm_signaling_status_t*)(sigmsg->raw_data)) == FTDM_SIG_STATE_UP) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%d:%d signalling changed to :%s\n", - sigmsg->channel->span_id, sigmsg->channel->chan_id, ftdm_signaling_status2str(*sigstatus)); - } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%d:%d signalling changed to :%s\n", + sigmsg->channel->span_id, sigmsg->channel->chan_id, ftdm_signaling_status2str(*sigstatus)); } break; default: @@ -2994,10 +2992,12 @@ static switch_status_t load_config(void) void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream) { + ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN; if (chan_id > span->chan_count) { return; } - + + ftdm_channel_get_sig_status(span->channels[chan_id], &sigstatus); stream->write_function(stream, "span_id: %u\n" "chan_id: %u\n" @@ -3023,7 +3023,7 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre span->channels[chan_id]->physical_span_id, span->channels[chan_id]->physical_chan_id, (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP", - ftdm_test_flag(span->channels[chan_id], FTDM_CHANNEL_SIG_UP) ? "UP" : "DOWN", + ftdm_signaling_status2str(sigstatus), ftdm_chan_type2str(span->channels[chan_id]->type), ftdm_channel_state2str(span->channels[chan_id]->state), ftdm_channel_state2str(span->channels[chan_id]->last_state), @@ -3042,10 +3042,11 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stream) { + ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN; if (chan_id > span->chan_count) { return; } - + ftdm_channel_get_sig_status(span->channels[chan_id], &sigstatus); stream->write_function(stream, " \n" " %u\n" @@ -3073,7 +3074,7 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t * span->channels[chan_id]->physical_span_id, span->channels[chan_id]->physical_chan_id, (span->channels[chan_id]->alarm_flags) ? "DOWN" : "UP", - ftdm_test_flag(span->channels[chan_id], FTDM_CHANNEL_SIG_UP) ? "UP" : "DOWN", + ftdm_signaling_status2str(sigstatus), ftdm_chan_type2str(span->channels[chan_id]->type), ftdm_channel_state2str(span->channels[chan_id]->state), ftdm_channel_state2str(span->channels[chan_id]->last_state), diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c index 8cdeafd323..cac4f15f16 100644 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@ -2905,7 +2905,12 @@ static ftdm_status_t ftdm_set_channels_alarms(ftdm_span_t *span, int currindex) FT_DECLARE(ftdm_status_t) ftdm_configure_span_channels(ftdm_span_t *span, const char* str, ftdm_channel_config_t *chan_config, unsigned *configured) { int currindex = span->chan_count; - *configured += span->fio->configure_span(span, str, chan_config->type, chan_config->name, chan_config->number); + *configured = 0; + *configured = span->fio->configure_span(span, str, chan_config->type, chan_config->name, chan_config->number); + if (!*configured) { + ftdm_log(FTDM_LOG_ERROR, "%d:Failed to configure span", span->span_id); + return FTDM_FAIL; + } if (ftdm_group_add_channels(span, currindex, chan_config->group_name) != FTDM_SUCCESS) { ftdm_log(FTDM_LOG_ERROR, "%d:Failed to add channels to group %s\n", span->span_id, chan_config->group_name); @@ -3043,8 +3048,11 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_FXO) { + unsigned chans_configured = 0; chan_config.type = FTDM_CHAN_TYPE_FXO; - ftdm_configure_span_channels(span, val, &chan_config, &configured); + if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) { + configured += chans_configured; + } } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXO channels to an FXS trunk!\n"); } @@ -3055,8 +3063,11 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_FXS) { + unsigned chans_configured = 0; chan_config.type = FTDM_CHAN_TYPE_FXS; - ftdm_configure_span_channels(span, val, &chan_config, &configured); + if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) { + configured += chans_configured; + } } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add FXS channels to an FXO trunk!\n"); } @@ -3067,30 +3078,43 @@ static ftdm_status_t load_config(void) ftdm_analog_start_type2str(span->start_type)); } if (span->trunk_type == FTDM_TRUNK_EM) { + unsigned chans_configured = 0; chan_config.type = FTDM_CHAN_TYPE_EM; - ftdm_configure_span_channels(span, val, &chan_config, &configured); + if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) { + configured += chans_configured; + } } else { ftdm_log(FTDM_LOG_WARNING, "Cannot add EM channels to a non-EM trunk!\n"); } } else if (!strcasecmp(var, "b-channel")) { + unsigned chans_configured = 0; chan_config.type = FTDM_CHAN_TYPE_B; - ftdm_configure_span_channels(span, val, &chan_config, &configured); + if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) { + configured += chans_configured; + } } else if (!strcasecmp(var, "d-channel")) { if (d) { ftdm_log(FTDM_LOG_WARNING, "ignoring extra d-channel\n"); } else { + unsigned chans_configured = 0; if (!strncasecmp(val, "lapd:", 5)) { chan_config.type = FTDM_CHAN_TYPE_DQ931; val += 5; } else { chan_config.type = FTDM_CHAN_TYPE_DQ921; } - ftdm_configure_span_channels(span, val, &chan_config, &configured); + if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) { + configured += chans_configured; + } d++; } } else if (!strcasecmp(var, "cas-channel")) { + unsigned chans_configured = 0; chan_config.type = FTDM_CHAN_TYPE_CAS; - ftdm_configure_span_channels(span, val, &chan_config, &configured); + + if (ftdm_configure_span_channels(span, val, &chan_config, &chans_configured) == FTDM_SUCCESS) { + configured += chans_configured; + } } else if (!strcasecmp(var, "dtmf_hangup")) { span->dtmf_hangup = ftdm_strdup(val); span->dtmf_hangup_len = strlen(val); From a2dfddd129dc6c9f4433b5b66dc7abd8bcbfe038 Mon Sep 17 00:00:00 2001 From: Christopher Rienzo Date: Wed, 28 Apr 2010 14:46:00 +0100 Subject: [PATCH 7/7] Do not allow timeout when opening MRCP session --- src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c | 27 ++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c index 1ecc1404ce..fc41837660 100644 --- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c +++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c @@ -263,8 +263,7 @@ static switch_status_t audio_queue_destroy(audio_queue_t *queue); * SPEECH_CHANNEL : speech functions common to recognizer and synthesizer */ -/* how long to wait for UniMRCP to process requests */ -#define SPEECH_CHANNEL_TIMEOUT_USEC (30 * 1000000) +#define SPEECH_CHANNEL_TIMEOUT_USEC (5 * 1000000) /** * Type of MRCP channel @@ -836,7 +835,7 @@ static switch_status_t speech_channel_destroy(speech_channel_t *schannel) while (schannel->state != SPEECH_CHANNEL_CLOSED) { if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT && !warned) { warned = 1; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "(%s) MRCP session has not terminated after %d ms\n", schannel->name, SPEECH_CHANNEL_TIMEOUT_USEC / (1000)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "(%s) MRCP session has not terminated after %d ms\n", schannel->name, SPEECH_CHANNEL_TIMEOUT_USEC / (1000)); } } } @@ -907,6 +906,7 @@ static switch_status_t speech_channel_open(speech_channel_t *schannel, profile_t switch_status_t status = SWITCH_STATUS_SUCCESS; mpf_termination_t *termination = NULL; mrcp_resource_type_e resource_type; + int warned = 0; switch_mutex_lock(schannel->mutex); @@ -954,9 +954,11 @@ static switch_status_t speech_channel_open(speech_channel_t *schannel, profile_t } /* wait for channel to be ready */ + warned = 0; while (schannel->state == SPEECH_CHANNEL_CLOSED) { - if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) { - break; + if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT && !warned) { + warned = 1; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "(%s) MRCP session has not opened after %d ms\n", schannel->name, SPEECH_CHANNEL_TIMEOUT_USEC / (1000)); } } if (schannel->state == SPEECH_CHANNEL_READY) { @@ -967,9 +969,11 @@ static switch_status_t speech_channel_open(speech_channel_t *schannel, profile_t status = SWITCH_STATUS_FALSE; } else if (schannel->state == SPEECH_CHANNEL_ERROR) { /* Wait for session to be cleaned up */ + warned = 0; while (schannel->state == SPEECH_CHANNEL_ERROR) { - if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) { - break; + if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT && !warned) { + warned = 1; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "(%s) MRCP session has not cleaned up after %d ms\n", schannel->name, SPEECH_CHANNEL_TIMEOUT_USEC / (1000)); } } if (schannel->state != SPEECH_CHANNEL_CLOSED) { @@ -1046,9 +1050,10 @@ static switch_status_t synth_channel_speak(speech_channel_t *schannel, const cha status = SWITCH_STATUS_FALSE; goto done; } - /* wait for IN PROGRESS */ + /* wait for IN-PROGRESS */ while (schannel->state == SPEECH_CHANNEL_READY) { if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "(%s) Timed out waiting for SPEAK IN-PROGRESS\n", schannel->name); break; } } @@ -1297,7 +1302,7 @@ static switch_status_t speech_channel_stop(speech_channel_t *schannel) } if (schannel->state == SPEECH_CHANNEL_PROCESSING) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Timed out waiting for session to close. Continuing.\n", schannel->name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Timed out waiting for STOP to COMPLETE. Continuing.\n", schannel->name); schannel->state = SPEECH_CHANNEL_ERROR; status = SWITCH_STATUS_FALSE; goto done; @@ -2134,9 +2139,10 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha status = SWITCH_STATUS_FALSE; goto done; } - /* wait for IN PROGRESS */ + /* wait for IN-PROGRESS */ while (schannel->state == SPEECH_CHANNEL_READY) { if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "(%s) Timed out waiting for RECOGNIZE IN-PROGRESS\n", schannel->name); break; } } @@ -2214,6 +2220,7 @@ static switch_status_t recog_channel_load_grammar(speech_channel_t *schannel, co } while (schannel->state == SPEECH_CHANNEL_PROCESSING) { if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "(%s) Timed out waiting for DEFINE-GRAMMAR to COMPLETE\n", schannel->name); break; } }