X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=snd_wav.c;h=89bd6c6e4cd9f5ba45406507929aa235c883345d;hb=e335de5ed205f42e33acbc794b02fa0939ba8e42;hp=e11c24563f5684ea674d2b19768a66b33f374dd8;hpb=a1e05a11f1c94c609e55a1a25d72e5ed2eaf5ecb;p=xonotic%2Fdarkplaces.git diff --git a/snd_wav.c b/snd_wav.c index e11c2456..89bd6c6e 100644 --- a/snd_wav.c +++ b/snd_wav.c @@ -23,10 +23,11 @@ #include "quakedef.h" +#include "snd_main.h" #include "snd_wav.h" -typedef struct +typedef struct wavinfo_s { int rate; int width; @@ -37,10 +38,10 @@ typedef struct } wavinfo_t; -static qbyte *data_p; -static qbyte *iff_end; -static qbyte *last_chunk; -static qbyte *iff_data; +static unsigned char *data_p; +static unsigned char *iff_end; +static unsigned char *last_chunk; +static unsigned char *iff_data; static int iff_chunk_len; @@ -85,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; } } @@ -121,7 +122,7 @@ static void DumpChunks(void) GetWavinfo ============ */ -static wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength) +static wavinfo_t GetWavinfo (char *name, unsigned char *wav, int wavlength) { wavinfo_t info; int i; @@ -138,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; @@ -178,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 @@ -203,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\n", name); + info.samples = samples; + } } else info.samples = samples; @@ -221,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 }; /* @@ -235,51 +255,55 @@ S_LoadWavFile */ qboolean S_LoadWavFile (const char *filename, sfx_t *s) { - qbyte *data; + fs_offset_t filesize; + unsigned char *data; wavinfo_t info; int len; + size_t memsize; sfxbuffer_t* sb; - Mem_FreePool (&s->mempool); - s->mempool = Mem_AllocPool(s->name); + // 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, &filesize); 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)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; @@ -289,7 +313,8 @@ qboolean S_LoadWavFile (const char *filename, sfx_t *s) if (info.loopstart < 0) s->loopstart = -1; else - s->loopstart = (double)info.loopstart * (double)shm->format.speed / (double)s->format.speed; + s->loopstart = (int)((double)info.loopstart * (double)shm->format.speed / (double)s->format.speed); + s->flags &= ~SFXFLAG_STREAMED; #if BYTE_ORDER != LITTLE_ENDIAN // We must convert the WAV data from little endian @@ -306,7 +331,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;