#include "snd_main.h"
#include "snd_ogg.h"
#include "snd_wav.h"
+#include "snd_modplug.h"
+
+unsigned char resampling_buffer [48000 * 2 * 2];
/*
maxframes = sampleframes;
memsize = maxframes * format->width * format->channels;
- ringbuffer->ring = Mem_Alloc(snd_mempool, memsize);
+ ringbuffer->ring = (unsigned char *) Mem_Alloc(snd_mempool, memsize);
ringbuffer->maxframes = maxframes;
}
else
{
- ringbuffer->ring = buffer;
+ ringbuffer->ring = (unsigned char *) buffer;
ringbuffer->maxframes = sampleframes;
}
{
size_t newsampleframes, memsize;
snd_buffer_t* sb;
-
- newsampleframes = (double)sampleframes * (double)sb_speed / (double)in_format->speed;
+
+ newsampleframes = (size_t) ((double)sampleframes * (double)sb_speed / (double)in_format->speed);
memsize = newsampleframes * in_format->channels * in_format->width;
memsize += sizeof (*sb) - sizeof (sb->samples);
return false;
}
- outcount = (double)sampleframes * (double)sb->format.speed / (double)format->speed;
+ outcount = (size_t) ((double)sampleframes * (double)sb->format.speed / (double)format->speed);
// If the sound buffer is too short
if (outcount > sb->maxframes - sb->nbframes)
return true;
// If we weren't able to load it previously, no need to retry
+ // Note: S_PrecacheSound clears this flag to cause a retry
if (sfx->flags & SFXFLAG_FILEMISSING)
return false;
if (snd_renderbuffer == NULL)
return false;
+ // Initialize volume peak to 0; if ReplayGain is supported, the loader will change this away
+ sfx->volume_peak = 0.0;
+
+ if (developer_loading.integer)
+ Con_Printf("loading sound %s\n", sfx->name);
+
+ SCR_PushLoadingScreen(true, sfx->name, 1);
+
// LordHavoc: if the sound filename does not begin with sound/, try adding it
if (strncasecmp(sfx->name, "sound/", 6))
{
- len = dpsnprintf (namebuffer, sizeof(namebuffer), "sound/%s", sfx->name);
- if (len < 0)
+ dpsnprintf (namebuffer, sizeof(namebuffer), "sound/%s", sfx->name);
+ len = strlen(namebuffer);
+ if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".wav"))
{
- // name too long
- Con_Printf("S_LoadSound: name \"%s\" is too long\n", sfx->name);
- return false;
+ if (S_LoadWavFile (namebuffer, sfx))
+ goto loaded;
+ memcpy (namebuffer + len - 3, "ogg", 4);
+ }
+ if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".ogg"))
+ {
+ if (OGG_LoadVorbisFile (namebuffer, sfx))
+ goto loaded;
+ }
+ else
+ {
+ if (ModPlug_LoadModPlugFile (namebuffer, sfx))
+ goto loaded;
}
- if (S_LoadWavFile (namebuffer, sfx))
- return true;
- if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".wav"))
- strcpy (namebuffer + len - 3, "ogg");
- if (OGG_LoadVorbisFile (namebuffer, sfx))
- return true;
}
// LordHavoc: then try without the added sound/ as wav and ogg
- len = dpsnprintf (namebuffer, sizeof(namebuffer), "%s", sfx->name);
- if (len < 0)
+ dpsnprintf (namebuffer, sizeof(namebuffer), "%s", sfx->name);
+ len = strlen(namebuffer);
+ // request foo.wav: tries foo.wav, then foo.ogg
+ // request foo.ogg: tries foo.ogg only
+ // request foo.mod: tries foo.mod only
+ if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".wav"))
{
- // name too long
- Con_Printf("S_LoadSound: name \"%s\" is too long\n", sfx->name);
- return false;
+ if (S_LoadWavFile (namebuffer, sfx))
+ goto loaded;
+ memcpy (namebuffer + len - 3, "ogg", 4);
+ }
+ if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".ogg"))
+ {
+ if (OGG_LoadVorbisFile (namebuffer, sfx))
+ goto loaded;
+ }
+ else
+ {
+ if (ModPlug_LoadModPlugFile (namebuffer, sfx))
+ goto loaded;
}
- if (S_LoadWavFile (namebuffer, sfx))
- return true;
- if (len >= 4 && !strcasecmp (namebuffer + len - 4, ".wav"))
- strcpy (namebuffer + len - 3, "ogg");
- if (OGG_LoadVorbisFile (namebuffer, sfx))
- return true;
// Can't load the sound!
sfx->flags |= SFXFLAG_FILEMISSING;
if (complain)
- Con_Printf("S_LoadSound: Couldn't load \"%s\"\n", sfx->name);
+ Con_DPrintf("failed to load sound \"%s\"\n", sfx->name);
+
+ SCR_PopLoadingScreen(false);
return false;
+
+loaded:
+ SCR_PopLoadingScreen(false);
+ return true;
}