X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=snd_mem.c;h=07c32eb1865d4c1f780dd89e2e73cea311e64455;hp=f61a5a98cf5c16e5ce578033708bb1bba9e69032;hb=69409e01d114e379ef09df6aaab9fac15da27d94;hpb=137e29f228f1309a5cfb2c709a362ec159efd581 diff --git a/snd_mem.c b/snd_mem.c index f61a5a98..07c32eb1 100644 --- a/snd_mem.c +++ b/snd_mem.c @@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" +#include "snd_main.h" #include "snd_ogg.h" #include "snd_wav.h" @@ -37,8 +38,8 @@ size_t ResampleSfx (const qbyte *in_data, size_t in_length, const snd_format_t* srclength = in_length * in_format->channels; outcount = (double)in_length * shm->format.speed / in_format->speed; - Con_DPrintf("ResampleSfx: resampling sound \"%s\" from %dHz to %dHz (%d samples to %d samples)\n", - sfxname, in_format->speed, shm->format.speed, in_length, outcount); + //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) @@ -152,13 +153,17 @@ 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; - // see if still in memory if (!shm || !shm->format.speed) return false; + + // If we weren't able to load it previously, no need to retry + if (s->flags & SFXFLAG_FILEMISSING) + return false; + + // See if in memory if (s->fetcher != NULL) { if (s->format.speed != shm->format.speed) @@ -166,51 +171,59 @@ qboolean S_LoadSound (sfx_t *s, qboolean complain) 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! - if (!complain) - s->flags |= SFXFLAG_SILENTLYMISSING; - else - s->flags &= ~SFXFLAG_SILENTLYMISSING; + 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) +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); - - // At this point, some per-channel data pointers may point to freed zones. - // Practically, it shouldn't be a problem; but it's wrong, so we fix that - for (i = 0; i < total_channels ; i++) - if (channels[i].sfx == s) - channels[i].fetcher_data = NULL; } }