Index: darkplaces/host.c
diff -u darkplaces/host.c:1.105 darkplaces/host.c:1.106
--- darkplaces/host.c:1.105	Sun Jul 11 10:56:33 2004
+++ darkplaces/host.c	Mon Aug  9 22:12:41 2004
@@ -762,12 +762,10 @@
 	if (cls.signon == SIGNONS && cl.viewentity >= 0 && cl.viewentity < MAX_EDICTS && cl_entities[cl.viewentity].state_current.active)
 	{
 		// LordHavoc: this used to use renderer variables (eww)
-		vec3_t forward, left, up, origin;
-		Matrix4x4_ToVectors(&cl_entities[cl.viewentity].render.matrix, forward, left, up, origin);
-		S_Update(origin, forward, left, up);
+		S_Update(&cl_entities[cl.viewentity].render.matrix);
 	}
 	else
-		S_Update(vec3_origin, vec3_origin, vec3_origin, vec3_origin);
+		S_Update(&identitymatrix);
 
 	CDAudio_Update();
 
Index: darkplaces/snd_dma.c
diff -u darkplaces/snd_dma.c:1.62 darkplaces/snd_dma.c:1.63
--- darkplaces/snd_dma.c:1.62	Tue Aug  3 04:39:50 2004
+++ darkplaces/snd_dma.c	Mon Aug  9 22:12:41 2004
@@ -58,10 +58,8 @@
 volatile dma_t *shm = 0;
 volatile dma_t sn;
 
-vec3_t listener_vieworigin;
-vec3_t listener_viewforward;
-vec3_t listener_viewleft;
-vec3_t listener_viewup;
+vec3_t listener_origin;
+matrix4x4_t listener_matrix;
 vec_t sound_nominal_clip_dist=1000.0;
 mempool_t *snd_mempool;
 
@@ -485,12 +483,12 @@
 		}
 
 		// calculate stereo seperation and distance attenuation
-		VectorSubtract(ch->origin, listener_vieworigin, source_vec);
+		Matrix4x4_Transform(&listener_matrix, ch->origin, source_vec);
 		dist = VectorNormalizeLength(source_vec);
 		// distance
 		scale = ch->master_vol * (1.0 - (dist * ch->dist_mult));
 		// panning
-		pan = scale * DotProduct(listener_viewleft, source_vec);
+		pan = scale * source_vec[0];
 		// calculate the volumes
 		ch->leftvol = (int) (scale + pan);
 		ch->rightvol = (int) (scale - pan);
@@ -803,7 +801,7 @@
 	if (ambient_level.value <= 0 || !cl.worldmodel || !cl.worldmodel->brush.AmbientSoundLevelsForPoint)
 		return;
 
-	cl.worldmodel->brush.AmbientSoundLevelsForPoint(cl.worldmodel, listener_vieworigin, ambientlevels, sizeof(ambientlevels));
+	cl.worldmodel->brush.AmbientSoundLevelsForPoint(cl.worldmodel, listener_origin, ambientlevels, sizeof(ambientlevels));
 
 // calc ambient sound levels
 	for (ambient_channel = 0 ; ambient_channel< NUM_AMBIENTS ; ambient_channel++)
@@ -845,7 +843,7 @@
 Called once each time through the main loop
 ============
 */
-void S_Update(vec3_t origin, vec3_t forward, vec3_t left, vec3_t up)
+void S_Update(const matrix4x4_t *listenermatrix)
 {
 	unsigned int i, j, total;
 	channel_t *ch, *combine;
@@ -853,10 +851,8 @@
 	if (!snd_initialized.integer || (snd_blocked > 0))
 		return;
 
-	VectorCopy(origin, listener_vieworigin);
-	VectorCopy(forward, listener_viewforward);
-	VectorCopy(left, listener_viewleft);
-	VectorCopy(up, listener_viewup);
+	listener_matrix = *listenermatrix;
+	Matrix4x4_OriginFromMatrix(&listener_matrix, listener_origin);
 
 // update general area ambient sound sources
 	S_UpdateAmbientSounds ();
@@ -1045,7 +1041,7 @@
 		else
 			i++;
 
-		ch_ind = S_StartSound(-1, 0, sfx, listener_vieworigin, fvol, attenuation);
+		ch_ind = S_StartSound(-1, 0, sfx, listener_origin, fvol, attenuation);
 		if (ch_ind >= 0)
 			channels[ch_ind].flags |= CHANNELFLAG_LOCALSOUND;
 	}
Index: darkplaces/snd_null.c
diff -u darkplaces/snd_null.c:1.16 darkplaces/snd_null.c:1.17
--- darkplaces/snd_null.c:1.16	Tue Jul  6 04:38:27 2004
+++ darkplaces/snd_null.c	Mon Aug  9 22:12:41 2004
@@ -103,7 +103,7 @@
 	return NULL;
 }
 
-void S_Update(vec3_t origin, vec3_t forward, vec3_t left, vec3_t up)
+void S_Update(const matrix4x4_t *matrix)
 {
 }
 
Index: darkplaces/sound.h
diff -u darkplaces/sound.h:1.36 darkplaces/sound.h:1.37
--- darkplaces/sound.h:1.36	Wed Jul 14 09:22:01 2004
+++ darkplaces/sound.h	Mon Aug  9 22:12:41 2004
@@ -22,6 +22,8 @@
 #ifndef SOUND_H
 #define SOUND_H
 
+#include "matrixlib.h"
+
 //AK: TODO: find a better solution instead of using a define
 #if defined( _WIN32 ) && !defined( USE_SDL )
 #	define USE_DSOUND
@@ -118,7 +120,7 @@
 void S_PauseGameSounds (void);
 void S_ResumeGameSounds (void);
 void S_SetChannelVolume (unsigned int ch_ind, float fvol);
-void S_Update(vec3_t origin, vec3_t forward, vec3_t left, vec3_t up);
+void S_Update(const matrix4x4_t *listenermatrix);
 void S_ExtraUpdate (void);
 
 sfx_t *S_GetCached(const char *name, qboolean stdpath);