summaryrefslogtreecommitdiff
path: root/res/stasis
diff options
context:
space:
mode:
authorSeán C McCord <ulexus@gmail.com>2017-10-06 21:48:48 -0400
committerSeán C McCord <ulexus@gmail.com>2017-10-11 08:23:05 -0400
commite8bde6916ab0003e6737a320074b1c6ae1516db0 (patch)
tree6e08df9a01a8d0a5bfe3792730a79cf9051d9a78 /res/stasis
parent1505c1bb09987b36c4c55d1ab6d95e57d0fede16 (diff)
ari/bridge: Add mute, dtmf suppression controls
Add bridge_features structure to bridge creation. Specifically, this implements mute and DTMF suppression, but others should be able to be easily added to the same structure. ASTERISK-27322 #close Reported by: Darren Sessions Sponsored by: AVOXI Change-Id: Id4002adfb65c9a8027ee9e1a5f477e0f01cf9d61
Diffstat (limited to 'res/stasis')
-rw-r--r--res/stasis/control.c39
1 files changed, 38 insertions, 1 deletions
diff --git a/res/stasis/control.c b/res/stasis/control.c
index 01c04dffe..dc005a1e5 100644
--- a/res/stasis/control.c
+++ b/res/stasis/control.c
@@ -35,6 +35,7 @@
#include "asterisk/bridge.h"
#include "asterisk/bridge_after.h"
#include "asterisk/bridge_basic.h"
+#include "asterisk/bridge_features.h"
#include "asterisk/frame.h"
#include "asterisk/pbx.h"
#include "asterisk/musiconhold.h"
@@ -62,6 +63,10 @@ struct stasis_app_control {
*/
struct ast_bridge *bridge;
/*!
+ * Bridge features which should be applied to the channel when it enters the next bridge. These only apply to the next bridge and will be emptied thereafter.
+ */
+ struct ast_bridge_features *bridge_features;
+ /*!
* Holding place for channel's PBX while imparted to a bridge.
*/
struct ast_pbx *pbx;
@@ -99,6 +104,8 @@ static void control_dtor(void *obj)
ast_cond_destroy(&control->wait_cond);
AST_LIST_HEAD_DESTROY(&control->add_rules);
AST_LIST_HEAD_DESTROY(&control->remove_rules);
+ ast_bridge_features_destroy(control->bridge_features);
+
}
struct stasis_app_control *control_create(struct ast_channel *channel, struct stasis_app *app)
@@ -1161,6 +1168,7 @@ static void set_interval_hook(struct ast_channel *chan)
int control_swap_channel_in_bridge(struct stasis_app_control *control, struct ast_bridge *bridge, struct ast_channel *chan, struct ast_channel *swap)
{
int res;
+ struct ast_bridge_features *features;
if (!control || !bridge) {
return -1;
@@ -1205,6 +1213,10 @@ int control_swap_channel_in_bridge(struct stasis_app_control *control, struct as
ast_channel_pbx_set(chan, NULL);
}
+ /* Pull bridge features from the control */
+ features = control->bridge_features;
+ control->bridge_features = NULL;
+
ast_assert(stasis_app_get_bridge(control) == NULL);
/* We need to set control->bridge here since bridge_after_cb may be run
* before ast_bridge_impart returns. bridge_after_cb gets a reason
@@ -1220,7 +1232,7 @@ int control_swap_channel_in_bridge(struct stasis_app_control *control, struct as
res = ast_bridge_impart(bridge,
chan,
swap,
- NULL, /* features */
+ features, /* features */
AST_BRIDGE_IMPART_CHAN_DEPARTABLE);
if (res != 0) {
/* ast_bridge_impart failed before it could spawn the depart
@@ -1316,6 +1328,31 @@ int stasis_app_control_queue_control(struct stasis_app_control *control,
return ast_queue_control(control->channel, frame_type);
}
+int stasis_app_control_bridge_features_init(
+ struct stasis_app_control *control)
+{
+ struct ast_bridge_features *features;
+
+ features = ast_bridge_features_new();
+ if (!features) {
+ return 1;
+ }
+ control->bridge_features = features;
+ return 0;
+}
+
+void stasis_app_control_absorb_dtmf_in_bridge(
+ struct stasis_app_control *control, int absorb)
+{
+ control->bridge_features->dtmf_passthrough = !absorb;
+}
+
+void stasis_app_control_mute_in_bridge(
+ struct stasis_app_control *control, int mute)
+{
+ control->bridge_features->mute = mute;
+}
+
void control_flush_queue(struct stasis_app_control *control)
{
struct ao2_iterator iter;