--- frontend/input.c.orig Sat Nov 23 18:39:14 2002 +++ frontend/input.c Fri Dec 13 14:01:43 2002 @@ -23,41 +23,71 @@ #include #ifdef WIN32 #include + +#typedef unsigned long u_int32_t; +#typedef unsigned short u_int16_t; +#else +#include #endif #include "input.h" -typedef unsigned long u_long; -typedef unsigned short u_short; - typedef struct { - u_long label; /* 'RIFF' */ - u_long length; /* Length of rest of file */ - u_long chunk_type; /* 'WAVE' */ + u_int32_t label; /* 'RIFF' */ + u_int32_t length; /* Length of rest of file */ + u_int32_t chunk_type; /* 'WAVE' */ } riff_t; typedef struct { - u_long label; - u_long len; + u_int32_t label; + u_int32_t len; } riffsub_t; #define WAVE_FORMAT_PCM 1 typedef struct { - u_short wFormatTag; - u_short nChannels; - u_long nSamplesPerSec; - u_long nAvgBytesPerSec; - u_short nBlockAlign; - u_short wBitsPerSample; - u_short cbSize; + u_int16_t wFormatTag; + u_int16_t nChannels; + u_int32_t nSamplesPerSec; + u_int32_t nAvgBytesPerSec; + u_int16_t nBlockAlign; + u_int16_t wBitsPerSample; + u_int16_t cbSize; } WAVEFORMATEX; +u_int32_t little32(u_int32_t l32) +{ + unsigned char *s; + u_int32_t u32; + + s = (unsigned char*)&l32; + u32 = s[3]; + u32 <<= 8; + u32 |= s[2]; + u32 <<= 8; + u32 |= s[1]; + u32 <<= 8; + u32 |= s[0]; + return u32; +} + +u_int16_t little16(u_int16_t l16) +{ + unsigned char *s; + u_int16_t u16; + + s = (unsigned char*)&l16; + u16 = s[1]; + u16 <<= 8; + u16 |= s[0]; + return u16; +} + pcmfile_t *wav_open_read(const char *name) { int i; @@ -95,6 +125,7 @@ pcmfile_t *wav_open_read(const char *nam if (fread(&riffsub, 1, sizeof(riffsub), wave_f) != sizeof(riffsub)) return NULL; + riffsub.len = little32(riffsub.len); if (memcmp(&(riffsub.label), fmtl, 4)) return NULL; memset(&wave, 0, sizeof(wave)); @@ -109,6 +140,7 @@ pcmfile_t *wav_open_read(const char *nam { if (fread(&riffsub, 1, sizeof(riffsub), wave_f) != sizeof(riffsub)) return NULL; + riffsub.len = little32(riffsub.len); if (!memcmp(&(riffsub.label), datal, 4)) break; if (i > 10) @@ -117,16 +149,16 @@ pcmfile_t *wav_open_read(const char *nam for (skip = riffsub.len; skip > 0; skip--) fgetc(wave_f); } - if (wave.wFormatTag != WAVE_FORMAT_PCM) + if (little16(wave.wFormatTag) != WAVE_FORMAT_PCM) return NULL; sndf = malloc(sizeof(*sndf)); sndf->f = wave_f; - sndf->channels = wave.nChannels; - sndf->samplebits = wave.wBitsPerSample; - sndf->samplerate = wave.nSamplesPerSec; + sndf->channels = little16(wave.nChannels); + sndf->samplebits = little32(wave.wBitsPerSample); + sndf->samplerate = little32(wave.nSamplesPerSec); sndf->samples = riffsub.len / - (((wave.wBitsPerSample > 8) ? 2 : 1) * wave.nChannels); + (((little16(wave.wBitsPerSample) > 8) ? 2 : 1) * sndf->channels); return sndf; } @@ -135,9 +167,16 @@ size_t wav_read_short(pcmfile_t *sndf, s int size; int i; - if (sndf->samplebits > 8) - return fread(buf, 2, num, sndf->f); + if (sndf->samplebits > 8) { + size = fread(buf, 2, num, sndf->f); + for (i = 0; i < size; i++) { + /* change endianess for big endian (ppc, sparc) machines */ + buf[i] = little16(buf[i]); + } + return size; + } + /* this is endian clean */ // convert to 16 bit size = fread(buf, 1, num, sndf->f); for (i = size - 1; i >= 0; i--)