[asterisk-dev] [asterisk-commits] jrose: branch 1.8 r336294 - in /branches/1.8: channels/ include/asterisk/ main/

Stefan Schmidt sst at sil.at
Thu Dec 22 02:56:43 CST 2011


Hello,

this introduce a regression to music on hold when a channel is put on hold.

see https://issues.asterisk.org/jira/browse/ASTERISK-19095 for it.

best regards

Stefan

Am 16.09.11 21:53, schrieb SVN commits to the Asterisk project:
> Author: jrose
> Date: Fri Sep 16 14:53:40 2011
> New Revision: 336294
> 
> URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=336294
> Log:
> Fix bad RTP media bridges in directmedia calls on peers separated by multiple Asterisk nodes.
> 
> In a situation involving devices on separate Asterisk trunks, the remote RTP bridge would
> break when starting a call with directmedia. This patch queues a new type of control frame
> so that our RTP bridge loop can properly detect when these situations occur and check to see
> if peers need to be updated in order to send their media to the proper location.
> 
> (Closes issue ASTERISK-18340)
> (Closes issue ASTERISK-17725)
> Reported by: Thomas Arimont
> Tested by: twilson, jrose
> 
> Modified:
>     branches/1.8/channels/chan_sip.c
>     branches/1.8/include/asterisk/frame.h
>     branches/1.8/main/channel.c
>     branches/1.8/main/rtp_engine.c
> 
> Modified: branches/1.8/channels/chan_sip.c
> URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_sip.c?view=diff&rev=336294&r1=336293&r2=336294
> ==============================================================================
> --- branches/1.8/channels/chan_sip.c (original)
> +++ branches/1.8/channels/chan_sip.c Fri Sep 16 14:53:40 2011
> @@ -19608,7 +19608,7 @@
>  						"Channel: %s\r\nChanneltype: %s\r\nUniqueid: %s\r\nSIPcallid: %s\r\nSIPfullcontact: %s\r\nPeername: %s\r\n",
>  						p->owner->name, "SIP", p->owner->uniqueid, p->callid, p->fullcontact, p->peername);
>  			} else {	/* RE-invite */
> -				ast_queue_frame(p->owner, &ast_null_frame);
> +				ast_queue_control(p->owner, AST_CONTROL_UPDATE_RTP_PEER);
>  			}
>  		} else {
>  			 /* It's possible we're getting an 200 OK after we've tried to disconnect
> @@ -22437,6 +22437,7 @@
>  				} else {
>  					ast_set_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED);
>  					transmit_response_with_sdp(p, "200 OK", req, (reinvite ? XMIT_RELIABLE : (req->ignore ?  XMIT_UNRELIABLE : XMIT_CRITICAL)), p->session_modify == TRUE ? FALSE : TRUE, FALSE);
> +					ast_queue_control(p->owner, AST_CONTROL_UPDATE_RTP_PEER);
>  				}
>  			}
>  
> 
> Modified: branches/1.8/include/asterisk/frame.h
> URL: http://svnview.digium.com/svn/asterisk/branches/1.8/include/asterisk/frame.h?view=diff&rev=336294&r1=336293&r2=336294
> ==============================================================================
> --- branches/1.8/include/asterisk/frame.h (original)
> +++ branches/1.8/include/asterisk/frame.h Fri Sep 16 14:53:40 2011
> @@ -335,6 +335,7 @@
>  	AST_CONTROL_AOC = 28,			/*!< Advice of Charge with encoded generic AOC payload */
>  	AST_CONTROL_END_OF_Q = 29,		/*!< Indicate that this position was the end of the channel queue for a softhangup. */
>  	AST_CONTROL_INCOMPLETE = 30,	/*!< Indication that the extension dialed is incomplete */
> +	AST_CONTROL_UPDATE_RTP_PEER = 31, /*!< Interrupt the bridge and have it update the peer */
>  };
>  
>  enum ast_frame_read_action {
> 
> Modified: branches/1.8/main/channel.c
> URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/channel.c?view=diff&rev=336294&r1=336293&r2=336294
> ==============================================================================
> --- branches/1.8/main/channel.c (original)
> +++ branches/1.8/main/channel.c Fri Sep 16 14:53:40 2011
> @@ -4291,6 +4291,7 @@
>  	case AST_CONTROL_READ_ACTION:
>  	case AST_CONTROL_AOC:
>  	case AST_CONTROL_END_OF_Q:
> +	case AST_CONTROL_UPDATE_RTP_PEER:
>  		break;
>  
>  	case AST_CONTROL_INCOMPLETE:
> @@ -4478,6 +4479,7 @@
>  	case AST_CONTROL_READ_ACTION:
>  	case AST_CONTROL_AOC:
>  	case AST_CONTROL_END_OF_Q:
> +	case AST_CONTROL_UPDATE_RTP_PEER:
>  		/* Nothing left to do for these. */
>  		res = 0;
>  		break;
> 
> Modified: branches/1.8/main/rtp_engine.c
> URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/rtp_engine.c?view=diff&rev=336294&r1=336293&r2=336294
> ==============================================================================
> --- branches/1.8/main/rtp_engine.c (original)
> +++ branches/1.8/main/rtp_engine.c Fri Sep 16 14:53:40 2011
> @@ -1134,7 +1134,8 @@
>  			    (fr->subclass.integer == AST_CONTROL_UNHOLD) ||
>  			    (fr->subclass.integer == AST_CONTROL_VIDUPDATE) ||
>  			    (fr->subclass.integer == AST_CONTROL_SRCUPDATE) ||
> -			    (fr->subclass.integer == AST_CONTROL_T38_PARAMETERS)) {
> +			    (fr->subclass.integer == AST_CONTROL_T38_PARAMETERS) ||
> +				(fr->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER)) {
>  				if (fr->subclass.integer == AST_CONTROL_HOLD) {
>  					/* If we someone went on hold we want the other side to reinvite back to us */
>  					if (who == c0) {
> @@ -1142,8 +1143,10 @@
>  					} else {
>  						glue0->update_peer(c0, NULL, NULL, NULL, 0, 0);
>  					}
> -				} else if (fr->subclass.integer == AST_CONTROL_UNHOLD) {
> -					/* If they went off hold they should go back to being direct */
> +				} else if (fr->subclass.integer == AST_CONTROL_UNHOLD ||
> +					fr->subclass.integer == AST_CONTROL_UPDATE_RTP_PEER) {
> +					/* If they went off hold they should go back to being direct, or if we have
> +					 * been told to force a peer update, go ahead and do it. */
>  					if (who == c0) {
>  						glue1->update_peer(c1, instance0, vinstance0, tinstance0, codec0, 0);
>  					} else {
> @@ -1162,7 +1165,10 @@
>  				if (glue1->get_codec && c1->tech_pvt) {
>  					oldcodec1 = codec1 = glue1->get_codec(c1);
>  				}
> -				ast_indicate_data(other, fr->subclass.integer, fr->data.ptr, fr->datalen);
> +				/* Since UPDATE_BRIDGE_PEER is only used by the bridging code, don't forward it */
> +				if (fr->subclass.integer != AST_CONTROL_UPDATE_RTP_PEER) {
> +					ast_indicate_data(other, fr->subclass.integer, fr->data.ptr, fr->datalen);
> +				}
>  				ast_frfree(fr);
>  			} else if (fr->subclass.integer == AST_CONTROL_CONNECTED_LINE) {
>  				if (ast_channel_connected_line_macro(who, other, fr, other == c0, 1)) {
> 
> 
> --
> _____________________________________________________________________
> -- Bandwidth and Colocation Provided by http://www.api-digital.com --
> 
> asterisk-commits mailing list
> To UNSUBSCRIBE or update options visit:
>    http://lists.digium.com/mailman/listinfo/asterisk-commits


-- 
Für weitere Fragen stehen wir gerne unter voip at sil.at oder
059944 - 2440 zur Verfügung.

Mit freundlichen Grüssen
-- 
Stefan Schmidt
Teamleiter VOIP // voip at sil.at // Tel 059944-2440//
-------------------------------------------------
SILVER SERVER GmbH // Lorenz-Mandl-Gasse 33/1 //
A-1160 Wien // Fax 059944-9000 // www.sil.at  //
-------------------------------------------------



More information about the asterisk-dev mailing list