summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/modules/alsa/module-alsa-card.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
index 7aeee15b1..d807a82ea 100644
--- a/src/modules/alsa/module-alsa-card.c
+++ b/src/modules/alsa/module-alsa-card.c
@@ -366,6 +366,7 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
void *state;
pa_alsa_jack *jack;
struct temp_port_avail *tp, *tports;
+ pa_card_profile *profile;
pa_assert(u);
@@ -426,6 +427,32 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
if (tp->avail == PA_AVAILABLE_NO)
pa_device_port_set_available(tp->port, tp->avail);
+ /* Update profile availabilities. The logic could be improved; for now we
+ * only set obviously unavailable profiles (those that contain only
+ * unavailable ports) to PA_AVAILABLE_NO and all others to
+ * PA_AVAILABLE_UNKNOWN. */
+ PA_HASHMAP_FOREACH(profile, u->card->profiles, state) {
+ pa_device_port *port;
+ void *state2;
+ pa_available_t available = PA_AVAILABLE_NO;
+
+ /* Don't touch the "off" profile. */
+ if (profile->n_sources == 0 && profile->n_sinks == 0)
+ continue;
+
+ PA_HASHMAP_FOREACH(port, u->card->ports, state2) {
+ if (!pa_hashmap_get(port->profiles, profile->name))
+ continue;
+
+ if (port->available != PA_AVAILABLE_NO) {
+ available = PA_AVAILABLE_UNKNOWN;
+ break;
+ }
+ }
+
+ pa_card_profile_set_available(profile, available);
+ }
+
pa_xfree(tports);
return 0;
}