diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/module-combine.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/modules/module-combine.c b/src/modules/module-combine.c index 5f94fdd2..01d7a4ec 100644 --- a/src/modules/module-combine.c +++ b/src/modules/module-combine.c @@ -47,6 +47,7 @@ #include <pulsecore/rtpoll.h> #include <pulsecore/core-error.h> #include <pulsecore/time-smoother.h> +#include <pulsecore/strlist.h> #include "module-combine-symdef.h" @@ -125,6 +126,8 @@ struct userdata { pa_bool_t automatic; pa_bool_t auto_desc; + pa_strlist *unlinked_slaves; + pa_hook_slot *sink_put_slot, *sink_unlink_slot, *sink_state_changed_slot; pa_resample_method_t resample_method; @@ -1026,11 +1029,23 @@ static pa_hook_result_t sink_put_hook_cb(pa_core *c, pa_sink *s, struct userdata pa_core_assert_ref(c); pa_sink_assert_ref(s); pa_assert(u); - pa_assert(u->automatic); if (!is_suitable_sink(u, s)) return PA_HOOK_OK; + /* Check if the sink is a previously unlinked slave (non-automatic mode) */ + if (!u->automatic) { + pa_strlist *l = u->unlinked_slaves; + + while (l && !pa_streq(pa_strlist_data(l), s->name)) + l = pa_strlist_next(l); + + if (l) + u->unlinked_slaves = pa_strlist_remove(u->unlinked_slaves, s->name); + else + return PA_HOOK_OK; + } + pa_log_info("Configuring new sink: %s", s->name); if (!(o = output_new(u, s))) { pa_log("Failed to create sink input on sink '%s'.", s->name); @@ -1072,6 +1087,10 @@ static pa_hook_result_t sink_unlink_hook_cb(pa_core *c, pa_sink *s, struct userd return PA_HOOK_OK; pa_log_info("Unconfiguring sink: %s", s->name); + + if (!u->automatic) + u->unlinked_slaves = pa_strlist_prepend(u->unlinked_slaves, s->name); + output_free(o); return PA_HOOK_OK; @@ -1297,10 +1316,9 @@ int pa__init(pa_module*m) { goto fail; } } - - u->sink_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE, (pa_hook_cb_t) sink_put_hook_cb, u); } + u->sink_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE, (pa_hook_cb_t) sink_put_hook_cb, u); u->sink_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_EARLY, (pa_hook_cb_t) sink_unlink_hook_cb, u); u->sink_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) sink_state_changed_hook_cb, u); @@ -1341,6 +1359,8 @@ void pa__done(pa_module*m) { if (!(u = m->userdata)) return; + pa_strlist_free(u->unlinked_slaves); + if (u->sink_put_slot) pa_hook_slot_free(u->sink_put_slot); |