- 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!
- if (!complain)
- s->flags |= SFXFLAG_SILENTLYMISSING;
- else
- s->flags &= ~SFXFLAG_SILENTLYMISSING;
- 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
-
-===============================================================================
-*/
-
-
-static qbyte *data_p;
-static qbyte *iff_end;
-static qbyte *last_chunk;
-static qbyte *iff_data;
-static int iff_chunk_len;
-
-
-short GetLittleShort(void)
-{
- short val;
-
- val = BuffLittleShort (data_p);
- data_p += 2;
-
- return val;
-}
-
-int GetLittleLong(void)
-{
- int val = 0;
-
- val = BuffLittleLong (data_p);
- 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);
-}