@@ -602,6 +602,71 @@ static void PulseStreamStateChangeCallback(pa_stream *stream, void *userdata)
602602 PULSEAUDIO_pa_threaded_mainloop_signal (pulseaudio_threaded_mainloop , 0 ); // just signal any waiting code, it can look up the details.
603603}
604604
605+ // Channel maps that match the order in SDL_Audio.h
606+ static const pa_channel_position_t Pulse_map_1 [] = { PA_CHANNEL_POSITION_MONO };
607+ static const pa_channel_position_t Pulse_map_2 [] = { PA_CHANNEL_POSITION_FRONT_LEFT , PA_CHANNEL_POSITION_FRONT_RIGHT };
608+
609+ static const pa_channel_position_t Pulse_map_3 [] = { PA_CHANNEL_POSITION_FRONT_LEFT , PA_CHANNEL_POSITION_FRONT_RIGHT ,
610+ PA_CHANNEL_POSITION_LFE };
611+
612+ static const pa_channel_position_t Pulse_map_4 [] = { PA_CHANNEL_POSITION_FRONT_LEFT , PA_CHANNEL_POSITION_FRONT_RIGHT ,
613+ PA_CHANNEL_POSITION_REAR_LEFT , PA_CHANNEL_POSITION_REAR_RIGHT };
614+
615+ static const pa_channel_position_t Pulse_map_5 [] = { PA_CHANNEL_POSITION_FRONT_LEFT , PA_CHANNEL_POSITION_FRONT_RIGHT ,
616+ PA_CHANNEL_POSITION_LFE ,
617+ PA_CHANNEL_POSITION_REAR_LEFT , PA_CHANNEL_POSITION_REAR_RIGHT };
618+
619+ static const pa_channel_position_t Pulse_map_6 [] = { PA_CHANNEL_POSITION_FRONT_LEFT , PA_CHANNEL_POSITION_FRONT_RIGHT ,
620+ PA_CHANNEL_POSITION_FRONT_CENTER , PA_CHANNEL_POSITION_LFE ,
621+ PA_CHANNEL_POSITION_REAR_LEFT , PA_CHANNEL_POSITION_REAR_RIGHT };
622+
623+ static const pa_channel_position_t Pulse_map_7 [] = { PA_CHANNEL_POSITION_FRONT_LEFT , PA_CHANNEL_POSITION_FRONT_RIGHT ,
624+ PA_CHANNEL_POSITION_FRONT_CENTER , PA_CHANNEL_POSITION_LFE ,
625+ PA_CHANNEL_POSITION_REAR_CENTER ,
626+ PA_CHANNEL_POSITION_SIDE_LEFT , PA_CHANNEL_POSITION_SIDE_RIGHT };
627+
628+ static const pa_channel_position_t Pulse_map_8 [] = { PA_CHANNEL_POSITION_FRONT_LEFT , PA_CHANNEL_POSITION_FRONT_RIGHT ,
629+ PA_CHANNEL_POSITION_FRONT_CENTER , PA_CHANNEL_POSITION_LFE ,
630+ PA_CHANNEL_POSITION_REAR_LEFT , PA_CHANNEL_POSITION_REAR_RIGHT ,
631+ PA_CHANNEL_POSITION_SIDE_LEFT , PA_CHANNEL_POSITION_SIDE_RIGHT };
632+
633+ #define COPY_CHANNEL_MAP (c ) SDL_memcpy(pacmap->map, Pulse_map_##c, sizeof(Pulse_map_##c))
634+
635+ static void PulseCreateChannelMap (pa_channel_map * pacmap , uint8_t channels )
636+ {
637+ SDL_assert (channels <= PA_CHANNELS_MAX );
638+
639+ pacmap -> channels = channels ;
640+
641+ switch (channels ) {
642+ case 1 :
643+ COPY_CHANNEL_MAP (1 );
644+ break ;
645+ case 2 :
646+ COPY_CHANNEL_MAP (2 );
647+ break ;
648+ case 3 :
649+ COPY_CHANNEL_MAP (3 );
650+ break ;
651+ case 4 :
652+ COPY_CHANNEL_MAP (4 );
653+ break ;
654+ case 5 :
655+ COPY_CHANNEL_MAP (5 );
656+ break ;
657+ case 6 :
658+ COPY_CHANNEL_MAP (6 );
659+ break ;
660+ case 7 :
661+ COPY_CHANNEL_MAP (7 );
662+ break ;
663+ case 8 :
664+ COPY_CHANNEL_MAP (8 );
665+ break ;
666+ }
667+
668+ }
669+
605670static bool PULSEAUDIO_OpenDevice (SDL_AudioDevice * device )
606671{
607672 const bool recording = device -> recording ;
@@ -690,9 +755,8 @@ static bool PULSEAUDIO_OpenDevice(SDL_AudioDevice *device)
690755 PULSEAUDIO_pa_threaded_mainloop_lock (pulseaudio_threaded_mainloop );
691756
692757 const char * name = SDL_GetHint (SDL_HINT_AUDIO_DEVICE_STREAM_NAME );
693- // The SDL ALSA output hints us that we use Windows' channel mapping
694- // https://bugzilla.libsdl.org/show_bug.cgi?id=110
695- PULSEAUDIO_pa_channel_map_init_auto (& pacmap , device -> spec .channels , PA_CHANNEL_MAP_WAVEEX );
758+
759+ PulseCreateChannelMap (& pacmap , device -> spec .channels );
696760
697761 h -> stream = PULSEAUDIO_pa_stream_new (
698762 pulseaudio_context ,
0 commit comments