diff options
Diffstat (limited to 'meta/recipes-multimedia/pulseaudio/pulseaudio-0.9.15/fallback.patch')
-rw-r--r-- | meta/recipes-multimedia/pulseaudio/pulseaudio-0.9.15/fallback.patch | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/meta/recipes-multimedia/pulseaudio/pulseaudio-0.9.15/fallback.patch b/meta/recipes-multimedia/pulseaudio/pulseaudio-0.9.15/fallback.patch new file mode 100644 index 0000000000..2fae0d4e78 --- /dev/null +++ b/meta/recipes-multimedia/pulseaudio/pulseaudio-0.9.15/fallback.patch | |||
@@ -0,0 +1,338 @@ | |||
1 | From: Lennart Poettering <lennart@poettering.net> | ||
2 | Date: Tue, 28 Apr 2009 23:58:18 +0000 (+0200) | ||
3 | Subject: alsa: allow configuration of fallback device strings in profiles | ||
4 | X-Git-Url: http://git.0pointer.de/?p=pulseaudio.git;a=commitdiff_plain;h=d8710711fb0c74b4ad83ac99c2501218155b502b | ||
5 | |||
6 | alsa: allow configuration of fallback device strings in profiles | ||
7 | |||
8 | This has the benefit that we can properly support ALSA devices where | ||
9 | only the raw 'hw' device exists but no 'front' although it's a proper | ||
10 | 2ch stereo device. | ||
11 | --- | ||
12 | |||
13 | diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c | ||
14 | index 18d6880..a3a0450 100644 | ||
15 | --- a/src/modules/alsa/alsa-util.c | ||
16 | +++ b/src/modules/alsa/alsa-util.c | ||
17 | @@ -528,7 +528,7 @@ int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min) { | ||
18 | |||
19 | static const struct pa_alsa_profile_info device_table[] = { | ||
20 | {{ 1, { PA_CHANNEL_POSITION_MONO }}, | ||
21 | - "hw", | ||
22 | + "hw", NULL, | ||
23 | N_("Analog Mono"), | ||
24 | "analog-mono", | ||
25 | 1, | ||
26 | @@ -536,7 +536,7 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
27 | "Capture", "Mic" }, | ||
28 | |||
29 | {{ 2, { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT }}, | ||
30 | - "front", | ||
31 | + "front", "hw", | ||
32 | N_("Analog Stereo"), | ||
33 | "analog-stereo", | ||
34 | 10, | ||
35 | @@ -544,7 +544,7 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
36 | "Capture", "Mic" }, | ||
37 | |||
38 | {{ 2, { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT }}, | ||
39 | - "iec958", | ||
40 | + "iec958", NULL, | ||
41 | N_("Digital Stereo (IEC958)"), | ||
42 | "iec958-stereo", | ||
43 | 5, | ||
44 | @@ -552,7 +552,7 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
45 | "IEC958 In", NULL }, | ||
46 | |||
47 | {{ 2, { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT }}, | ||
48 | - "hdmi", | ||
49 | + "hdmi", NULL, | ||
50 | N_("Digital Stereo (HDMI)"), | ||
51 | "hdmi-stereo", | ||
52 | 4, | ||
53 | @@ -561,7 +561,7 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
54 | |||
55 | {{ 4, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, | ||
56 | PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT }}, | ||
57 | - "surround40", | ||
58 | + "surround40", NULL, | ||
59 | N_("Analog Surround 4.0"), | ||
60 | "analog-surround-40", | ||
61 | 7, | ||
62 | @@ -570,7 +570,7 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
63 | |||
64 | {{ 4, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, | ||
65 | PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT }}, | ||
66 | - "a52", | ||
67 | + "a52", NULL, | ||
68 | N_("Digital Surround 4.0 (IEC958/AC3)"), | ||
69 | "iec958-ac3-surround-40", | ||
70 | 2, | ||
71 | @@ -580,7 +580,7 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
72 | {{ 5, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, | ||
73 | PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT, | ||
74 | PA_CHANNEL_POSITION_LFE }}, | ||
75 | - "surround41", | ||
76 | + "surround41", NULL, | ||
77 | N_("Analog Surround 4.1"), | ||
78 | "analog-surround-41", | ||
79 | 7, | ||
80 | @@ -590,7 +590,7 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
81 | {{ 5, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, | ||
82 | PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT, | ||
83 | PA_CHANNEL_POSITION_CENTER }}, | ||
84 | - "surround50", | ||
85 | + "surround50", NULL, | ||
86 | N_("Analog Surround 5.0"), | ||
87 | "analog-surround-50", | ||
88 | 7, | ||
89 | @@ -600,7 +600,7 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
90 | {{ 6, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, | ||
91 | PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT, | ||
92 | PA_CHANNEL_POSITION_CENTER, PA_CHANNEL_POSITION_LFE }}, | ||
93 | - "surround51", | ||
94 | + "surround51", NULL, | ||
95 | N_("Analog Surround 5.1"), | ||
96 | "analog-surround-51", | ||
97 | 8, | ||
98 | @@ -610,7 +610,7 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
99 | {{ 6, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT, | ||
100 | PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT, | ||
101 | PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE}}, | ||
102 | - "a52", | ||
103 | + "a52", NULL, | ||
104 | N_("Digital Surround 5.1 (IEC958/AC3)"), | ||
105 | "iec958-ac3-surround-51", | ||
106 | 3, | ||
107 | @@ -621,16 +621,72 @@ static const struct pa_alsa_profile_info device_table[] = { | ||
108 | PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT, | ||
109 | PA_CHANNEL_POSITION_CENTER, PA_CHANNEL_POSITION_LFE, | ||
110 | PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT }}, | ||
111 | - "surround71", | ||
112 | + "surround71", NULL, | ||
113 | N_("Analog Surround 7.1"), | ||
114 | "analog-surround-71", | ||
115 | 7, | ||
116 | "Master", "PCM", | ||
117 | "Capture", "Mic" }, | ||
118 | |||
119 | - {{ 0, { 0 }}, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL } | ||
120 | + {{ 0, { 0 }}, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL } | ||
121 | }; | ||
122 | |||
123 | +static snd_pcm_t *open_by_device_string_with_fallback( | ||
124 | + const char *prefix, | ||
125 | + const char *prefix_fallback, | ||
126 | + const char *dev_id, | ||
127 | + char **dev, | ||
128 | + pa_sample_spec *ss, | ||
129 | + pa_channel_map* map, | ||
130 | + int mode, | ||
131 | + uint32_t *nfrags, | ||
132 | + snd_pcm_uframes_t *period_size, | ||
133 | + snd_pcm_uframes_t tsched_size, | ||
134 | + pa_bool_t *use_mmap, | ||
135 | + pa_bool_t *use_tsched, | ||
136 | + pa_bool_t require_exact_channel_number) { | ||
137 | + | ||
138 | + snd_pcm_t *pcm_handle; | ||
139 | + char *d; | ||
140 | + | ||
141 | + d = pa_sprintf_malloc("%s:%s", prefix, dev_id); | ||
142 | + | ||
143 | + pcm_handle = pa_alsa_open_by_device_string( | ||
144 | + d, | ||
145 | + dev, | ||
146 | + ss, | ||
147 | + map, | ||
148 | + mode, | ||
149 | + nfrags, | ||
150 | + period_size, | ||
151 | + tsched_size, | ||
152 | + use_mmap, | ||
153 | + use_tsched, | ||
154 | + require_exact_channel_number); | ||
155 | + pa_xfree(d); | ||
156 | + | ||
157 | + if (!pcm_handle && prefix_fallback) { | ||
158 | + | ||
159 | + d = pa_sprintf_malloc("%s:%s", prefix_fallback, dev_id); | ||
160 | + | ||
161 | + pcm_handle = pa_alsa_open_by_device_string( | ||
162 | + d, | ||
163 | + dev, | ||
164 | + ss, | ||
165 | + map, | ||
166 | + mode, | ||
167 | + nfrags, | ||
168 | + period_size, | ||
169 | + tsched_size, | ||
170 | + use_mmap, | ||
171 | + use_tsched, | ||
172 | + require_exact_channel_number); | ||
173 | + pa_xfree(d); | ||
174 | + } | ||
175 | + | ||
176 | + return pcm_handle; | ||
177 | +} | ||
178 | + | ||
179 | snd_pcm_t *pa_alsa_open_by_device_id_auto( | ||
180 | const char *dev_id, | ||
181 | char **dev, | ||
182 | @@ -671,14 +727,14 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto( | ||
183 | |||
184 | pa_log_debug("Checking for %s (%s)", device_table[i].name, device_table[i].alsa_name); | ||
185 | |||
186 | - d = pa_sprintf_malloc("%s:%s", device_table[i].alsa_name, dev_id); | ||
187 | - | ||
188 | try_ss.channels = device_table[i].map.channels; | ||
189 | try_ss.rate = ss->rate; | ||
190 | try_ss.format = ss->format; | ||
191 | |||
192 | - pcm_handle = pa_alsa_open_by_device_string( | ||
193 | - d, | ||
194 | + pcm_handle = open_by_device_string_with_fallback( | ||
195 | + device_table[i].alsa_name, | ||
196 | + device_table[i].alsa_name_fallback, | ||
197 | + dev_id, | ||
198 | dev, | ||
199 | &try_ss, | ||
200 | map, | ||
201 | @@ -690,8 +746,6 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto( | ||
202 | use_tsched, | ||
203 | TRUE); | ||
204 | |||
205 | - pa_xfree(d); | ||
206 | - | ||
207 | if (pcm_handle) { | ||
208 | |||
209 | *ss = try_ss; | ||
210 | @@ -703,6 +757,7 @@ snd_pcm_t *pa_alsa_open_by_device_id_auto( | ||
211 | |||
212 | return pcm_handle; | ||
213 | } | ||
214 | + | ||
215 | } | ||
216 | |||
217 | if (direction > 0) { | ||
218 | @@ -775,7 +830,6 @@ snd_pcm_t *pa_alsa_open_by_device_id_profile( | ||
219 | pa_bool_t *use_tsched, | ||
220 | const pa_alsa_profile_info *profile) { | ||
221 | |||
222 | - char *d; | ||
223 | snd_pcm_t *pcm_handle; | ||
224 | pa_sample_spec try_ss; | ||
225 | |||
226 | @@ -787,14 +841,14 @@ snd_pcm_t *pa_alsa_open_by_device_id_profile( | ||
227 | pa_assert(period_size); | ||
228 | pa_assert(profile); | ||
229 | |||
230 | - d = pa_sprintf_malloc("%s:%s", profile->alsa_name, dev_id); | ||
231 | - | ||
232 | try_ss.channels = profile->map.channels; | ||
233 | try_ss.rate = ss->rate; | ||
234 | try_ss.format = ss->format; | ||
235 | |||
236 | - pcm_handle = pa_alsa_open_by_device_string( | ||
237 | - d, | ||
238 | + pcm_handle = open_by_device_string_with_fallback( | ||
239 | + profile->alsa_name, | ||
240 | + profile->alsa_name_fallback, | ||
241 | + dev_id, | ||
242 | dev, | ||
243 | &try_ss, | ||
244 | map, | ||
245 | @@ -806,8 +860,6 @@ snd_pcm_t *pa_alsa_open_by_device_id_profile( | ||
246 | use_tsched, | ||
247 | TRUE); | ||
248 | |||
249 | - pa_xfree(d); | ||
250 | - | ||
251 | if (!pcm_handle) | ||
252 | return NULL; | ||
253 | |||
254 | @@ -860,6 +912,8 @@ snd_pcm_t *pa_alsa_open_by_device_string( | ||
255 | goto fail; | ||
256 | } | ||
257 | |||
258 | + pa_log_debug("Managed to open %s", d); | ||
259 | + | ||
260 | if ((err = pa_alsa_set_hw_params(pcm_handle, ss, nfrags, period_size, tsched_size, use_mmap, use_tsched, require_exact_channel_number)) < 0) { | ||
261 | |||
262 | if (!reformat) { | ||
263 | @@ -928,26 +982,25 @@ int pa_alsa_probe_profiles( | ||
264 | snd_pcm_t *pcm_i = NULL; | ||
265 | |||
266 | if (i->alsa_name) { | ||
267 | - char *id; | ||
268 | pa_sample_spec try_ss; | ||
269 | pa_channel_map try_map; | ||
270 | |||
271 | pa_log_debug("Checking for playback on %s (%s)", i->name, i->alsa_name); | ||
272 | - id = pa_sprintf_malloc("%s:%s", i->alsa_name, dev_id); | ||
273 | |||
274 | try_ss = *ss; | ||
275 | try_ss.channels = i->map.channels; | ||
276 | try_map = i->map; | ||
277 | |||
278 | - pcm_i = pa_alsa_open_by_device_string( | ||
279 | - id, NULL, | ||
280 | + pcm_i = open_by_device_string_with_fallback( | ||
281 | + i->alsa_name, | ||
282 | + i->alsa_name_fallback, | ||
283 | + dev_id, | ||
284 | + NULL, | ||
285 | &try_ss, &try_map, | ||
286 | SND_PCM_STREAM_PLAYBACK, | ||
287 | NULL, NULL, 0, NULL, NULL, | ||
288 | TRUE); | ||
289 | |||
290 | - pa_xfree(id); | ||
291 | - | ||
292 | if (!pcm_i) | ||
293 | continue; | ||
294 | } | ||
295 | @@ -956,26 +1009,25 @@ int pa_alsa_probe_profiles( | ||
296 | snd_pcm_t *pcm_j = NULL; | ||
297 | |||
298 | if (j->alsa_name) { | ||
299 | - char *jd; | ||
300 | pa_sample_spec try_ss; | ||
301 | pa_channel_map try_map; | ||
302 | |||
303 | pa_log_debug("Checking for capture on %s (%s)", j->name, j->alsa_name); | ||
304 | - jd = pa_sprintf_malloc("%s:%s", j->alsa_name, dev_id); | ||
305 | |||
306 | try_ss = *ss; | ||
307 | try_ss.channels = j->map.channels; | ||
308 | try_map = j->map; | ||
309 | |||
310 | - pcm_j = pa_alsa_open_by_device_string( | ||
311 | - jd, NULL, | ||
312 | + pcm_j = open_by_device_string_with_fallback( | ||
313 | + j->alsa_name, | ||
314 | + j->alsa_name_fallback, | ||
315 | + dev_id, | ||
316 | + NULL, | ||
317 | &try_ss, &try_map, | ||
318 | SND_PCM_STREAM_CAPTURE, | ||
319 | NULL, NULL, 0, NULL, NULL, | ||
320 | TRUE); | ||
321 | |||
322 | - pa_xfree(jd); | ||
323 | - | ||
324 | if (!pcm_j) | ||
325 | continue; | ||
326 | } | ||
327 | diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h | ||
328 | index 77ac8a7..4c5d336 100644 | ||
329 | --- a/src/modules/alsa/alsa-util.h | ||
330 | +++ b/src/modules/alsa/alsa-util.h | ||
331 | @@ -56,6 +56,7 @@ int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min); | ||
332 | typedef struct pa_alsa_profile_info { | ||
333 | pa_channel_map map; | ||
334 | const char *alsa_name; | ||
335 | + const char *alsa_name_fallback; | ||
336 | const char *description; /* internationalized */ | ||
337 | const char *name; | ||
338 | unsigned priority; | ||