The OpenD Programming Language

1 // Ogg Vorbis audio decoder - v1.10 - public domain
2 // http://nothings.org/stb_vorbis/
3 //
4 // Original version written by Sean Barrett in 2007.
5 //
6 // Originally sponsored by RAD Game Tools. Seeking sponsored
7 // by Phillip Bennefall, Marc Andersen, Aaron Baker, Elias Software,
8 // Aras Pranckevicius, and Sean Barrett.
9 //
10 // LICENSE
11 //
12 //   See end of file for license information.
13 //
14 // Limitations:
15 //
16 //   - floor 0 not supported (used in old ogg vorbis files pre-2004)
17 //   - lossless sample-truncation at beginning ignored
18 //   - cannot concatenate multiple vorbis streams
19 //   - sample positions are 32-bit, limiting seekable 192Khz
20 //       files to around 6 hours (Ogg supports 64-bit)
21 //
22 // Feature contributors:
23 //    Dougall Johnson (sample-exact seeking)
24 //
25 // Bugfix/warning contributors:
26 //    Terje Mathisen     Niklas Frykholm     Andy Hill
27 //    Casey Muratori     John Bolton         Gargaj
28 //    Laurent Gomila     Marc LeBlanc        Ronny Chevalier
29 //    Bernhard Wodo      Evan Balster        alxprd@github
30 //    Tom Beaumont       Ingo Leitgeb        Nicolas Guillemot
31 //    Phillip Bennefall  Rohit               Thiago Goulart
32 //    manxorist@github   saga musix
33 //
34 // Partial history:
35 //    1.10    - 2017/03/03 - more robust seeking; fix negative ilog(); clear error in open_memory
36 //    1.09    - 2016/04/04 - back out 'avoid discarding last frame' fix from previous version
37 //    1.08    - 2016/04/02 - fixed multiple warnings; fix setup memory leaks;
38 //                           avoid discarding last frame of audio data
39 //    1.07    - 2015/01/16 - fixed some warnings, fix mingw, const-correct API
40 //                           some more crash fixes when out of memory or with corrupt files
41 //    1.06    - 2015/08/31 - full, correct support for seeking API (Dougall Johnson)
42 //                           some crash fixes when out of memory or with corrupt files
43 //                           fix some inappropriately signed shifts
44 //    1.05    - 2015/04/19 - don't define __forceinline if it's redundant
45 //    1.04    - 2014/08/27 - fix missing const-correct case in API
46 //    1.03    - 2014/08/07 - warning fixes
47 //    1.02    - 2014/07/09 - declare qsort comparison as explicitly _cdecl in Windows
48 //    1.01    - 2014/06/18 - fix stb_vorbis_get_samples_float (interleaved was correct)
49 //    1.0     - 2014/05/26 - fix memory leaks; fix warnings; fix bugs in >2-channel;
50 //                           (API change) report sample rate for decode-full-file funcs
51 //    0.99996 -            - bracket #include <malloc.h> for macintosh compilation
52 //    0.99995 -            - avoid alias-optimization issue in float-to-int conversion
53 //
54 // See end of file for full version history.
55 // D translation by Ketmar // Invisible Vector
56 // stolen by adam and module renamed.
57 /++
58 	Port of stb_vorbis to D. Provides .ogg audio file reading capabilities. See [arsd.simpleaudio] for code that can use this to actually load and play the file.
59 +/
60 module arsd.vorbis;
61 
62 import core.stdc.stdio : FILE;
63 
64 version(Windows)
65 	extern(C) int lrintf(float f) { return cast(int) f; }
66 
67 @system:
68 
69 nothrow /*@trusted*/:
70 @nogc { // code block, as c macro helper is not @nogc; yet it's CTFE-only
71 // import it here, as druntime has no `@nogc` on it (for a reason)
72 private extern(C) void qsort (void* base, size_t nmemb, size_t size, int function(const scope void*, const scope void*) compar);
73 
74 
75 //////////////////////////////////////////////////////////////////////////////
76 //
77 //  HEADER BEGINS HERE
78 //
79 
80 ///////////   THREAD SAFETY
81 
82 // Individual VorbisDecoder handles are not thread-safe; you cannot decode from
83 // them from multiple threads at the same time. However, you can have multiple
84 // VorbisDecoder handles and decode from them independently in multiple thrads.
85 
86 
87 ///////////   MEMORY ALLOCATION
88 
89 // normally stb_vorbis uses malloc() to allocate memory at startup,
90 // and alloca() to allocate temporary memory during a frame on the
91 // stack. (Memory consumption will depend on the amount of setup
92 // data in the file and how you set the compile flags for speed
93 // vs. size. In my test files the maximal-size usage is ~150KB.)
94 //
95 // You can modify the wrapper functions in the source (setup_malloc,
96 // setup_temp_malloc, temp_malloc) to change this behavior, or you
97 // can use a simpler allocation model: you pass in a buffer from
98 // which stb_vorbis will allocate _all_ its memory (including the
99 // temp memory). "open" may fail with a VORBIS_outofmem if you
100 // do not pass in enough data; there is no way to determine how
101 // much you do need except to succeed (at which point you can
102 // query get_info to find the exact amount required. yes I know
103 // this is lame).
104 //
105 // If you pass in a non-null buffer of the type below, allocation
106 // will occur from it as described above. Otherwise just pass null
107 // to use malloc()/alloca()
108 
109 public struct stb_vorbis_alloc {
110   ubyte* alloc_buffer;
111   int alloc_buffer_length_in_bytes;
112 }
113 
114 
115 ///////////   FUNCTIONS USEABLE WITH ALL INPUT MODES
116 
117 /*
118 public struct stb_vorbis_info {
119   uint sample_rate;
120   int channels;
121 
122   uint setup_memory_required;
123   uint setup_temp_memory_required;
124   uint temp_memory_required;
125 
126   int max_frame_size;
127 }
128 */
129 
130 
131 /* ************************************************************************** *
132 // get general information about the file
133 stb_vorbis_info stb_vorbis_get_info (VorbisDecoder f);
134 
135 // get the last error detected (clears it, too)
136 int stb_vorbis_get_error (VorbisDecoder f);
137 
138 // close an ogg vorbis file and free all memory in use
139 void stb_vorbis_close (VorbisDecoder f);
140 
141 // this function returns the offset (in samples) from the beginning of the
142 // file that will be returned by the next decode, if it is known, or -1
143 // otherwise. after a flush_pushdata() call, this may take a while before
144 // it becomes valid again.
145 // NOT WORKING YET after a seek with PULLDATA API
146 int stb_vorbis_get_sample_offset (VorbisDecoder f);
147 
148 // returns the current seek point within the file, or offset from the beginning
149 // of the memory buffer. In pushdata mode it returns 0.
150 uint stb_vorbis_get_file_offset (VorbisDecoder f);
151 
152 
153 ///////////   PUSHDATA API
154 
155 // this API allows you to get blocks of data from any source and hand
156 // them to stb_vorbis. you have to buffer them; stb_vorbis will tell
157 // you how much it used, and you have to give it the rest next time;
158 // and stb_vorbis may not have enough data to work with and you will
159 // need to give it the same data again PLUS more. Note that the Vorbis
160 // specification does not bound the size of an individual frame.
161 
162 // create a vorbis decoder by passing in the initial data block containing
163 //    the ogg&vorbis headers (you don't need to do parse them, just provide
164 //    the first N bytes of the file--you're told if it's not enough, see below)
165 // on success, returns an VorbisDecoder, does not set error, returns the amount of
166 //    data parsed/consumed on this call in *datablock_memory_consumed_in_bytes;
167 // on failure, returns null on error and sets *error, does not change *datablock_memory_consumed
168 // if returns null and *error is VORBIS_need_more_data, then the input block was
169 //       incomplete and you need to pass in a larger block from the start of the file
170 VorbisDecoder stb_vorbis_open_pushdata (
171               ubyte* datablock, int datablock_length_in_bytes,
172               int* datablock_memory_consumed_in_bytes,
173               int* error,
174               stb_vorbis_alloc* alloc_buffer
175             );
176 
177 // decode a frame of audio sample data if possible from the passed-in data block
178 //
179 // return value: number of bytes we used from datablock
180 //
181 // possible cases:
182 //     0 bytes used, 0 samples output (need more data)
183 //     N bytes used, 0 samples output (resynching the stream, keep going)
184 //     N bytes used, M samples output (one frame of data)
185 // note that after opening a file, you will ALWAYS get one N-bytes, 0-sample
186 // frame, because Vorbis always "discards" the first frame.
187 //
188 // Note that on resynch, stb_vorbis will rarely consume all of the buffer,
189 // instead only datablock_length_in_bytes-3 or less. This is because it wants
190 // to avoid missing parts of a page header if they cross a datablock boundary,
191 // without writing state-machiney code to record a partial detection.
192 //
193 // The number of channels returned are stored in *channels (which can be
194 // null--it is always the same as the number of channels reported by
195 // get_info). *output will contain an array of float* buffers, one per
196 // channel. In other words, (*output)[0][0] contains the first sample from
197 // the first channel, and (*output)[1][0] contains the first sample from
198 // the second channel.
199 int stb_vorbis_decode_frame_pushdata (
200       VorbisDecoder f, ubyte* datablock, int datablock_length_in_bytes,
201       int* channels,   // place to write number of float * buffers
202       float*** output, // place to write float ** array of float * buffers
203       int* samples     // place to write number of output samples
204     );
205 
206 // inform stb_vorbis that your next datablock will not be contiguous with
207 // previous ones (e.g. you've seeked in the data); future attempts to decode
208 // frames will cause stb_vorbis to resynchronize (as noted above), and
209 // once it sees a valid Ogg page (typically 4-8KB, as large as 64KB), it
210 // will begin decoding the _next_ frame.
211 //
212 // if you want to seek using pushdata, you need to seek in your file, then
213 // call stb_vorbis_flush_pushdata(), then start calling decoding, then once
214 // decoding is returning you data, call stb_vorbis_get_sample_offset, and
215 // if you don't like the result, seek your file again and repeat.
216 void stb_vorbis_flush_pushdata (VorbisDecoder f);
217 
218 
219 //////////   PULLING INPUT API
220 
221 // This API assumes stb_vorbis is allowed to pull data from a source--
222 // either a block of memory containing the _entire_ vorbis stream, or a
223 // FILE* that you or it create, or possibly some other reading mechanism
224 // if you go modify the source to replace the FILE* case with some kind
225 // of callback to your code. (But if you don't support seeking, you may
226 // just want to go ahead and use pushdata.)
227 
228 // decode an entire file and output the data interleaved into a malloc()ed
229 // buffer stored in *output. The return value is the number of samples
230 // decoded, or -1 if the file could not be opened or was not an ogg vorbis file.
231 // When you're done with it, just free() the pointer returned in *output.
232 int stb_vorbis_decode_filename (const(char)* filename, int* channels, int* sample_rate, short** output);
233 int stb_vorbis_decode_memory (const(ubyte)* mem, int len, int* channels, int* sample_rate, short** output);
234 
235 // create an ogg vorbis decoder from an ogg vorbis stream in memory (note
236 // this must be the entire stream!). on failure, returns null and sets *error
237 VorbisDecoder stb_vorbis_open_memory (const(ubyte)* data, int len, int* error, stb_vorbis_alloc* alloc_buffer);
238 
239 // create an ogg vorbis decoder from a filename via fopen(). on failure,
240 // returns null and sets *error (possibly to VORBIS_file_open_failure).
241 VorbisDecoder stb_vorbis_open_filename (const(char)* filename, int* error, stb_vorbis_alloc* alloc_buffer);
242 
243 // create an ogg vorbis decoder from an open FILE*, looking for a stream at
244 // the _current_ seek point (ftell). on failure, returns null and sets *error.
245 // note that stb_vorbis must "own" this stream; if you seek it in between
246 // calls to stb_vorbis, it will become confused. Morever, if you attempt to
247 // perform stb_vorbis_seek_*() operations on this file, it will assume it
248 // owns the _entire_ rest of the file after the start point. Use the next
249 // function, stb_vorbis_open_file_section(), to limit it.
250 VorbisDecoder stb_vorbis_open_file (FILE* f, int close_handle_on_close, int* error, stb_vorbis_alloc* alloc_buffer);
251 
252 // create an ogg vorbis decoder from an open FILE*, looking for a stream at
253 // the _current_ seek point (ftell); the stream will be of length 'len' bytes.
254 // on failure, returns null and sets *error. note that stb_vorbis must "own"
255 // this stream; if you seek it in between calls to stb_vorbis, it will become
256 // confused.
257 VorbisDecoder stb_vorbis_open_file_section (FILE* f, int close_handle_on_close, int* error, stb_vorbis_alloc* alloc_buffer, uint len);
258 
259 // these functions seek in the Vorbis file to (approximately) 'sample_number'.
260 // after calling seek_frame(), the next call to get_frame_*() will include
261 // the specified sample. after calling stb_vorbis_seek(), the next call to
262 // stb_vorbis_get_samples_* will start with the specified sample. If you
263 // do not need to seek to EXACTLY the target sample when using get_samples_*,
264 // you can also use seek_frame().
265 int stb_vorbis_seek_frame (VorbisDecoder f, uint sample_number);
266 int stb_vorbis_seek (VorbisDecoder f, uint sample_number);
267 
268 // this function is equivalent to stb_vorbis_seek(f, 0)
269 int stb_vorbis_seek_start (VorbisDecoder f);
270 
271 // these functions return the total length of the vorbis stream
272 uint stb_vorbis_stream_length_in_samples (VorbisDecoder f);
273 float stb_vorbis_stream_length_in_seconds (VorbisDecoder f);
274 
275 // decode the next frame and return the number of samples. the number of
276 // channels returned are stored in *channels (which can be null--it is always
277 // the same as the number of channels reported by get_info). *output will
278 // contain an array of float* buffers, one per channel. These outputs will
279 // be overwritten on the next call to stb_vorbis_get_frame_*.
280 //
281 // You generally should not intermix calls to stb_vorbis_get_frame_*()
282 // and stb_vorbis_get_samples_*(), since the latter calls the former.
283 int stb_vorbis_get_frame_float (VorbisDecoder f, int* channels, float*** output);
284 
285 // decode the next frame and return the number of *samples* per channel.
286 // Note that for interleaved data, you pass in the number of shorts (the
287 // size of your array), but the return value is the number of samples per
288 // channel, not the total number of samples.
289 //
290 // The data is coerced to the number of channels you request according to the
291 // channel coercion rules (see below). You must pass in the size of your
292 // buffer(s) so that stb_vorbis will not overwrite the end of the buffer.
293 // The maximum buffer size needed can be gotten from get_info(); however,
294 // the Vorbis I specification implies an absolute maximum of 4096 samples
295 // per channel.
296 int stb_vorbis_get_frame_short_interleaved (VorbisDecoder f, int num_c, short* buffer, int num_shorts);
297 int stb_vorbis_get_frame_short (VorbisDecoder f, int num_c, short** buffer, int num_samples);
298 
299 // Channel coercion rules:
300 //    Let M be the number of channels requested, and N the number of channels present,
301 //    and Cn be the nth channel; let stereo L be the sum of all L and center channels,
302 //    and stereo R be the sum of all R and center channels (channel assignment from the
303 //    vorbis spec).
304 //        M    N       output
305 //        1    k      sum(Ck) for all k
306 //        2    *      stereo L, stereo R
307 //        k    l      k > l, the first l channels, then 0s
308 //        k    l      k <= l, the first k channels
309 //    Note that this is not _good_ surround etc. mixing at all! It's just so
310 //    you get something useful.
311 
312 // gets num_samples samples, not necessarily on a frame boundary--this requires
313 // buffering so you have to supply the buffers. DOES NOT APPLY THE COERCION RULES.
314 // Returns the number of samples stored per channel; it may be less than requested
315 // at the end of the file. If there are no more samples in the file, returns 0.
316 int stb_vorbis_get_samples_float_interleaved (VorbisDecoder f, int channels, float* buffer, int num_floats);
317 int stb_vorbis_get_samples_float (VorbisDecoder f, int channels, float** buffer, int num_samples);
318 
319 // gets num_samples samples, not necessarily on a frame boundary--this requires
320 // buffering so you have to supply the buffers. Applies the coercion rules above
321 // to produce 'channels' channels. Returns the number of samples stored per channel;
322 // it may be less than requested at the end of the file. If there are no more
323 // samples in the file, returns 0.
324 int stb_vorbis_get_samples_short_interleaved (VorbisDecoder f, int channels, short* buffer, int num_shorts);
325 int stb_vorbis_get_samples_short (VorbisDecoder f, int channels, short** buffer, int num_samples);
326 */
327 
328 ////////   ERROR CODES
329 
330 public enum STBVorbisError {
331   no_error,
332 
333   need_more_data = 1,    // not a real error
334 
335   invalid_api_mixing,    // can't mix API modes
336   outofmem,              // not enough memory
337   feature_not_supported, // uses floor 0
338   too_many_channels,     // STB_VORBIS_MAX_CHANNELS is too small
339   file_open_failure,     // fopen() failed
340   seek_without_length,   // can't seek in unknown-length file
341 
342   unexpected_eof = 10,   // file is truncated?
343   seek_invalid,          // seek past EOF
344 
345   // decoding errors (corrupt/invalid stream) -- you probably
346   // don't care about the exact details of these
347 
348   // vorbis errors:
349   invalid_setup = 20,
350   invalid_stream,
351 
352   // ogg errors:
353   missing_capture_pattern = 30,
354   invalid_stream_structure_version,
355   continued_packet_flag_invalid,
356   incorrect_stream_serial_number,
357   invalid_first_page,
358   bad_packet_type,
359   cant_find_last_page,
360   seek_failed,
361 }
362 //
363 //  HEADER ENDS HERE
364 //
365 //////////////////////////////////////////////////////////////////////////////
366 
367 
368 // global configuration settings (e.g. set these in the project/makefile),
369 // or just set them in this file at the top (although ideally the first few
370 // should be visible when the header file is compiled too, although it's not
371 // crucial)
372 
373 // STB_VORBIS_NO_INTEGER_CONVERSION
374 //     does not compile the code for converting audio sample data from
375 //     float to integer (implied by STB_VORBIS_NO_PULLDATA_API)
376 //version = STB_VORBIS_NO_INTEGER_CONVERSION;
377 
378 // STB_VORBIS_NO_FAST_SCALED_FLOAT
379 //      does not use a fast float-to-int trick to accelerate float-to-int on
380 //      most platforms which requires endianness be defined correctly.
381 //version = STB_VORBIS_NO_FAST_SCALED_FLOAT;
382 
383 // STB_VORBIS_MAX_CHANNELS [number]
384 //     globally define this to the maximum number of channels you need.
385 //     The spec does not put a restriction on channels except that
386 //     the count is stored in a byte, so 255 is the hard limit.
387 //     Reducing this saves about 16 bytes per value, so using 16 saves
388 //     (255-16)*16 or around 4KB. Plus anything other memory usage
389 //     I forgot to account for. Can probably go as low as 8 (7.1 audio),
390 //     6 (5.1 audio), or 2 (stereo only).
391 enum STB_VORBIS_MAX_CHANNELS = 16; // enough for anyone?
392 
393 // STB_VORBIS_PUSHDATA_CRC_COUNT [number]
394 //     after a flush_pushdata(), stb_vorbis begins scanning for the
395 //     next valid page, without backtracking. when it finds something
396 //     that looks like a page, it streams through it and verifies its
397 //     CRC32. Should that validation fail, it keeps scanning. But it's
398 //     possible that _while_ streaming through to check the CRC32 of
399 //     one candidate page, it sees another candidate page. This #define
400 //     determines how many "overlapping" candidate pages it can search
401 //     at once. Note that "real" pages are typically ~4KB to ~8KB, whereas
402 //     garbage pages could be as big as 64KB, but probably average ~16KB.
403 //     So don't hose ourselves by scanning an apparent 64KB page and
404 //     missing a ton of real ones in the interim; so minimum of 2
405 enum STB_VORBIS_PUSHDATA_CRC_COUNT = 4;
406 
407 // STB_VORBIS_FAST_HUFFMAN_LENGTH [number]
408 //     sets the log size of the huffman-acceleration table.  Maximum
409 //     supported value is 24. with larger numbers, more decodings are O(1),
410 //     but the table size is larger so worse cache missing, so you'll have
411 //     to probe (and try multiple ogg vorbis files) to find the sweet spot.
412 enum STB_VORBIS_FAST_HUFFMAN_LENGTH = 10;
413 
414 // STB_VORBIS_FAST_BINARY_LENGTH [number]
415 //     sets the log size of the binary-search acceleration table. this
416 //     is used in similar fashion to the fast-huffman size to set initial
417 //     parameters for the binary search
418 
419 // STB_VORBIS_FAST_HUFFMAN_INT
420 //     The fast huffman tables are much more efficient if they can be
421 //     stored as 16-bit results instead of 32-bit results. This restricts
422 //     the codebooks to having only 65535 possible outcomes, though.
423 //     (At least, accelerated by the huffman table.)
424 //version = STB_VORBIS_FAST_HUFFMAN_INT;
425 version(STB_VORBIS_FAST_HUFFMAN_INT) {} else version = STB_VORBIS_FAST_HUFFMAN_SHORT;
426 
427 // STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH
428 //     If the 'fast huffman' search doesn't succeed, then stb_vorbis falls
429 //     back on binary searching for the correct one. This requires storing
430 //     extra tables with the huffman codes in sorted order. Defining this
431 //     symbol trades off space for speed by forcing a linear search in the
432 //     non-fast case, except for "sparse" codebooks.
433 //version = STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH;
434 
435 // STB_VORBIS_DIVIDES_IN_RESIDUE
436 //     stb_vorbis precomputes the result of the scalar residue decoding
437 //     that would otherwise require a divide per chunk. you can trade off
438 //     space for time by defining this symbol.
439 //version = STB_VORBIS_DIVIDES_IN_RESIDUE;
440 
441 // STB_VORBIS_DIVIDES_IN_CODEBOOK
442 //     vorbis VQ codebooks can be encoded two ways: with every case explicitly
443 //     stored, or with all elements being chosen from a small range of values,
444 //     and all values possible in all elements. By default, stb_vorbis expands
445 //     this latter kind out to look like the former kind for ease of decoding,
446 //     because otherwise an integer divide-per-vector-element is required to
447 //     unpack the index. If you define STB_VORBIS_DIVIDES_IN_CODEBOOK, you can
448 //     trade off storage for speed.
449 //version = STB_VORBIS_DIVIDES_IN_CODEBOOK;
450 
451 version(STB_VORBIS_CODEBOOK_SHORTS) static assert(0, "STB_VORBIS_CODEBOOK_SHORTS is no longer supported as it produced incorrect results for some input formats");
452 
453 // STB_VORBIS_DIVIDE_TABLE
454 //     this replaces small integer divides in the floor decode loop with
455 //     table lookups. made less than 1% difference, so disabled by default.
456 //version = STB_VORBIS_DIVIDE_TABLE;
457 
458 // STB_VORBIS_NO_DEFER_FLOOR
459 //     Normally we only decode the floor without synthesizing the actual
460 //     full curve. We can instead synthesize the curve immediately. This
461 //     requires more memory and is very likely slower, so I don't think
462 //     you'd ever want to do it except for debugging.
463 //version = STB_VORBIS_NO_DEFER_FLOOR;
464 //version(STB_VORBIS_CODEBOOK_FLOATS) static assert(0);
465 
466 
467 // ////////////////////////////////////////////////////////////////////////// //
468 private:
469 static assert(STB_VORBIS_MAX_CHANNELS <= 256, "Value of STB_VORBIS_MAX_CHANNELS outside of allowed range");
470 static assert(STB_VORBIS_FAST_HUFFMAN_LENGTH <= 24, "Value of STB_VORBIS_FAST_HUFFMAN_LENGTH outside of allowed range");
471 
472 enum MAX_BLOCKSIZE_LOG = 13; // from specification
473 enum MAX_BLOCKSIZE = (1 << MAX_BLOCKSIZE_LOG);
474 
475 
476 alias codetype = float;
477 
478 // @NOTE
479 //
480 // Some arrays below are tagged "//varies", which means it's actually
481 // a variable-sized piece of data, but rather than malloc I assume it's
482 // small enough it's better to just allocate it all together with the
483 // main thing
484 //
485 // Most of the variables are specified with the smallest size I could pack
486 // them into. It might give better performance to make them all full-sized
487 // integers. It should be safe to freely rearrange the structures or change
488 // the sizes larger--nothing relies on silently truncating etc., nor the
489 // order of variables.
490 
491 enum FAST_HUFFMAN_TABLE_SIZE = (1<<STB_VORBIS_FAST_HUFFMAN_LENGTH);
492 enum FAST_HUFFMAN_TABLE_MASK = (FAST_HUFFMAN_TABLE_SIZE-1);
493 
494 struct Codebook {
495   int dimensions, entries;
496   ubyte* codeword_lengths;
497   float minimum_value;
498   float delta_value;
499   ubyte value_bits;
500   ubyte lookup_type;
501   ubyte sequence_p;
502   ubyte sparse;
503   uint lookup_values;
504   codetype* multiplicands;
505   uint *codewords;
506   version(STB_VORBIS_FAST_HUFFMAN_SHORT) {
507     short[FAST_HUFFMAN_TABLE_SIZE] fast_huffman;
508   } else {
509     int[FAST_HUFFMAN_TABLE_SIZE] fast_huffman;
510   }
511   uint* sorted_codewords;
512   int* sorted_values;
513   int sorted_entries;
514 }
515 
516 struct Floor0 {
517   ubyte order;
518   ushort rate;
519   ushort bark_map_size;
520   ubyte amplitude_bits;
521   ubyte amplitude_offset;
522   ubyte number_of_books;
523   ubyte[16] book_list; // varies
524 }
525 
526 struct Floor1 {
527   ubyte partitions;
528   ubyte[32] partition_class_list; // varies
529   ubyte[16] class_dimensions; // varies
530   ubyte[16] class_subclasses; // varies
531   ubyte[16] class_masterbooks; // varies
532   short[8][16] subclass_books; // varies
533   ushort[31*8+2] Xlist; // varies
534   ubyte[31*8+2] sorted_order;
535   ubyte[2][31*8+2] neighbors;
536   ubyte floor1_multiplier;
537   ubyte rangebits;
538   int values;
539 }
540 
541 union Floor {
542   Floor0 floor0;
543   Floor1 floor1;
544 }
545 
546 struct Residue {
547   uint begin, end;
548   uint part_size;
549   ubyte classifications;
550   ubyte classbook;
551   ubyte** classdata;
552   //int16 (*residue_books)[8];
553   short[8]* residue_books;
554 }
555 
556 struct MappingChannel {
557   ubyte magnitude;
558   ubyte angle;
559   ubyte mux;
560 }
561 
562 struct Mapping {
563   ushort coupling_steps;
564   MappingChannel* chan;
565   ubyte submaps;
566   ubyte[15] submap_floor; // varies
567   ubyte[15] submap_residue; // varies
568 }
569 
570 struct Mode {
571   ubyte blockflag;
572   ubyte mapping;
573   ushort windowtype;
574   ushort transformtype;
575 }
576 
577 struct CRCscan {
578   uint goal_crc;   // expected crc if match
579   int bytes_left;  // bytes left in packet
580   uint crc_so_far; // running crc
581   int bytes_done;  // bytes processed in _current_ chunk
582   uint sample_loc; // granule pos encoded in page
583 }
584 
585 struct ProbedPage {
586   uint page_start, page_end;
587   uint last_decoded_sample;
588 }
589 
590 private int error (VorbisDecoder f, STBVorbisError e) {
591   f.error = e;
592   if (!f.eof && e != STBVorbisError.need_more_data) {
593     // import std.stdio; debug writeln(e);
594     f.error = e; // breakpoint for debugging
595   }
596   return 0;
597 }
598 
599 // these functions are used for allocating temporary memory
600 // while decoding. if you can afford the stack space, use
601 // alloca(); otherwise, provide a temp buffer and it will
602 // allocate out of those.
603 uint temp_alloc_save (VorbisDecoder f) nothrow @nogc { static if (__VERSION__ > 2067) pragma(inline, true); return f.alloc.tempSave(f); }
604 void temp_alloc_restore (VorbisDecoder f, uint p) nothrow @nogc { static if (__VERSION__ > 2067) pragma(inline, true); f.alloc.tempRestore(p, f); }
605 void temp_free (VorbisDecoder f, void* p) nothrow @nogc {}
606 /*
607 T* temp_alloc(T) (VorbisDecoder f, uint count) nothrow @nogc {
608   auto res = f.alloc.alloc(count*T.sizeof, f);
609   return cast(T*)res;
610 }
611 */
612 
613 /+
614 enum array_size_required(string count, string size) = q{((${count})*((void*).sizeof+(${size})))}.cmacroFixVars!("count", "size")(count, size);
615 
616 // has to be a mixin, due to `alloca`
617 template temp_alloc(string size) {
618   enum temp_alloc = q{(f.alloc.alloc_buffer ? setup_temp_malloc(f, (${size})) : alloca(${size}))}.cmacroFixVars!("size")(size);
619 }
620 
621 // has to be a mixin, due to `alloca`
622 template temp_block_array(string count, string size) {
623   enum temp_block_array = q{(make_block_array(${tam}, (${count}), (${size})))}
624     .cmacroFixVars!("count", "size", "tam")(count, size, temp_alloc!(array_size_required!(count, size)));
625 }
626 +/
627 enum array_size_required(string count, string size) = q{((${count})*((void*).sizeof+(${size})))}.cmacroFixVars!("count", "size")(count, size);
628 
629 template temp_alloc(string size) {
630   enum temp_alloc = q{alloca(${size})}.cmacroFixVars!("size")(size);
631 }
632 
633 template temp_block_array(string count, string size) {
634   enum temp_block_array = q{(make_block_array(${tam}, (${count}), (${size})))}
635     .cmacroFixVars!("count", "size", "tam")(count, size, temp_alloc!(array_size_required!(count, size)));
636 }
637 
638 /*
639 T** temp_block_array(T) (VorbisDecoder f, uint count, uint size) {
640   size *= T.sizeof;
641   auto mem = f.alloc.alloc(count*(void*).sizeof+size, f);
642   if (mem !is null) make_block_array(mem, count, size);
643   return cast(T**)mem;
644 }
645 */
646 
647 // given a sufficiently large block of memory, make an array of pointers to subblocks of it
648 private void* make_block_array (void* mem, int count, int size) {
649   void** p = cast(void**)mem;
650   char* q = cast(char*)(p+count);
651   foreach (immutable i; 0..count) {
652     p[i] = q;
653     q += size;
654   }
655   return p;
656 }
657 
658 private T* setup_malloc(T) (VorbisDecoder f, uint sz) {
659   sz *= T.sizeof;
660   /*
661   f.setup_memory_required += sz;
662   if (f.alloc.alloc_buffer) {
663     void* p = cast(char*)f.alloc.alloc_buffer+f.setup_offset;
664     if (f.setup_offset+sz > f.temp_offset) return null;
665     f.setup_offset += sz;
666     return cast(T*)p;
667   }
668   */
669   auto res = f.alloc.alloc(sz+8, f); // +8 to compensate dmd codegen bug: it can read dword(qword?) when told to read only byte
670   if (res !is null) {
671     import core.stdc.string : memset;
672     memset(res, 0, sz+8);
673   }
674   return cast(T*)res;
675 }
676 
677 private void setup_free (VorbisDecoder f, void* p) {
678   //if (f.alloc.alloc_buffer) return; // do nothing; setup mem is a stack
679   if (p !is null) f.alloc.free(p, f);
680 }
681 
682 private void* setup_temp_malloc (VorbisDecoder f, uint sz) {
683   auto res = f.alloc.allocTemp(sz+8, f); // +8 to compensate dmd codegen bug: it can read dword(qword?) when told to read only byte
684   if (res !is null) {
685     import core.stdc.string : memset;
686     memset(res, 0, sz+8);
687   }
688   return res;
689 }
690 
691 private void setup_temp_free (VorbisDecoder f, void* p, uint sz) {
692   if (p !is null) f.alloc.freeTemp(p, (sz ? sz : 1)+8, f); // +8 to compensate dmd codegen bug: it can read dword(qword?) when told to read only byte
693 }
694 
695 immutable uint[256] crc_table;
696 shared static this () {
697   enum CRC32_POLY = 0x04c11db7; // from spec
698   // init crc32 table
699   foreach (uint i; 0..256) {
700     uint s = i<<24;
701     foreach (immutable _; 0..8) s = (s<<1)^(s >= (1U<<31) ? CRC32_POLY : 0);
702     crc_table[i] = s;
703   }
704 }
705 
706 uint crc32_update (uint crc, ubyte b) {
707   static if (__VERSION__ > 2067) pragma(inline, true);
708   return (crc<<8)^crc_table[b^(crc>>24)];
709 }
710 
711 // used in setup, and for huffman that doesn't go fast path
712 private uint bit_reverse (uint n) {
713   static if (__VERSION__ > 2067) pragma(inline, true);
714   n = ((n&0xAAAAAAAA)>>1)|((n&0x55555555)<<1);
715   n = ((n&0xCCCCCCCC)>>2)|((n&0x33333333)<<2);
716   n = ((n&0xF0F0F0F0)>>4)|((n&0x0F0F0F0F)<<4);
717   n = ((n&0xFF00FF00)>>8)|((n&0x00FF00FF)<<8);
718   return (n>>16)|(n<<16);
719 }
720 
721 private float square (float x) {
722   static if (__VERSION__ > 2067) pragma(inline, true);
723   return x*x;
724 }
725 
726 // this is a weird definition of log2() for which log2(1) = 1, log2(2) = 2, log2(4) = 3
727 // as required by the specification. fast(?) implementation from stb.h
728 // @OPTIMIZE: called multiple times per-packet with "constants"; move to setup
729 immutable byte[16] log2_4 = [0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4];
730 private int ilog (int n) {
731   //static if (__VERSION__ > 2067) pragma(inline, true);
732   if (n < 0) return 0; // signed n returns 0
733   // 2 compares if n < 16, 3 compares otherwise (4 if signed or n > 1<<29)
734   if (n < (1<<14)) {
735     if (n < (1<<4)) return 0+log2_4[n];
736     if (n < (1<<9)) return 5+log2_4[n>>5];
737     return 10+log2_4[n>>10];
738   } else if (n < (1<<24)) {
739     if (n < (1<<19)) return 15+log2_4[n>>15];
740     return 20+log2_4[n>>20];
741   } else {
742     if (n < (1<<29)) return 25+log2_4[n>>25];
743     return 30+log2_4[n>>30];
744   }
745 }
746 
747 
748 // code length assigned to a value with no huffman encoding
749 enum NO_CODE = 255;
750 
751 /////////////////////// LEAF SETUP FUNCTIONS //////////////////////////
752 //
753 // these functions are only called at setup, and only a few times per file
754 private float float32_unpack (uint x) {
755   import core.math : ldexp;
756   //static if (__VERSION__ > 2067) pragma(inline, true);
757   // from the specification
758   uint mantissa = x&0x1fffff;
759   uint sign = x&0x80000000;
760   uint exp = (x&0x7fe00000)>>21;
761   double res = (sign ? -cast(double)mantissa : cast(double)mantissa);
762   return cast(float)ldexp(cast(float)res, cast(int)exp-788);
763 }
764 
765 // zlib & jpeg huffman tables assume that the output symbols
766 // can either be arbitrarily arranged, or have monotonically
767 // increasing frequencies--they rely on the lengths being sorted;
768 // this makes for a very simple generation algorithm.
769 // vorbis allows a huffman table with non-sorted lengths. This
770 // requires a more sophisticated construction, since symbols in
771 // order do not map to huffman codes "in order".
772 private void add_entry (Codebook* c, uint huff_code, int symbol, int count, ubyte len, uint* values) {
773   if (!c.sparse) {
774     c.codewords[symbol] = huff_code;
775   } else {
776     c.codewords[count] = huff_code;
777     c.codeword_lengths[count] = len;
778     values[count] = symbol;
779   }
780 }
781 
782 private int compute_codewords (Codebook* c, ubyte* len, int n, uint* values) {
783   import core.stdc.string : memset;
784 
785   int i, k, m = 0;
786   uint[32] available;
787 
788   memset(available.ptr, 0, available.sizeof);
789   // find the first entry
790   for (k = 0; k < n; ++k) if (len[k] < NO_CODE) break;
791   if (k == n) { assert(c.sorted_entries == 0); return true; }
792   // add to the list
793   add_entry(c, 0, k, m++, len[k], values);
794   // add all available leaves
795   for (i = 1; i <= len[k]; ++i) available[i] = 1U<<(32-i);
796   // note that the above code treats the first case specially,
797   // but it's really the same as the following code, so they
798   // could probably be combined (except the initial code is 0,
799   // and I use 0 in available[] to mean 'empty')
800   for (i = k+1; i < n; ++i) {
801     uint res;
802     int z = len[i];
803     if (z == NO_CODE) continue;
804     // find lowest available leaf (should always be earliest,
805     // which is what the specification calls for)
806     // note that this property, and the fact we can never have
807     // more than one free leaf at a given level, isn't totally
808     // trivial to prove, but it seems true and the assert never
809     // fires, so!
810     while (z > 0 && !available[z]) --z;
811     if (z == 0) return false;
812     res = available[z];
813     assert(z >= 0 && z < 32);
814     available[z] = 0;
815     ubyte xxx = len[i];
816     add_entry(c,
817       bit_reverse(res),
818       i,
819       m++,
820       xxx, // dmd bug: it reads 4 bytes without temp
821       values);
822     // propogate availability up the tree
823     if (z != len[i]) {
824       assert(len[i] >= 0 && len[i] < 32);
825       for (int y = len[i]; y > z; --y) {
826         assert(available[y] == 0);
827         available[y] = res+(1<<(32-y));
828       }
829     }
830   }
831   return true;
832 }
833 
834 // accelerated huffman table allows fast O(1) match of all symbols
835 // of length <= STB_VORBIS_FAST_HUFFMAN_LENGTH
836 private void compute_accelerated_huffman (Codebook* c) {
837   //for (i=0; i < FAST_HUFFMAN_TABLE_SIZE; ++i) c.fast_huffman.ptr[i] = -1;
838   c.fast_huffman.ptr[0..FAST_HUFFMAN_TABLE_SIZE] = -1;
839   auto len = (c.sparse ? c.sorted_entries : c.entries);
840   version(STB_VORBIS_FAST_HUFFMAN_SHORT) {
841     if (len > 32767) len = 32767; // largest possible value we can encode!
842   }
843   foreach (uint i; 0..len) {
844     if (c.codeword_lengths[i] <= STB_VORBIS_FAST_HUFFMAN_LENGTH) {
845       uint z = (c.sparse ? bit_reverse(c.sorted_codewords[i]) : c.codewords[i]);
846       // set table entries for all bit combinations in the higher bits
847       while (z < FAST_HUFFMAN_TABLE_SIZE) {
848         c.fast_huffman.ptr[z] = cast(typeof(c.fast_huffman[0]))i; //k8
849         z += 1<<c.codeword_lengths[i];
850       }
851     }
852   }
853 }
854 
855 extern(C) int uint32_compare (const scope void* p, const scope void* q) {
856   uint x = *cast(uint*)p;
857   uint y = *cast(uint*)q;
858   return (x < y ? -1 : x > y);
859 }
860 
861 private int include_in_sort (Codebook* c, uint len) {
862   if (c.sparse) { assert(len != NO_CODE); return true; }
863   if (len == NO_CODE) return false;
864   if (len > STB_VORBIS_FAST_HUFFMAN_LENGTH) return true;
865   return false;
866 }
867 
868 // if the fast table above doesn't work, we want to binary
869 // search them... need to reverse the bits
870 private void compute_sorted_huffman (Codebook* c, ubyte* lengths, uint* values) {
871   // build a list of all the entries
872   // OPTIMIZATION: don't include the short ones, since they'll be caught by FAST_HUFFMAN.
873   // this is kind of a frivolous optimization--I don't see any performance improvement,
874   // but it's like 4 extra lines of code, so.
875   if (!c.sparse) {
876     int k = 0;
877     foreach (uint i; 0..c.entries) if (include_in_sort(c, lengths[i])) c.sorted_codewords[k++] = bit_reverse(c.codewords[i]);
878     assert(k == c.sorted_entries);
879   } else {
880     foreach (uint i; 0..c.sorted_entries) c.sorted_codewords[i] = bit_reverse(c.codewords[i]);
881   }
882 
883   qsort(c.sorted_codewords, c.sorted_entries, (c.sorted_codewords[0]).sizeof, &uint32_compare);
884   c.sorted_codewords[c.sorted_entries] = 0xffffffff;
885 
886   auto len = (c.sparse ? c.sorted_entries : c.entries);
887   // now we need to indicate how they correspond; we could either
888   //   #1: sort a different data structure that says who they correspond to
889   //   #2: for each sorted entry, search the original list to find who corresponds
890   //   #3: for each original entry, find the sorted entry
891   // #1 requires extra storage, #2 is slow, #3 can use binary search!
892   foreach (uint i; 0..len) {
893     auto huff_len = (c.sparse ? lengths[values[i]] : lengths[i]);
894     if (include_in_sort(c, huff_len)) {
895       uint code = bit_reverse(c.codewords[i]);
896       int x = 0, n = c.sorted_entries;
897       while (n > 1) {
898         // invariant: sc[x] <= code < sc[x+n]
899         int m = x+(n>>1);
900         if (c.sorted_codewords[m] <= code) {
901           x = m;
902           n -= (n>>1);
903         } else {
904           n >>= 1;
905         }
906       }
907       assert(c.sorted_codewords[x] == code);
908       if (c.sparse) {
909         c.sorted_values[x] = values[i];
910         c.codeword_lengths[x] = huff_len;
911       } else {
912         c.sorted_values[x] = i;
913       }
914     }
915   }
916 }
917 
918 // only run while parsing the header (3 times)
919 private int vorbis_validate (const(void)* data) {
920   static if (__VERSION__ > 2067) pragma(inline, true);
921   immutable char[6] vorbis = "vorbis";
922   return ((cast(char*)data)[0..6] == vorbis[]);
923 }
924 
925 // called from setup only, once per code book
926 // (formula implied by specification)
927 private int lookup1_values (int entries, int dim) {
928   import core.stdc.math : lrintf;
929   import std.math : floor, exp, pow, log;
930   int r = cast(int)lrintf(floor(exp(cast(float)log(cast(float)entries)/dim)));
931   if (lrintf(floor(pow(cast(float)r+1, dim))) <= entries) ++r; // (int) cast for MinGW warning; floor() to avoid _ftol() when non-CRT
932   assert(pow(cast(float)r+1, dim) > entries);
933   assert(lrintf(floor(pow(cast(float)r, dim))) <= entries); // (int), floor() as above
934   return r;
935 }
936 
937 // called twice per file
938 private void compute_twiddle_factors (int n, float* A, float* B, float* C) {
939   import std.math : cos, sin, PI;
940   int n4 = n>>2, n8 = n>>3;
941   int k, k2;
942   for (k = k2 = 0; k < n4; ++k, k2 += 2) {
943     A[k2  ] = cast(float) cos(4*k*PI/n);
944     A[k2+1] = cast(float)-sin(4*k*PI/n);
945     B[k2  ] = cast(float) cos((k2+1)*PI/n/2)*0.5f;
946     B[k2+1] = cast(float) sin((k2+1)*PI/n/2)*0.5f;
947   }
948   for (k = k2 = 0; k < n8; ++k, k2 += 2) {
949     C[k2  ] = cast(float) cos(2*(k2+1)*PI/n);
950     C[k2+1] = cast(float)-sin(2*(k2+1)*PI/n);
951   }
952 }
953 
954 private void compute_window (int n, float* window) {
955   import std.math : sin, PI;
956   int n2 = n>>1;
957   foreach (int i; 0..n2) *window++ = cast(float)sin(0.5*PI*square(cast(float)sin((i-0+0.5)/n2*0.5*PI)));
958 }
959 
960 private void compute_bitreverse (int n, ushort* rev) {
961   int ld = ilog(n)-1; // ilog is off-by-one from normal definitions
962   int n8 = n>>3;
963   foreach (int i; 0..n8) *rev++ = cast(ushort)((bit_reverse(i)>>(32-ld+3))<<2); //k8
964 }
965 
966 private int init_blocksize (VorbisDecoder f, int b, int n) {
967   int n2 = n>>1, n4 = n>>2, n8 = n>>3;
968   f.A[b] = setup_malloc!float(f, n2);
969   f.B[b] = setup_malloc!float(f, n2);
970   f.C[b] = setup_malloc!float(f, n4);
971   if (f.A[b] is null || f.B[b] is null || f.C[b] is null) return error(f, STBVorbisError.outofmem);
972   compute_twiddle_factors(n, f.A[b], f.B[b], f.C[b]);
973   f.window[b] = setup_malloc!float(f, n2);
974   if (f.window[b] is null) return error(f, STBVorbisError.outofmem);
975   compute_window(n, f.window[b]);
976   f.bit_reverse[b] = setup_malloc!ushort(f, n8);
977   if (f.bit_reverse[b] is null) return error(f, STBVorbisError.outofmem);
978   compute_bitreverse(n, f.bit_reverse[b]);
979   return true;
980 }
981 
982 private void neighbors (ushort* x, int n, ushort* plow, ushort* phigh) {
983   int low = -1;
984   int high = 65536;
985   assert(n >= 0 && n <= ushort.max);
986   foreach (ushort i; 0..cast(ushort)n) {
987     if (x[i] > low  && x[i] < x[n]) { *plow = i; low = x[i]; }
988     if (x[i] < high && x[i] > x[n]) { *phigh = i; high = x[i]; }
989   }
990 }
991 
992 // this has been repurposed so y is now the original index instead of y
993 struct Point {
994   ushort x, y;
995 }
996 
997 extern(C) int point_compare (const scope void *p, const scope void *q) {
998   auto a = cast(const(Point)*)p;
999   auto b = cast(const(Point)*)q;
1000   return (a.x < b.x ? -1 : a.x > b.x);
1001 }
1002 /////////////////////// END LEAF SETUP FUNCTIONS //////////////////////////
1003 
1004 // ///////////////////////////////////////////////////////////////////// //
1005 private ubyte get8 (VorbisDecoder f) {
1006   ubyte b = void;
1007   if (!f.eof) {
1008     if (f.rawRead((&b)[0..1]) != 1) { f.eof = true; b = 0; }
1009   }
1010   return b;
1011 }
1012 
1013 private uint get32 (VorbisDecoder f) {
1014   uint x = 0;
1015   if (!f.eof) {
1016     version(LittleEndian) {
1017       if (f.rawRead((&x)[0..1]) != x.sizeof) { f.eof = true; x = 0; }
1018     } else {
1019       x = get8(f);
1020       x |= cast(uint)get8(f)<<8;
1021       x |= cast(uint)get8(f)<<16;
1022       x |= cast(uint)get8(f)<<24;
1023     }
1024   }
1025   return x;
1026 }
1027 
1028 private bool getn (VorbisDecoder f, void* data, int n) {
1029   if (f.eof || n < 0) return false;
1030   if (n == 0) return true;
1031   if (f.rawRead(data[0..n]) != n) { f.eof = true; return false; }
1032   return true;
1033 }
1034 
1035 private void skip (VorbisDecoder f, int n) {
1036   if (f.eof || n == 0) return;
1037   f.rawSkip(n);
1038 }
1039 
1040 private void set_file_offset (VorbisDecoder f, uint loc) {
1041   /+if (f.push_mode) return;+/
1042   f.eof = false;
1043   if (loc >= 0x80000000) { f.eof = true; return; }
1044   f.rawSeek(loc);
1045 }
1046 
1047 
1048 immutable char[4] ogg_page_header = "OggS"; //[ 0x4f, 0x67, 0x67, 0x53 ];
1049 
1050 private bool capture_pattern (VorbisDecoder f) {
1051   static if (__VERSION__ > 2067) pragma(inline, true);
1052   char[4] sign = void;
1053   if (!getn(f, sign.ptr, 4)) return false;
1054   return (sign == "OggS");
1055 }
1056 
1057 enum PAGEFLAG_continued_packet = 1;
1058 enum PAGEFLAG_first_page = 2;
1059 enum PAGEFLAG_last_page = 4;
1060 
1061 private int start_page_no_capturepattern (VorbisDecoder f) {
1062   uint loc0, loc1, n;
1063   // stream structure version
1064   if (get8(f) != 0) return error(f, STBVorbisError.invalid_stream_structure_version);
1065   // header flag
1066   f.page_flag = get8(f);
1067   // absolute granule position
1068   loc0 = get32(f);
1069   loc1 = get32(f);
1070   // @TODO: validate loc0, loc1 as valid positions?
1071   // stream serial number -- vorbis doesn't interleave, so discard
1072   get32(f);
1073   //if (f.serial != get32(f)) return error(f, STBVorbisError.incorrect_stream_serial_number);
1074   // page sequence number
1075   n = get32(f);
1076   f.last_page = n;
1077   // CRC32
1078   get32(f);
1079   // page_segments
1080   f.segment_count = get8(f);
1081   if (!getn(f, f.segments.ptr, f.segment_count)) return error(f, STBVorbisError.unexpected_eof);
1082   // assume we _don't_ know any the sample position of any segments
1083   f.end_seg_with_known_loc = -2;
1084   if (loc0 != ~0U || loc1 != ~0U) {
1085     int i;
1086     // determine which packet is the last one that will complete
1087     for (i = f.segment_count-1; i >= 0; --i) if (f.segments.ptr[i] < 255) break;
1088     // 'i' is now the index of the _last_ segment of a packet that ends
1089     if (i >= 0) {
1090       f.end_seg_with_known_loc = i;
1091       f.known_loc_for_packet = loc0;
1092     }
1093   }
1094   if (f.first_decode) {
1095     int len;
1096     ProbedPage p;
1097     len = 0;
1098     foreach (int i; 0..f.segment_count) len += f.segments.ptr[i];
1099     len += 27+f.segment_count;
1100     p.page_start = f.first_audio_page_offset;
1101     p.page_end = p.page_start+len;
1102     p.last_decoded_sample = loc0;
1103     f.p_first = p;
1104   }
1105   f.next_seg = 0;
1106   return true;
1107 }
1108 
1109 private int start_page (VorbisDecoder f) {
1110   if (!capture_pattern(f)) return error(f, STBVorbisError.missing_capture_pattern);
1111   return start_page_no_capturepattern(f);
1112 }
1113 
1114 private int start_packet (VorbisDecoder f) {
1115   while (f.next_seg == -1) {
1116     if (!start_page(f)) return false;
1117     if (f.page_flag&PAGEFLAG_continued_packet) return error(f, STBVorbisError.continued_packet_flag_invalid);
1118   }
1119   f.last_seg = false;
1120   f.valid_bits = 0;
1121   f.packet_bytes = 0;
1122   f.bytes_in_seg = 0;
1123   // f.next_seg is now valid
1124   return true;
1125 }
1126 
1127 private int maybe_start_packet (VorbisDecoder f) {
1128   if (f.next_seg == -1) {
1129     auto x = get8(f);
1130     if (f.eof) return false; // EOF at page boundary is not an error!
1131     // import std.stdio; debug writefln("CAPTURE %x %x", x, f.stpos);
1132     if (0x4f != x      ) return error(f, STBVorbisError.missing_capture_pattern);
1133     if (0x67 != get8(f)) return error(f, STBVorbisError.missing_capture_pattern);
1134     if (0x67 != get8(f)) return error(f, STBVorbisError.missing_capture_pattern);
1135     if (0x53 != get8(f)) return error(f, STBVorbisError.missing_capture_pattern);
1136     if (!start_page_no_capturepattern(f)) return false;
1137     if (f.page_flag&PAGEFLAG_continued_packet) {
1138       // set up enough state that we can read this packet if we want,
1139       // e.g. during recovery
1140       f.last_seg = false;
1141       f.bytes_in_seg = 0;
1142       return error(f, STBVorbisError.continued_packet_flag_invalid);
1143     }
1144   }
1145   return start_packet(f);
1146 }
1147 
1148 private int next_segment (VorbisDecoder f) {
1149   if (f.last_seg) return 0;
1150   if (f.next_seg == -1) {
1151     f.last_seg_which = f.segment_count-1; // in case start_page fails
1152     if (!start_page(f)) { f.last_seg = 1; return 0; }
1153     if (!(f.page_flag&PAGEFLAG_continued_packet)) return error(f, STBVorbisError.continued_packet_flag_invalid);
1154   }
1155   auto len = f.segments.ptr[f.next_seg++];
1156   if (len < 255) {
1157     f.last_seg = true;
1158     f.last_seg_which = f.next_seg-1;
1159   }
1160   if (f.next_seg >= f.segment_count) f.next_seg = -1;
1161   debug(stb_vorbis) assert(f.bytes_in_seg == 0);
1162   f.bytes_in_seg = len;
1163   return len;
1164 }
1165 
1166 enum EOP = (-1);
1167 enum INVALID_BITS = (-1);
1168 
1169 private int get8_packet_raw (VorbisDecoder f) {
1170   if (!f.bytes_in_seg) {  // CLANG!
1171     if (f.last_seg) return EOP;
1172     else if (!next_segment(f)) return EOP;
1173   }
1174   debug(stb_vorbis) assert(f.bytes_in_seg > 0);
1175   --f.bytes_in_seg;
1176   ++f.packet_bytes;
1177   return get8(f);
1178 }
1179 
1180 private int get8_packet (VorbisDecoder f) {
1181   int x = get8_packet_raw(f);
1182   f.valid_bits = 0;
1183   return x;
1184 }
1185 
1186 private uint get32_packet (VorbisDecoder f) {
1187   uint x = get8_packet(f), b;
1188   if (x == EOP) return EOP;
1189   if ((b = get8_packet(f)) == EOP) return EOP;
1190   x += b<<8;
1191   if ((b = get8_packet(f)) == EOP) return EOP;
1192   x += b<<16;
1193   if ((b = get8_packet(f)) == EOP) return EOP;
1194   x += b<<24;
1195   return x;
1196 }
1197 
1198 private void flush_packet (VorbisDecoder f) {
1199   while (get8_packet_raw(f) != EOP) {}
1200 }
1201 
1202 // @OPTIMIZE: this is the secondary bit decoder, so it's probably not as important
1203 // as the huffman decoder?
1204 private uint get_bits_main (VorbisDecoder f, int n) {
1205   uint z;
1206   if (f.valid_bits < 0) return 0;
1207   if (f.valid_bits < n) {
1208     if (n > 24) {
1209       // the accumulator technique below would not work correctly in this case
1210       z = get_bits_main(f, 24);
1211       z += get_bits_main(f, n-24)<<24;
1212       return z;
1213     }
1214     if (f.valid_bits == 0) f.acc = 0;
1215     while (f.valid_bits < n) {
1216       z = get8_packet_raw(f);
1217       if (z == EOP) {
1218         f.valid_bits = INVALID_BITS;
1219         return 0;
1220       }
1221       f.acc += z<<f.valid_bits;
1222       f.valid_bits += 8;
1223     }
1224   }
1225   if (f.valid_bits < 0) return 0;
1226   z = f.acc&((1<<n)-1);
1227   f.acc >>= n;
1228   f.valid_bits -= n;
1229   return z;
1230 }
1231 
1232 // chooses minimal possible integer type
1233 private auto get_bits(ubyte n) (VorbisDecoder f) if (n >= 1 && n <= 64) {
1234   static if (n <= 8) return cast(ubyte)get_bits_main(f, n);
1235   else static if (n <= 16) return cast(ushort)get_bits_main(f, n);
1236   else static if (n <= 32) return cast(uint)get_bits_main(f, n);
1237   else static if (n <= 64) return cast(ulong)get_bits_main(f, n);
1238   else static assert(0, "wtf?!");
1239 }
1240 
1241 // chooses minimal possible integer type, assume no overflow
1242 private auto get_bits_add_no(ubyte n) (VorbisDecoder f, ubyte add) if (n >= 1 && n <= 64) {
1243   static if (n <= 8) return cast(ubyte)(get_bits_main(f, n)+add);
1244   else static if (n <= 16) return cast(ushort)(get_bits_main(f, n)+add);
1245   else static if (n <= 32) return cast(uint)(get_bits_main(f, n)+add);
1246   else static if (n <= 64) return cast(ulong)(get_bits_main(f, n)+add);
1247   else static assert(0, "wtf?!");
1248 }
1249 
1250 // @OPTIMIZE: primary accumulator for huffman
1251 // expand the buffer to as many bits as possible without reading off end of packet
1252 // it might be nice to allow f.valid_bits and f.acc to be stored in registers,
1253 // e.g. cache them locally and decode locally
1254 //private /*__forceinline*/ void prep_huffman (VorbisDecoder f)
1255 enum PrepHuffmanMixin = q{
1256   if (f.valid_bits <= 24) {
1257     if (f.valid_bits == 0) f.acc = 0;
1258     int phmz = void;
1259     do {
1260       if (f.last_seg && !f.bytes_in_seg) break;
1261       phmz = get8_packet_raw(f);
1262       if (phmz == EOP) break;
1263       f.acc += cast(uint)phmz<<f.valid_bits;
1264       f.valid_bits += 8;
1265     } while (f.valid_bits <= 24);
1266   }
1267 };
1268 
1269 enum VorbisPacket {
1270   id = 1,
1271   comment = 3,
1272   setup = 5,
1273 }
1274 
1275 private int codebook_decode_scalar_raw (VorbisDecoder f, Codebook *c) {
1276   mixin(PrepHuffmanMixin);
1277 
1278   if (c.codewords is null && c.sorted_codewords is null) return -1;
1279   // cases to use binary search: sorted_codewords && !c.codewords
1280   //                             sorted_codewords && c.entries > 8
1281   auto cond = (c.entries > 8 ? c.sorted_codewords !is null : !c.codewords);
1282   if (cond) {
1283     // binary search
1284     uint code = bit_reverse(f.acc);
1285     int x = 0, n = c.sorted_entries, len;
1286     while (n > 1) {
1287       // invariant: sc[x] <= code < sc[x+n]
1288       int m = x+(n>>1);
1289       if (c.sorted_codewords[m] <= code) {
1290         x = m;
1291         n -= (n>>1);
1292       } else {
1293         n >>= 1;
1294       }
1295     }
1296     // x is now the sorted index
1297     if (!c.sparse) x = c.sorted_values[x];
1298     // x is now sorted index if sparse, or symbol otherwise
1299     len = c.codeword_lengths[x];
1300     if (f.valid_bits >= len) {
1301       f.acc >>= len;
1302       f.valid_bits -= len;
1303       return x;
1304     }
1305     f.valid_bits = 0;
1306     return -1;
1307   }
1308   // if small, linear search
1309   debug(stb_vorbis) assert(!c.sparse);
1310   foreach (uint i; 0..c.entries) {
1311     if (c.codeword_lengths[i] == NO_CODE) continue;
1312     if (c.codewords[i] == (f.acc&((1<<c.codeword_lengths[i])-1))) {
1313       if (f.valid_bits >= c.codeword_lengths[i]) {
1314         f.acc >>= c.codeword_lengths[i];
1315         f.valid_bits -= c.codeword_lengths[i];
1316         return i;
1317       }
1318       f.valid_bits = 0;
1319       return -1;
1320     }
1321   }
1322   error(f, STBVorbisError.invalid_stream);
1323   f.valid_bits = 0;
1324   return -1;
1325 }
1326 
1327 
1328 template DECODE_RAW(string var, string c) {
1329   enum DECODE_RAW = q{
1330     if (f.valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) { mixin(PrepHuffmanMixin); }
1331     // fast huffman table lookup
1332     ${i} = f.acc&FAST_HUFFMAN_TABLE_MASK;
1333     ${i} = ${c}.fast_huffman.ptr[${i}];
1334     if (${i} >= 0) {
1335       auto ${__temp_prefix__}n = ${c}.codeword_lengths[${i}];
1336       f.acc >>= ${__temp_prefix__}n;
1337       f.valid_bits -= ${__temp_prefix__}n;
1338       if (f.valid_bits < 0) { f.valid_bits = 0; ${i} = -1; }
1339     } else {
1340       ${i} = codebook_decode_scalar_raw(f, ${c});
1341     }
1342   }.cmacroFixVars!("i", "c")(var, c);
1343 }
1344 
1345 enum DECODE(string var, string c) = q{
1346   ${DECODE_RAW}
1347   if (${c}.sparse) ${var} = ${c}.sorted_values[${var}];
1348 }.cmacroFixVars!("var", "c", "DECODE_RAW")(var, c, DECODE_RAW!(var, c));
1349 
1350 
1351 version(STB_VORBIS_DIVIDES_IN_CODEBOOK) {
1352   alias DECODE_VQ = DECODE;
1353 } else {
1354   alias DECODE_VQ = DECODE_RAW;
1355 }
1356 
1357 
1358 
1359 // CODEBOOK_ELEMENT_FAST is an optimization for the CODEBOOK_FLOATS case
1360 // where we avoid one addition
1361 enum CODEBOOK_ELEMENT(string c, string off) = "("~c~".multiplicands["~off~"])";
1362 enum CODEBOOK_ELEMENT_FAST(string c, string off) = "("~c~".multiplicands["~off~"])";
1363 enum CODEBOOK_ELEMENT_BASE(string c) = "(0)";
1364 
1365 
1366 private int codebook_decode_start (VorbisDecoder f, Codebook* c) {
1367   int z = -1;
1368   // type 0 is only legal in a scalar context
1369   if (c.lookup_type == 0) {
1370     error(f, STBVorbisError.invalid_stream);
1371   } else {
1372     mixin(DECODE_VQ!("z", "c"));
1373     debug(stb_vorbis) if (c.sparse) assert(z < c.sorted_entries);
1374     if (z < 0) {  // check for EOP
1375       if (!f.bytes_in_seg && f.last_seg) return z;
1376       error(f, STBVorbisError.invalid_stream);
1377     }
1378   }
1379   return z;
1380 }
1381 
1382 private int codebook_decode (VorbisDecoder f, Codebook* c, float* output, int len) {
1383   int z = codebook_decode_start(f, c);
1384   if (z < 0) return false;
1385   if (len > c.dimensions) len = c.dimensions;
1386 
1387   version(STB_VORBIS_DIVIDES_IN_CODEBOOK) {
1388     if (c.lookup_type == 1) {
1389       float last = mixin(CODEBOOK_ELEMENT_BASE!"c");
1390       int div = 1;
1391       foreach (immutable i; 0..len) {
1392         int off = (z/div)%c.lookup_values;
1393         float val = mixin(CODEBOOK_ELEMENT_FAST!("c", "off"))+last;
1394         output[i] += val;
1395         if (c.sequence_p) last = val+c.minimum_value;
1396         div *= c.lookup_values;
1397       }
1398       return true;
1399     }
1400   }
1401 
1402   z *= c.dimensions;
1403   if (c.sequence_p) {
1404     float last = mixin(CODEBOOK_ELEMENT_BASE!"c");
1405     foreach (immutable i; 0..len) {
1406       float val = mixin(CODEBOOK_ELEMENT_FAST!("c", "z+i"))+last;
1407       output[i] += val;
1408       last = val+c.minimum_value;
1409     }
1410   } else {
1411     float last = mixin(CODEBOOK_ELEMENT_BASE!"c");
1412     foreach (immutable i; 0..len) output[i] += mixin(CODEBOOK_ELEMENT_FAST!("c", "z+i"))+last;
1413   }
1414 
1415   return true;
1416 }
1417 
1418 private int codebook_decode_step (VorbisDecoder f, Codebook* c, float* output, int len, int step) {
1419   int z = codebook_decode_start(f, c);
1420   float last = mixin(CODEBOOK_ELEMENT_BASE!"c");
1421   if (z < 0) return false;
1422   if (len > c.dimensions) len = c.dimensions;
1423 
1424   version(STB_VORBIS_DIVIDES_IN_CODEBOOK) {
1425     if (c.lookup_type == 1) {
1426       int div = 1;
1427       foreach (immutable i; 0..len) {
1428         int off = (z/div)%c.lookup_values;
1429         float val = mixin(CODEBOOK_ELEMENT_FAST!("c", "off"))+last;
1430         output[i*step] += val;
1431         if (c.sequence_p) last = val;
1432         div *= c.lookup_values;
1433       }
1434       return true;
1435     }
1436   }
1437 
1438   z *= c.dimensions;
1439   foreach (immutable i; 0..len) {
1440     float val = mixin(CODEBOOK_ELEMENT_FAST!("c", "z+i"))+last;
1441     output[i*step] += val;
1442     if (c.sequence_p) last = val;
1443   }
1444 
1445   return true;
1446 }
1447 
1448 private int codebook_decode_deinterleave_repeat (VorbisDecoder f, Codebook* c, ref float*[STB_VORBIS_MAX_CHANNELS] outputs, int ch, int* c_inter_p, int* p_inter_p, int len, int total_decode) {
1449   int c_inter = *c_inter_p;
1450   int p_inter = *p_inter_p;
1451   int z, effective = c.dimensions;
1452 
1453   // type 0 is only legal in a scalar context
1454   if (c.lookup_type == 0) return error(f, STBVorbisError.invalid_stream);
1455 
1456   while (total_decode > 0) {
1457     float last = mixin(CODEBOOK_ELEMENT_BASE!"c");
1458     mixin(DECODE_VQ!("z", "c"));
1459     version(STB_VORBIS_DIVIDES_IN_CODEBOOK) {} else {
1460       debug(stb_vorbis) assert(!c.sparse || z < c.sorted_entries);
1461     }
1462     if (z < 0) {
1463       if (!f.bytes_in_seg && f.last_seg) return false;
1464       return error(f, STBVorbisError.invalid_stream);
1465     }
1466 
1467     // if this will take us off the end of the buffers, stop short!
1468     // we check by computing the length of the virtual interleaved
1469     // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter),
1470     // and the length we'll be using (effective)
1471     if (c_inter+p_inter*ch+effective > len*ch) effective = len*ch-(p_inter*ch-c_inter);
1472 
1473     version(STB_VORBIS_DIVIDES_IN_CODEBOOK) {
1474       if (c.lookup_type == 1) {
1475         int div = 1;
1476         foreach (immutable i; 0..effective) {
1477           int off = (z/div)%c.lookup_values;
1478           float val = mixin(CODEBOOK_ELEMENT_FAST!("c", "off"))+last;
1479           if (outputs.ptr[c_inter]) outputs.ptr[c_inter].ptr[p_inter] += val;
1480           if (++c_inter == ch) { c_inter = 0; ++p_inter; }
1481           if (c.sequence_p) last = val;
1482           div *= c.lookup_values;
1483         }
1484         goto skipit;
1485       }
1486     }
1487     z *= c.dimensions;
1488     if (c.sequence_p) {
1489       foreach (immutable i; 0..effective) {
1490         float val = mixin(CODEBOOK_ELEMENT_FAST!("c", "z+i"))+last;
1491         if (outputs.ptr[c_inter]) outputs.ptr[c_inter][p_inter] += val;
1492         if (++c_inter == ch) { c_inter = 0; ++p_inter; }
1493         last = val;
1494       }
1495     } else {
1496       foreach (immutable i; 0..effective) {
1497         float val = mixin(CODEBOOK_ELEMENT_FAST!("c","z+i"))+last;
1498         if (outputs.ptr[c_inter]) outputs.ptr[c_inter][p_inter] += val;
1499         if (++c_inter == ch) { c_inter = 0; ++p_inter; }
1500       }
1501     }
1502    skipit:
1503     total_decode -= effective;
1504   }
1505   *c_inter_p = c_inter;
1506   *p_inter_p = p_inter;
1507   return true;
1508 }
1509 
1510 //private int predict_point (int x, int x0, int x1, int y0, int y1)
1511 enum predict_point(string dest, string x, string x0, string x1, string y0, string y1) = q{{
1512   //import std.math : abs;
1513   int dy = ${y1}-${y0};
1514   int adx = ${x1}-${x0};
1515   // @OPTIMIZE: force int division to round in the right direction... is this necessary on x86?
1516   int err = /*abs(dy)*/(dy < 0 ? -dy : dy)*(${x}-${x0});
1517   int off = err/adx;
1518   /*return*/${dest} = (dy < 0 ? ${y0}-off : ${y0}+off);
1519 }}.cmacroFixVars!("dest", "x", "x0", "x1", "y0", "y1")(dest, x, x0, x1, y0, y1);
1520 
1521 // the following table is block-copied from the specification
1522 immutable float[256] inverse_db_table = [
1523   1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f,
1524   1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f,
1525   1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f,
1526   2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f,
1527   2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f,
1528   3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f,
1529   4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f,
1530   6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f,
1531   7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f,
1532   1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f,
1533   1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f,
1534   1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f,
1535   2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f,
1536   2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f,
1537   3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f,
1538   4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f,
1539   5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f,
1540   7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f,
1541   9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f,
1542   1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f,
1543   1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f,
1544   2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f,
1545   2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f,
1546   3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f,
1547   4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f,
1548   5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f,
1549   7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f,
1550   9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f,
1551   0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f,
1552   0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f,
1553   0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f,
1554   0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f,
1555   0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f,
1556   0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f,
1557   0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f,
1558   0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f,
1559   0.00092223983f, 0.00098217216f, 0.0010459992f,  0.0011139742f,
1560   0.0011863665f,  0.0012634633f,  0.0013455702f,  0.0014330129f,
1561   0.0015261382f,  0.0016253153f,  0.0017309374f,  0.0018434235f,
1562   0.0019632195f,  0.0020908006f,  0.0022266726f,  0.0023713743f,
1563   0.0025254795f,  0.0026895994f,  0.0028643847f,  0.0030505286f,
1564   0.0032487691f,  0.0034598925f,  0.0036847358f,  0.0039241906f,
1565   0.0041792066f,  0.0044507950f,  0.0047400328f,  0.0050480668f,
1566   0.0053761186f,  0.0057254891f,  0.0060975636f,  0.0064938176f,
1567   0.0069158225f,  0.0073652516f,  0.0078438871f,  0.0083536271f,
1568   0.0088964928f,  0.009474637f,   0.010090352f,   0.010746080f,
1569   0.011444421f,   0.012188144f,   0.012980198f,   0.013823725f,
1570   0.014722068f,   0.015678791f,   0.016697687f,   0.017782797f,
1571   0.018938423f,   0.020169149f,   0.021479854f,   0.022875735f,
1572   0.024362330f,   0.025945531f,   0.027631618f,   0.029427276f,
1573   0.031339626f,   0.033376252f,   0.035545228f,   0.037855157f,
1574   0.040315199f,   0.042935108f,   0.045725273f,   0.048696758f,
1575   0.051861348f,   0.055231591f,   0.058820850f,   0.062643361f,
1576   0.066714279f,   0.071049749f,   0.075666962f,   0.080584227f,
1577   0.085821044f,   0.091398179f,   0.097337747f,   0.10366330f,
1578   0.11039993f,    0.11757434f,    0.12521498f,    0.13335215f,
1579   0.14201813f,    0.15124727f,    0.16107617f,    0.17154380f,
1580   0.18269168f,    0.19456402f,    0.20720788f,    0.22067342f,
1581   0.23501402f,    0.25028656f,    0.26655159f,    0.28387361f,
1582   0.30232132f,    0.32196786f,    0.34289114f,    0.36517414f,
1583   0.38890521f,    0.41417847f,    0.44109412f,    0.46975890f,
1584   0.50028648f,    0.53279791f,    0.56742212f,    0.60429640f,
1585   0.64356699f,    0.68538959f,    0.72993007f,    0.77736504f,
1586   0.82788260f,    0.88168307f,    0.9389798f,     1.0f
1587 ];
1588 
1589 
1590 // @OPTIMIZE: if you want to replace this bresenham line-drawing routine,
1591 // note that you must produce bit-identical output to decode correctly;
1592 // this specific sequence of operations is specified in the spec (it's
1593 // drawing integer-quantized frequency-space lines that the encoder
1594 // expects to be exactly the same)
1595 //     ... also, isn't the whole point of Bresenham's algorithm to NOT
1596 // have to divide in the setup? sigh.
1597 version(STB_VORBIS_NO_DEFER_FLOOR) {
1598   enum LINE_OP(string a, string b) = a~" = "~b~";";
1599 } else {
1600   enum LINE_OP(string a, string b) = a~" *= "~b~";";
1601 }
1602 
1603 version(STB_VORBIS_DIVIDE_TABLE) {
1604   enum DIVTAB_NUMER = 32;
1605   enum DIVTAB_DENOM = 64;
1606   byte[DIVTAB_DENOM][DIVTAB_NUMER] integer_divide_table; // 2KB
1607 }
1608 
1609 // nobranch abs trick
1610 enum ABS(string v) = q{(((${v})+((${v})>>31))^((${v})>>31))}.cmacroFixVars!"v"(v);
1611 
1612 // this is forceinline, but dmd inliner sux
1613 // but hey, i have my k00l macrosystem!
1614 //void draw_line (float* ${output}, int ${x0}, int ${y0}, int ${x1}, int ${y1}, int ${n})
1615 enum draw_line(string output, string x0, string y0, string x1, string y1, string n) = q{{
1616   int ${__temp_prefix__}dy = ${y1}-${y0};
1617   int ${__temp_prefix__}adx = ${x1}-${x0};
1618   int ${__temp_prefix__}ady = mixin(ABS!"${__temp_prefix__}dy");
1619   int ${__temp_prefix__}base;
1620   int ${__temp_prefix__}x = ${x0}, ${__temp_prefix__}y = ${y0};
1621   int ${__temp_prefix__}err = 0;
1622   int ${__temp_prefix__}sy;
1623 
1624   version(STB_VORBIS_DIVIDE_TABLE) {
1625     if (${__temp_prefix__}adx < DIVTAB_DENOM && ${__temp_prefix__}ady < DIVTAB_NUMER) {
1626       if (${__temp_prefix__}dy < 0) {
1627         ${__temp_prefix__}base = -integer_divide_table[${__temp_prefix__}ady].ptr[${__temp_prefix__}adx];
1628         ${__temp_prefix__}sy = ${__temp_prefix__}base-1;
1629       } else {
1630         ${__temp_prefix__}base = integer_divide_table[${__temp_prefix__}ady].ptr[${__temp_prefix__}adx];
1631         ${__temp_prefix__}sy = ${__temp_prefix__}base+1;
1632       }
1633     } else {
1634       ${__temp_prefix__}base = ${__temp_prefix__}dy/${__temp_prefix__}adx;
1635       ${__temp_prefix__}sy = ${__temp_prefix__}base+(${__temp_prefix__}dy < 0 ? -1 : 1);
1636     }
1637   } else {
1638     ${__temp_prefix__}base = ${__temp_prefix__}dy/${__temp_prefix__}adx;
1639     ${__temp_prefix__}sy = ${__temp_prefix__}base+(${__temp_prefix__}dy < 0 ? -1 : 1);
1640   }
1641   ${__temp_prefix__}ady -= mixin(ABS!"${__temp_prefix__}base")*${__temp_prefix__}adx;
1642   if (${x1} > ${n}) ${x1} = ${n};
1643   if (${__temp_prefix__}x < ${x1}) {
1644     mixin(LINE_OP!("${output}[${__temp_prefix__}x]", "inverse_db_table[${__temp_prefix__}y]"));
1645     for (++${__temp_prefix__}x; ${__temp_prefix__}x < ${x1}; ++${__temp_prefix__}x) {
1646       ${__temp_prefix__}err += ${__temp_prefix__}ady;
1647       if (${__temp_prefix__}err >= ${__temp_prefix__}adx) {
1648         ${__temp_prefix__}err -= ${__temp_prefix__}adx;
1649         ${__temp_prefix__}y += ${__temp_prefix__}sy;
1650       } else {
1651         ${__temp_prefix__}y += ${__temp_prefix__}base;
1652       }
1653       mixin(LINE_OP!("${output}[${__temp_prefix__}x]", "inverse_db_table[${__temp_prefix__}y]"));
1654     }
1655   }
1656   /*
1657   mixin(LINE_OP!("${output}[${__temp_prefix__}x]", "inverse_db_table[${__temp_prefix__}y]"));
1658   for (++${__temp_prefix__}x; ${__temp_prefix__}x < ${x1}; ++${__temp_prefix__}x) {
1659     ${__temp_prefix__}err += ${__temp_prefix__}ady;
1660     if (${__temp_prefix__}err >= ${__temp_prefix__}adx) {
1661       ${__temp_prefix__}err -= ${__temp_prefix__}adx;
1662       ${__temp_prefix__}y += ${__temp_prefix__}sy;
1663     } else {
1664       ${__temp_prefix__}y += ${__temp_prefix__}base;
1665     }
1666     mixin(LINE_OP!("${output}[${__temp_prefix__}x]", "inverse_db_table[${__temp_prefix__}y]"));
1667   }
1668   */
1669 }}.cmacroFixVars!("output", "x0", "y0", "x1", "y1", "n")(output, x0, y0, x1, y1, n);
1670 
1671 private int residue_decode (VorbisDecoder f, Codebook* book, float* target, int offset, int n, int rtype) {
1672   if (rtype == 0) {
1673     int step = n/book.dimensions;
1674     foreach (immutable k; 0..step) if (!codebook_decode_step(f, book, target+offset+k, n-offset-k, step)) return false;
1675   } else {
1676     for (int k = 0; k < n; ) {
1677       if (!codebook_decode(f, book, target+offset, n-k)) return false;
1678       k += book.dimensions;
1679       offset += book.dimensions;
1680     }
1681   }
1682   return true;
1683 }
1684 
1685 private void decode_residue (VorbisDecoder f, ref float*[STB_VORBIS_MAX_CHANNELS] residue_buffers, int ch, int n, int rn, ubyte* do_not_decode) {
1686   import core.stdc.stdlib : alloca;
1687   import core.stdc.string : memset;
1688 
1689   Residue* r = f.residue_config+rn;
1690   int rtype = f.residue_types.ptr[rn];
1691   int c = r.classbook;
1692   int classwords = f.codebooks[c].dimensions;
1693   int n_read = r.end-r.begin;
1694   int part_read = n_read/r.part_size;
1695   uint temp_alloc_point = temp_alloc_save(f);
1696   version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
1697     int** classifications = cast(int**)mixin(temp_block_array!("f.vrchannels", "part_read*int.sizeof"));
1698   } else {
1699     ubyte*** part_classdata = cast(ubyte***)mixin(temp_block_array!("f.vrchannels", "part_read*cast(int)(ubyte*).sizeof"));
1700   }
1701 
1702   //stb_prof(2);
1703   foreach (immutable i; 0..ch) if (!do_not_decode[i]) memset(residue_buffers.ptr[i], 0, float.sizeof*n);
1704 
1705   if (rtype == 2 && ch != 1) {
1706     int j = void;
1707     for (j = 0; j < ch; ++j) if (!do_not_decode[j]) break;
1708     if (j == ch) goto done;
1709 
1710     //stb_prof(3);
1711     foreach (immutable pass; 0..8) {
1712       int pcount = 0, class_set = 0;
1713       if (ch == 2) {
1714         //stb_prof(13);
1715         while (pcount < part_read) {
1716           int z = r.begin+pcount*r.part_size;
1717           int c_inter = (z&1), p_inter = z>>1;
1718           if (pass == 0) {
1719             Codebook *cc = f.codebooks+r.classbook;
1720             int q;
1721             mixin(DECODE!("q", "cc"));
1722             if (q == EOP) goto done;
1723             version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
1724               for (int i = classwords-1; i >= 0; --i) {
1725                 classifications[0].ptr[i+pcount] = q%r.classifications;
1726                 q /= r.classifications;
1727               }
1728             } else {
1729               part_classdata[0][class_set] = r.classdata[q];
1730             }
1731           }
1732           //stb_prof(5);
1733           for (int i = 0; i < classwords && pcount < part_read; ++i, ++pcount) {
1734             int zz = r.begin+pcount*r.part_size;
1735             version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
1736               int cc = classifications[0].ptr[pcount];
1737             } else {
1738               int cc = part_classdata[0][class_set][i];
1739             }
1740             int b = r.residue_books[cc].ptr[pass];
1741             if (b >= 0) {
1742               Codebook* book = f.codebooks+b;
1743               //stb_prof(20); // accounts for X time
1744               version(STB_VORBIS_DIVIDES_IN_CODEBOOK) {
1745                 if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r.part_size)) goto done;
1746               } else {
1747                 // saves 1%
1748                 //if (!codebook_decode_deinterleave_repeat_2(f, book, residue_buffers, &c_inter, &p_inter, n, r.part_size)) goto done; // according to C source
1749                 if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r.part_size)) goto done;
1750               }
1751               //stb_prof(7);
1752             } else {
1753               zz += r.part_size;
1754               c_inter = zz&1;
1755               p_inter = zz>>1;
1756             }
1757           }
1758           //stb_prof(8);
1759           version(STB_VORBIS_DIVIDES_IN_RESIDUE) {} else {
1760             ++class_set;
1761           }
1762         }
1763       } else if (ch == 1) {
1764         while (pcount < part_read) {
1765           int z = r.begin+pcount*r.part_size;
1766           int c_inter = 0, p_inter = z;
1767           if (pass == 0) {
1768             Codebook* cc = f.codebooks+r.classbook;
1769             int q;
1770             mixin(DECODE!("q", "cc"));
1771             if (q == EOP) goto done;
1772             version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
1773               for (int i = classwords-1; i >= 0; --i) {
1774                 classifications[0].ptr[i+pcount] = q%r.classifications;
1775                 q /= r.classifications;
1776               }
1777             } else {
1778               part_classdata[0][class_set] = r.classdata[q];
1779             }
1780           }
1781           for (int i = 0; i < classwords && pcount < part_read; ++i, ++pcount) {
1782             int zz = r.begin+pcount*r.part_size;
1783             version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
1784               int cc = classifications[0].ptr[pcount];
1785             } else {
1786               int cc = part_classdata[0][class_set][i];
1787             }
1788             int b = r.residue_books[cc].ptr[pass];
1789             if (b >= 0) {
1790               Codebook* book = f.codebooks+b;
1791               //stb_prof(22);
1792               if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r.part_size)) goto done;
1793               //stb_prof(3);
1794             } else {
1795               zz += r.part_size;
1796               c_inter = 0;
1797               p_inter = zz;
1798             }
1799           }
1800           version(STB_VORBIS_DIVIDES_IN_RESIDUE) {} else {
1801             ++class_set;
1802           }
1803         }
1804       } else {
1805         while (pcount < part_read) {
1806           int z = r.begin+pcount*r.part_size;
1807           int c_inter = z%ch, p_inter = z/ch;
1808           if (pass == 0) {
1809             Codebook* cc = f.codebooks+r.classbook;
1810             int q;
1811             mixin(DECODE!("q", "cc"));
1812             if (q == EOP) goto done;
1813             version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
1814               for (int i = classwords-1; i >= 0; --i) {
1815                 classifications[0].ptr[i+pcount] = q%r.classifications;
1816                 q /= r.classifications;
1817               }
1818             } else {
1819               part_classdata[0][class_set] = r.classdata[q];
1820             }
1821           }
1822           for (int i = 0; i < classwords && pcount < part_read; ++i, ++pcount) {
1823             int zz = r.begin+pcount*r.part_size;
1824             version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
1825               int cc = classifications[0].ptr[pcount];
1826             } else {
1827               int cc = part_classdata[0][class_set][i];
1828             }
1829             int b = r.residue_books[cc].ptr[pass];
1830             if (b >= 0) {
1831               Codebook* book = f.codebooks+b;
1832               //stb_prof(22);
1833               if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r.part_size)) goto done;
1834               //stb_prof(3);
1835             } else {
1836               zz += r.part_size;
1837               c_inter = zz%ch;
1838               p_inter = zz/ch;
1839             }
1840           }
1841           version(STB_VORBIS_DIVIDES_IN_RESIDUE) {} else {
1842             ++class_set;
1843           }
1844         }
1845       }
1846     }
1847     goto done;
1848   }
1849   //stb_prof(9);
1850 
1851   foreach (immutable pass; 0..8) {
1852     int pcount = 0, class_set=0;
1853     while (pcount < part_read) {
1854       if (pass == 0) {
1855         foreach (immutable j; 0..ch) {
1856           if (!do_not_decode[j]) {
1857             Codebook* cc = f.codebooks+r.classbook;
1858             int temp;
1859             mixin(DECODE!("temp", "cc"));
1860             if (temp == EOP) goto done;
1861             version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
1862               for (int i = classwords-1; i >= 0; --i) {
1863                 classifications[j].ptr[i+pcount] = temp%r.classifications;
1864                 temp /= r.classifications;
1865               }
1866             } else {
1867               part_classdata[j][class_set] = r.classdata[temp];
1868             }
1869           }
1870         }
1871       }
1872       for (int i = 0; i < classwords && pcount < part_read; ++i, ++pcount) {
1873         foreach (immutable j; 0..ch) {
1874           if (!do_not_decode[j]) {
1875             version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
1876               int cc = classifications[j].ptr[pcount];
1877             } else {
1878               int cc = part_classdata[j][class_set][i];
1879             }
1880             int b = r.residue_books[cc].ptr[pass];
1881             if (b >= 0) {
1882               float* target = residue_buffers.ptr[j];
1883               int offset = r.begin+pcount*r.part_size;
1884               int nn = r.part_size;
1885               Codebook* book = f.codebooks+b;
1886               if (!residue_decode(f, book, target, offset, nn, rtype)) goto done;
1887             }
1888           }
1889         }
1890       }
1891       version(STB_VORBIS_DIVIDES_IN_RESIDUE) {} else {
1892         ++class_set;
1893       }
1894     }
1895   }
1896  done:
1897   //stb_prof(0);
1898   version(STB_VORBIS_DIVIDES_IN_RESIDUE) temp_free(f, classifications); else temp_free(f, part_classdata);
1899   temp_alloc_restore(f, temp_alloc_point);
1900 }
1901 
1902 
1903 // the following were split out into separate functions while optimizing;
1904 // they could be pushed back up but eh. __forceinline showed no change;
1905 // they're probably already being inlined.
1906 private void imdct_step3_iter0_loop (int n, float* e, int i_off, int k_off, float* A) {
1907   float* ee0 = e+i_off;
1908   float* ee2 = ee0+k_off;
1909   debug(stb_vorbis) assert((n&3) == 0);
1910   foreach (immutable _; 0..n>>2) {
1911     float k00_20, k01_21;
1912     k00_20 = ee0[ 0]-ee2[ 0];
1913     k01_21 = ee0[-1]-ee2[-1];
1914     ee0[ 0] += ee2[ 0];//ee0[ 0] = ee0[ 0]+ee2[ 0];
1915     ee0[-1] += ee2[-1];//ee0[-1] = ee0[-1]+ee2[-1];
1916     ee2[ 0] = k00_20*A[0]-k01_21*A[1];
1917     ee2[-1] = k01_21*A[0]+k00_20*A[1];
1918     A += 8;
1919 
1920     k00_20 = ee0[-2]-ee2[-2];
1921     k01_21 = ee0[-3]-ee2[-3];
1922     ee0[-2] += ee2[-2];//ee0[-2] = ee0[-2]+ee2[-2];
1923     ee0[-3] += ee2[-3];//ee0[-3] = ee0[-3]+ee2[-3];
1924     ee2[-2] = k00_20*A[0]-k01_21*A[1];
1925     ee2[-3] = k01_21*A[0]+k00_20*A[1];
1926     A += 8;
1927 
1928     k00_20 = ee0[-4]-ee2[-4];
1929     k01_21 = ee0[-5]-ee2[-5];
1930     ee0[-4] += ee2[-4];//ee0[-4] = ee0[-4]+ee2[-4];
1931     ee0[-5] += ee2[-5];//ee0[-5] = ee0[-5]+ee2[-5];
1932     ee2[-4] = k00_20*A[0]-k01_21*A[1];
1933     ee2[-5] = k01_21*A[0]+k00_20*A[1];
1934     A += 8;
1935 
1936     k00_20 = ee0[-6]-ee2[-6];
1937     k01_21 = ee0[-7]-ee2[-7];
1938     ee0[-6] += ee2[-6];//ee0[-6] = ee0[-6]+ee2[-6];
1939     ee0[-7] += ee2[-7];//ee0[-7] = ee0[-7]+ee2[-7];
1940     ee2[-6] = k00_20*A[0]-k01_21*A[1];
1941     ee2[-7] = k01_21*A[0]+k00_20*A[1];
1942     A += 8;
1943     ee0 -= 8;
1944     ee2 -= 8;
1945   }
1946 }
1947 
1948 private void imdct_step3_inner_r_loop (int lim, float* e, int d0, int k_off, float* A, int k1) {
1949   float k00_20, k01_21;
1950   float* e0 = e+d0;
1951   float* e2 = e0+k_off;
1952   foreach (immutable _; 0..lim>>2) {
1953     k00_20 = e0[-0]-e2[-0];
1954     k01_21 = e0[-1]-e2[-1];
1955     e0[-0] += e2[-0];//e0[-0] = e0[-0]+e2[-0];
1956     e0[-1] += e2[-1];//e0[-1] = e0[-1]+e2[-1];
1957     e2[-0] = (k00_20)*A[0]-(k01_21)*A[1];
1958     e2[-1] = (k01_21)*A[0]+(k00_20)*A[1];
1959 
1960     A += k1;
1961 
1962     k00_20 = e0[-2]-e2[-2];
1963     k01_21 = e0[-3]-e2[-3];
1964     e0[-2] += e2[-2];//e0[-2] = e0[-2]+e2[-2];
1965     e0[-3] += e2[-3];//e0[-3] = e0[-3]+e2[-3];
1966     e2[-2] = (k00_20)*A[0]-(k01_21)*A[1];
1967     e2[-3] = (k01_21)*A[0]+(k00_20)*A[1];
1968 
1969     A += k1;
1970 
1971     k00_20 = e0[-4]-e2[-4];
1972     k01_21 = e0[-5]-e2[-5];
1973     e0[-4] += e2[-4];//e0[-4] = e0[-4]+e2[-4];
1974     e0[-5] += e2[-5];//e0[-5] = e0[-5]+e2[-5];
1975     e2[-4] = (k00_20)*A[0]-(k01_21)*A[1];
1976     e2[-5] = (k01_21)*A[0]+(k00_20)*A[1];
1977 
1978     A += k1;
1979 
1980     k00_20 = e0[-6]-e2[-6];
1981     k01_21 = e0[-7]-e2[-7];
1982     e0[-6] += e2[-6];//e0[-6] = e0[-6]+e2[-6];
1983     e0[-7] += e2[-7];//e0[-7] = e0[-7]+e2[-7];
1984     e2[-6] = (k00_20)*A[0]-(k01_21)*A[1];
1985     e2[-7] = (k01_21)*A[0]+(k00_20)*A[1];
1986 
1987     e0 -= 8;
1988     e2 -= 8;
1989 
1990     A += k1;
1991   }
1992 }
1993 
1994 private void imdct_step3_inner_s_loop (int n, float* e, int i_off, int k_off, float* A, int a_off, int k0) {
1995   float A0 = A[0];
1996   float A1 = A[0+1];
1997   float A2 = A[0+a_off];
1998   float A3 = A[0+a_off+1];
1999   float A4 = A[0+a_off*2+0];
2000   float A5 = A[0+a_off*2+1];
2001   float A6 = A[0+a_off*3+0];
2002   float A7 = A[0+a_off*3+1];
2003   float k00, k11;
2004   float *ee0 = e  +i_off;
2005   float *ee2 = ee0+k_off;
2006   foreach (immutable _; 0..n) {
2007     k00 = ee0[ 0]-ee2[ 0];
2008     k11 = ee0[-1]-ee2[-1];
2009     ee0[ 0] = ee0[ 0]+ee2[ 0];
2010     ee0[-1] = ee0[-1]+ee2[-1];
2011     ee2[ 0] = (k00)*A0-(k11)*A1;
2012     ee2[-1] = (k11)*A0+(k00)*A1;
2013 
2014     k00 = ee0[-2]-ee2[-2];
2015     k11 = ee0[-3]-ee2[-3];
2016     ee0[-2] = ee0[-2]+ee2[-2];
2017     ee0[-3] = ee0[-3]+ee2[-3];
2018     ee2[-2] = (k00)*A2-(k11)*A3;
2019     ee2[-3] = (k11)*A2+(k00)*A3;
2020 
2021     k00 = ee0[-4]-ee2[-4];
2022     k11 = ee0[-5]-ee2[-5];
2023     ee0[-4] = ee0[-4]+ee2[-4];
2024     ee0[-5] = ee0[-5]+ee2[-5];
2025     ee2[-4] = (k00)*A4-(k11)*A5;
2026     ee2[-5] = (k11)*A4+(k00)*A5;
2027 
2028     k00 = ee0[-6]-ee2[-6];
2029     k11 = ee0[-7]-ee2[-7];
2030     ee0[-6] = ee0[-6]+ee2[-6];
2031     ee0[-7] = ee0[-7]+ee2[-7];
2032     ee2[-6] = (k00)*A6-(k11)*A7;
2033     ee2[-7] = (k11)*A6+(k00)*A7;
2034 
2035     ee0 -= k0;
2036     ee2 -= k0;
2037   }
2038 }
2039 
2040 // this was forceinline
2041 //void iter_54(float *z)
2042 enum iter_54(string z) = q{{
2043   auto ${__temp_prefix__}z = (${z});
2044   float ${__temp_prefix__}k00, ${__temp_prefix__}k11, ${__temp_prefix__}k22, ${__temp_prefix__}k33;
2045   float ${__temp_prefix__}y0, ${__temp_prefix__}y1, ${__temp_prefix__}y2, ${__temp_prefix__}y3;
2046 
2047   ${__temp_prefix__}k00 = ${__temp_prefix__}z[ 0]-${__temp_prefix__}z[-4];
2048   ${__temp_prefix__}y0  = ${__temp_prefix__}z[ 0]+${__temp_prefix__}z[-4];
2049   ${__temp_prefix__}y2  = ${__temp_prefix__}z[-2]+${__temp_prefix__}z[-6];
2050   ${__temp_prefix__}k22 = ${__temp_prefix__}z[-2]-${__temp_prefix__}z[-6];
2051 
2052   ${__temp_prefix__}z[-0] = ${__temp_prefix__}y0+${__temp_prefix__}y2;   // z0+z4+z2+z6
2053   ${__temp_prefix__}z[-2] = ${__temp_prefix__}y0-${__temp_prefix__}y2;   // z0+z4-z2-z6
2054 
2055   // done with ${__temp_prefix__}y0, ${__temp_prefix__}y2
2056 
2057   ${__temp_prefix__}k33 = ${__temp_prefix__}z[-3]-${__temp_prefix__}z[-7];
2058 
2059   ${__temp_prefix__}z[-4] = ${__temp_prefix__}k00+${__temp_prefix__}k33; // z0-z4+z3-z7
2060   ${__temp_prefix__}z[-6] = ${__temp_prefix__}k00-${__temp_prefix__}k33; // z0-z4-z3+z7
2061 
2062   // done with ${__temp_prefix__}k33
2063 
2064   ${__temp_prefix__}k11 = ${__temp_prefix__}z[-1]-${__temp_prefix__}z[-5];
2065   ${__temp_prefix__}y1  = ${__temp_prefix__}z[-1]+${__temp_prefix__}z[-5];
2066   ${__temp_prefix__}y3  = ${__temp_prefix__}z[-3]+${__temp_prefix__}z[-7];
2067 
2068   ${__temp_prefix__}z[-1] = ${__temp_prefix__}y1+${__temp_prefix__}y3;   // z1+z5+z3+z7
2069   ${__temp_prefix__}z[-3] = ${__temp_prefix__}y1-${__temp_prefix__}y3;   // z1+z5-z3-z7
2070   ${__temp_prefix__}z[-5] = ${__temp_prefix__}k11-${__temp_prefix__}k22; // z1-z5+z2-z6
2071   ${__temp_prefix__}z[-7] = ${__temp_prefix__}k11+${__temp_prefix__}k22; // z1-z5-z2+z6
2072 }}.cmacroFixVars!"z"(z);
2073 
2074 static void imdct_step3_inner_s_loop_ld654(int n, float *e, int i_off, float *A, int base_n)
2075 {
2076     int a_off = base_n >> 3;
2077     float A2 = A[0+a_off];
2078     float *z = e + i_off;
2079     float *base = z - 16 * n;
2080 
2081     while (z > base) {
2082         float k00,k11;
2083         float l00,l11;
2084 
2085         k00    = z[-0] - z[ -8];
2086         k11    = z[-1] - z[ -9];
2087         l00    = z[-2] - z[-10];
2088         l11    = z[-3] - z[-11];
2089         z[ -0] = z[-0] + z[ -8];
2090         z[ -1] = z[-1] + z[ -9];
2091         z[ -2] = z[-2] + z[-10];
2092         z[ -3] = z[-3] + z[-11];
2093         z[ -8] = k00;
2094         z[ -9] = k11;
2095         z[-10] = (l00+l11) * A2;
2096         z[-11] = (l11-l00) * A2;
2097 
2098         k00    = z[ -4] - z[-12];
2099         k11    = z[ -5] - z[-13];
2100         l00    = z[ -6] - z[-14];
2101         l11    = z[ -7] - z[-15];
2102         z[ -4] = z[ -4] + z[-12];
2103         z[ -5] = z[ -5] + z[-13];
2104         z[ -6] = z[ -6] + z[-14];
2105         z[ -7] = z[ -7] + z[-15];
2106         z[-12] = k11;
2107         z[-13] = -k00;
2108         z[-14] = (l11-l00) * A2;
2109         z[-15] = (l00+l11) * -A2;
2110 
2111         mixin(iter_54!"z");
2112         mixin(iter_54!"z-8");
2113         z -= 16;
2114     }
2115 }
2116 
2117 private void inverse_mdct (float* buffer, int n, VorbisDecoder f, int blocktype) {
2118   import core.stdc.stdlib : alloca;
2119 
2120   int n2 = n>>1, n4 = n>>2, n8 = n>>3, l;
2121   int ld;
2122   // @OPTIMIZE: reduce register pressure by using fewer variables?
2123   int save_point = temp_alloc_save(f);
2124   float *buf2;
2125   buf2 = cast(float*)mixin(temp_alloc!("n2*float.sizeof"));
2126   float *u = null, v = null;
2127   // twiddle factors
2128   float *A = f.A.ptr[blocktype];
2129 
2130   // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio"
2131   // See notes about bugs in that paper in less-optimal implementation 'inverse_mdct_old' after this function.
2132 
2133   // kernel from paper
2134 
2135 
2136   // merged:
2137   //   copy and reflect spectral data
2138   //   step 0
2139 
2140   // note that it turns out that the items added together during
2141   // this step are, in fact, being added to themselves (as reflected
2142   // by step 0). inexplicable inefficiency! this became obvious
2143   // once I combined the passes.
2144 
2145   // so there's a missing 'times 2' here (for adding X to itself).
2146   // this propogates through linearly to the end, where the numbers
2147   // are 1/2 too small, and need to be compensated for.
2148 
2149   {
2150     float* d, e, AA, e_stop;
2151     d = &buf2[n2-2];
2152     AA = A;
2153     e = &buffer[0];
2154     e_stop = &buffer[n2];
2155     while (e != e_stop) {
2156       d[1] = (e[0]*AA[0]-e[2]*AA[1]);
2157       d[0] = (e[0]*AA[1]+e[2]*AA[0]);
2158       d -= 2;
2159       AA += 2;
2160       e += 4;
2161     }
2162     e = &buffer[n2-3];
2163     while (d >= buf2) {
2164       d[1] = (-e[2]*AA[0]- -e[0]*AA[1]);
2165       d[0] = (-e[2]*AA[1]+ -e[0]*AA[0]);
2166       d -= 2;
2167       AA += 2;
2168       e -= 4;
2169     }
2170   }
2171 
2172   // now we use symbolic names for these, so that we can
2173   // possibly swap their meaning as we change which operations
2174   // are in place
2175 
2176   u = buffer;
2177   v = buf2;
2178 
2179   // step 2    (paper output is w, now u)
2180   // this could be in place, but the data ends up in the wrong
2181   // place... _somebody_'s got to swap it, so this is nominated
2182   {
2183     float* AA = &A[n2-8];
2184     float* d0, d1, e0, e1;
2185     e0 = &v[n4];
2186     e1 = &v[0];
2187     d0 = &u[n4];
2188     d1 = &u[0];
2189     while (AA >= A) {
2190       float v40_20, v41_21;
2191 
2192       v41_21 = e0[1]-e1[1];
2193       v40_20 = e0[0]-e1[0];
2194       d0[1]  = e0[1]+e1[1];
2195       d0[0]  = e0[0]+e1[0];
2196       d1[1]  = v41_21*AA[4]-v40_20*AA[5];
2197       d1[0]  = v40_20*AA[4]+v41_21*AA[5];
2198 
2199       v41_21 = e0[3]-e1[3];
2200       v40_20 = e0[2]-e1[2];
2201       d0[3]  = e0[3]+e1[3];
2202       d0[2]  = e0[2]+e1[2];
2203       d1[3]  = v41_21*AA[0]-v40_20*AA[1];
2204       d1[2]  = v40_20*AA[0]+v41_21*AA[1];
2205 
2206       AA -= 8;
2207 
2208       d0 += 4;
2209       d1 += 4;
2210       e0 += 4;
2211       e1 += 4;
2212     }
2213   }
2214 
2215   // step 3
2216   ld = ilog(n)-1; // ilog is off-by-one from normal definitions
2217 
2218   // optimized step 3:
2219 
2220   // the original step3 loop can be nested r inside s or s inside r;
2221   // it's written originally as s inside r, but this is dumb when r
2222   // iterates many times, and s few. So I have two copies of it and
2223   // switch between them halfway.
2224 
2225   // this is iteration 0 of step 3
2226   imdct_step3_iter0_loop(n>>4, u, n2-1-n4*0, -(n>>3), A);
2227   imdct_step3_iter0_loop(n>>4, u, n2-1-n4*1, -(n>>3), A);
2228 
2229   // this is iteration 1 of step 3
2230   imdct_step3_inner_r_loop(n>>5, u, n2-1-n8*0, -(n>>4), A, 16);
2231   imdct_step3_inner_r_loop(n>>5, u, n2-1-n8*1, -(n>>4), A, 16);
2232   imdct_step3_inner_r_loop(n>>5, u, n2-1-n8*2, -(n>>4), A, 16);
2233   imdct_step3_inner_r_loop(n>>5, u, n2-1-n8*3, -(n>>4), A, 16);
2234 
2235   l = 2;
2236   for (; l < (ld-3)>>1; ++l) {
2237     int k0 = n>>(l+2), k0_2 = k0>>1;
2238     int lim = 1<<(l+1);
2239     foreach (int i; 0..lim) imdct_step3_inner_r_loop(n>>(l+4), u, n2-1-k0*i, -k0_2, A, 1<<(l+3));
2240   }
2241 
2242   for (; l < ld-6; ++l) {
2243     int k0 = n>>(l+2), k1 = 1<<(l+3), k0_2 = k0>>1;
2244     int rlim = n>>(l+6);
2245     int lim = 1<<(l+1);
2246     int i_off;
2247     float *A0 = A;
2248     i_off = n2-1;
2249     foreach (immutable _; 0..rlim) {
2250       imdct_step3_inner_s_loop(lim, u, i_off, -k0_2, A0, k1, k0);
2251       A0 += k1*4;
2252       i_off -= 8;
2253     }
2254   }
2255 
2256   // iterations with count:
2257   //   ld-6,-5,-4 all interleaved together
2258   //       the big win comes from getting rid of needless flops
2259   //         due to the constants on pass 5 & 4 being all 1 and 0;
2260   //       combining them to be simultaneous to improve cache made little difference
2261   imdct_step3_inner_s_loop_ld654(n>>5, u, n2-1, A, n);
2262 
2263   // output is u
2264 
2265   // step 4, 5, and 6
2266   // cannot be in-place because of step 5
2267   {
2268     ushort *bitrev = f.bit_reverse.ptr[blocktype];
2269     // weirdly, I'd have thought reading sequentially and writing
2270     // erratically would have been better than vice-versa, but in
2271     // fact that's not what my testing showed. (That is, with
2272     // j = bitreverse(i), do you read i and write j, or read j and write i.)
2273     float *d0 = &v[n4-4];
2274     float *d1 = &v[n2-4];
2275     int k4;
2276     while (d0 >= v) {
2277       k4 = bitrev[0];
2278       d1[3] = u[k4+0];
2279       d1[2] = u[k4+1];
2280       d0[3] = u[k4+2];
2281       d0[2] = u[k4+3];
2282 
2283       k4 = bitrev[1];
2284       d1[1] = u[k4+0];
2285       d1[0] = u[k4+1];
2286       d0[1] = u[k4+2];
2287       d0[0] = u[k4+3];
2288 
2289       d0 -= 4;
2290       d1 -= 4;
2291       bitrev += 2;
2292     }
2293   }
2294   // (paper output is u, now v)
2295 
2296 
2297   // data must be in buf2
2298   debug(stb_vorbis) assert(v == buf2);
2299 
2300   // step 7   (paper output is v, now v)
2301   // this is now in place
2302   {
2303     float a02, a11, b0, b1, b2, b3;
2304     float* C = f.C.ptr[blocktype];
2305     float* d, e;
2306     d = v;
2307     e = v+n2-4;
2308     while (d < e) {
2309       a02 = d[0]-e[2];
2310       a11 = d[1]+e[3];
2311 
2312       b0 = C[1]*a02+C[0]*a11;
2313       b1 = C[1]*a11-C[0]*a02;
2314 
2315       b2 = d[0]+e[ 2];
2316       b3 = d[1]-e[ 3];
2317 
2318       d[0] = b2+b0;
2319       d[1] = b3+b1;
2320       e[2] = b2-b0;
2321       e[3] = b1-b3;
2322 
2323       a02 = d[2]-e[0];
2324       a11 = d[3]+e[1];
2325 
2326       b0 = C[3]*a02+C[2]*a11;
2327       b1 = C[3]*a11-C[2]*a02;
2328 
2329       b2 = d[2]+e[ 0];
2330       b3 = d[3]-e[ 1];
2331 
2332       d[2] = b2+b0;
2333       d[3] = b3+b1;
2334       e[0] = b2-b0;
2335       e[1] = b1-b3;
2336 
2337       C += 4;
2338       d += 4;
2339       e -= 4;
2340     }
2341   }
2342 
2343   // data must be in buf2
2344 
2345 
2346   // step 8+decode   (paper output is X, now buffer)
2347   // this generates pairs of data a la 8 and pushes them directly through
2348   // the decode kernel (pushing rather than pulling) to avoid having
2349   // to make another pass later
2350 
2351   // this cannot POSSIBLY be in place, so we refer to the buffers directly
2352   {
2353     float p0, p1, p2, p3;
2354     float* d0, d1, d2, d3;
2355     float* B = f.B.ptr[blocktype]+n2-8;
2356     float* e = buf2+n2-8;
2357     d0 = &buffer[0];
2358     d1 = &buffer[n2-4];
2359     d2 = &buffer[n2];
2360     d3 = &buffer[n-4];
2361     while (e >= v) {
2362       p3 =  e[6]*B[7]-e[7]*B[6];
2363       p2 = -e[6]*B[6]-e[7]*B[7];
2364 
2365       d0[0] =   p3;
2366       d1[3] =  -p3;
2367       d2[0] =   p2;
2368       d3[3] =   p2;
2369 
2370       p1 =  e[4]*B[5]-e[5]*B[4];
2371       p0 = -e[4]*B[4]-e[5]*B[5];
2372 
2373       d0[1] =   p1;
2374       d1[2] = - p1;
2375       d2[1] =   p0;
2376       d3[2] =   p0;
2377 
2378       p3 =  e[2]*B[3]-e[3]*B[2];
2379       p2 = -e[2]*B[2]-e[3]*B[3];
2380 
2381       d0[2] =   p3;
2382       d1[1] = - p3;
2383       d2[2] =   p2;
2384       d3[1] =   p2;
2385 
2386       p1 =  e[0]*B[1]-e[1]*B[0];
2387       p0 = -e[0]*B[0]-e[1]*B[1];
2388 
2389       d0[3] =   p1;
2390       d1[0] = - p1;
2391       d2[3] =   p0;
2392       d3[0] =   p0;
2393 
2394       B -= 8;
2395       e -= 8;
2396       d0 += 4;
2397       d2 += 4;
2398       d1 -= 4;
2399       d3 -= 4;
2400     }
2401   }
2402 
2403   temp_free(f, buf2);
2404   temp_alloc_restore(f, save_point);
2405 }
2406 
2407 private float *get_window (VorbisDecoder f, int len) {
2408   len <<= 1;
2409   if (len == f.blocksize_0) return f.window.ptr[0];
2410   if (len == f.blocksize_1) return f.window.ptr[1];
2411   assert(0);
2412 }
2413 
2414 version(STB_VORBIS_NO_DEFER_FLOOR) {
2415   alias YTYPE = int;
2416 } else {
2417   alias YTYPE = short;
2418 }
2419 
2420 private int do_floor (VorbisDecoder f, Mapping* map, int i, int n, float* target, YTYPE* finalY, ubyte* step2_flag) {
2421   int n2 = n>>1;
2422   int s = map.chan[i].mux, floor;
2423   floor = map.submap_floor.ptr[s];
2424   if (f.floor_types.ptr[floor] == 0) {
2425     return error(f, STBVorbisError.invalid_stream);
2426   } else {
2427     Floor1* g = &f.floor_config[floor].floor1;
2428     int lx = 0, ly = finalY[0]*g.floor1_multiplier;
2429     foreach (immutable q; 1..g.values) {
2430       int j = g.sorted_order.ptr[q];
2431       version(STB_VORBIS_NO_DEFER_FLOOR) {
2432         auto cond = step2_flag[j];
2433       } else {
2434         auto cond = (finalY[j] >= 0);
2435       }
2436       if (cond) {
2437         int hy = finalY[j]*g.floor1_multiplier;
2438         int hx = g.Xlist.ptr[j];
2439         if (lx != hx) { mixin(draw_line!("target", "lx", "ly", "hx", "hy", "n2")); }
2440         lx = hx; ly = hy;
2441       }
2442     }
2443     if (lx < n2) {
2444       // optimization of: draw_line(target, lx, ly, n, ly, n2);
2445       foreach (immutable j; lx..n2) { mixin(LINE_OP!("target[j]", "inverse_db_table[ly]")); }
2446     }
2447   }
2448   return true;
2449 }
2450 
2451 // The meaning of "left" and "right"
2452 //
2453 // For a given frame:
2454 //     we compute samples from 0..n
2455 //     window_center is n/2
2456 //     we'll window and mix the samples from left_start to left_end with data from the previous frame
2457 //     all of the samples from left_end to right_start can be output without mixing; however,
2458 //        this interval is 0-length except when transitioning between short and long frames
2459 //     all of the samples from right_start to right_end need to be mixed with the next frame,
2460 //        which we don't have, so those get saved in a buffer
2461 //     frame N's right_end-right_start, the number of samples to mix with the next frame,
2462 //        has to be the same as frame N+1's left_end-left_start (which they are by
2463 //        construction)
2464 
2465 private int vorbis_decode_initial (VorbisDecoder f, int* p_left_start, int* p_left_end, int* p_right_start, int* p_right_end, int* mode) {
2466   Mode *m;
2467   int i, n, prev, next, window_center;
2468   f.channel_buffer_start = f.channel_buffer_end = 0;
2469 
2470  retry:
2471   if (f.eof) return false;
2472   if (!maybe_start_packet(f)) return false;
2473   // check packet type
2474   if (get_bits!1(f) != 0) {
2475     /+if (f.push_mode) return error(f, STBVorbisError.bad_packet_type);+/
2476     while (EOP != get8_packet(f)) {}
2477     goto retry;
2478   }
2479 
2480   //debug(stb_vorbis) if (f.alloc.alloc_buffer) assert(f.alloc.alloc_buffer_length_in_bytes == f.temp_offset);
2481 
2482   i = get_bits_main(f, ilog(f.mode_count-1));
2483   if (i == EOP) return false;
2484   if (i >= f.mode_count) return false;
2485   *mode = i;
2486   m = f.mode_config.ptr+i;
2487   if (m.blockflag) {
2488     n = f.blocksize_1;
2489     prev = get_bits!1(f);
2490     next = get_bits!1(f);
2491   } else {
2492     prev = next = 0;
2493     n = f.blocksize_0;
2494   }
2495 
2496   // WINDOWING
2497   window_center = n>>1;
2498   if (m.blockflag && !prev) {
2499     *p_left_start = (n-f.blocksize_0)>>2;
2500     *p_left_end   = (n+f.blocksize_0)>>2;
2501   } else {
2502     *p_left_start = 0;
2503     *p_left_end   = window_center;
2504   }
2505   if (m.blockflag && !next) {
2506     *p_right_start = (n*3-f.blocksize_0)>>2;
2507     *p_right_end   = (n*3+f.blocksize_0)>>2;
2508   } else {
2509     *p_right_start = window_center;
2510     *p_right_end   = n;
2511   }
2512   return true;
2513 }
2514 
2515 private int vorbis_decode_packet_rest (VorbisDecoder f, int* len, Mode* m, int left_start, int left_end, int right_start, int right_end, int* p_left) {
2516   import core.stdc.string : memcpy, memset;
2517 
2518   Mapping* map;
2519   int n, n2;
2520   int[256] zero_channel;
2521   int[256] really_zero_channel;
2522 
2523   // WINDOWING
2524   n = f.blocksize.ptr[m.blockflag];
2525   map = &f.mapping[m.mapping];
2526 
2527   // FLOORS
2528   n2 = n>>1;
2529 
2530   //stb_prof(1);
2531   foreach (immutable i; 0..f.vrchannels) {
2532     int s = map.chan[i].mux, floor;
2533     zero_channel[i] = false;
2534     floor = map.submap_floor.ptr[s];
2535     if (f.floor_types.ptr[floor] == 0) {
2536       return error(f, STBVorbisError.invalid_stream);
2537     } else {
2538       Floor1* g = &f.floor_config[floor].floor1;
2539       if (get_bits!1(f)) {
2540         short* finalY;
2541         ubyte[256] step2_flag = void;
2542         immutable int[4] range_list = [ 256, 128, 86, 64 ];
2543         int range = range_list[g.floor1_multiplier-1];
2544         int offset = 2;
2545         finalY = f.finalY.ptr[i];
2546         finalY[0] = cast(short)get_bits_main(f, ilog(range)-1); //k8
2547         finalY[1] = cast(short)get_bits_main(f, ilog(range)-1); //k8
2548         foreach (immutable j; 0..g.partitions) {
2549           int pclass = g.partition_class_list.ptr[j];
2550           int cdim = g.class_dimensions.ptr[pclass];
2551           int cbits = g.class_subclasses.ptr[pclass];
2552           int csub = (1<<cbits)-1;
2553           int cval = 0;
2554           if (cbits) {
2555             Codebook *cc = f.codebooks+g.class_masterbooks.ptr[pclass];
2556             mixin(DECODE!("cval", "cc"));
2557           }
2558           foreach (immutable k; 0..cdim) {
2559             int book = g.subclass_books.ptr[pclass].ptr[cval&csub];
2560             cval = cval>>cbits;
2561             if (book >= 0) {
2562               int temp;
2563               Codebook *cc = f.codebooks+book;
2564               mixin(DECODE!("temp", "cc"));
2565               finalY[offset++] = cast(short)temp; //k8
2566             } else {
2567               finalY[offset++] = 0;
2568             }
2569           }
2570         }
2571         if (f.valid_bits == INVALID_BITS) goto error; // behavior according to spec
2572         step2_flag[0] = step2_flag[1] = 1;
2573         foreach (immutable j; 2..g.values) {
2574           int low = g.neighbors.ptr[j].ptr[0];
2575           int high = g.neighbors.ptr[j].ptr[1];
2576           //neighbors(g.Xlist, j, &low, &high);
2577           int pred = void;
2578           mixin(predict_point!("pred", "g.Xlist.ptr[j]", "g.Xlist.ptr[low]", "g.Xlist.ptr[high]", "finalY[low]", "finalY[high]"));
2579           int val = finalY[j];
2580           int highroom = range-pred;
2581           int lowroom = pred;
2582           auto room = (highroom < lowroom ? highroom : lowroom)*2;
2583           if (val) {
2584             step2_flag[low] = step2_flag[high] = 1;
2585             step2_flag[j] = 1;
2586             if (val >= room) {
2587               finalY[j] = cast(short)(highroom > lowroom ? val-lowroom+pred : pred-val+highroom-1); //k8
2588             } else {
2589               finalY[j] = cast(short)(val&1 ? pred-((val+1)>>1) : pred+(val>>1)); //k8
2590             }
2591           } else {
2592             step2_flag[j] = 0;
2593             finalY[j] = cast(short)pred; //k8
2594           }
2595         }
2596 
2597         version(STB_VORBIS_NO_DEFER_FLOOR) {
2598           do_floor(f, map, i, n, f.floor_buffers.ptr[i], finalY, step2_flag);
2599         } else {
2600           // defer final floor computation until _after_ residue
2601           foreach (immutable j; 0..g.values) if (!step2_flag[j]) finalY[j] = -1;
2602         }
2603       } else {
2604   error:
2605         zero_channel[i] = true;
2606       }
2607       // So we just defer everything else to later
2608       // at this point we've decoded the floor into buffer
2609     }
2610   }
2611   //stb_prof(0);
2612   // at this point we've decoded all floors
2613 
2614   //debug(stb_vorbis) if (f.alloc.alloc_buffer) assert(f.alloc.alloc_buffer_length_in_bytes == f.temp_offset);
2615 
2616   // re-enable coupled channels if necessary
2617   memcpy(really_zero_channel.ptr, zero_channel.ptr, (really_zero_channel[0]).sizeof*f.vrchannels);
2618   foreach (immutable i; 0..map.coupling_steps) {
2619     if (!zero_channel[map.chan[i].magnitude] || !zero_channel[map.chan[i].angle]) {
2620       zero_channel[map.chan[i].magnitude] = zero_channel[map.chan[i].angle] = false;
2621     }
2622   }
2623 
2624   // RESIDUE DECODE
2625   foreach (immutable i; 0..map.submaps) {
2626     float*[STB_VORBIS_MAX_CHANNELS] residue_buffers;
2627     ubyte[256] do_not_decode = void;
2628     int ch = 0;
2629     foreach (immutable j; 0..f.vrchannels) {
2630       if (map.chan[j].mux == i) {
2631         if (zero_channel[j]) {
2632           do_not_decode[ch] = true;
2633           residue_buffers.ptr[ch] = null;
2634         } else {
2635           do_not_decode[ch] = false;
2636           residue_buffers.ptr[ch] = f.channel_buffers.ptr[j];
2637         }
2638         ++ch;
2639       }
2640     }
2641     int r = map.submap_residue.ptr[i];
2642     decode_residue(f, residue_buffers, ch, n2, r, do_not_decode.ptr);
2643   }
2644 
2645   //debug(stb_vorbis) if (f.alloc.alloc_buffer) assert(f.alloc.alloc_buffer_length_in_bytes == f.temp_offset);
2646 
2647    // INVERSE COUPLING
2648   //stb_prof(14);
2649   foreach_reverse (immutable i; 0..map.coupling_steps) {
2650     int n2n = n>>1;
2651     float* mm = f.channel_buffers.ptr[map.chan[i].magnitude];
2652     float* a = f.channel_buffers.ptr[map.chan[i].angle];
2653     foreach (immutable j; 0..n2n) {
2654       float a2, m2;
2655       if (mm[j] > 0) {
2656         if (a[j] > 0) { m2 = mm[j]; a2 = mm[j]-a[j]; } else { a2 = mm[j]; m2 = mm[j]+a[j]; }
2657       } else {
2658         if (a[j] > 0) { m2 = mm[j]; a2 = mm[j]+a[j]; } else { a2 = mm[j]; m2 = mm[j]-a[j]; }
2659       }
2660       mm[j] = m2;
2661       a[j] = a2;
2662     }
2663   }
2664 
2665   // finish decoding the floors
2666   version(STB_VORBIS_NO_DEFER_FLOOR) {
2667     foreach (immutable i; 0..f.vrchannels) {
2668       if (really_zero_channel[i]) {
2669         memset(f.channel_buffers.ptr[i], 0, (*f.channel_buffers.ptr[i]).sizeof*n2);
2670       } else {
2671         foreach (immutable j; 0..n2) f.channel_buffers.ptr[i].ptr[j] *= f.floor_buffers.ptr[i].ptr[j];
2672       }
2673     }
2674   } else {
2675     //stb_prof(15);
2676     foreach (immutable i; 0..f.vrchannels) {
2677       if (really_zero_channel[i]) {
2678         memset(f.channel_buffers.ptr[i], 0, (*f.channel_buffers.ptr[i]).sizeof*n2);
2679       } else {
2680         do_floor(f, map, i, n, f.channel_buffers.ptr[i], f.finalY.ptr[i], null);
2681       }
2682     }
2683   }
2684 
2685   // INVERSE MDCT
2686   //stb_prof(16);
2687   foreach (immutable i; 0..f.vrchannels) inverse_mdct(f.channel_buffers.ptr[i], n, f, m.blockflag);
2688   //stb_prof(0);
2689 
2690   // this shouldn't be necessary, unless we exited on an error
2691   // and want to flush to get to the next packet
2692   flush_packet(f);
2693 
2694   if (f.first_decode) {
2695     // assume we start so first non-discarded sample is sample 0
2696     // this isn't to spec, but spec would require us to read ahead
2697     // and decode the size of all current frames--could be done,
2698     // but presumably it's not a commonly used feature
2699     f.current_loc = -n2; // start of first frame is positioned for discard
2700     // we might have to discard samples "from" the next frame too,
2701     // if we're lapping a large block then a small at the start?
2702     f.discard_samples_deferred = n-right_end;
2703     f.current_loc_valid = true;
2704     f.first_decode = false;
2705   } else if (f.discard_samples_deferred) {
2706     if (f.discard_samples_deferred >= right_start-left_start) {
2707       f.discard_samples_deferred -= (right_start-left_start);
2708       left_start = right_start;
2709       *p_left = left_start;
2710     } else {
2711       left_start += f.discard_samples_deferred;
2712       *p_left = left_start;
2713       f.discard_samples_deferred = 0;
2714     }
2715   } else if (f.previous_length == 0 && f.current_loc_valid) {
2716     // we're recovering from a seek... that means we're going to discard
2717     // the samples from this packet even though we know our position from
2718     // the last page header, so we need to update the position based on
2719     // the discarded samples here
2720     // but wait, the code below is going to add this in itself even
2721     // on a discard, so we don't need to do it here...
2722   }
2723 
2724   // check if we have ogg information about the sample # for this packet
2725   if (f.last_seg_which == f.end_seg_with_known_loc) {
2726     // if we have a valid current loc, and this is final:
2727     if (f.current_loc_valid && (f.page_flag&PAGEFLAG_last_page)) {
2728       uint current_end = f.known_loc_for_packet-(n-right_end);
2729       // then let's infer the size of the (probably) short final frame
2730       if (current_end < f.current_loc+right_end) {
2731         if (current_end < f.current_loc+(right_end-left_start)) {
2732           // negative truncation, that's impossible!
2733           *len = 0;
2734         } else {
2735           *len = current_end-f.current_loc;
2736         }
2737         *len += left_start;
2738         if (*len > right_end) *len = right_end; // this should never happen
2739         f.current_loc += *len;
2740         return true;
2741       }
2742     }
2743     // otherwise, just set our sample loc
2744     // guess that the ogg granule pos refers to the _middle_ of the
2745     // last frame?
2746     // set f.current_loc to the position of left_start
2747     f.current_loc = f.known_loc_for_packet-(n2-left_start);
2748     f.current_loc_valid = true;
2749   }
2750   if (f.current_loc_valid) f.current_loc += (right_start-left_start);
2751 
2752   //debug(stb_vorbis) if (f.alloc.alloc_buffer) assert(f.alloc.alloc_buffer_length_in_bytes == f.temp_offset);
2753 
2754   *len = right_end;  // ignore samples after the window goes to 0
2755   return true;
2756 }
2757 
2758 private int vorbis_decode_packet (VorbisDecoder f, int* len, int* p_left, int* p_right) {
2759   int mode, left_end, right_end;
2760   if (!vorbis_decode_initial(f, p_left, &left_end, p_right, &right_end, &mode)) return 0;
2761   return vorbis_decode_packet_rest(f, len, f.mode_config.ptr+mode, *p_left, left_end, *p_right, right_end, p_left);
2762 }
2763 
2764 private int vorbis_finish_frame (VorbisDecoder f, int len, int left, int right) {
2765   // we use right&left (the start of the right- and left-window sin()-regions)
2766   // to determine how much to return, rather than inferring from the rules
2767   // (same result, clearer code); 'left' indicates where our sin() window
2768   // starts, therefore where the previous window's right edge starts, and
2769   // therefore where to start mixing from the previous buffer. 'right'
2770   // indicates where our sin() ending-window starts, therefore that's where
2771   // we start saving, and where our returned-data ends.
2772 
2773   // mixin from previous window
2774   if (f.previous_length) {
2775     int n = f.previous_length;
2776     float *w = get_window(f, n);
2777     foreach (immutable i; 0..f.vrchannels) {
2778       foreach (immutable j; 0..n) {
2779         (f.channel_buffers.ptr[i])[left+j] =
2780           (f.channel_buffers.ptr[i])[left+j]*w[    j]+
2781           (f.previous_window.ptr[i])[     j]*w[n-1-j];
2782       }
2783     }
2784   }
2785 
2786   auto prev = f.previous_length;
2787 
2788   // last half of this data becomes previous window
2789   f.previous_length = len-right;
2790 
2791   // @OPTIMIZE: could avoid this copy by double-buffering the
2792   // output (flipping previous_window with channel_buffers), but
2793   // then previous_window would have to be 2x as large, and
2794   // channel_buffers couldn't be temp mem (although they're NOT
2795   // currently temp mem, they could be (unless we want to level
2796   // performance by spreading out the computation))
2797   foreach (immutable i; 0..f.vrchannels) {
2798     for (uint j = 0; right+j < len; ++j) (f.previous_window.ptr[i])[j] = (f.channel_buffers.ptr[i])[right+j];
2799   }
2800 
2801   if (!prev) {
2802     // there was no previous packet, so this data isn't valid...
2803     // this isn't entirely true, only the would-have-overlapped data
2804     // isn't valid, but this seems to be what the spec requires
2805     return 0;
2806   }
2807 
2808   // truncate a short frame
2809   if (len < right) right = len;
2810 
2811   f.samples_output += right-left;
2812 
2813   return right-left;
2814 }
2815 
2816 private bool vorbis_pump_first_frame (VorbisDecoder f) {
2817   int len, right, left;
2818   if (vorbis_decode_packet(f, &len, &left, &right)) {
2819     vorbis_finish_frame(f, len, left, right);
2820     return true;
2821   }
2822   return false;
2823 }
2824 
2825 /+ k8: i don't need that, so it's dead
2826 private int is_whole_packet_present (VorbisDecoder f, int end_page) {
2827   import core.stdc.string : memcmp;
2828 
2829   // make sure that we have the packet available before continuing...
2830   // this requires a full ogg parse, but we know we can fetch from f.stream
2831 
2832   // instead of coding this out explicitly, we could save the current read state,
2833   // read the next packet with get8() until end-of-packet, check f.eof, then
2834   // reset the state? but that would be slower, esp. since we'd have over 256 bytes
2835   // of state to restore (primarily the page segment table)
2836 
2837   int s = f.next_seg, first = true;
2838   ubyte *p = f.stream;
2839 
2840   if (s != -1) { // if we're not starting the packet with a 'continue on next page' flag
2841     for (; s < f.segment_count; ++s) {
2842       p += f.segments[s];
2843       if (f.segments[s] < 255) break; // stop at first short segment
2844     }
2845     // either this continues, or it ends it...
2846     if (end_page && s < f.segment_count-1) return error(f, STBVorbisError.invalid_stream);
2847     if (s == f.segment_count) s = -1; // set 'crosses page' flag
2848     if (p > f.stream_end) return error(f, STBVorbisError.need_more_data);
2849     first = false;
2850   }
2851   while (s == -1) {
2852     ubyte* q = void;
2853     int n = void;
2854     // check that we have the page header ready
2855     if (p+26 >= f.stream_end) return error(f, STBVorbisError.need_more_data);
2856     // validate the page
2857     if (memcmp(p, ogg_page_header.ptr, 4)) return error(f, STBVorbisError.invalid_stream);
2858     if (p[4] != 0) return error(f, STBVorbisError.invalid_stream);
2859     if (first) { // the first segment must NOT have 'continued_packet', later ones MUST
2860       if (f.previous_length && (p[5]&PAGEFLAG_continued_packet)) return error(f, STBVorbisError.invalid_stream);
2861       // if no previous length, we're resynching, so we can come in on a continued-packet,
2862       // which we'll just drop
2863     } else {
2864       if (!(p[5]&PAGEFLAG_continued_packet)) return error(f, STBVorbisError.invalid_stream);
2865     }
2866     n = p[26]; // segment counts
2867     q = p+27; // q points to segment table
2868     p = q+n; // advance past header
2869     // make sure we've read the segment table
2870     if (p > f.stream_end) return error(f, STBVorbisError.need_more_data);
2871     for (s = 0; s < n; ++s) {
2872       p += q[s];
2873       if (q[s] < 255) break;
2874     }
2875     if (end_page && s < n-1) return error(f, STBVorbisError.invalid_stream);
2876     if (s == n) s = -1; // set 'crosses page' flag
2877     if (p > f.stream_end) return error(f, STBVorbisError.need_more_data);
2878     first = false;
2879   }
2880   return true;
2881 }
2882 +/
2883 
2884 private int start_decoder (VorbisDecoder f) {
2885   import core.stdc.string : memcpy, memset;
2886 
2887   ubyte[6] header;
2888   ubyte x, y;
2889   int len, max_submaps = 0;
2890   int longest_floorlist = 0;
2891 
2892   // first page, first packet
2893 
2894   if (!start_page(f)) return false;
2895   // validate page flag
2896   if (!(f.page_flag&PAGEFLAG_first_page)) return error(f, STBVorbisError.invalid_first_page);
2897   if (f.page_flag&PAGEFLAG_last_page) return error(f, STBVorbisError.invalid_first_page);
2898   if (f.page_flag&PAGEFLAG_continued_packet) return error(f, STBVorbisError.invalid_first_page);
2899   // check for expected packet length
2900   if (f.segment_count != 1) return error(f, STBVorbisError.invalid_first_page);
2901   if (f.segments[0] != 30) return error(f, STBVorbisError.invalid_first_page);
2902   // read packet
2903   // check packet header
2904   if (get8(f) != VorbisPacket.id) return error(f, STBVorbisError.invalid_first_page);
2905   if (!getn(f, header.ptr, 6)) return error(f, STBVorbisError.unexpected_eof);
2906   if (!vorbis_validate(header.ptr)) return error(f, STBVorbisError.invalid_first_page);
2907   // vorbis_version
2908   if (get32(f) != 0) return error(f, STBVorbisError.invalid_first_page);
2909   f.vrchannels = get8(f); if (!f.vrchannels) return error(f, STBVorbisError.invalid_first_page);
2910   if (f.vrchannels > STB_VORBIS_MAX_CHANNELS) return error(f, STBVorbisError.too_many_channels);
2911   f.sample_rate = get32(f); if (!f.sample_rate) return error(f, STBVorbisError.invalid_first_page);
2912   get32(f); // bitrate_maximum
2913   get32(f); // bitrate_nominal
2914   get32(f); // bitrate_minimum
2915   x = get8(f);
2916   {
2917     int log0 = x&15;
2918     int log1 = x>>4;
2919     f.blocksize_0 = 1<<log0;
2920     f.blocksize_1 = 1<<log1;
2921     if (log0 < 6 || log0 > 13) return error(f, STBVorbisError.invalid_setup);
2922     if (log1 < 6 || log1 > 13) return error(f, STBVorbisError.invalid_setup);
2923     if (log0 > log1) return error(f, STBVorbisError.invalid_setup);
2924   }
2925 
2926   // framing_flag
2927   x = get8(f);
2928   if (!(x&1)) return error(f, STBVorbisError.invalid_first_page);
2929 
2930   // second packet! (comments)
2931   if (!start_page(f)) return false;
2932 
2933   // read comments
2934   if (!start_packet(f)) return false;
2935 
2936   if (f.read_comments) {
2937     /+if (f.push_mode) {
2938       if (!is_whole_packet_present(f, true)) {
2939         // convert error in ogg header to write type
2940         if (f.error == STBVorbisError.invalid_stream) f.error = STBVorbisError.invalid_setup;
2941         return false;
2942       }
2943     }+/
2944     if (get8_packet(f) != VorbisPacket.comment) return error(f, STBVorbisError.invalid_setup);
2945     foreach (immutable i; 0..6) header[i] = cast(ubyte)get8_packet(f); //k8
2946     if (!vorbis_validate(header.ptr)) return error(f, STBVorbisError.invalid_setup);
2947 
2948     // skip vendor id
2949     uint vidsize = get32_packet(f);
2950     //{ import core.stdc.stdio; printf("vendor size: %u\n", vidsize); }
2951     if (vidsize == EOP) return error(f, STBVorbisError.invalid_setup);
2952     while (vidsize--) get8_packet(f);
2953 
2954     // read comments section
2955     uint cmtcount = get32_packet(f);
2956     if (cmtcount == EOP) return error(f, STBVorbisError.invalid_setup);
2957     if (cmtcount > 0) {
2958       uint cmtsize = 32768; // this should be enough for everyone
2959       f.comment_data = setup_malloc!ubyte(f, cmtsize);
2960       if (f.comment_data is null) return error(f, STBVorbisError.outofmem);
2961       auto cmtpos = 0;
2962       auto d = f.comment_data;
2963       while (cmtcount--) {
2964         uint linelen = get32_packet(f);
2965         //{ import core.stdc.stdio; printf("linelen: %u; lines left: %u\n", linelen, cmtcount); }
2966         if (linelen == EOP || linelen > ushort.max-2) break;
2967         if (linelen == 0) { continue; }
2968         if (cmtpos+2+linelen > cmtsize) break;
2969         cmtpos += linelen+2;
2970         *d++ = (linelen+2)&0xff;
2971         *d++ = ((linelen+2)>>8)&0xff;
2972         while (linelen--) {
2973           auto b = get8_packet(f);
2974           if (b == EOP) return error(f, STBVorbisError.outofmem);
2975           *d++ = cast(ubyte)b;
2976         }
2977         //{ import core.stdc.stdio; printf("%u bytes of comments read\n", cmtpos); }
2978         f.comment_size = cmtpos;
2979       }
2980     }
2981     flush_packet(f);
2982     f.comment_rewind();
2983   } else {
2984     // skip comments
2985     do {
2986       len = next_segment(f);
2987       skip(f, len);
2988       f.bytes_in_seg = 0;
2989     } while (len);
2990   }
2991 
2992   // third packet!
2993   if (!start_packet(f)) return false;
2994 
2995   /+if (f.push_mode) {
2996     if (!is_whole_packet_present(f, true)) {
2997       // convert error in ogg header to write type
2998       if (f.error == STBVorbisError.invalid_stream) f.error = STBVorbisError.invalid_setup;
2999       return false;
3000     }
3001   }+/
3002 
3003   if (get8_packet(f) != VorbisPacket.setup) return error(f, STBVorbisError.invalid_setup);
3004   foreach (immutable i; 0..6) header[i] = cast(ubyte)get8_packet(f); //k8
3005   if (!vorbis_validate(header.ptr)) return error(f, STBVorbisError.invalid_setup);
3006 
3007   // codebooks
3008   f.codebook_count = get_bits!8(f)+1;
3009   f.codebooks = setup_malloc!Codebook(f, f.codebook_count);
3010   static assert((*f.codebooks).sizeof == Codebook.sizeof);
3011   if (f.codebooks is null) return error(f, STBVorbisError.outofmem);
3012   memset(f.codebooks, 0, (*f.codebooks).sizeof*f.codebook_count);
3013   foreach (immutable i; 0..f.codebook_count) {
3014     uint* values;
3015     int ordered, sorted_count;
3016     int total = 0;
3017     ubyte* lengths;
3018     Codebook* c = f.codebooks+i;
3019     x = get_bits!8(f); if (x != 0x42) return error(f, STBVorbisError.invalid_setup);
3020     x = get_bits!8(f); if (x != 0x43) return error(f, STBVorbisError.invalid_setup);
3021     x = get_bits!8(f); if (x != 0x56) return error(f, STBVorbisError.invalid_setup);
3022     x = get_bits!8(f);
3023     c.dimensions = (get_bits!8(f)<<8)+x;
3024     x = get_bits!8(f);
3025     y = get_bits!8(f);
3026     c.entries = (get_bits!8(f)<<16)+(y<<8)+x;
3027     ordered = get_bits!1(f);
3028     c.sparse = (ordered ? 0 : get_bits!1(f));
3029 
3030     if (c.dimensions == 0 && c.entries != 0) return error(f, STBVorbisError.invalid_setup);
3031 
3032     if (c.sparse) {
3033       lengths = cast(ubyte*)setup_temp_malloc(f, c.entries);
3034     } else {
3035       lengths = c.codeword_lengths = setup_malloc!ubyte(f, c.entries);
3036     }
3037 
3038     if (lengths is null) return error(f, STBVorbisError.outofmem);
3039 
3040     if (ordered) {
3041       int current_entry = 0;
3042       int current_length = get_bits_add_no!5(f, 1);
3043       while (current_entry < c.entries) {
3044         int limit = c.entries-current_entry;
3045         int n = get_bits_main(f, ilog(limit));
3046         if (current_entry+n > cast(int)c.entries) return error(f, STBVorbisError.invalid_setup);
3047         memset(lengths+current_entry, current_length, n);
3048         current_entry += n;
3049         ++current_length;
3050       }
3051     } else {
3052       foreach (immutable j; 0..c.entries) {
3053         int present = (c.sparse ? get_bits!1(f) : 1);
3054         if (present) {
3055           lengths[j] = get_bits_add_no!5(f, 1);
3056           ++total;
3057           if (lengths[j] == 32) return error(f, STBVorbisError.invalid_setup);
3058         } else {
3059           lengths[j] = NO_CODE;
3060         }
3061       }
3062     }
3063 
3064     if (c.sparse && total >= c.entries>>2) {
3065       // convert sparse items to non-sparse!
3066       if (c.entries > cast(int)f.setup_temp_memory_required) f.setup_temp_memory_required = c.entries;
3067       c.codeword_lengths = setup_malloc!ubyte(f, c.entries);
3068       if (c.codeword_lengths is null) return error(f, STBVorbisError.outofmem);
3069       memcpy(c.codeword_lengths, lengths, c.entries);
3070       setup_temp_free(f, lengths, c.entries); // note this is only safe if there have been no intervening temp mallocs!
3071       lengths = c.codeword_lengths;
3072       c.sparse = 0;
3073     }
3074 
3075     // compute the size of the sorted tables
3076     if (c.sparse) {
3077       sorted_count = total;
3078     } else {
3079       sorted_count = 0;
3080       version(STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH) {} else {
3081         foreach (immutable j; 0..c.entries) if (lengths[j] > STB_VORBIS_FAST_HUFFMAN_LENGTH && lengths[j] != NO_CODE) ++sorted_count;
3082       }
3083     }
3084 
3085     c.sorted_entries = sorted_count;
3086     values = null;
3087 
3088     if (!c.sparse) {
3089       c.codewords = setup_malloc!uint(f, c.entries);
3090       if (!c.codewords) return error(f, STBVorbisError.outofmem);
3091     } else {
3092       if (c.sorted_entries) {
3093         c.codeword_lengths = setup_malloc!ubyte(f, c.sorted_entries);
3094         if (!c.codeword_lengths) return error(f, STBVorbisError.outofmem);
3095         c.codewords = cast(uint*)setup_temp_malloc(f, cast(int)(*c.codewords).sizeof*c.sorted_entries);
3096         if (!c.codewords) return error(f, STBVorbisError.outofmem);
3097         values = cast(uint*)setup_temp_malloc(f, cast(int)(*values).sizeof*c.sorted_entries);
3098         if (!values) return error(f, STBVorbisError.outofmem);
3099       }
3100       uint size = c.entries+cast(int)((*c.codewords).sizeof+(*values).sizeof)*c.sorted_entries;
3101       if (size > f.setup_temp_memory_required) f.setup_temp_memory_required = size;
3102     }
3103 
3104     if (!compute_codewords(c, lengths, c.entries, values)) {
3105       if (c.sparse) setup_temp_free(f, values, 0);
3106       return error(f, STBVorbisError.invalid_setup);
3107     }
3108 
3109     if (c.sorted_entries) {
3110       // allocate an extra slot for sentinels
3111       c.sorted_codewords = setup_malloc!uint(f, c.sorted_entries+1);
3112       if (c.sorted_codewords is null) return error(f, STBVorbisError.outofmem);
3113       // allocate an extra slot at the front so that c.sorted_values[-1] is defined
3114       // so that we can catch that case without an extra if
3115       c.sorted_values = setup_malloc!int(f, c.sorted_entries+1);
3116       if (c.sorted_values is null) return error(f, STBVorbisError.outofmem);
3117       ++c.sorted_values;
3118       c.sorted_values[-1] = -1;
3119       compute_sorted_huffman(c, lengths, values);
3120     }
3121 
3122     if (c.sparse) {
3123       setup_temp_free(f, values, cast(int)(*values).sizeof*c.sorted_entries);
3124       setup_temp_free(f, c.codewords, cast(int)(*c.codewords).sizeof*c.sorted_entries);
3125       setup_temp_free(f, lengths, c.entries);
3126       c.codewords = null;
3127     }
3128 
3129     compute_accelerated_huffman(c);
3130 
3131     c.lookup_type = get_bits!4(f);
3132     if (c.lookup_type > 2) return error(f, STBVorbisError.invalid_setup);
3133     if (c.lookup_type > 0) {
3134       ushort* mults;
3135       c.minimum_value = float32_unpack(get_bits!32(f));
3136       c.delta_value = float32_unpack(get_bits!32(f));
3137       c.value_bits = get_bits_add_no!4(f, 1);
3138       c.sequence_p = get_bits!1(f);
3139       if (c.lookup_type == 1) {
3140         c.lookup_values = lookup1_values(c.entries, c.dimensions);
3141       } else {
3142         c.lookup_values = c.entries*c.dimensions;
3143       }
3144       if (c.lookup_values == 0) return error(f, STBVorbisError.invalid_setup);
3145       mults = cast(ushort*)setup_temp_malloc(f, cast(int)(mults[0]).sizeof*c.lookup_values);
3146       if (mults is null) return error(f, STBVorbisError.outofmem);
3147       foreach (immutable j; 0..cast(int)c.lookup_values) {
3148         int q = get_bits_main(f, c.value_bits);
3149         if (q == EOP) { setup_temp_free(f, mults, cast(int)(mults[0]).sizeof*c.lookup_values); return error(f, STBVorbisError.invalid_setup); }
3150         mults[j] = cast(ushort)q; //k8
3151       }
3152 
3153       version(STB_VORBIS_DIVIDES_IN_CODEBOOK) {} else {
3154         if (c.lookup_type == 1) {
3155           int sparse = c.sparse; //len
3156           float last = 0;
3157           // pre-expand the lookup1-style multiplicands, to avoid a divide in the inner loop
3158           if (sparse) {
3159             if (c.sorted_entries == 0) goto skip;
3160             c.multiplicands = setup_malloc!codetype(f, c.sorted_entries*c.dimensions);
3161           } else {
3162             c.multiplicands = setup_malloc!codetype(f, c.entries*c.dimensions);
3163           }
3164           if (c.multiplicands is null) { setup_temp_free(f, mults, cast(int)(mults[0]).sizeof*c.lookup_values); return error(f, STBVorbisError.outofmem); }
3165           foreach (immutable j; 0..(sparse ? c.sorted_entries : c.entries)) {
3166             uint z = (sparse ? c.sorted_values[j] : j);
3167             uint div = 1;
3168             foreach (immutable k; 0..c.dimensions) {
3169               int off = (z/div)%c.lookup_values;
3170               float val = mults[off];
3171               val = val*c.delta_value+c.minimum_value+last;
3172               c.multiplicands[j*c.dimensions+k] = val;
3173               if (c.sequence_p) last = val;
3174               if (k+1 < c.dimensions) {
3175                  if (div > uint.max/cast(uint)c.lookup_values) {
3176                     setup_temp_free(f, mults, cast(uint)(mults[0]).sizeof*c.lookup_values);
3177                     return error(f, STBVorbisError.invalid_setup);
3178                  }
3179                  div *= c.lookup_values;
3180               }
3181             }
3182           }
3183           c.lookup_type = 2;
3184           goto skip;
3185         }
3186         //else
3187       }
3188       {
3189         float last = 0;
3190         c.multiplicands = setup_malloc!codetype(f, c.lookup_values);
3191         if (c.multiplicands is null) { setup_temp_free(f, mults, cast(uint)(mults[0]).sizeof*c.lookup_values); return error(f, STBVorbisError.outofmem); }
3192         foreach (immutable j; 0..cast(int)c.lookup_values) {
3193           float val = mults[j]*c.delta_value+c.minimum_value+last;
3194           c.multiplicands[j] = val;
3195           if (c.sequence_p) last = val;
3196         }
3197       }
3198      //version(STB_VORBIS_DIVIDES_IN_CODEBOOK)
3199      skip: // this is versioned out in C
3200       setup_temp_free(f, mults, cast(uint)(mults[0]).sizeof*c.lookup_values);
3201     }
3202   }
3203 
3204   // time domain transfers (notused)
3205   x = get_bits_add_no!6(f, 1);
3206   foreach (immutable i; 0..x) {
3207     auto z = get_bits!16(f);
3208     if (z != 0) return error(f, STBVorbisError.invalid_setup);
3209   }
3210 
3211   // Floors
3212   f.floor_count = get_bits_add_no!6(f, 1);
3213   f.floor_config = setup_malloc!Floor(f, f.floor_count);
3214   if (f.floor_config is null) return error(f, STBVorbisError.outofmem);
3215   foreach (immutable i; 0..f.floor_count) {
3216     f.floor_types[i] = get_bits!16(f);
3217     if (f.floor_types[i] > 1) return error(f, STBVorbisError.invalid_setup);
3218     if (f.floor_types[i] == 0) {
3219       Floor0* g = &f.floor_config[i].floor0;
3220       g.order = get_bits!8(f);
3221       g.rate = get_bits!16(f);
3222       g.bark_map_size = get_bits!16(f);
3223       g.amplitude_bits = get_bits!6(f);
3224       g.amplitude_offset = get_bits!8(f);
3225       g.number_of_books = get_bits_add_no!4(f, 1);
3226       foreach (immutable j; 0..g.number_of_books) g.book_list[j] = get_bits!8(f);
3227       return error(f, STBVorbisError.feature_not_supported);
3228     } else {
3229       Point[31*8+2] p;
3230       Floor1 *g = &f.floor_config[i].floor1;
3231       int max_class = -1;
3232       g.partitions = get_bits!5(f);
3233       foreach (immutable j; 0..g.partitions) {
3234         g.partition_class_list[j] = get_bits!4(f);
3235         if (g.partition_class_list[j] > max_class) max_class = g.partition_class_list[j];
3236       }
3237       foreach (immutable j; 0..max_class+1) {
3238         g.class_dimensions[j] = get_bits_add_no!3(f, 1);
3239         g.class_subclasses[j] = get_bits!2(f);
3240         if (g.class_subclasses[j]) {
3241           g.class_masterbooks[j] = get_bits!8(f);
3242           if (g.class_masterbooks[j] >= f.codebook_count) return error(f, STBVorbisError.invalid_setup);
3243         }
3244         foreach (immutable k; 0..1<<g.class_subclasses[j]) {
3245           g.subclass_books[j].ptr[k] = get_bits!8(f)-1;
3246           if (g.subclass_books[j].ptr[k] >= f.codebook_count) return error(f, STBVorbisError.invalid_setup);
3247         }
3248       }
3249       g.floor1_multiplier = get_bits_add_no!2(f, 1);
3250       g.rangebits = get_bits!4(f);
3251       g.Xlist[0] = 0;
3252       g.Xlist[1] = cast(ushort)(1<<g.rangebits); //k8
3253       g.values = 2;
3254       foreach (immutable j; 0..g.partitions) {
3255         int c = g.partition_class_list[j];
3256         foreach (immutable k; 0..g.class_dimensions[c]) {
3257           g.Xlist[g.values] = cast(ushort)get_bits_main(f, g.rangebits); //k8
3258           ++g.values;
3259         }
3260       }
3261       assert(g.values <= ushort.max);
3262       // precompute the sorting
3263       foreach (ushort j; 0..cast(ushort)g.values) {
3264         p[j].x = g.Xlist[j];
3265         p[j].y = j;
3266       }
3267       qsort(p.ptr, g.values, (p[0]).sizeof, &point_compare);
3268       foreach (uint j; 0..g.values) g.sorted_order.ptr[j] = cast(ubyte)p.ptr[j].y;
3269       // precompute the neighbors
3270       foreach (uint j; 2..g.values) {
3271         ushort low = void, hi = void;
3272         neighbors(g.Xlist.ptr, j, &low, &hi);
3273         assert(low <= ubyte.max);
3274         assert(hi <= ubyte.max);
3275         g.neighbors[j].ptr[0] = cast(ubyte)low;
3276         g.neighbors[j].ptr[1] = cast(ubyte)hi;
3277       }
3278       if (g.values > longest_floorlist) longest_floorlist = g.values;
3279     }
3280   }
3281 
3282   // Residue
3283   f.residue_count = get_bits_add_no!6(f, 1);
3284   f.residue_config = setup_malloc!Residue(f, f.residue_count);
3285   if (f.residue_config is null) return error(f, STBVorbisError.outofmem);
3286   memset(f.residue_config, 0, f.residue_count*(f.residue_config[0]).sizeof);
3287   foreach (immutable i; 0..f.residue_count) {
3288     ubyte[64] residue_cascade;
3289     Residue* r = f.residue_config+i;
3290     f.residue_types[i] = get_bits!16(f);
3291     if (f.residue_types[i] > 2) return error(f, STBVorbisError.invalid_setup);
3292     r.begin = get_bits!24(f);
3293     r.end = get_bits!24(f);
3294     if (r.end < r.begin) return error(f, STBVorbisError.invalid_setup);
3295     r.part_size = get_bits_add_no!24(f, 1);
3296     r.classifications = get_bits_add_no!6(f, 1);
3297     r.classbook = get_bits!8(f);
3298     if (r.classbook >= f.codebook_count) return error(f, STBVorbisError.invalid_setup);
3299     foreach (immutable j; 0..r.classifications) {
3300       ubyte high_bits = 0;
3301       ubyte low_bits = get_bits!3(f);
3302       if (get_bits!1(f)) high_bits = get_bits!5(f);
3303       assert(high_bits*8+low_bits <= ubyte.max);
3304       residue_cascade[j] = cast(ubyte)(high_bits*8+low_bits);
3305     }
3306     static assert(r.residue_books[0].sizeof == 16);
3307     r.residue_books = setup_malloc!(short[8])(f, r.classifications);
3308     if (r.residue_books is null) return error(f, STBVorbisError.outofmem);
3309     foreach (immutable j; 0..r.classifications) {
3310       foreach (immutable k; 0..8) {
3311         if (residue_cascade[j]&(1<<k)) {
3312           r.residue_books[j].ptr[k] = get_bits!8(f);
3313           if (r.residue_books[j].ptr[k] >= f.codebook_count) return error(f, STBVorbisError.invalid_setup);
3314         } else {
3315           r.residue_books[j].ptr[k] = -1;
3316         }
3317       }
3318     }
3319     // precompute the classifications[] array to avoid inner-loop mod/divide
3320     // call it 'classdata' since we already have r.classifications
3321     r.classdata = setup_malloc!(ubyte*)(f, f.codebooks[r.classbook].entries);
3322     if (!r.classdata) return error(f, STBVorbisError.outofmem);
3323     memset(r.classdata, 0, (*r.classdata).sizeof*f.codebooks[r.classbook].entries);
3324     foreach (immutable j; 0..f.codebooks[r.classbook].entries) {
3325       int classwords = f.codebooks[r.classbook].dimensions;
3326       int temp = j;
3327       r.classdata[j] = setup_malloc!ubyte(f, classwords);
3328       if (r.classdata[j] is null) return error(f, STBVorbisError.outofmem);
3329       foreach_reverse (immutable k; 0..classwords) {
3330         assert(temp%r.classifications >= 0 && temp%r.classifications <= ubyte.max);
3331         r.classdata[j][k] = cast(ubyte)(temp%r.classifications);
3332         temp /= r.classifications;
3333       }
3334     }
3335   }
3336 
3337   f.mapping_count = get_bits_add_no!6(f, 1);
3338   f.mapping = setup_malloc!Mapping(f, f.mapping_count);
3339   if (f.mapping is null) return error(f, STBVorbisError.outofmem);
3340   memset(f.mapping, 0, f.mapping_count*(*f.mapping).sizeof);
3341   foreach (immutable i; 0..f.mapping_count) {
3342     Mapping* m = f.mapping+i;
3343     int mapping_type = get_bits!16(f);
3344     if (mapping_type != 0) return error(f, STBVorbisError.invalid_setup);
3345     m.chan = setup_malloc!MappingChannel(f, f.vrchannels);
3346     if (m.chan is null) return error(f, STBVorbisError.outofmem);
3347     m.submaps = (get_bits!1(f) ? get_bits_add_no!4(f, 1) : 1);
3348     if (m.submaps > max_submaps) max_submaps = m.submaps;
3349     if (get_bits!1(f)) {
3350       m.coupling_steps = get_bits_add_no!8(f, 1);
3351       foreach (immutable k; 0..m.coupling_steps) {
3352         m.chan[k].magnitude = cast(ubyte)get_bits_main(f, ilog(f.vrchannels-1)); //k8
3353         m.chan[k].angle = cast(ubyte)get_bits_main(f, ilog(f.vrchannels-1)); //k8
3354         if (m.chan[k].magnitude >= f.vrchannels) return error(f, STBVorbisError.invalid_setup);
3355         if (m.chan[k].angle     >= f.vrchannels) return error(f, STBVorbisError.invalid_setup);
3356         if (m.chan[k].magnitude == m.chan[k].angle) return error(f, STBVorbisError.invalid_setup);
3357       }
3358     } else {
3359       m.coupling_steps = 0;
3360     }
3361 
3362     // reserved field
3363     if (get_bits!2(f)) return error(f, STBVorbisError.invalid_setup);
3364     if (m.submaps > 1) {
3365       foreach (immutable j; 0..f.vrchannels) {
3366         m.chan[j].mux = get_bits!4(f);
3367         if (m.chan[j].mux >= m.submaps) return error(f, STBVorbisError.invalid_setup);
3368       }
3369     } else {
3370       // @SPECIFICATION: this case is missing from the spec
3371       foreach (immutable j; 0..f.vrchannels) m.chan[j].mux = 0;
3372     }
3373     foreach (immutable j; 0..m.submaps) {
3374       get_bits!8(f); // discard
3375       m.submap_floor[j] = get_bits!8(f);
3376       m.submap_residue[j] = get_bits!8(f);
3377       if (m.submap_floor[j] >= f.floor_count) return error(f, STBVorbisError.invalid_setup);
3378       if (m.submap_residue[j] >= f.residue_count) return error(f, STBVorbisError.invalid_setup);
3379     }
3380   }
3381 
3382   // Modes
3383   f.mode_count = get_bits_add_no!6(f, 1);
3384   foreach (immutable i; 0..f.mode_count) {
3385     Mode* m = f.mode_config.ptr+i;
3386     m.blockflag = get_bits!1(f);
3387     m.windowtype = get_bits!16(f);
3388     m.transformtype = get_bits!16(f);
3389     m.mapping = get_bits!8(f);
3390     if (m.windowtype != 0) return error(f, STBVorbisError.invalid_setup);
3391     if (m.transformtype != 0) return error(f, STBVorbisError.invalid_setup);
3392     if (m.mapping >= f.mapping_count) return error(f, STBVorbisError.invalid_setup);
3393   }
3394 
3395   flush_packet(f);
3396 
3397   f.previous_length = 0;
3398 
3399   foreach (immutable i; 0..f.vrchannels) {
3400     f.channel_buffers.ptr[i] = setup_malloc!float(f, f.blocksize_1);
3401     f.previous_window.ptr[i] = setup_malloc!float(f, f.blocksize_1/2);
3402     f.finalY.ptr[i]          = setup_malloc!short(f, longest_floorlist);
3403     if (f.channel_buffers.ptr[i] is null || f.previous_window.ptr[i] is null || f.finalY.ptr[i] is null) return error(f, STBVorbisError.outofmem);
3404     version(STB_VORBIS_NO_DEFER_FLOOR) {
3405       f.floor_buffers.ptr[i] = setup_malloc!float(f, f.blocksize_1/2);
3406       if (f.floor_buffers.ptr[i] is null) return error(f, STBVorbisError.outofmem);
3407     }
3408   }
3409 
3410   if (!init_blocksize(f, 0, f.blocksize_0)) return false;
3411   if (!init_blocksize(f, 1, f.blocksize_1)) return false;
3412   f.blocksize.ptr[0] = f.blocksize_0;
3413   f.blocksize.ptr[1] = f.blocksize_1;
3414 
3415   version(STB_VORBIS_DIVIDE_TABLE) {
3416     if (integer_divide_table[1].ptr[1] == 0) {
3417       foreach (immutable i; 0..DIVTAB_NUMER) foreach (immutable j; 1..DIVTAB_DENOM) integer_divide_table[i].ptr[j] = i/j;
3418     }
3419   }
3420 
3421   // compute how much temporary memory is needed
3422 
3423   // 1.
3424   {
3425     uint imdct_mem = (f.blocksize_1*cast(uint)(float).sizeof>>1);
3426     uint classify_mem;
3427     int max_part_read = 0;
3428     foreach (immutable i; 0..f.residue_count) {
3429       Residue* r = f.residue_config+i;
3430       int n_read = r.end-r.begin;
3431       int part_read = n_read/r.part_size;
3432       if (part_read > max_part_read) max_part_read = part_read;
3433     }
3434     version(STB_VORBIS_DIVIDES_IN_RESIDUE) {
3435       classify_mem = f.vrchannels*cast(uint)((void*).sizeof+max_part_read*(int*).sizeof);
3436     } else {
3437       classify_mem = f.vrchannels*cast(uint)((void*).sizeof+max_part_read*(ubyte*).sizeof);
3438     }
3439     f.temp_memory_required = classify_mem;
3440     if (imdct_mem > f.temp_memory_required) f.temp_memory_required = imdct_mem;
3441   }
3442 
3443   f.first_decode = true;
3444 
3445   /+
3446   if (f.alloc.alloc_buffer) {
3447     debug(stb_vorbis) assert(f.temp_offset == f.alloc.alloc_buffer_length_in_bytes);
3448     // check if there's enough temp memory so we don't error later
3449     if (f.setup_offset+ /*(*f).sizeof+*/ f.temp_memory_required > cast(uint)f.temp_offset) return error(f, STBVorbisError.outofmem);
3450   }
3451   +/
3452 
3453   f.first_audio_page_offset = f.fileOffset();
3454 
3455   return true;
3456 }
3457 
3458 /+
3459 private int vorbis_search_for_page_pushdata (VorbisDecoder f, ubyte* data, int data_len) {
3460   import core.stdc.string : memcmp;
3461 
3462   foreach (immutable i; 0..f.page_crc_tests) f.scan.ptr[i].bytes_done = 0;
3463 
3464   // if we have room for more scans, search for them first, because
3465   // they may cause us to stop early if their header is incomplete
3466   if (f.page_crc_tests < STB_VORBIS_PUSHDATA_CRC_COUNT) {
3467     if (data_len < 4) return 0;
3468     data_len -= 3; // need to look for 4-byte sequence, so don't miss one that straddles a boundary
3469     foreach (immutable i; 0..data_len) {
3470       if (data[i] == 0x4f) {
3471         if (memcmp(data+i, ogg_page_header.ptr, 4) == 0) {
3472           // make sure we have the whole page header
3473           if (i+26 >= data_len || i+27+data[i+26] >= data_len) {
3474             // only read up to this page start, so hopefully we'll
3475             // have the whole page header start next time
3476             data_len = i;
3477             break;
3478           }
3479           // ok, we have it all; compute the length of the page
3480           auto len = 27+data[i+26];
3481           foreach (immutable j; 0..data[i+26]) len += data[i+27+j];
3482           // scan everything up to the embedded crc (which we must 0)
3483           uint crc = 0;
3484           foreach (immutable j; 0..22) crc = crc32_update(crc, data[i+j]);
3485           // now process 4 0-bytes
3486           foreach (immutable j; 22..26) crc = crc32_update(crc, 0);
3487           // len is the total number of bytes we need to scan
3488           auto n = f.page_crc_tests++;
3489           f.scan.ptr[n].bytes_left = len-/*j*/26;
3490           f.scan.ptr[n].crc_so_far = crc;
3491           f.scan.ptr[n].goal_crc = data[i+22]+(data[i+23]<<8)+(data[i+24]<<16)+(data[i+25]<<24);
3492           // if the last frame on a page is continued to the next, then
3493           // we can't recover the sample_loc immediately
3494           if (data[i+27+data[i+26]-1] == 255) {
3495             f.scan.ptr[n].sample_loc = ~0;
3496           } else {
3497             f.scan.ptr[n].sample_loc = data[i+6]+(data[i+7]<<8)+(data[i+8]<<16)+(data[i+9]<<24);
3498           }
3499           f.scan.ptr[n].bytes_done = i+26/*j*/;
3500           if (f.page_crc_tests == STB_VORBIS_PUSHDATA_CRC_COUNT) break;
3501           // keep going if we still have room for more
3502         }
3503       }
3504     }
3505   }
3506 
3507   for (uint i = 0; i < f.page_crc_tests; ) {
3508     int nn = f.scan.ptr[i].bytes_done;
3509     int m = f.scan.ptr[i].bytes_left;
3510     if (m > data_len-nn) m = data_len-nn;
3511     // m is the bytes to scan in the current chunk
3512     uint crc = f.scan.ptr[i].crc_so_far;
3513     foreach (immutable j; 0..m) crc = crc32_update(crc, data[nn+j]);
3514     f.scan.ptr[i].bytes_left -= m;
3515     f.scan.ptr[i].crc_so_far = crc;
3516     if (f.scan.ptr[i].bytes_left == 0) {
3517       // does it match?
3518       if (f.scan.ptr[i].crc_so_far == f.scan.ptr[i].goal_crc) {
3519         // Houston, we have page
3520         data_len = nn+m; // consumption amount is wherever that scan ended
3521         f.page_crc_tests = -1; // drop out of page scan mode
3522         f.previous_length = 0; // decode-but-don't-output one frame
3523         f.next_seg = -1;       // start a new page
3524         f.current_loc = f.scan.ptr[i].sample_loc; // set the current sample location to the amount we'd have decoded had we decoded this page
3525         f.current_loc_valid = f.current_loc != ~0U;
3526         return data_len;
3527       }
3528       // delete entry
3529       f.scan.ptr[i] = f.scan.ptr[--f.page_crc_tests];
3530     } else {
3531       ++i;
3532     }
3533   }
3534 
3535   return data_len;
3536 }
3537 +/
3538 
3539 private uint vorbis_find_page (VorbisDecoder f, uint* end, uint* last) {
3540   for (;;) {
3541     if (f.eof) return 0;
3542     auto n = get8(f);
3543     if (n == 0x4f) { // page header candidate
3544       uint retry_loc = f.fileOffset;
3545       // check if we're off the end of a file_section stream
3546       if (retry_loc-25 > f.stream_len) return 0;
3547       // check the rest of the header
3548       int i = void;
3549       for (i = 1; i < 4; ++i) if (get8(f) != ogg_page_header[i]) break;
3550       if (f.eof) return 0;
3551       if (i == 4) {
3552         ubyte[27] header;
3553         //for (i=0; i < 4; ++i) header[i] = ogg_page_header[i];
3554         header[0..4] = cast(immutable(ubyte)[])ogg_page_header[0..4];
3555         for (i = 4; i < 27; ++i) header[i] = get8(f);
3556         if (f.eof) return 0;
3557         if (header[4] != 0) goto invalid;
3558         uint goal = header[22]+(header[23]<<8)+(header[24]<<16)+(header[25]<<24);
3559         for (i = 22; i < 26; ++i) header[i] = 0;
3560         uint crc = 0;
3561         for (i = 0; i < 27; ++i) crc = crc32_update(crc, header[i]);
3562         uint len = 0;
3563         for (i = 0; i < header[26]; ++i) {
3564           auto s = get8(f);
3565           crc = crc32_update(crc, s);
3566           len += s;
3567         }
3568         if (len && f.eof) return 0;
3569         for (i = 0; i < len; ++i) crc = crc32_update(crc, get8(f));
3570         // finished parsing probable page
3571         if (crc == goal) {
3572           // we could now check that it's either got the last
3573           // page flag set, OR it's followed by the capture
3574           // pattern, but I guess TECHNICALLY you could have
3575           // a file with garbage between each ogg page and recover
3576           // from it automatically? So even though that paranoia
3577           // might decrease the chance of an invalid decode by
3578           // another 2^32, not worth it since it would hose those
3579           // invalid-but-useful files?
3580           if (end) *end = f.fileOffset;
3581           if (last) *last = (header[5]&0x04 ? 1 : 0);
3582           set_file_offset(f, retry_loc-1);
3583           return 1;
3584         }
3585       }
3586      invalid:
3587       // not a valid page, so rewind and look for next one
3588       set_file_offset(f, retry_loc);
3589     }
3590   }
3591   assert(0);
3592 }
3593 
3594 enum SAMPLE_unknown = 0xffffffff;
3595 
3596 // seeking is implemented with a binary search, which narrows down the range to
3597 // 64K, before using a linear search (because finding the synchronization
3598 // pattern can be expensive, and the chance we'd find the end page again is
3599 // relatively high for small ranges)
3600 //
3601 // two initial interpolation-style probes are used at the start of the search
3602 // to try to bound either side of the binary search sensibly, while still
3603 // working in O(log n) time if they fail.
3604 private int get_seek_page_info (VorbisDecoder f, ProbedPage* z) {
3605   ubyte[27] header;
3606   ubyte[255] lacing;
3607 
3608   // record where the page starts
3609   z.page_start = f.fileOffset;
3610 
3611   // parse the header
3612   getn(f, header.ptr, 27);
3613   if (header[0] != 'O' || header[1] != 'g' || header[2] != 'g' || header[3] != 'S') return 0;
3614   getn(f, lacing.ptr, header[26]);
3615 
3616   // determine the length of the payload
3617   uint len = 0;
3618   foreach (immutable i; 0..header[26]) len += lacing[i];
3619 
3620   // this implies where the page ends
3621   z.page_end = z.page_start+27+header[26]+len;
3622 
3623   // read the last-decoded sample out of the data
3624   z.last_decoded_sample = header[6]+(header[7]<<8)+(header[8]<<16)+(header[9]<<24);
3625 
3626   // restore file state to where we were
3627   set_file_offset(f, z.page_start);
3628   return 1;
3629 }
3630 
3631 // rarely used function to seek back to the preceeding page while finding the start of a packet
3632 private int go_to_page_before (VorbisDecoder f, uint limit_offset) {
3633   uint previous_safe, end;
3634 
3635   // now we want to seek back 64K from the limit
3636   if (limit_offset >= 65536 && limit_offset-65536 >= f.first_audio_page_offset) {
3637     previous_safe = limit_offset-65536;
3638   } else {
3639     previous_safe = f.first_audio_page_offset;
3640   }
3641 
3642   set_file_offset(f, previous_safe);
3643 
3644   while (vorbis_find_page(f, &end, null)) {
3645     if (end >= limit_offset && f.fileOffset < limit_offset) return 1;
3646     set_file_offset(f, end);
3647   }
3648 
3649   return 0;
3650 }
3651 
3652 // implements the search logic for finding a page and starting decoding. if
3653 // the function succeeds, current_loc_valid will be true and current_loc will
3654 // be less than or equal to the provided sample number (the closer the
3655 // better).
3656 private int seek_to_sample_coarse (VorbisDecoder f, uint sample_number) {
3657   ProbedPage left, right, mid;
3658   int i, start_seg_with_known_loc, end_pos, page_start;
3659   uint delta, stream_length, padding;
3660   double offset, bytes_per_sample;
3661   int probe = 0;
3662 
3663   // find the last page and validate the target sample
3664   stream_length = f.streamLengthInSamples;
3665   if (stream_length == 0) return error(f, STBVorbisError.seek_without_length);
3666   if (sample_number > stream_length) return error(f, STBVorbisError.seek_invalid);
3667 
3668   // this is the maximum difference between the window-center (which is the
3669   // actual granule position value), and the right-start (which the spec
3670   // indicates should be the granule position (give or take one)).
3671   padding = ((f.blocksize_1-f.blocksize_0)>>2);
3672   if (sample_number < padding) sample_number = 0; else sample_number -= padding;
3673 
3674   left = f.p_first;
3675   while (left.last_decoded_sample == ~0U) {
3676     // (untested) the first page does not have a 'last_decoded_sample'
3677     set_file_offset(f, left.page_end);
3678     if (!get_seek_page_info(f, &left)) goto error;
3679   }
3680 
3681   right = f.p_last;
3682   debug(stb_vorbis) assert(right.last_decoded_sample != ~0U);
3683 
3684   // starting from the start is handled differently
3685   if (sample_number <= left.last_decoded_sample) {
3686     f.seekStart;
3687     return 1;
3688   }
3689 
3690   while (left.page_end != right.page_start) {
3691     debug(stb_vorbis) assert(left.page_end < right.page_start);
3692     // search range in bytes
3693     delta = right.page_start-left.page_end;
3694     if (delta <= 65536) {
3695       // there's only 64K left to search - handle it linearly
3696       set_file_offset(f, left.page_end);
3697     } else {
3698       if (probe < 2) {
3699         if (probe == 0) {
3700           // first probe (interpolate)
3701           double data_bytes = right.page_end-left.page_start;
3702           bytes_per_sample = data_bytes/right.last_decoded_sample;
3703           offset = left.page_start+bytes_per_sample*(sample_number-left.last_decoded_sample);
3704         } else {
3705           // second probe (try to bound the other side)
3706           double error = (cast(double)sample_number-mid.last_decoded_sample)*bytes_per_sample;
3707           if (error >= 0 && error <  8000) error =  8000;
3708           if (error <  0 && error > -8000) error = -8000;
3709           offset += error*2;
3710         }
3711 
3712         // ensure the offset is valid
3713         if (offset < left.page_end) offset = left.page_end;
3714         if (offset > right.page_start-65536) offset = right.page_start-65536;
3715 
3716         set_file_offset(f, cast(uint)offset);
3717       } else {
3718         // binary search for large ranges (offset by 32K to ensure
3719         // we don't hit the right page)
3720         set_file_offset(f, left.page_end+(delta/2)-32768);
3721       }
3722 
3723       if (!vorbis_find_page(f, null, null)) goto error;
3724     }
3725 
3726     for (;;) {
3727       if (!get_seek_page_info(f, &mid)) goto error;
3728       if (mid.last_decoded_sample != ~0U) break;
3729       // (untested) no frames end on this page
3730       set_file_offset(f, mid.page_end);
3731       debug(stb_vorbis) assert(mid.page_start < right.page_start);
3732     }
3733 
3734     // if we've just found the last page again then we're in a tricky file,
3735     // and we're close enough.
3736     if (mid.page_start == right.page_start) break;
3737 
3738     if (sample_number < mid.last_decoded_sample) right = mid; else left = mid;
3739 
3740     ++probe;
3741   }
3742 
3743   // seek back to start of the last packet
3744   page_start = left.page_start;
3745   set_file_offset(f, page_start);
3746   if (!start_page(f)) return error(f, STBVorbisError.seek_failed);
3747   end_pos = f.end_seg_with_known_loc;
3748   debug(stb_vorbis) assert(end_pos >= 0);
3749 
3750   for (;;) {
3751     for (i = end_pos; i > 0; --i) if (f.segments.ptr[i-1] != 255) break;
3752     start_seg_with_known_loc = i;
3753     if (start_seg_with_known_loc > 0 || !(f.page_flag&PAGEFLAG_continued_packet)) break;
3754     // (untested) the final packet begins on an earlier page
3755     if (!go_to_page_before(f, page_start)) goto error;
3756     page_start = f.fileOffset;
3757     if (!start_page(f)) goto error;
3758     end_pos = f.segment_count-1;
3759   }
3760 
3761   // prepare to start decoding
3762   f.current_loc_valid = false;
3763   f.last_seg = false;
3764   f.valid_bits = 0;
3765   f.packet_bytes = 0;
3766   f.bytes_in_seg = 0;
3767   f.previous_length = 0;
3768   f.next_seg = start_seg_with_known_loc;
3769 
3770   for (i = 0; i < start_seg_with_known_loc; ++i) skip(f, f.segments.ptr[i]);
3771 
3772   // start decoding (optimizable - this frame is generally discarded)
3773   if (!vorbis_pump_first_frame(f)) return 0;
3774   if (f.current_loc > sample_number) return error(f, STBVorbisError.seek_failed);
3775   return 1;
3776 
3777 error:
3778   // try to restore the file to a valid state
3779   f.seekStart;
3780   return error(f, STBVorbisError.seek_failed);
3781 }
3782 
3783 // the same as vorbis_decode_initial, but without advancing
3784 private int peek_decode_initial (VorbisDecoder f, int* p_left_start, int* p_left_end, int* p_right_start, int* p_right_end, int* mode) {
3785   if (!vorbis_decode_initial(f, p_left_start, p_left_end, p_right_start, p_right_end, mode)) return 0;
3786 
3787   // either 1 or 2 bytes were read, figure out which so we can rewind
3788   int bits_read = 1+ilog(f.mode_count-1);
3789   if (f.mode_config.ptr[*mode].blockflag) bits_read += 2;
3790   int bytes_read = (bits_read+7)/8;
3791 
3792   f.bytes_in_seg += bytes_read;
3793   f.packet_bytes -= bytes_read;
3794   skip(f, -bytes_read);
3795   if (f.next_seg == -1) f.next_seg = f.segment_count-1; else --f.next_seg;
3796   f.valid_bits = 0;
3797 
3798   return 1;
3799 }
3800 
3801 // ////////////////////////////////////////////////////////////////////////// //
3802 // utility and supporting functions for getting s16 samples
3803 enum PLAYBACK_MONO  = (1<<0);
3804 enum PLAYBACK_LEFT  = (1<<1);
3805 enum PLAYBACK_RIGHT = (1<<2);
3806 
3807 enum L = (PLAYBACK_LEFT |PLAYBACK_MONO);
3808 enum C = (PLAYBACK_LEFT |PLAYBACK_RIGHT|PLAYBACK_MONO);
3809 enum R = (PLAYBACK_RIGHT|PLAYBACK_MONO);
3810 
3811 immutable byte[6][7] channel_position = [
3812   [ 0 ],
3813   [ C ],
3814   [ L, R ],
3815   [ L, C, R ],
3816   [ L, R, L, R ],
3817   [ L, C, R, L, R ],
3818   [ L, C, R, L, R, C ],
3819 ];
3820 
3821 
3822 version(STB_VORBIS_NO_FAST_SCALED_FLOAT) {
3823   enum declfcvar(string name) = "{}";
3824   template FAST_SCALED_FLOAT_TO_INT(string x, string s) {
3825     static assert(s == "15");
3826     enum FAST_SCALED_FLOAT_TO_INT = q{import core.stdc.math : lrintf; int v = lrintf((${x})*32768.0f);}.cmacroFixVars!"x"(x);
3827   }
3828 } else {
3829   //k8: actually, this is only marginally faster than using `lrintf()`, but anyway...
3830   align(1) union float_conv {
3831   align(1):
3832     float f;
3833     int i;
3834   }
3835   enum declfcvar(string name) = "float_conv "~name~" = void;";
3836   static assert(float_conv.i.sizeof == 4 && float_conv.f.sizeof == 4);
3837   // add (1<<23) to convert to int, then divide by 2^SHIFT, then add 0.5/2^SHIFT to round
3838   //#define check_endianness()
3839   enum MAGIC(string SHIFT) = q{(1.5f*(1<<(23-${SHIFT}))+0.5f/(1<<${SHIFT}))}.cmacroFixVars!("SHIFT")(SHIFT);
3840   enum ADDEND(string SHIFT) = q{(((150-${SHIFT})<<23)+(1<<22))}.cmacroFixVars!("SHIFT")(SHIFT);
3841   enum FAST_SCALED_FLOAT_TO_INT(string x, string s) = q{temp.f = (${x})+${MAGIC}; int v = temp.i-${ADDEND};}
3842     .cmacroFixVars!("x", "s", "MAGIC", "ADDEND")(x, s, MAGIC!(s), ADDEND!(s));
3843 }
3844 
3845 private void copy_samples (short* dest, float* src, int len) {
3846   //check_endianness();
3847   mixin(declfcvar!"temp");
3848   foreach (immutable _; 0..len) {
3849     mixin(FAST_SCALED_FLOAT_TO_INT!("*src", "15"));
3850     if (cast(uint)(v+32768) > 65535) v = (v < 0 ? -32768 : 32767);
3851     *dest++ = cast(short)v; //k8
3852     ++src;
3853   }
3854 }
3855 
3856 private void compute_samples (int mask, short* output, int num_c, float** data, int d_offset, int len) {
3857   import core.stdc.string : memset;
3858   enum BUFFER_SIZE = 32;
3859   float[BUFFER_SIZE] buffer;
3860   int n = BUFFER_SIZE;
3861   //check_endianness();
3862   mixin(declfcvar!"temp");
3863   for (uint o = 0; o < len; o += BUFFER_SIZE) {
3864     memset(buffer.ptr, 0, (buffer).sizeof);
3865     if (o+n > len) n = len-o;
3866     foreach (immutable j; 0..num_c) {
3867       if (channel_position[num_c].ptr[j]&mask) foreach (immutable i; 0..n) buffer.ptr[i] += data[j][d_offset+o+i];
3868     }
3869     foreach (immutable i; 0..n) {
3870       mixin(FAST_SCALED_FLOAT_TO_INT!("buffer[i]", "15"));
3871       if (cast(uint)(v+32768) > 65535) v = (v < 0 ? -32768 : 32767);
3872       output[o+i] = cast(short)v; //k8
3873     }
3874   }
3875 }
3876 
3877 private void compute_stereo_samples (short* output, int num_c, float** data, int d_offset, int len) {
3878   import core.stdc.string : memset;
3879 
3880   enum BUFFER_SIZE = 32;
3881   float[BUFFER_SIZE] buffer;
3882   int n = BUFFER_SIZE>>1;
3883   // o is the offset in the source data
3884   //check_endianness();
3885   mixin(declfcvar!"temp");
3886   for (uint o = 0; o < len; o += BUFFER_SIZE>>1) {
3887     // o2 is the offset in the output data
3888     int o2 = o<<1;
3889     memset(buffer.ptr, 0, buffer.sizeof);
3890     if (o+n > len) n = len-o;
3891     foreach (immutable j; 0..num_c) {
3892       int m = channel_position[num_c].ptr[j]&(PLAYBACK_LEFT|PLAYBACK_RIGHT);
3893       if (m == (PLAYBACK_LEFT|PLAYBACK_RIGHT)) {
3894         foreach (immutable i; 0..n) {
3895           buffer.ptr[i*2+0] += data[j][d_offset+o+i];
3896           buffer.ptr[i*2+1] += data[j][d_offset+o+i];
3897         }
3898       } else if (m == PLAYBACK_LEFT) {
3899         foreach (immutable i; 0..n) buffer.ptr[i*2+0] += data[j][d_offset+o+i];
3900       } else if (m == PLAYBACK_RIGHT) {
3901         foreach (immutable i; 0..n) buffer.ptr[i*2+1] += data[j][d_offset+o+i];
3902       }
3903     }
3904     foreach (immutable i; 0..n<<1) {
3905       mixin(FAST_SCALED_FLOAT_TO_INT!("buffer[i]", "15"));
3906       if (cast(uint)(v+32768) > 65535) v = (v < 0 ? -32768 : 32767);
3907       output[o2+i] = cast(short)v; //k8
3908     }
3909   }
3910 }
3911 
3912 private void convert_samples_short (int buf_c, short** buffer, int b_offset, int data_c, float** data, int d_offset, int samples) {
3913   import core.stdc.string : memset;
3914 
3915   if (buf_c != data_c && buf_c <= 2 && data_c <= 6) {
3916     immutable int[2][3] channel_selector = [ [0,0], [PLAYBACK_MONO,0], [PLAYBACK_LEFT, PLAYBACK_RIGHT] ];
3917     foreach (immutable i; 0..buf_c) compute_samples(channel_selector[buf_c].ptr[i], buffer[i]+b_offset, data_c, data, d_offset, samples);
3918   } else {
3919     int limit = (buf_c < data_c ? buf_c : data_c);
3920     foreach (immutable i; 0..limit) copy_samples(buffer[i]+b_offset, data[i]+d_offset, samples);
3921     foreach (immutable i; limit..buf_c) memset(buffer[i]+b_offset, 0, short.sizeof*samples);
3922   }
3923 }
3924 
3925 private void convert_channels_short_interleaved (int buf_c, short* buffer, int data_c, float** data, int d_offset, int len) {
3926   //check_endianness();
3927   mixin(declfcvar!"temp");
3928   if (buf_c != data_c && buf_c <= 2 && data_c <= 6) {
3929     debug(stb_vorbis) assert(buf_c == 2);
3930     foreach (immutable i; 0..buf_c) compute_stereo_samples(buffer, data_c, data, d_offset, len);
3931   } else {
3932     int limit = (buf_c < data_c ? buf_c : data_c);
3933     foreach (immutable j; 0..len) {
3934       foreach (immutable i; 0..limit) {
3935         float f = data[i][d_offset+j];
3936         mixin(FAST_SCALED_FLOAT_TO_INT!("f", "15"));//data[i][d_offset+j], 15);
3937         if (cast(uint)(v+32768) > 65535) v = (v < 0 ? -32768 : 32767);
3938         *buffer++ = cast(short)v; //k8
3939       }
3940       foreach (immutable i; limit..buf_c) *buffer++ = 0;
3941     }
3942   }
3943 }
3944 } // @nogc
3945 
3946 
3947 public class VorbisDecoder {
3948   // return # of bytes read, 0 on eof, -1 on error
3949   // if called with `buf is null`, do `close()`
3950   alias readCB = int delegate (void[] buf, uint ofs, VorbisDecoder vb) nothrow @nogc;
3951 
3952   //TODO
3953   static struct Allocator {
3954   static nothrow @nogc: // because
3955     void* alloc (uint sz, VorbisDecoder vb) {
3956       import core.stdc.stdlib : malloc;
3957       return malloc(sz);
3958     }
3959     void free (void* p, VorbisDecoder vb) {
3960       import core.stdc.stdlib : free;
3961       free(p);
3962     }
3963     void* allocTemp (uint sz, VorbisDecoder vb) {
3964       import core.stdc.stdlib : malloc;
3965       return malloc(sz);
3966     }
3967     void freeTemp (void* p, uint sz, VorbisDecoder vb) {
3968       import core.stdc.stdlib : free;
3969       free(p);
3970     }
3971     uint tempSave (VorbisDecoder vb) { return 0; }
3972     void tempRestore (uint pos, VorbisDecoder vb) {}
3973   }
3974 
3975 nothrow @nogc:
3976 private:
3977   bool isOpened;
3978   readCB stmread;
3979   uint stlastofs = uint.max;
3980   uint stst;
3981   uint stpos;
3982   uint stend;
3983   bool stclose;
3984   FILE* stfl;
3985 
3986 private:
3987   //ubyte* stream;
3988   //ubyte* stream_start;
3989   //ubyte* stream_end;
3990   //uint stream_len;
3991 
3992   /+bool push_mode;+/
3993 
3994   uint first_audio_page_offset;
3995 
3996   ProbedPage p_first, p_last;
3997 
3998   // memory management
3999   Allocator alloc;
4000   int setup_offset;
4001   int temp_offset;
4002 
4003   // run-time results
4004   bool eof = true;
4005   STBVorbisError error;
4006 
4007   // header info
4008   int[2] blocksize;
4009   int blocksize_0, blocksize_1;
4010   int codebook_count;
4011   Codebook* codebooks;
4012   int floor_count;
4013   ushort[64] floor_types; // varies
4014   Floor* floor_config;
4015   int residue_count;
4016   ushort[64] residue_types; // varies
4017   Residue* residue_config;
4018   int mapping_count;
4019   Mapping* mapping;
4020   int mode_count;
4021   Mode[64] mode_config;  // varies
4022 
4023   uint total_samples;
4024 
4025   // decode buffer
4026   float*[STB_VORBIS_MAX_CHANNELS] channel_buffers;
4027   float*[STB_VORBIS_MAX_CHANNELS] outputs;
4028 
4029   float*[STB_VORBIS_MAX_CHANNELS] previous_window;
4030   int previous_length;
4031 
4032   version(STB_VORBIS_NO_DEFER_FLOOR) {
4033     float*[STB_VORBIS_MAX_CHANNELS] floor_buffers;
4034   } else {
4035     short*[STB_VORBIS_MAX_CHANNELS] finalY;
4036   }
4037 
4038   uint current_loc; // sample location of next frame to decode
4039   int current_loc_valid;
4040 
4041   // per-blocksize precomputed data
4042 
4043   // twiddle factors
4044   float*[2] A, B, C;
4045   float*[2] window;
4046   ushort*[2] bit_reverse;
4047 
4048   // current page/packet/segment streaming info
4049   uint serial; // stream serial number for verification
4050   int last_page;
4051   int segment_count;
4052   ubyte[255] segments;
4053   ubyte page_flag;
4054   ubyte bytes_in_seg;
4055   ubyte first_decode;
4056   int next_seg;
4057   int last_seg;  // flag that we're on the last segment
4058   int last_seg_which; // what was the segment number of the last seg?
4059   uint acc;
4060   int valid_bits;
4061   int packet_bytes;
4062   int end_seg_with_known_loc;
4063   uint known_loc_for_packet;
4064   int discard_samples_deferred;
4065   uint samples_output;
4066 
4067   // push mode scanning
4068   /+
4069   int page_crc_tests; // only in push_mode: number of tests active; -1 if not searching
4070   CRCscan[STB_VORBIS_PUSHDATA_CRC_COUNT] scan;
4071   +/
4072 
4073   // sample-access
4074   int channel_buffer_start;
4075   int channel_buffer_end;
4076 
4077 private: // k8: 'cause i'm evil
4078   // user-accessible info
4079   uint sample_rate;
4080   int vrchannels;
4081 
4082   uint setup_memory_required;
4083   uint temp_memory_required;
4084   uint setup_temp_memory_required;
4085 
4086   bool read_comments;
4087   ubyte* comment_data;
4088   uint comment_size;
4089 
4090   // functions to get comment data
4091   uint comment_data_pos;
4092 
4093 private:
4094   int rawRead (void[] buf) {
4095     static if (__VERSION__ > 2067) pragma(inline, true);
4096     if (isOpened && buf.length > 0 && stpos < stend) {
4097       if (stend-stpos < buf.length) buf = buf[0..stend-stpos];
4098       auto rd = stmread(buf, stpos, this);
4099       if (rd > 0) stpos += rd;
4100       return rd;
4101     }
4102     return 0;
4103   }
4104   void rawSkip (int n) { static if (__VERSION__ > 2067) pragma(inline, true);
4105   	if (isOpened) {
4106 		stpos += n;
4107 		if(stpos < stst)
4108 			stpos = stst;
4109 		else if(stpos > stend)
4110 			stpos = stend;
4111 	}
4112   }
4113   void rawSeek (int n) { static if (__VERSION__ > 2067) pragma(inline, true); if (isOpened) { stpos = stst+(n < 0 ? 0 : n); if (stpos > stend) stpos = stend; } }
4114   void rawClose () { static if (__VERSION__ > 2067) pragma(inline, true); if (isOpened) { isOpened = false; stmread(null, 0, this); } }
4115 
4116 final:
4117 private:
4118   void doInit () {
4119     import core.stdc.string : memset;
4120     /*
4121     if (z) {
4122       alloc = *z;
4123       alloc.alloc_buffer_length_in_bytes = (alloc.alloc_buffer_length_in_bytes+3)&~3;
4124       temp_offset = alloc.alloc_buffer_length_in_bytes;
4125     }
4126     */
4127     eof = false;
4128     error = STBVorbisError.no_error;
4129     /+stream = null;+/
4130     codebooks = null;
4131     /+page_crc_tests = -1;+/
4132   }
4133 
4134   static int stflRead (void[] buf, uint ofs, VorbisDecoder vb) {
4135     if (buf !is null) {
4136       if (vb.stlastofs != ofs) {
4137       	// { import core.stdc.stdio; printf("stflRead: ofs=%u; len=%u\n", ofs, cast(uint)buf.length); }
4138         import core.stdc.stdio : fseek, SEEK_SET;
4139         vb.stlastofs = ofs;
4140         fseek(vb.stfl, ofs, SEEK_SET);
4141       }
4142       import core.stdc.stdio : fread;
4143       auto rd = cast(int)fread(buf.ptr, 1, buf.length, vb.stfl);
4144       if(rd > 0)
4145       	vb.stlastofs += rd;
4146       return rd;
4147     } else {
4148       if (vb.stclose) {
4149         import core.stdc.stdio : fclose;
4150         if (vb.stfl !is null) fclose(vb.stfl);
4151       }
4152       vb.stfl = null;
4153       return 0;
4154     }
4155   }
4156 
4157 public:
4158   this () {}
4159   ~this () { close(); }
4160 
4161   this (int asize, readCB rcb) {
4162   	assert(rcb !is null);
4163 	stend = (asize > 0 ? asize : 0);
4164 	stmread = rcb;
4165 	isOpened = true;
4166 	eof = false;
4167 	read_comments = true;
4168 	if (start_decoder(this)) {
4169 		vorbis_pump_first_frame(this);
4170 		return;
4171 	}
4172   }
4173   this (FILE* fl, bool doclose=true) { open(fl, doclose); }
4174   this (const(char)[] filename) { open(filename); }
4175 
4176   @property bool closed () { return !isOpened; }
4177 
4178   void open (FILE *fl, bool doclose=true) {
4179     import core.stdc.stdio : ftell, fseek, SEEK_SET, SEEK_END;
4180     close();
4181     if (fl is null) { error = STBVorbisError.invalid_stream; return; }
4182     stclose = doclose;
4183     stst = stpos = cast(uint)ftell(fl);
4184     fseek(fl, 0, SEEK_END);
4185     stend = cast(uint)ftell(fl);
4186     stlastofs = stlastofs.max;
4187     stclose = false;
4188     stfl = fl;
4189     import std.functional : toDelegate;
4190     stmread = toDelegate(&stflRead);
4191     isOpened = true;
4192     eof = false;
4193     read_comments = true;
4194     if (start_decoder(this)) {
4195       vorbis_pump_first_frame(this);
4196       return;
4197     }
4198     auto err = error;
4199     close();
4200     error = err;
4201   }
4202 
4203   void open (const(char)[] filename) {
4204     import core.stdc.stdio : fopen;
4205     import std.internal.cstring; // sorry
4206     close();
4207     FILE* fl = fopen(filename.tempCString, "rb");
4208     if (fl is null) { error = STBVorbisError.file_open_failure; return; }
4209     open(fl, true);
4210   }
4211 
4212   /+
4213   void openPushdata(void* data, int data_len, // the memory available for decoding
4214                     int* data_used)           // only defined on success
4215   {
4216     close();
4217     eof = false;
4218     stream = cast(ubyte*)data;
4219     stream_end = stream+data_len;
4220     push_mode = true;
4221     if (!start_decoder(this)) {
4222       auto err = error;
4223       if (eof) err = STBVorbisError.need_more_data; else close();
4224       error = err;
4225       return;
4226     }
4227     *data_used = stream-(cast(ubyte*)data);
4228     error = STBVorbisError.no_error;
4229   }
4230   +/
4231 
4232   void close () {
4233     import core.stdc.string : memset;
4234 
4235     setup_free(this, this.comment_data);
4236     if (this.residue_config) {
4237       foreach (immutable i; 0..this.residue_count) {
4238         Residue* r = this.residue_config+i;
4239         if (r.classdata) {
4240           foreach (immutable j; 0..this.codebooks[r.classbook].entries) setup_free(this, r.classdata[j]);
4241           setup_free(this, r.classdata);
4242         }
4243         setup_free(this, r.residue_books);
4244       }
4245     }
4246 
4247     if (this.codebooks) {
4248       foreach (immutable i; 0..this.codebook_count) {
4249         Codebook* c = this.codebooks+i;
4250         setup_free(this, c.codeword_lengths);
4251         setup_free(this, c.multiplicands);
4252         setup_free(this, c.codewords);
4253         setup_free(this, c.sorted_codewords);
4254         // c.sorted_values[-1] is the first entry in the array
4255         setup_free(this, c.sorted_values ? c.sorted_values-1 : null);
4256       }
4257       setup_free(this, this.codebooks);
4258     }
4259     setup_free(this, this.floor_config);
4260     setup_free(this, this.residue_config);
4261     if (this.mapping) {
4262       foreach (immutable i; 0..this.mapping_count) setup_free(this, this.mapping[i].chan);
4263       setup_free(this, this.mapping);
4264     }
4265     foreach (immutable i; 0..(this.vrchannels > STB_VORBIS_MAX_CHANNELS ? STB_VORBIS_MAX_CHANNELS : this.vrchannels)) {
4266       setup_free(this, this.channel_buffers.ptr[i]);
4267       setup_free(this, this.previous_window.ptr[i]);
4268       version(STB_VORBIS_NO_DEFER_FLOOR) setup_free(this, this.floor_buffers.ptr[i]);
4269       setup_free(this, this.finalY.ptr[i]);
4270     }
4271     foreach (immutable i; 0..2) {
4272       setup_free(this, this.A.ptr[i]);
4273       setup_free(this, this.B.ptr[i]);
4274       setup_free(this, this.C.ptr[i]);
4275       setup_free(this, this.window.ptr[i]);
4276       setup_free(this, this.bit_reverse.ptr[i]);
4277     }
4278 
4279     rawClose();
4280     isOpened = false;
4281     stmread = null;
4282     stlastofs = uint.max;
4283     stst = 0;
4284     stpos = 0;
4285     stend = 0;
4286     stclose = false;
4287     stfl = null;
4288 
4289     sample_rate = 0;
4290     vrchannels = 0;
4291 
4292     setup_memory_required = 0;
4293     temp_memory_required = 0;
4294     setup_temp_memory_required = 0;
4295 
4296     read_comments = 0;
4297     comment_data = null;
4298     comment_size = 0;
4299 
4300     comment_data_pos = 0;
4301 
4302     /+
4303     stream = null;
4304     stream_start = null;
4305     stream_end = null;
4306     +/
4307 
4308     //stream_len = 0;
4309 
4310     /+push_mode = false;+/
4311 
4312     first_audio_page_offset = 0;
4313 
4314     p_first = p_first.init;
4315     p_last = p_last.init;
4316 
4317     setup_offset = 0;
4318     temp_offset = 0;
4319 
4320     eof = true;
4321     error = STBVorbisError.no_error;
4322 
4323     blocksize[] = 0;
4324     blocksize_0 = 0;
4325     blocksize_1 = 0;
4326     codebook_count = 0;
4327     codebooks = null;
4328     floor_count = 0;
4329     floor_types[] = 0;
4330     floor_config = null;
4331     residue_count = 0;
4332     residue_types[] = 0;
4333     residue_config = null;
4334     mapping_count = 0;
4335     mapping = null;
4336     mode_count = 0;
4337     mode_config[] = Mode.init;
4338 
4339     total_samples = 0;
4340 
4341     channel_buffers[] = null;
4342     outputs[] = null;
4343 
4344     previous_window[] = null;
4345     previous_length = 0;
4346 
4347     version(STB_VORBIS_NO_DEFER_FLOOR) {
4348       floor_buffers[] = null;
4349     } else {
4350       finalY[] = null;
4351     }
4352 
4353     current_loc = 0;
4354     current_loc_valid = 0;
4355 
4356     A[] = null;
4357     B[] = null;
4358     C[] = null;
4359     window[] = null;
4360     bit_reverse = null;
4361 
4362     serial = 0;
4363     last_page = 0;
4364     segment_count = 0;
4365     segments[] = 0;
4366     page_flag = 0;
4367     bytes_in_seg = 0;
4368     first_decode = 0;
4369     next_seg = 0;
4370     last_seg = 0;
4371     last_seg_which = 0;
4372     acc = 0;
4373     valid_bits = 0;
4374     packet_bytes = 0;
4375     end_seg_with_known_loc = 0;
4376     known_loc_for_packet = 0;
4377     discard_samples_deferred = 0;
4378     samples_output = 0;
4379 
4380     /+
4381     page_crc_tests = -1;
4382     scan[] = CRCscan.init;
4383     +/
4384 
4385     channel_buffer_start = 0;
4386     channel_buffer_end = 0;
4387   }
4388 
4389   @property const pure {
4390     int getSampleOffset () { return (current_loc_valid ? current_loc : -1); }
4391 
4392     @property ubyte chans () { return (isOpened ? cast(ubyte)this.vrchannels : 0); }
4393     @property uint sampleRate () { return (isOpened ? this.sample_rate : 0); }
4394     @property uint maxFrameSize () { return (isOpened ? this.blocksize_1>>1 : 0); }
4395 
4396     @property uint getSetupMemoryRequired () { return (isOpened ? this.setup_memory_required : 0); }
4397     @property uint getSetupTempMemoryRequired () { return (isOpened ? this.setup_temp_memory_required : 0); }
4398     @property uint getTempMemoryRequired () { return (isOpened ? this.temp_memory_required : 0); }
4399   }
4400 
4401   // will clear last error
4402   @property int lastError () {
4403     int e = error;
4404     error = STBVorbisError.no_error;
4405     return e;
4406   }
4407 
4408   // PUSHDATA API
4409   /+
4410   void flushPushdata () {
4411     if (push_mode) {
4412       previous_length = 0;
4413       page_crc_tests = 0;
4414       discard_samples_deferred = 0;
4415       current_loc_valid = false;
4416       first_decode = false;
4417       samples_output = 0;
4418       channel_buffer_start = 0;
4419       channel_buffer_end = 0;
4420     }
4421   }
4422 
4423   // return value: number of bytes we used
4424   int decodeFramePushdata(
4425            void* data, int data_len, // the memory available for decoding
4426            int* channels,            // place to write number of float* buffers
4427            float*** output,          // place to write float** array of float* buffers
4428            int* samples              // place to write number of output samples
4429        )
4430   {
4431     if (!this.push_mode) return .error(this, STBVorbisError.invalid_api_mixing);
4432 
4433     if (this.page_crc_tests >= 0) {
4434       *samples = 0;
4435       return vorbis_search_for_page_pushdata(this, cast(ubyte*)data, data_len);
4436     }
4437 
4438     this.stream = cast(ubyte*)data;
4439     this.stream_end = this.stream+data_len;
4440     this.error = STBVorbisError.no_error;
4441 
4442     // check that we have the entire packet in memory
4443     if (!is_whole_packet_present(this, false)) {
4444       *samples = 0;
4445       return 0;
4446     }
4447 
4448     int len, left, right;
4449 
4450     if (!vorbis_decode_packet(this, &len, &left, &right)) {
4451       // save the actual error we encountered
4452       STBVorbisError error = this.error;
4453       if (error == STBVorbisError.bad_packet_type) {
4454         // flush and resynch
4455         this.error = STBVorbisError.no_error;
4456         while (get8_packet(this) != EOP) if (this.eof) break;
4457         *samples = 0;
4458         return this.stream-data;
4459       }
4460       if (error == STBVorbisError.continued_packet_flag_invalid) {
4461         if (this.previous_length == 0) {
4462           // we may be resynching, in which case it's ok to hit one
4463           // of these; just discard the packet
4464           this.error = STBVorbisError.no_error;
4465           while (get8_packet(this) != EOP) if (this.eof) break;
4466           *samples = 0;
4467           return this.stream-data;
4468         }
4469       }
4470       // if we get an error while parsing, what to do?
4471       // well, it DEFINITELY won't work to continue from where we are!
4472       flushPushdata();
4473       // restore the error that actually made us bail
4474       this.error = error;
4475       *samples = 0;
4476       return 1;
4477     }
4478 
4479     // success!
4480     len = vorbis_finish_frame(this, len, left, right);
4481     foreach (immutable i; 0..this.vrchannels) this.outputs.ptr[i] = this.channel_buffers.ptr[i]+left;
4482 
4483     if (channels) *channels = this.vrchannels;
4484     *samples = len;
4485     *output = this.outputs.ptr;
4486     return this.stream-data;
4487   }
4488   +/
4489 
4490   public uint fileOffset () {
4491     if (/+push_mode ||+/ !isOpened) return 0;
4492     /+if (stream !is null) return cast(uint)(stream-stream_start);+/
4493     return (stpos > stst ? stpos-stst : 0);
4494   }
4495 
4496   public uint stream_len () { return stend-stst; }
4497 
4498   // DATA-PULLING API
4499   public int seekFrame (uint sample_number) {
4500     uint max_frame_samples;
4501 
4502     /+if (this.push_mode) return -.error(this, STBVorbisError.invalid_api_mixing);+/
4503 
4504     // fast page-level search
4505     if (!seek_to_sample_coarse(this, sample_number)) return 0;
4506 
4507     assert(this.current_loc_valid);
4508     assert(this.current_loc <= sample_number);
4509 
4510     import std.stdio;
4511 
4512     // linear search for the relevant packet
4513     max_frame_samples = (this.blocksize_1*3-this.blocksize_0)>>2;
4514     while (this.current_loc < sample_number) {
4515       int left_start, left_end, right_start, right_end, mode, frame_samples;
4516       if (!peek_decode_initial(this, &left_start, &left_end, &right_start, &right_end, &mode)) return .error(this, STBVorbisError.seek_failed);
4517       // calculate the number of samples returned by the next frame
4518       frame_samples = right_start-left_start;
4519       if (this.current_loc+frame_samples > sample_number) {
4520         return 1; // the next frame will contain the sample
4521       } else if (this.current_loc+frame_samples+max_frame_samples > sample_number) {
4522         // there's a chance the frame after this could contain the sample
4523         vorbis_pump_first_frame(this);
4524       } else {
4525         // this frame is too early to be relevant
4526         this.current_loc += frame_samples;
4527         this.previous_length = 0;
4528         maybe_start_packet(this);
4529         flush_packet(this);
4530       }
4531     }
4532     // the next frame will start with the sample
4533     assert(this.current_loc == sample_number);
4534 
4535     return 1;
4536   }
4537 
4538   public int seek (uint sample_number) {
4539     if (!seekFrame(sample_number)) return 0;
4540     if (sample_number != this.current_loc) {
4541       int n;
4542       uint frame_start = this.current_loc;
4543       getFrameFloat(&n, null);
4544       assert(sample_number > frame_start);
4545       assert(this.channel_buffer_start+cast(int)(sample_number-frame_start) <= this.channel_buffer_end);
4546       this.channel_buffer_start += (sample_number-frame_start);
4547     }
4548     return 1;
4549   }
4550 
4551   public bool seekStart () {
4552     /+if (push_mode) { .error(this, STBVorbisError.invalid_api_mixing); return; }+/
4553     set_file_offset(this, first_audio_page_offset);
4554     previous_length = 0;
4555     first_decode = true;
4556     next_seg = -1;
4557     return vorbis_pump_first_frame(this);
4558   }
4559 
4560   public uint streamLengthInSamples () {
4561     uint restore_offset, previous_safe;
4562     uint end, last_page_loc;
4563 
4564     /+if (this.push_mode) return .error(this, STBVorbisError.invalid_api_mixing);+/
4565     if (!this.total_samples) {
4566       uint last;
4567       uint lo, hi;
4568       char[6] header;
4569 
4570       // first, store the current decode position so we can restore it
4571       restore_offset = fileOffset;
4572 
4573       // now we want to seek back 64K from the end (the last page must
4574       // be at most a little less than 64K, but let's allow a little slop)
4575       if (this.stream_len >= 65536 && this.stream_len-65536 >= this.first_audio_page_offset) {
4576         previous_safe = this.stream_len-65536;
4577       } else {
4578         previous_safe = this.first_audio_page_offset;
4579       }
4580 
4581       set_file_offset(this, previous_safe);
4582       // previous_safe is now our candidate 'earliest known place that seeking
4583       // to will lead to the final page'
4584 
4585       if (!vorbis_find_page(this, &end, &last)) {
4586         // if we can't find a page, we're hosed!
4587         this.error = STBVorbisError.cant_find_last_page;
4588         this.total_samples = 0xffffffff;
4589         goto done;
4590       }
4591 
4592       // check if there are more pages
4593       last_page_loc = fileOffset;
4594 
4595       // stop when the last_page flag is set, not when we reach eof;
4596       // this allows us to stop short of a 'file_section' end without
4597       // explicitly checking the length of the section
4598       while (!last) {
4599         set_file_offset(this, end);
4600         if (!vorbis_find_page(this, &end, &last)) {
4601           // the last page we found didn't have the 'last page' flag set. whoops!
4602           break;
4603         }
4604         previous_safe = last_page_loc+1;
4605         last_page_loc = fileOffset;
4606       }
4607 
4608       set_file_offset(this, last_page_loc);
4609 
4610       // parse the header
4611       getn(this, cast(ubyte*)header, 6);
4612       // extract the absolute granule position
4613       lo = get32(this);
4614       hi = get32(this);
4615       if (lo == 0xffffffff && hi == 0xffffffff) {
4616         this.error = STBVorbisError.cant_find_last_page;
4617         this.total_samples = SAMPLE_unknown;
4618         goto done;
4619       }
4620       if (hi) lo = 0xfffffffe; // saturate
4621       this.total_samples = lo;
4622 
4623       this.p_last.page_start = last_page_loc;
4624       this.p_last.page_end = end;
4625       this.p_last.last_decoded_sample = lo;
4626 
4627      done:
4628       set_file_offset(this, restore_offset);
4629     }
4630     return (this.total_samples == SAMPLE_unknown ? 0 : this.total_samples);
4631   }
4632 
4633   public float streamLengthInSeconds () {
4634     return (isOpened ? streamLengthInSamples()/cast(float)sample_rate : 0.0f);
4635   }
4636 
4637   public int getFrameFloat (int* channels, float*** output) {
4638     int len, right, left;
4639     /+if (push_mode) return .error(this, STBVorbisError.invalid_api_mixing);+/
4640 
4641     if (!vorbis_decode_packet(this, &len, &left, &right)) {
4642       channel_buffer_start = channel_buffer_end = 0;
4643       return 0;
4644     }
4645 
4646     len = vorbis_finish_frame(this, len, left, right);
4647     foreach (immutable i; 0..this.vrchannels) this.outputs.ptr[i] = this.channel_buffers.ptr[i]+left;
4648 
4649     channel_buffer_start = left;
4650     channel_buffer_end = left+len;
4651 
4652     if (channels) *channels = this.vrchannels;
4653     if (output) *output = this.outputs.ptr;
4654     return len;
4655   }
4656 
4657   /+
4658   public VorbisDecoder stb_vorbis_open_memory (const(void)* data, int len, int* error=null, stb_vorbis_alloc* alloc=null) {
4659     VorbisDecoder this;
4660     stb_vorbis_ctx p = void;
4661     if (data is null) return null;
4662     vorbis_init(&p, alloc);
4663     p.stream = cast(ubyte*)data;
4664     p.stream_end = cast(ubyte*)data+len;
4665     p.stream_start = cast(ubyte*)p.stream;
4666     p.stream_len = len;
4667     p.push_mode = false;
4668     if (start_decoder(&p)) {
4669       this = vorbis_alloc(&p);
4670       if (this) {
4671         *this = p;
4672         vorbis_pump_first_frame(this);
4673         return this;
4674       }
4675     }
4676     if (error) *error = p.error;
4677     vorbis_deinit(&p);
4678     return null;
4679   }
4680   +/
4681 
4682   // s16 samples API
4683   int getFrameShort (int num_c, short** buffer, int num_samples) {
4684     float** output;
4685     int len = getFrameFloat(null, &output);
4686     if (len > num_samples) len = num_samples;
4687     if (len) convert_samples_short(num_c, buffer, 0, vrchannels, output, 0, len);
4688     return len;
4689   }
4690 
4691   int getFrameShortInterleaved (int num_c, short* buffer, int num_shorts) {
4692     float** output;
4693     int len;
4694     if (num_c == 1) return getFrameShort(num_c, &buffer, num_shorts);
4695     len = getFrameFloat(null, &output);
4696     if (len) {
4697       if (len*num_c > num_shorts) len = num_shorts/num_c;
4698       convert_channels_short_interleaved(num_c, buffer, vrchannels, output, 0, len);
4699     }
4700     return len;
4701   }
4702 
4703   int getSamplesShortInterleaved (int channels, short* buffer, int num_shorts) {
4704     float** outputs;
4705     int len = num_shorts/channels;
4706     int n = 0;
4707     int z = this.vrchannels;
4708     if (z > channels) z = channels;
4709     while (n < len) {
4710       int k = channel_buffer_end-channel_buffer_start;
4711       if (n+k >= len) k = len-n;
4712       if (k) convert_channels_short_interleaved(channels, buffer, vrchannels, channel_buffers.ptr, channel_buffer_start, k);
4713       buffer += k*channels;
4714       n += k;
4715       channel_buffer_start += k;
4716       if (n == len) break;
4717       if (!getFrameFloat(null, &outputs)) break;
4718     }
4719     return n;
4720   }
4721 
4722   int getSamplesShort (int channels, short** buffer, int len) {
4723     float** outputs;
4724     int n = 0;
4725     int z = this.vrchannels;
4726     if (z > channels) z = channels;
4727     while (n < len) {
4728       int k = channel_buffer_end-channel_buffer_start;
4729       if (n+k >= len) k = len-n;
4730       if (k) convert_samples_short(channels, buffer, n, vrchannels, channel_buffers.ptr, channel_buffer_start, k);
4731       n += k;
4732       channel_buffer_start += k;
4733       if (n == len) break;
4734       if (!getFrameFloat(null, &outputs)) break;
4735     }
4736     return n;
4737   }
4738 
4739   /+
4740   public int stb_vorbis_decode_filename (string filename, int* channels, int* sample_rate, short** output) {
4741     import core.stdc.stdlib : malloc, realloc;
4742 
4743     int data_len, offset, total, limit, error;
4744     short* data;
4745     VorbisDecoder v = stb_vorbis_open_filename(filename, &error, null);
4746     if (v is null) return -1;
4747     limit = v.vrchannels*4096;
4748     *channels = v.vrchannels;
4749     if (sample_rate) *sample_rate = v.sample_rate;
4750     offset = data_len = 0;
4751     total = limit;
4752     data = cast(short*)malloc(total*(*data).sizeof);
4753     if (data is null) {
4754       stb_vorbis_close(v);
4755       return -2;
4756     }
4757     for (;;) {
4758       int n = stb_vorbis_get_frame_short_interleaved(v, v.vrchannels, data+offset, total-offset);
4759       if (n == 0) break;
4760       data_len += n;
4761       offset += n*v.vrchannels;
4762       if (offset+limit > total) {
4763         short *data2;
4764         total *= 2;
4765         data2 = cast(short*)realloc(data, total*(*data).sizeof);
4766         if (data2 is null) {
4767           import core.stdc.stdlib : free;
4768           free(data);
4769           stb_vorbis_close(v);
4770           return -2;
4771         }
4772         data = data2;
4773       }
4774     }
4775     *output = data;
4776     stb_vorbis_close(v);
4777     return data_len;
4778   }
4779 
4780   public int stb_vorbis_decode_memory (const(void)* mem, int len, int* channels, int* sample_rate, short** output) {
4781     import core.stdc.stdlib : malloc, realloc;
4782 
4783     int data_len, offset, total, limit, error;
4784     short* data;
4785     VorbisDecoder v = stb_vorbis_open_memory(mem, len, &error, null);
4786     if (v is null) return -1;
4787     limit = v.vrchannels*4096;
4788     *channels = v.vrchannels;
4789     if (sample_rate) *sample_rate = v.sample_rate;
4790     offset = data_len = 0;
4791     total = limit;
4792     data = cast(short*)malloc(total*(*data).sizeof);
4793     if (data is null) {
4794       stb_vorbis_close(v);
4795       return -2;
4796     }
4797     for (;;) {
4798       int n = stb_vorbis_get_frame_short_interleaved(v, v.vrchannels, data+offset, total-offset);
4799       if (n == 0) break;
4800       data_len += n;
4801       offset += n*v.vrchannels;
4802       if (offset+limit > total) {
4803         short *data2;
4804         total *= 2;
4805         data2 = cast(short*)realloc(data, total*(*data).sizeof);
4806         if (data2 is null) {
4807           import core.stdc.stdlib : free;
4808           free(data);
4809           stb_vorbis_close(v);
4810           return -2;
4811         }
4812         data = data2;
4813       }
4814     }
4815     *output = data;
4816     stb_vorbis_close(v);
4817     return data_len;
4818   }
4819 
4820   public int stb_vorbis_get_samples_float_interleaved (VorbisDecoder this, int channels, float* buffer, int num_floats) {
4821     float** outputs;
4822     int len = num_floats/channels;
4823     int n = 0;
4824     int z = this.vrchannels;
4825     if (z > channels) z = channels;
4826     while (n < len) {
4827       int k = this.channel_buffer_end-this.channel_buffer_start;
4828       if (n+k >= len) k = len-n;
4829       foreach (immutable j; 0..k) {
4830         foreach (immutable i; 0..z) *buffer++ = (this.channel_buffers.ptr[i])[this.channel_buffer_start+j];
4831         foreach (immutable i; z..channels) *buffer++ = 0;
4832       }
4833       n += k;
4834       this.channel_buffer_start += k;
4835       if (n == len) break;
4836       if (!stb_vorbis_get_frame_float(this, null, &outputs)) break;
4837     }
4838     return n;
4839   }
4840   +/
4841 
4842   public int getSamplesFloat (int achans, float** buffer, int num_samples) {
4843     import core.stdc.string : memcpy, memset;
4844     float** outputs;
4845     int n = 0;
4846     int z = vrchannels;
4847     if (z > achans) z = achans;
4848     while (n < num_samples) {
4849       int k = channel_buffer_end-channel_buffer_start;
4850       if (n+k >= num_samples) k = num_samples-n;
4851       if (k) {
4852         foreach (immutable i; 0..z) memcpy(buffer[i]+n, channel_buffers.ptr[i]+channel_buffer_start, float.sizeof*k);
4853         foreach (immutable i; z..achans) memset(buffer[i]+n, 0, float.sizeof*k);
4854       }
4855       n += k;
4856       channel_buffer_start += k;
4857       if (n == num_samples) break;
4858       if (!getFrameFloat(null, &outputs)) break;
4859     }
4860     return n;
4861   }
4862 
4863 private: // k8: 'cause i'm evil
4864   private enum cmt_len_size = 2;
4865   nothrow /*@trusted*/ @nogc {
4866     public @property bool comment_empty () const pure { return (comment_get_line_len == 0); }
4867 
4868     // 0: error
4869     // includes length itself
4870     private uint comment_get_line_len () const pure {
4871       if (comment_data_pos >= comment_size) return 0;
4872       if (comment_size-comment_data_pos < cmt_len_size) return 0;
4873       uint len = comment_data[comment_data_pos];
4874       len += cast(uint)comment_data[comment_data_pos+1]<<8;
4875       return (len >= cmt_len_size && comment_data_pos+len <= comment_size ? len : 0);
4876     }
4877 
4878     public bool comment_rewind () {
4879       comment_data_pos = 0;
4880       for (;;) {
4881         auto len = comment_get_line_len();
4882         if (!len) { comment_data_pos = comment_size; return false; }
4883         if (len != cmt_len_size) return true;
4884         comment_data_pos += len;
4885       }
4886     }
4887 
4888     // true: has something to read after skip
4889     public bool comment_skip () {
4890       comment_data_pos += comment_get_line_len();
4891       for (;;) {
4892         auto len = comment_get_line_len();
4893         if (!len) { comment_data_pos = comment_size; return false; }
4894         if (len != cmt_len_size) break;
4895         comment_data_pos += len;
4896       }
4897       return true;
4898     }
4899 
4900     public const(char)[] comment_line () {
4901       auto len = comment_get_line_len();
4902       if (len < cmt_len_size) return null;
4903       if (len == cmt_len_size) return "";
4904       return (cast(char*)comment_data+comment_data_pos+cmt_len_size)[0..len-cmt_len_size];
4905     }
4906 
4907     public const(char)[] comment_name () {
4908       auto line = comment_line();
4909       if (line.length == 0) return line;
4910       uint epos = 0;
4911       while (epos < line.length && line.ptr[epos] != '=') ++epos;
4912       return (epos < line.length ? line[0..epos] : "");
4913     }
4914 
4915     public const(char)[] comment_value () {
4916       auto line = comment_line();
4917       if (line.length == 0) return line;
4918       uint epos = 0;
4919       while (epos < line.length && line.ptr[epos] != '=') ++epos;
4920       return (epos < line.length ? line[epos+1..$] : line);
4921     }
4922   }
4923 }
4924 
4925 
4926 // ////////////////////////////////////////////////////////////////////////// //
4927 private:
4928 // cool helper to translate C defines
4929 template cmacroFixVars(T...) {
4930   /**
4931    * 64-bit implementation of fasthash
4932    *
4933    * Params:
4934    *   buf =  data buffer
4935    *   seed = the seed
4936    *
4937    * Returns:
4938    *   32-bit or 64-bit hash
4939    */
4940   size_t hashOf (const(void)* buf, size_t len, size_t seed=0) pure nothrow @trusted @nogc {
4941     enum Get8Bytes = q{
4942       cast(ulong)data[0]|
4943       (cast(ulong)data[1]<<8)|
4944       (cast(ulong)data[2]<<16)|
4945       (cast(ulong)data[3]<<24)|
4946       (cast(ulong)data[4]<<32)|
4947       (cast(ulong)data[5]<<40)|
4948       (cast(ulong)data[6]<<48)|
4949       (cast(ulong)data[7]<<56)
4950     };
4951     enum m = 0x880355f21e6d1965UL;
4952     auto data = cast(const(ubyte)*)buf;
4953     ulong h = seed;
4954     ulong t;
4955     foreach (immutable _; 0..len/8) {
4956       version(HasUnalignedOps) {
4957         if (__ctfe) {
4958           t = mixin(Get8Bytes);
4959         } else {
4960           t = *cast(ulong*)data;
4961         }
4962       } else {
4963         t = mixin(Get8Bytes);
4964       }
4965       data += 8;
4966       t ^= t>>23;
4967       t *= 0x2127599bf4325c37UL;
4968       t ^= t>>47;
4969       h ^= t;
4970       h *= m;
4971     }
4972 
4973     h ^= len*m;
4974     t = 0;
4975     switch (len&7) {
4976       case 7: t ^= cast(ulong)data[6]<<48; goto case 6;
4977       case 6: t ^= cast(ulong)data[5]<<40; goto case 5;
4978       case 5: t ^= cast(ulong)data[4]<<32; goto case 4;
4979       case 4: t ^= cast(ulong)data[3]<<24; goto case 3;
4980       case 3: t ^= cast(ulong)data[2]<<16; goto case 2;
4981       case 2: t ^= cast(ulong)data[1]<<8; goto case 1;
4982       case 1: t ^= cast(ulong)data[0]; goto default;
4983       default:
4984         t ^= t>>23;
4985         t *= 0x2127599bf4325c37UL;
4986         t ^= t>>47;
4987         h ^= t;
4988         h *= m;
4989         break;
4990     }
4991 
4992     h ^= h>>23;
4993     h *= 0x2127599bf4325c37UL;
4994     h ^= h>>47;
4995     static if (size_t.sizeof == 4) {
4996       // 32-bit hash
4997       // the following trick converts the 64-bit hashcode to Fermat
4998       // residue, which shall retain information from both the higher
4999       // and lower parts of hashcode.
5000       return cast(size_t)(h-(h>>32));
5001     } else {
5002       return h;
5003     }
5004   }
5005 
5006   string cmacroFixVars (string s, string[] names...) {
5007     assert(T.length == names.length, "cmacroFixVars: names and arguments count mismatch");
5008     enum tmpPfxName = "__temp_prefix__";
5009     string res;
5010     string tmppfx;
5011     uint pos = 0;
5012     // skip empty lines (for pretty printing)
5013     // trim trailing spaces
5014     while (s.length > 0 && s[$-1] <= ' ') s = s[0..$-1];
5015     uint linestpos = 0; // start of the current line
5016     while (pos < s.length) {
5017       if (s[pos] > ' ') break;
5018       if (s[pos] == '\n') linestpos = pos+1;
5019       ++pos;
5020     }
5021     pos = linestpos;
5022     while (pos+2 < s.length) {
5023       int epos = pos;
5024       while (epos+2 < s.length && (s[epos] != '$' || s[epos+1] != '{')) ++epos;
5025       if (epos > pos) {
5026         if (s.length-epos < 3) break;
5027         res ~= s[pos..epos];
5028         pos = epos;
5029       }
5030       assert(s[pos] == '$' && s[pos+1] == '{');
5031       pos += 2;
5032       bool found = false;
5033       if (s.length-pos >= tmpPfxName.length+1 && s[pos+tmpPfxName.length] == '}' && s[pos..pos+tmpPfxName.length] == tmpPfxName) {
5034         if (tmppfx.length == 0) {
5035           // generate temporary prefix
5036           auto hash = hashOf(s.ptr, s.length);
5037           immutable char[16] hexChars = "0123456789abcdef";
5038           tmppfx = "_temp_macro_var_";
5039           foreach_reverse (immutable idx; 0..size_t.sizeof*2) {
5040             tmppfx ~= hexChars[hash&0x0f];
5041             hash >>= 4;
5042           }
5043           tmppfx ~= "_";
5044         }
5045         pos += tmpPfxName.length+1;
5046         res ~= tmppfx;
5047         found = true;
5048       } else {
5049         foreach (immutable nidx, string oname; T) {
5050           static assert(oname.length > 0);
5051           if (s.length-pos >= oname.length+1 && s[pos+oname.length] == '}' && s[pos..pos+oname.length] == oname) {
5052             found = true;
5053             pos += oname.length+1;
5054             res ~= names[nidx];
5055             break;
5056           }
5057         }
5058       }
5059       assert(found, "unknown variable in macro");
5060     }
5061     if (pos < s.length) res ~= s[pos..$];
5062     return res;
5063   }
5064 }
5065 
5066 // ////////////////////////////////////////////////////////////////////////// //
5067 /* Version history
5068     1.09    - 2016/04/04 - back out 'avoid discarding last frame' fix from previous version
5069     1.08    - 2016/04/02 - fixed multiple warnings; fix setup memory leaks;
5070                            avoid discarding last frame of audio data
5071     1.07    - 2015/01/16 - fixed some warnings, fix mingw, const-correct API
5072                            some more crash fixes when out of memory or with corrupt files
5073     1.06    - 2015/08/31 - full, correct support for seeking API (Dougall Johnson)
5074                            some crash fixes when out of memory or with corrupt files
5075     1.05    - 2015/04/19 - don't define __forceinline if it's redundant
5076     1.04    - 2014/08/27 - fix missing const-correct case in API
5077     1.03    - 2014/08/07 - Warning fixes
5078     1.02    - 2014/07/09 - Declare qsort compare function _cdecl on windows
5079     1.01    - 2014/06/18 - fix stb_vorbis_get_samples_float
5080     1.0     - 2014/05/26 - fix memory leaks; fix warnings; fix bugs in multichannel
5081                            (API change) report sample rate for decode-full-file funcs
5082     0.99996 - bracket #include <malloc.h> for macintosh compilation by Laurent Gomila
5083     0.99995 - use union instead of pointer-cast for fast-float-to-int to avoid alias-optimization problem
5084     0.99994 - change fast-float-to-int to work in single-precision FPU mode, remove endian-dependence
5085     0.99993 - remove assert that fired on legal files with empty tables
5086     0.99992 - rewind-to-start
5087     0.99991 - bugfix to stb_vorbis_get_samples_short by Bernhard Wodo
5088     0.9999 - (should have been 0.99990) fix no-CRT support, compiling as C++
5089     0.9998 - add a full-decode function with a memory source
5090     0.9997 - fix a bug in the read-from-FILE case in 0.9996 addition
5091     0.9996 - query length of vorbis stream in samples/seconds
5092     0.9995 - bugfix to another optimization that only happened in certain files
5093     0.9994 - bugfix to one of the optimizations that caused significant (but inaudible?) errors
5094     0.9993 - performance improvements; runs in 99% to 104% of time of reference implementation
5095     0.9992 - performance improvement of IMDCT; now performs close to reference implementation
5096     0.9991 - performance improvement of IMDCT
5097     0.999 - (should have been 0.9990) performance improvement of IMDCT
5098     0.998 - no-CRT support from Casey Muratori
5099     0.997 - bugfixes for bugs found by Terje Mathisen
5100     0.996 - bugfix: fast-huffman decode initialized incorrectly for sparse codebooks; fixing gives 10% speedup - found by Terje Mathisen
5101     0.995 - bugfix: fix to 'effective' overrun detection - found by Terje Mathisen
5102     0.994 - bugfix: garbage decode on final VQ symbol of a non-multiple - found by Terje Mathisen
5103     0.993 - bugfix: pushdata API required 1 extra byte for empty page (failed to consume final page if empty) - found by Terje Mathisen
5104     0.992 - fixes for MinGW warning
5105     0.991 - turn fast-float-conversion on by default
5106     0.990 - fix push-mode seek recovery if you seek into the headers
5107     0.98b - fix to bad release of 0.98
5108     0.98 - fix push-mode seek recovery; robustify float-to-int and support non-fast mode
5109     0.97 - builds under c++ (typecasting, don't use 'class' keyword)
5110     0.96 - somehow MY 0.95 was right, but the web one was wrong, so here's my 0.95 rereleased as 0.96, fixes a typo in the clamping code
5111     0.95 - clamping code for 16-bit functions
5112     0.94 - not publically released
5113     0.93 - fixed all-zero-floor case (was decoding garbage)
5114     0.92 - fixed a memory leak
5115     0.91 - conditional compiles to omit parts of the API and the infrastructure to support them: STB_VORBIS_NO_PULLDATA_API, STB_VORBIS_NO_PUSHDATA_API, STB_VORBIS_NO_STDIO, STB_VORBIS_NO_INTEGER_CONVERSION
5116     0.90 - first public release
5117 */
5118 
5119 /*
5120 ------------------------------------------------------------------------------
5121 This software is available under 2 licenses -- choose whichever you prefer.
5122 ------------------------------------------------------------------------------
5123 ALTERNATIVE A - MIT License
5124 Copyright (c) 2017 Sean Barrett
5125 Permission is hereby granted, free of charge, to any person obtaining a copy of
5126 this software and associated documentation files (the "Software"), to deal in
5127 the Software without restriction, including without limitation the rights to
5128 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
5129 of the Software, and to permit persons to whom the Software is furnished to do
5130 so, subject to the following conditions:
5131 The above copyright notice and this permission notice shall be included in all
5132 copies or substantial portions of the Software.
5133 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5134 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5135 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5136 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
5137 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
5138 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
5139 SOFTWARE.
5140 ------------------------------------------------------------------------------
5141 ALTERNATIVE B - Public Domain (www.unlicense.org)
5142 This is free and unencumbered software released into the public domain.
5143 Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
5144 software, either in source code form or as a compiled binary, for any purpose,
5145 commercial or non-commercial, and by any means.
5146 In jurisdictions that recognize copyright laws, the author or authors of this
5147 software dedicate any and all copyright interest in the software to the public
5148 domain. We make this dedication for the benefit of the public at large and to
5149 the detriment of our heirs and successors. We intend this dedication to be an
5150 overt act of relinquishment in perpetuity of all present and future rights to
5151 this software under copyright law.
5152 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5153 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5154 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
5155 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
5156 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
5157 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5158 ------------------------------------------------------------------------------
5159 */