On Fri, 2017-12-29 at 08:25 +0100, Georg Chini wrote: > On 28.12.2017 16:14, Tanu Kaskinen wrote: > > This ensures that streams are moved away from unavailable outputs or > > inputs. For example, sometimes HDMI is on a dedicated alsa card, and if > > all HDMI outputs become unavailable, then the card profile will be set > > to "off", and the streams will be moved somewhere else. > > --- > > I am not sure if changing the profile is a good idea. There is no > code which restores the profile when the cable gets plugged again. > Can't you fire a hook when a sink or source is suspended due to > PA_SUSPEND_UNAVAILABLE and let module-rescue-stream handle > the case? When the HDMI port becomes available, module-switch-on-port-available will change the profile as appropriate. There's still the problem that once the HDMI sink is available again, streams won't be moved there automatically (unless module-switch-on- connect is loaded), but I think that's a lesser problem than keeping streams connected to a silent sink. > Further comment below. > > > > Changes in v2: > > - Don't call deactivate_direction() unconditionally. > > > > > > src/modules/module-switch-on-port-available.c | 40 ++++++++++++++++++++++++++- > > 1 file changed, 39 insertions(+), 1 deletion(-) > > > > diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c > > index 8fd3c9e5f..c8e3d552b 100644 > > --- a/src/modules/module-switch-on-port-available.c > > +++ b/src/modules/module-switch-on-port-available.c > > @@ -80,7 +80,7 @@ static bool profile_good_for_output(pa_card_profile *profile, pa_device_port *po > > if (card->active_profile->max_source_channels != profile->max_source_channels) > > return false; > > > > - if (port == card->preferred_output_port) > > + if (port && port == card->preferred_output_port) > > return true; > > > > PA_IDXSET_FOREACH(sink, card->sinks, idx) { > > @@ -251,6 +251,42 @@ static void switch_to_port(pa_device_port *port) { > > pa_sink_set_port(pp.sink, port->name, false); > > } > > > > +static void deactivate_direction(pa_card *card, pa_direction_t direction) { > > + pa_card_profile *profile; > > + void *state; > > + pa_card_profile *best_profile = NULL; > > + const char *direction_str; > > + > > + PA_HASHMAP_FOREACH(profile, card->profiles, state) { > > + switch (direction) { > > + case PA_DIRECTION_OUTPUT: > > + if (profile->n_sinks != 0) > > + continue; > > + if (!profile_good_for_output(profile, NULL)) > > Should this not be profile_good_for_input()? No. profile_good_for_output() is called when modifying the output configuration. The function is used to check that the input side doesn't change. I'm occasionally confused about the function naming too, so it would be good to make it more clear... -- Tanu https://www.patreon.com/tanuk