[svn-commits] mattf: trunk r60486 - in /trunk: ./ channels/chan_zap.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Fri Apr 6 11:25:38 MST 2007


Author: mattf
Date: Fri Apr  6 13:25:38 2007
New Revision: 60486

URL: http://svn.digium.com/view/asterisk?view=rev&rev=60486
Log:
Merged revisions 60459 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.4

................
r60459 | mattf | 2007-04-06 12:32:31 -0500 (Fri, 06 Apr 2007) | 10 lines

Merged revisions 60456 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r60456 | mattf | 2007-04-06 12:03:15 -0500 (Fri, 06 Apr 2007) | 2 lines

There should only be one code path for doing DTMF conditionals on channels.  This fixes it.

........

................

Modified:
    trunk/   (props changed)
    trunk/channels/chan_zap.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.2-merged' - no diff available.

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Modified: trunk/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_zap.c?view=diff&rev=60486&r1=60485&r2=60486
==============================================================================
--- trunk/channels/chan_zap.c (original)
+++ trunk/channels/chan_zap.c Fri Apr  6 13:25:38 2007
@@ -3842,6 +3842,73 @@
 	}
 	return zi.alarms;
 }
+
+static void zt_handle_dtmfup(struct ast_channel *ast, int index, struct ast_frame **dest)
+{
+	struct zt_pvt *p = ast->tech_pvt;
+	struct ast_frame *f = *dest;
+
+	ast_log(LOG_DEBUG, "DTMF digit: %c on %s\n", f->subclass, ast->name);
+	if (p->confirmanswer) {
+		ast_log(LOG_DEBUG, "Confirm answer on %s!\n", ast->name);
+		/* Upon receiving a DTMF digit, consider this an answer confirmation instead
+		   of a DTMF digit */
+		p->subs[index].f.frametype = AST_FRAME_CONTROL;
+		p->subs[index].f.subclass = AST_CONTROL_ANSWER;
+		*dest = &p->subs[index].f;
+		/* Reset confirmanswer so DTMF's will behave properly for the duration of the call */
+		p->confirmanswer = 0;
+	} else if (p->callwaitcas) {
+		if ((f->subclass == 'A') || (f->subclass == 'D')) {
+			ast_log(LOG_DEBUG, "Got some DTMF, but it's for the CAS\n");
+			if (p->cidspill)
+				free(p->cidspill);
+			send_cwcidspill(p);
+		}
+		if ((f->subclass != 'm') && (f->subclass != 'u')) 
+			p->callwaitcas = 0;
+		p->subs[index].f.frametype = AST_FRAME_NULL;
+		p->subs[index].f.subclass = 0;
+		*dest = &p->subs[index].f;
+	} else if (f->subclass == 'f') {
+		/* Fax tone -- Handle and return NULL */
+		if (!p->faxhandled) {
+			p->faxhandled++;
+			if (strcmp(ast->exten, "fax")) {
+				const char *target_context = S_OR(ast->macrocontext, ast->context);
+
+				if (ast_exists_extension(ast, target_context, "fax", 1, ast->cid.cid_num)) {
+					if (option_verbose > 2)
+						ast_verbose(VERBOSE_PREFIX_3 "Redirecting %s to fax extension\n", ast->name);
+					/* Save the DID/DNIS when we transfer the fax call to a "fax" extension */
+					pbx_builtin_setvar_helper(ast, "FAXEXTEN", ast->exten);
+					if (ast_async_goto(ast, target_context, "fax", 1))
+						ast_log(LOG_WARNING, "Failed to async goto '%s' into fax of '%s'\n", ast->name, target_context);
+				} else
+					ast_log(LOG_NOTICE, "Fax detected, but no fax extension\n");
+			} else
+				ast_log(LOG_DEBUG, "Already in a fax extension, not redirecting\n");
+		} else
+				ast_log(LOG_DEBUG, "Fax already handled\n");
+		zt_confmute(p, 0);
+		p->subs[index].f.frametype = AST_FRAME_NULL;
+		p->subs[index].f.subclass = 0;
+		*dest = &p->subs[index].f;
+	} else if (f->subclass == 'm') {
+		/* Confmute request */
+		zt_confmute(p, 1);
+		p->subs[index].f.frametype = AST_FRAME_NULL;
+		p->subs[index].f.subclass = 0;
+		*dest = &p->subs[index].f;		
+	} else if (f->subclass == 'u') {
+		/* Unmute */
+		zt_confmute(p, 0);
+		p->subs[index].f.frametype = AST_FRAME_NULL;
+		p->subs[index].f.subclass = 0;
+		*dest = &p->subs[index].f;		
+	} else
+		zt_confmute(p, 0);
+}
 			
 static struct ast_frame *zt_handle_event(struct ast_channel *ast)
 {
@@ -3852,6 +3919,7 @@
 	pthread_t threadid;
 	pthread_attr_t attr;
 	struct ast_channel *chan;
+	struct ast_frame *f;
 
 	index = zt_get_index(ast, p, 0);
 	mysig = p->sig;
@@ -3865,6 +3933,8 @@
 	p->subs[index].f.offset = 0;
 	p->subs[index].f.src = "zt_handle_event";
 	p->subs[index].f.data = NULL;
+	f = &p->subs[index].f;
+
 	if (index < 0)
 		return &p->subs[index].f;
 	if (p->fake_event) {
@@ -3890,9 +3960,8 @@
 #ifdef HAVE_PRI
 		}
 #endif
-		/* Unmute conference, return the captured digit */
-		zt_confmute(p, 0);
-		return &p->subs[index].f;
+		zt_handle_dtmfup(ast, index, &f);
+		return f;
 	}
 
 	if (res & ZT_EVENT_DTMFDOWN) {
@@ -5089,75 +5158,9 @@
 		}
 	} else 
 		f = &p->subs[index].f; 
-	if (f && (f->frametype == AST_FRAME_DTMF)) {
-		if (option_debug)
-			ast_log(LOG_DEBUG, "DTMF digit: %c on %s\n", f->subclass, ast->name);
-		if (p->confirmanswer) {
-			if (option_debug)
-				ast_log(LOG_DEBUG, "Confirm answer on %s!\n", ast->name);
-			/* Upon receiving a DTMF digit, consider this an answer confirmation instead
-			   of a DTMF digit */
-			p->subs[index].f.frametype = AST_FRAME_CONTROL;
-			p->subs[index].f.subclass = AST_CONTROL_ANSWER;
-			f = &p->subs[index].f;
-			/* Reset confirmanswer so DTMF's will behave properly for the duration of the call */
-			p->confirmanswer = 0;
-		} else if (p->callwaitcas) {
-			if ((f->subclass == 'A') || (f->subclass == 'D')) {
-				if (option_debug)
-					ast_log(LOG_DEBUG, "Got some DTMF, but it's for the CAS\n");
-				if (p->cidspill)
-					free(p->cidspill);
-				send_cwcidspill(p);
-			}
-			if ((f->subclass != 'm') && (f->subclass != 'u')) 
-				p->callwaitcas = 0;
-			p->subs[index].f.frametype = AST_FRAME_NULL;
-			p->subs[index].f.subclass = 0;
-			f = &p->subs[index].f;
-		} else if (f->subclass == 'f') {
-			/* Fax tone -- Handle and return NULL */
-			if (!p->faxhandled) {
-				p->faxhandled++;
-				if (strcmp(ast->exten, "fax")) {
-					const char *target_context = S_OR(ast->macrocontext, ast->context);
-
-					if (ast_exists_extension(ast, target_context, "fax", 1, ast->cid.cid_num)) {
-						if (option_verbose > 2)
-							ast_verbose(VERBOSE_PREFIX_3 "Redirecting %s to fax extension\n", ast->name);
-						/* Save the DID/DNIS when we transfer the fax call to a "fax" extension */
-						pbx_builtin_setvar_helper(ast, "FAXEXTEN", ast->exten);
-						if (ast_async_goto(ast, target_context, "fax", 1))
-							ast_log(LOG_WARNING, "Failed to async goto '%s' into fax of '%s'\n", ast->name, target_context);
-					} else
-						ast_log(LOG_NOTICE, "Fax detected, but no fax extension\n");
-				} else {
-					if (option_debug)
-						ast_log(LOG_DEBUG, "Already in a fax extension, not redirecting\n");
-				}
-			} else {
-					if (option_debug)
-						ast_log(LOG_DEBUG, "Fax already handled\n");
-			}
-			zt_confmute(p, 0);
-			p->subs[index].f.frametype = AST_FRAME_NULL;
-			p->subs[index].f.subclass = 0;
-			f = &p->subs[index].f;
-		} else if (f->subclass == 'm') {
-			/* Confmute request */
-			zt_confmute(p, 1);
-			p->subs[index].f.frametype = AST_FRAME_NULL;
-			p->subs[index].f.subclass = 0;
-			f = &p->subs[index].f;		
-		} else if (f->subclass == 'u') {
-			/* Unmute */
-			zt_confmute(p, 0);
-			p->subs[index].f.frametype = AST_FRAME_NULL;
-			p->subs[index].f.subclass = 0;
-			f = &p->subs[index].f;		
-		} else
-			zt_confmute(p, 0);
-	}
+
+	if (f && (f->frametype == AST_FRAME_DTMF))
+		zt_handle_dtmfup(ast, index, &f);
 
 	/* If we have a fake_event, trigger exception to handle it */
 	if (p->fake_event)



More information about the svn-commits mailing list