X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=snd_mem.c;h=0eec602f9dbb478ef777ed1370d6b57dc8a48915;hb=f7e37f88d839aaf88b304e2cfc000bf10ca9ed83;hp=a2f4e4797756d3eea63db82abea7b2619da9e8c7;hpb=05508fd28461344ad71d3fb9a25e07be53803a05;p=xonotic%2Fdarkplaces.git diff --git a/snd_mem.c b/snd_mem.c index a2f4e479..0eec602f 100644 --- a/snd_mem.c +++ b/snd_mem.c @@ -31,15 +31,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ResampleSfx ================ */ -size_t ResampleSfx (const qbyte *in_data, size_t in_length, const snd_format_t* in_format, qbyte *out_data, const char* sfxname) +size_t ResampleSfx (const unsigned char *in_data, size_t in_length, const snd_format_t* in_format, unsigned char *out_data, const char* sfxname) { size_t srclength, outcount, i; srclength = in_length * in_format->channels; outcount = (double)in_length * shm->format.speed / in_format->speed; - Con_DPrintf("ResampleSfx(%s): %d samples @ %dHz -> %d samples @ %dHz\n", - sfxname, in_length, in_format->speed, outcount, shm->format.speed); + //Con_DPrintf("ResampleSfx(%s): %d samples @ %dHz -> %d samples @ %dHz\n", + // sfxname, in_length, in_format->speed, outcount, shm->format.speed); // Trivial case (direct transfer) if (in_format->speed == shm->format.speed) @@ -56,21 +56,24 @@ size_t ResampleSfx (const qbyte *in_data, size_t in_length, const snd_format_t* // General case (linear interpolation with a fixed-point fractional // step, 18-bit integer part and 14-bit fractional part) // Can handle up to 2^18 (262144) samples per second (> 96KHz stereo) - #define FRACTIONAL_BITS 14 - #define FRACTIONAL_MASK ((1 << FRACTIONAL_BITS) - 1) - #define INTEGER_BITS (sizeof(samplefrac)*8 - FRACTIONAL_BITS) +# define FRACTIONAL_BITS 14 +# define FRACTIONAL_MASK ((1 << FRACTIONAL_BITS) - 1) +# define INTEGER_BITS (sizeof(samplefrac)*8 - FRACTIONAL_BITS) else { const unsigned int fracstep = (double)in_format->speed / shm->format.speed * (1 << FRACTIONAL_BITS); size_t remain_in = srclength, total_out = 0; unsigned int samplefrac; - const qbyte *in_ptr = in_data; - qbyte *out_ptr = out_data; + const unsigned char *in_ptr = in_data; + unsigned char *out_ptr = out_data; // Check that we can handle one second of that sound if (in_format->speed * in_format->channels > (1 << INTEGER_BITS)) - Sys_Error ("ResampleSfx: sound quality too high for resampling (%uHz, %u channel(s))", + { + Con_Printf ("ResampleSfx: sound quality too high for resampling (%uHz, %u channel(s))\n", in_format->speed, in_format->channels); + return 0; + } // We work 1 sec at a time to make sure we don't accumulate any // significant error when adding "fracstep" over several seconds, and @@ -120,12 +123,12 @@ size_t ResampleSfx (const qbyte *in_data, size_t in_length, const snd_format_t* // No more value to interpolate with? if (srcsample + in_format->channels < remain_in) { - a = ((const qbyte*)in_ptr)[srcsample] - 128; - b = ((const qbyte*)in_ptr)[srcsample + in_format->channels] - 128; + a = ((const unsigned char*)in_ptr)[srcsample] - 128; + b = ((const unsigned char*)in_ptr)[srcsample + in_format->channels] - 128; *((signed char*)out_ptr) = (((b - a) * (samplefrac & FRACTIONAL_MASK)) >> FRACTIONAL_BITS) + a; } else - *((signed char*)out_ptr) = ((const qbyte*)in_ptr)[srcsample] - 128; + *((signed char*)out_ptr) = ((const unsigned char*)in_ptr)[srcsample] - 128; out_ptr += sizeof (signed char); } @@ -153,9 +156,8 @@ S_LoadSound */ qboolean S_LoadSound (sfx_t *s, qboolean complain) { - char namebuffer[MAX_QPATH]; + char namebuffer[MAX_QPATH + 16]; size_t len; - qboolean modified_name = false; if (!shm || !shm->format.speed) return false; @@ -168,51 +170,46 @@ qboolean S_LoadSound (sfx_t *s, qboolean complain) if (s->fetcher != NULL) { if (s->format.speed != shm->format.speed) - Sys_Error ("S_LoadSound: sound %s hasn't been resampled (%uHz instead of %uHz)", s->name); + Con_Printf ("S_LoadSound: sound %s hasn't been resampled (%uHz instead of %uHz)\n", s->name); return true; } - len = strlcpy (namebuffer, s->name, sizeof (namebuffer)); - if (len >= sizeof (namebuffer)) - return false; + // LordHavoc: if the sound filename does not begin with sound/, try adding it + if (strncasecmp(s->name, "sound/", 6)) + { + len = dpsnprintf (namebuffer, sizeof(namebuffer), "sound/%s", s->name); + if (len < 0) + { + // name too long + Con_Printf("S_LoadSound: name \"%s\" is too long\n", s->name); + return false; + } + if (S_LoadWavFile (namebuffer, s)) + return true; + if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".wav")) + strcpy (namebuffer + len - 3, "ogg"); + if (OGG_LoadVorbisFile (namebuffer, s)) + return true; + } - // Try to load it as a WAV file + // LordHavoc: then try without the added sound/ as wav and ogg + len = dpsnprintf (namebuffer, sizeof(namebuffer), "%s", s->name); + if (len < 0) + { + // name too long + Con_Printf("S_LoadSound: name \"%s\" is too long\n", s->name); + return false; + } if (S_LoadWavFile (namebuffer, s)) return true; - - // Else, try to load it as an Ogg Vorbis file - if (!strcasecmp (namebuffer + len - 4, ".wav")) - { + if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".wav")) strcpy (namebuffer + len - 3, "ogg"); - modified_name = true; - } if (OGG_LoadVorbisFile (namebuffer, s)) return true; // Can't load the sound! s->flags |= SFXFLAG_FILEMISSING; if (complain) - { - if (modified_name) - strcpy (namebuffer + len - 3, "wav"); - Con_Printf("Couldn't load %s\n", namebuffer); - } + Con_Printf("S_LoadSound: Couldn't load \"%s\"\n", s->name); return false; } - -void S_UnloadSound (sfx_t *s) -{ - if (s->fetcher != NULL) - { - unsigned int i; - - // Stop all channels that use this sound - for (i = 0; i < total_channels ; i++) - if (channels[i].sfx == s) - S_StopChannel (i); - - s->fetcher = NULL; - s->fetcher_data = NULL; - Mem_FreePool(&s->mempool); - } -}