diff options
author | Colin Guthrie <cguthrie@mandriva.org> | 2010-02-05 00:15:38 +0000 |
---|---|---|
committer | Colin Guthrie <cguthrie@mandriva.org> | 2010-09-29 22:09:58 +0100 |
commit | a7a6f4427d77e60d62abae120791c3300e477c24 (patch) | |
tree | f6afb2ce7d76d7755e4432e1108f0be5ebf302a5 /src | |
parent | 9729966ac35fee8d8a4638296b892475a9b8e88d (diff) |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/module-stream-restore.c | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c index 00ce5ab4..24d1c510 100644 --- a/src/modules/module-stream-restore.c +++ b/src/modules/module-stream-restore.c @@ -742,12 +742,24 @@ 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))) { - - pa_log_info("Restoring device for stream %s.", name); - pa_sink_input_move_to(si, s, TRUE); + 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); + } } } @@ -764,12 +776,24 @@ 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))) { - - pa_log_info("Restoring device for stream %s.", name); - pa_source_output_move_to(so, s, TRUE); + 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); + } } } } |