# HG changeset patch # User koda # Date 1247964729 0 # Node ID eae64600fb6959e86a90ed11dd39e2cdcc549c2b # Parent b8fff48235de39eab85dc8f5926e711db505a92a fix a bug where a fclose() was called after an ov_clear() moved to ov_open_callback in hope to see less windows linking problems diff -r b8fff48235de -r eae64600fb69 openalbridge/loaders.c --- a/openalbridge/loaders.c Sat Jul 18 21:38:14 2009 +0000 +++ b/openalbridge/loaders.c Sun Jul 19 00:52:09 2009 +0000 @@ -125,7 +125,7 @@ return AL_TRUE; } - + int load_oggvorbis (const char *filename, ALenum *format, char **data, ALsizei *bitsize, ALsizei *freq) { /*implementation inspired from http://www.devmaster.net/forums/showthread.php?t=1153 */ FILE *oggFile; /*ogg handle*/ @@ -137,10 +137,15 @@ int i; vorbis_comment *vorbisComment; /*other less useful data*/ #endif - + oggFile = Fopen(filename, "rb"); - result = ov_open(oggFile, &oggStream, NULL, 0); /*TODO: check returning value of result*/ - + result = ov_open_callbacks(oggFile, &oggStream, NULL, 0, NULL); + if (result < 0) { + fprintf (stderr, "ERROR: ov_open_callbacks failed with %X", result) + fclose(oggFile); + return -1; + } + vorbisInfo = ov_info(&oggStream, -1); pcm_length = ov_pcm_total(&oggStream, -1) << vorbisInfo->channels; @@ -171,35 +176,37 @@ *format = AL_FORMAT_STEREO16; else { fprintf(stderr, "ERROR: wrong OGG header - channel value (%d)\n", vorbisInfo->channels); - ov_clear (&oggStream); + ov_clear(&oggStream); fclose(oggFile); return AL_FALSE; } } - while(size < pcm_length) { + while (size < pcm_length) { /*ov_read decodes the ogg stream and storse the pcm in data*/ result = ov_read (&oggStream, *data + size, pcm_length - size, 0, 2, 1, §ion); - if(result > 0) { + if (result > 0) { size += result; } else { if (result == 0) break; else { fprintf(stderr, "ERROR: end of file from OGG stream\n"); - ov_clear (&oggStream); + ov_clear(&oggStream); fclose(oggFile); return AL_FALSE; } } } - /*records the last fields*/ + /*set the last fields*/ *bitsize = size; *freq = vorbisInfo->rate; - ov_clear (&oggStream); - fclose (oggFile); + /*cleaning time*/ + ov_clear(&oggStream); + fclose(oggFile); + return AL_TRUE; } diff -r b8fff48235de -r eae64600fb69 openalbridge/oggvorbis.h --- a/openalbridge/oggvorbis.h Sat Jul 18 21:38:14 2009 +0000 +++ b/openalbridge/oggvorbis.h Sun Jul 19 00:52:09 2009 +0000 @@ -31,8 +31,7 @@ int channels; long rate; /* The below bitrate declarations are *hints*. - Combinations of the three values carry the following implications: - all three set to the same value: implies a fixed rate bitstream + Combinations of the three values carry the following implications: all three set to the same value: implies a fixed rate bitstream only nominal set: implies a VBR stream that averages the nominal bitrate. No hard upper/lower limit upper and or lower set: implies a VBR bitstream that obeys the bitrate limits. nominal may also be set to give a nominal rate. none set: the coder does not care to speculate. */ @@ -54,10 +53,9 @@ long body_storage; /* storage elements allocated */ long body_fill; /* elements stored; fill mark */ long body_returned; /* elements of fill returned */ - int *lacing_vals; /* The values that will go to the segment table */ + int *lacing_vals; /* The values that will go to the segment table */ ogg_int64_t *granule_vals; - /* granulepos values for headers. Not compact - this way, but it is simple coupled to the lacing fifo */ + /* granulepos values for headers. Not compact this way, but it is simple coupled to the lacing fifo */ long lacing_storage; long lacing_fill; long lacing_packet; @@ -172,5 +170,6 @@ extern vorbis_info *ov_info(OggVorbis_File *vf,int link); extern vorbis_comment *ov_comment(OggVorbis_File *f, int num); extern int ov_clear(OggVorbis_File *vf); +extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks); #endif /*_OGGVORBIS_H*/