diff --git a/bridges/bridge_softmix.c b/bridges/bridge_softmix.c index ae877eb6e3cb48fd0dc390d08a1af35a4d03fee3..3801ccbec2aff8a6f71166c308b0d4983c9abd8b 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; }