#include "quakedef.h"
+#include "snd_main.h"
#include "snd_ogg.h"
#include "snd_wav.h"
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)
*/
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)
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;
}
}