diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-06-26 19:29:02 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-06-26 19:29:02 +0000 |
commit | 49e4bdf5d9e467093c72597cad1ef5f71af426f8 (patch) | |
tree | 8558af395a481a402d8f9a6d76ccc99c629fd017 /apps | |
parent | fe79e2ee5c213c9defbfcfebc0a69ce403f0c90e (diff) |
Merged revisions 203699 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r203699 | file | 2009-06-26 16:27:24 -0300 (Fri, 26 Jun 2009) | 2 lines
Improve T.38 negotiation by exchanging session parameters between application and channel.
........
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@203701 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_fax.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/apps/app_fax.c b/apps/app_fax.c index 51ca0f9bf..0fe861bb3 100644 --- a/apps/app_fax.c +++ b/apps/app_fax.c @@ -116,7 +116,7 @@ typedef struct { int direction; /* Fax direction: 0 - receiving, 1 - sending */ int caller_mode; char *file_name; - + struct ast_control_t38_parameters t38parameters; volatile int finished; } fax_session; @@ -327,7 +327,6 @@ static int transmit_audio(fax_session *s) struct ast_frame *fr; int last_state = 0; struct timeval now, start, state_change; - enum ast_control_t38 t38control; #if SPANDSP_RELEASE_DATE >= 20080725 /* for spandsp shaphots 0.0.6 and higher */ @@ -411,9 +410,16 @@ static int transmit_audio(fax_session *s) /* Do not pass channel to ast_dsp_process otherwise it may queue modified audio frame back */ fr = ast_dsp_process(NULL, dsp, fr); if (fr && fr->frametype == AST_FRAME_DTMF && fr->subclass == 'f') { + struct ast_control_t38_parameters parameters = { .request_response = AST_T38_REQUEST_NEGOTIATE, + .version = 0, + .max_datagram = 400, + .rate = AST_T38_RATE_9600, + .rate_management = AST_T38_RATE_MANAGEMENT_TRANSFERED_TCF, + .fill_bit_removal = 1, + .transcoding_mmr = 1, + }; ast_debug(1, "Fax tone detected. Requesting T38\n"); - t38control = AST_T38_REQUEST_NEGOTIATE; - ast_indicate_data(s->chan, AST_CONTROL_T38, &t38control, sizeof(t38control)); + ast_indicate_data(s->chan, AST_CONTROL_T38_PARAMETERS, ¶meters, sizeof(parameters)); detect_tone = 0; } @@ -438,11 +444,11 @@ static int transmit_audio(fax_session *s) state_change = ast_tvnow(); last_state = t30state->state; } - } else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38 && - inf->datalen == sizeof(enum ast_control_t38)) { - t38control =*((enum ast_control_t38 *) inf->data); - if (t38control == AST_T38_NEGOTIATED) { + } else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38_PARAMETERS) { + struct ast_control_t38_parameters *parameters = inf->data; + if (parameters->request_response == AST_T38_NEGOTIATED) { /* T38 switchover completed */ + s->t38parameters = *parameters; ast_debug(1, "T38 negotiated, finishing audio loop\n"); res = 1; break; @@ -503,8 +509,6 @@ static int transmit_t38(fax_session *s) struct ast_frame *inf = NULL; int last_state = 0; struct timeval now, start, state_change, last_frame; - enum ast_control_t38 t38control; - t30_state_t *t30state; t38_core_state_t *t38state; @@ -525,6 +529,17 @@ static int transmit_t38(fax_session *s) return -1; } + t38_set_max_datagram_size(t38state, s->t38parameters.max_datagram); + + if (s->t38parameters.fill_bit_removal) { + t38_set_fill_bit_removal(t38state, TRUE); + } + if (s->t38parameters.transcoding_mmr) { + t38_set_mmr_transcoding(t38state, TRUE); + } else if (s->t38parameters.transcoding_jbig) { + t38_set_jbig_transcoding(t38state, TRUE); + } + /* Setup logging */ set_logging(&t38.logging); set_logging(&t30state->logging); @@ -568,12 +583,9 @@ static int transmit_t38(fax_session *s) state_change = ast_tvnow(); last_state = t30state->state; } - } else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38 && - inf->datalen == sizeof(enum ast_control_t38)) { - - t38control = *((enum ast_control_t38 *) inf->data); - - if (t38control == AST_T38_TERMINATED || t38control == AST_T38_REFUSED) { + } else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38_PARAMETERS) { + struct ast_control_t38_parameters *parameters = inf->data; + if (parameters->request_response == AST_T38_TERMINATED || parameters->request_response == AST_T38_REFUSED) { ast_debug(1, "T38 down, terminating\n"); res = -1; break; @@ -664,7 +676,7 @@ static int sndfax_exec(struct ast_channel *chan, void *data) { int res = 0; char *parse; - fax_session session; + fax_session session = { 0, }; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(file_name); |