}
}
-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;
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;
#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;
}
}
}
-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;
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;
}
}
}
+
+ return TRUE;
}
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 *);
{
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,
{
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,