summary refs log tree commit diff
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);
 }