X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=snd_dma.c;h=e3db4c90ddf802d390c4c27e3d88ef479da763a9;hb=a645f983527a0c9e73e985790126d1a55b108584;hp=9dc6636554141c4dcd26e107e1030fde31582d1a;hpb=053629ead3d4541a06d7bf88e38df1ba0e5464ba;p=xonotic%2Fdarkplaces.git diff --git a/snd_dma.c b/snd_dma.c index 9dc66365..e3db4c90 100644 --- a/snd_dma.c +++ b/snd_dma.c @@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" -#ifdef _WIN32 +#ifdef USE_DSOUND #include #include extern DWORD gSndBufSize; @@ -58,10 +58,8 @@ cvar_t snd_streaming = { CVAR_SAVE, "snd_streaming", "1"}; 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; @@ -210,8 +208,6 @@ void S_Init(void) { Con_DPrint("\nSound Initialization\n"); - S_RawSamples_ClearQueue(); - Cvar_RegisterVariable(&volume); Cvar_RegisterVariable(&bgmvolume); Cvar_RegisterVariable(&snd_staticvolume); @@ -487,12 +483,12 @@ void SND_Spatialize(channel_t *ch, int isstatic) } // 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[1]; // calculate the volumes ch->leftvol = (int) (scale + pan); ch->rightvol = (int) (scale - pan); @@ -696,7 +692,7 @@ void S_ClearBuffer(void) else clear = 0; -#ifdef _WIN32 +#ifdef USE_DSOUND if (pDSBuf) { DWORD dwSize; @@ -805,7 +801,7 @@ void S_UpdateAmbientSounds (void) 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++) @@ -847,7 +843,7 @@ S_Update 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; @@ -855,10 +851,8 @@ void S_Update(vec3_t origin, vec3_t forward, vec3_t left, vec3_t up) if (!snd_initialized.integer || (snd_blocked > 0)) return; - VectorCopy(origin, listener_vieworigin); - VectorCopy(forward, listener_viewforward); - VectorCopy(left, listener_viewleft); - VectorCopy(up, listener_viewup); + Matrix4x4_Invert_Simple(&listener_matrix, listenermatrix); + Matrix4x4_OriginFromMatrix(listenermatrix, listener_origin); // update general area ambient sound sources S_UpdateAmbientSounds (); @@ -961,7 +955,7 @@ void IN_Accumulate (void); void S_ExtraUpdate (void) { -#ifdef _WIN32 +#ifdef USE_DSOUND IN_Accumulate (); #endif @@ -991,7 +985,7 @@ void S_Update_(void) if (endtime > (unsigned int)(soundtime + samps)) endtime = soundtime + samps; -#ifdef _WIN32 +#ifdef USE_DSOUND // if the buffer was lost or stopped, restore it and/or restart it { DWORD dwStatus; @@ -1047,7 +1041,7 @@ static void S_Play_Common(float fvol, float attenuation) 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; } @@ -1109,120 +1103,7 @@ void S_LocalSound (const char *sound, qboolean stdpath) return; } - ch_ind = S_StartSound (cl.viewentity, -1, sfx, vec3_origin, 1, 1); + ch_ind = S_StartSound (cl.viewentity, 0, sfx, vec3_origin, 1, 1); if (ch_ind >= 0) channels[ch_ind].flags |= CHANNELFLAG_LOCALSOUND; } - - -#define RAWSAMPLESBUFFER 32768 -short s_rawsamplesbuffer[RAWSAMPLESBUFFER * 2]; -int s_rawsamplesbuffer_start; -size_t s_rawsamplesbuffer_count; - -void S_RawSamples_Enqueue(short *samples, unsigned int length) -{ - int b2, b3; - //Con_Printf("S_RawSamples_Enqueue: %i samples\n", length); - if (s_rawsamplesbuffer_count + length > RAWSAMPLESBUFFER) - return; - b2 = (s_rawsamplesbuffer_start + s_rawsamplesbuffer_count) % RAWSAMPLESBUFFER; - if (b2 + length > RAWSAMPLESBUFFER) - { - b3 = (b2 + length) % RAWSAMPLESBUFFER; - memcpy(s_rawsamplesbuffer + b2 * 2, samples, (RAWSAMPLESBUFFER - b2) * sizeof(short[2])); - memcpy(s_rawsamplesbuffer, samples + (RAWSAMPLESBUFFER - b2) * 2, b3 * sizeof(short[2])); - } - else - memcpy(s_rawsamplesbuffer + b2 * 2, samples, length * sizeof(short[2])); - s_rawsamplesbuffer_count += length; -} - -void S_RawSamples_Dequeue(int *samples, unsigned int length) -{ - int b1, b2; - size_t l; - int i; - short *in; - int *out; - int count; - l = length; - if (l > s_rawsamplesbuffer_count) - l = s_rawsamplesbuffer_count; - b1 = (s_rawsamplesbuffer_start) % RAWSAMPLESBUFFER; - if (b1 + l > RAWSAMPLESBUFFER) - { - b2 = (b1 + l) % RAWSAMPLESBUFFER; - //memcpy(samples, s_rawsamplesbuffer + b1 * 2, (RAWSAMPLESBUFFER - b1) * sizeof(short[2])); - //memcpy(samples + (RAWSAMPLESBUFFER - b1) * 2, s_rawsamplesbuffer, b2 * sizeof(short[2])); - for (out = samples, in = s_rawsamplesbuffer + b1 * 2, count = (RAWSAMPLESBUFFER - b1) * 2, i = 0;i < count;i++) - out[i] = in[i]; - for (out = samples + (RAWSAMPLESBUFFER - b1) * 2, in = s_rawsamplesbuffer, count = b2 * 2, i = 0;i < count;i++) - out[i] = in[i]; - //Con_Printf("S_RawSamples_Dequeue: buffer wrap %i %i\n", (RAWSAMPLESBUFFER - b1), b2); - } - else - { - //memcpy(samples, s_rawsamplesbuffer + b1 * 2, l * sizeof(short[2])); - for (out = samples, in = s_rawsamplesbuffer + b1 * 2, count = l * 2, i = 0;i < count;i++) - out[i] = in[i]; - //Con_Printf("S_RawSamples_Dequeue: normal %i\n", l); - } - if (l < (int)length) - { - memset(samples + l * 2, 0, (length - l) * sizeof(int[2])); - //Con_Printf("S_RawSamples_Dequeue: padding with %i samples\n", length - l); - } - s_rawsamplesbuffer_start = (s_rawsamplesbuffer_start + l) % RAWSAMPLESBUFFER; - s_rawsamplesbuffer_count -= l; -} - -void S_RawSamples_ClearQueue(void) -{ - s_rawsamplesbuffer_count = 0; - s_rawsamplesbuffer_start = 0; -} - -int S_RawSamples_QueueWantsMore(void) -{ - if (shm != NULL && s_rawsamplesbuffer_count < min(shm->format.speed >> 1, RAWSAMPLESBUFFER >> 1)) - return RAWSAMPLESBUFFER - s_rawsamplesbuffer_count; - else - return 0; -} - -void S_ResampleBuffer16Stereo(short *input, int inputlength, short *output, int outputlength) -{ - if (inputlength != outputlength) - { - int i, position, stopposition, step; - short *in, *out; - step = (float) inputlength * 256.0f / (float) outputlength; - position = 0; - stopposition = (inputlength - 1) << 8; - out = output; - for (i = 0;i < outputlength && position < stopposition;i++, position += step) - { - in = input + ((position >> 8) << 1); - out[0] = (((in[1] - in[0]) * (position & 255)) >> 8) + in[0]; - out[1] = (((in[3] - in[2]) * (position & 255)) >> 8) + in[2]; - out += 2; - } - stopposition = inputlength << 8; - for (i = 0;i < outputlength && position < stopposition;i++, position += step) - { - in = input + ((position >> 8) << 1); - out[0] = in[0]; - out[1] = in[2]; - out += 2; - } - } - else - memcpy(output, input, inputlength * sizeof(short[2])); -} - -int S_RawSamples_SampleRate(void) -{ - return shm != NULL ? shm->format.speed : 0; -} -