stream-restore: Clear the save_sink/save_source flags on apply_entry.

If the user specifically removes the device element from the stream
restore rule, we have to clear the save_sink/save_source flag of the
stream. This means that other stream routing systems
(e.g. module-device-manager) can take over routing for this
stream. In order to facilitate the reapplication of other routing
rules, we fire a stream change event. Arguably the stream itself
has not changed, but the rules governing its routing have, so
I feel this is justified.
This commit is contained in:
Colin Guthrie 2010-02-05 00:15:38 +00:00
parent 2f86ba4fc2
commit 6fd2d08758

View file

@ -1626,14 +1626,26 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
pa_sink_input_set_mute(si, e->muted, TRUE);
}
if (u->restore_device &&
e->device_valid &&
(s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SINK))) {
if (u->restore_device) {
if (!e->device_valid) {
if (si->save_sink) {
pa_log_info("Ensuring device is not saved for stream %s.", name);
/* If the device is not valid we should make sure the
save flag is cleared as the user may have specifically
removed the sink element from the rule. */
si->save_sink = FALSE;
/* This is cheating a bit. The sink input itself has not changed
but the rules governing it's routing have, so we fire this event
such that other routing modules (e.g. module-device-manager)
will pick up the change and reapply their routing */
pa_subscription_post(si->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, si->index);
}
} else if ((s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SINK))) {
pa_log_info("Restoring device for stream %s.", name);
pa_sink_input_move_to(si, s, TRUE);
}
}
}
PA_IDXSET_FOREACH(so, u->core->source_outputs, idx) {
char *n;
@ -1648,15 +1660,27 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
}
pa_xfree(n);
if (u->restore_device &&
e->device_valid &&
(s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SOURCE))) {
if (u->restore_device) {
if (!e->device_valid) {
if (so->save_source) {
pa_log_info("Ensuring device is not saved for stream %s.", name);
/* If the device is not valid we should make sure the
save flag is cleared as the user may have specifically
removed the source element from the rule. */
so->save_source = FALSE;
/* This is cheating a bit. The source output itself has not changed
but the rules governing it's routing have, so we fire this event
such that other routing modules (e.g. module-device-manager)
will pick up the change and reapply their routing */
pa_subscription_post(so->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, so->index);
}
} else if ((s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SOURCE))) {
pa_log_info("Restoring device for stream %s.", name);
pa_source_output_move_to(so, s, TRUE);
}
}
}
}
#if 0
static void dump_database(struct userdata *u) {