[asterisk-commits] kpfleming: branch 1.6.1 r225870 - /branches/1.6.1/apps/app_fax.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Oct 26 10:51:14 CDT 2009


Author: kpfleming
Date: Mon Oct 26 10:51:10 2009
New Revision: 225870

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=225870
Log:
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)

Modified:
    branches/1.6.1/apps/app_fax.c

Modified: branches/1.6.1/apps/app_fax.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.1/apps/app_fax.c?view=diff&rev=225870&r1=225869&r2=225870
==============================================================================
--- branches/1.6.1/apps/app_fax.c (original)
+++ branches/1.6.1/apps/app_fax.c Mon Oct 26 10:51:10 2009
@@ -445,14 +445,30 @@
 	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 @@
 		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 @@
 				res = -1;
 				break;
 			}
-
-			/* Watchdog */
 			if (last_state != t30state->state) {
 				state_change = ast_tvnow();
 				last_state = t30state->state;
@@ -498,15 +512,6 @@
 		}
 
 		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);




More information about the asterisk-commits mailing list