diff options
author | Jenkins2 <jenkins2@gerrit.asterisk.org> | 2017-07-19 10:42:51 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2017-07-19 10:42:51 -0500 |
commit | 9b07d3ba18749a9a15512ac751731164fa0cd32e (patch) | |
tree | b8b39f2e0d7b5eb4ed21d24cd4f1ab1b1fb19fd1 /bridges | |
parent | 62c381afdbbf4bfa3f04d7b820c566c5eeb60272 (diff) | |
parent | f48695ce5bde836691e1b46350c22f1de21de5d9 (diff) |
Merge "bridge_softmix: Use removed stream spots when renegotiating."
Diffstat (limited to 'bridges')
-rw-r--r-- | bridges/bridge_softmix.c | 19 |
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; } |