diff --git a/multimedia/audio.c b/multimedia/audio.c
index f11dc74..2f69653 100644
--- a/multimedia/audio.c
+++ b/multimedia/audio.c
@@ -97,7 +97,7 @@
 typedef struct {
     int				unixdev;
     volatile int		state;
-    DWORD			dwFragmentSize;	/* OpenSound '/dev/dsp' give us that size */
+    DWORD			dwFragmentSize;		/* OpenSound '/dev/dsp' give us that size */
     WAVEOPENDESC		waveDesc;
     WORD			wFlags;
     PCMWAVEFORMAT		format;
@@ -115,8 +115,8 @@
 /**************************************************************************
  * 			WAVE_NotifyClient			[internal]
  */
-static DWORD WAVE_NotifyClient(UINT16 wDevID, WORD wMsg, 
-			       DWORD dwParam1, DWORD dwParam2)
+static DWORD WAVE_NotifyClient(UINT wDevID, WORD wMsg, DWORD dwParam1, 
+			       DWORD dwParam2)
 {
     TRACE("wDevID = %04X wMsg = %d dwParm1 = %04lX dwParam2 = %04lX\n",wDevID, wMsg, dwParam1, dwParam2);
     
@@ -127,13 +127,13 @@
 	if (wDevID > MAX_WAVEOUTDRV) return MCIERR_INTERNAL;
 	
 	if (WOutDev[wDevID].wFlags != DCB_NULL && 
-	    !DriverCallback16(WOutDev[wDevID].waveDesc.dwCallBack, 
-			      WOutDev[wDevID].wFlags, 
-			      WOutDev[wDevID].waveDesc.hWave, 
-			      wMsg, 
-			      WOutDev[wDevID].waveDesc.dwInstance, 
-			      dwParam1, 
-			      dwParam2)) {
+	    !DriverCallback(WOutDev[wDevID].waveDesc.dwCallback, 
+			    WOutDev[wDevID].wFlags, 
+			    WOutDev[wDevID].waveDesc.hWave, 
+			    wMsg, 
+			    WOutDev[wDevID].waveDesc.dwInstance, 
+			    dwParam1, 
+			    dwParam2)) {
 	    WARN("can't notify client !\n");
 	    return MMSYSERR_NOERROR;
 	}
@@ -145,13 +145,13 @@
 	if (wDevID > MAX_WAVEINDRV) return MCIERR_INTERNAL;
 	
 	if (WInDev[wDevID].wFlags != DCB_NULL && 
-	    !DriverCallback16(WInDev[wDevID].waveDesc.dwCallBack, 
-			      WInDev[wDevID].wFlags, 
-			      WInDev[wDevID].waveDesc.hWave, 
-			      wMsg, 
-			      WInDev[wDevID].waveDesc.dwInstance, 
-			      dwParam1, 
-			      dwParam2)) {
+	    !DriverCallback(WInDev[wDevID].waveDesc.dwCallback, 
+			    WInDev[wDevID].wFlags, 
+			    WInDev[wDevID].waveDesc.hWave, 
+			    wMsg, 
+			    WInDev[wDevID].waveDesc.dwInstance, 
+			    dwParam1, 
+			    dwParam2)) {
 	    WARN("can't notify client !\n");
 	    return MMSYSERR_NOERROR;
 	}
@@ -440,7 +440,7 @@
 /**************************************************************************
  * 			wodGetDevCaps				[internal]
  */
-static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS16 lpCaps, DWORD dwSize)
+static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPSA lpCaps, DWORD dwSize)
 {
     int 	audio;
     int		smplrate;
@@ -552,7 +552,7 @@
     int			dsp_stereo;
     int			audio_fragment;
     int			fragment_size;
-    WAVEOUTCAPS16 	woc;
+    WAVEOUTCAPSA 	woc;
 
     TRACE("(%u, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
     if (lpDesc == NULL) {
@@ -575,8 +575,12 @@
 	return WAVERR_BADFORMAT;
     }
 
-    if (dwFlags & WAVE_FORMAT_QUERY)
+    if (dwFlags & WAVE_FORMAT_QUERY) {
+	TRACE("Query format: tag=%04X nChannels=%d nSamplesPerSec=%ld !\n", 
+	     lpDesc->lpFormat->wFormatTag, lpDesc->lpFormat->nChannels,
+	     lpDesc->lpFormat->nSamplesPerSec);
 	return MMSYSERR_NOERROR;
+    }
 
     WOutDev[wDevID].unixdev = 0;
     if (access(SOUND_DEV, 0) != 0) 
@@ -606,7 +610,7 @@
     audio_fragment = 0x000F000A;
     sample_size = WOutDev[wDevID].format.wBitsPerSample;
     sample_rate = WOutDev[wDevID].format.wf.nSamplesPerSec;
-    dsp_stereo = (WOutDev[wDevID].format.wf.nChannels > 1) ? TRUE : FALSE;
+    dsp_stereo = (WOutDev[wDevID].format.wf.nChannels > 1) ? 1 : 0;
 
     IOCTL(audio, SNDCTL_DSP_SETFRAGMENT, audio_fragment);
     /* First size and stereo then samplerate */
@@ -614,6 +618,17 @@
     IOCTL(audio, SNDCTL_DSP_STEREO, dsp_stereo);
     IOCTL(audio, SNDCTL_DSP_SPEED, sample_rate);
 
+    /* paranoid checks */
+    if (sample_size != WOutDev[wDevID].format.wBitsPerSample)
+	ERR("Can't set sample_size to %u (%d)\n", 
+	    WOutDev[wDevID].format.wBitsPerSample, sample_size);
+    if (dsp_stereo != (WOutDev[wDevID].format.wf.nChannels > 1) ? 1 : 0) 
+	ERR("Can't set stereo to %u (%d)\n", 
+	    (WOutDev[wDevID].format.wf.nChannels > 1) ? 1 : 0, dsp_stereo);
+    if (sample_rate != WOutDev[wDevID].format.wf.nSamplesPerSec)
+	ERR("Can't set sample_rate to %lu (%d)\n", 
+	    WOutDev[wDevID].format.wf.nSamplesPerSec, sample_rate);
+
     /* even if we set fragment size above, read it again, just in case */
     IOCTL(audio, SNDCTL_DSP_GETBLKSIZE, fragment_size);
 
@@ -628,9 +643,10 @@
     TRACE("fd=%d fragmentSize=%ld\n", 
 	  WOutDev[wDevID].unixdev, WOutDev[wDevID].dwFragmentSize);
 
-    TRACE("wBitsPerSample=%u, nAvgBytesPerSec=%lu, nSamplesPerSec=%lu, nChannels=%u !\n", 
+    TRACE("wBitsPerSample=%u, nAvgBytesPerSec=%lu, nSamplesPerSec=%lu, nChannels=%u nBlockAlign=%u!\n", 
 	  WOutDev[wDevID].format.wBitsPerSample, WOutDev[wDevID].format.wf.nAvgBytesPerSec, 
-	  WOutDev[wDevID].format.wf.nSamplesPerSec, WOutDev[wDevID].format.wf.nChannels);
+	  WOutDev[wDevID].format.wf.nSamplesPerSec, WOutDev[wDevID].format.wf.nChannels,
+	  WOutDev[wDevID].format.wf.nBlockAlign);
     
     if (WAVE_NotifyClient(wDevID, WOM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
 	WARN("can't notify client !\n");
@@ -811,7 +827,7 @@
 /**************************************************************************
  * 				wodGetPosition			[internal]
  */
-static DWORD wodGetPosition(WORD wDevID, LPMMTIME16 lpTime, DWORD uSize)
+static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 {
     int		time;
     DWORD	val;
@@ -944,25 +960,30 @@
 }
 
 /**************************************************************************
- * 				wodMessage			[sample driver]
+ * 				OSS_wodMessage		[sample driver]
  */
-DWORD WINAPI wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-			DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI OSS_wodMessage(UINT wDevID, UINT wMsg, DWORD dwUser, 
+			    DWORD dwParam1, DWORD dwParam2)
 {
     TRACE("(%u, %04X, %08lX, %08lX, %08lX);\n",
 	  wDevID, wMsg, dwUser, dwParam1, dwParam2);
     
     switch (wMsg) {
+    case DRVM_INIT:
+    case DRVM_EXIT:
+    case DRVM_ENABLE:
+    case DRVM_DISABLE:
+	/* FIXME: Pretend this is supported */
+	return 0;
     case WODM_OPEN:	 	return wodOpen		(wDevID, (LPWAVEOPENDESC)dwParam1,	dwParam2);
     case WODM_CLOSE:	 	return wodClose		(wDevID);
     case WODM_WRITE:	 	return wodWrite		(wDevID, (LPWAVEHDR)dwParam1,		dwParam2);
     case WODM_PAUSE:	 	return wodPause		(wDevID);
-	/*    case WODM_STOP:	 	*/
-    case WODM_GETPOS:	 	return wodGetPosition	(wDevID, (LPMMTIME16)dwParam1, 		dwParam2);
+    case WODM_GETPOS:	 	return wodGetPosition	(wDevID, (LPMMTIME)dwParam1, 		dwParam2);
     case WODM_BREAKLOOP: 	return MMSYSERR_NOTSUPPORTED;
     case WODM_PREPARE:	 	return wodPrepare	(wDevID, (LPWAVEHDR)dwParam1, 		dwParam2);
     case WODM_UNPREPARE: 	return wodUnprepare	(wDevID, (LPWAVEHDR)dwParam1, 		dwParam2);
-    case WODM_GETDEVCAPS:	return wodGetDevCaps	(wDevID, (LPWAVEOUTCAPS16)dwParam1,	dwParam2);
+    case WODM_GETDEVCAPS:	return wodGetDevCaps	(wDevID, (LPWAVEOUTCAPSA)dwParam1,	dwParam2);
     case WODM_GETNUMDEVS:	return wodGetNumDevs	();
     case WODM_GETPITCH:	 	return MMSYSERR_NOTSUPPORTED;
     case WODM_SETPITCH:	 	return MMSYSERR_NOTSUPPORTED;
@@ -985,9 +1006,9 @@
 /**************************************************************************
  * 			widGetDevCaps				[internal]
  */
-static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS16 lpCaps, DWORD dwSize)
+static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPSA lpCaps, DWORD dwSize)
 {
-    int 	audio,smplrate,samplesize=16,dsp_stereo=1,bytespersmpl;
+    int 	audio, smplrate, samplesize=16, dsp_stereo=1, bytespersmpl;
     
     TRACE("(%u, %p, %lu);\n", wDevID, lpCaps, dwSize);
     if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
@@ -1049,7 +1070,7 @@
  */
 static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
-    int 		audio,abuf_size,smplrate,samplesize,dsp_stereo;
+    int 		audio, abuf_size, smplrate, samplesize, dsp_stereo;
     LPWAVEFORMAT	lpFormat;
     
     TRACE("(%u, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
@@ -1061,6 +1082,24 @@
 	TRACE("MAX_WAVINDRV reached !\n");
 	return MMSYSERR_ALLOCATED;
     }
+
+    /* only PCM format is supported so far... */
+    if (lpDesc->lpFormat->wFormatTag != WAVE_FORMAT_PCM ||
+	lpDesc->lpFormat->nChannels == 0 ||
+	lpDesc->lpFormat->nSamplesPerSec == 0) {
+	WARN("Bad format: tag=%04X nChannels=%d nSamplesPerSec=%ld !\n", 
+	     lpDesc->lpFormat->wFormatTag, lpDesc->lpFormat->nChannels,
+	     lpDesc->lpFormat->nSamplesPerSec);
+	return WAVERR_BADFORMAT;
+    }
+
+    if (dwFlags & WAVE_FORMAT_QUERY) {
+	TRACE("Query format: tag=%04X nChannels=%d nSamplesPerSec=%ld !\n", 
+	     lpDesc->lpFormat->wFormatTag, lpDesc->lpFormat->nChannels,
+	     lpDesc->lpFormat->nSamplesPerSec);
+	return MMSYSERR_NOERROR;
+    }
+
     WInDev[wDevID].unixdev = 0;
     if (access(SOUND_DEV,0) != 0) return MMSYSERR_NOTENABLED;
     audio = open(SOUND_DEV, O_RDONLY, 0);
@@ -1087,11 +1126,7 @@
     WInDev[wDevID].dwTotalRecorded = 0;
     memcpy(&WInDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
     lpFormat = (LPWAVEFORMAT) lpDesc->lpFormat; 
-    if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
-	WARN("Bad format %04X !\n",
-	     lpFormat->wFormatTag);
-	return WAVERR_BADFORMAT;
-    }
+
     memcpy(&WInDev[wDevID].format, lpFormat, sizeof(PCMWAVEFORMAT));
     WInDev[wDevID].format.wBitsPerSample = 8; /* <-------------- */
     if (WInDev[wDevID].format.wf.nChannels == 0) return WAVERR_BADFORMAT;
@@ -1306,7 +1341,7 @@
 /**************************************************************************
  * 				widGetPosition			[internal]
  */
-static DWORD widGetPosition(WORD wDevID, LPMMTIME16 lpTime, DWORD uSize)
+static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 {
     int		time;
     
@@ -1359,23 +1394,29 @@
 }
 
 /**************************************************************************
- * 				widMessage			[sample driver]
+ * 				OSS_widMessage			[sample driver]
  */
-DWORD WINAPI widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-			DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI OSS_widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+			    DWORD dwParam1, DWORD dwParam2)
 {
     TRACE("(%u, %04X, %08lX, %08lX, %08lX);\n",
 	  wDevID, wMsg, dwUser, dwParam1, dwParam2);
 
     switch (wMsg) {
+    case DRVM_INIT:
+    case DRVM_EXIT:
+    case DRVM_ENABLE:
+    case DRVM_DISABLE:
+	/* FIXME: Pretend this is supported */
+	return 0;
     case WIDM_OPEN:		return widOpen(wDevID, (LPWAVEOPENDESC)dwParam1, dwParam2);
     case WIDM_CLOSE:		return widClose(wDevID);
     case WIDM_ADDBUFFER:	return widAddBuffer(wDevID, (LPWAVEHDR)dwParam1, dwParam2);
     case WIDM_PREPARE:		return widPrepare(wDevID, (LPWAVEHDR)dwParam1, dwParam2);
     case WIDM_UNPREPARE:	return widUnprepare(wDevID, (LPWAVEHDR)dwParam1, dwParam2);
-    case WIDM_GETDEVCAPS:	return widGetDevCaps(wDevID, (LPWAVEINCAPS16)dwParam1,dwParam2);
+    case WIDM_GETDEVCAPS:	return widGetDevCaps(wDevID, (LPWAVEINCAPSA)dwParam1, dwParam2);
     case WIDM_GETNUMDEVS:	return wodGetNumDevs();	/* same number of devices in output as in input */
-    case WIDM_GETPOS:		return widGetPosition(wDevID, (LPMMTIME16)dwParam1, dwParam2);
+    case WIDM_GETPOS:		return widGetPosition(wDevID, (LPMMTIME)dwParam1, dwParam2);
     case WIDM_RESET:		return widReset(wDevID);
     case WIDM_START:		return widStart(wDevID);
     case WIDM_STOP:		return widStop(wDevID);
@@ -1385,42 +1426,13 @@
     return MMSYSERR_NOTSUPPORTED;
 }
 
-/*======================================================================*
- *              Low level WAVE implemantation - DriverProc		*
- *======================================================================*/
-
-/**************************************************************************
- * 				WAVE_DriverProc			[sample driver]
- */
-LONG CALLBACK	WAVE_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
-				DWORD dwParam1, DWORD dwParam2)
-{
-    TRACE("(%08lX, %04X, %08lX, %08lX, %08lX)\n", dwDevID, hDriv, wMsg, dwParam1, dwParam2);
-    switch (wMsg) {
-    case DRV_LOAD:		return 1;
-    case DRV_FREE:		return 1;
-    case DRV_OPEN:		return 1;
-    case DRV_CLOSE:		return 1;
-    case DRV_ENABLE:		return 1;
-    case DRV_DISABLE:		return 1;
-    case DRV_QUERYCONFIGURE:	return 1;
-    case DRV_CONFIGURE:		MessageBoxA(0, "Sample MultiMedia Linux Driver !", "MMLinux Driver", MB_OK);	return 1;
-    case DRV_INSTALL:		return DRVCNF_RESTART;
-    case DRV_REMOVE:		return DRVCNF_RESTART;
-    default:
-	FIXME("is probably wrong msg=0x%04lx\n", wMsg);
-	return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
-    }
-    return MMSYSERR_NOTENABLED;
-}
-
 #else /* !HAVE_OSS */
 
 /**************************************************************************
  * 				wodMessage			[sample driver]
  */
-DWORD WINAPI wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-			DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI OSS_wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+			    DWORD dwParam1, DWORD dwParam2)
 {
     FIXME("(%u, %04X, %08lX, %08lX, %08lX):stub\n", wDevID, wMsg, dwUser, dwParam1, dwParam2);
     return MMSYSERR_NOTENABLED;
@@ -1429,19 +1441,11 @@
 /**************************************************************************
  * 				widMessage			[sample driver]
  */
-DWORD WINAPI widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-			DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI OSS_widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+			    DWORD dwParam1, DWORD dwParam2)
 {
     FIXME("(%u, %04X, %08lX, %08lX, %08lX):stub\n", wDevID, wMsg, dwUser, dwParam1, dwParam2);
     return MMSYSERR_NOTENABLED;
 }
 
-/**************************************************************************
- * 				WAVE_DriverProc			[sample driver]
- */
-LONG CALLBACK	WAVE_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
-				DWORD dwParam1, DWORD dwParam2)
-{
-    return MMSYSERR_NOTENABLED;
-}
 #endif /* HAVE_OSS */
diff --git a/multimedia/mixer.c b/multimedia/mixer.c
index e6602e7..43b7cfc 100644
--- a/multimedia/mixer.c
+++ b/multimedia/mixer.c
@@ -505,16 +505,22 @@
 #endif /* HAVE_OSS */
 
 /**************************************************************************
- * 				mixMessage			[sample driver]
+ * 				OSS_mixMessage		[sample driver]
  */
-DWORD WINAPI mixMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-			DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI OSS_mixMessage(UINT wDevID, UINT wMsg, DWORD dwUser, 
+			    DWORD dwParam1, DWORD dwParam2)
 {
     TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n", 
 	  wDevID, wMsg, dwUser, dwParam1, dwParam2);
     
 #ifdef HAVE_OSS
     switch(wMsg) {
+    case DRVM_INIT:
+    case DRVM_EXIT:
+    case DRVM_ENABLE:
+    case DRVM_DISABLE:
+	/* FIXME: Pretend this is supported */
+	return 0;
     case MXDM_GETDEVCAPS:	
 	return MIX_GetDevCaps(wDevID, (LPMIXERCAPSA)dwParam1, dwParam2);
     case MXDM_GETLINEINFO:
diff --git a/multimedia/mmaux.c b/multimedia/mmaux.c
index 589edbd..6e87663 100644
--- a/multimedia/mmaux.c
+++ b/multimedia/mmaux.c
@@ -1,3 +1,4 @@
+/* -*- tab-width: 8; c-basic-offset: 4 -*- */
 /*
  * Sample AUXILARY Wine Driver
  *
@@ -15,13 +16,12 @@
 #include "driver.h"
 #include "mmddk.h"
 #include "oss.h"
-
 #include "debugtools.h"
 
 DEFAULT_DEBUG_CHANNEL(mmaux)
-
+    
 #define MIXER_DEV "/dev/mixer"
-
+    
 static int	NumDev = 6;
 
 /*-----------------------------------------------------------------------*/
@@ -30,70 +30,70 @@
 /**************************************************************************
  * 				AUX_GetDevCaps			[internal]
  */
-static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS16 lpCaps, DWORD dwSize)
+static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPSA lpCaps, DWORD dwSize)
 {
 #ifdef HAVE_OSS
-	int 	mixer,volume;
-	
-	TRACE("(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
-	if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
-	if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
-		WARN("mixer device not available !\n");
-		return MMSYSERR_NOTENABLED;
-	}
-	if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
-		close(mixer);
-		WARN("unable read mixer !\n");
-		return MMSYSERR_NOTENABLED;
-	}
-	close(mixer);
-#ifdef EMULATE_SB16
-	lpCaps->wMid = 0x0002;
-	lpCaps->vDriverVersion = 0x0200;
-	lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
-	switch (wDevID) {
-	case 0:
-		lpCaps->wPid = 0x0196;
-		strcpy(lpCaps->szPname, "SB16 Aux: Wave");
-		lpCaps->wTechnology = AUXCAPS_AUXIN;
-		break;
-	case 1:
-		lpCaps->wPid = 0x0197;
-		strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
-		lpCaps->wTechnology = AUXCAPS_AUXIN;
-		break;
-	case 2:
-		lpCaps->wPid = 0x0191;
-		strcpy(lpCaps->szPname, "SB16 Aux: CD");
-		lpCaps->wTechnology = AUXCAPS_CDAUDIO;
-		break;
-	case 3:
-		lpCaps->wPid = 0x0192;
-		strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
-		lpCaps->wTechnology = AUXCAPS_AUXIN;
-		break;
-	case 4:
-		lpCaps->wPid = 0x0193;
-		strcpy(lpCaps->szPname, "SB16 Aux: Mic");
-		lpCaps->wTechnology = AUXCAPS_AUXIN;
-		break;
-	case 5:
-		lpCaps->wPid = 0x0194;
-		strcpy(lpCaps->szPname, "SB16 Aux: Master");
-		lpCaps->wTechnology = AUXCAPS_AUXIN;
-		break;
-	}
-#else
-	lpCaps->wMid = 0xAA;
-	lpCaps->wPid = 0x55;
-	lpCaps->vDriverVersion = 0x0100;
-	strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
-	lpCaps->wTechnology = AUXCAPS_CDAUDIO;
-	lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
-#endif
-	return MMSYSERR_NOERROR;
-#else
+    int 	mixer,volume;
+    
+    TRACE("(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
+    if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
+    if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
+	WARN("mixer device not available !\n");
 	return MMSYSERR_NOTENABLED;
+    }
+    if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
+	close(mixer);
+	WARN("unable read mixer !\n");
+	return MMSYSERR_NOTENABLED;
+    }
+    close(mixer);
+#ifdef EMULATE_SB16
+    lpCaps->wMid = 0x0002;
+    lpCaps->vDriverVersion = 0x0200;
+    lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
+    switch (wDevID) {
+    case 0:
+	lpCaps->wPid = 0x0196;
+	strcpy(lpCaps->szPname, "SB16 Aux: Wave");
+	lpCaps->wTechnology = AUXCAPS_AUXIN;
+	break;
+    case 1:
+	lpCaps->wPid = 0x0197;
+	strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
+	lpCaps->wTechnology = AUXCAPS_AUXIN;
+	break;
+    case 2:
+	lpCaps->wPid = 0x0191;
+	strcpy(lpCaps->szPname, "SB16 Aux: CD");
+	lpCaps->wTechnology = AUXCAPS_CDAUDIO;
+	break;
+    case 3:
+	lpCaps->wPid = 0x0192;
+	strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
+	lpCaps->wTechnology = AUXCAPS_AUXIN;
+	break;
+    case 4:
+	lpCaps->wPid = 0x0193;
+	strcpy(lpCaps->szPname, "SB16 Aux: Mic");
+	lpCaps->wTechnology = AUXCAPS_AUXIN;
+	break;
+    case 5:
+	lpCaps->wPid = 0x0194;
+	strcpy(lpCaps->szPname, "SB16 Aux: Master");
+	lpCaps->wTechnology = AUXCAPS_AUXIN;
+	break;
+    }
+#else
+    lpCaps->wMid = 0xAA;
+    lpCaps->wPid = 0x55;
+    lpCaps->vDriverVersion = 0x0100;
+    strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
+    lpCaps->wTechnology = AUXCAPS_CDAUDIO;
+    lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
+#endif
+    return MMSYSERR_NOERROR;
+#else
+    return MMSYSERR_NOTENABLED;
 #endif
 }
 
@@ -104,55 +104,55 @@
 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
 {
 #ifdef HAVE_OSS
-	int 	mixer, volume, left, right, cmd;
-	
-	TRACE("(%04X, %p);\n", wDevID, lpdwVol);
-	if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
-	if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
-		WARN("mixer device not available !\n");
-		return MMSYSERR_NOTENABLED;
-	}
-	switch(wDevID) {
-	case 0:
-		TRACE("SOUND_MIXER_READ_PCM !\n");
-		cmd = SOUND_MIXER_READ_PCM;
-		break;
-	case 1:
-		TRACE("SOUND_MIXER_READ_SYNTH !\n");
-		cmd = SOUND_MIXER_READ_SYNTH;
-		break;
-	case 2:
-		TRACE("SOUND_MIXER_READ_CD !\n");
-		cmd = SOUND_MIXER_READ_CD;
-		break;
-	case 3:
-		TRACE("SOUND_MIXER_READ_LINE !\n");
-		cmd = SOUND_MIXER_READ_LINE;
-		break;
-	case 4:
-		TRACE("SOUND_MIXER_READ_MIC !\n");
-		cmd = SOUND_MIXER_READ_MIC;
-		break;
-	case 5:
-		TRACE("SOUND_MIXER_READ_VOLUME !\n");
-		cmd = SOUND_MIXER_READ_VOLUME;
-		break;
-	default:
-		WARN("invalid device id=%04X !\n", wDevID);
-		return MMSYSERR_NOTENABLED;
-	}
-	if (ioctl(mixer, cmd, &volume) == -1) {
-		WARN("unable read mixer !\n");
-		return MMSYSERR_NOTENABLED;
-	}
-	close(mixer);
-	left  = LOBYTE(LOWORD(volume));
-	right = HIBYTE(LOWORD(volume));
-	TRACE("left=%d right=%d !\n", left, right);
-	*lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
-	return MMSYSERR_NOERROR;
-#else
+    int 	mixer, volume, left, right, cmd;
+    
+    TRACE("(%04X, %p);\n", wDevID, lpdwVol);
+    if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
+    if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
+	WARN("mixer device not available !\n");
 	return MMSYSERR_NOTENABLED;
+    }
+    switch(wDevID) {
+    case 0:
+	TRACE("SOUND_MIXER_READ_PCM !\n");
+	cmd = SOUND_MIXER_READ_PCM;
+	break;
+    case 1:
+	TRACE("SOUND_MIXER_READ_SYNTH !\n");
+	cmd = SOUND_MIXER_READ_SYNTH;
+	break;
+    case 2:
+	TRACE("SOUND_MIXER_READ_CD !\n");
+	cmd = SOUND_MIXER_READ_CD;
+	break;
+    case 3:
+	TRACE("SOUND_MIXER_READ_LINE !\n");
+	cmd = SOUND_MIXER_READ_LINE;
+	break;
+    case 4:
+	TRACE("SOUND_MIXER_READ_MIC !\n");
+	cmd = SOUND_MIXER_READ_MIC;
+	break;
+    case 5:
+	TRACE("SOUND_MIXER_READ_VOLUME !\n");
+	cmd = SOUND_MIXER_READ_VOLUME;
+	break;
+    default:
+	WARN("invalid device id=%04X !\n", wDevID);
+	return MMSYSERR_NOTENABLED;
+    }
+    if (ioctl(mixer, cmd, &volume) == -1) {
+	WARN("unable read mixer !\n");
+	return MMSYSERR_NOTENABLED;
+    }
+    close(mixer);
+    left  = LOBYTE(LOWORD(volume));
+    right = HIBYTE(LOWORD(volume));
+    TRACE("left=%d right=%d !\n", left, right);
+    *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
+    return MMSYSERR_NOERROR;
+#else
+    return MMSYSERR_NOTENABLED;
 #endif
 }
 
@@ -162,82 +162,88 @@
 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
 {
 #ifdef HAVE_OSS
-	int 		mixer;
-	int		volume, left, right;
-	int		cmd;
-
-	TRACE("(%04X, %08lX);\n", wDevID, dwParam);
-
-	left   = (LOWORD(dwParam) * 100) >> 16;
-	right  = (HIWORD(dwParam) * 100) >> 16;
-	volume = (right << 8) | left;
-
-	if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
-		WARN("mixer device not available !\n");
-		return MMSYSERR_NOTENABLED;
-	}
-
-	switch(wDevID) {
-	case 0:
-		TRACE("SOUND_MIXER_WRITE_PCM !\n");
-		cmd = SOUND_MIXER_WRITE_PCM;
-		break;
-	case 1:
-		TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
-		cmd = SOUND_MIXER_WRITE_SYNTH;
-		break;
-	case 2:
-		TRACE("SOUND_MIXER_WRITE_CD !\n");
-		cmd = SOUND_MIXER_WRITE_CD;
-		break;
-	case 3:
-		TRACE("SOUND_MIXER_WRITE_LINE !\n");
-		cmd = SOUND_MIXER_WRITE_LINE;
-		break;
-	case 4:
-		TRACE("SOUND_MIXER_WRITE_MIC !\n");
-		cmd = SOUND_MIXER_WRITE_MIC;
-		break;
-	case 5:
-		TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
-		cmd = SOUND_MIXER_WRITE_VOLUME;
-		break;
-	default:
-		WARN("invalid device id=%04X !\n", wDevID);
-		return MMSYSERR_NOTENABLED;
-	}
-	if (ioctl(mixer, cmd, &volume) == -1) {
-		WARN("unable set mixer !\n");
-		return MMSYSERR_NOTENABLED;
-	}
-	close(mixer);
-	return MMSYSERR_NOERROR;
-#else
+    int 		mixer;
+    int		volume, left, right;
+    int		cmd;
+    
+    TRACE("(%04X, %08lX);\n", wDevID, dwParam);
+    
+    left   = (LOWORD(dwParam) * 100) >> 16;
+    right  = (HIWORD(dwParam) * 100) >> 16;
+    volume = (right << 8) | left;
+    
+    if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
+	WARN("mixer device not available !\n");
 	return MMSYSERR_NOTENABLED;
+    }
+    
+    switch(wDevID) {
+    case 0:
+	TRACE("SOUND_MIXER_WRITE_PCM !\n");
+	cmd = SOUND_MIXER_WRITE_PCM;
+	break;
+    case 1:
+	TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
+	cmd = SOUND_MIXER_WRITE_SYNTH;
+	break;
+    case 2:
+	TRACE("SOUND_MIXER_WRITE_CD !\n");
+	cmd = SOUND_MIXER_WRITE_CD;
+	break;
+    case 3:
+	TRACE("SOUND_MIXER_WRITE_LINE !\n");
+	cmd = SOUND_MIXER_WRITE_LINE;
+	break;
+    case 4:
+	TRACE("SOUND_MIXER_WRITE_MIC !\n");
+	cmd = SOUND_MIXER_WRITE_MIC;
+	break;
+    case 5:
+	TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
+	cmd = SOUND_MIXER_WRITE_VOLUME;
+	break;
+    default:
+	WARN("invalid device id=%04X !\n", wDevID);
+	return MMSYSERR_NOTENABLED;
+    }
+    if (ioctl(mixer, cmd, &volume) == -1) {
+	WARN("unable set mixer !\n");
+	return MMSYSERR_NOTENABLED;
+    }
+    close(mixer);
+    return MMSYSERR_NOERROR;
+#else
+    return MMSYSERR_NOTENABLED;
 #endif
 }
 
 
 /**************************************************************************
- * 				auxMessage			[sample driver]
+ *		OSS_auxMessage				[sample driver]
  */
-DWORD WINAPI auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-								DWORD dwParam1, DWORD dwParam2)
+DWORD WINAPI OSS_auxMessage(UINT wDevID, UINT wMsg, DWORD dwUser, 
+			    DWORD dwParam1, DWORD dwParam2)
 {
-	TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n", 
-			wDevID, wMsg, dwUser, dwParam1, dwParam2);
-	switch(wMsg) {
-	case AUXDM_GETDEVCAPS:
-		return AUX_GetDevCaps(wDevID,(LPAUXCAPS16)dwParam1,dwParam2);
-	case AUXDM_GETNUMDEVS:
-		TRACE("return %d;\n", NumDev);
-		return NumDev;
-	case AUXDM_GETVOLUME:
-		return AUX_GetVolume(wDevID,(LPDWORD)dwParam1);
-	case AUXDM_SETVOLUME:
-		return AUX_SetVolume(wDevID,dwParam1);
-	default:
-		WARN("unknown message !\n");
-	}
-	return MMSYSERR_NOTSUPPORTED;
+    TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n", 
+	  wDevID, wMsg, dwUser, dwParam1, dwParam2);
+    switch(wMsg) {
+    case DRVM_INIT:
+    case DRVM_EXIT:
+    case DRVM_ENABLE:
+    case DRVM_DISABLE:
+	/* FIXME: Pretend this is supported */
+	return 0;
+    case AUXDM_GETDEVCAPS:
+	return AUX_GetDevCaps(wDevID, (LPAUXCAPSA)dwParam1,dwParam2);
+    case AUXDM_GETNUMDEVS:
+	TRACE("return %d;\n", NumDev);
+	return NumDev;
+    case AUXDM_GETVOLUME:
+	return AUX_GetVolume(wDevID, (LPDWORD)dwParam1);
+    case AUXDM_SETVOLUME:
+	return AUX_SetVolume(wDevID, dwParam1);
+    default:
+	WARN("unknown message !\n");
+    }
+    return MMSYSERR_NOTSUPPORTED;
 }
