X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=snd_mem.c;h=09758a63057b1887860157b2b2315218433e95d1;hb=4ac01d420419a4a5f61a0cabd592b6bb0855d222;hp=278d2eb4f78b79e097fb58e76b73fa21d908dd08;hpb=c4bf2d61a57ede112eccf87553ba694a995df6ec;p=xonotic%2Fdarkplaces.git diff --git a/snd_mem.c b/snd_mem.c index 278d2eb4..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, 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,6 +45,8 @@ void ResampleSfx (sfx_t *sfx, int inrate, 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) @@ -62,6 +64,7 @@ void ResampleSfx (sfx_t *sfx, int inrate, byte *data) 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,27 +78,18 @@ void ResampleSfx (sfx_t *sfx, int inrate, 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 - for (i=0 ; idata)[i] = LittleShort (((short *)data)[i]); - else - for (i=0 ; idata)[i] = LittleShort (((short *)data)[i]); + outcount *= 2; + for (i=0 ; idata)[i] = LittleShort (((short *)data)[i]); } else { @@ -113,10 +107,10 @@ void ResampleSfx (sfx_t *sfx, int inrate, byte *data) if (sc->stereo) // LordHavoc: stereo sound support { fracstep <<= 1; - for (i=0 ; idata, *in = (void *)data; + signed char *out = (void *)sc->data; + unsigned char *in = (void *)data; if (sc->stereo) // LordHavoc: stereo sound support { fracstep <<= 1; - for (i=0 ; iwidth == 2) { short *out = (void *)sc->data, *in = (void *)data; if (sc->stereo) // LordHavoc: stereo sound support { - for (i=0 ; i> 7) & ~1; - samplefrac += fracstep; - sample = (LittleShort (in[srcsample ]) * (256 - (samplefrac & 255)) + LittleShort (in[srcsample+2]) * (samplefrac & 255)) >> 8; + 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; - sample = (LittleShort (in[srcsample+1]) * (256 - (samplefrac & 255)) + LittleShort (in[srcsample+3]) * (samplefrac & 255)) >> 8; + 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 @@ -175,25 +181,41 @@ void ResampleSfx (sfx_t *sfx, int inrate, byte *data) for (i=0 ; i> 8; - samplefrac += fracstep; - sample = (LittleShort (in[srcsample ]) * (256 - (samplefrac & 255)) + LittleShort (in[srcsample+1]) * (samplefrac & 255)) >> 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, *in = (void *)data; + signed char *out = (void *)sc->data; + unsigned char *in = (void *)data; if (sc->stereo) // LordHavoc: stereo sound support { - for (i=0 ; i> 7) & ~1; - samplefrac += fracstep; - sample = ((((unsigned char) in[srcsample ] - 128) * (256 - (samplefrac & 255))) + (((unsigned char) in[srcsample+2] - 128) * (samplefrac & 255))) >> 8; + 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; - sample = ((((unsigned char) in[srcsample+1] - 128) * (256 - (samplefrac & 255))) + (((unsigned char) in[srcsample+3] - 128) * (samplefrac & 255))) >> 8; + 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 @@ -201,14 +223,24 @@ void ResampleSfx (sfx_t *sfx, int inrate, byte *data) for (i=0 ; i> 8; - samplefrac += fracstep; - sample = ((((unsigned char) in[srcsample ] - 128) * (256 - (samplefrac & 255))) + (((unsigned char) in[srcsample+1] - 128) * (samplefrac & 255))) >> 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 } //============================================================================= @@ -226,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); @@ -240,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) { @@ -253,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; } /* @@ -270,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; @@ -278,8 +313,9 @@ sfxcache_t *S_LoadSound (sfx_t *s) sc->width = info.width; sc->stereo = info.channels == 2; - ResampleSfx (s, sc->speed, data + info.dataofs); + ResampleSfx (s, sc->speed, data + info.dataofs, s->name); + qfree(data); return sc; }