]> code.ossystems Code Review - openembedded-core.git/blob
e0efa70f3244edd682779985bdcfc40f2770e85a
[openembedded-core.git] /
1 From 690d567e298f6687b61c82660b051df5b25482ee Mon Sep 17 00:00:00 2001
2 From: Tanu Kaskinen <tanuk@iki.fi>
3 Date: Fri, 23 Oct 2015 13:37:11 +0300
4 Subject: [PATCH 4/4] alsa: set availability for (some) unavailable profiles
5
6 The alsa card hasn't so far set any availability for profiles. That
7 caused an issue with some HDMI hardware: the sound card has two HDMI
8 outputs, but only the second of them is actually usable. The
9 unavailable port is marked as unavailable and the available port is
10 marked as available, but this information isn't propagated to the
11 profile availability. Without profile availability information, the
12 initial profile policy picks the unavailable one, since it has a
13 higher priority value.
14
15 This patch adds simple logic for marking some profiles unavailable:
16 if the profile only contains unavailable ports, the profile is
17 unavailable too. This can be improved in the future so that if a
18 profile contains sinks or sources that only contain unavailable ports,
19 the profile should be marked as unavailable. Implementing that
20 requires adding more information about the sinks and sources to
21 pa_card_profile, however.
22
23 BugLink: https://bugzilla.yoctoproject.org/show_bug.cgi?id=8448
24
25 Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com>
26
27 Rebased on 8.0.
28
29 Upstream-Status: Denied [The patch set needs some work to be accepted.
30 The review thread:
31 http://thread.gmane.org/gmane.comp.audio.pulseaudio.general/24301]
32
33 Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
34 ---
35  src/modules/alsa/module-alsa-card.c | 25 +++++++++++++++++++++++++
36  1 file changed, 25 insertions(+)
37
38 diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
39 index fe240f0..bdbdc12 100644
40 --- a/src/modules/alsa/module-alsa-card.c
41 +++ b/src/modules/alsa/module-alsa-card.c
42 @@ -366,6 +366,8 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
43      void *state;
44      pa_alsa_jack *jack;
45      struct temp_port_avail *tp, *tports;
46 +    pa_device_port *port;
47 +    pa_card_profile *profile;
48  
49      pa_assert(u);
50  
51 @@ -412,6 +414,29 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
52             pa_device_port_set_available(tp->port, tp->avail);
53  
54      pa_xfree(tports);
55 +
56 +    /* Update profile availabilities. The logic could be improved; for now we
57 +     * only set obviously unavailable profiles (those that contain only
58 +     * unavailable ports) to PA_AVAILABLE_NO and all others to
59 +     * PA_AVAILABLE_UNKNOWN. */
60 +    PA_HASHMAP_FOREACH(profile, u->card->profiles, state) {
61 +        void *state2;
62 +        pa_available_t available = PA_AVAILABLE_NO;
63 +
64 +        /* Don't touch the "off" profile. */
65 +        if (pa_hashmap_size(profile->ports) == 0)
66 +            continue;
67 +
68 +        PA_HASHMAP_FOREACH(port, profile->ports, state2) {
69 +            if (port->available != PA_AVAILABLE_NO) {
70 +                available = PA_AVAILABLE_UNKNOWN;
71 +                break;
72 +            }
73 +        }
74 +
75 +        pa_card_profile_set_available(profile, available);
76 +    }
77 +
78      return 0;
79  }
80  
81 -- 
82 2.7.0
83