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; | ||
