X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=snd_mem.c;h=09758a63057b1887860157b2b2315218433e95d1;hb=16263e2e1a731b84058ef8e7239a33d943b3fd6e;hp=ca7fb36b03fa627349d4ccfabf2a252a7477c08e;hpb=bfe723bb408d3191a0b3270b8ce67468cb483d2f;p=xonotic%2Fdarkplaces.git diff --git a/snd_mem.c b/snd_mem.c index ca7fb36b..09758a63 100644 --- a/snd_mem.c +++ b/snd_mem.c @@ -30,10 +30,10 @@ byte *S_Alloc (int size); ResampleSfx ================ */ -void ResampleSfx (sfx_t *sfx, int inrate, int inwidth, byte *data) +void ResampleSfx (sfx_t *sfx, int inrate, byte *data, char *name) { int outcount; - int srcsample; + int srcsample, srclength; float stepscale; int i; int samplefrac, fracstep; @@ -45,23 +45,26 @@ void ResampleSfx (sfx_t *sfx, int inrate, int inwidth, byte *data) 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; @@ -75,18 +78,18 @@ void ResampleSfx (sfx_t *sfx, int inrate, int inwidth, byte *data) ((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 ; idata)[i] = (int)( (unsigned char)(data[i]) - 128); - } */ + if (sc->stereo) // LordHavoc: stereo sound support + outcount *= 2; + for (i=0 ; idata)[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 ; idata)[i] = LittleShort (((short *)data)[i]); } else { @@ -94,53 +97,150 @@ void ResampleSfx (sfx_t *sfx, int inrate, int inwidth, byte *data) 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 { + srcsample = 0; + fracstep >>= 8; if (sc->width == 2) { - for (i=0 ; idata, *in = (void *)data; + if (sc->stereo) // LordHavoc: stereo sound support + { + fracstep <<= 1; + for (i=0 ; i> 8; - samplefrac += fracstep; - srcsample <<= 1; - ((short *)sc->data)[i++] = LittleShort ( ((short *)data)[srcsample++] ); // left - ((short *)sc->data)[i++] = LittleShort ( ((short *)data)[srcsample ] ); // right + for (i=0 ; idata; + unsigned char *in = (void *)data; + if (sc->stereo) // LordHavoc: stereo sound support { - srcsample = samplefrac >> 8; - samplefrac += fracstep; - srcsample <<= 1; - ((signed char *)sc->data)[i++] = ((int)( (unsigned char)(data[srcsample++]) - 128) << 8) >> 8; // left - ((signed char *)sc->data)[i++] = ((int)( (unsigned char)(data[srcsample ]) - 128) << 8) >> 8; // right + fracstep <<= 1; + for (i=0 ; iwidth == 2) { - for (i=0 ; idata, *in = (void *)data; + if (sc->stereo) // LordHavoc: stereo sound support { - srcsample = samplefrac >> 8; - samplefrac += fracstep; - ((short *)sc->data)[i] = LittleShort ( ((short *)data)[srcsample] ); + for (i=0 ; i> 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 + { + for (i=0 ; i> 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 { - for (i=0 ; idata; + unsigned char *in = (void *)data; + if (sc->stereo) // LordHavoc: stereo sound support + { + for (i=0 ; i> 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 { - srcsample = samplefrac >> 8; - samplefrac += fracstep; - ((signed char *)sc->data)[i] = ((int)( (unsigned char)(data[srcsample]) - 128) << 8) >> 8; + for (i=0 ; i> 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 } //============================================================================= @@ -158,7 +258,6 @@ sfxcache_t *S_LoadSound (sfx_t *s) 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); @@ -172,7 +271,7 @@ sfxcache_t *S_LoadSound (sfx_t *s) // Con_Printf ("loading %s\n",namebuffer); - data = COM_LoadStackFile(namebuffer, stackbuf, sizeof(stackbuf), false); + data = COM_LoadMallocFile(namebuffer, false); if (!data) { @@ -185,6 +284,7 @@ sfxcache_t *S_LoadSound (sfx_t *s) if (info.channels < 1 || info.channels > 2) { Con_Printf ("%s has an unsupported number of channels (%i)\n",s->name, info.channels); + qfree(data); return NULL; } /* @@ -202,7 +302,10 @@ sfxcache_t *S_LoadSound (sfx_t *s) sc = Cache_Alloc ( &s->cache, len + sizeof(sfxcache_t), s->name); if (!sc) + { + qfree(data); return NULL; + } sc->length = info.samples; sc->loopstart = info.loopstart; @@ -210,8 +313,9 @@ sfxcache_t *S_LoadSound (sfx_t *s) 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); + qfree(data); return sc; }