21 #ifdef SIMAGE_OGGVORBIS_SUPPORT
30 #include <vorbis/codec.h>
31 #include <vorbis/vorbisfile.h>
35 OggVorbis_File vorbisfile;
37 } oggvorbis_reader_context;
41 oggvorbis_reader_init_context(oggvorbis_reader_context *context)
44 context->current_section = 0;
48 oggvorbis_reader_cleanup_context(oggvorbis_reader_context *context)
53 oggvorbis_reader_read_cb(
void *ptr,
size_t size,
size_t nmemb,
56 oggvorbis_reader_context *context = (oggvorbis_reader_context *)datasource;
57 return fread(ptr, size, nmemb, context->file);
61 oggvorbis_reader_seek_cb(
void *datasource, ogg_int64_t offset,
int whence)
63 oggvorbis_reader_context *context = (oggvorbis_reader_context *)datasource;
64 return fseek(context->file, (
int)offset, whence);
68 oggvorbis_reader_tell_cb(
void *datasource)
70 oggvorbis_reader_context *context = (oggvorbis_reader_context *)datasource;
71 return ftell(context->file);
75 oggvorbis_reader_close_cb(
void *datasource)
77 oggvorbis_reader_context *context = (oggvorbis_reader_context *)datasource;
78 if (context->file != NULL)
79 fclose(context->file);
85 oggvorbis_reader_open(oggvorbis_reader_context **contextp,
88 ov_callbacks callbacks;
89 oggvorbis_reader_context *context;
91 *contextp = (oggvorbis_reader_context *)
92 malloc(
sizeof(oggvorbis_reader_context));
93 oggvorbis_reader_init_context(*contextp);
96 context->file = fopen(filename,
"rb");
97 if (context->file == NULL) {
98 oggvorbis_reader_cleanup_context(context);
103 callbacks.read_func = oggvorbis_reader_read_cb;
104 callbacks.seek_func = oggvorbis_reader_seek_cb;
105 callbacks.close_func = oggvorbis_reader_close_cb;
106 callbacks.tell_func = oggvorbis_reader_tell_cb;
108 if(ov_open_callbacks((
void *)context, &context->vorbisfile, NULL, 0,
110 fclose(context->file);
111 context->file = NULL;
112 oggvorbis_reader_cleanup_context(context);
121 oggvorbis_reader_read(oggvorbis_reader_context *context,
122 char *buffer,
int size)
133 endianTest.testWord = 1;
134 if (endianTest.testByte[0] == 1) {
144 while (readsize<size) {
150 numread=ov_read(&context->vorbisfile,
152 size-readsize, bigEndian, 2, 1,
153 &context->current_section);
167 oggvorbis_reader_get_stream_info(oggvorbis_reader_context *context,
168 int *channels,
int *samplerate)
172 vi = ov_info(&context->vorbisfile,-1);
173 *channels = vi->channels;
174 *samplerate = vi->rate;
180 oggvorbis_reader_close(oggvorbis_reader_context *context)
182 if (context->file != NULL)
183 ov_clear(&context->vorbisfile);
185 oggvorbis_reader_cleanup_context(context);
194 oggvorbis_reader_context *context;
195 int channels, samplerate;
197 if (!oggvorbis_reader_open(&context, filename))
202 oggvorbis_reader_get_stream_info(context, &channels, &samplerate);
214 oggvorbis_reader_context *context;
218 if (context != NULL) {
219 ret = oggvorbis_reader_read(context, (
char*) buffer, *size);
234 oggvorbis_reader_context *context;
237 if (context != NULL) {
238 oggvorbis_reader_close(context);
246 oggvorbis_reader_context *context;
250 if (context != NULL) {
252 return ov_pcm_seek(&context->vorbisfile, offset);
264 oggvorbis_reader_context *context;
268 if (context != NULL) {
269 return ov_pcm_tell(&context->vorbisfile);
void oggvorbis_reader_stream_close(s_stream *stream)
void s_params_set(s_params *params,...)
void s_stream_context_set(s_stream *stream, void *context)
int oggvorbis_reader_stream_open(const char *filename, s_stream *stream, s_params *params)
void * oggvorbis_reader_stream_get(s_stream *stream, void *buffer, int *size, s_params *params)
Windows specific information.
int oggvorbis_reader_stream_seek(s_stream *stream, int offset, int whence, s_params *params)
int oggvorbis_reader_stream_tell(s_stream *stream, s_params *params)
void * s_stream_context_get(s_stream *stream)
s_params * s_stream_params(s_stream *stream)