summaryrefslogtreecommitdiffstats
path: root/src/modules/alsa-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/alsa-util.c')
-rw-r--r--src/modules/alsa-util.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/modules/alsa-util.c b/src/modules/alsa-util.c
index 0c4c020b..47ed9ace 100644
--- a/src/modules/alsa-util.c
+++ b/src/modules/alsa-util.c
@@ -671,8 +671,24 @@ snd_pcm_t *pa_alsa_open_by_device_string(
*dev = d;
if (ss->channels != map->channels) {
- pa_assert_se(pa_channel_map_init_auto(map, ss->channels, PA_CHANNEL_MAP_AUX));
- pa_channel_map_init_auto(map, ss->channels, PA_CHANNEL_MAP_ALSA);
+ if (!pa_channel_map_init_auto(map, ss->channels, PA_CHANNEL_MAP_ALSA)) {
+ unsigned c;
+ pa_channel_position_t pos;
+
+ pa_log_warn("Device has an unknown channel mapping. This is a limitation of ALSA. Synthesizing channel map.");
+
+ for (c = ss->channels; c > 0; c--)
+ if (pa_channel_map_init_auto(map, c, PA_CHANNEL_MAP_ALSA))
+ break;
+
+ pa_assert(c > 0);
+
+ pos = PA_CHANNEL_POSITION_AUX0;
+ for (; c < map->channels; c ++)
+ map->map[c] = pos++;
+
+ map->channels = ss->channels;
+ }
}
return pcm_handle;