From 6dda71bef7d99c9a5fe6184b739c9f79788733a4 Mon Sep 17 00:00:00 2001
From: Inuyasha <MattWCSTRFAN@gmail.com>
Date: Mon, 22 Feb 2016 23:05:36 -0800
Subject: [PATCH] I guess this is becoming the "try to make SDL_mixer work"
 branch Move InitSubSystem calls into proper places, don't use AUDIO_S16LSB
 (bad according to SDL_mixer docs) Add error checking

---
 src/sdl/i_video.c     | 16 +++-------------
 src/sdl/mixer_sound.c | 27 ++++++++++++++++++++++++---
 src/sdl/sdl_sound.c   | 10 ++++++++++
 3 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c
index dbb97f093..963310a26 100644
--- a/src/sdl/i_video.c
+++ b/src/sdl/i_video.c
@@ -1701,21 +1701,11 @@ void I_StartupGraphics(void)
 	keyboard_started = true;
 
 #if !defined(HAVE_TTF)
-#ifdef _WIN32 // Initialize Audio as well, otherwise Win32's DirectX can not use audio
-	if (SDL_InitSubSystem(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0)
-#else //SDL_OpenAudio will do SDL_InitSubSystem(SDL_INIT_AUDIO)
+	// Previously audio was init here for questionable reasons?
 	if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
-#endif
 	{
-#ifdef _WIN32
-		if (SDL_WasInit(SDL_INIT_AUDIO)==0)
-			CONS_Printf(M_GetText("Couldn't initialize SDL's Audio System with Video System: %s\n"), SDL_GetError());
-		if (SDL_WasInit(SDL_INIT_VIDEO)==0)
-#endif
-		{
-			CONS_Printf(M_GetText("Couldn't initialize SDL's Video System: %s\n"), SDL_GetError());
-			return;
-		}
+		CONS_Printf(M_GetText("Couldn't initialize SDL's Video System: %s\n"), SDL_GetError());
+		return;
 	}
 #endif
 	{
diff --git a/src/sdl/mixer_sound.c b/src/sdl/mixer_sound.c
index 71969209c..50e501394 100644
--- a/src/sdl/mixer_sound.c
+++ b/src/sdl/mixer_sound.c
@@ -77,7 +77,16 @@ static INT32 current_track;
 void I_StartupSound(void)
 {
 	I_Assert(!sound_started);
-	sound_started = true;
+
+	// EE inits audio first so we're following along.
+	if (SDL_WasInit(SDL_INIT_AUDIO) == SDL_INIT_AUDIO)
+		CONS_Printf("SDL Audio already started\n");
+	else if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
+	{
+		CONS_Alert(CONS_ERROR, "Error initializing SDL Audio: %s\n", SDL_GetError());
+		// call to start audio failed -- we do not have it
+		return;
+	}
 
 	midimode = false;
 	music = NULL;
@@ -86,19 +95,31 @@ void I_StartupSound(void)
 #if SDL_MIXER_VERSION_ATLEAST(1,2,11)
 	Mix_Init(MIX_INIT_FLAC|MIX_INIT_MOD|MIX_INIT_MP3|MIX_INIT_OGG);
 #endif
-	Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 2048);
+
+	if (Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 2048) < 0)
+	{
+		CONS_Alert(CONS_ERROR, "Error starting SDL_Mixer: %s\n", Mix_GetError());
+		// call to start audio failed -- we do not have it
+		return;
+	}
+
+	sound_started = true;
 	Mix_AllocateChannels(256);
 }
 
 void I_ShutdownSound(void)
 {
-	I_Assert(sound_started);
+	if (!sound_started)
+		return; // not an error condition
 	sound_started = false;
 
 	Mix_CloseAudio();
 #if SDL_MIXER_VERSION_ATLEAST(1,2,11)
 	Mix_Quit();
 #endif
+
+	SDL_QuitSubSystem(SDL_INIT_AUDIO);
+
 #ifdef HAVE_LIBGME
 	if (gme)
 		gme_delete(gme);
diff --git a/src/sdl/sdl_sound.c b/src/sdl/sdl_sound.c
index 5d6c007b5..0face92e2 100644
--- a/src/sdl/sdl_sound.c
+++ b/src/sdl/sdl_sound.c
@@ -1213,6 +1213,16 @@ void I_StartupSound(void)
 	// Configure sound device
 	CONS_Printf("I_StartupSound:\n");
 
+	// EE inits audio first so we're following along.
+	if (SDL_WasInit(SDL_INIT_AUDIO) == SDL_INIT_AUDIO)
+		CONS_Printf("SDL Audio already started\n");
+	else if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
+	{
+		CONS_Alert(CONS_ERROR, "Error initializing SDL Audio: %s\n", SDL_GetError());
+		// call to start audio failed -- we do not have it
+		return;
+	}
+
 	// Open the audio device
 	if (M_CheckParm ("-freq") && M_IsNextParm())
 	{
-- 
GitLab