diff options
Diffstat (limited to 'src/Support.cpp')
-rw-r--r-- | src/Support.cpp | 142 |
1 files changed, 43 insertions, 99 deletions
diff --git a/src/Support.cpp b/src/Support.cpp index b88d3b1..a068360 100644 --- a/src/Support.cpp +++ b/src/Support.cpp @@ -55,11 +55,6 @@ int Button(void) return (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1)); } -void InitMouse() -{ -// STUB_FUNCTION; -} - void MoveMouse(int xcoord, int ycoord, Point *mouseloc) { /* TODO: mouse warp is annoying when we can just grab the mouse */ @@ -70,11 +65,6 @@ void MoveMouse(int xcoord, int ycoord, Point *mouseloc) GetMouse(mouseloc); } -void DisposeMouse() -{ -// STUB_FUNCTION; -} - #ifndef O_BINARY #define O_BINARY 0 #endif @@ -244,116 +234,70 @@ void Files::EndLoad() sFile = -1; } -/* -Read the requested OGG file into memory, and extract the information required -by OpenAL -*/ -void LoadOGG_CFH(char *filename, ALenum *format, void **wave, - unsigned int *size, ALsizei *freq) +/* Read the requested Ogg file and load it into OpenAL */ +void loadOgg(char *filename, ALuint buffer, ALuint source) { + /* Try to find the real file (and place it in filename1) */ char filename1[MAX_PATH]; - ALsizei format1, size1, freq1; - void *wave1; - OggVorbis_File vf; - vorbis_info *vi; - FILE *fp; - int current_section; - char *buf; - int asize; - int err; - int eof; - -#if BYTE_ORDER == BIG_ENDIAN - const int endian = 1; -#else - const int endian = 0; -#endif - - /* try to find the real file (and place it in filename1) */ fix_filename(filename, filename1); - /* open it for reading */ - fp = fopen(filename1, "rb"); + FILE* fp = fopen(filename1, "rb"); if (fp == NULL) { fprintf(stderr, "ERROR: unable to open %s\n", filename1); exit(EXIT_FAILURE); } - /* open it up */ - err = ov_open(fp, &vf, NULL, 0); - if (err < 0) { - fprintf(stderr, "ERROR: vorbis error %d opening %s\n", -err, filename1); + OggVorbis_File vf; + int error = -ov_open(fp, &vf, NULL, 0); + if (error > 0) { + fprintf(stderr, "ERROR: vorbis error %d opening %s\n", + error, filename1); exit(EXIT_FAILURE); } - /* get the ogg information */ - vi = ov_info(&vf, -1); + vorbis_info* vi = ov_info(&vf, -1); if (vi == NULL) { - fprintf(stderr, "ERROR: vorbis error opening %s (ov_info failed)\n", filename1); + fprintf(stderr, + "ERROR: vorbis error opening %s (ov_info failed)\n", + filename1); exit(EXIT_FAILURE); } - /* calculate the byte size */ - size1 = vi->channels * 2 * ov_pcm_total(&vf, -1); - - /* hack around some possible ogg vorbis weirdness */ - asize = ((size1 + 2047) / 2048 + 1) * 2048; - - /* allocate our buffer */ - wave1 = malloc(asize); - - if (wave1 == NULL) { - fprintf(stderr, "ERROR: could not allocate %d bytes while loading %s\n", size1, filename1); + /* Hack around some possible ogg vorbis weirdness */ + ALsizei size = vi->channels * 2 * ov_pcm_total(&vf, -1); + ALvoid* data = malloc(((size + 2047) / 2048 + 1) * 2048); + if (data == NULL) { + fprintf(stderr, + "ERROR: could not allocate %d bytes while loading %s\n", + size, filename1); exit(EXIT_FAILURE); } - /* read it in */ - eof = 0; - buf = (char *)wave1; - - while(!eof) { - long ret = ov_read(&vf, buf, 1024, endian, 2, 1, - ¤t_section); - - if (ret == 0) { - /* end of file */ - eof = 1; - } else if (ret < 0) { - /* some sort of error */ - - /* TODO: is this ok to ignore? */ - } else { - buf += ret; - } - } - - /* get the rest of the information */ - if (vi->channels == 1) { - format1 = AL_FORMAT_MONO16; - } else if (vi->channels == 2) { - format1 = AL_FORMAT_STEREO16; - } else { - fprintf(stderr, "ERROR: ogg %s has %d channels\n", filename1, vi->channels); + char* i = (char*) data; + int section; + long ret; +#if BYTE_ORDER == BIG_ENDIAN + while (ret = ov_read(&vf, i, 1024, 1, 2, 1, §ion)) +#else + while (ret = ov_read(&vf, i, 1024, 0, 2, 1, §ion)) +#endif + if (ret > 0) /* XXX: How about negative ret? */ + i += ret; + + switch (vi->channels) { + case 1: + alBufferData(buffer, AL_FORMAT_MONO16, data, size, vi->rate); + break; + case 2: + alBufferData(buffer, AL_FORMAT_STEREO16, data, size, vi->rate); + break; + default: + fprintf(stderr, "ERROR: ogg %s has %d channels\n", + filename1, vi->channels); exit(EXIT_FAILURE); } - freq1 = vi->rate; - - /* we are done with the ogg, so free it */ + free(data); ov_clear(&vf); - - /* finall, give the values to the caller */ - *format = format1; - *size = size1; - *freq = freq1; - *wave = wave1; -} - -/* -Free the OGG buffer -*/ -void FreeOGG(ALenum format, void *wave, unsigned int size, - ALsizei freq) -{ - free(wave); + alSourcei(source, AL_BUFFER, buffer); } |