]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Backport audio handling loop fixes from trunk version of app_fax.
authorKevin P. Fleming <kpfleming@digium.com>
Mon, 26 Oct 2009 15:51:10 +0000 (15:51 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Mon, 26 Oct 2009 15:51:10 +0000 (15:51 +0000)
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

apps/app_fax.c

index 8e453858b187b726b306fe7fafe8633452707398..798f879f3b4a5b0c63b04726890ef495591f8a61 100644 (file)
@@ -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)
+               inf = NULL;
+
+               if ((res = ast_waitfor(s->chan, 25)) < 0) {
+                       ast_debug(1, "Error waiting for a frame\n");
                        break;
-               else if (res > 0)
-                       res = 0;
+               }
 
-               inf = ast_read(s->chan);
-               if (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;
+               }
+
+               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);