summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/bridge_basic.h16
-rw-r--r--main/bridge_basic.c19
-rw-r--r--main/features.c4
3 files changed, 35 insertions, 4 deletions
diff --git a/include/asterisk/bridge_basic.h b/include/asterisk/bridge_basic.h
index 4db142946..d04876235 100644
--- a/include/asterisk/bridge_basic.h
+++ b/include/asterisk/bridge_basic.h
@@ -89,6 +89,22 @@ struct ast_flags *ast_bridge_features_ds_get(struct ast_channel *chan);
int ast_bridge_features_ds_set(struct ast_channel *chan, struct ast_flags *flags);
/*!
+ * \brief Append basic bridge DTMF feature flags on the channel.
+ * \since 12.0.0
+ *
+ * \param chan Channel to append DTMF features datastore.
+ * \param flags Builtin DTMF feature flags. (ast_bridge_config flags)
+ *
+ * \note The channel must be locked before calling this function.
+ * \note This function differs from ast_bridge_features_ds_set only in that it won't
+ * remove features already set on the channel.
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_bridge_features_ds_append(struct ast_channel *chan, struct ast_flags *flags);
+
+/*!
* \brief Setup DTMF feature hooks using the channel features datastore property.
* \since 12.0.0
*
diff --git a/main/bridge_basic.c b/main/bridge_basic.c
index 10c4efb57..35782de28 100644
--- a/main/bridge_basic.c
+++ b/main/bridge_basic.c
@@ -220,7 +220,7 @@ int ast_bridge_features_ds_get_string(struct ast_channel *chan, char *buffer, si
return dtmf_features_flags_to_string(&held_copy, buffer, buf_size);
}
-int ast_bridge_features_ds_set(struct ast_channel *chan, struct ast_flags *flags)
+static int bridge_features_ds_set_full(struct ast_channel *chan, struct ast_flags *flags, int replace)
{
struct ast_datastore *datastore;
struct ast_flags *ds_flags;
@@ -228,7 +228,12 @@ int ast_bridge_features_ds_set(struct ast_channel *chan, struct ast_flags *flags
datastore = ast_channel_datastore_find(chan, &dtmf_features_info, NULL);
if (datastore) {
ds_flags = datastore->data;
- *ds_flags = *flags;
+ if (replace) {
+ *ds_flags = *flags;
+ } else {
+ flags->flags = flags->flags | ds_flags->flags;
+ *ds_flags = *flags;
+ }
return 0;
}
@@ -249,6 +254,16 @@ int ast_bridge_features_ds_set(struct ast_channel *chan, struct ast_flags *flags
return 0;
}
+int ast_bridge_features_ds_set(struct ast_channel *chan, struct ast_flags *flags)
+{
+ return bridge_features_ds_set_full(chan, flags, 1);
+}
+
+int ast_bridge_features_ds_append(struct ast_channel *chan, struct ast_flags *flags)
+{
+ return bridge_features_ds_set_full(chan, flags, 0);
+}
+
struct ast_flags *ast_bridge_features_ds_get(struct ast_channel *chan)
{
struct ast_datastore *datastore;
diff --git a/main/features.c b/main/features.c
index 043ed591f..e2d668426 100644
--- a/main/features.c
+++ b/main/features.c
@@ -953,10 +953,10 @@ static int pre_bridge_setup(struct ast_channel *chan, struct ast_channel *peer,
res = 0;
ast_channel_lock(chan);
- res |= ast_bridge_features_ds_set(chan, &config->features_caller);
+ res |= ast_bridge_features_ds_append(chan, &config->features_caller);
ast_channel_unlock(chan);
ast_channel_lock(peer);
- res |= ast_bridge_features_ds_set(peer, &config->features_callee);
+ res |= ast_bridge_features_ds_append(peer, &config->features_callee);
ast_channel_unlock(peer);
if (res) {