[Freeswitch-svn] [commit] r9468 - in freeswitch/trunk/src: . mod/applications/mod_fax mod/endpoints/mod_sofia
Freeswitch SVN
anthm at freeswitch.org
Fri Sep 5 16:34:19 EDT 2008
Author: anthm
Date: Fri Sep 5 16:34:18 2008
New Revision: 9468
Modified:
freeswitch/trunk/src/mod/applications/mod_fax/mod_fax.c
freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h
freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c
freeswitch/trunk/src/switch_core_io.c
freeswitch/trunk/src/switch_rtp.c
Log:
cleanup for mod_fax
Modified: freeswitch/trunk/src/mod/applications/mod_fax/mod_fax.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_fax/mod_fax.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_fax/mod_fax.c Fri Sep 5 16:34:18 2008
@@ -14,7 +14,7 @@
* for the specific language governing rights and limitations under the
* License.
*
- * The Original Code is FreeSWITCH mod_timezone.
+ * The Original Code is FreeSWITCH mod_fax.
*
* The Initial Developer of the Original Code is
* Massimo Cetra <devel at navynet.it>
@@ -27,7 +27,7 @@
* Brian West <brian at freeswitch.org>
* Anthony Minessale II <anthmct at yahoo.com>
* Steve Underwood <steveu at coppice.org>
- *
+ * Antonio Gallo <agx at linux.it>
* mod_fax.c -- Fax applications provided by SpanDSP
*
*/
@@ -38,7 +38,7 @@
/*****************************************************************************
OUR DEFINES AND STRUCTS
- *****************************************************************************/
+*****************************************************************************/
typedef enum {
FUNCTION_TX,
@@ -53,43 +53,43 @@
/* The global stuff */
static struct {
- switch_memory_pool_t *pool;
- switch_mutex_t *mutex;
+ switch_memory_pool_t *pool;
+ switch_mutex_t *mutex;
- uint32_t total_sessions;
+ uint32_t total_sessions;
- short int use_ecm;
- short int verbose;
- short int disable_v17;
- char ident[20];
- char header[50];
- char *prepend_string;
- char *spool;
+ short int use_ecm;
+ short int verbose;
+ short int disable_v17;
+ char ident[20];
+ char header[50];
+ char *prepend_string;
+ char *spool;
} globals;
struct pvt_s {
- switch_core_session_t *session;
+ switch_core_session_t *session;
- application_mode_t app_mode;
+ application_mode_t app_mode;
- fax_state_t *fax_state;
- t38_terminal_state_t *t38_state;
+ fax_state_t *fax_state;
+ t38_terminal_state_t *t38_state;
- char *filename;
- char *ident;
- char *header;
+ char *filename;
+ char *ident;
+ char *header;
- int use_ecm;
- int disable_v17;
- int verbose;
- int caller;
+ int use_ecm;
+ int disable_v17;
+ int verbose;
+ int caller;
- int tx_page_start;
- int tx_page_end;
+ int tx_page_start;
+ int tx_page_end;
/* UNUSED AT THE MOMENT
- int enable_t38_reinvite;
- */
+ int enable_t38_reinvite;
+ */
};
@@ -97,9 +97,10 @@
/*****************************************************************************
LOGGING AND HELPER FUNCTIONS
- *****************************************************************************/
+*****************************************************************************/
-static void counter_increment( void ) {
+static void counter_increment(void)
+{
switch_mutex_lock(globals.mutex);
globals.total_sessions++;
switch_mutex_unlock(globals.mutex);
@@ -109,265 +110,265 @@
{
int fs_log_level;
- switch (level)
- {
- case SPAN_LOG_NONE:
- return;
- case SPAN_LOG_ERROR:
- case SPAN_LOG_PROTOCOL_ERROR:
- fs_log_level = SWITCH_LOG_ERROR;
- break;
- case SPAN_LOG_WARNING:
- case SPAN_LOG_PROTOCOL_WARNING:
- fs_log_level = SWITCH_LOG_WARNING;
- break;
- case SPAN_LOG_FLOW:
- case SPAN_LOG_FLOW_2:
- case SPAN_LOG_FLOW_3:
- default: /* SPAN_LOG_DEBUG, SPAN_LOG_DEBUG_2, SPAN_LOG_DEBUG_3 */
- fs_log_level = SWITCH_LOG_DEBUG;
- break;
- }
-
- if ( !switch_strlen_zero(msg) )
- switch_log_printf(SWITCH_CHANNEL_LOG, fs_log_level, "%s", msg );
-
+ switch (level) {
+ case SPAN_LOG_NONE:
+ return;
+ case SPAN_LOG_ERROR:
+ case SPAN_LOG_PROTOCOL_ERROR:
+ fs_log_level = SWITCH_LOG_ERROR;
+ break;
+ case SPAN_LOG_WARNING:
+ case SPAN_LOG_PROTOCOL_WARNING:
+ fs_log_level = SWITCH_LOG_WARNING;
+ break;
+ case SPAN_LOG_FLOW:
+ case SPAN_LOG_FLOW_2:
+ case SPAN_LOG_FLOW_3:
+ default: /* SPAN_LOG_DEBUG, SPAN_LOG_DEBUG_2, SPAN_LOG_DEBUG_3 */
+ fs_log_level = SWITCH_LOG_DEBUG;
+ break;
+ }
+
+ if (!switch_strlen_zero(msg)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, fs_log_level, "%s", msg);
+ }
}
/*
* Called at the end of the document
*/
-static void phase_e_handler(t30_state_t *s, void *user_data, int result)
+static void phase_e_handler(t30_state_t * s, void *user_data, int result)
{
- t30_stats_t t;
- const char *local_ident;
- const char *far_ident;
- switch_core_session_t *session;
- switch_channel_t *chan;
- char *tmp;
+ t30_stats_t t;
+ const char *local_ident;
+ const char *far_ident;
+ switch_core_session_t *session;
+ switch_channel_t *chan;
+ pvt_t *pvt;
+ char *tmp;
+
+ pvt = (pvt_t *) user_data;
+ switch_assert(pvt);
- session = ( switch_core_session_t* ) user_data;
+ session = pvt->session;
switch_assert(session);
chan = switch_core_session_get_channel(session);
switch_assert(chan);
t30_get_transfer_statistics(s, &t);
- local_ident = switch_str_nil( t30_get_tx_ident(s) );
- far_ident = switch_str_nil( t30_get_rx_ident(s) );
+ local_ident = switch_str_nil(t30_get_tx_ident(s));
+ far_ident = switch_str_nil(t30_get_rx_ident(s));
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n");
- if (result == T30_ERR_OK)
- {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax successfully sent.\n");
+ if (result == T30_ERR_OK) {
+
+ if (pvt->app_mode == FUNCTION_TX) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax successfully sent.\n");
+ } else if (pvt->app_mode == FUNCTION_RX) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax successfully received.\n");
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax successfully managed. How ?\n");
+ }
switch_channel_set_variable(chan, "fax_success", "1");
- }
- else
- {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax processing not successful - result (%d) %s.\n", result, t30_completion_code_to_str(result));
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax processing not successful - result (%d) %s.\n", result,
+ t30_completion_code_to_str(result));
switch_channel_set_variable(chan, "fax_success", "0");
}
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Remote station id: %s\n", far_ident );
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Local station id: %s\n", local_ident );
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Remote station id: %s\n", far_ident);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Local station id: %s\n", local_ident);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Pages transferred: %i\n", t.pages_transferred);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Total fax pages: %i\n", t.pages_in_file);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Image resolution: %ix%i\n", t.x_resolution, t.y_resolution);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Transfer Rate: %i\n", t.bit_rate);
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "ECM status %s\n", (t.error_correcting_mode) ? "on" : "off");
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote country: %s\n", switch_str_nil( t30_get_rx_country(s)) );
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote vendor: %s\n", switch_str_nil( t30_get_rx_vendor(s)) );
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote model: %s\n", switch_str_nil( t30_get_rx_model(s)) );
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "ECM status %s\n", (t.error_correcting_mode) ? "on" : "off");
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote country: %s\n", switch_str_nil(t30_get_rx_country(s)));
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote vendor: %s\n", switch_str_nil(t30_get_rx_vendor(s)));
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote model: %s\n", switch_str_nil(t30_get_rx_model(s)));
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n");
/*
- Set our channel variables
- */
+ Set our channel variables
+ */
tmp = switch_mprintf("%i", result);
- if ( tmp ) {
- switch_channel_set_variable(chan, "fax_result_code", tmp );
+ if (tmp) {
+ switch_channel_set_variable(chan, "fax_result_code", tmp);
switch_safe_free(tmp);
}
- switch_channel_set_variable(chan, "fax_result_text", t30_completion_code_to_str(result) );
+ switch_channel_set_variable(chan, "fax_result_text", t30_completion_code_to_str(result));
- switch_channel_set_variable(chan, "fax_ecm_used", (t.error_correcting_mode) ? "on" : "off" );
- switch_channel_set_variable(chan, "fax_local_station_id", local_ident );
- switch_channel_set_variable(chan, "fax_remote_station_id", far_ident );
+ switch_channel_set_variable(chan, "fax_ecm_used", (t.error_correcting_mode) ? "on" : "off");
+ switch_channel_set_variable(chan, "fax_local_station_id", local_ident);
+ switch_channel_set_variable(chan, "fax_remote_station_id", far_ident);
tmp = switch_mprintf("%i", t.pages_transferred);
- if ( tmp ) {
+ if (tmp) {
switch_channel_set_variable(chan, "fax_document_transferred_pages", tmp);
switch_safe_free(tmp);
}
tmp = switch_mprintf("%i", t.pages_in_file);
- if ( tmp ) {
- switch_channel_set_variable(chan, "fax_document_total_pages", tmp );
+ if (tmp) {
+ switch_channel_set_variable(chan, "fax_document_total_pages", tmp);
switch_safe_free(tmp);
}
tmp = switch_mprintf("%ix%i", t.x_resolution, t.y_resolution);
- if ( tmp ) {
- switch_channel_set_variable(chan, "fax_image_resolution", tmp );
+ if (tmp) {
+ switch_channel_set_variable(chan, "fax_image_resolution", tmp);
switch_safe_free(tmp);
}
tmp = switch_mprintf("%d", t.image_size);
- if ( tmp ) {
- switch_channel_set_variable(chan, "fax_image_size", tmp );
+ if (tmp) {
+ switch_channel_set_variable(chan, "fax_image_size", tmp);
switch_safe_free(tmp);
}
tmp = switch_mprintf("%d", t.bad_rows);
- if ( tmp ) {
- switch_channel_set_variable(chan, "fax_bad_rows", tmp );
+ if (tmp) {
+ switch_channel_set_variable(chan, "fax_bad_rows", tmp);
switch_safe_free(tmp);
}
tmp = switch_mprintf("%i", t.bit_rate);
- if ( tmp ) {
- switch_channel_set_variable(chan, "fax_transfer_rate", tmp );
+ if (tmp) {
+ switch_channel_set_variable(chan, "fax_transfer_rate", tmp);
switch_safe_free(tmp);
}
/*
- TODO Fire events
- */
+ TODO Fire events
+ */
}
-static switch_status_t spanfax_init( pvt_t *pvt, transport_mode_t trans_mode )
+static switch_status_t spanfax_init(pvt_t * pvt, transport_mode_t trans_mode)
{
- switch_core_session_t *session;
- switch_channel_t *chan;
- fax_state_t *fax;
+ switch_core_session_t *session;
+ switch_channel_t *chan;
+ fax_state_t *fax;
- session = ( switch_core_session_t* ) pvt->session;
+ session = (switch_core_session_t *) pvt->session;
switch_assert(session);
chan = switch_core_session_get_channel(session);
switch_assert(chan);
- switch (trans_mode)
- {
- case AUDIO_MODE:
- if ( pvt->fax_state == NULL )
- {
- pvt->fax_state = (fax_state_t *) switch_core_session_alloc( pvt->session, sizeof(fax_state_t) );
- }
- else
- return SWITCH_STATUS_FALSE;
+ switch (trans_mode) {
+ case AUDIO_MODE:
+ if (pvt->fax_state == NULL) {
+ pvt->fax_state = (fax_state_t *) switch_core_session_alloc(pvt->session, sizeof(fax_state_t));
+ } else {
+ return SWITCH_STATUS_FALSE;
+ }
- fax = pvt->fax_state;
+ fax = pvt->fax_state;
- memset(fax, 0, sizeof(fax_state_t));
- if ( fax_init(fax, pvt->caller) == NULL )
- {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot initialize my fax structs\n");
- return SWITCH_STATUS_FALSE;
- }
+ memset(fax, 0, sizeof(fax_state_t));
+ if (fax_init(fax, pvt->caller) == NULL) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot initialize my fax structs\n");
+ return SWITCH_STATUS_FALSE;
+ }
- fax_set_transmit_on_idle(fax, TRUE);
+ fax_set_transmit_on_idle(fax, TRUE);
- span_log_set_message_handler(&fax->logging, spanfax_log_message);
- span_log_set_message_handler(&fax->t30.logging, spanfax_log_message);
+ span_log_set_message_handler(&fax->logging, spanfax_log_message);
+ span_log_set_message_handler(&fax->t30.logging, spanfax_log_message);
- if( pvt->verbose )
- {
- span_log_set_level(&fax->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
- span_log_set_level(&fax->t30.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
- }
+ if (pvt->verbose) {
+ span_log_set_level(&fax->logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
+ span_log_set_level(&fax->t30.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW);
+ }
- t30_set_tx_ident(&fax->t30, pvt->ident );
- t30_set_tx_page_header_info(&fax->t30, pvt->header );
+ t30_set_tx_ident(&fax->t30, pvt->ident);
+ t30_set_tx_page_header_info(&fax->t30, pvt->header);
- t30_set_phase_e_handler(&fax->t30, phase_e_handler, pvt->session);
+ t30_set_phase_e_handler(&fax->t30, phase_e_handler, pvt);
- t30_set_supported_image_sizes(&fax->t30,
- T30_SUPPORT_US_LETTER_LENGTH | T30_SUPPORT_US_LEGAL_LENGTH | T30_SUPPORT_UNLIMITED_LENGTH
- | T30_SUPPORT_215MM_WIDTH | T30_SUPPORT_255MM_WIDTH | T30_SUPPORT_303MM_WIDTH);
- t30_set_supported_resolutions(&fax->t30,
- T30_SUPPORT_STANDARD_RESOLUTION | T30_SUPPORT_FINE_RESOLUTION | T30_SUPPORT_SUPERFINE_RESOLUTION
- | T30_SUPPORT_R8_RESOLUTION | T30_SUPPORT_R16_RESOLUTION);
-
-
- if ( pvt->disable_v17 )
- {
- t30_set_supported_modems(&fax->t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER);
- switch_channel_set_variable(chan, "fax_v17_disabled", "1");
- } else {
- t30_set_supported_modems(&fax->t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER | T30_SUPPORT_V17 );
- switch_channel_set_variable(chan, "fax_v17_disabled", "0");
- }
+ t30_set_supported_image_sizes(&fax->t30,
+ T30_SUPPORT_US_LETTER_LENGTH | T30_SUPPORT_US_LEGAL_LENGTH | T30_SUPPORT_UNLIMITED_LENGTH
+ | T30_SUPPORT_215MM_WIDTH | T30_SUPPORT_255MM_WIDTH | T30_SUPPORT_303MM_WIDTH);
+ t30_set_supported_resolutions(&fax->t30,
+ T30_SUPPORT_STANDARD_RESOLUTION | T30_SUPPORT_FINE_RESOLUTION | T30_SUPPORT_SUPERFINE_RESOLUTION
+ | T30_SUPPORT_R8_RESOLUTION | T30_SUPPORT_R16_RESOLUTION);
- if ( pvt->use_ecm )
- {
- t30_set_supported_compressions(&fax->t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION);
- t30_set_ecm_capability(&fax->t30, TRUE);
- switch_channel_set_variable(chan, "fax_ecm_requested", "1");
- }
- else
- {
- t30_set_supported_compressions(&fax->t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION );
- switch_channel_set_variable(chan, "fax_ecm_requested", "0");
- }
- if ( pvt->app_mode == FUNCTION_TX )
- {
- t30_set_tx_file(&fax->t30, pvt->filename, pvt->tx_page_start, pvt->tx_page_end);
- }
- else
- {
- t30_set_rx_file(&fax->t30, pvt->filename, -1);
- }
- switch_channel_set_variable(chan, "fax_filename", pvt->filename);
- break;
- case T38_MODE:
- /*
- Here goes the T.38 SpanDSP initializing functions
- T.38 will require a big effort as it needs a different approac
- but the pieces are already in place
- */
- default:
- assert(0); /* Whaaat ? */
- break;
- } /* Switch trans mode */
+ if (pvt->disable_v17) {
+ t30_set_supported_modems(&fax->t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER);
+ switch_channel_set_variable(chan, "fax_v17_disabled", "1");
+ } else {
+ t30_set_supported_modems(&fax->t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER | T30_SUPPORT_V17);
+ switch_channel_set_variable(chan, "fax_v17_disabled", "0");
+ }
+
+ if (pvt->use_ecm) {
+ t30_set_supported_compressions(&fax->t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION);
+ t30_set_ecm_capability(&fax->t30, TRUE);
+ switch_channel_set_variable(chan, "fax_ecm_requested", "1");
+ } else {
+ t30_set_supported_compressions(&fax->t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION);
+ switch_channel_set_variable(chan, "fax_ecm_requested", "0");
+ }
+
+ if (pvt->app_mode == FUNCTION_TX) {
+ t30_set_tx_file(&fax->t30, pvt->filename, pvt->tx_page_start, pvt->tx_page_end);
+ } else {
+ t30_set_rx_file(&fax->t30, pvt->filename, -1);
+ }
+ switch_channel_set_variable(chan, "fax_filename", pvt->filename);
+ break;
+ case T38_MODE:
+ /*
+ Here goes the T.38 SpanDSP initializing functions
+ T.38 will require a big effort as it needs a different approac
+ but the pieces are already in place
+ */
+ default:
+ assert(0); /* Whaaat ? */
+ break;
+ } /* Switch trans mode */
return SWITCH_STATUS_SUCCESS;
}
-static switch_status_t spanfax_destroy( pvt_t *pvt ) {
+static switch_status_t spanfax_destroy(pvt_t * pvt)
+{
int terminate;
- if ( pvt->fax_state )
- {
- if ( pvt->t38_state )
+ if (pvt->fax_state) {
+ if (pvt->t38_state) {
terminate = 0;
- else
+ } else {
terminate = 1;
+ }
- if ( terminate && &pvt->fax_state->t30 )
+ if (terminate && &pvt->fax_state->t30) {
t30_terminate(&pvt->fax_state->t30);
+ }
fax_release(pvt->fax_state);
}
- if ( pvt->t38_state )
- {
- if ( pvt->t38_state )
+ if (pvt->t38_state) {
+ if (pvt->t38_state) {
terminate = 1;
- else
+ } else {
terminate = 0;
+ }
- if ( terminate && &pvt->t38_state->t30 )
+ if (terminate && &pvt->t38_state->t30) {
t30_terminate(&pvt->t38_state->t30);
+ }
t38_terminal_release(pvt->t38_state);
}
@@ -377,197 +378,183 @@
/*****************************************************************************
MAIN FAX PROCESSING
- *****************************************************************************/
+*****************************************************************************/
void process_fax(switch_core_session_t *session, const char *data, application_mode_t app_mode)
{
- pvt_t *pvt;
- const char *tmp;
+ pvt_t *pvt;
+ const char *tmp;
- switch_channel_t *channel;
+ switch_channel_t *channel;
- switch_codec_t *orig_read_codec = NULL;
- switch_codec_t read_codec = {0};
- switch_codec_t write_codec = {0};
- switch_frame_t *read_frame = {0};
- switch_frame_t write_frame = {0};
+ switch_codec_t *orig_read_codec = NULL;
+ switch_codec_t read_codec = { 0 };
+ switch_codec_t write_codec = { 0 };
+ switch_frame_t *read_frame = { 0 };
+ switch_frame_t write_frame = { 0 };
- int16_t *buf = NULL;
+ int16_t *buf = NULL;
/* make sure we have a valid channel when starting the FAX application */
channel = switch_core_session_get_channel(session);
switch_assert(channel != NULL);
+ if (!switch_channel_media_ready(channel)) {
+ switch_channel_answer(channel);
+ }
+
/* Allocate our structs */
pvt = switch_core_session_alloc(session, sizeof(pvt_t));
counter_increment();
- if ( !pvt )
- {
+ if (!pvt) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot allocate application private data\n");
return;
- }
- else
- {
- memset( pvt, 0, sizeof(pvt_t) );
+ } else {
+ memset(pvt, 0, sizeof(pvt_t));
- pvt->session = session;
- pvt->app_mode = app_mode;
+ pvt->session = session;
+ pvt->app_mode = app_mode;
- pvt->tx_page_start = -1;
- pvt->tx_page_end = -1;
+ pvt->tx_page_start = -1;
+ pvt->tx_page_end = -1;
- if ( pvt->app_mode == FUNCTION_TX )
+ if (pvt->app_mode == FUNCTION_TX) {
pvt->caller = 1;
- else if ( pvt->app_mode == FUNCTION_RX )
+ } else if (pvt->app_mode == FUNCTION_RX) {
pvt->caller = 0;
- else
- assert(0); /* UH ? */
+ } else {
+ assert(0); /* UH ? */
+ }
}
buf = switch_core_session_alloc(session, SWITCH_RECOMMENDED_BUFFER_SIZE);
- if ( !buf ) {
+ if (!buf) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot allocate application buffer data\n");
return;
}
/* Retrieving our settings from the channel variables */
- if ( (tmp=switch_channel_get_variable(channel, "fax_use_ecm")) ) {
- if ( switch_true(tmp) )
- pvt->use_ecm = 1;
- else
- pvt->use_ecm = 0;
- }
- else
+
+ if ((tmp = switch_channel_get_variable(channel, "fax_use_ecm"))) {
+ pvt->use_ecm = switch_true(tmp);
+ } else {
pvt->use_ecm = globals.use_ecm;
+ }
- if ( (tmp=switch_channel_get_variable(channel, "fax_disable_v17")) ) {
- if ( switch_true(tmp) )
- pvt->disable_v17 = 1;
- else
- pvt->disable_v17 = 0;
- }
- else
+ if ((tmp = switch_channel_get_variable(channel, "fax_disable_v17"))) {
+ pvt->disable_v17 = switch_true(tmp);
+ } else {
pvt->disable_v17 = globals.disable_v17;
+ }
- if ( (tmp=switch_channel_get_variable(channel, "fax_verbose")) ) {
- if ( switch_true(tmp) )
- pvt->verbose = 1;
- else
- pvt->verbose = 0;
- }
- else
+ if ((tmp = switch_channel_get_variable(channel, "fax_verbose"))) {
+ pvt->verbose = switch_true(tmp);
+ } else {
pvt->verbose = globals.verbose;
+ }
- if ( (tmp=switch_channel_get_variable(channel, "fax_force_caller")) ) {
- if ( switch_true(tmp) )
- pvt->caller = 1;
- else
- pvt->caller = 0;
- }
+ pvt->caller = switch_true(switch_channel_get_variable(channel, "fax_force_caller"));
- if ( (tmp=switch_channel_get_variable(channel, "fax_ident")) ) {
+ if ((tmp = switch_channel_get_variable(channel, "fax_ident"))) {
pvt->ident = switch_core_session_strdup(session, tmp);
- }
- else
+ } else {
pvt->ident = switch_core_session_strdup(session, globals.ident);
+ }
- if ( (tmp=switch_channel_get_variable(channel, "fax_header")) ) {
+ if ((tmp = switch_channel_get_variable(channel, "fax_header"))) {
pvt->header = switch_core_session_strdup(session, tmp);
- }
- else
+ } else {
pvt->header = switch_core_session_strdup(session, globals.header);
+ }
+ if (pvt->app_mode == FUNCTION_TX) {
- if ( pvt->app_mode == FUNCTION_TX )
- {
-
- if ( (tmp=switch_channel_get_variable(channel, "fax_start_page")) ) {
+ if ((tmp = switch_channel_get_variable(channel, "fax_start_page"))) {
pvt->tx_page_start = atoi(tmp);
}
- if ( (tmp=switch_channel_get_variable(channel, "fax_end_page")) ) {
+ if ((tmp = switch_channel_get_variable(channel, "fax_end_page"))) {
pvt->tx_page_end = atoi(tmp);
}
- if ( pvt->tx_page_end < -1 )
- pvt->tx_page_end = -1;
- if ( pvt->tx_page_start < -1 )
+ if (pvt->tx_page_end < -1) {
+ pvt->tx_page_end = -1;
+ }
+
+ if (pvt->tx_page_start < -1) {
pvt->tx_page_start = -1;
- if ( (pvt->tx_page_end < pvt->tx_page_start) && ( pvt->tx_page_end != -1 ) )
+ }
+
+ if ((pvt->tx_page_end < pvt->tx_page_start) && (pvt->tx_page_end != -1)) {
pvt->tx_page_end = pvt->tx_page_start;
+ }
}
- if ( !switch_strlen_zero(data) ) {
+ if (!switch_strlen_zero(data)) {
pvt->filename = switch_core_session_strdup(session, data);
- if ( pvt->app_mode == FUNCTION_TX ) {
- if ( (switch_file_exists( pvt->filename, switch_core_session_get_pool(session) )!=SWITCH_STATUS_SUCCESS) ) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot send inexistant fax file [%s]\n", switch_str_nil(pvt->filename) );
+ if (pvt->app_mode == FUNCTION_TX) {
+ if ((switch_file_exists(pvt->filename, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot send inexistant fax file [%s]\n", switch_str_nil(pvt->filename));
goto done;
}
}
- }
- else {
- if ( pvt->app_mode == FUNCTION_TX ) {
+ } else {
+ if (pvt->app_mode == FUNCTION_TX) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Fax TX filename not set.\n");
goto done;
- }
- else if ( pvt->app_mode == FUNCTION_RX )
- {
+ } else if (pvt->app_mode == FUNCTION_RX) {
char *fname;
char *prefix;
switch_time_t time;
time = switch_time_now();
- if ( !(prefix=switch_channel_get_variable(channel, "fax_prefix")) ) {
+ if (!(prefix = switch_channel_get_variable(channel, "fax_prefix"))) {
prefix = globals.prepend_string;
}
fname = switch_mprintf("%s/%s-%ld-%ld.tif", globals.spool, prefix, globals.total_sessions, time);
- if ( fname )
- {
+ if (fname) {
pvt->filename = switch_core_session_strdup(session, fname);
switch_safe_free(fname);
- }
- else
- {
+ } else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot automagically set fax RX destination file\n");
goto done;
}
- }
- else {
- assert(0); /* UH ?? */
+ } else {
+ assert(0); /* UH ?? */
}
}
/*
- *** Initialize the SpanDSP elements ***
+ *** Initialize the SpanDSP elements ***
- Note: we could analyze if a fax was already detected in previous stages
- and if so, when T.38 will be supported, send a reinvite in T38_MODE,
- bypassing AUDIO_MODE.
- */
+ Note: we could analyze if a fax was already detected in previous stages
+ and if so, when T.38 will be supported, send a reinvite in T38_MODE,
+ bypassing AUDIO_MODE.
+ */
- if ( (spanfax_init(pvt, AUDIO_MODE)!=SWITCH_STATUS_SUCCESS) )
- {
+ if ((spanfax_init(pvt, AUDIO_MODE) != SWITCH_STATUS_SUCCESS)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot initialize Fax engine\n");
return;
}
- /* Note: Disable echocan on the channel, it there is an API call to do that */
+ /*
+ Note: Disable echocan on the channel, remember to call app "disable_ec" in the dialplan
+ before invoking fax applications
+ */
/*
- Note: We should eventually disable JB before answering. JB is bad for faxing
-
- switch_channel_set_variable(channel, "jitterbuffer_msec", "0" );
- */
-
+ Note: we are disabling the Jitterbuffer, here, before we answer.
+ If you have set it to something else and the channel is pre-answered,
+ it will have no effect. Make sure that if you want more reliable
+ faxes, it is disabled.
+ */
+ switch_channel_set_variable(channel, "jitterbuffer_msec", "0");
- /* Finally answer the call */
- switch_channel_answer(channel);
/* We store the original channel codec before switching both
* legs of the calls to a linear 16 bit codec that is the one
@@ -576,167 +563,129 @@
*/
orig_read_codec = switch_core_session_get_read_codec(session);
- if (switch_core_codec_init(
- &read_codec,
- "L16",
- NULL,
- orig_read_codec->implementation->samples_per_second,
- orig_read_codec->implementation->microseconds_per_frame / 1000,
- 1,
- SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
- NULL,
- switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS
- )
- {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw read codec activation Success L16\n");
+ if (switch_core_codec_init(&read_codec,
+ "L16",
+ NULL,
+ orig_read_codec->implementation->samples_per_second,
+ orig_read_codec->implementation->microseconds_per_frame / 1000,
+ 1,
+ SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
+ NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw read codec activation Success L16 %u\n",
+ read_codec.implementation->microseconds_per_frame);
switch_core_session_set_read_codec(session, &read_codec);
- }
- else
- {
+ } else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Raw read codec activation Failed L16\n");
goto done;
}
- if (switch_core_codec_init(
- &write_codec,
- "L16",
- NULL,
- orig_read_codec->implementation->samples_per_second,
- orig_read_codec->implementation->microseconds_per_frame / 1000,
- 1,
- SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
- NULL,
- switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS
- )
- {
+ if (switch_core_codec_init(&write_codec,
+ "L16",
+ NULL,
+ orig_read_codec->implementation->samples_per_second,
+ orig_read_codec->implementation->microseconds_per_frame / 1000,
+ 1,
+ SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
+ NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw write codec activation Success L16\n");
- write_frame.codec = &write_codec;
- write_frame.data = buf;
+ write_frame.codec = &write_codec;
+ write_frame.data = buf;
write_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE;
- }
- else
- {
+ } else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Raw write codec activation Failed L16\n");
goto done;
}
-
- /*
- * now we enter a loop where we read audio frames to the channels and will pass it to spandsp
- */
- while( switch_channel_ready(channel) )
- {
+ switch_ivr_sleep(session, 250, NULL);
+
+ while (switch_channel_ready(channel)) {
int tx = 0;
- switch_status_t status;
+ switch_status_t status;
/*
- if we are in T.38 mode, we should: 1- initialize the ptv->t38_state stuff, if not done
- and then set some callbacks when reading frames.
- The only thing we need, then, in this loop, is:
- - read a frame without blocking
- - eventually feed that frame in spandsp,
- - call t38_terminal_send_timeout(), sleep for a while
+ if we are in T.38 mode, we should: 1- initialize the ptv->t38_state stuff, if not done
+ and then set some callbacks when reading frames.
+ The only thing we need, then, in this loop, is:
+ - read a frame without blocking
+ - eventually feed that frame in spandsp,
+ - call t38_terminal_send_timeout(), sleep for a while
- The T.38 stuff can be placed here (and the audio stuff can be skipped)
- */
+ The T.38 stuff can be placed here (and the audio stuff can be skipped)
+ */
/* read new audio frame from the channel */
status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
- if ( !SWITCH_READ_ACCEPTABLE(status) )
- {
+ if (!SWITCH_READ_ACCEPTABLE(status)) {
/* Our duty is over */
goto done;
}
- /* Note: more analysys on this. RTP timing maybe inaccurate and, if so,
- shoule be improved.
- agx proposes to add a channel variable to disable this check and don't skip CNG frames
- to improve the compatibility with the problems that another (??)famous pbx that
- has always had serious problems with timers (or lack of).
- */
-
/* Skip CNG frames (autogenerated by FreeSWITCH, usually) */
- if (switch_test_flag(read_frame, SFF_CNG)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Skipping CNG frame\n" );
- continue;
- }
+ if (!switch_test_flag(read_frame, SFF_CNG)) {
+ /* pass the new incoming audio frame to the fax_rx function */
+ if (fax_rx(pvt->fax_state, (int16_t *) read_frame->data, read_frame->samples)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "fax_rx reported an error\n");
+ goto done;
+ }
+ }
- /* pass the new incoming audio frame to the fax_rx function */
- if( fax_rx(pvt->fax_state, (int16_t *)read_frame->data, read_frame->samples) )
- {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "fax_rx reported an error\n" );
- goto done;
- }
-
- if ( (tx = fax_tx(pvt->fax_state, buf, write_codec.implementation->samples_per_frame)) < 0)
- {
+ if ((tx = fax_tx(pvt->fax_state, buf, write_codec.implementation->samples_per_frame)) < 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "fax_tx reported an error\n");
goto done;
}
- if ( !tx )
- {
+ if (!tx) {
/* switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "No audio samples to send\n"); */
continue;
- }
- else
- {
+ } else {
/* Set our write_frame data */
write_frame.datalen = tx * sizeof(int16_t);
write_frame.samples = tx;
}
- if ( switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS )
- {
+ if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) {
/* something weird has happened */
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
- "Cannot write frame [datalen: %d, samples: %d]\n",
- write_frame.datalen, write_frame.samples );
+ "Cannot write frame [datalen: %d, samples: %d]\n", write_frame.datalen, write_frame.samples);
goto done;
}
}
-done:
+ done:
/* Destroy the SpanDSP structures */
- spanfax_destroy( pvt );
+ spanfax_destroy(pvt);
/* restore the original codecs over the channel */
- if ( read_codec.implementation )
- {
+ if (read_codec.implementation) {
switch_core_codec_destroy(&read_codec);
}
- if ( write_codec.implementation )
- {
+ if (write_codec.implementation) {
switch_core_codec_destroy(&write_codec);
}
- if ( orig_read_codec )
- {
+ if (orig_read_codec) {
switch_core_session_set_read_codec(session, orig_read_codec);
}
}
/* **************************************************************************
- CONFIGURATION
- ************************************************************************* */
+ CONFIGURATION
+ ************************************************************************* */
void load_configuration(switch_bool_t reload)
{
switch_xml_t xml = NULL, x_lists = NULL, x_list = NULL, cfg = NULL;
- if ((xml = switch_xml_open_cfg("fax.conf", &cfg, NULL)))
- {
- if ((x_lists = switch_xml_child(cfg, "settings")))
- {
- for (x_list = switch_xml_child(x_lists, "param"); x_list; x_list = x_list->next)
- {
+ if ((xml = switch_xml_open_cfg("fax.conf", &cfg, NULL))) {
+ if ((x_lists = switch_xml_child(cfg, "settings"))) {
+ for (x_list = switch_xml_child(x_lists, "param"); x_list; x_list = x_list->next) {
const char *name = switch_xml_attr(x_list, "name");
- const char *value= switch_xml_attr(x_list, "value");
+ const char *value = switch_xml_attr(x_list, "value");
if (switch_strlen_zero(name)) {
continue;
@@ -746,43 +695,36 @@
continue;
}
- if ( !strcmp(name, "use-ecm" ) ) {
- if ( switch_true(value) )
+ if (!strcmp(name, "use-ecm")) {
+ if (switch_true(value))
globals.use_ecm = 1;
else
globals.use_ecm = 0;
- }
- else if ( !strcmp(name, "verbose" ) ) {
- if ( switch_true(value) )
+ } else if (!strcmp(name, "verbose")) {
+ if (switch_true(value))
globals.verbose = 1;
else
globals.verbose = 0;
- }
- else if ( !strcmp(name, "disable-v17" ) ) {
- if ( switch_true(value) )
+ } else if (!strcmp(name, "disable-v17")) {
+ if (switch_true(value))
globals.disable_v17 = 1;
else
globals.disable_v17 = 0;
- }
- else if ( !strcmp(name, "ident" ) ) {
- strncpy(globals.ident, value, sizeof(globals.ident)-1 );
- }
- else if ( !strcmp(name, "header" ) ) {
- strncpy(globals.header, value, sizeof(globals.header)-1 );
- }
- else if ( !strcmp(name, "spool-dir" ) ) {
+ } else if (!strcmp(name, "ident")) {
+ strncpy(globals.ident, value, sizeof(globals.ident) - 1);
+ } else if (!strcmp(name, "header")) {
+ strncpy(globals.header, value, sizeof(globals.header) - 1);
+ } else if (!strcmp(name, "spool-dir")) {
globals.spool = switch_core_strdup(globals.pool, value);
- }
- else if ( !strcmp(name, "file-prefix" ) ) {
+ } else if (!strcmp(name, "file-prefix")) {
globals.prepend_string = switch_core_strdup(globals.pool, value);
- }
- else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unknown parameter %s\n", name );
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Unknown parameter %s\n", name);
}
}
}
-
+
switch_xml_free(xml);
}
}
@@ -793,8 +735,8 @@
}
/* **************************************************************************
- FREESWITCH MODULE DEFINITIONS
- ************************************************************************* */
+ FREESWITCH MODULE DEFINITIONS
+ ************************************************************************* */
#define SPANFAX_RX_USAGE "<filename>"
#define SPANFAX_TX_USAGE "<filename>"
@@ -805,12 +747,12 @@
static switch_event_node_t *NODE = NULL;
-SWITCH_STANDARD_APP(spanfax_tx_function)
+SWITCH_STANDARD_APP(spanfax_tx_function)
{
process_fax(session, data, FUNCTION_TX);
}
-SWITCH_STANDARD_APP(spanfax_rx_function)
+SWITCH_STANDARD_APP(spanfax_rx_function)
{
process_fax(session, data, FUNCTION_RX);
}
@@ -821,31 +763,31 @@
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
- SWITCH_ADD_APP(app_interface, "rxfax", "FAX Receive Application", "FAX Receive Application", spanfax_rx_function, SPANFAX_RX_USAGE, SAF_NONE);
- SWITCH_ADD_APP(app_interface, "txfax", "FAX Transmit Application", "FAX Transmit Application", spanfax_tx_function, SPANFAX_TX_USAGE, SAF_NONE);
+ SWITCH_ADD_APP(app_interface, "rxfax", "FAX Receive Application", "FAX Receive Application", spanfax_rx_function, SPANFAX_RX_USAGE, SAF_SUPPORT_NOMEDIA);
+ SWITCH_ADD_APP(app_interface, "txfax", "FAX Transmit Application", "FAX Transmit Application", spanfax_tx_function, SPANFAX_TX_USAGE, SAF_SUPPORT_NOMEDIA);
- memset(&globals, 0, sizeof(globals) );
+ memset(&globals, 0, sizeof(globals));
switch_core_new_memory_pool(&globals.pool);
switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, globals.pool);
- globals.total_sessions = 0;
- globals.verbose = 1;
- globals.use_ecm = 1;
- globals.disable_v17 = 0;
- globals.prepend_string = switch_core_strdup(globals.pool, "fax");
- globals.spool = switch_core_strdup(globals.pool, "/tmp");
- strncpy(globals.ident, "SpanDSP Fax Ident", sizeof(globals.ident)-1 );
- strncpy(globals.header, "SpanDSP Fax Header", sizeof(globals.header)-1 );
+ globals.total_sessions = 0;
+ globals.verbose = 1;
+ globals.use_ecm = 1;
+ globals.disable_v17 = 0;
+ globals.prepend_string = switch_core_strdup(globals.pool, "fax");
+ globals.spool = switch_core_strdup(globals.pool, "/tmp");
+ strncpy(globals.ident, "SpanDSP Fax Ident", sizeof(globals.ident) - 1);
+ strncpy(globals.header, "SpanDSP Fax Header", sizeof(globals.header) - 1);
load_configuration(0);
- if ( (switch_event_bind_removable(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL, &NODE) != SWITCH_STATUS_SUCCESS) )
- {
+ if ((switch_event_bind_removable(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL, &NODE) != SWITCH_STATUS_SUCCESS)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind our reloadxml handler!\n");
/* Not such severe to prevent loading */
}
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "mod_fax loaded, using spandsp library version %d [%d]\n", SPANDSP_RELEASE_DATE, SPANDSP_RELEASE_TIME );
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "mod_fax loaded, using spandsp library version %d [%d]\n", SPANDSP_RELEASE_DATE,
+ SPANDSP_RELEASE_TIME);
return SWITCH_STATUS_SUCCESS;
}
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/mod_sofia.h Fri Sep 5 16:34:18 2008
@@ -190,7 +190,7 @@
TFLAG_VAD_IN = (1 << 11),
TFLAG_VAD_OUT = (1 << 12),
TFLAG_VAD = (1 << 13),
- TFLAG_TIMER = (1 << 14),
+ TFLAG_USE_ME = (1 << 14),
TFLAG_READY = (1 << 15),
TFLAG_REINVITE = (1 << 16),
TFLAG_REFER = (1 << 17),
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c Fri Sep 5 16:34:18 2008
@@ -1409,8 +1409,6 @@
if (!strcasecmp(var, "debug")) {
profile->debug = atoi(val);
- } else if (!strcasecmp(var, "use-rtp-timer") && switch_true(val)) {
- switch_set_flag(profile, TFLAG_TIMER);
} else if (!strcasecmp(var, "sip-trace") && switch_true(val)) {
switch_set_flag(profile, TFLAG_TPORT_LOG);
} else if (!strcasecmp(var, "odbc-dsn") && !switch_strlen_zero(val)) {
@@ -1752,10 +1750,6 @@
profile->nonce_ttl = 60;
}
- if (switch_test_flag(profile, TFLAG_TIMER) && !profile->timer_name) {
- profile->timer_name = switch_core_strdup(profile->pool, "soft");
- }
-
if (!profile->username) {
profile->username = switch_core_strdup(profile->pool, "FreeSWITCH");
}
@@ -2381,7 +2375,7 @@
if (tech_pvt && r_sdp) {
sdp_parser_t *parser;
sdp_session_t *sdp;
- uint8_t match = 0;
+ uint8_t match = 0, is_ok = 1;
if (r_sdp) {
if (switch_channel_test_flag(channel, CF_PROXY_MODE) || switch_channel_test_flag(channel, CF_PROXY_MEDIA)) {
@@ -2412,6 +2406,7 @@
switch_core_session_rwunlock(other_session);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Re-INVITE to a no-media channel that is not in a bridge.\n");
+ is_ok = 0;
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
}
goto done;
@@ -2432,21 +2427,25 @@
switch_set_flag_locked(tech_pvt, TFLAG_REINVITE);
if (sofia_glue_activate_rtp(tech_pvt, 0) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Reinvite RTP Error!\n");
+ is_ok = 0;
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Processing Reinvite\n");
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Reinvite Codec Error!\n");
- switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
+ is_ok = 0;
}
}
-
-
- nua_respond(tech_pvt->nh, SIP_200_OK,
- SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
- SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
- SOATAG_REUSE_REJECTED(1),
- SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), TAG_END());
+
+ if (is_ok) {
+ nua_respond(tech_pvt->nh, SIP_200_OK,
+ SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+ SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
+ SOATAG_REUSE_REJECTED(1),
+ SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), TAG_END());
+ } else {
+ nua_respond(tech_pvt->nh, SIP_488_NOT_ACCEPTABLE, TAG_END());
+ }
}
}
break;
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_glue.c Fri Sep 5 16:34:18 2008
@@ -1676,7 +1676,7 @@
char tmp[50];
uint32_t rtp_timeout_sec = tech_pvt->profile->rtp_timeout_sec;
uint32_t rtp_hold_timeout_sec = tech_pvt->profile->rtp_hold_timeout_sec;
- char *timer_name;
+ char *timer_name = NULL;
const char *var;
switch_assert(tech_pvt != NULL);
@@ -1807,6 +1807,10 @@
timer_name = tech_pvt->profile->timer_name;
}
+ if ((var = switch_channel_get_variable(tech_pvt->channel, "rtp_timer_name"))) {
+ timer_name = (char *) var;
+ }
+
tech_pvt->rtp_session = switch_rtp_new(tech_pvt->local_sdp_audio_ip,
tech_pvt->local_sdp_audio_port,
tech_pvt->remote_sdp_audio_ip,
Modified: freeswitch/trunk/src/switch_core_io.c
==============================================================================
--- freeswitch/trunk/src/switch_core_io.c (original)
+++ freeswitch/trunk/src/switch_core_io.c Fri Sep 5 16:34:18 2008
@@ -256,6 +256,7 @@
session->raw_read_frame.ssrc = read_frame->ssrc;
session->raw_read_frame.seq = read_frame->seq;
session->raw_read_frame.m = read_frame->m;
+ session->raw_read_frame.flags = read_frame->flags;
session->raw_read_frame.payload = read_frame->payload;
read_frame = &session->raw_read_frame;
break;
@@ -278,6 +279,7 @@
session->raw_read_frame.ssrc = read_frame->ssrc;
session->raw_read_frame.seq = read_frame->seq;
session->raw_read_frame.m = read_frame->m;
+ session->raw_read_frame.flags = read_frame->flags;
session->raw_read_frame.payload = read_frame->payload;
read_frame = &session->raw_read_frame;
status = SWITCH_STATUS_SUCCESS;
@@ -357,12 +359,13 @@
}
- if ((*frame)->datalen == session->read_codec->implementation->bytes_per_frame) {
+ if (read_frame->datalen == session->read_codec->implementation->bytes_per_frame) {
perfect = TRUE;
} else {
if (!session->raw_read_buffer) {
switch_size_t bytes = session->read_codec->implementation->bytes_per_frame;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Engaging Read Buffer at %u bytes\n", (uint32_t) bytes);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Engaging Read Buffer at %u bytes vs %u\n",
+ (uint32_t) bytes, (uint32_t) (*frame)->datalen);
switch_buffer_create_dynamic(&session->raw_read_buffer, bytes * SWITCH_BUFFER_BLOCK_FRAMES, bytes * SWITCH_BUFFER_START_FRAMES, 0);
}
if (!switch_buffer_write(session->raw_read_buffer, read_frame->data, read_frame->datalen)) {
@@ -408,6 +411,7 @@
session->enc_read_frame.ssrc = read_frame->ssrc;
session->enc_read_frame.seq = read_frame->seq;
session->enc_read_frame.m = read_frame->m;
+ session->enc_read_frame.flags = read_frame->flags;
session->enc_read_frame.payload = session->read_codec->implementation->ianacode;
}
*frame = &session->enc_read_frame;
@@ -417,6 +421,7 @@
session->raw_read_frame.timestamp = read_frame->timestamp;
session->raw_read_frame.payload = enc_frame->codec->implementation->ianacode;
session->raw_read_frame.m = read_frame->m;
+ session->enc_read_frame.flags = read_frame->flags;
session->raw_read_frame.ssrc = read_frame->ssrc;
session->raw_read_frame.seq = read_frame->seq;
*frame = &session->raw_read_frame;
@@ -616,6 +621,7 @@
session->raw_write_frame.timestamp = frame->timestamp;
session->raw_write_frame.rate = frame->rate;
session->raw_write_frame.m = frame->m;
+ session->raw_write_frame.flags = frame->flags;
session->raw_write_frame.ssrc = frame->ssrc;
session->raw_write_frame.seq = frame->seq;
session->raw_write_frame.payload = frame->payload;
@@ -768,6 +774,7 @@
session->enc_write_frame.timestamp = frame->timestamp;
session->enc_write_frame.payload = session->write_codec->implementation->ianacode;
session->enc_write_frame.m = frame->m;
+ session->enc_write_frame.flags = frame->flags;
session->enc_write_frame.ssrc = frame->ssrc;
session->enc_write_frame.seq = frame->seq;
write_frame = &session->enc_write_frame;
@@ -777,6 +784,7 @@
enc_frame->samples = enc_frame->datalen / sizeof(int16_t);
enc_frame->timestamp = frame->timestamp;
enc_frame->m = frame->m;
+ enc_frame->flags = frame->flags;
enc_frame->seq = frame->seq;
enc_frame->ssrc = frame->ssrc;
enc_frame->payload = enc_frame->codec->implementation->ianacode;
@@ -830,6 +838,7 @@
session->enc_write_frame.codec = session->write_codec;
session->enc_write_frame.samples = enc_frame->datalen / sizeof(int16_t);
session->enc_write_frame.m = frame->m;
+ session->enc_write_frame.flags = frame->flags;
session->enc_write_frame.ssrc = frame->ssrc;
session->enc_write_frame.payload = session->write_codec->implementation->ianacode;
write_frame = &session->enc_write_frame;
@@ -851,6 +860,7 @@
session->enc_write_frame.codec = session->write_codec;
session->enc_write_frame.samples = enc_frame->datalen / sizeof(int16_t);
session->enc_write_frame.m = frame->m;
+ session->enc_write_frame.flags = frame->flags;
session->enc_write_frame.ssrc = frame->ssrc;
session->enc_write_frame.payload = session->write_codec->implementation->ianacode;
write_frame = &session->enc_write_frame;
@@ -865,6 +875,7 @@
enc_frame->codec = session->write_codec;
enc_frame->samples = enc_frame->datalen / sizeof(int16_t);
enc_frame->m = frame->m;
+ enc_frame->flags = frame->flags;
enc_frame->ssrc = frame->ssrc;
enc_frame->payload = enc_frame->codec->implementation->ianacode;
write_frame = enc_frame;
Modified: freeswitch/trunk/src/switch_rtp.c
==============================================================================
--- freeswitch/trunk/src/switch_rtp.c (original)
+++ freeswitch/trunk/src/switch_rtp.c Fri Sep 5 16:34:18 2008
@@ -797,11 +797,16 @@
rtp_session->payload = payload;
rtp_session->ms_per_packet = ms_per_packet;
rtp_session->samples_per_interval = rtp_session->conf_samples_per_interval = samples_per_interval;
- rtp_session->timer_name = switch_core_strdup(pool, timer_name);
+ if (!strcasecmp(timer_name, "none")) {
+ timer_name = NULL;
+ }
if (!switch_strlen_zero(timer_name)) {
+ rtp_session->timer_name = switch_core_strdup(pool, timer_name);
switch_set_flag_locked(rtp_session, SWITCH_RTP_FLAG_USE_TIMER);
+ switch_clear_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER);
+ switch_clear_flag(rtp_session, SWITCH_RTP_FLAG_NOBLOCK);
}
if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_USE_TIMER) && switch_strlen_zero(timer_name)) {
@@ -1238,6 +1243,10 @@
goto end;
}
+ if (bytes == 1) {
+ continue;
+ }
+
if (bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) && switch_sockaddr_get_port(rtp_session->from_addr)) {
const char *tx_host;
const char *old_host;
More information about the Freeswitch-svn
mailing list