[asterisk-commits] kpfleming: trunk r106040 - in /trunk: ./ channels/chan_zap.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Mar 5 09:40:40 CST 2008


Author: kpfleming
Date: Wed Mar  5 09:40:40 2008
New Revision: 106040

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

........
r106038 | kpfleming | 2008-03-05 09:32:35 -0600 (Wed, 05 Mar 2008) | 7 lines

when a PRI call must be moved to a different B channel at the request of the other endpoint, ensure that any DSP active on the original channel is moved to the new one

(closes issue #11917)
Reported by: mavetju
Tested by: mavetju


........

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

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=106040&r1=106039&r2=106040
==============================================================================
--- trunk/channels/chan_zap.c (original)
+++ trunk/channels/chan_zap.c Wed Mar  5 09:40:40 2008
@@ -9811,29 +9811,36 @@
 		if (pri->pvts[x]->call == c) {
 			/* Found our call */
 			if (principle != x) {
+				struct zt_pvt *new = pri->pvts[principle], *old = pri->pvts[x];
+
 				ast_verb(3, "Moving call from channel %d to channel %d\n",
-						pri->pvts[x]->channel, pri->pvts[principle]->channel);
-				if (pri->pvts[principle]->owner) {
+					 old->channel, new->channel);
+				if (new->owner) {
 					ast_log(LOG_WARNING, "Can't fix up channel from %d to %d because %d is already in use\n",
-						pri->pvts[x]->channel, pri->pvts[principle]->channel, pri->pvts[principle]->channel);
+						old->channel, new->channel, new->channel);
 					return -1;
 				}
 				/* Fix it all up now */
-				pri->pvts[principle]->owner = pri->pvts[x]->owner;
-				if (pri->pvts[principle]->owner) {
-					ast_string_field_build(pri->pvts[principle]->owner, name, 
+				new->owner = old->owner;
+				old->owner = NULL;
+				if (new->owner) {
+					ast_string_field_build(new->owner, name, 
 							       "Zap/%d:%d-%d", pri->trunkgroup,
-							       pri->pvts[principle]->channel, 1);
-					pri->pvts[principle]->owner->tech_pvt = pri->pvts[principle];
-					ast_channel_set_fd(pri->pvts[principle]->owner, 0, pri->pvts[principle]->subs[SUB_REAL].zfd);
-					pri->pvts[principle]->subs[SUB_REAL].owner = pri->pvts[x]->subs[SUB_REAL].owner;
+							       new->channel, 1);
+					new->owner->tech_pvt = new;
+					ast_channel_set_fd(new->owner, 0, new->subs[SUB_REAL].zfd);
+					new->subs[SUB_REAL].owner = old->subs[SUB_REAL].owner;
+					old->subs[SUB_REAL].owner = NULL;
 				} else
-					ast_log(LOG_WARNING, "Whoa, there's no  owner, and we're having to fix up channel %d to channel %d\n", pri->pvts[x]->channel, pri->pvts[principle]->channel);
-				pri->pvts[principle]->call = pri->pvts[x]->call;
-				/* Free up the old channel, now not in use */
-				pri->pvts[x]->subs[SUB_REAL].owner = NULL;
-				pri->pvts[x]->owner = NULL;
-				pri->pvts[x]->call = NULL;
+					ast_log(LOG_WARNING, "Whoa, there's no  owner, and we're having to fix up channel %d to channel %d\n", old->channel, new->channel);
+				new->call = old->call;
+				old->call = NULL;
+
+				/* Copy any DSP that may be present */
+				new->dsp = old->dsp;
+				new->dsp_features = old->dsp_features;
+				old->dsp = NULL;
+				old->dsp_features = 0;
 			}
 			return principle;
 		}




More information about the asterisk-commits mailing list