19 #include "loaders.h" |
19 #include "loaders.h" |
20 #include "wrappers.h" |
20 #include "wrappers.h" |
21 #include "vorbis/vorbisfile.h" |
21 #include "vorbis/vorbisfile.h" |
22 #include "openalbridge_t.h" |
22 #include "openalbridge_t.h" |
23 |
23 |
|
24 |
24 int load_wavpcm (const char *filename, ALenum *format, char ** data, ALsizei *bitsize, ALsizei *freq) { |
25 int load_wavpcm (const char *filename, ALenum *format, char ** data, ALsizei *bitsize, ALsizei *freq) { |
25 WAV_header_t WAVHeader; |
26 WAV_header_t WAVHeader; |
26 FILE *wavfile; |
27 FILE *wavfile; |
27 int32_t t; |
28 int32_t t; |
28 uint32_t n = 0; |
29 uint32_t n = 0; |
100 } while (n < ENDIAN_LITTLE_32(WAVHeader.Subchunk2Size)); |
100 } while (n < ENDIAN_LITTLE_32(WAVHeader.Subchunk2Size)); |
101 |
101 |
102 fclose(wavfile); |
102 fclose(wavfile); |
103 |
103 |
104 #ifdef DEBUG |
104 #ifdef DEBUG |
105 err_msg("(%s) INFO - WAV data loaded", prog); |
105 fprintf(stderr,"(Bridge Info) - WAV data loaded"); |
106 #endif |
106 #endif |
107 |
107 |
108 /*set parameters for OpenAL*/ |
108 /*set parameters for OpenAL*/ |
109 /*Valid formats are AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8, and AL_FORMAT_STEREO16*/ |
109 /*Valid formats are AL_FORMAT_MONO8, AL_FORMAT_MONO16, AL_FORMAT_STEREO8, and AL_FORMAT_STEREO16*/ |
110 if (ENDIAN_LITTLE_16(WAVHeader.NumChannels) == 1) { |
110 if (ENDIAN_LITTLE_16(WAVHeader.NumChannels) == 1) { |
112 *format = AL_FORMAT_MONO8; |
112 *format = AL_FORMAT_MONO8; |
113 else { |
113 else { |
114 if (ENDIAN_LITTLE_16(WAVHeader.BitsPerSample) == 16) |
114 if (ENDIAN_LITTLE_16(WAVHeader.BitsPerSample) == 16) |
115 *format = AL_FORMAT_MONO16; |
115 *format = AL_FORMAT_MONO16; |
116 else { |
116 else { |
117 errno = EILSEQ; |
117 fprintf(stderr,"(Bridge Error) - wrong WAV header [bitsample value]"); |
118 err_ret("(%s) ERROR - wrong WAV header [bitsample value]", prog); |
118 return -2; |
119 return AL_FALSE; |
|
120 } |
119 } |
121 } |
120 } |
122 } else { |
121 } else { |
123 if (ENDIAN_LITTLE_16(WAVHeader.NumChannels) == 2) { |
122 if (ENDIAN_LITTLE_16(WAVHeader.NumChannels) == 2) { |
124 if (ENDIAN_LITTLE_16(WAVHeader.BitsPerSample) == 8) |
123 if (ENDIAN_LITTLE_16(WAVHeader.BitsPerSample) == 8) |
125 *format = AL_FORMAT_STEREO8; |
124 *format = AL_FORMAT_STEREO8; |
126 else { |
125 else { |
127 if (ENDIAN_LITTLE_16(WAVHeader.BitsPerSample) == 16) |
126 if (ENDIAN_LITTLE_16(WAVHeader.BitsPerSample) == 16) |
128 *format = AL_FORMAT_STEREO16; |
127 *format = AL_FORMAT_STEREO16; |
129 else { |
128 else { |
130 errno = EILSEQ; |
129 fprintf(stderr,"(Bridge Error) - wrong WAV header [bitsample value]"); |
131 err_ret("(%s) ERROR - wrong WAV header [bitsample value]", prog); |
130 return -2; |
132 return AL_FALSE; |
|
133 } |
131 } |
134 } |
132 } |
135 } else { |
133 } else { |
136 errno = EILSEQ; |
134 fprintf(stderr,"(Bridge Error) - wrong WAV header [format value]"); |
137 err_ret("(%s) ERROR - wrong WAV header [format value]", prog); |
135 return -2; |
138 return AL_FALSE; |
|
139 } |
136 } |
140 } |
137 } |
141 |
138 |
142 *bitsize = ENDIAN_LITTLE_32(WAVHeader.Subchunk2Size); |
139 *bitsize = ENDIAN_LITTLE_32(WAVHeader.Subchunk2Size); |
143 *freq = ENDIAN_LITTLE_32(WAVHeader.SampleRate); |
140 *freq = ENDIAN_LITTLE_32(WAVHeader.SampleRate); |
144 return AL_TRUE; |
141 return 0; |
145 } |
142 } |
146 |
143 |
147 |
144 |
148 int load_oggvorbis (const char *filename, ALenum *format, char **data, ALsizei *bitsize, ALsizei *freq) { |
145 int load_oggvorbis (const char *filename, ALenum *format, char **data, ALsizei *bitsize, ALsizei *freq) { |
149 /*implementation inspired from http://www.devmaster.net/forums/showthread.php?t=1153 */ |
146 /*implementation inspired from http://www.devmaster.net/forums/showthread.php?t=1153 */ |
165 #endif |
162 #endif |
166 |
163 |
167 oggFile = Fopen(filename, "rb"); |
164 oggFile = Fopen(filename, "rb"); |
168 result = ov_open_callbacks(oggFile, &oggStream, NULL, 0, OV_CALLBACKS_DEFAULT); |
165 result = ov_open_callbacks(oggFile, &oggStream, NULL, 0, OV_CALLBACKS_DEFAULT); |
169 if (result < 0) { |
166 if (result < 0) { |
170 errno = EINVAL; |
167 fprintf(stderr,"(Bridge Error) - ov_open_callbacks() failed with %X", result); |
171 err_ret("(%s) ERROR - ov_fopen() failed with %X", prog, result); |
|
172 ov_clear(&oggStream); |
168 ov_clear(&oggStream); |
173 return -1; |
169 return -1; |
174 } |
170 } |
175 |
171 |
176 /*load OGG header and determine the decoded data size*/ |
172 /*load OGG header and determine the decoded data size*/ |
201 *format = AL_FORMAT_MONO16; |
197 *format = AL_FORMAT_MONO16; |
202 else { |
198 else { |
203 if (vorbisInfo->channels == 2) |
199 if (vorbisInfo->channels == 2) |
204 *format = AL_FORMAT_STEREO16; |
200 *format = AL_FORMAT_STEREO16; |
205 else { |
201 else { |
206 errno = EILSEQ; |
202 fprintf(stderr,"(Bridge Error) - wrong OGG header [channel %d]", vorbisInfo->channels); |
207 err_ret("(%s) ERROR - wrong OGG header [channel %d]", prog, vorbisInfo->channels); |
|
208 ov_clear(&oggStream); |
203 ov_clear(&oggStream); |
209 return -1; |
204 return -2; |
210 } |
205 } |
211 } |
206 } |
212 |
207 |
213 size = 0; |
208 size = 0; |
214 #ifdef __LITTLE_ENDIAN__ |
209 #ifdef __LITTLE_ENDIAN__ |