X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=snd_mem.c;h=d0671eb8740fb88ef143148178beb8500933442f;hp=7908ea87b24b6c551d534a77b3b7a109266cd4da;hb=1e1dbc1c5b89ae4ab8cdd9b32dc6413c67f5dd84;hpb=6abd2a8816c110a29d6e2ecc2f574c9ef2ddc48f;ds=sidebyside diff --git a/snd_mem.c b/snd_mem.c index 7908ea87..d0671eb8 100644 --- a/snd_mem.c +++ b/snd_mem.c @@ -21,6 +21,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" +#include "snd_ogg.h" + + /* ================ ResampleSfx @@ -53,7 +56,7 @@ void ResampleSfx (sfxcache_t *sc, qbyte *data, char *name) ((signed char *)sc->data)[i] = ((unsigned char *)data)[i] - 128; else //if (sc->width == 2) // 16bit for (i = 0;i < srclength;i++) - ((short *)sc->data)[i] = LittleShort (((short *)data)[i]); + ((short *)sc->data)[i] = ((short *)data)[i]; } else { @@ -71,8 +74,8 @@ void ResampleSfx (sfxcache_t *sc, qbyte *data, char *name) fracstep <<= 1; for (i=0 ; iname, data, fs_filesize); // Stereo sounds are allowed (intended for music) if (info.channels < 1 || info.channels > 2) @@ -235,7 +242,6 @@ sfxcache_t *S_LoadWavFile (const char *filename, sfx_t *s) len = (int) ((double) info.samples * (double) shm->speed / (double) info.rate); len = len * info.width * info.channels; - // FIXME: add S_UnloadSounds or something? Mem_FreePool(&s->mempool); s->mempool = Mem_AllocPool(s->name); sc = s->sfxcache = Mem_Alloc(s->mempool, len + sizeof(sfxcache_t)); @@ -253,6 +259,21 @@ sfxcache_t *S_LoadWavFile (const char *filename, sfx_t *s) sc->width = info.width; sc->stereo = info.channels == 2; +#if BYTE_ORDER != LITTLE_ENDIAN + // We must convert the WAV data from little endian + // to the machine endianess before resampling it + if (info.width == 2) + { + int i; + short* ptr; + + len = info.samples * info.channels; + ptr = (short*)(data + info.dataofs); + for (i = 0; i < len; i++) + ptr[i] = LittleShort (ptr[i]); + } +#endif + ResampleSfx(sc, data + info.dataofs, s->name); Mem_Free(data); @@ -270,6 +291,7 @@ sfxcache_t *S_LoadSound (sfx_t *s, int complain) char namebuffer[MAX_QPATH]; size_t len; sfxcache_t *sc; + qboolean modified_name = false; // see if still in memory if (!shm || !shm->speed) @@ -283,19 +305,31 @@ sfxcache_t *S_LoadSound (sfx_t *s, int complain) // Try to load it as a WAV file sc = S_LoadWavFile (namebuffer, s); + if (sc != NULL) + return sc; - // TODO: insert Ogg Vorbis support here + // 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 (sc == NULL) + if (!complain) + s->flags |= SFXFLAG_SILENTLYMISSING; + else + s->flags &= ~SFXFLAG_SILENTLYMISSING; + if (complain) { - s->silentlymissing = !complain; - if (complain) - Con_Printf ("Couldn't load %s\n", namebuffer); - return NULL; + if (modified_name) + strcpy (namebuffer + len - 3, "wav"); + Con_Printf("Couldn't load %s\n", namebuffer); } - - return sc; + return NULL; } void S_UnloadSound(sfx_t *s) @@ -317,30 +351,30 @@ WAV loading */ -qbyte *data_p; -qbyte *iff_end; -qbyte *last_chunk; -qbyte *iff_data; -int iff_chunk_len; +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 = 0; - val = *data_p; - val = val + (*(data_p+1)<<8); + short val; + + val = BuffLittleShort (data_p); 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); + + val = BuffLittleLong (data_p); data_p += 4; + return val; } @@ -388,7 +422,7 @@ void DumpChunks(void) 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); + 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); } @@ -417,7 +451,7 @@ wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength) FindChunk("RIFF"); if (!(data_p && !strncmp(data_p+8, "WAVE", 4))) { - Con_Printf("Missing RIFF/WAVE chunks\n"); + Con_Print("Missing RIFF/WAVE chunks\n"); return info; } @@ -428,14 +462,14 @@ wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength) FindChunk("fmt "); if (!data_p) { - Con_Printf("Missing fmt chunk\n"); + Con_Print("Missing fmt chunk\n"); return info; } data_p += 8; format = GetLittleShort(); if (format != 1) { - Con_Printf("Microsoft PCM format only\n"); + Con_Print("Microsoft PCM format only\n"); return info; } @@ -470,7 +504,7 @@ wavinfo_t GetWavinfo (char *name, qbyte *wav, int wavlength) FindChunk("data"); if (!data_p) { - Con_Printf("Missing data chunk\n"); + Con_Print("Missing data chunk\n"); return info; }