summaryrefslogtreecommitdiffstats
path: root/meta/recipes-multimedia/pulseaudio/pulseaudio-0.9.15/fallback.patch
diff options
context:
space:
mode:
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.patch338
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 @@
1From: Lennart Poettering <lennart@poettering.net>
2Date: Tue, 28 Apr 2009 23:58:18 +0000 (+0200)
3Subject: alsa: allow configuration of fallback device strings in profiles
4X-Git-Url: http://git.0pointer.de/?p=pulseaudio.git;a=commitdiff_plain;h=d8710711fb0c74b4ad83ac99c2501218155b502b
5
6alsa: allow configuration of fallback device strings in profiles
7
8This has the benefit that we can properly support ALSA devices where
9only the raw 'hw' device exists but no 'front' although it's a proper
102ch stereo device.
11---
12
13diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
14index 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 }
327diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h
328index 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;