- sfxcache_t *sc;
- qboolean modified_name = false;
-
- // see if still in memory
- if (!shm || !shm->speed)
- return NULL;
- if (s->sfxcache && (s->sfxcache->speed == shm->speed))
- return s->sfxcache;
-
- len = snprintf (namebuffer, sizeof (namebuffer), "sound/%s", s->name);
- if (len >= sizeof (namebuffer))
- return NULL;
-
- // Try to load it as a WAV file
- sc = S_LoadWavFile (namebuffer, s);
- if (sc != NULL)
- return sc;
-
- // Else, try to load it as an Ogg Vorbis file
- if (!strcasecmp (namebuffer + len - 4, ".wav"))
- {
- strcpy (namebuffer + len - 3, "ogg");
- modified_name = true;
- }
- sc = OGG_LoadVorbisFile (namebuffer, s);
- if (sc != NULL)
- return sc;
-
- // Can't load the sound!
- s->silentlymissing = !complain;
- if (complain)
- {
- if (modified_name)
- strcpy (namebuffer + len - 3, "wav");
- Con_Printf ("Couldn't load %s\n", namebuffer);
- }
- return NULL;
-}
-
-void S_UnloadSound(sfx_t *s)
-{
- if (s->sfxcache)
- {
- s->sfxcache = NULL;
- Mem_FreePool(&s->mempool);
- }
-}
-
-
-/*
-===============================================================================
-
-WAV loading
-
-===============================================================================
-*/
-
-
-qbyte *data_p;
-qbyte *iff_end;
-qbyte *last_chunk;
-qbyte *iff_data;
-int iff_chunk_len;
-
-
-short GetLittleShort(void)
-{
- short val = 0;
- val = *data_p;
- val = val + (*(data_p+1)<<8);
- data_p += 2;
- return val;
-}
-
-int GetLittleLong(void)
-{
- int val = 0;
- val = *data_p;
- val = val + (*(data_p+1)<<8);
- val = val + (*(data_p+2)<<16);
- val = val + (*(data_p+3)<<24);
- data_p += 4;
- return val;
-}
-
-void FindNextChunk(char *name)
-{
- while (1)
- {
- data_p=last_chunk;
-
- if (data_p >= iff_end)
- { // didn't find the chunk
- data_p = NULL;
- return;
- }
-
- data_p += 4;
- iff_chunk_len = GetLittleLong();
- if (iff_chunk_len < 0)
- {
- data_p = NULL;
- return;
- }
- data_p -= 8;
- last_chunk = data_p + 8 + ( (iff_chunk_len + 1) & ~1 );
- if (!strncmp(data_p, name, 4))
- return;
- }
-}
-
-void FindChunk(char *name)
-{
- last_chunk = iff_data;
- FindNextChunk (name);
-}
-
-
-void DumpChunks(void)
-{
- char str[5];
-
- str[4] = 0;
- data_p=iff_data;
- do
- {
- memcpy (str, data_p, 4);
- data_p += 4;
- iff_chunk_len = GetLittleLong();
- Con_Printf ("0x%x : %s (%d)\n", (int)(data_p - 4), str, iff_chunk_len);
- data_p += (iff_chunk_len + 1) & ~1;
- } while (data_p < iff_end);
-}
-
-/*
-============
-GetWavinfo
-============
-*/
-wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength)
-{
- wavinfo_t info;
- int i;
- int format;
- int samples;
-
- memset (&info, 0, sizeof(info));
-
- if (!wav)
- return info;
-
- iff_data = wav;
- iff_end = wav + wavlength;