X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=snd_mem.c;h=7908ea87b24b6c551d534a77b3b7a109266cd4da;hb=c78e6441fdff4fe7adf8583846f56657f8ee092d;hp=c01c479b4c4449409df0707adf89cde2d5ba5afb;hpb=38a6d5886112027efd65fa160c1902a0d3b3fd20;p=xonotic%2Fdarkplaces.git diff --git a/snd_mem.c b/snd_mem.c index c01c479b..7908ea87 100644 --- a/snd_mem.c +++ b/snd_mem.c @@ -21,8 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" -qbyte *S_Alloc (int size); - /* ================ ResampleSfx @@ -38,6 +36,7 @@ void ResampleSfx (sfxcache_t *sc, qbyte *data, char *name) srclength = sc->length << sc->stereo; outcount = (double) sc->length * (double) shm->speed / (double) sc->speed; + Con_DPrintf("ResampleSfx: resampling sound %s from %dhz to %dhz (%d samples to %d samples)\n", name, sc->speed, shm->speed, sc->length, outcount); sc->length = outcount; if (sc->loopstart != -1) sc->loopstart = (double) sc->loopstart * (double) shm->speed / (double) sc->speed; @@ -59,7 +58,6 @@ void ResampleSfx (sfxcache_t *sc, qbyte *data, char *name) else { // general case - Con_DPrintf("ResampleSfx: resampling sound %s\n", name); samplefrac = 0; if ((fracstep & 255) == 0) // skipping points on perfect multiple { @@ -209,40 +207,26 @@ void ResampleSfx (sfxcache_t *sc, qbyte *data, char *name) /* ============== -S_LoadSound +S_LoadWavFile ============== */ -sfxcache_t *S_LoadSound (sfx_t *s, int complain) +sfxcache_t *S_LoadWavFile (const char *filename, sfx_t *s) { - char namebuffer[256]; qbyte *data; wavinfo_t info; int len; sfxcache_t *sc; - // see if still in memory - if (s->sfxcache) - return s->sfxcache; - - // load it in - strcpy(namebuffer, "sound/"); - strcat(namebuffer, s->name); - - data = FS_LoadFile(namebuffer, false); - + // Load the file + data = FS_LoadFile(filename, false); if (!data) - { - s->silentlymissing = !complain; - if (complain) - Con_Printf ("Couldn't load %s\n", namebuffer); return NULL; - } info = GetWavinfo (s->name, data, fs_filesize); - // LordHavoc: stereo sounds are now allowed (intended for music) + // 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); + Con_Printf("%s has an unsupported number of channels (%i)\n",s->name, info.channels); Mem_Free(data); return NULL; } @@ -257,6 +241,7 @@ sfxcache_t *S_LoadSound (sfx_t *s, int complain) sc = s->sfxcache = Mem_Alloc(s->mempool, len + sizeof(sfxcache_t)); if (!sc) { + Con_Printf("failed to allocate memory for sound \"%s\"\n", s->name); Mem_FreePool(&s->mempool); Mem_Free(data); return NULL; @@ -268,13 +253,60 @@ sfxcache_t *S_LoadSound (sfx_t *s, int complain) sc->width = info.width; sc->stereo = info.channels == 2; - ResampleSfx (sc, data + info.dataofs, s->name); + ResampleSfx(sc, data + info.dataofs, s->name); Mem_Free(data); return sc; } +/* +============== +S_LoadSound +============== +*/ +sfxcache_t *S_LoadSound (sfx_t *s, int complain) +{ + char namebuffer[MAX_QPATH]; + size_t len; + sfxcache_t *sc; + + // 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); + + // TODO: insert Ogg Vorbis support here + + // Can't load the sound! + if (sc == NULL) + { + s->silentlymissing = !complain; + if (complain) + Con_Printf ("Couldn't load %s\n", namebuffer); + return NULL; + } + + return sc; +} + +void S_UnloadSound(sfx_t *s) +{ + if (s->sfxcache) + { + s->sfxcache = NULL; + Mem_FreePool(&s->mempool); + } +} + /* ===============================================================================