X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=snd_dma.c;h=6587918d63916921cb5350d61106f65d5c7e6d8c;hb=f56aef181ec4c8cb4f149d9fdecf595aff586187;hp=836227e00e07ad1c03cbbe6f0b9c75f47858ffbe;hpb=edfcde7fdd922dfdd65d5eaa93e1ec9cca33bab0;p=xonotic%2Fdarkplaces.git diff --git a/snd_dma.c b/snd_dma.c index 836227e0..6587918d 100644 --- a/snd_dma.c +++ b/snd_dma.c @@ -170,7 +170,7 @@ void S_Init (void) Cvar_RegisterVariable(&volume); Cvar_RegisterVariable(&bgmvolume); - if (COM_CheckParm("-nosound")) + if (COM_CheckParm("-nosound") || COM_CheckParm("-safe")) return; snd_mempool = Mem_AllocPool("sound"); @@ -302,7 +302,7 @@ S_TouchSound void S_TouchSound (char *name) { sfx_t *sfx; - + if (!sound_started) return; @@ -866,7 +866,7 @@ void S_Update_(void) // mix ahead of current position endtime = soundtime + _snd_mixahead.value * shm->speed; samps = shm->samples >> (shm->channels-1); - if (endtime - soundtime > samps) + if (endtime > (unsigned int)(soundtime + samps)) endtime = soundtime + samps; #ifdef _WIN32 @@ -1043,9 +1043,9 @@ void S_RawSamples_Enqueue(short *samples, unsigned int length) if (s_rawsamplesbuffer_count + length > RAWSAMPLESBUFFER) return; b2 = (s_rawsamplesbuffer_start + s_rawsamplesbuffer_count) % RAWSAMPLESBUFFER; - b3 = (s_rawsamplesbuffer_start + s_rawsamplesbuffer_count + length) % RAWSAMPLESBUFFER; - if (b3 < b2) + 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])); } @@ -1065,9 +1065,9 @@ void S_RawSamples_Dequeue(int *samples, unsigned int length) if (l > s_rawsamplesbuffer_count) l = s_rawsamplesbuffer_count; b1 = (s_rawsamplesbuffer_start) % RAWSAMPLESBUFFER; - b2 = (s_rawsamplesbuffer_start + l) % RAWSAMPLESBUFFER; - if (b2 < b1) + 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++) @@ -1083,10 +1083,10 @@ void S_RawSamples_Dequeue(int *samples, unsigned int length) out[i] = in[i]; //Con_Printf("S_RawSamples_Dequeue: normal %i\n", l); } - if (l < length) + if (l < (int)length) { memset(samples + l * 2, 0, (length - l) * sizeof(int[2])); - //Con_Printf("S_RawSamples_Dequeue: padding with %i\n", length - l); + //Con_Printf("S_RawSamples_Dequeue: padding with %i samples\n", length - l); } s_rawsamplesbuffer_start = (s_rawsamplesbuffer_start + l) % RAWSAMPLESBUFFER; s_rawsamplesbuffer_count -= l; @@ -1098,3 +1098,45 @@ void S_RawSamples_ClearQueue(void) s_rawsamplesbuffer_start = 0; } +int S_RawSamples_QueueWantsMore(void) +{ + if (s_rawsamplesbuffer_count < min(shm->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->speed : 0; +}