Index: lib/sound/openal_track.c
===================================================================
--- lib/sound/openal_track.c	(revision 6180)
+++ lib/sound/openal_track.c	(working copy)
@@ -25,6 +25,7 @@
 #include "lib/framework/frame.h"
 #include "lib/framework/math-help.h"
 #include "lib/framework/frameresource.h"
+#include "src/warzoneconfig.h"
 
 #ifndef WZ_NOSOUND
 # ifdef WZ_OS_MAC
@@ -137,8 +138,19 @@
 	int err;
 	const ALfloat listenerVel[3] = { 0.0, 0.0, 0.0 };
 	const ALfloat listenerOri[6] = { 0.0, 0.0, 1.0, 0.0, 1.0, 0.0 };
-
-	device = alcOpenDevice(0);
+	
+	// NOTE: Generic Software has 256 sources available.
+	// NULL is any available, however, it may get Generic Hardware which has 16 sources available.
+	// Software uses more CPU time though.
+	if (war_GetHWopenAL())
+	{
+		device = alcOpenDevice(NULL);
+	}
+	else
+	{
+		device = alcOpenDevice("Generic Software");
+		debug(LOG_SOUND, "Using software acceleration for openAL");
+	}
 	if (!device)
 	{
 		PrintOpenALVersion(LOG_ERROR);
Index: src/configuration.c
===================================================================
--- src/configuration.c	(revision 6180)
+++ src/configuration.c	(working copy)
@@ -219,6 +219,15 @@
 		setWarzoneKeyNumeric( "sound", true );
 	}
 
+	if(getWarzoneKeyNumeric("HWopenal", &val))
+	{
+		war_SetHWopenAL( val );
+	}
+	else
+	{
+		war_SetHWopenAL( false );
+		setWarzoneKeyNumeric( "HWopenal", true );
+	}
 	// //////////////////////////
 	// invert mouse
 	if(getWarzoneKeyNumeric("mouseflip", &val))
@@ -667,6 +676,7 @@
 	setWarzoneKeyNumeric("mouseflip",(SDWORD)(getInvertMouseStatus()));	// flipmouse
 	setWarzoneKeyNumeric("shadows",(SDWORD)(getDrawShadows()));	// shadows
 	setWarzoneKeyNumeric("sound", (SDWORD)war_getSoundEnabled());
+	setWarzoneKeyNumeric("HWopenal",(SDWORD)war_GetHWopenAL());
 	setWarzoneKeyNumeric("FMVmode",(SDWORD)(war_GetFMVmode()));		// sequences
 	setWarzoneKeyNumeric("subtitles",(SDWORD)(seq_GetSubtitles()));		// subtitles
 	setWarzoneKeyNumeric("reopenBuild",(SDWORD)(intGetReopenBuild()));	// build menu
Index: src/warzoneconfig.c
===================================================================
--- src/warzoneconfig.c	(revision 6180)
+++ src/warzoneconfig.c	(working copy)
@@ -53,9 +53,10 @@
 	UDWORD		width;
 	UDWORD		height;
 	bool		vsync;
-	bool            pauseOnFocusLoss;
-	bool            ColouredCursor;
-	bool            MusicEnabled;
+	bool		pauseOnFocusLoss;
+	bool		ColouredCursor;
+	bool		MusicEnabled;
+	bool		HWopenAL;
 } WARZONE_GLOBALS;
 
 /***************************************************************************/
@@ -85,8 +86,19 @@
 	war_SetPauseOnFocusLoss(true);
 	war_SetColouredCursor(false);
 	war_SetMusicEnabled(true);
+	war_SetHWopenAL(false);
 }
 
+void war_SetHWopenAL(bool b)
+{
+	warGlobs.HWopenAL = b;
+}
+
+bool war_GetHWopenAL(void)
+{
+	return warGlobs.HWopenAL;
+}
+
 void war_SetAllowSubtitles(BOOL b) {
 	warGlobs.allowSubtitles = b;
 }
Index: src/warzoneconfig.h
===================================================================
--- src/warzoneconfig.h	(revision 6180)
+++ src/warzoneconfig.h	(working copy)
@@ -50,6 +50,8 @@
 extern BOOL war_GetFog(void);
 extern void war_SetFMVmode(FMV_MODE mode);
 extern FMV_MODE war_GetFMVmode(void);
+extern void war_SetHWopenAL(bool b);
+extern bool war_GetHWopenAL(void);
 extern void war_SetAllowSubtitles(BOOL);
 extern BOOL war_GetAllowSubtitles(void);
 extern void war_setFullscreen(BOOL);

