summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2007-09-20 22:01:07 +0000
committerLennart Poettering <lennart@poettering.net>2007-09-20 22:01:07 +0000
commit3b2835d3345bfe74afb3e811967b966aa9058606 (patch)
tree5ba99df7af30b256b4f001a47cd5442c69ff2a3c
parentf3f44dab379f4791a51642d49fcf20284856ec9e (diff)
properly detach/attach when moving sink inputs
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/lennart@1874 fefdeb5f-60dc-0310-8127-8f9354f1896f
-rw-r--r--src/pulsecore/sink.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 81258e7a..409d0260 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -819,12 +819,20 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse
if (i->attach)
i->attach(i);
+ /* If you change anything here, make sure to change the
+ * ghost sink input handling a few lines down at
+ * PA_SINK_MESSAGE_REMOVE_INPUT_AND_BUFFER, too. */
+
return 0;
}
case PA_SINK_MESSAGE_REMOVE_INPUT: {
pa_sink_input *i = PA_SINK_INPUT(userdata);
+ /* If you change anything here, make sure to change the
+ * sink input handling a few lines down at
+ * PA_SINK_MESSAGE_REMOVE_INPUT_AND_BUFFER, too. */
+
if (i->detach)
i->detach(i);
@@ -864,6 +872,12 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse
pa_assert(!info->sink_input->thread_info.sync_next);
pa_assert(!info->sink_input->thread_info.sync_prev);
+ if (info->sink_input->detach)
+ info->sink_input->detach(info->sink_input);
+
+ pa_assert(info->sink_input->thread_info.attached);
+ info->sink_input->thread_info.attached = FALSE;
+
if (info->ghost_sink_input) {
pa_assert(info->buffer_bytes > 0);
pa_assert(info->buffer);
@@ -915,6 +929,12 @@ int pa_sink_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offse
if (info->ghost_sink_input) {
pa_hashmap_put(s->thread_info.inputs, PA_UINT32_TO_PTR(info->ghost_sink_input->index), pa_sink_input_ref(info->ghost_sink_input));
info->ghost_sink_input->thread_info.sync_prev = info->ghost_sink_input->thread_info.sync_next = NULL;
+
+ pa_assert(!info->ghost_sink_input->thread_info.attached);
+ info->ghost_sink_input->thread_info.attached = TRUE;
+
+ if (info->ghost_sink_input->attach)
+ info->ghost_sink_input->attach(info->ghost_sink_input);
}
return 0;