- if (c->default_sink == e->data)
- pa_namereg_set_default_sink(c, NULL);
- else if (c->default_source == e->data)
- pa_namereg_set_default_source(c, NULL);
+ if (c->default_sink == e->data) {
+ pa_sink *new_default = NULL;
+
+ /* FIXME: the selection here should be based priority values on
+ * the sinks */
+
+ PA_IDXSET_FOREACH(new_default, c->sinks, idx) {
+ if (new_default != e->data && PA_SINK_IS_LINKED(pa_sink_get_state(new_default)))
+ break;
+ }
+
+ pa_namereg_set_default_sink(c, new_default);
+
+ } else if (c->default_source == e->data) {
+ pa_source *new_default = NULL;
+
+ /* First, try to find one that isn't a monitor */
+ PA_IDXSET_FOREACH(new_default, c->sources, idx) {
+ if (new_default != e->data && !new_default->monitor_of && PA_SOURCE_IS_LINKED(pa_source_get_state(new_default)))
+ break;
+ }
+
+ if (!new_default) {
+ /* Then, fallback to a monitor */
+ PA_IDXSET_FOREACH(new_default, c->sources, idx) {
+ if (new_default != e->data && PA_SOURCE_IS_LINKED(pa_source_get_state(new_default)))
+ break;
+ }
+ }
+
+ pa_namereg_set_default_source(c, new_default);
+ }