]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_wav.c
made darkplaces compile successfully with g++ to test for errors C doesn't care about...
[xonotic/darkplaces.git] / snd_wav.c
index 3904df5022af1ad52edd48f54d9ea7cfed07afa1..a972ef41ff295375d3b94a7f6be5599f8d2f5dbf 100644 (file)
--- a/snd_wav.c
+++ b/snd_wav.c
@@ -86,7 +86,7 @@ static void FindNextChunk(char *name)
                }
                data_p -= 8;
                last_chunk = data_p + 8 + ( (iff_chunk_len + 1) & ~1 );
-               if (!strncmp(data_p, name, 4))
+               if (!strncmp((const char *)data_p, name, 4))
                        return;
        }
 }
@@ -139,7 +139,7 @@ static wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength)
 
        // find "RIFF" chunk
        FindChunk("RIFF");
-       if (!(data_p && !strncmp(data_p+8, "WAVE", 4)))
+       if (!(data_p && !strncmp((const char *)data_p+8, "WAVE", 4)))
        {
                Con_Print("Missing RIFF/WAVE chunks\n");
                return info;
@@ -179,7 +179,7 @@ static wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength)
                FindNextChunk ("LIST");
                if (data_p)
                {
-                       if (!strncmp (data_p + 28, "mark", 4))
+                       if (!strncmp ((const char *)data_p + 28, "mark", 4))
                        {       // this is not a proper parse, but it works with cooledit...
                                data_p += 24;
                                i = GetLittleLong ();   // samples in loop
@@ -204,7 +204,10 @@ static wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength)
        if (info.samples)
        {
                if (samples < info.samples)
-                       Host_Error ("Sound %s has a bad loop length", name);
+               {
+                       Con_Printf ("Sound %s has a bad loop length", name);
+                       info.samples = samples;
+               }
        }
        else
                info.samples = samples;
@@ -222,11 +225,27 @@ WAV_FetchSound
 */
 static const sfxbuffer_t* WAV_FetchSound (channel_t* ch, unsigned int start, unsigned int nbsamples)
 {
-       return ch->sfx->fetcher_data;
+       return (sfxbuffer_t *)ch->sfx->fetcher_data;
 }
 
+/*
+====================
+WAV_FreeSfx
+====================
+*/
+static void WAV_FreeSfx (sfx_t* sfx)
+{
+       sfxbuffer_t* sb = (sfxbuffer_t *)sfx->fetcher_data;
+
+       // Free the sound buffer
+       sfx->memsize -= (sb->length * sfx->format.channels * sfx->format.width) + sizeof (*sb) - sizeof (sb->data);
+       Mem_Free(sb);
+
+       sfx->fetcher_data = NULL;
+       sfx->fetcher = NULL;
+}
 
-snd_fetcher_t wav_fetcher = { WAV_FetchSound, NULL };
+const snd_fetcher_t wav_fetcher = { WAV_FetchSound, NULL, WAV_FreeSfx };
 
 
 /*
@@ -239,48 +258,51 @@ qboolean S_LoadWavFile (const char *filename, sfx_t *s)
        qbyte *data;
        wavinfo_t info;
        int len;
+       size_t memsize;
        sfxbuffer_t* sb;
 
-       Mem_FreePool (&s->mempool);
-       s->mempool = Mem_AllocPool(s->name, 0, NULL);
+       // Already loaded?
+       if (s->fetcher != NULL)
+               return true;
 
        // Load the file
-       data = FS_LoadFile(filename, s->mempool, false);
+       data = FS_LoadFile(filename, snd_mempool, false);
        if (!data)
-       {
-               Mem_FreePool (&s->mempool);
                return false;
-       }
 
        // Don't try to load it if it's not a WAV file
        if (memcmp (data, "RIFF", 4) || memcmp (data + 8, "WAVE", 4))
        {
-               Mem_FreePool (&s->mempool);
+               Mem_Free(data);
                return false;
        }
 
        Con_DPrintf ("Loading WAV file \"%s\"\n", filename);
 
-       info = GetWavinfo (s->name, data, fs_filesize);
+       info = GetWavinfo (s->name, data, (int)fs_filesize);
        // Stereo sounds are allowed (intended for music)
        if (info.channels < 1 || info.channels > 2)
        {
                Con_Printf("%s has an unsupported number of channels (%i)\n",s->name, info.channels);
-               Mem_FreePool (&s->mempool);
+               Mem_Free(data);
                return false;
        }
+       //if (info.channels == 2)
+       //      Log_Printf("stereosounds.log", "%s\n", s->name);
 
        // calculate resampled length
        len = (int) ((double) info.samples * (double) shm->format.speed / (double) info.rate);
        len = len * info.width * info.channels;
 
-       sb = Mem_Alloc (s->mempool, len + sizeof (*sb) - sizeof (sb->data));
+       memsize = len + sizeof (*sb) - sizeof (sb->data);
+       sb = (sfxbuffer_t *)Mem_Alloc (snd_mempool, memsize);
        if (sb == NULL)
        {
                Con_Printf("failed to allocate memory for sound \"%s\"\n", s->name);
-               Mem_FreePool(&s->mempool);
+               Mem_Free(data);
                return false;
        }
+       s->memsize += memsize;
 
        s->fetcher = &wav_fetcher;
        s->fetcher_data = sb;
@@ -308,7 +330,7 @@ qboolean S_LoadWavFile (const char *filename, sfx_t *s)
        }
 #endif
 
-       sb->length = ResampleSfx (data + info.dataofs, info.samples, &s->format, sb->data, s->name);
+       sb->length = (int)ResampleSfx (data + info.dataofs, info.samples, &s->format, sb->data, s->name);
        s->format.speed = shm->format.speed;
        s->total_length = sb->length;
        sb->offset = 0;