On Thu, 8 Sep 2016, at 04:36 PM, Tanu Kaskinen wrote: > It doesn't make sense to use a sink or source whose active port is > unavailable, so let's take this into account when choosing the default > sink and source. > --- > src/pulsecore/core.c | 16 ++++++++++++++++ > src/pulsecore/device-port.c | 8 ++++++++ > 2 files changed, 24 insertions(+) > > diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c > index 7902eec..93a4201 100644 > --- a/src/pulsecore/core.c > +++ b/src/pulsecore/core.c > @@ -265,6 +265,14 @@ static int compare_sinks(pa_sink *a, pa_sink *b) { > > core = a->core; > > + /* Available sinks always beat unavailable sinks. */ > + if (a->active_port && a->active_port->available == PA_AVAILABLE_NO > + && (!b->active_port || b->active_port->available != > PA_AVAILABLE_NO)) > + return -1; > + if (b->active_port && b->active_port->available == PA_AVAILABLE_NO > + && (!a->active_port || a->active_port->available != > PA_AVAILABLE_NO)) > + return 1; > + > /* The configured default sink is preferred over any other sink. */ > if (b == core->configured_default_sink) > return -1; > @@ -323,6 +331,14 @@ static int compare_sources(pa_source *a, pa_source > *b) { > > core = a->core; > > + /* Available sources always beat unavailable sources. */ > + if (a->active_port && a->active_port->available == PA_AVAILABLE_NO > + && (!b->active_port || b->active_port->available != > PA_AVAILABLE_NO)) > + return -1; > + if (b->active_port && b->active_port->available == PA_AVAILABLE_NO > + && (!a->active_port || a->active_port->available != > PA_AVAILABLE_NO)) > + return 1; > + > /* The configured default source is preferred over any other source. > */ > if (b == core->configured_default_source) > return -1; > diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c > index 7c9ddf3..76a7e80 100644 > --- a/src/pulsecore/device-port.c > +++ b/src/pulsecore/device-port.c > @@ -93,6 +93,14 @@ void pa_device_port_set_available(pa_device_port *p, > pa_available_t status) { > * be created before port objects, and then p->card could be > non-NULL for > * the whole lifecycle of pa_device_port. */ > if (p->card) { > + /* A sink or source whose active port is unavailable can't be > the > + * default sink/source, so port availability changes may affect > the > + * default sink/source choice. */ > + if (p->direction == PA_DIRECTION_OUTPUT) > + pa_core_update_default_sink(p->core); > + else > + pa_core_update_default_source(p->core); > + > pa_subscription_post(p->core, > PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE, > p->card->index); > pa_hook_fire(&p->core->hooks[PA_CORE_HOOK_PORT_AVAILABLE_CHANGED], > p); > } > -- LGTM. -- Arun