FS2_Open
Open source remastering of the Freespace 2 engine
ogg.cpp
Go to the documentation of this file.
1 
2 
3 #ifdef WIN32
4 #define WIN32_LEAN_AND_MEAN
5 #include <windows.h>
6 #include <Mmsystem.h>
7 #endif
8 
9 #define NEED_STRHDL // for STRHTL struct in audiostr.h
10 
11 #include "cfile/cfile.h"
12 #include "sound/ogg/ogg.h"
13 #include "sound/audiostr.h"
14 
15 
16 int ogg_inited = 0;
17 ov_callbacks cfile_callbacks;
18 ov_callbacks mmio_callbacks;
19 
20 //Encapsulation funcs to please the almighty ov_callbacks struct
21 size_t ogg_cfread(void *buf, size_t elsize, size_t elnem, void* cfile)
22 {
23  return cfread(buf, elsize, elnem, (CFILE*)cfile);
24 }
25 
26 int ogg_cfseek(void* cfile, ogg_int64_t offset, int where)
27 {
28  return cfseek((CFILE*)cfile, (int) offset, where);
29 }
30 
31 int ogg_cfclose(void* cfile)
32 {
33  // we don't close here so that it's safe to do it ourselves
34  return 0;
35 }
36 
37 long ogg_cftell(void* cfile)
38 {
39  return cftell((CFILE*) cfile);
40 }
41 
42 
43 size_t ogg_mmio_read(void *buf, size_t elsize, size_t elnem, void* mmfp)
44 {
45  STRHDL *hdl = (STRHDL*)mmfp;
46 
47  return mmioRead(hdl->cfp, (HPSTR) buf, elsize * elnem);
48 }
49 
50 int ogg_mmio_seek(void* mmfp, ogg_int64_t offset, int where)
51 {
52  STRHDL *hdl = (STRHDL*)mmfp;
53 
54  long rc = 0, cur_offset = 0;
55 
56  switch (where) {
57  case SEEK_CUR:
58  {
59  cur_offset = mmioSeek(hdl->cfp, 0, SEEK_CUR);
60 
61  if ( (cur_offset + offset) > (hdl->true_offset + hdl->size) )
62  return -1;
63 
64  rc = mmioSeek(hdl->cfp, cur_offset + (long)offset, SEEK_SET);
65 
66  break;
67  }
68 
69  case SEEK_SET:
70  {
71  if ( offset > hdl->size )
72  return -1;
73 
74  rc = mmioSeek(hdl->cfp, hdl->true_offset + (long)offset, SEEK_SET);
75 
76  break;
77  }
78 
79  case SEEK_END:
80  {
81  rc = mmioSeek(hdl->cfp, hdl->true_offset + hdl->size, SEEK_SET);
82 
83  break;
84  }
85  }
86 
87  if ( rc < 0 )
88  return -1;
89 
90  rc -= hdl->true_offset;
91 
92  return (int)rc;
93 }
94 
95 int ogg_mmio_close(void* mmfp)
96 {
97  // we don't close here so that it's safe to do it ourselves
98  return 0;
99 }
100 
101 long ogg_mmio_tell(void* mmfp)
102 {
103  STRHDL *hdl = (STRHDL*)mmfp;
104 
105  return (mmioSeek(hdl->cfp, 0, SEEK_CUR) - hdl->true_offset);
106 }
107 
108 int OGG_init()
109 {
110  //Setup the cfile_callbacks stucts
111  cfile_callbacks.read_func = ogg_cfread;
112  cfile_callbacks.seek_func = ogg_cfseek;
113  cfile_callbacks.close_func = ogg_cfclose;
114  cfile_callbacks.tell_func = ogg_cftell;
115 
116  mmio_callbacks.read_func = ogg_mmio_read;
117  mmio_callbacks.seek_func = ogg_mmio_seek;
118  mmio_callbacks.close_func= ogg_mmio_close;
119  mmio_callbacks.tell_func = ogg_mmio_tell;
120 
121  return 0;
122 }
int cfread(void *buf, int elsize, int nelem, CFILE *fp)
Definition: cfile.h:28
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: Glext.h:7308
size_t ogg_mmio_read(void *buf, size_t elsize, size_t elnem, void *mmfp)
Definition: ogg.cpp:43
long ogg_mmio_tell(void *mmfp)
Definition: ogg.cpp:101
GLintptr offset
Definition: Glext.h:5497
size_t ogg_cfread(void *buf, size_t elsize, size_t elnem, void *cfile)
Definition: ogg.cpp:21
long mmioSeek(HMMIO hmmio, long lOffset, int iOrigin)
Definition: cfile.h:354
int OGG_init()
Definition: ogg.cpp:108
int ogg_inited
Definition: ogg.cpp:16
int ogg_cfseek(void *cfile, ogg_int64_t offset, int where)
Definition: ogg.cpp:26
ov_callbacks cfile_callbacks
Definition: ogg.cpp:17
int cftell(CFILE *fp)
char * HPSTR
Definition: config.h:108
long mmioRead(HMMIO hmmio, HPSTR pch, long cch)
int ogg_mmio_seek(void *mmfp, ogg_int64_t offset, int where)
Definition: ogg.cpp:50
ov_callbacks mmio_callbacks
Definition: ogg.cpp:18
int ogg_cfclose(void *cfile)
Definition: ogg.cpp:31
long ogg_cftell(void *cfile)
Definition: ogg.cpp:37
int ogg_mmio_close(void *mmfp)
Definition: ogg.cpp:95
int cfseek(CFILE *fp, int offset, int where)