Index: code/sound/ds.cpp
===================================================================
--- code/sound/ds.cpp	(revision 8846)
+++ code/sound/ds.cpp	(working copy)
@@ -1408,39 +1408,56 @@
 	}
 
 	if ( (first_free_channel >= 0) && (Channels[first_free_channel].source_id == 0) ) {
-		OpenAL_ErrorCheck( alGenSources(1, &Channels[first_free_channel].source_id), return -1 );
+		alGenSources(1, &Channels[first_free_channel].source_id);
+		ALenum i = alGetError();
+		if (i == AL_OUT_OF_MEMORY) {
+			nprintf(("Warning", 
+				"SOUND: Ran out of sources too soon.  "
+				"Capping MAX_CHANNELS to %d (was %d)\n",
+				first_free_channel, MAX_CHANNELS));
+			MAX_CHANNELS = first_free_channel;
+			first_free_channel = -1;
+		} else if (i != AL_NO_ERROR) {
+			const char *error_text = (const char*)alGetString(i);
+			nprintf(("Warning", "SOUND: %s:%d - OpenAL error = '%s'\n",
+				__FILE__, __LINE__, error_text));
+			first_free_channel = -1;
+		}
 	}
 	return first_free_channel;
 }
Index: code/sound/openal.cpp
===================================================================
--- code/sound/openal.cpp	(revision 8846)
+++ code/sound/openal.cpp	(working copy)
@@ -195,21 +195,28 @@
 		alcGetError(device);
 
 		// check how many sources we can create
-		static const int MIN_SOURCES = 48;	// MAX_CHANNELS + 16 spare
+		// With 24 or more sources, FSO sounds okay in a sound heavy
+		// environment
+		static const int MIN_SOURCES = 24;
 		int si = 0;
 
-		for (si = 0; si < MIN_SOURCES; si++) {
-			ALuint source_id = 0;
-			alGenSources(1, &source_id);
+		for (si = 1; si <= MIN_SOURCES; si++) {
+			ALuint source_id[MIN_SOURCES] = {0};
+			alGenSources(si, source_id);
 
-			if (alGetError() != AL_NO_ERROR) {
+			const char *error_text = openal_error_string(0);
+			if (error_text != NULL) {
+				mprintf(("OpenAL device '%s' failed to create %d sources with message '%s'\n",
+					pdev->device_name.c_str(),
+					si,
+					error_text));
 				break;
 			}
 
-			alDeleteSources(1, &source_id);
+			alDeleteSources(si, source_id);
 		}
 
-		if (si == MIN_SOURCES) {
+		if (si > MIN_SOURCES) {
 			// ok, it supports our minimum requirements
 			pdev->usable = true;
 
