#include "quakedef.h"
-int cache_full_cycle;
-
-byte *S_Alloc (int size);
+qbyte *S_Alloc (int size);
/*
================
ResampleSfx
================
*/
-void ResampleSfx (sfx_t *sfx, int inrate, int inwidth, byte *data)
+void ResampleSfx (sfx_t *sfx, int inrate, qbyte *data, char *name)
{
int outcount;
- int srcsample;
+ int srcsample, srclength;
float stepscale;
int i;
- int sample, samplefrac, fracstep;
+ int samplefrac, fracstep;
sfxcache_t *sc;
- sc = Cache_Check (&sfx->cache);
+ sc = sfx->sfxcache;
if (!sc)
return;
stepscale = (float)inrate / shm->speed; // this is usually 0.5, 1, or 2
+ srclength = sc->length << sc->stereo;
+
outcount = sc->length / stepscale;
sc->length = outcount;
if (sc->loopstart != -1)
sc->loopstart = sc->loopstart / stepscale;
sc->speed = shm->speed;
- if (loadas8bit.value)
- sc->width = 1;
- else
- sc->width = inwidth;
+// if (loadas8bit.value)
+// sc->width = 1;
+// else
+// sc->width = inwidth;
// sc->stereo = 0;
// resample / decimate to the current source rate
- if (stepscale == 1 && inwidth == 1 && sc->width == 1)
+ if (stepscale == 1/* && inwidth == 1*/ && sc->width == 1)
{
// fast special case
+ /*
// LordHavoc: I do not serve the readability gods...
int *indata, *outdata;
int count4, count1;
((short*)outdata)[0] = ((short*)indata)[0] ^ 0x8080;
if (count1 & 1)
((char*)outdata)[2] = ((char*)indata)[2] ^ 0x80;
- /*
- if (sc->stereo) // LordHavoc: stereo sound support
- {
- for (i=0 ; i<(outcount<<1) ; i++)
- ((signed char *)sc->data)[i] = (int)( (unsigned char)(data[i]) - 128);
- }
- else
- {
- for (i=0 ; i<outcount ; i++)
- ((signed char *)sc->data)[i] = (int)( (unsigned char)(data[i]) - 128);
- }
*/
+ if (sc->stereo) // LordHavoc: stereo sound support
+ outcount *= 2;
+ for (i=0 ; i<outcount ; i++)
+ ((signed char *)sc->data)[i] = ((unsigned char *)data)[i] - 128;
+ }
+ else if (stepscale == 1/* && inwidth == 2*/ && sc->width == 2) // LordHavoc: quick case for 16bit
+ {
+ if (sc->stereo) // LordHavoc: stereo sound support
+ outcount *= 2;
+ for (i=0 ; i<outcount ;i++)
+ ((short *)sc->data)[i] = LittleShort (((short *)data)[i]);
}
else
{
Con_DPrintf("ResampleSfx: resampling sound %s\n", sfx->name);
samplefrac = 0;
fracstep = stepscale*256;
- if (sc->stereo) // LordHavoc: stereo sound support
+ if ((fracstep & 255) == 0) // skipping points on perfect multiple
{
- for (i=0 ; i<outcount ; i+=2)
+ srcsample = 0;
+ fracstep >>= 8;
+ if (sc->width == 2)
{
- srcsample = samplefrac >> 8;
- samplefrac += fracstep;
- srcsample <<= 1;
- // left
- if (inwidth == 2)
- sample = LittleShort ( ((short *)data)[srcsample] );
- else
- sample = (int)( (unsigned char)(data[srcsample]) - 128) << 8;
- if (sc->width == 2)
- ((short *)sc->data)[i] = sample;
- else
- ((signed char *)sc->data)[i] = sample >> 8;
- // right
- srcsample++;
- if (inwidth == 2)
- sample = LittleShort ( ((short *)data)[srcsample] );
+ short *out = (void *)sc->data, *in = (void *)data;
+ if (sc->stereo) // LordHavoc: stereo sound support
+ {
+ fracstep <<= 1;
+ for (i=0 ; i<outcount ; i++)
+ {
+ *out++ = LittleShort (in[srcsample ]);
+ *out++ = LittleShort (in[srcsample+1]);
+ srcsample += fracstep;
+ }
+ }
else
- sample = (int)( (unsigned char)(data[srcsample]) - 128) << 8;
- if (sc->width == 2)
- ((short *)sc->data)[i+1] = sample;
+ {
+ for (i=0 ; i<outcount ; i++)
+ {
+ *out++ = LittleShort (in[srcsample ]);
+ srcsample += fracstep;
+ }
+ }
+ }
+ else
+ {
+ signed char *out = (void *)sc->data;
+ unsigned char *in = (void *)data;
+ if (sc->stereo) // LordHavoc: stereo sound support
+ {
+ fracstep <<= 1;
+ for (i=0 ; i<outcount ; i++)
+ {
+ *out++ = in[srcsample ] - 128;
+ *out++ = in[srcsample+1] - 128;
+ srcsample += fracstep;
+ }
+ }
else
- ((signed char *)sc->data)[i+1] = sample >> 8;
+ {
+ for (i=0 ; i<outcount ; i++)
+ {
+ *out++ = in[srcsample ] - 128;
+ srcsample += fracstep;
+ }
+ }
}
}
else
{
- for (i=0 ; i<outcount ; i++)
+ int sample;
+ int a, b;
+ if (sc->width == 2)
{
- srcsample = samplefrac >> 8;
- samplefrac += fracstep;
- if (inwidth == 2)
- sample = LittleShort ( ((short *)data)[srcsample] );
+ short *out = (void *)sc->data, *in = (void *)data;
+ if (sc->stereo) // LordHavoc: stereo sound support
+ {
+ for (i=0 ; i<outcount ; i++)
+ {
+ srcsample = (samplefrac >> 8) << 1;
+ a = in[srcsample ];
+ if (srcsample+2 >= srclength)
+ b = 0;
+ else
+ b = in[srcsample+2];
+ sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
+ *out++ = (short) sample;
+ a = in[srcsample+1];
+ if (srcsample+2 >= srclength)
+ b = 0;
+ else
+ b = in[srcsample+3];
+ sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
+ *out++ = (short) sample;
+ samplefrac += fracstep;
+ }
+ }
else
- sample = (int)( (unsigned char)(data[srcsample]) - 128) << 8;
- if (sc->width == 2)
- ((short *)sc->data)[i] = sample;
+ {
+ for (i=0 ; i<outcount ; i++)
+ {
+ srcsample = samplefrac >> 8;
+ a = in[srcsample ];
+ if (srcsample+1 >= srclength)
+ b = 0;
+ else
+ b = in[srcsample+1];
+ sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
+ *out++ = (short) sample;
+ samplefrac += fracstep;
+ }
+ }
+ }
+ else
+ {
+ signed char *out = (void *)sc->data;
+ unsigned char *in = (void *)data;
+ if (sc->stereo) // LordHavoc: stereo sound support
+ {
+ for (i=0 ; i<outcount ; i++)
+ {
+ srcsample = (samplefrac >> 8) << 1;
+ a = (int) in[srcsample ] - 128;
+ if (srcsample+2 >= srclength)
+ b = 0;
+ else
+ b = (int) in[srcsample+2] - 128;
+ sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
+ *out++ = (signed char) sample;
+ a = (int) in[srcsample+1] - 128;
+ if (srcsample+2 >= srclength)
+ b = 0;
+ else
+ b = (int) in[srcsample+3] - 128;
+ sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
+ *out++ = (signed char) sample;
+ samplefrac += fracstep;
+ }
+ }
else
- ((signed char *)sc->data)[i] = sample >> 8;
+ {
+ for (i=0 ; i<outcount ; i++)
+ {
+ srcsample = samplefrac >> 8;
+ a = (int) in[srcsample ] - 128;
+ if (srcsample+1 >= srclength)
+ b = 0;
+ else
+ b = (int) in[srcsample+1] - 128;
+ sample = (((b - a) * (samplefrac & 255)) >> 8) + a;
+ *out++ = (signed char) sample;
+ samplefrac += fracstep;
+ }
+ }
}
}
}
+
+ // LordHavoc: use this for testing if it ever becomes useful again
+#if 0
+ COM_WriteFile (va("sound/%s.pcm", name), sc->data, (sc->length << sc->stereo) * sc->width);
+#endif
}
//=============================================================================
sfxcache_t *S_LoadSound (sfx_t *s)
{
char namebuffer[256];
- byte *data;
+ qbyte *data;
wavinfo_t info;
int len;
float stepscale;
sfxcache_t *sc;
- byte stackbuf[1*1024]; // avoid dirtying the cache heap
// see if still in memory
- sc = Cache_Check (&s->cache);
- if (sc)
- return sc;
+ if (s->sfxcache)
+ return s->sfxcache;
//Con_Printf ("S_LoadSound: %x\n", (int)stackbuf);
// load it in
// Con_Printf ("loading %s\n",namebuffer);
- data = COM_LoadStackFile(namebuffer, stackbuf, sizeof(stackbuf), false);
+ data = COM_LoadFile(namebuffer, false);
if (!data)
{
if (info.channels < 1 || info.channels > 2)
{
Con_Printf ("%s has an unsupported number of channels (%i)\n",s->name, info.channels);
+ Mem_Free(data);
return NULL;
}
/*
}
*/
- stepscale = (float)info.rate / shm->speed;
+ stepscale = (float)info.rate / shm->speed;
len = info.samples / stepscale;
len = len * info.width * info.channels;
- sc = Cache_Alloc ( &s->cache, len + sizeof(sfxcache_t), s->name);
+ // FIXME: add S_UnloadSounds or something?
+ Mem_FreePool(&s->mempool);
+ s->mempool = Mem_AllocPool(s->name);
+ sc = s->sfxcache = Mem_Alloc(s->mempool, len + sizeof(sfxcache_t));
if (!sc)
+ {
+ Mem_Free(data);
return NULL;
-
+ }
+
sc->length = info.samples;
sc->loopstart = info.loopstart;
sc->speed = info.rate;
sc->width = info.width;
sc->stereo = info.channels == 2;
- ResampleSfx (s, sc->speed, sc->width, data + info.dataofs);
+ ResampleSfx (s, sc->speed, data + info.dataofs, s->name);
+ Mem_Free(data);
return sc;
}
*/
-byte *data_p;
-byte *iff_end;
-byte *last_chunk;
-byte *iff_data;
+qbyte *data_p;
+qbyte *iff_end;
+qbyte *last_chunk;
+qbyte *iff_data;
int iff_chunk_len;
GetWavinfo
============
*/
-wavinfo_t GetWavinfo (char *name, byte *wav, int wavlength)
+wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength)
{
wavinfo_t info;
int i;