From c34a2635b20cf72f906999c3ccedf4433ddf96ed Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 21 Sep 2007 13:32:00 +0000 Subject: allow _unlink() functions to be called as many times as people want, even before _put() was called git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1878 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/pulsecore/source-output.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'src/pulsecore/source-output.c') diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c index 34eef8ba..1991613e 100644 --- a/src/pulsecore/source-output.c +++ b/src/pulsecore/source-output.c @@ -194,20 +194,29 @@ static int source_output_set_state(pa_source_output *o, pa_source_output_state_t } void pa_source_output_unlink(pa_source_output*o) { + pa_bool_t linked; pa_assert(o); - pa_assert(PA_SOURCE_OUTPUT_LINKED(o->state)); - pa_hook_fire(&o->source->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK], o); + /* See pa_sink_unlink() for a couple of comments how this function + * works */ - pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o->source), PA_SOURCE_MESSAGE_REMOVE_OUTPUT, o, 0, NULL); + pa_source_output_ref(o); - pa_idxset_remove_by_data(o->source->core->source_outputs, o, NULL); - pa_idxset_remove_by_data(o->source->outputs, o, NULL); + linked = PA_SOURCE_OUTPUT_LINKED(o->state); - pa_subscription_post(o->source->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_REMOVE, o->index); + if (linked) + pa_hook_fire(&o->source->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK], o); - source_output_set_state(o, PA_SOURCE_OUTPUT_UNLINKED); - pa_source_update_status(o->source); + pa_idxset_remove_by_data(o->source->core->source_outputs, o, NULL); + if (pa_idxset_remove_by_data(o->source->outputs, o, NULL)) + pa_source_output_unref(o); + + if (linked) { + pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o->source), PA_SOURCE_MESSAGE_REMOVE_OUTPUT, o, 0, NULL); + source_output_set_state(o, PA_SOURCE_OUTPUT_UNLINKED); + pa_source_update_status(o->source); + } else + o->state = PA_SOURCE_OUTPUT_UNLINKED; o->push = NULL; o->kill = NULL; @@ -216,7 +225,10 @@ void pa_source_output_unlink(pa_source_output*o) { o->detach = NULL; o->suspend = NULL; - pa_hook_fire(&o->source->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK_POST], o); + if (linked) { + pa_subscription_post(o->source->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_REMOVE, o->index); + pa_hook_fire(&o->source->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK_POST], o); + } o->source = NULL; pa_source_output_unref(o); @@ -451,7 +463,6 @@ int pa_source_output_process_msg(pa_msgobject *mo, int code, void *userdata, int return 0; } - } return -1; -- cgit