mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-02 11:58:40 +00:00
Backport audio handling loop fixes from trunk version of app_fax.
This backport resolves some issues handling audio frames during FAX processing, and ensures that the FAX application doesn't accidentally get notified of a T.38 switchover at the end of a successful FAX. (issue #16127) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@225870 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -445,14 +445,30 @@ static int transmit_audio(fax_session *s)
|
||||
ast_activate_generator(s->chan, &generator, &fax);
|
||||
|
||||
while (!s->finished) {
|
||||
res = ast_waitfor(s->chan, 20);
|
||||
if (res < 0)
|
||||
break;
|
||||
else if (res > 0)
|
||||
res = 0;
|
||||
inf = NULL;
|
||||
|
||||
inf = ast_read(s->chan);
|
||||
if (inf == NULL) {
|
||||
if ((res = ast_waitfor(s->chan, 25)) < 0) {
|
||||
ast_debug(1, "Error waiting for a frame\n");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Watchdog */
|
||||
now = ast_tvnow();
|
||||
if (ast_tvdiff_sec(now, start) > WATCHDOG_TOTAL_TIMEOUT || ast_tvdiff_sec(now, state_change) > WATCHDOG_STATE_TIMEOUT) {
|
||||
ast_log(LOG_WARNING, "It looks like we hung. Aborting.\n");
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!res) {
|
||||
/* There was timeout waiting for a frame. Loop around and wait again */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* There is a frame available. Get it */
|
||||
res = 0;
|
||||
|
||||
if (!(inf = ast_read(s->chan))) {
|
||||
ast_debug(1, "Channel hangup\n");
|
||||
res = -1;
|
||||
break;
|
||||
@@ -461,7 +477,7 @@ static int transmit_audio(fax_session *s)
|
||||
ast_debug(10, "frame %d/%d, len=%d\n", inf->frametype, inf->subclass, inf->datalen);
|
||||
|
||||
/* Check the frame type. Format also must be checked because there is a chance
|
||||
that a frame in old format was already queued before we set chanel format
|
||||
that a frame in old format was already queued before we set channel format
|
||||
to slinear so it will still be received by ast_read */
|
||||
if (inf->frametype == AST_FRAME_VOICE && inf->subclass == AST_FORMAT_SLINEAR) {
|
||||
if (fax_rx(&fax, inf->data.ptr, inf->samples) < 0) {
|
||||
@@ -470,8 +486,6 @@ static int transmit_audio(fax_session *s)
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Watchdog */
|
||||
if (last_state != t30state->state) {
|
||||
state_change = ast_tvnow();
|
||||
last_state = t30state->state;
|
||||
@@ -498,15 +512,6 @@ static int transmit_audio(fax_session *s)
|
||||
}
|
||||
|
||||
ast_frfree(inf);
|
||||
inf = NULL;
|
||||
|
||||
/* Watchdog */
|
||||
now = ast_tvnow();
|
||||
if (ast_tvdiff_sec(now, start) > WATCHDOG_TOTAL_TIMEOUT || ast_tvdiff_sec(now, state_change) > WATCHDOG_STATE_TIMEOUT) {
|
||||
ast_log(LOG_WARNING, "It looks like we hung. Aborting.\n");
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ast_debug(1, "Loop finished, res=%d\n", res);
|
||||
|
||||
Reference in New Issue
Block a user