summaryrefslogtreecommitdiffstats
path: root/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-card-add-pa_card_profile.ports.patch
blob: 84c951940be395b8075462b3cfb67cea7c184f8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
From d1c02971867bea10afcafc82c965414012c4d6bd Mon Sep 17 00:00:00 2001
From: Tanu Kaskinen <tanuk@iki.fi>
Date: Fri, 23 Oct 2015 12:23:13 +0300
Subject: [PATCH 1/4] card: add pa_card_profile.ports

Having ports accessible from pa_card_profile allows checking whether all ports
of a profile are unavailable, and therefore helps with managing the profile
availability (implemented in a later patch).

http://bugzilla.yoctoproject.org/show_bug.cgi?id=8448

Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com>

Rebased on 8.0.

Upstream-Status: Denied [The patch set needs some work to be accepted.
The review thread:
http://thread.gmane.org/gmane.comp.audio.pulseaudio.general/24301]

Signed-off-by: Tanu Kaskinen <tanuk@iki.fi>
---
 src/modules/alsa/alsa-mixer.c                |  4 +++-
 src/modules/alsa/alsa-ucm.c                  |  1 +
 src/modules/bluetooth/module-bluez4-device.c |  6 ++++++
 src/modules/bluetooth/module-bluez5-device.c |  6 ++++++
 src/pulsecore/card.c                         | 15 +++++++++++++++
 src/pulsecore/card.h                         |  4 ++++
 src/pulsecore/device-port.c                  |  7 ++++++-
 7 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 1fe2a02..5b76b06 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -4783,8 +4783,10 @@ static pa_device_port* device_port_alsa_init(pa_hashmap *ports, /* card ports */
         path->port = p;
     }
 
-    if (cp)
+    if (cp) {
         pa_hashmap_put(p->profiles, cp->name, cp);
+        pa_card_profile_add_port(cp, p);
+    }
 
     if (extra) {
         pa_hashmap_put(extra, p->name, p);
diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c
index 42f3242..68fcc26 100644
--- a/src/modules/alsa/alsa-ucm.c
+++ b/src/modules/alsa/alsa-ucm.c
@@ -791,6 +791,7 @@ static void ucm_add_port_combination(
     if (cp) {
         pa_log_debug("Adding profile %s to port %s.", cp->name, port->name);
         pa_hashmap_put(port->profiles, cp->name, cp);
+        pa_card_profile_add_port(cp, port);
     }
 
     if (hash) {
diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c
index 9a921a5..adecb32 100644
--- a/src/modules/bluetooth/module-bluez4-device.c
+++ b/src/modules/bluetooth/module-bluez4-device.c
@@ -2180,6 +2180,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         p->max_sink_channels = 2;
         p->max_source_channels = 0;
         pa_hashmap_put(output_port->profiles, p->name, p);
+        pa_card_profile_add_port(p, output_port);
 
         d = PA_CARD_PROFILE_DATA(p);
         *d = PA_BLUEZ4_PROFILE_A2DP;
@@ -2191,6 +2192,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         p->max_sink_channels = 0;
         p->max_source_channels = 2;
         pa_hashmap_put(input_port->profiles, p->name, p);
+        pa_card_profile_add_port(p, input_port);
 
         d = PA_CARD_PROFILE_DATA(p);
         *d = PA_BLUEZ4_PROFILE_A2DP_SOURCE;
@@ -2203,6 +2205,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         p->max_source_channels = 1;
         pa_hashmap_put(input_port->profiles, p->name, p);
         pa_hashmap_put(output_port->profiles, p->name, p);
+        pa_card_profile_add_port(p, input_port);
+        pa_card_profile_add_port(p, output_port);
 
         d = PA_CARD_PROFILE_DATA(p);
         *d = PA_BLUEZ4_PROFILE_HSP;
@@ -2215,6 +2219,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         p->max_source_channels = 1;
         pa_hashmap_put(input_port->profiles, p->name, p);
         pa_hashmap_put(output_port->profiles, p->name, p);
+        pa_card_profile_add_port(p, input_port);
+        pa_card_profile_add_port(p, output_port);
 
         d = PA_CARD_PROFILE_DATA(p);
         *d = PA_BLUEZ4_PROFILE_HFGW;
diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c
index 84e6d55..b015c67 100644
--- a/src/modules/bluetooth/module-bluez5-device.c
+++ b/src/modules/bluetooth/module-bluez5-device.c
@@ -1790,6 +1790,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         cp->max_sink_channels = 2;
         cp->max_source_channels = 0;
         pa_hashmap_put(output_port->profiles, cp->name, cp);
+        pa_card_profile_add_port(cp, output_port);
 
         p = PA_CARD_PROFILE_DATA(cp);
         *p = PA_BLUETOOTH_PROFILE_A2DP_SINK;
@@ -1801,6 +1802,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         cp->max_sink_channels = 0;
         cp->max_source_channels = 2;
         pa_hashmap_put(input_port->profiles, cp->name, cp);
+        pa_card_profile_add_port(cp, input_port);
 
         p = PA_CARD_PROFILE_DATA(cp);
         *p = PA_BLUETOOTH_PROFILE_A2DP_SOURCE;
@@ -1813,6 +1815,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         cp->max_source_channels = 1;
         pa_hashmap_put(input_port->profiles, cp->name, cp);
         pa_hashmap_put(output_port->profiles, cp->name, cp);
+        pa_card_profile_add_port(cp, input_port);
+        pa_card_profile_add_port(cp, output_port);
 
         p = PA_CARD_PROFILE_DATA(cp);
         *p = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT;
@@ -1825,6 +1829,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
         cp->max_source_channels = 1;
         pa_hashmap_put(input_port->profiles, cp->name, cp);
         pa_hashmap_put(output_port->profiles, cp->name, cp);
+        pa_card_profile_add_port(cp, input_port);
+        pa_card_profile_add_port(cp, output_port);
 
         p = PA_CARD_PROFILE_DATA(cp);
         *p = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY;
diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c
index b6cbbf7..f92ac87 100644
--- a/src/pulsecore/card.c
+++ b/src/pulsecore/card.c
@@ -45,6 +45,7 @@ pa_card_profile *pa_card_profile_new(const char *name, const char *description,
     c->name = pa_xstrdup(name);
     c->description = pa_xstrdup(description);
     c->available = PA_AVAILABLE_UNKNOWN;
+    c->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
 
     return c;
 }
@@ -52,6 +53,14 @@ pa_card_profile *pa_card_profile_new(const char *name, const char *description,
 void pa_card_profile_free(pa_card_profile *c) {
     pa_assert(c);
 
+    if (c->ports) {
+        pa_device_port *port;
+        void *state;
+        PA_HASHMAP_FOREACH(port, c->ports, state)
+            pa_hashmap_remove (port->profiles, c->name);
+        pa_hashmap_free(c->ports);
+    }
+
     pa_xfree(c->input_name);
     pa_xfree(c->output_name);
     pa_xfree(c->name);
@@ -59,6 +68,12 @@ void pa_card_profile_free(pa_card_profile *c) {
     pa_xfree(c);
 }
 
+void pa_card_profile_add_port(pa_card_profile *profile, pa_device_port *port) {
+    pa_assert(profile);
+
+    pa_hashmap_put(profile->ports, port->name, port);
+}
+
 void pa_card_profile_set_available(pa_card_profile *c, pa_available_t available) {
     pa_core *core;
 
diff --git a/src/pulsecore/card.h b/src/pulsecore/card.h
index 30bfc0e..fff9057 100644
--- a/src/pulsecore/card.h
+++ b/src/pulsecore/card.h
@@ -50,6 +50,8 @@ struct pa_card_profile {
     unsigned priority;
     pa_available_t available; /* PA_AVAILABLE_UNKNOWN, PA_AVAILABLE_NO or PA_AVAILABLE_YES */
 
+    pa_hashmap *ports; /* port name -> pa_device_port */
+
     /* We probably want to have different properties later on here */
     unsigned n_sinks;
     unsigned n_sources;
@@ -107,6 +109,8 @@ typedef struct pa_card_new_data {
 pa_card_profile *pa_card_profile_new(const char *name, const char *description, size_t extra);
 void pa_card_profile_free(pa_card_profile *c);
 
+void pa_card_profile_add_port(pa_card_profile *profile, pa_device_port *port);
+
 /* The profile's available status has changed */
 void pa_card_profile_set_available(pa_card_profile *c, pa_available_t available);
 
diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c
index 5807d3e..d12dfbc 100644
--- a/src/pulsecore/device-port.c
+++ b/src/pulsecore/device-port.c
@@ -107,8 +107,13 @@ static void device_port_free(pa_object *o) {
     if (p->proplist)
         pa_proplist_free(p->proplist);
 
-    if (p->profiles)
+    if (p->profiles) {
+        pa_card_profile *profile;
+        void *state;
+        PA_HASHMAP_FOREACH(profile, p->profiles, state)
+            pa_hashmap_remove (profile->ports, p->name);
         pa_hashmap_free(p->profiles);
+    }
 
     pa_xfree(p->preferred_profile);
     pa_xfree(p->name);
-- 
2.7.0