Skip to content

Commit 28af0d5

Browse files
ivylslouken
authored andcommitted
pulseaudio: Match channel map to SDL's chosen order
pa_channel_map_init_auto() with PA_CHANNEL_MAP_WAVEEX does the wrong thing as it just takes the lest significant bits of WAVEFORMATEXTENSIBLE's dwChannelMask in order. This doesn't match SDL's chosen channel ordering. The implementation here mirrors what we do for PipeWire. (cherry picked from commit 0d2f081)
1 parent bca5444 commit 28af0d5

File tree

1 file changed

+67
-3
lines changed

1 file changed

+67
-3
lines changed

src/audio/pulseaudio/SDL_pulseaudio.c

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,71 @@ static void PulseStreamStateChangeCallback(pa_stream *stream, void *userdata)
595595
PULSEAUDIO_pa_threaded_mainloop_signal(pulseaudio_threaded_mainloop, 0); // just signal any waiting code, it can look up the details.
596596
}
597597

598+
// Channel maps that match the order in SDL_Audio.h
599+
static const pa_channel_position_t Pulse_map_1[] = { PA_CHANNEL_POSITION_MONO };
600+
static const pa_channel_position_t Pulse_map_2[] = { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT };
601+
602+
static const pa_channel_position_t Pulse_map_3[] = { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,
603+
PA_CHANNEL_POSITION_LFE };
604+
605+
static const pa_channel_position_t Pulse_map_4[] = { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,
606+
PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT };
607+
608+
static const pa_channel_position_t Pulse_map_5[] = { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,
609+
PA_CHANNEL_POSITION_LFE,
610+
PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT };
611+
612+
static const pa_channel_position_t Pulse_map_6[] = { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,
613+
PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE,
614+
PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT };
615+
616+
static const pa_channel_position_t Pulse_map_7[] = { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,
617+
PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE,
618+
PA_CHANNEL_POSITION_REAR_CENTER,
619+
PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT };
620+
621+
static const pa_channel_position_t Pulse_map_8[] = { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,
622+
PA_CHANNEL_POSITION_FRONT_CENTER, PA_CHANNEL_POSITION_LFE,
623+
PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT,
624+
PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT };
625+
626+
#define COPY_CHANNEL_MAP(c) SDL_memcpy(pacmap->map, Pulse_map_##c, sizeof(Pulse_map_##c))
627+
628+
static void PulseCreateChannelMap(pa_channel_map *pacmap, uint8_t channels)
629+
{
630+
SDL_assert(channels <= PA_CHANNELS_MAX);
631+
632+
pacmap->channels = channels;
633+
634+
switch (channels) {
635+
case 1:
636+
COPY_CHANNEL_MAP(1);
637+
break;
638+
case 2:
639+
COPY_CHANNEL_MAP(2);
640+
break;
641+
case 3:
642+
COPY_CHANNEL_MAP(3);
643+
break;
644+
case 4:
645+
COPY_CHANNEL_MAP(4);
646+
break;
647+
case 5:
648+
COPY_CHANNEL_MAP(5);
649+
break;
650+
case 6:
651+
COPY_CHANNEL_MAP(6);
652+
break;
653+
case 7:
654+
COPY_CHANNEL_MAP(7);
655+
break;
656+
case 8:
657+
COPY_CHANNEL_MAP(8);
658+
break;
659+
}
660+
661+
}
662+
598663
static bool PULSEAUDIO_OpenDevice(SDL_AudioDevice *device)
599664
{
600665
const bool recording = device->recording;
@@ -683,9 +748,8 @@ static bool PULSEAUDIO_OpenDevice(SDL_AudioDevice *device)
683748
PULSEAUDIO_pa_threaded_mainloop_lock(pulseaudio_threaded_mainloop);
684749

685750
const char *name = SDL_GetHint(SDL_HINT_AUDIO_DEVICE_STREAM_NAME);
686-
// The SDL ALSA output hints us that we use Windows' channel mapping
687-
// https://bugzilla.libsdl.org/show_bug.cgi?id=110
688-
PULSEAUDIO_pa_channel_map_init_auto(&pacmap, device->spec.channels, PA_CHANNEL_MAP_WAVEEX);
751+
752+
PulseCreateChannelMap(&pacmap, device->spec.channels);
689753

690754
h->stream = PULSEAUDIO_pa_stream_new(
691755
pulseaudio_context,

0 commit comments

Comments
 (0)