mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	ARI: Ability to inhibit COLP frames when adding channels to a bridge
This patch adds a new flag "inhibitConnectedLineUpdates" to the 'addChannel' operation in the Bridges REST API. When set, this flag avoids generating COLP frames when the specified channels enter the bridge. ASTERISK-28629 Change-Id: Ib995d4f0c6106279aa448b34b042b68f0f2ca5dc
This commit is contained in:
		
				
					committed by
					
						 Joshua C. Colp
						Joshua C. Colp
					
				
			
			
				
	
			
			
			
						parent
						
							987e10c75f
						
					
				
				
					commit
					034ac357ad
				
			
							
								
								
									
										5
									
								
								doc/CHANGES-staging/ari-bridges-inhibit-colp.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								doc/CHANGES-staging/ari-bridges-inhibit-colp.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| Subject: ARI | ||||
|  | ||||
| A new parameter 'inhibitConnectedLineUpdates' is now available in the | ||||
| 'bridges.addChannel' call. This prevents the identity of the newly connected | ||||
| channel from being presented to other bridge members. | ||||
| @@ -277,6 +277,8 @@ struct ast_bridge_features { | ||||
| 	unsigned int mute:1; | ||||
| 	/*! TRUE if DTMF should be passed into the bridge tech.  */ | ||||
| 	unsigned int dtmf_passthrough:1; | ||||
| 	/*! TRUE to avoid generating COLP frames when joining the bridge */ | ||||
| 	unsigned int inhibit_colp:1; | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|   | ||||
| @@ -837,6 +837,16 @@ void stasis_app_control_absorb_dtmf_in_bridge( | ||||
| void stasis_app_control_mute_in_bridge( | ||||
| 	struct stasis_app_control *control, int mute); | ||||
|  | ||||
| /*! | ||||
|  * \since 18 | ||||
|  * \brief Set whether COLP frames should be generated when joining the bridge | ||||
|  * | ||||
|  * \param control Control whose channel should have its COLP frames inhibited when bridged | ||||
|  * \param mute Whether COLP frames should be generated (0) or not (1). | ||||
|  */ | ||||
| void stasis_app_control_inhibit_colp_in_bridge( | ||||
| 	struct stasis_app_control *control, int inhibit_colp); | ||||
|  | ||||
| /*! | ||||
|  * \since 12 | ||||
|  * \brief Gets the bridge currently associated with a control object. | ||||
|   | ||||
| @@ -221,6 +221,7 @@ void ast_ari_bridges_add_channel(struct ast_variable *headers, | ||||
| 		if (!stasis_app_control_bridge_features_init(list->controls[i])) { | ||||
| 			stasis_app_control_absorb_dtmf_in_bridge(list->controls[i], args->absorb_dtmf); | ||||
| 			stasis_app_control_mute_in_bridge(list->controls[i], args->mute); | ||||
| 			stasis_app_control_inhibit_colp_in_bridge(list->controls[i], args->inhibit_connected_line_updates); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -154,6 +154,8 @@ struct ast_ari_bridges_add_channel_args { | ||||
| 	int absorb_dtmf; | ||||
| 	/*! Mute audio from this channel, preventing it to pass through to the bridge */ | ||||
| 	int mute; | ||||
| 	/*! Do not present the identity of the newly connected channel to other bridge members */ | ||||
| 	int inhibit_connected_line_updates; | ||||
| }; | ||||
| /*! | ||||
|  * \brief Body parsing function for /bridges/{bridgeId}/addChannel. | ||||
|   | ||||
| @@ -440,6 +440,10 @@ int ast_ari_bridges_add_channel_parse_body( | ||||
| 	if (field) { | ||||
| 		args->mute = ast_json_is_true(field); | ||||
| 	} | ||||
| 	field = ast_json_object_get(body, "inhibitConnectedLineUpdates"); | ||||
| 	if (field) { | ||||
| 		args->inhibit_connected_line_updates = ast_json_is_true(field); | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @@ -515,6 +519,9 @@ static void ast_ari_bridges_add_channel_cb( | ||||
| 		if (strcmp(i->name, "mute") == 0) { | ||||
| 			args.mute = ast_true(i->value); | ||||
| 		} else | ||||
| 		if (strcmp(i->name, "inhibitConnectedLineUpdates") == 0) { | ||||
| 			args.inhibit_connected_line_updates = ast_true(i->value); | ||||
| 		} else | ||||
| 		{} | ||||
| 	} | ||||
| 	for (i = path_vars; i; i = i->next) { | ||||
|   | ||||
| @@ -1285,6 +1285,7 @@ int control_swap_channel_in_bridge(struct stasis_app_control *control, struct as | ||||
| { | ||||
| 	int res; | ||||
| 	struct ast_bridge_features *features; | ||||
| 	int flags = AST_BRIDGE_IMPART_CHAN_DEPARTABLE; | ||||
|  | ||||
| 	if (!control || !bridge) { | ||||
| 		return -1; | ||||
| @@ -1332,6 +1333,9 @@ int control_swap_channel_in_bridge(struct stasis_app_control *control, struct as | ||||
| 	/* Pull bridge features from the control */ | ||||
| 	features = control->bridge_features; | ||||
| 	control->bridge_features = NULL; | ||||
| 	if (features && features->inhibit_colp) { | ||||
| 		flags |= AST_BRIDGE_IMPART_INHIBIT_JOIN_COLP; | ||||
| 	} | ||||
|  | ||||
| 	ast_assert(stasis_app_get_bridge(control) == NULL); | ||||
| 	/* We need to set control->bridge here since bridge_after_cb may be run | ||||
| @@ -1349,7 +1353,7 @@ int control_swap_channel_in_bridge(struct stasis_app_control *control, struct as | ||||
| 		chan, | ||||
| 		swap, | ||||
| 		features, /* features */ | ||||
| 		AST_BRIDGE_IMPART_CHAN_DEPARTABLE); | ||||
| 		flags); | ||||
| 	if (res != 0) { | ||||
| 		/* ast_bridge_impart failed before it could spawn the depart | ||||
| 		 * thread.  The callbacks aren't called in this case. | ||||
| @@ -1469,6 +1473,12 @@ void stasis_app_control_mute_in_bridge( | ||||
| 	control->bridge_features->mute = mute; | ||||
| } | ||||
|  | ||||
| void stasis_app_control_inhibit_colp_in_bridge( | ||||
| 	struct stasis_app_control *control, int inhibit_colp) | ||||
| { | ||||
| 	control->bridge_features->inhibit_colp = inhibit_colp; | ||||
| } | ||||
|  | ||||
| void control_flush_queue(struct stasis_app_control *control) | ||||
| { | ||||
| 	struct ao2_iterator iter; | ||||
|   | ||||
| @@ -191,6 +191,15 @@ | ||||
| 							"allowMultiple": false, | ||||
| 							"dataType": "boolean", | ||||
| 							"defaultValue": false | ||||
| 						}, | ||||
| 						{ | ||||
| 							"name": "inhibitConnectedLineUpdates", | ||||
| 							"description": "Do not present the identity of the newly connected channel to other bridge members", | ||||
| 							"paramType": "query", | ||||
| 							"required": false, | ||||
| 							"allowMultiple": false, | ||||
| 							"dataType": "boolean", | ||||
| 							"defaultValue": false | ||||
| 						} | ||||
| 					], | ||||
| 					"errorResponses": [ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user