1 /*
2 Copyright © 2020, Luna Nielsen
3 Distributed under the 2-Clause BSD License, see LICENSE file.
4
5 Authors: Luna Nielsen
6 */
7 module vorbisfile;
8 import core.stdc.config;
9
10 alias ogg_int64_t = long;
11 alias ogg_uint64_t = ulong;
12 alias ogg_int32_t = int;
13 alias ogg_uint32_t = uint;
14 alias ogg_int16_t = short;
15 alias ogg_uint16_t = ushort;
16
17 struct vorbis_info {
18 int _version; // Renamed from "version", since that's a keyword in D
19 int channels;
20 int rate;
21 c_long bitrate_upper;
22 c_long bitrate_nominal;
23 c_long bitrate_lower;
24 c_long bitrate_window;
25
26 void *codec_setup;
27 }
28
29 struct vorbis_dsp_state {
30 int analysisp;
31 vorbis_info* vi;
32 float** pcm;
33 float** pcmret;
34 int pcm_storage;
35 int pcm_current;
36 int pcm_returned;
37 int preextrapolate;
38 int eofflag;
39 c_long lW;
40 c_long W;
41 c_long nW;
42 c_long centerW;
43 ogg_int64_t granulepos;
44 ogg_int64_t sequence;
45 ogg_int64_t glue_bits;
46 ogg_int64_t time_bits;
47 ogg_int64_t floor_bits;
48 ogg_int64_t res_bits;
49 void* backend_state;
50 }
51
52 struct vorbis_comment {
53 char** user_comments;
54 int* comment_lengths;
55 int comments;
56 char* vendor;
57 }
58
59 struct alloc_chain {
60 void* ptr;
61 alloc_chain* next;
62 }
63
64 struct vorbis_block {
65 float** pcm;
66 oggpack_buffer opb;
67 c_long lW;
68 c_long W;
69 c_long nW;
70 int pcmend;
71 int mode;
72 int eofflag;
73 ogg_int64_t granulepos;
74 ogg_int64_t sequence;
75 vorbis_dsp_state* vd;
76 void* localstore;
77 c_long localtop;
78 c_long localalloc;
79 c_long totaluse;
80 alloc_chain* reap;
81 c_long glue_bits;
82 c_long time_bits;
83 c_long floor_bits;
84 c_long res_bits;
85 void* internal;
86 }
87
88
89 struct ogg_iovec_t {
90 void* iov_base;
91 size_t iov_len;
92 }
93
94 struct oggpack_buffer {
95 c_long endbyte;
96 int endbit;
97 ubyte* buffer;
98 ubyte* ptr;
99 c_long storage;
100 }
101
102 struct ogg_page {
103 ubyte* header;
104 c_long header_len;
105 ubyte* _body; // originally named "body", but that's a keyword in D.
106 c_long body_len;
107 }
108
109 struct ogg_stream_state {
110 ubyte* body_data;
111 c_long body_storage;
112 c_long body_fill;
113 c_long body_returned;
114 int* lacing_vals;
115 ogg_int64_t* granule_vals;
116 c_long lacing_storage;
117 c_long lacing_fill;
118 c_long lacing_packet;
119 c_long lacing_returned;
120 ubyte[282] header;
121 int header_fill;
122 int e_o_s;
123 int b_o_s;
124 c_long serialno;
125 c_long pageno;
126 ogg_int64_t packetno;
127 ogg_int64_t granulepos;
128 }
129
130 struct ogg_packet {
131 ubyte* packet;
132 c_long bytes;
133 c_long b_o_s;
134 c_long e_o_s;
135 ogg_int64_t granulepos;
136 ogg_int64_t packetno;
137 }
138
139 struct ogg_sync_state {
140 ubyte* data;
141 int storage;
142 int fill;
143 int returned;
144
145 int unsynced;
146 int headerbytes;
147 int bodybytes;
148 }
149
150 struct ov_callbacks {
151 extern(C) nothrow {
152 size_t function(void*, size_t, size_t, void*) read_func;
153 int function(void*, ogg_int64_t, int) seek_func;
154 int function(void*) close_func;
155 c_long function(void*) tell_func;
156 }
157 }
158
159 enum {
160 NOTOPEN =0,
161 PARTOPEN =1,
162 OPENED =2,
163 STREAMSET =3,
164 INITSET =4,
165
166 OV_FALSE = -1,
167 OV_EOF = -2,
168 OV_HOLE = -3,
169 OV_EREAD = -128,
170 OV_EFAULT = -129,
171 OV_EIMPL = -130,
172 OV_EINVAL = -131,
173 OV_ENOTVORBIS = -132,
174 OV_EBADHEADER = -133,
175 OV_EVERSION = -134,
176 OV_ENOTAUDIO = -135,
177 OV_EBADPACKET = -136,
178 OV_EBADLINK = -137,
179 OV_ENOSEEK = -138,
180 }
181
182 struct OggVorbis_File {
183 void* datasource;
184 int seekable;
185 ogg_int64_t offset;
186 ogg_int64_t end;
187 ogg_sync_state oy;
188 int links;
189 ogg_int64_t* offsets;
190 ogg_int64_t* dataoffsets;
191 c_long* serialnos;
192 ogg_int64_t* pcmlengths;
193 vorbis_info* vi;
194 vorbis_comment* vc;
195 ogg_int64_t pcm_offset;
196 int ready_state;
197 c_long current_serialno;
198 int current_link;
199 double bittrack;
200 double samptrack;
201 ogg_stream_state os;
202 vorbis_dsp_state vd;
203 vorbis_block vb;
204 ov_callbacks callbacks;
205 }
206
207 extern(C) @nogc nothrow __gshared:
208 int ov_clear(OggVorbis_File*);
209 int ov_fopen(const(char)*, OggVorbis_File*);
210 int ov_open_callbacks(void* datasource, OggVorbis_File*, const(char)*, c_long, ov_callbacks);
211 int ov_test_callbacks(void*, OggVorbis_File*, const(char)*, c_long, ov_callbacks);
212 int ov_test_open(OggVorbis_File*);
213 c_long ov_bitrate(OggVorbis_File*, int);
214 c_long ov_bitrate_instant(OggVorbis_File*);
215 c_long ov_streams(OggVorbis_File*);
216 c_long ov_seekable(OggVorbis_File*);
217 c_long ov_serialnumber(OggVorbis_File*, int);
218 ogg_int64_t ov_raw_total(OggVorbis_File*, int);
219 ogg_int64_t ov_pcm_total(OggVorbis_File*, int);
220 double ov_time_total(OggVorbis_File*, int);
221 int ov_raw_seek(OggVorbis_File*, ogg_int64_t);
222 int ov_pcm_seek(OggVorbis_File*, ogg_int64_t);
223 int ov_pcm_seek_page(OggVorbis_File*, ogg_int64_t);
224 int ov_time_seek(OggVorbis_File*, double);
225 int ov_time_seek_page(OggVorbis_File*, double);
226 int ov_raw_seek_lap(OggVorbis_File*, ogg_int64_t);
227 int ov_pcm_seek_lap(OggVorbis_File*, ogg_int64_t);
228 int ov_pcm_seek_page_lap(OggVorbis_File*, ogg_int64_t);
229 int ov_time_seek_lap(OggVorbis_File*, double);
230 int ov_time_seek_page_lap(OggVorbis_File*, double);
231 ogg_int64_t ov_raw_tell(OggVorbis_File*);
232 ogg_int64_t ov_pcm_tell(OggVorbis_File*);
233 double ov_time_tell(OggVorbis_File*);
234 vorbis_info* ov_info(OggVorbis_File*, int);
235 vorbis_comment* ov_comment(OggVorbis_File*, int);
236 c_long ov_read_float(OggVorbis_File*, float***, int, int*);
237 c_long ov_read(OggVorbis_File*, byte*, int, int, int, int, int*);
238 int ov_crosslap(OggVorbis_File*, OggVorbis_File*);
239 int ov_halfrate(OggVorbis_File*, int);
240 int ov_halfrate_p(OggVorbis_File*);