[asterisk-commits] Local channels: Alternate solution to ringback problem. (asterisk[11])

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Jul 24 10:39:55 CDT 2015


Joshua Colp has submitted this change and it was merged.

Change subject: Local channels: Alternate solution to ringback problem.
......................................................................


Local channels: Alternate solution to ringback problem.

Commit 54b25c80c8387aea9eb20f9f4f077486cbdf3e5d solved an issue where a
specific scenario involving local channels and a native local RTP bridge
could result in ringback still being heard on a calling channel even
after the call is bridged.

That commit caused many tests in the testsuite to fail with alarming
consequences, such as not sending DialBegin and DialEnd events, and
giving incorrect hangup causes during calls.

This commit reverts the previous commit and implements and alternate
solution. This new solution involves only passing AST_CONTROL_RINGING
frames across local channels if the local channel is in AST_STATE_RING.
Otherwise, the frame does not traverse the local channels. By doing
this, we can ensure that a playtones generator does not get started on
the calling channel but rather is started on the local channel on which
the ringing frame was initially indicated.

ASTERISK-25250 #close
Reported by Etienne Lessard

Change-Id: I3bc87a18a38eb2b68064f732d098edceb5c19f39
---
M channels/chan_local.c
1 file changed, 13 insertions(+), 1 deletion(-)

Approvals:
  Richard Mudgett: Looks good to me, but someone else must approve
  Anonymous Coward #1000019: Verified
  Joshua Colp: Looks good to me, approved



diff --git a/channels/chan_local.c b/channels/chan_local.c
index 794bbae..562c181 100644
--- a/channels/chan_local.c
+++ b/channels/chan_local.c
@@ -751,10 +751,22 @@
 			res = local_queue_frame(p, isoutbound, &f, ast, 1);
 		}
 		ao2_unlock(p);
+	} else if (condition == AST_CONTROL_RINGING && ast_channel_state(ast) != AST_STATE_RING) {
+		/* Don't queue ringing frames if the channel is not in a "ring" state. Otherwise,
+		 * the real channel on the other end will likely start a playtones generator. It is
+		 * possible that this playtones generator will never be stopped under certain
+		 * circumstances.
+		 */
+		res = -1;
 	} else {
 		/* Queue up a frame representing the indication as a control frame */
 		ao2_lock(p);
-		if (ast_test_flag(p, LOCAL_NO_OPTIMIZATION)) {
+		/*
+		 * Block -1 stop tones events if we are to be optimized out.  We
+		 * don't need a flurry of these events on an unreal channel chain
+		 * when initially connected to slow the optimization process.
+		 */
+		if (0 <= condition || ast_test_flag(p, LOCAL_NO_OPTIMIZATION)) {
 			isoutbound = IS_OUTBOUND(ast, p);
 			f.subclass.integer = condition;
 			f.data.ptr = (void *) data;

-- 
To view, visit https://gerrit.asterisk.org/955
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I3bc87a18a38eb2b68064f732d098edceb5c19f39
Gerrit-PatchSet: 2
Gerrit-Project: asterisk
Gerrit-Branch: 11
Gerrit-Owner: Mark Michelson <mmichelson at digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Richard Mudgett <rmudgett at digium.com>



More information about the asterisk-commits mailing list