[asterisk-commits] kpfleming: branch kpfleming/dahdi-dsp-options r183443 - in /team/kpfleming/da...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Mar 19 16:14:51 CDT 2009


Author: kpfleming
Date: Thu Mar 19 16:14:48 2009
New Revision: 183443

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=183443
Log:
save away some work done to allow DAHDI channel DSP stuff to be disabled by applications when it is not needed


Added:
    team/kpfleming/dahdi-dsp-options/
      - copied from r183442, branches/1.6.0/
Modified:
    team/kpfleming/dahdi-dsp-options/channels/chan_dahdi.c
    team/kpfleming/dahdi-dsp-options/include/asterisk/frame.h

Modified: team/kpfleming/dahdi-dsp-options/channels/chan_dahdi.c
URL: http://svn.digium.com/svn-view/asterisk/team/kpfleming/dahdi-dsp-options/channels/chan_dahdi.c?view=diff&rev=183443&r1=183442&r2=183443
==============================================================================
--- team/kpfleming/dahdi-dsp-options/channels/chan_dahdi.c (original)
+++ team/kpfleming/dahdi-dsp-options/channels/chan_dahdi.c Thu Mar 19 16:14:48 2009
@@ -1173,6 +1173,7 @@
 static int dahdi_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen);
 static int dahdi_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
 static int dahdi_setoption(struct ast_channel *chan, int option, void *data, int datalen);
+static int dahdi_queryoption(struct ast_channel *chan, int option, void *data, int *datalen);
 static int dahdi_func_read(struct ast_channel *chan, const char *function, char *data, char *buf, size_t len);
 
 static const struct ast_channel_tech dahdi_tech = {
@@ -1193,6 +1194,7 @@
 	.indicate = dahdi_indicate,
 	.fixup = dahdi_fixup,
 	.setoption = dahdi_setoption,
+	.queryoption = dahdi_queryoption,
 	.func_channel_read = dahdi_func_read,
 };
 
@@ -3812,6 +3814,68 @@
 	return res;
 }
 
+static void disable_dtmf_detect(struct dahdi_pvt *p)
+{
+	int val;
+
+	p->ignoredtmf = 1;
+
+	val = 0;
+	ioctl(p->subs[SUB_REAL].dfd, DAHDI_TONEDETECT, &val);
+
+	if (!p->hardwaredtmf && p->dsp) {
+		p->dsp_features &= ~DSP_FEATURE_DTMF_DETECT;
+		ast_dsp_set_features(p->dsp, p->dsp_features);
+	}
+}
+
+static void enable_dtmf_detect(struct dahdi_pvt *p)
+{
+	int val;
+
+	if (p->channel == CHAN_PSEUDO)
+		return;
+
+	p->ignoredtmf = 0;
+
+	val = DAHDI_TONEDETECT_ON | DAHDI_TONEDETECT_MUTE;
+	ioctl(p->subs[SUB_REAL].dfd, DAHDI_TONEDETECT, &val);
+
+	if (!p->hardwaredtmf && p->dsp) {
+		p->dsp_features |= DSP_FEATURE_DTMF_DETECT;
+		ast_dsp_set_features(p->dsp, p->dsp_features);
+	}
+}
+
+static int dahdi_queryoption(struct ast_channel *chan, int option, void *data, int *datalen)
+{
+	char *cp;
+	struct dahdi_pvt *p = chan->tech_pvt;
+
+	/* all supported options require data */
+	if (!data || (*datalen < 1)) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	switch (option) {
+	case AST_OPTION_DIGIT_DETECT:
+		cp = (char *) data;
+		*cp = p->ignoredtmf ? 0 : 1;
+		ast_debug(1, "Reporting digit detection %sabled on %s\n", *cp ? "en" : "dis", chan->name);
+		break;
+	case AST_OPTION_FAX_DETECT:
+		cp = (char *) data;
+		*cp = (p->callprogress & CALLPROGRESS_FAX) ? 0 : 1;
+		ast_debug(1, "Reporting fax tone detection %sabled on %s\n", *cp ? "en" : "dis", chan->name);
+		break;
+	}
+
+	errno = 0;
+
+	return 0;
+}
+
 static int dahdi_setoption(struct ast_channel *chan, int option, void *data, int datalen)
 {
 	char *cp;
@@ -3987,6 +4051,29 @@
 			dahdi_disable_ec(p);
 		}
 		break;
+	case AST_OPTION_DIGIT_DETECT:
+		cp = (char *) data;
+		ast_debug(1, "%sabling digit detection on %s\n", *cp ? "En" : "Dis", chan->name);
+		if (*cp) {
+			enable_dtmf_detect(p);
+		} else {
+			disable_dtmf_detect(p);
+		}
+		break;
+	case AST_OPTION_FAX_DETECT:
+		cp = (char *) data;
+		if (p->dsp) {
+			ast_debug(1, "%sabling fax tone detection on %s\n", *cp ? "En" : "Dis", chan->name);
+			if (*cp) {
+				p->callprogress |= CALLPROGRESS_FAX;
+				p->dsp_features |= DSP_FEATURE_FAX_DETECT;
+			} else {
+				p->callprogress &= ~CALLPROGRESS_FAX;
+				p->dsp_features &= ~DSP_FEATURE_FAX_DETECT;
+			}
+			ast_dsp_set_features(p->dsp, p->dsp_features);
+		}
+		break;
 	}
 	errno = 0;
 
@@ -4089,39 +4176,6 @@
 	slave->master = master;
 	
 	ast_debug(1, "Making %d slave to master %d at %d\n", slave->channel, master->channel, x);
-}
-
-static void disable_dtmf_detect(struct dahdi_pvt *p)
-{
-	int val;
-
-	p->ignoredtmf = 1;
-
-	val = 0;
-	ioctl(p->subs[SUB_REAL].dfd, DAHDI_TONEDETECT, &val);
-
-	if (!p->hardwaredtmf && p->dsp) {
-		p->dsp_features &= ~DSP_FEATURE_DTMF_DETECT;
-		ast_dsp_set_features(p->dsp, p->dsp_features);
-	}
-}
-
-static void enable_dtmf_detect(struct dahdi_pvt *p)
-{
-	int val;
-
-	if (p->channel == CHAN_PSEUDO)
-		return;
-
-	p->ignoredtmf = 0;
-
-	val = DAHDI_TONEDETECT_ON | DAHDI_TONEDETECT_MUTE;
-	ioctl(p->subs[SUB_REAL].dfd, DAHDI_TONEDETECT, &val);
-
-	if (!p->hardwaredtmf && p->dsp) {
-		p->dsp_features |= DSP_FEATURE_DTMF_DETECT;
-		ast_dsp_set_features(p->dsp, p->dsp_features);
-	}
 }
 
 static enum ast_bridge_result dahdi_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms)
@@ -4612,6 +4666,10 @@
 		/* Fax tone -- Handle and return NULL */
 		if ((p->callprogress & CALLPROGRESS_FAX) && !p->faxhandled) {
 			p->faxhandled = 1;
+			p->callprogress &= ~CALLPROGRESS_FAX;
+			p->dsp_features &= ~DSP_FEATURE_FAX_DETECT;
+			ast_dsp_set_features(p->dsp, p->dsp_features);
+			ast_debug(1, "Disabling FAX tone detection on %s after tone received\n", ast->name);
 			if (strcmp(ast->exten, "fax")) {
 				const char *target_context = S_OR(ast->macrocontext, ast->context);
 

Modified: team/kpfleming/dahdi-dsp-options/include/asterisk/frame.h
URL: http://svn.digium.com/svn-view/asterisk/team/kpfleming/dahdi-dsp-options/include/asterisk/frame.h?view=diff&rev=183443&r1=183442&r2=183443
==============================================================================
--- team/kpfleming/dahdi-dsp-options/include/asterisk/frame.h (original)
+++ team/kpfleming/dahdi-dsp-options/include/asterisk/frame.h Thu Mar 19 16:14:48 2009
@@ -375,6 +375,12 @@
  */
 #define AST_OPTION_T38_STATE		10
 
+/*! Get or set the digit detection state of the channel */
+#define AST_OPTION_DIGIT_DETECT		11
+
+/*! Get or set the fax tone detection state of the channel */
+#define AST_OPTION_FAX_DETECT		12
+
 struct oprmode {
 	struct ast_channel *peer;
 	int mode;




More information about the asterisk-commits mailing list