summaryrefslogtreecommitdiff
path: root/bridges
diff options
context:
space:
mode:
authorJenkins2 <jenkins2@gerrit.asterisk.org>2017-07-19 10:42:51 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2017-07-19 10:42:51 -0500
commit9b07d3ba18749a9a15512ac751731164fa0cd32e (patch)
treeb8b39f2e0d7b5eb4ed21d24cd4f1ab1b1fb19fd1 /bridges
parent62c381afdbbf4bfa3f04d7b820c566c5eeb60272 (diff)
parentf48695ce5bde836691e1b46350c22f1de21de5d9 (diff)
Merge "bridge_softmix: Use removed stream spots when renegotiating."
Diffstat (limited to 'bridges')
-rw-r--r--bridges/bridge_softmix.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/bridges/bridge_softmix.c b/bridges/bridge_softmix.c
index 3dd26603e..f3b5b2aa9 100644
--- a/bridges/bridge_softmix.c
+++ b/bridges/bridge_softmix.c
@@ -524,15 +524,32 @@ static int append_all_streams(struct ast_stream_topology *dest,
const struct ast_stream_topology *source)
{
int i;
+ int dest_index = 0;
for (i = 0; i < ast_stream_topology_get_count(source); ++i) {
struct ast_stream *clone;
+ int added = 0;
clone = ast_stream_clone(ast_stream_topology_get_stream(source, i), NULL);
if (!clone) {
return -1;
}
- if (ast_stream_topology_append_stream(dest, clone) < 0) {
+
+ /* If we can reuse an existing removed stream then do so */
+ while (dest_index < ast_stream_topology_get_count(dest)) {
+ struct ast_stream *stream = ast_stream_topology_get_stream(dest, dest_index);
+
+ dest_index++;
+
+ if (ast_stream_get_state(stream) == AST_STREAM_STATE_REMOVED) {
+ ast_stream_topology_set_stream(dest, dest_index - 1, clone);
+ added = 1;
+ break;
+ }
+ }
+
+ /* If no removed stream exists that we took the place of append the stream */
+ if (!added && ast_stream_topology_append_stream(dest, clone) < 0) {
ast_stream_free(clone);
return -1;
}