Coin Logo Coin3D is Free Software,
published under the BSD 3-clause license.
https://coin3d.github.io
https://www.kongsberg.com/en/kogt/
stream.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) Kongsberg Oil & Gas Technologies
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #include <assert.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif /* HAVE_CONFIG_H */
24 
25 #include <simage.h>
26 #include <simage_private.h>
27 #include <string.h>
28 
29 #ifdef SIMAGE_OGGVORBIS_SUPPORT
30 #include "simage_oggvorbis.h"
31 #endif /* SIMAGE_OGGVORBIS_SUPPORT */
32 
33 #ifdef SIMAGE_LIBSNDFILE_SUPPORT
34 #include "simage_libsndfile.h"
35 #endif /* SIMAGE_LIBSNDFILE_SUPPORT */
36 
38  char * filename;
39 
47 
49  void *context;
50 };
51 
58 
60 };
61 
68 
70 };
71 
72 // FIXME: convert access to these variables into the singleton
73 // pattern. 20010917 mortene.
76 
77 static void
79 {
80  static int first = 1;
81  if (first) {
82 #ifdef SIMAGE_OGGVORBIS_SUPPORT
88 #endif
89 #ifdef SIMAGE_LIBSNDFILE_SUPPORT
95 #endif
96  first = 0;
97  }
98 }
99 
100 static void
102 {
103  static int first = 1;
104  if (first) {
105  /* none yet */
106  first = 0;
107  }
108 }
109 
110 s_stream *
111 s_stream_open(const char * filename, s_params * params)
112 {
113  struct simage_stream_importer * imp;
114  s_stream * stream;
115 
116  stream = (s_stream*) malloc(sizeof(s_stream));
117  stream->params = NULL;
118  stream->filename = NULL;
119  stream->context = NULL;
120 
122 
123  imp = importers;
124  while (imp) {
125  if (imp->open(filename, stream, params)) break;
126  imp = imp->next;
127  }
128  if (imp == NULL) {
129  free((void*)stream);
130  return NULL;
131  }
132 
133  stream->filename = (char*) malloc(strlen(filename)+1);
134  strcpy(stream->filename, filename);
135  stream->open = imp->open;
136  stream->get = imp->get;
137  stream->close = imp->close;
138  stream->seek = imp->seek;
139  stream->tell = imp->tell;
140 
141  return stream;
142 }
143 
144 s_stream *
145 s_stream_create(const char * filename, s_params * params /* | NULL */)
146 {
147  struct simage_stream_exporter * exp;
148  s_stream * stream = (s_stream*) malloc(sizeof(s_stream));
149  stream->params = NULL;
150  stream->filename = NULL;
151  stream->context = NULL;
152 
154 
155  exp = exporters;
156  while (exp) {
157  if (exp->create(filename, stream, params)) break;
158  exp = exp->next;
159  }
160  if (exp == NULL) {
161  free((void*) stream);
162  return NULL;
163  }
164 
165  stream->filename = (char*) malloc(strlen(filename)+1);
166  stream->create = exp->create;
167  stream->put = exp->put;
168  stream->close = exp->close;
169  stream->seek = exp->seek;
170  stream->tell = exp->tell;
171  strcpy(stream->filename, filename);
172  return stream;
173 }
174 
175 void *
176 s_stream_get_buffer(s_stream * stream, void * buffer,
177  int *size, s_params * params)
178 {
179  return stream->get(stream, buffer, size, params);
180 }
181 
182 int
183 s_stream_put_buffer(s_stream * stream, void * buffer,
184  int size, s_params * params)
185 {
186  return stream->put(stream, buffer, size, params);
187 }
188 
189 void
191 {
192  stream->close(stream);
193 }
194 
195 void
197 {
198  if (stream->params) s_params_destroy(stream->params);
199  if (stream->filename) free((void*) stream->filename);
200  free((void*) stream);
201 }
202 
203 s_params *
205 {
206  if (stream->params == NULL) {
207  stream->params = s_params_create();
208  }
209  return stream->params;
210 }
211 
212 void *
214 {
215  return stream->context;
216 }
217 
218 void
219 s_stream_context_set(s_stream *stream, void *context)
220 {
221  stream->context = context;
222 }
223 
224 void
226  s_stream_get_func * get,
228 {
229  s_stream_importer_add_ex(open, get, NULL, NULL, close);
230 }
231 
232 void
234  s_stream_get_func * get,
238 {
239  struct simage_stream_importer * last, * imp = importers;
240  last = NULL;
241  while (imp) {
242  last = imp;
243  imp = imp->next;
244  }
245  imp = (struct simage_stream_importer*) malloc(sizeof(struct simage_stream_importer));
246  imp->open = open;
247  imp->get = get;
248  imp->close = close;
249  imp->seek = seek;
250  imp->tell = tell;
251  imp->next = NULL;
252 
253  if (last == NULL) {
254  importers = imp;
255  }
256  else last->next = imp;
257 }
258 
259 void
261  s_stream_put_func * put,
263 {
264  s_stream_exporter_add_ex(create, put, NULL, NULL, close);
265 }
266 
267 void
269  s_stream_put_func * put,
273 {
274  struct simage_stream_exporter * last, * exp = exporters;
275  last = NULL;
276  while (exp) {
277  last = exp;
278  exp = exp->next;
279  }
280  exp = (struct simage_stream_exporter*) malloc(sizeof(struct simage_stream_exporter));
281  exp->create = create;
282  exp->put = put;
283  exp->close = close;
284  exp->seek = seek;
285  exp->tell = tell;
286  exp->next = NULL;
287 
288  if (last == NULL) {
289  exporters = exp;
290  }
291  else last->next = exp;
292 }
293 
294 int
295 s_stream_seek(s_stream * stream, int offset, int whence,
296  s_params * params /* | NULL */)
297 {
298  if (stream->seek)
299  return stream->seek(stream, offset, whence, params);
300  else
301  return -1;
302 }
303 
305  s_params * params /* | NULL */)
306 {
307  if (stream->tell)
308  return stream->tell(stream, params);
309  else
310  return -1;
311 }
void oggvorbis_reader_stream_close(s_stream *stream)
s_stream_create_func * create
Definition: stream.c:63
char * filename
Definition: stream.c:38
void s_params_destroy(s_params *params)
Definition: params.c:57
static void add_internal_importers(void)
Definition: stream.c:78
s_stream_tell_func * tell
Definition: stream.c:56
void * s_stream_get_buffer(s_stream *stream, void *buffer, int *size, s_params *params)
Definition: stream.c:176
s_stream_get_func * get
Definition: stream.c:54
void s_stream_context_set(s_stream *stream, void *context)
Definition: stream.c:219
int s_stream_seek(s_stream *stream, int offset, int whence, s_params *params)
Definition: stream.c:295
int s_stream_put_buffer(s_stream *stream, void *buffer, int size, s_params *params)
Definition: stream.c:183
void s_stream_close(s_stream *stream)
Definition: stream.c:190
int libsndfile_stream_tell(s_stream *stream, s_params *params)
s_stream_close_func * close
Definition: stream.c:67
s_stream_seek_func * seek
Definition: stream.c:55
int s_stream_seek_func(s_stream *, int, int, s_params *)
Definition: simage.h:451
void s_stream_importer_add_ex(s_stream_open_func *open, s_stream_get_func *get, s_stream_seek_func *seek, s_stream_tell_func *tell, s_stream_close_func *close)
Definition: stream.c:233
int s_stream_put_func(s_stream *, void *, int, s_params *)
Definition: simage.h:421
int oggvorbis_reader_stream_open(const char *filename, s_stream *stream, s_params *params)
s_stream_put_func * put
Definition: stream.c:43
int s_stream_create_func(const char *, s_stream *, s_params *)
Definition: simage.h:419
s_stream_close_func * close
Definition: stream.c:44
void s_stream_importer_add(s_stream_open_func *open, s_stream_get_func *get, s_stream_close_func *close)
Definition: stream.c:225
s_stream_seek_func * seek
Definition: stream.c:45
static struct simage_stream_exporter * exporters
Definition: stream.c:75
void * context
Definition: stream.c:49
void * oggvorbis_reader_stream_get(s_stream *stream, void *buffer, int *size, s_params *params)
void * libsndfile_stream_get(s_stream *stream, void *buffer, int *size, s_params *params)
s_stream_open_func * open
Definition: stream.c:53
Windows specific information.
struct simage_stream_exporter * next
Definition: stream.c:69
s_stream_tell_func * tell
Definition: stream.c:66
int s_stream_tell(s_stream *stream, s_params *params)
Definition: stream.c:304
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)
static struct simage_stream_importer * importers
Definition: stream.c:74
void s_stream_exporter_add(s_stream_create_func *create, s_stream_put_func *put, s_stream_close_func *close)
Definition: stream.c:260
s_stream_close_func * close
Definition: stream.c:57
void s_stream_exporter_add_ex(s_stream_create_func *create, s_stream_put_func *put, s_stream_seek_func *seek, s_stream_tell_func *tell, s_stream_close_func *close)
Definition: stream.c:268
s_stream_open_func * open
Definition: stream.c:40
s_stream_get_func * get
Definition: stream.c:42
s_stream * s_stream_open(const char *filename, s_params *params)
Definition: stream.c:111
int s_stream_open_func(const char *, s_stream *, s_params *)
Definition: simage.h:418
s_stream_tell_func * tell
Definition: stream.c:46
s_stream_create_func * create
Definition: stream.c:41
int libsndfile_stream_open(const char *filename, s_stream *stream, s_params *params)
void s_stream_destroy(s_stream *stream)
Definition: stream.c:196
void * s_stream_get_func(s_stream *, void *, int *, s_params *)
Definition: simage.h:420
void s_stream_close_func(s_stream *)
Definition: simage.h:422
s_stream_put_func * put
Definition: stream.c:64
int s_stream_tell_func(s_stream *, s_params *)
Definition: simage.h:452
void * s_stream_context_get(s_stream *stream)
Definition: stream.c:213
s_stream_seek_func * seek
Definition: stream.c:65
s_stream * s_stream_create(const char *filename, s_params *params)
Definition: stream.c:145
s_params * params
Definition: stream.c:48
s_params * s_stream_params(s_stream *stream)
Definition: stream.c:204
struct simage_stream_importer * next
Definition: stream.c:59
s_params * s_params_create(void)
Definition: params.c:49
void libsndfile_stream_close(s_stream *stream)
static void add_internal_exporters(void)
Definition: stream.c:101
int libsndfile_stream_seek(s_stream *stream, int offset, int whence, s_params *params)