aboutsummaryrefslogtreecommitdiff
path: root/src/Support.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Support.cpp')
-rw-r--r--src/Support.cpp142
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,
- &current_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, &section))
+#else
+ while (ret = ov_read(&vf, i, 1024, 0, 2, 1, &section))
+#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);
}