diff -Nur scummvm-0.7.1.orig/backends/sdl/module.mk scummvm-0.7.1/backends/sdl/module.mk
--- scummvm-0.7.1.orig/backends/sdl/module.mk	2004-03-01 12:18:50.000000000 +0100
+++ scummvm-0.7.1/backends/sdl/module.mk	2005-05-01 16:27:49.000000000 +0200
@@ -5,6 +5,10 @@
 	backends/sdl/graphics.o \
 	backends/sdl/sdl.o
 
+ifneq (,$(findstring SDL_USE_OSS,$(DEFINES)))
+	MODULE_OBJS += backends/x11/oss.o
+endif
+
 MODULE_DIRS += \
 	backends/sdl
 
diff -Nur scummvm-0.7.1.orig/backends/sdl/sdl.cpp scummvm-0.7.1/backends/sdl/sdl.cpp
--- scummvm-0.7.1.orig/backends/sdl/sdl.cpp	2004-12-04 15:47:22.000000000 +0100
+++ scummvm-0.7.1/backends/sdl/sdl.cpp	2005-05-01 17:37:29.342364688 +0200
@@ -28,6 +28,10 @@
 #include "config.h"
 #endif
 
+#if defined(SDL_USE_OSS)
+#include "backends/x11/oss.h"
+#endif
+
 #include "scummvm.xpm"
 
 
@@ -266,6 +270,9 @@
 #pragma mark -
 
 bool OSystem_SDL::setSoundCallback(SoundProc proc, void *param) {
+#if defined (SDL_USE_OSS)
+	return OSS_setSoundCallback(proc, param);
+#else
 	SDL_AudioSpec desired;
 	SDL_AudioSpec obtained;
 
@@ -303,14 +310,23 @@
 	_samplesPerSec = obtained.freq;
 	SDL_PauseAudio(0);
 	return true;
+#endif
 }
 
 void OSystem_SDL::clearSoundCallback() {
+#if defined (SDL_USE_OSS)
+	OSS_clearSoundCallback();
+#else
 	SDL_CloseAudio();
+#endif
 }
 
 int OSystem_SDL::getOutputSampleRate() const {
+#if defined (SDL_USE_OSS)
+	return OSS_getOutputSampleRate();
+#else
 	return _samplesPerSec;
+#endif
 }
 
 #pragma mark -
diff -Nur scummvm-0.7.1.orig/backends/x11/build.rules scummvm-0.7.1/backends/x11/build.rules
--- scummvm-0.7.1.orig/backends/x11/build.rules	2002-08-21 19:35:46.000000000 +0200
+++ scummvm-0.7.1/backends/x11/build.rules	2005-05-01 15:46:01.000000000 +0200
@@ -1,6 +1,6 @@
 # Build settings for the X11 backend
 MODULES  += backends/x11
-OBJS    += backends/x11/x11.o
+OBJS    += backends/x11/x11.o backends/x11/oss.o
 DEFINES += -DUNIX -DX11_BACKEND
 LDFLAGS += -L/usr/X11R6/lib -L/usr/local/lib
 INCLUDES+= -I/usr/X11R6/include
diff -Nur scummvm-0.7.1.orig/backends/x11/oss.cpp scummvm-0.7.1/backends/x11/oss.cpp
--- scummvm-0.7.1.orig/backends/x11/oss.cpp	1970-01-01 01:00:00.000000000 +0100
+++ scummvm-0.7.1/backends/x11/oss.cpp	2005-05-01 17:38:23.263167480 +0200
@@ -0,0 +1,130 @@
+#include "backends/x11/oss.h"
+#include "backends/intern.h"
+#include <pthread.h>
+
+#ifdef __linux__
+#include <linux/soundcard.h>
+#else
+#include <sys/soundcard.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+static pthread_t sound_thread;
+
+typedef struct {
+        OSystem::SoundProc sound_proc;
+        void *param;
+} THREAD_PARAM;
+
+#undef CAPTURE_SOUND
+
+#define FRAG_SIZE 4096
+static void *sound_and_music_thread(void *params) {
+        /* Init sound */
+        int sound_fd, param, frag_size;
+        uint8 sound_buffer[FRAG_SIZE];
+        OSystem::SoundProc sound_proc = ((THREAD_PARAM *) params)->sound_proc;
+        void *proc_param = ((THREAD_PARAM *) params)->param;
+
+#ifdef CAPTURE_SOUND
+        FILE *f = fopen("sound.raw", "wb");
+#endif
+
+        sound_fd = open("/dev/dsp", O_WRONLY);
+        audio_buf_info info;
+        if (sound_fd < 0) {
+                error("Error opening sound device !\n");
+                exit(1);
+        }
+        param = 0;
+        frag_size = FRAG_SIZE /* audio fragment size */ ;
+        while (frag_size) {
+                frag_size >>= 1;
+                param++;
+        }
+        param--;
+        param |= /* audio_fragment_num */ 3 << 16;
+        if (ioctl(sound_fd, SNDCTL_DSP_SETFRAGMENT, &param) != 0) {
+                error("Error in the SNDCTL_DSP_SETFRAGMENT ioctl !\n");
+                exit(1);
+        }
+        param = AFMT_S16_LE;
+        if (ioctl(sound_fd, SNDCTL_DSP_SETFMT, &param) == -1) {
+                perror("Error in the SNDCTL_DSP_SETFMT ioctl !\n");
+                exit(1);
+        }
+        if (param != AFMT_S16_LE) {
+                error("AFMT_S16_LE not supported !\n");
+                exit(1);
+        }
+        param = 2;
+        if (ioctl(sound_fd, SNDCTL_DSP_CHANNELS, &param) == -1) {
+                error("Error in the SNDCTL_DSP_CHANNELS ioctl !\n");
+                exit(1);
+        }
+        if (param != 2) {
+                error("Stereo mode not supported !\n");
+                exit(1);
+        }
+        param = SAMPLES_PER_SEC;
+        if (ioctl(sound_fd, SNDCTL_DSP_SPEED, &param) == -1) {
+                perror("Error in the SNDCTL_DSP_SPEED ioctl !\n");
+                exit(1);
+        }
+        if (param != SAMPLES_PER_SEC) {
+                error("%d kHz not supported !\n", SAMPLES_PER_SEC);
+                exit(1);
+        }
+        if (ioctl(sound_fd, SNDCTL_DSP_GETOSPACE, &info) != 0) {
+                perror("SNDCTL_DSP_GETOSPACE");
+                exit(-1);
+        }
+
+        sched_yield();
+        while (1) {
+                uint8 *buf = (uint8 *)sound_buffer;
+                int size, written;
+
+                sound_proc(proc_param, (byte *)sound_buffer, FRAG_SIZE);
+#ifdef CAPTURE_SOUND
+                fwrite(buf, 2, FRAG_SIZE >> 1, f);
+                fflush(f);
+#endif
+                size = FRAG_SIZE;
+                while (size > 0) {
+                        written = write(sound_fd, buf, size);
+                        buf += written;
+                        size -= written;
+                }
+        }
+
+        return NULL;
+}
+
+bool OSS_setSoundCallback(OSystem::SoundProc proc, void *param) {
+        static THREAD_PARAM thread_param;
+
+        /* And finally start the music thread */
+        thread_param.param = param;
+        thread_param.sound_proc = proc;
+
+        pthread_create(&sound_thread, NULL, sound_and_music_thread, (void *)&thread_param);
+
+        return true;
+}
+
+void OSS_clearSoundCallback() {
+        // TODO implement this...
+        // The sound_thread has to be stopped in a nice way. In particular,
+        // using pthread_kill would be a bad idea. Rather, use pthread_cancel,
+        // or maybe a global variable, to achieve this.
+        // This method shouldn't return until the sound thread really has stopped.
+}
+
+int OSS_getOutputSampleRate() {
+        return SAMPLES_PER_SEC;
+}
diff -Nur scummvm-0.7.1.orig/backends/x11/oss.h scummvm-0.7.1/backends/x11/oss.h
--- scummvm-0.7.1.orig/backends/x11/oss.h	1970-01-01 01:00:00.000000000 +0100
+++ scummvm-0.7.1/backends/x11/oss.h	2005-05-01 17:36:04.539256720 +0200
@@ -0,0 +1,7 @@
+#include "common/stdafx.h"
+#include "common/scummsys.h"
+#include "common/system.h"
+
+bool OSS_setSoundCallback(OSystem::SoundProc proc, void *param);
+void OSS_clearSoundCallback();
+int  OSS_getOutputSampleRate();
diff -Nur scummvm-0.7.1.orig/backends/x11/x11.cpp scummvm-0.7.1/backends/x11/x11.cpp
--- scummvm-0.7.1.orig/backends/x11/x11.cpp	2004-12-05 18:42:16.000000000 +0100
+++ scummvm-0.7.1/backends/x11/x11.cpp	2005-05-01 17:35:02.876630864 +0200
@@ -42,11 +42,7 @@
 #include <X11/Xutil.h>
 #include <X11/extensions/XShm.h>
 
-#ifdef __linux__
-#include <linux/soundcard.h>
-#else
-#include <sys/soundcard.h>
-#endif
+#include "oss.h"
 
 #include <sched.h>
 #include <pthread.h>
@@ -200,7 +196,6 @@
 	Window window;
 	GC black_gc;
 	XImage *image;
-	pthread_t sound_thread;
 
 	int fake_right_mouse;
 	int report_presses;
@@ -230,96 +225,6 @@
 	int (*_timer_callback) (int);
 };
 
-typedef struct {
-	OSystem::SoundProc sound_proc;
-	void *param;
-} THREAD_PARAM;
-
-#undef CAPTURE_SOUND
-
-#define FRAG_SIZE 4096
-static void *sound_and_music_thread(void *params) {
-	/* Init sound */
-	int sound_fd, param, frag_size;
-	uint8 sound_buffer[FRAG_SIZE];
-	OSystem::SoundProc sound_proc = ((THREAD_PARAM *) params)->sound_proc;
-	void *proc_param = ((THREAD_PARAM *) params)->param;
-
-#ifdef CAPTURE_SOUND
-	FILE *f = fopen("sound.raw", "wb");
-#endif
-
-	sound_fd = open("/dev/dsp", O_WRONLY);
-	audio_buf_info info;
-	if (sound_fd < 0) {
-		error("Error opening sound device !\n");
-		exit(1);
-	}
-	param = 0;
-	frag_size = FRAG_SIZE /* audio fragment size */ ;
-	while (frag_size) {
-		frag_size >>= 1;
-		param++;
-	}
-	param--;
-	param |= /* audio_fragment_num */ 3 << 16;
-	if (ioctl(sound_fd, SNDCTL_DSP_SETFRAGMENT, &param) != 0) {
-		error("Error in the SNDCTL_DSP_SETFRAGMENT ioctl !\n");
-		exit(1);
-	}
-	param = AFMT_S16_LE;
-	if (ioctl(sound_fd, SNDCTL_DSP_SETFMT, &param) == -1) {
-		perror("Error in the SNDCTL_DSP_SETFMT ioctl !\n");
-		exit(1);
-	}
-	if (param != AFMT_S16_LE) {
-		error("AFMT_S16_LE not supported !\n");
-		exit(1);
-	}
-	param = 2;
-	if (ioctl(sound_fd, SNDCTL_DSP_CHANNELS, &param) == -1) {
-		error("Error in the SNDCTL_DSP_CHANNELS ioctl !\n");
-		exit(1);
-	}
-	if (param != 2) {
-		error("Stereo mode not supported !\n");
-		exit(1);
-	}
-	param = SAMPLES_PER_SEC;
-	if (ioctl(sound_fd, SNDCTL_DSP_SPEED, &param) == -1) {
-		perror("Error in the SNDCTL_DSP_SPEED ioctl !\n");
-		exit(1);
-	}
-	if (param != SAMPLES_PER_SEC) {
-		error("%d kHz not supported !\n", SAMPLES_PER_SEC);
-		exit(1);
-	}
-	if (ioctl(sound_fd, SNDCTL_DSP_GETOSPACE, &info) != 0) {
-		perror("SNDCTL_DSP_GETOSPACE");
-		exit(-1);
-	}
-
-	sched_yield();
-	while (1) {
-		uint8 *buf = (uint8 *)sound_buffer;
-		int size, written;
-
-		sound_proc(proc_param, (byte *)sound_buffer, FRAG_SIZE);
-#ifdef CAPTURE_SOUND
-		fwrite(buf, 2, FRAG_SIZE >> 1, f);
-		fflush(f);
-#endif
-		size = FRAG_SIZE;
-		while (size > 0) {
-			written = write(sound_fd, buf, size);
-			buf += written;
-			size -= written;
-		}
-	}
-
-	return NULL;
-}
-
 /* Function used to hide the mouse cursor */
 void OSystem_X11::create_empty_cursor() {
 	XColor bg;
@@ -507,24 +412,13 @@
 	palette = (uint16 *)calloc(256, sizeof(uint16));
 }
 
-bool OSystem_X11::setSoundCallback(SoundProc proc, void *param) {
-	static THREAD_PARAM thread_param;
-
-	/* And finally start the music thread */
-	thread_param.param = param;
-	thread_param.sound_proc = proc;
-
-	pthread_create(&sound_thread, NULL, sound_and_music_thread, (void *)&thread_param);
-
-	return true;
+bool OSystem_X11::setSoundCallback(SoundProc proc, void *param)
+{
+	return OSS_setSoundCallback(proc, param);
 }
 
 void OSystem_X11::clearSoundCallback() {
-	// TODO implement this...
-	// The sound_thread has to be stopped in a nice way. In particular,
-	// using pthread_kill would be a bad idea. Rather, use pthread_cancel,
-	// or maybe a global variable, to achieve this.
-	// This method shouldn't return until the sound thread really has stopped.
+	OSS_clearSoundCallback();
 }
 
 
@@ -800,7 +694,7 @@
 }
 
 int OSystem_X11::getOutputSampleRate() const {
-	return SAMPLES_PER_SEC;
+	return OSS_getOutputSampleRate();
 }
 
 bool OSystem_X11::openCD(int drive) {
diff -Nur scummvm-0.7.1.orig/configure scummvm-0.7.1/configure
--- scummvm-0.7.1.orig/configure	2005-01-07 15:14:07.000000000 +0100
+++ scummvm-0.7.1/configure	2005-05-01 16:16:23.000000000 +0200
@@ -247,7 +247,7 @@
 
 Configuration:
   -h, --help             display this help and exit
-  --backend=BACKEND      backend to build (sdl, x11, morphos, dc, gp32, null) [sdl]
+  --backend=BACKEND      backend to build (sdl, sdloss, x11, morphos, dc, gp32, null) [sdl]
 
 Installation directories:
   --prefix=DIR           use this prefix for installing ScummVM [/usr/local]
@@ -1030,11 +1030,18 @@
     LIBS="$LIBS `$_sdlconfig --libs`"
     MODULES="$MODULES backends/sdl"
     ;;
+   sdloss)
+    find_sdlconfig
+    INCLUDES="$INCLUDES `$_sdlconfig --cflags`"
+    LIBS="$LIBS `$_sdlconfig --libs`"
+    MODULES="$MODULES backends/sdl"
+    DEFINES="$DEFINES -DSDL_USE_OSS"
+    ;;
   x11)
     INCLUDES="$INCLUDES -I/usr/X11R6/include"
     LIBS="$LIBS -lpthread -lXext -lX11"
     LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -L/usr/local/lib"
-    OBJS="$OBJS backends/x11/x11.o"
+    OBJS="$OBJS backends/x11/x11.o backends/x11/oss.o"
     DEFINES="$DEFINES -DX11_BACKEND"
     MODULES="$MODULES backends/x11"
     MODULE_DIRS="$MODULE_DIRS backends/x11"

