remove zombie combine module if stream setup failed 24/11024/1
authorJanos Kovacs <jankovac503@gmail.com>
Wed, 16 Oct 2013 11:35:23 +0000 (14:35 +0300)
committerJaska Uimonen <jaska.uimonen@helsinki.fi>
Wed, 16 Oct 2013 11:35:23 +0000 (14:35 +0300)
Change-Id: Id5c5bbba70edc140b5581e5a6a7b371302c18010

murphy/discover.c
murphy/discover.h
murphy/tracker.c

index ad79839..7f401cc 100644 (file)
@@ -823,8 +823,8 @@ void pa_discover_register_sink_input(struct userdata *u, pa_sink_input *sinp)
     }
 }
 
-void pa_discover_preroute_sink_input(struct userdata *u,
-                                     pa_sink_input_new_data *data)
+pa_bool_t pa_discover_preroute_sink_input(struct userdata *u,
+                                          pa_sink_input_new_data *data)
 {
     pa_core           *core;
     pa_module         *m;
@@ -872,14 +872,14 @@ void pa_discover_preroute_sink_input(struct userdata *u,
         if (loopback) {
             if (!(node = pa_utils_get_node_from_data(u, mir_input, data))) {
                 pa_log_debug("can't find loopback node for sink-input");
-                return;
+                return TRUE;
             }
 
             if (node->direction == mir_output) {
                 pa_log_debug("refuse to preroute loopback sink-input "
                              "(current route: sink %u @ %p)", data->sink ?
                              data->sink->index : PA_IDXSET_INVALID,data->sink);
-                return;
+                return TRUE;
             }
 
             data->sink = NULL;
@@ -922,18 +922,25 @@ void pa_discover_preroute_sink_input(struct userdata *u,
 #endif
             if (pa_sink_input_new_data_set_sink(data, sink, FALSE))
                 pa_log_debug("set sink %u for new sink-input", sink->index);
-            else
+            else {
                 pa_log("can't set sink %u for new sink-input", sink->index);
+                                                      /* copes wit NULL mux */
+                pa_multiplex_destroy(u->multiplex, core, fake.mux);
+                return FALSE;
+            }
         }
     }
 
     if (loopback && data->sink && data->sink->module) {
+        /* no ramp needed */
         if (pa_streq(data->sink->module->name, "module-combine-sink"))
-            return;
+            return TRUE;
     }
 
     pa_log_debug("set sink-input ramp-muted");
     data->flags |= PA_SINK_INPUT_START_RAMP_MUTED;
+
+    return TRUE;
 }
 
 
@@ -1218,8 +1225,8 @@ void pa_discover_register_source_output(struct userdata  *u,
     }
 }
 
-void pa_discover_preroute_source_output(struct userdata *u,
-                                        pa_source_output_new_data *data)
+pa_bool_t pa_discover_preroute_source_output(struct userdata *u,
+                                             pa_source_output_new_data *data)
 {
     pa_core           *core;
     pa_module         *m;
@@ -1244,14 +1251,14 @@ void pa_discover_preroute_source_output(struct userdata *u,
     if (pa_streq(mnam, "module-loopback")) {
         if (!(node = pa_utils_get_node_from_data(u, mir_output, data))) {
             pa_log_debug("can't find loopback node for source-output");
-            return;
+            return TRUE;
         }
 
         if (node->direction == mir_input) {
             pa_log_debug("refuse to preroute loopback source-output "
                          "(current route: source %u @ %p)", data->source ?
                          data->source->index : PA_IDXSET_INVALID,data->source);
-            return;
+            return TRUE;
         }
 
         data->source = NULL;
@@ -1291,6 +1298,8 @@ void pa_discover_preroute_source_output(struct userdata *u,
             }
         }
     }
+
+    return TRUE;
 }
 
 
index e31462a..6e1e615 100644 (file)
@@ -89,14 +89,14 @@ void pa_discover_add_source(struct userdata *, pa_source *);
 void pa_discover_remove_source(struct userdata *, pa_source *);
 
 void pa_discover_register_sink_input(struct userdata *, pa_sink_input *);
-void pa_discover_preroute_sink_input(struct userdata *,
-                                     pa_sink_input_new_data *);
+pa_bool_t pa_discover_preroute_sink_input(struct userdata *,
+                                          pa_sink_input_new_data *);
 void pa_discover_add_sink_input(struct userdata *, pa_sink_input *);
 void pa_discover_remove_sink_input(struct userdata *, pa_sink_input *);
 
 void pa_discover_register_source_output(struct userdata *, pa_source_output *);
-void pa_discover_preroute_source_output(struct userdata *,
-                                        pa_source_output_new_data *);
+pa_bool_t pa_discover_preroute_source_output(struct userdata *,
+                                             pa_source_output_new_data *);
 void pa_discover_add_source_output(struct userdata *, pa_source_output *);
 void pa_discover_remove_source_output(struct userdata *, pa_source_output *);
 
index 26fc0d9..0ba6b2e 100644 (file)
@@ -450,13 +450,14 @@ static pa_hook_result_t sink_input_new(void *hook_data,
 {
     pa_sink_input_new_data *data = (pa_sink_input_new_data *)call_data;
     struct userdata *u = (struct userdata *)slot_data;
+    pa_bool_t success;
 
     pa_assert(u);
     pa_assert(data);
 
-    pa_discover_preroute_sink_input(u, data);
+    success = pa_discover_preroute_sink_input(u, data);
 
-    return PA_HOOK_OK;
+    return success ? PA_HOOK_OK : PA_HOOK_CANCEL;
 }
 
 static pa_hook_result_t sink_input_put(void *hook_data,
@@ -497,13 +498,14 @@ static pa_hook_result_t source_output_new(void *hook_data,
 {
     pa_source_output_new_data *data = (pa_source_output_new_data *)call_data;
     struct userdata *u = (struct userdata *)slot_data;
+    pa_bool_t success;
 
     pa_assert(u);
     pa_assert(data);
 
-    pa_discover_preroute_source_output(u, data);
+    success = pa_discover_preroute_source_output(u, data);
 
-    return PA_HOOK_OK;
+    return success ? PA_HOOK_OK : PA_HOOK_CANCEL;
 }
 
 static pa_hook_result_t source_output_put(void *hook_data,