[svn-commits] russell: linux/trunk r4699 - /linux/trunk/drivers/dahdi/dahdi-base.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Aug 4 19:54:49 CDT 2008


Author: russell
Date: Mon Aug  4 19:54:49 2008
New Revision: 4699

URL: http://svn.digium.com/view/dahdi?view=rev&rev=4699
Log:
In the function start_digit(), the same logic was replicated 3 times; one time
for dtmf, one for mfr2_fwd, and one for mfr2_rev.  So, I created a new function
which handles all three cases in a way that is (IMO) easier to read.

Modified:
    linux/trunk/drivers/dahdi/dahdi-base.c

Modified: linux/trunk/drivers/dahdi/dahdi-base.c
URL: http://svn.digium.com/view/dahdi/linux/trunk/drivers/dahdi/dahdi-base.c?view=diff&rev=4699&r1=4698&r2=4699
==============================================================================
--- linux/trunk/drivers/dahdi/dahdi-base.c (original)
+++ linux/trunk/drivers/dahdi/dahdi-base.c Mon Aug  4 19:54:49 2008
@@ -1268,6 +1268,56 @@
 	return res;
 }
 
+static int start_tone_digit(struct dahdi_chan *chan, int tone)
+{
+	struct dahdi_tone *playtone = NULL;
+	int base, max;
+
+	if (!chan->curzone)
+		return -ENODATA;
+
+	switch (chan->digitmode) {
+	case DIGIT_MODE_DTMF:
+		/* Set dialing so that a dial operation doesn't interrupt this tone */
+		chan->dialing = 1;
+		base = DAHDI_TONE_DTMF_BASE;
+		max = DAHDI_TONE_DTMF_MAX;
+		break;
+	case DIGIT_MODE_MFR2_FWD:
+		base = DAHDI_TONE_MFR2_FWD_BASE;
+		max = DAHDI_TONE_MFR2_FWD_MAX;
+		break;
+	case DIGIT_MODE_MFR2_REV:
+		base = DAHDI_TONE_MFR2_REV_BASE;
+		max = DAHDI_TONE_MFR2_REV_MAX;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	if ((tone < base) || (tone > max))
+		return -EINVAL;
+
+	switch (chan->digitmode) {
+	case DIGIT_MODE_DTMF:
+		playtone = &chan->curzone->dtmf_continuous[tone - base];
+		break;
+	case DIGIT_MODE_MFR2_FWD:
+		playtone = &chan->curzone->mfr2_fwd_continuous[tone - base];
+		break;
+	case DIGIT_MODE_MFR2_REV:
+		playtone = &chan->curzone->mfr2_rev_continuous[tone - base];
+		break;
+	}
+
+	if (!playtone || !playtone->tonesamples)
+		return -ENOSYS;
+
+	chan->curtone = playtone;
+
+	return 0;
+}
+
 static int start_tone(struct dahdi_chan *chan, int tone)
 {
 	int res = -EINVAL;
@@ -1299,67 +1349,10 @@
 		} else { /* Indicate that zone is loaded but no such tone exists */
 			res = -ENOSYS;
 		}
-	} else if (chan->digitmode == DIGIT_MODE_DTMF) {
-		if ((tone >= DAHDI_TONE_DTMF_BASE) && (tone <= DAHDI_TONE_DTMF_MAX)) {
-			chan->dialing = 1;
-			res = 0;
-			tone -= DAHDI_TONE_DTMF_BASE;
-			if (chan->curzone) {
-				/* Have a tone zone */
-				if (chan->curzone->dtmf_continuous[tone].tonesamples) {
-					chan->curtone = &chan->curzone->dtmf_continuous[tone];
-					res = 0;
-				} else {
-					/* Indicate that zone is loaded but no such tone exists */
-					res = -ENOSYS;
-				}
-			} else {
-				/* Note that no tone zone exists at the moment */
-				res = -ENODATA;
-			}
-		} else {
-			res = -EINVAL;
-		}
-	} else if (chan->digitmode == DIGIT_MODE_MFR2_FWD) {
-		if ((tone >= DAHDI_TONE_MFR2_FWD_BASE) && (tone <= DAHDI_TONE_MFR2_FWD_MAX)) {
-			res = 0;
-			tone -= DAHDI_TONE_MFR2_FWD_BASE;
-			if (chan->curzone) {
-				/* Have a tone zone */
-				if (chan->curzone->mfr2_fwd_continuous[tone].tonesamples) {
-					chan->curtone = &chan->curzone->mfr2_fwd_continuous[tone];
-					res = 0;
-				} else {
-					/* Indicate that zone is loaded but no such tone exists */
-					res = -ENOSYS;
-				}
-			} else {
-				/* Note that no tone zone exists at the moment */
-				res = -ENODATA;
-			}
-		} else {
-			res = -EINVAL;
-		}
-	} else if (chan->digitmode == DIGIT_MODE_MFR2_REV) {
-		if ((tone >= DAHDI_TONE_MFR2_REV_BASE) && (tone <= DAHDI_TONE_MFR2_REV_MAX)) {
-			res = 0;
-			tone -= DAHDI_TONE_MFR2_REV_BASE;
-			if (chan->curzone) {
-				/* Have a tone zone */
-				if (chan->curzone->mfr2_rev_continuous[tone].tonesamples) {
-					chan->curtone = &chan->curzone->mfr2_rev_continuous[tone];
-					res = 0;
-				} else {
-					/* Indicate that zone is loaded but no such tone exists */
-					res = -ENOSYS;
-				}
-			} else {
-				/* Note that no tone zone exists at the moment */
-				res = -ENODATA;
-			}
-		} else {
-			res = -EINVAL;
-		}
+	} else if (chan->digitmode == DIGIT_MODE_DTMF ||
+			chan->digitmode == DIGIT_MODE_MFR2_FWD ||
+			chan->digitmode == DIGIT_MODE_MFR2_REV) {
+		res = start_tone_digit(chan, tone);
 	} else {
 		chan->dialing = 0;
 		res = -EINVAL;
@@ -1375,7 +1368,6 @@
 {
 	int res = 0;
 	struct dahdi_zone *z;
-	unsigned long flags;
 
 	/* Do not call with the channel locked. */
 
@@ -1388,7 +1380,10 @@
 	read_lock(&zone_lock);
 
 	if ((z = tone_zones[zone])) {
+		unsigned long flags;
+
 		spin_lock_irqsave(&chan->lock, flags);
+
 		if (chan->curzone)
 			atomic_dec(&chan->curzone->refcount);
 
@@ -1396,6 +1391,7 @@
 		chan->curzone = z;
 		chan->tonezone = zone;
 		memcpy(chan->ringcadence, z->ringcadence, sizeof(chan->ringcadence));
+
 		spin_unlock_irqrestore(&chan->lock, flags);
 	} else {
 		res = -ENODATA;




More information about the svn-commits mailing list