@@ -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+
598663static 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