diff --git a/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c b/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c index 2df4c5baa..fa1b06c86 100644 --- a/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c +++ b/sc2/src/libs/sound/mixer/sdl/audiodrv_sdl.c @@ -24,6 +24,14 @@ #include +/* SDL2 wants to talk to a specific device. We'll let SDL1 use the same + * function names and just throw the device argument away. */ +#if SDL_MAJOR_VERSION > 1 +static SDL_AudioDeviceID dev; +#else +#define SDL_CloseAudioDevice(x) SDL_CloseAudio () +#define SDL_PauseAudioDevice(x, y) SDL_PauseAudio (y) +#endif static const audio_Driver mixSDL_Driver = { mixSDL_Uninit, @@ -145,7 +153,30 @@ mixSDL_Init (audio_Driver *driver, sint32 flags) desired.callback = mixer_MixChannels; log_add (log_Info, "Opening SDL audio device."); +#if SDL_MAJOR_VERSION > 1 + dev = SDL_OpenAudioDevice (NULL, 0, &desired, &obtained, + SDL_AUDIO_ALLOW_FREQUENCY_CHANGE | SDL_AUDIO_ALLOW_CHANNELS_CHANGE +#ifdef SDL_AUDIO_ALLOW_SAMPLES_CHANGE + | SDL_AUDIO_ALLOW_SAMPLES_CHANGE +#endif + ); + if (dev != 0 && obtained.channels != 1 && obtained.channels != 2) + { + /* Try again without SDL_AUDIO_ALLOW_CHANNELS_CHANGE + * in case the device only supports >2 channels for some + * reason */ + SDL_CloseAudioDevice (dev); + dev = SDL_OpenAudioDevice (NULL, 0, &desired, &obtained, + SDL_AUDIO_ALLOW_FREQUENCY_CHANGE +#ifdef SDL_AUDIO_ALLOW_SAMPLES_CHANGE + | SDL_AUDIO_ALLOW_SAMPLES_CHANGE +#endif + ); + } + if (dev == 0) +#else if (SDL_OpenAudio (&desired, &obtained) < 0) +#endif { log_add (log_Error, "Unable to open audio device: %s", SDL_GetError ()); @@ -181,7 +212,7 @@ mixSDL_Init (audio_Driver *driver, sint32 flags) { log_add (log_Error, "Mixer initialization failed: %x", mixer_GetError ()); - SDL_CloseAudio (); + SDL_CloseAudioDevice (dev); SDL_QuitSubSystem (SDL_INIT_AUDIO); return -1; } @@ -191,7 +222,7 @@ mixSDL_Init (audio_Driver *driver, sint32 flags) if (SoundDecoder_Init (flags, &formats)) { log_add (log_Error, "Sound decoders initialization failed."); - SDL_CloseAudio (); + SDL_CloseAudioDevice (dev); mixer_Uninit (); SDL_QuitSubSystem (SDL_INIT_AUDIO); return -1; @@ -209,7 +240,7 @@ mixSDL_Init (audio_Driver *driver, sint32 flags) { log_add (log_Error, "Stream decoder initialization failed."); // TODO: cleanup source mutexes [or is it "muti"? :) ] - SDL_CloseAudio (); + SDL_CloseAudioDevice (dev); SoundDecoder_Uninit (); mixer_Uninit (); SDL_QuitSubSystem (SDL_INIT_AUDIO); @@ -222,7 +253,7 @@ mixSDL_Init (audio_Driver *driver, sint32 flags) SetSpeechVolume (speechVolumeScale); SetMusicVolume ((COUNT)musicVolume); - SDL_PauseAudio (0); + SDL_PauseAudioDevice (dev, 0); return 0; } @@ -251,7 +282,7 @@ mixSDL_Uninit (void) mixSDL_DeleteSources (1, &soundSource[i].handle); } - SDL_CloseAudio (); + SDL_CloseAudioDevice (dev); mixer_Uninit (); SoundDecoder_Uninit (); SDL_QuitSubSystem (SDL_INIT_AUDIO);