diff --git a/engine/client/snd_dma.c b/engine/client/snd_dma.c
index da91d815c..009cbab40 100644
--- a/engine/client/snd_dma.c
+++ b/engine/client/snd_dma.c
@@ -42,9 +42,9 @@ qboolean		snd_initialized = false;
 int				snd_speed;
 
 vec3_t		listener_origin;
-vec3_t		listener_forward;
-vec3_t		listener_right;
-vec3_t		listener_up;
+vec3_t		listener_forward = {1, 0, 0};
+vec3_t		listener_right = {0, 1, 0};
+vec3_t		listener_up = {0, 0, 1};
 vec_t		sound_nominal_clip_dist=1000.0;
 
 int			soundtime;		// sample PAIRS
@@ -605,7 +605,7 @@ typedef struct {
 } sdriver_t;
 sdriver_t drivers[] = {
 //in order of preference
-	{"OpenAL", &pOPENAL_InitCard},	//yay, get someone else to sort out sound support, woot
+
 	{"DSound", &pDSOUND_InitCard},	//prefered on windows
 	{"MacOS", &pMacOS_InitCard},	//prefered on mac
 	{"AHI", &pAHI_InitCard},		//prefered on morphos
@@ -614,6 +614,7 @@ sdriver_t drivers[] = {
 	{"ALSA", &pALSA_InitCard},		//pure shite
 	{"OSS", &pOSS_InitCard},		//good, but not likely to work any more
 
+	{"OpenAL", &pOPENAL_InitCard},	//yay, get someone else to sort out sound support, woot
 	{"WaveOut", &pWAV_InitCard},	//doesn't work properly in vista, etc.
 	{NULL, NULL}
 };
@@ -1045,7 +1046,8 @@ void S_Init (void)
 
 	snd_initialized = true;
 
-	known_sfx = Hunk_AllocName (MAX_SFX*sizeof(sfx_t), "sfx_t");
+	if (!known_sfx)
+		known_sfx = Hunk_AllocName (MAX_SFX*sizeof(sfx_t), "sfx_t");
 	num_sfx = 0;
 
 // create a piece of DMA memory
@@ -1311,14 +1313,18 @@ void S_StartSoundCard(soundcardinfo_t *sc, int entnum, int entchannel, sfx_t *sf
 	if (nosound.ival)
 		return;
 
+	if (!pitchadj)
+		pitchadj = 100;
+
 #ifdef AVAIL_OPENAL
 	if (sc->openal)
-		OpenAL_StartSound(entnum, entchannel, sfx, origin, fvol, attenuation);
+	{
+		OpenAL_StartSound(entnum, entchannel, sfx, origin, fvol, attenuation, pitchadj / 100.0f);
+		return;
+	}
 #endif
 
 	vol = fvol*255;
-	if (!pitchadj)
-		pitchadj = 100;
 
 // pick a channel to play on
 	target_chan = SND_PickChannel(sc, entnum, entchannel);
diff --git a/engine/client/snd_mem.c b/engine/client/snd_mem.c
index 2838041a2..a0a57cec9 100644
--- a/engine/client/snd_mem.c
+++ b/engine/client/snd_mem.c
@@ -542,34 +542,44 @@ void SND_ResampleStream (void *in, int inrate, int inwidth, int inchannels, int
 ResampleSfx
 ================
 */
-void ResampleSfx (sfx_t *sfx, int inrate, int inwidth, qbyte *data)
+void ResampleSfx (sfx_t *sfx, int inrate, int inchannels, int inwidth, int insamps, int inloopstart, qbyte *data)
 {
 	extern cvar_t snd_linearresample;
 	double scale;
 	sfxcache_t	*sc;
-	int insamps, outsamps;
+	int outsamps;
+	int len;
+	int outwidth;
 
-	sc = Cache_Check (&sfx->cache);
-	if (!sc)
-		return;
-
-	insamps = sc->length;
 	scale = snd_speed / (double)inrate;
 	outsamps = insamps * scale;
-	sc->length = outsamps;
-	if (sc->loopstart != -1)
-		sc->loopstart = sc->loopstart * scale;
-
-	sc->speed = snd_speed;
-	if (loadas8bit.ival)
-		sc->width = 1;
+	if (loadas8bit.ival < 0)
+		outwidth = 2;
+	else if (loadas8bit.ival)
+		outwidth = 1;
 	else
-		sc->width = inwidth;
+		outwidth = inwidth;
+	len = outsamps * outwidth * inchannels;
+
+	sc = Cache_Alloc (&sfx->cache, len + sizeof(sfxcache_t), sfx->name);
+	if (!sc)
+	{
+		return;
+	}
+
+	sc->numchannels = inchannels;
+	sc->width = outwidth;
+	sc->speed = snd_speed;
+	sc->length = outsamps;
+	if (inloopstart == -1)
+		sc->loopstart = inloopstart;
+	else
+		sc->loopstart = inloopstart * scale;
 
 	SND_ResampleStream (data, 
 		inrate, 
 		inwidth, 
-		sc->numchannels, 
+		inchannels, 
 		insamps, 
 		sc->data, 
 		sc->speed, 
@@ -663,8 +673,6 @@ sfxcache_t *S_LoadDoomSpeakerSound (sfx_t *s, qbyte *data, int datalen, int snds
 
 sfxcache_t *S_LoadDoomSound (sfx_t *s, qbyte *data, int datalen, int sndspeed)
 {
-	sfxcache_t	*sc;
-
 	// format data from Unofficial Doom Specs v1.6
 	unsigned short *dataus;
 	int samples, rate, len;
@@ -686,36 +694,17 @@ sfxcache_t *S_LoadDoomSound (sfx_t *s, qbyte *data, int datalen, int sndspeed)
 	if (datalen != samples)
 		return NULL;
 
-	len = (int)((double)samples * (double)snd_speed / (double)rate);
+	COM_CharBias(data, sc->length);
 
-	sc = Cache_Alloc (&s->cache, len + sizeof(sfxcache_t), s->name);
-	if (!sc)
-	{
-		return NULL;
-	}
+	ResampleSfx (s, rate, 1, 1, samples, -1, data);
 
-	sc->length = samples;
-	sc->loopstart = -1;
-	sc->numchannels = 1;
-	sc->width = 1;
-	sc->speed = rate;
-
-	if (sc->width == 1)
-		COM_CharBias(data, sc->length);
-	else if (sc->width == 2)
-		COM_SwapLittleShortBlock((short *)data, sc->length);
-
-	ResampleSfx (s, sc->speed, sc->width, data);
-
-	return sc;
+	return Cache_Check(&s->cache);
 }
 #endif
 
 sfxcache_t *S_LoadWavSound (sfx_t *s, qbyte *data, int datalen, int sndspeed)
 {
 	wavinfo_t	info;
-	int		len;
-	sfxcache_t	*sc;
 
 	if (datalen < 4 || strncmp(data, "RIFF", 4))
 		return NULL;
@@ -728,29 +717,14 @@ sfxcache_t *S_LoadWavSound (sfx_t *s, qbyte *data, int datalen, int sndspeed)
 		return NULL;
 	}
 
-	len = (int) ((double) info.samples * (double) snd_speed / (double) info.rate);
-	len = len * info.width * info.numchannels;
+	if (info.width == 1)
+		COM_CharBias(data + info.dataofs, info.samples*info.numchannels);
+	else if (info.width == 2)
+		COM_SwapLittleShortBlock((short *)(data + info.dataofs), info.samples*info.numchannels);
 
-	sc = Cache_Alloc ( &s->cache, len + sizeof(sfxcache_t), s->name);
-	if (!sc)
-	{
-		return NULL;
-	}
-	
-	sc->length = info.samples;
-	sc->loopstart = info.loopstart;
-	sc->speed = info.rate;
-	sc->width = info.width;
-	sc->numchannels = info.numchannels;
+	ResampleSfx (s, info.rate, info.numchannels, info.width, info.samples, info.loopstart, data + info.dataofs);
 
-	if (sc->width == 1)
-		COM_CharBias(data + info.dataofs, sc->length*sc->numchannels);
-	else if (sc->width == 2)
-		COM_SwapLittleShortBlock((short *)(data + info.dataofs), sc->length*sc->numchannels);
-
-	ResampleSfx (s, sc->speed, sc->width, data + info.dataofs);
-
-	return sc;
+	return Cache_Check(&s->cache);
 }
 
 sfxcache_t *S_LoadOVSound (sfx_t *s, qbyte *data, int datalen, int sndspeed);
@@ -890,9 +864,6 @@ sfxcache_t *S_LoadSound (sfx_t *s)
 
 	s->failedload = false;
 
-#ifdef AVAIL_OPENAL
-	OpenAL_LoadSound(s, sc, com_filesize, data);
-#endif
 	for (i = sizeof(AudioInputPlugins)/sizeof(AudioInputPlugins[0])-1; i >= 0; i--)
 	{
 		if (AudioInputPlugins[i])
diff --git a/engine/client/sound.h b/engine/client/sound.h
index 14c47ffa6..67f0138cb 100644
--- a/engine/client/sound.h
+++ b/engine/client/sound.h
@@ -160,7 +160,7 @@ qboolean S_Voip_Speaking(unsigned int plno);
 #endif
 
 qboolean S_IsPlayingSomewhere(sfx_t *s);
-void ResampleSfx (sfx_t *sfx, int inrate, int inwidth, qbyte *data);
+void ResampleSfx (sfx_t *sfx, int inrate, int inchannels, int inwidth, int insamps, int inloopstart, qbyte *data);
 
 // picks a channel based on priorities, empty slots, number of channels
 channel_t *SND_PickChannel(soundcardinfo_t *sc, int entnum, int entchannel);
@@ -185,8 +185,8 @@ void SNDVC_MicInput(qbyte *buffer, int samples, int freq, int width);
 
 
 #ifdef AVAIL_OPENAL
-void OpenAL_LoadSound (sfx_t *s, sfxcache_t *sc, size_t size, void *data);
-void OpenAL_StartSound(int entnum, int entchannel, sfx_t * sfx, vec3_t origin, float fvol, float attenuation);
+void OpenAL_LoadCache(sfx_t *s, sfxcache_t *sc);
+void OpenAL_StartSound(int entnum, int entchannel, sfx_t * sfx, vec3_t origin, float fvol, float attenuation, float pitchscale);
 void OpenAL_Update_Listener(vec3_t origin, vec3_t forward, vec3_t right, vec3_t up);
 void OpenAL_CvarInit(void);
 #endif