diff --git a/src/mod/applications/mod_fax/mod_fax.c b/src/mod/applications/mod_fax/mod_fax.c index 32a0821473..c7fdea01b7 100644 --- a/src/mod/applications/mod_fax/mod_fax.c +++ b/src/mod/applications/mod_fax/mod_fax.c @@ -49,8 +49,8 @@ static void span_message(int level, const char *msg) /* TODO: maybe is better to use switch_assert here? if (msg==NULL) { - return; - } + return; + } */ switch_assert(msg!=NULL); @@ -77,8 +77,8 @@ static void span_message(int level, const char *msg) break; default: /* SPAN_LOG_DEBUG, SPAN_LOG_DEBUG_2, SPAN_LOG_DEBUG_3 */ fs_log_level = SWITCH_LOG_DEBUG; - } - switch_log_printf(SWITCH_CHANNEL_LOG, fs_log_level, "%s", msg ); + } + switch_log_printf(SWITCH_CHANNEL_LOG, fs_log_level, "%s", msg ); } /* @@ -100,7 +100,7 @@ static int phase_b_handler(t30_state_t *s, void *user_data, int result) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote sender ident: %s\n", t30_get_rx_sender_ident(s)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote password: %s\n", t30_get_rx_password(s)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); - return T30_ERR_OK; + return T30_ERR_OK; }; @@ -110,31 +110,31 @@ static int phase_b_handler(t30_state_t *s, void *user_data, int result) static int phase_d_handler(t30_state_t *s, void *user_data, int result) { - t30_stats_t t; + t30_stats_t t; int session; switch_assert(user_data != NULL); session = (intptr_t) user_data; - if (result) { - t30_get_transfer_statistics(s, &t); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Phase D handler on channel %d - (0x%X) %s\n", session, session, result, t30_frametype(result)); - 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, "Pages in the file: %i\n", t.pages_in_file); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Image size: %i x %i\n", t.width, t.length); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Image resolution %i x %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, "Bad rows %i\n", t.bad_rows); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Longest bad row run %i\n", t.longest_bad_row_run); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Compression type %i %s\n", t.encoding, t4_encoding_to_str(t.encoding)); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Image size (bytes) %i\n", t.image_size); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "ECM %s\n", (t.error_correcting_mode) ? "on" : "off"); + if (result) { + t30_get_transfer_statistics(s, &t); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Phase D handler on channel %d - (0x%X) %s\n", session, session, result, t30_frametype(result)); + 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, "Pages in the file: %i\n", t.pages_in_file); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Image size: %i x %i\n", t.width, t.length); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Image resolution %i x %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, "Bad rows %i\n", t.bad_rows); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Longest bad row run %i\n", t.longest_bad_row_run); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Compression type %i %s\n", t.encoding, t4_encoding_to_str(t.encoding)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Image size (bytes) %i\n", t.image_size); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "ECM %s\n", (t.error_correcting_mode) ? "on" : "off"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "local ident: %s\n", t30_get_tx_ident(s)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote ident: %s\n", t30_get_rx_ident(s)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "bits per row - min %d, max %d\n", s->t4.min_row_bits, s->t4.max_row_bits); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); - } - return T30_ERR_OK; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); + } + return T30_ERR_OK; } @@ -144,32 +144,32 @@ static int phase_d_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 *far_ident = NULL; - switch_channel_t *chan = (switch_channel_t *) user_data; - char buf[128]; - - switch_assert(user_data != NULL); + t30_stats_t t; + const char *far_ident = NULL; + switch_channel_t *chan = (switch_channel_t *) user_data; + char buf[128]; + + switch_assert(user_data != NULL); - if (result == T30_ERR_OK) { - t30_get_transfer_statistics(s, &t); + if (result == T30_ERR_OK) { + t30_get_transfer_statistics(s, &t); - far_ident = switch_str_nil( t30_get_tx_ident(s) ); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); + far_ident = switch_str_nil( t30_get_tx_ident(s) ); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); //TODO: add received/transmitted ? - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax successfully processed.\n"); - 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", switch_str_nil( t30_get_rx_ident(s)) ); - 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, "Image resolution: %i x %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, "Fax successfully processed.\n"); + 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", switch_str_nil( t30_get_rx_ident(s)) ); + 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, "Image resolution: %i x %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, "local ident: %s\n", t30_get_tx_ident(s)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "remote ident: %s\n", t30_get_rx_ident(s)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "station country: %s\n", t30_get_rx_country(s)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "station vendor: %s\n", t30_get_rx_vendor(s)); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "station model: %s\n", t30_get_rx_model(s)); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); //TODO: is the buffer too little? anyway is going to write a new set_variable function that will allow a printf like syntax very soon switch_snprintf(buf, sizeof(buf), "%d", t.pages_transferred); @@ -179,19 +179,19 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result) switch_snprintf(buf, sizeof(buf), "%d", t.bit_rate); switch_channel_set_variable(chan, "FAX_SPEED", buf); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); //TODO: add received/transmitted ? - 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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); - } + 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_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "==============================================================================\n"); + } - //TODO: remove the assert once this has been tested - switch_channel_set_variable(chan, "FAX_REMOTESTATIONID", far_ident); - switch_snprintf(buf, sizeof(buf), "%d", result); - switch_channel_set_variable(chan, "FAX_RESULT", buf); - switch_snprintf(buf, sizeof(buf), "%s", t30_completion_code_to_str(result)); - switch_channel_set_variable(chan, "FAX_ERROR", buf); + //TODO: remove the assert once this has been tested + switch_channel_set_variable(chan, "FAX_REMOTESTATIONID", far_ident); + switch_snprintf(buf, sizeof(buf), "%d", result); + switch_channel_set_variable(chan, "FAX_RESULT", buf); + switch_snprintf(buf, sizeof(buf), "%s", t30_completion_code_to_str(result)); + switch_channel_set_variable(chan, "FAX_ERROR", buf); /* * TODO @@ -218,61 +218,61 @@ static int document_handler(t30_state_t *s, void *user_data, int event) void process_fax(switch_core_session_t *session, char *data, int calling_party) { - 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_status_t status; - fax_state_t fax; + 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_status_t status; + fax_state_t fax; #define FAX_BUFFER_SIZE 4096 - int16_t buf[FAX_BUFFER_SIZE]; //TODO original value: 512 - int tx = 0; - /*TODO: int calling_party = FALSE; DEPRECATED */ - /* Channels variable parsing */ - char *file_name = NULL; - const char *fax_local_debug = NULL; - int debug = FALSE; - const char *fax_local_number = NULL; - const char *fax_local_name = NULL; - const char *fax_local_subname = NULL; - const char *fax_local_ecm = NULL; - const char *fax_local_v17 = NULL; + int16_t buf[FAX_BUFFER_SIZE]; //TODO original value: 512 + int tx = 0; + /*TODO: int calling_party = FALSE; DEPRECATED */ + /* Channels variable parsing */ + char *file_name = NULL; + const char *fax_local_debug = NULL; + int debug = FALSE; + const char *fax_local_number = NULL; + const char *fax_local_name = NULL; + const char *fax_local_subname = NULL; + const char *fax_local_ecm = NULL; + const char *fax_local_v17 = NULL; - /* make sure we have a valid channel when starting the FAX application */ - channel = switch_core_session_get_channel(session); + /* make sure we have a valid channel when starting the FAX application */ + channel = switch_core_session_get_channel(session); switch_assert(channel != NULL); /* set output varialbles to a reasonable result */ - switch_channel_set_variable(channel, "FAX_REMOTESTATIONID", "unknown"); - switch_channel_set_variable(channel, "FAX_PAGES", "0"); - switch_channel_set_variable(channel, "FAX_SIZE", "0"); - switch_channel_set_variable(channel, "FAX_SPEED", "0"); - switch_channel_set_variable(channel, "FAX_RESULT", "1"); + switch_channel_set_variable(channel, "FAX_REMOTESTATIONID", "unknown"); + switch_channel_set_variable(channel, "FAX_PAGES", "0"); + switch_channel_set_variable(channel, "FAX_SIZE", "0"); + switch_channel_set_variable(channel, "FAX_SPEED", "0"); + switch_channel_set_variable(channel, "FAX_RESULT", "1"); //TODO: add received/transmitted ? - switch_channel_set_variable(channel, "FAX_ERROR", "fax not processed yet"); + switch_channel_set_variable(channel, "FAX_ERROR", "fax not processed yet"); - /* + /* * SpanDSP initialization * if fax_init by any chance fails to start we return quickly without touching anything else */ - //TODO: ask Coppice to see if we need to clear the fax structure before fax_init is invoked - memset(&fax, 0, sizeof(fax)); - if (NULL == fax_init(&fax, calling_party)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "fax_init failed\n"); + //TODO: ask Coppice to see if we need to clear the fax structure before fax_init is invoked + memset(&fax, 0, sizeof(fax)); + if (NULL == fax_init(&fax, calling_party)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "fax_init failed\n"); return; } - /* - * Enable options based on channel variables and input parameters - */ + /* + * Enable options based on channel variables and input parameters + */ - /* file_name - Sets the TIFF filename where do you want to save the fax */ - file_name = switch_core_session_strdup(session, data); - /* it is important that file_name is not NULL or an empty string */ - if (switch_strlen_zero(file_name)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "fax filename is NULL or empty string\n"); + /* file_name - Sets the TIFF filename where do you want to save the fax */ + file_name = switch_core_session_strdup(session, data); + /* it is important that file_name is not NULL or an empty string */ + if (switch_strlen_zero(file_name)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "fax filename is NULL or empty string\n"); return; } if (calling_party) @@ -280,32 +280,32 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party) else t30_set_rx_file(&fax.t30, file_name, -1); - /* FAX_DEBUG - enable extra debugging if defined */ - debug = ( NULL != switch_channel_get_variable(channel, "FAX_DEBUG") ); + /* FAX_DEBUG - enable extra debugging if defined */ + debug = ( NULL != switch_channel_get_variable(channel, "FAX_DEBUG") ); - /* FAX_LOCAL_NUMBER - Set your station phone number */ + /* FAX_LOCAL_NUMBER - Set your station phone number */ t30_set_tx_ident(&fax.t30, switch_str_nil(switch_channel_get_variable(channel, "FAX_LOCAL_NUMBER"))); - /* FAX_LOCAL_NAME - Set your station ID name (string) */ - t30_set_tx_page_header_info(&fax.t30, switch_str_nil(switch_channel_get_variable(channel, "FAX_LOCAL_NAME"))); + /* FAX_LOCAL_NAME - Set your station ID name (string) */ + t30_set_tx_page_header_info(&fax.t30, switch_str_nil(switch_channel_get_variable(channel, "FAX_LOCAL_NAME"))); - /* FAX_LOCAL_SUBNAME - Set your station ID sub name */ + /* FAX_LOCAL_SUBNAME - Set your station ID sub name */ t30_set_tx_sub_address(&fax.t30, switch_str_nil(switch_channel_get_variable(channel, "FAX_LOCAL_SUBNAME"))); - /* FAX_DISABLE_ECM - Set if you want ECM on or OFF */ - if (NULL != switch_channel_get_variable(channel, "FAX_DISABLE_ECM")) { - t30_set_ecm_capability(&fax.t30, TRUE); + /* FAX_DISABLE_ECM - Set if you want ECM on or OFF */ + if (NULL != switch_channel_get_variable(channel, "FAX_DISABLE_ECM")) { + t30_set_ecm_capability(&fax.t30, TRUE); t30_set_supported_compressions(&fax.t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); - } else { - t30_set_ecm_capability(&fax.t30, FALSE); + } else { + t30_set_ecm_capability(&fax.t30, FALSE); } - /* FAX_DISABLE_V17 - set if you want 9600 or V17 (14.400) */ - if (NULL != switch_channel_get_variable(channel, "FAX_DISABLE_V17")) { + /* FAX_DISABLE_V17 - set if you want 9600 or V17 (14.400) */ + if (NULL != switch_channel_get_variable(channel, "FAX_DISABLE_V17")) { t30_set_supported_modems(&fax.t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER | T30_SUPPORT_V17 ); - } else { + } else { t30_set_supported_modems(&fax.t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER); - } + } /* TODO, ask Coppice if this is really working or not and then add FAX_PASSWORD channel variable (don't forget the wiki part too) * t30_set_tx_password(&mc->fax.t30_state, "Password"); @@ -314,7 +314,7 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party) /* Configure more spanDSP internal options */ /* Select whether silent audio will be sent when FAX transmit is idle. */ - fax_set_transmit_on_idle(&fax, TRUE); + fax_set_transmit_on_idle(&fax, TRUE); /* Support for different image sizes && resolutions */ t30_set_supported_image_sizes(&fax.t30, T30_SUPPORT_US_LETTER_LENGTH | T30_SUPPORT_US_LEGAL_LENGTH | T30_SUPPORT_UNLIMITED_LENGTH @@ -322,97 +322,97 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party) 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); - /* set phase handlers callbaks */ - t30_set_phase_d_handler(&fax.t30, phase_d_handler, session); - t30_set_phase_e_handler(&fax.t30, phase_e_handler, channel); + /* set phase handlers callbaks */ + t30_set_phase_d_handler(&fax.t30, phase_d_handler, session); + t30_set_phase_e_handler(&fax.t30, phase_e_handler, channel); if (debug) { t30_set_phase_b_handler(&fax.t30, phase_b_handler, session); t30_set_document_handler(&fax.t30, document_handler, session); } - /* set spanDSP logging functions - set spanlog debug messages to be outputted somewhere */ - span_log_set_message_handler(&fax.logging, span_message); - span_log_set_message_handler(&fax.t30.logging, span_message); - if (debug) { + /* set spanDSP logging functions - set spanlog debug messages to be outputted somewhere */ + span_log_set_message_handler(&fax.logging, span_message); + span_log_set_message_handler(&fax.t30.logging, span_message); + if (debug) { /* TODO: original 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); */ span_log_set_level(&fax.logging, SPAN_LOG_NONE|SPAN_LOG_FLOW|SPAN_LOG_FLOW_2|SPAN_LOG_FLOW_3|SPAN_LOG_ERROR|SPAN_LOG_PROTOCOL_ERROR|SPAN_LOG_WARNING|SPAN_LOG_PROTOCOL_WARNING|SPAN_LOG_DEBUG|SPAN_LOG_DEBUG_2|SPAN_LOG_DEBUG_3 ); span_log_set_level(&fax.t30.logging, SPAN_LOG_NONE|SPAN_LOG_FLOW|SPAN_LOG_FLOW_2|SPAN_LOG_FLOW_3|SPAN_LOG_ERROR|SPAN_LOG_PROTOCOL_ERROR|SPAN_LOG_WARNING|SPAN_LOG_PROTOCOL_WARNING|SPAN_LOG_DEBUG|SPAN_LOG_DEBUG_2|SPAN_LOG_DEBUG_3 ); - } else { + } else { span_log_set_level(&fax.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL ); span_log_set_level(&fax.t30.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL ); } /* We're now ready to answer the channel and process the audio of the call */ - /* Answer the call, otherwise we're not getting incoming audio */ + /* Answer the call, otherwise we're not getting incoming audio */ switch_channel_answer(channel); - /* TODO: + /* TODO: * it could be a good idea to disable ECHOCAN on ZAP channels and to reset volumes too * anyone know how to do this if one of the channell is OpenZap isntead of Sofia? * TIPS: perhaps "disable_ec" apps ? */ - /* We store the original channel codec before switching both - * legs of the calls to a linear 16 bit codec that is the one - * used internally by spandsp and FS will do the transcoding - * from G.711 or any other original codec - */ - orig_read_codec = switch_core_session_get_read_codec(session); + /* We store the original channel codec before switching both + * legs of the calls to a linear 16 bit codec that is the one + * used internally by spandsp and FS will do the transcoding + * from G.711 or any other original codec + */ + 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 Codec Activation Success L16 on Leg-A\n"); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Failed L16 on Leg-A"); - goto done; - } + 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 Codec Activation Success L16 on Leg-A\n"); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Failed L16 on Leg-A"); + 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) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Success L16 on Leg-B\n"); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Failed L16 on Leg-B"); - 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) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Success L16 on Leg-B\n"); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Failed L16 on Leg-B"); + goto done; + } - write_frame.codec = &write_codec; - write_frame.data = buf; + write_frame.codec = &write_codec; + write_frame.data = buf; - /* - * now we enter a loop where we read audio frames to the channels and will pass it to spandsp - * and if there is some outgoing frame we'll send it back to the calling fax machine - */ + /* + * now we enter a loop where we read audio frames to the channels and will pass it to spandsp + * and if there is some outgoing frame we'll send it back to the calling fax machine + */ - while(switch_channel_ready(channel)) { + while(switch_channel_ready(channel)) { - /* read new audio frame from the channel */ - status = switch_core_session_read_frame(session, &read_frame, -1, 0); - if (!SWITCH_READ_ACCEPTABLE(status)) { - goto done; - } + /* read new audio frame from the channel */ + status = switch_core_session_read_frame(session, &read_frame, -1, 0); + if (!SWITCH_READ_ACCEPTABLE(status)) { + goto done; + } //DEBUG switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Frame Read: %d\n" , read_frame->samples); - /* pass the new incoming audio frame to the fax_rx application */ - if( fax_rx(&fax, (int16_t *)read_frame->data, read_frame->samples) ) { + /* pass the new incoming audio frame to the fax_rx application */ + if( fax_rx(&fax, (int16_t *)read_frame->data, read_frame->samples) ) { //TODO switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "FAX_RX error\n" ); } @@ -420,29 +420,29 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party) if (read_frame->samples > 256 ) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "SAMPLES TOO BIG\n" ); - if ((tx = fax_tx(&fax, (int16_t *) &buf, write_codec.implementation->samples_per_frame)) < 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Fax_Tx Error\n"); - goto done; - } + if ((tx = fax_tx(&fax, (int16_t *) &buf, write_codec.implementation->samples_per_frame)) < 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Fax_Tx Error\n"); + goto done; + } //DEBUG switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax Tx : %d %d\n" , tx, write_codec.implementation->samples_per_frame); - - if (tx!=0) { - write_frame.datalen = tx * sizeof(int16_t); - write_frame.samples = tx; - - if (switch_core_session_write_frame(session, &write_frame, -1, 0) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Bad Write, datalen: %d, samples: %d\n", + + if (tx!=0) { + write_frame.datalen = tx * sizeof(int16_t); + write_frame.samples = tx; + + if (switch_core_session_write_frame(session, &write_frame, -1, 0) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Bad Write, datalen: %d, samples: %d\n", write_frame.datalen, write_frame.samples ); - goto done; - } + goto done; + } //DEBUG switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Frame TX : %d %d\n" , write_frame.datalen, write_frame.samples); - } else { + } else { // TODO switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "non trasmitting\n" ); } - } + } done: @@ -450,22 +450,22 @@ void process_fax(switch_core_session_t *session, char *data, int calling_party) if (debug) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FAX transmission has terminated.\n"); - /* shutdown spandsp so it can create our tiff */ - t30_terminate(&fax.t30); - fax_release(&fax); - - /* restore the original codecs over the channels */ - if (read_codec.implementation) { - switch_core_codec_destroy(&read_codec); - } + /* shutdown spandsp so it can create our tiff */ + t30_terminate(&fax.t30); + fax_release(&fax); + + /* restore the original codecs over the channels */ + if (read_codec.implementation) { + switch_core_codec_destroy(&read_codec); + } - if (write_codec.implementation) { - switch_core_codec_destroy(&write_codec); - } + if (write_codec.implementation) { + switch_core_codec_destroy(&write_codec); + } - if (orig_read_codec) { - switch_core_session_set_read_codec(session, orig_read_codec); - } + if (orig_read_codec) { + switch_core_session_set_read_codec(session, orig_read_codec); + } } @@ -481,18 +481,18 @@ SWITCH_STANDARD_APP(rxfax_function) SWITCH_MODULE_LOAD_FUNCTION(mod_fax_load) { - switch_application_interface_t *app_interface; - + switch_application_interface_t *app_interface; + /* connect my internal structure to the blank pointer passed to me */ - *module_interface = switch_loadable_module_create_module_interface(pool, modname); - - SWITCH_ADD_APP(app_interface, "rxfax", "FAX Receive Application", "FAX Receive Application", rxfax_function, "", SAF_NONE); - SWITCH_ADD_APP(app_interface, "txfax", "FAX Transmit Application", "FAX Transmit Application", txfax_function, "", SAF_NONE); + *module_interface = switch_loadable_module_create_module_interface(pool, modname); + + SWITCH_ADD_APP(app_interface, "rxfax", "FAX Receive Application", "FAX Receive Application", rxfax_function, "", SAF_NONE); + SWITCH_ADD_APP(app_interface, "txfax", "FAX Transmit Application", "FAX Transmit Application", txfax_function, "", SAF_NONE); // TODO: ask if i can use LOG functions inside this macro - /* its important to debug the exact spandsp used */ + /* its important to debug the exact spandsp used */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "using spandsp %i %i\n", SPANDSP_RELEASE_DATE, SPANDSP_RELEASE_TIME ); - + /* indicate that the module should continue to be loaded */ return SWITCH_STATUS_SUCCESS; }