1 // FLAC audio decoder. Public domain. See "unlicense" statement at the end of this file.
2 // dr_flac - v0.3d - 11/06/2016
3 // commit eebbf6ed17e9200a48c8f83a350a82722295558f
4 //
5 // David Reid - mackron@gmail.com
6 //
7 // some fixes from v0.4f - 2017-03-10
8 //   - Fix a couple of bugs with the bitstreaming code.
9 //
10 // fix from 767c3fbda48f54ce1050afa75110ae69cccdf0dd
11 //
12 // some fixes from v0.8d - 2017-09-22 (actually, one)
13 //   k8 SKIPPED: Add support for decoding streams with ID3 tags. ID3 tags are just skipped.
14 //   k8: i am absolutely not interested in such fucked flac files, and won't support that idiocy.
15 //
16 // D translation by Ketmar // Invisible Vector
17 module audioformats.drflac;
18 
19 nothrow @nogc:
20 version(decodeFLAC):
21 
22 
23 // USAGE
24 //
25 // dr_flac is a single-file library.
26 //
27 // To decode audio data, do something like the following:
28 //
29 //     drflac* pFlac = drflac_open_file("MySong.flac");
30 //     if (pFlac is null) {
31 //         // Failed to open FLAC file
32 //     }
33 //
34 //     int* pSamples = malloc(pFlac.totalSampleCount * (int)).sizeof;
35 //     ulong numberOfInterleavedSamplesActuallyRead = drflac_read_s32(pFlac, pFlac.totalSampleCount, pSamples);
36 //
37 // The drflac object represents the decoder. It is a transparent type so all the information you need, such as the number of
38 // channels and the bits per sample, should be directly accessible - just make sure you don't change their values. Samples are
39 // always output as interleaved signed 32-bit PCM. In the example above a native FLAC stream was opened, however dr_flac has
40 // seamless support for Ogg encapsulated FLAC streams as well.
41 //
42 // You do not need to decode the entire stream in one go - you just specify how many samples you'd like at any given time and
43 // the decoder will give you as many samples as it can, up to the amount requested. Later on when you need the next batch of
44 // samples, just call it again. Example:
45 //
46 //     while (drflac_read_s32(pFlac, chunkSize, pChunkSamples) > 0) {
47 //         do_something();
48 //     }
49 //
50 // You can seek to a specific sample with drflac_seek_to_sample(). The given sample is based on interleaving. So for example,
51 // if you were to seek to the sample at index 0 in a stereo stream, you'll be seeking to the first sample of the left channel.
52 // The sample at index 1 will be the first sample of the right channel. The sample at index 2 will be the second sample of the
53 // left channel, etc.
54 //
55 //
56 // If you just want to quickly decode an entire FLAC file in one go you can do something like this:
57 //
58 //     uint sampleRate;
59 //     uint channels;
60 //     ulong totalSampleCount;
61 //     int* pSampleData = drflac_open_and_decode_file("MySong.flac", &sampleRate, &channels, &totalSampleCount);
62 //     if (pSampleData is null) {
63 //         // Failed to open and decode FLAC file.
64 //     }
65 //
66 //     ...
67 //
68 //     drflac_free(pSampleData);
69 //
70 //
71 // If you need access to metadata (album art, etc.), use drflac_open_with_metadata(), drflac_open_file_with_metdata() or
72 // drflac_open_memory_with_metadata(). The rationale for keeping these APIs separate is that they're slightly slower than the
73 // normal versions and also just a little bit harder to use.
74 //
75 // dr_flac reports metadata to the application through the use of a callback, and every metadata block is reported before
76 // drflac_open_with_metdata() returns. See https://github.com/mackron/dr_libs_tests/blob/master/dr_flac/dr_flac_test_2.c for
77 // an example on how to read metadata.
78 //
79 //
80 //
81 // OPTIONS
82 // #define these options before including this file.
83 //
84 // #define DR_FLAC_NO_STDIO
85 //   Disable drflac_open_file().
86 //
87 // #define DR_FLAC_NO_OGG
88 //   Disables support for Ogg/FLAC streams.
89 //
90 // #define DR_FLAC_NO_WIN32_IO
91 //   In the Win32 build, dr_flac uses the Win32 IO APIs for drflac_open_file() by default. This setting will make it use the
92 //   standard FILE APIs instead. Ignored when DR_FLAC_NO_STDIO is #defined. (The rationale for this configuration is that
93 //   there's a bug in one compiler's Win32 implementation of the FILE APIs which is not present in the Win32 IO APIs.)
94 //
95 // #define DR_FLAC_BUFFER_SIZE <number>
96 //   Defines the size of the internal buffer to store data from onRead(). This buffer is used to reduce the number of calls
97 //   back to the client for more data. Larger values means more memory, but better performance. My tests show diminishing
98 //   returns after about 4KB (which is the default). Consider reducing this if you have a very efficient implementation of
99 //   onRead(), or increase it if it's very inefficient. Must be a multiple of 8.
100 //
101 //
102 //
103 // QUICK NOTES
104 // - Based on my tests, the performance of the 32-bit build is at about parity with the reference implementation. The 64-bit build
105 //   is slightly faster.
106 // - dr_flac does not currently do any CRC checks.
107 // - dr_flac should work fine with valid native FLAC files, but for broadcast streams it won't work if the header and STREAMINFO
108 //   block is unavailable.
109 // - Audio data is output as signed 32-bit PCM, regardless of the bits per sample the FLAC stream is encoded as.
110 // - This has not been tested on big-endian architectures.
111 // - Rice codes in unencoded binary form (see https://xiph.org/flac/format.html#rice_partition) has not been tested. If anybody
112 //   knows where I can find some test files for this, let me know.
113 // - Perverse and erroneous files have not been tested. Again, if you know where I can get some test files let me know.
114 // - dr_flac is not thread-safe, but it's APIs can be called from any thread so long as you do your own synchronization.
115 
116 enum DrFlacHasVFS = false;
117 
118 
119 // As data is read from the client it is placed into an internal buffer for fast access. This controls the
120 // size of that buffer. Larger values means more speed, but also more memory. In my testing there is diminishing
121 // returns after about 4KB, but you can fiddle with this to suit your own needs. Must be a multiple of 8.
122 enum DR_FLAC_BUFFER_SIZE = 4096;
123 
124 // Check if we can enable 64-bit optimizations.
125 //version = DRFLAC_64BIT;
126 
127 version(DRFLAC_64BIT) alias drflac_cache_t = ulong; else alias drflac_cache_t = uint;
128 
129 // The various metadata block types.
130 enum DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO = 0;
131 enum DRFLAC_METADATA_BLOCK_TYPE_PADDING = 1;
132 enum DRFLAC_METADATA_BLOCK_TYPE_APPLICATION = 2;
133 enum DRFLAC_METADATA_BLOCK_TYPE_SEEKTABLE = 3;
134 enum DRFLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT = 4;
135 enum DRFLAC_METADATA_BLOCK_TYPE_CUESHEET = 5;
136 enum DRFLAC_METADATA_BLOCK_TYPE_PICTURE = 6;
137 enum DRFLAC_METADATA_BLOCK_TYPE_INVALID = 127;
138 
139 // The various picture types specified in the PICTURE block.
140 enum DRFLAC_PICTURE_TYPE_OTHER = 0;
141 enum DRFLAC_PICTURE_TYPE_FILE_ICON = 1;
142 enum DRFLAC_PICTURE_TYPE_OTHER_FILE_ICON = 2;
143 enum DRFLAC_PICTURE_TYPE_COVER_FRONT = 3;
144 enum DRFLAC_PICTURE_TYPE_COVER_BACK = 4;
145 enum DRFLAC_PICTURE_TYPE_LEAFLET_PAGE = 5;
146 enum DRFLAC_PICTURE_TYPE_MEDIA = 6;
147 enum DRFLAC_PICTURE_TYPE_LEAD_ARTIST = 7;
148 enum DRFLAC_PICTURE_TYPE_ARTIST = 8;
149 enum DRFLAC_PICTURE_TYPE_CONDUCTOR = 9;
150 enum DRFLAC_PICTURE_TYPE_BAND = 10;
151 enum DRFLAC_PICTURE_TYPE_COMPOSER = 11;
152 enum DRFLAC_PICTURE_TYPE_LYRICIST = 12;
153 enum DRFLAC_PICTURE_TYPE_RECORDING_LOCATION = 13;
154 enum DRFLAC_PICTURE_TYPE_DURING_RECORDING = 14;
155 enum DRFLAC_PICTURE_TYPE_DURING_PERFORMANCE = 15;
156 enum DRFLAC_PICTURE_TYPE_SCREEN_CAPTURE = 16;
157 enum DRFLAC_PICTURE_TYPE_BRIGHT_COLORED_FISH = 17;
158 enum DRFLAC_PICTURE_TYPE_ILLUSTRATION = 18;
159 enum DRFLAC_PICTURE_TYPE_BAND_LOGOTYPE = 19;
160 enum DRFLAC_PICTURE_TYPE_PUBLISHER_LOGOTYPE = 20;
161 
162 alias drflac_container = int;
163 enum {
164   drflac_container_native,
165   drflac_container_ogg,
166 }
167 
168 alias drflac_seek_origin = int;
169 enum {
170   drflac_seek_origin_start,
171   drflac_seek_origin_current,
172 }
173 
174 // Packing is important on this structure because we map this directly to the raw data within the SEEKTABLE metadata block.
175 //#pragma pack(2)
176 align(2) struct drflac_seekpoint {
177 align(2):
178   ulong firstSample;
179   ulong frameOffset;   // The offset from the first byte of the header of the first frame.
180   ushort sampleCount;
181 }
182 //#pragma pack()
183 
184 struct drflac_streaminfo {
185   ushort minBlockSize;
186   ushort maxBlockSize;
187   uint minFrameSize;
188   uint maxFrameSize;
189   uint sampleRate;
190   ubyte channels;
191   ubyte bitsPerSample;
192   ulong totalSampleCount;
193   ubyte[16] md5;
194 }
195 
196 struct drflac_metadata {
197   // The metadata type. Use this to know how to interpret the data below.
198   uint type;
199 
200   // A pointer to the raw data. This points to a temporary buffer so don't hold on to it. It's best to
201   // not modify the contents of this buffer. Use the structures below for more meaningful and structured
202   // information about the metadata. It's possible for this to be null.
203   const(void)* pRawData;
204 
205   // The size in bytes of the block and the buffer pointed to by pRawData if it's non-null.
206   uint rawDataSize;
207 
208   static struct Padding {
209     int unused;
210   }
211 
212   static struct Application {
213     uint id;
214     const(void)* pData;
215     uint dataSize;
216   }
217 
218   static struct SeekTable {
219     uint seekpointCount;
220     const(drflac_seekpoint)* pSeekpoints;
221   }
222 
223   static struct VorbisComment {
224     uint vendorLength;
225     const(char)* vendor;
226     uint commentCount;
227     const(char)* comments;
228   }
229 
230   static struct CueSheet {
231     char[128] catalog;
232     ulong leadInSampleCount;
233     bool isCD;
234     ubyte trackCount;
235     const(ubyte)* pTrackData;
236   }
237 
238   static struct Picture {
239     uint type;
240     uint mimeLength;
241     const(char)* mime;
242     uint descriptionLength;
243     const(char)* description;
244     uint width;
245     uint height;
246     uint colorDepth;
247     uint indexColorCount;
248     uint pictureDataSize;
249     const(ubyte)* pPictureData;
250   }
251 
252   static union Data {
253     drflac_streaminfo streaminfo;
254     Padding padding;
255     Application application;
256     SeekTable seektable;
257     VorbisComment vorbis_comment;
258     CueSheet cuesheet;
259     Picture picture;
260   }
261 
262   Data data;
263 }
264 
265 
266 // Callback for when data needs to be read from the client.
267 //
268 // pUserData   [in]  The user data that was passed to drflac_open() and family.
269 // pBufferOut  [out] The output buffer.
270 // bytesToRead [in]  The number of bytes to read.
271 //
272 // Returns the number of bytes actually read.
273 alias drflac_read_proc = size_t function (void* pUserData, void* pBufferOut, size_t bytesToRead);
274 
275 // Callback for when data needs to be seeked.
276 //
277 // pUserData [in] The user data that was passed to drflac_open() and family.
278 // offset    [in] The number of bytes to move, relative to the origin. Will never be negative.
279 // origin    [in] The origin of the seek - the current position or the start of the stream.
280 //
281 // Returns whether or not the seek was successful.
282 //
283 // The offset will never be negative. Whether or not it is relative to the beginning or current position is determined
284 // by the "origin" parameter which will be either drflac_seek_origin_start or drflac_seek_origin_current.
285 alias drflac_seek_proc = bool function (void* pUserData, int offset, drflac_seek_origin origin);
286 
287 // Callback for when a metadata block is read.
288 //
289 // pUserData [in] The user data that was passed to drflac_open() and family.
290 // pMetadata [in] A pointer to a structure containing the data of the metadata block.
291 //
292 // Use pMetadata.type to determine which metadata block is being handled and how to read the data.
293 alias drflac_meta_proc = void delegate (void* pUserData, drflac_metadata* pMetadata);
294 
295 
296 // Structure for internal use. Only used for decoders opened with drflac_open_memory.
297 struct drflac__memory_stream {
298   const(ubyte)* data;
299   size_t dataSize;
300   size_t currentReadPos;
301 }
302 
303 // Structure for internal use. Used for bit streaming.
304 struct drflac_bs {
305   // The function to call when more data needs to be read.
306   //drflac_read_proc onRead;
307 
308   // The function to call when the current read position needs to be moved.
309   //drflac_seek_proc onSeek;
310 
311   // The user data to pass around to onRead and onSeek.
312   //void* pUserData;
313 
314   ReadStruct rs;
315 
316   bool stdio; //k8: it is drflac's stdio shit
317 
318   // The number of unaligned bytes in the L2 cache. This will always be 0 until the end of the stream is hit. At the end of the
319   // stream there will be a number of bytes that don't cleanly fit in an L1 cache line, so we use this variable to know whether
320   // or not the bistreamer needs to run on a slower path to read those last bytes. This will never be more than (drflac_cache_t).sizeof.
321   size_t unalignedByteCount;
322 
323   // The content of the unaligned bytes.
324   drflac_cache_t unalignedCache;
325 
326   // The index of the next valid cache line in the "L2" cache.
327   size_t nextL2Line;
328 
329   // The number of bits that have been consumed by the cache. This is used to determine how many valid bits are remaining.
330   size_t consumedBits;
331 
332   // The cached data which was most recently read from the client. There are two levels of cache. Data flows as such:
333   // Client . L2 . L1. The L2 . L1 movement is aligned and runs on a fast path in just a few instructions.
334   drflac_cache_t[DR_FLAC_BUFFER_SIZE/(drflac_cache_t).sizeof] cacheL2;
335   drflac_cache_t cache;
336 }
337 
338 struct drflac_subframe {
339   // The type of the subframe: SUBFRAME_CONSTANT, SUBFRAME_VERBATIM, SUBFRAME_FIXED or SUBFRAME_LPC.
340   ubyte subframeType;
341 
342   // The number of wasted bits per sample as specified by the sub-frame header.
343   ubyte wastedBitsPerSample;
344 
345   // The order to use for the prediction stage for SUBFRAME_FIXED and SUBFRAME_LPC.
346   ubyte lpcOrder;
347 
348   // The number of bits per sample for this subframe. This is not always equal to the current frame's bit per sample because
349   // an extra bit is required for side channels when interchannel decorrelation is being used.
350   uint bitsPerSample;
351 
352   // A pointer to the buffer containing the decoded samples in the subframe. This pointer is an offset from drflac::pExtraData, or
353   // null if the heap is not being used. Note that it's a signed 32-bit integer for each value.
354   int* pDecodedSamples;
355 }
356 
357 struct drflac_frame_header {
358   // If the stream uses variable block sizes, this will be set to the index of the first sample. If fixed block sizes are used, this will
359   // always be set to 0.
360   ulong sampleNumber;
361 
362   // If the stream uses fixed block sizes, this will be set to the frame number. If variable block sizes are used, this will always be 0.
363   uint frameNumber;
364 
365   // The sample rate of this frame.
366   uint sampleRate;
367 
368   // The number of samples in each sub-frame within this frame.
369   ushort blockSize;
370 
371   // The channel assignment of this frame. This is not always set to the channel count. If interchannel decorrelation is being used this
372   // will be set to DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE, DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE or DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE.
373   ubyte channelAssignment;
374 
375   // The number of bits per sample within this frame.
376   ubyte bitsPerSample;
377 
378   // The frame's CRC. This is set, but unused at the moment.
379   ubyte crc8;
380 }
381 
382 struct drflac_frame {
383   // The header.
384   drflac_frame_header header;
385 
386   // The number of samples left to be read in this frame. This is initially set to the block size multiplied by the channel count. As samples
387   // are read, this will be decremented. When it reaches 0, the decoder will see this frame as fully consumed and load the next frame.
388   uint samplesRemaining;
389 
390   // The list of sub-frames within the frame. There is one sub-frame for each channel, and there's a maximum of 8 channels.
391   drflac_subframe[8] subframes;
392 }
393 
394 struct drflac {
395   // The function to call when a metadata block is read.
396   //drflac_meta_proc onMeta;
397 
398   // The user data posted to the metadata callback function.
399   //void* pUserDataMD;
400 
401 
402   // The sample rate. Will be set to something like 44100.
403   uint sampleRate;
404 
405   // The number of channels. This will be set to 1 for monaural streams, 2 for stereo, etc. Maximum 8. This is set based on the
406   // value specified in the STREAMINFO block.
407   ubyte channels;
408 
409   // The bits per sample. Will be set to somthing like 16, 24, etc.
410   ubyte bitsPerSample;
411 
412   // The maximum block size, in samples. This number represents the number of samples in each channel (not combined).
413   ushort maxBlockSize;
414 
415   // The total number of samples making up the stream. This includes every channel. For example, if the stream has 2 channels,
416   // with each channel having a total of 4096, this value will be set to 2*4096 = 8192. Can be 0 in which case it's still a
417   // valid stream, but just means the total sample count is unknown. Likely the case with streams like internet radio.
418   ulong totalSampleCount;
419 
420 
421   // The container type. This is set based on whether or not the decoder was opened from a native or Ogg stream.
422   drflac_container container;
423 
424 
425   // The position of the seektable in the file.
426   ulong seektablePos;
427 
428   // The size of the seektable.
429   uint seektableSize;
430 
431 
432   // Information about the frame the decoder is currently sitting on.
433   drflac_frame currentFrame;
434 
435   // The position of the first frame in the stream. This is only ever used for seeking.
436   ulong firstFramePos;
437 
438 
439   // A hack to avoid a malloc() when opening a decoder with drflac_open_memory().
440   drflac__memory_stream memoryStream;
441 
442 
443   // A pointer to the decoded sample data. This is an offset of pExtraData.
444   int* pDecodedSamples;
445 
446 
447   // The bit streamer. The raw FLAC data is fed through this object.
448   drflac_bs bs;
449 
450   // Variable length extra data. We attach this to the end of the object so we avoid unnecessary mallocs.
451   ubyte[1] pExtraData;
452 }
453 
454 
455 // Opens a FLAC decoder.
456 //
457 // onRead    [in]           The function to call when data needs to be read from the client.
458 // onSeek    [in]           The function to call when the read position of the client data needs to move.
459 // pUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek.
460 //
461 // Returns a pointer to an object representing the decoder.
462 //
463 // Close the decoder with drflac_close().
464 //
465 // This function will automatically detect whether or not you are attempting to open a native or Ogg encapsulated
466 // FLAC, both of which should work seamlessly without any manual intervention. Ogg encapsulation also works with
467 // multiplexed streams which basically means it can play FLAC encoded audio tracks in videos.
468 //
469 // This is the lowest level function for opening a FLAC stream. You can also use drflac_open_file() and drflac_open_memory()
470 // to open the stream from a file or from a block of memory respectively.
471 //
472 // The STREAMINFO block must be present for this to succeed.
473 //
474 // See also: drflac_open_file(), drflac_open_memory(), drflac_open_with_metadata(), drflac_close()
475 //drflac* drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData);
476 
477 // Opens a FLAC decoder and notifies the caller of the metadata chunks (album art, etc.).
478 //
479 // onRead    [in]           The function to call when data needs to be read from the client.
480 // onSeek    [in]           The function to call when the read position of the client data needs to move.
481 // onMeta    [in]           The function to call for every metadata block.
482 // pUserData [in, optional] A pointer to application defined data that will be passed to onRead, onSeek and onMeta.
483 //
484 // Returns a pointer to an object representing the decoder.
485 //
486 // Close the decoder with drflac_close().
487 //
488 // This is slower that drflac_open(), so avoid this one if you don't need metadata. Internally, this will do a malloc()
489 // and free() for every metadata block except for STREAMINFO and PADDING blocks.
490 //
491 // The caller is notified of the metadata via the onMeta callback. All metadata blocks withh be handled before the function
492 // returns.
493 //
494 // See also: drflac_open_file_with_metadata(), drflac_open_memory_with_metadata(), drflac_open(), drflac_close()
495 //drflac* drflac_open_with_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData);
496 
497 // Closes the given FLAC decoder.
498 //
499 // pFlac [in] The decoder to close.
500 //
501 // This will destroy the decoder object.
502 //void drflac_close(drflac* pFlac);
503 
504 
505 // Reads sample data from the given FLAC decoder, output as interleaved signed 32-bit PCM.
506 //
507 // pFlac         [in]            The decoder.
508 // samplesToRead [in]            The number of samples to read.
509 // pBufferOut    [out, optional] A pointer to the buffer that will receive the decoded samples.
510 //
511 // Returns the number of samples actually read.
512 //
513 // pBufferOut can be null, in which case the call will act as a seek, and the return value will be the number of samples
514 // seeked.
515 //ulong drflac_read_s32(drflac* pFlac, ulong samplesToRead, int* pBufferOut);
516 
517 // Seeks to the sample at the given index.
518 //
519 // pFlac       [in] The decoder.
520 // sampleIndex [in] The index of the sample to seek to. See notes below.
521 //
522 // Returns true if successful; false otherwise.
523 //
524 // The sample index is based on interleaving. In a stereo stream, for example, the sample at index 0 is the first sample
525 // in the left channel; the sample at index 1 is the first sample on the right channel, and so on.
526 //
527 // When seeking, you will likely want to ensure it's rounded to a multiple of the channel count. You can do this with
528 // something like drflac_seek_to_sample(pFlac, (mySampleIndex + (mySampleIndex % pFlac.channels)))
529 //bool drflac_seek_to_sample(drflac* pFlac, ulong sampleIndex);
530 
531 
532 // Opens a FLAC decoder from the file at the given path.
533 //
534 // filename [in] The path of the file to open, either absolute or relative to the current directory.
535 //
536 // Returns a pointer to an object representing the decoder.
537 //
538 // Close the decoder with drflac_close().
539 //
540 // This will hold a handle to the file until the decoder is closed with drflac_close(). Some platforms will restrict the
541 // number of files a process can have open at any given time, so keep this mind if you have many decoders open at the
542 // same time.
543 //
544 // See also: drflac_open(), drflac_open_file_with_metadata(), drflac_close()
545 //drflac* drflac_open_file(const(char)[] filename);
546 
547 // Opens a FLAC decoder from the file at the given path and notifies the caller of the metadata chunks (album art, etc.)
548 //
549 // Look at the documentation for drflac_open_with_metadata() for more information on how metadata is handled.
550 //drflac* drflac_open_file_with_metadata(const(char)[] filename, drflac_meta_proc onMeta, void* pUserData);
551 
552 // Opens a FLAC decoder from a pre-allocated block of memory
553 //
554 // This does not create a copy of the data. It is up to the application to ensure the buffer remains valid for
555 // the lifetime of the decoder.
556 //drflac* drflac_open_memory(const void* data, size_t dataSize);
557 
558 // Opens a FLAC decoder from a pre-allocated block of memory and notifies the caller of the metadata chunks (album art, etc.)
559 //
560 // Look at the documentation for drflac_open_with_metadata() for more information on how metadata is handled.
561 //drflac* drflac_open_memory_with_metadata(const void* data, size_t dataSize, drflac_meta_proc onMeta, void* pUserData);
562 
563 
564 
565 //// High Level APIs ////
566 
567 // Opens a FLAC stream from the given callbacks and fully decodes it in a single operation. The return value is a
568 // pointer to the sample data as interleaved signed 32-bit PCM. The returned data must be freed with drflac_free().
569 //
570 // Sometimes a FLAC file won't keep track of the total sample count. In this situation the function will continuously
571 // read samples into a dynamically sized buffer on the heap until no samples are left.
572 //
573 // Do not call this function on a broadcast type of stream (like internet radio streams and whatnot).
574 //int* drflac_open_and_decode(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, uint* sampleRate, uint* channels, ulong* totalSampleCount);
575 
576 //#ifndef DR_FLAC_NO_STDIO
577 // Same as drflac_open_and_decode() except opens the decoder from a file.
578 //int* drflac_open_and_decode_file(const(char)[] filename, uint* sampleRate, uint* channels, ulong* totalSampleCount);
579 //#endif
580 
581 // Same as drflac_open_and_decode() except opens the decoder from a block of memory.
582 //int* drflac_open_and_decode_memory(const void* data, size_t dataSize, uint* sampleRate, uint* channels, ulong* totalSampleCount);
583 
584 // Frees data returned by drflac_open_and_decode_*().
585 //void drflac_free(void* pSampleDataReturnedByOpenAndDecode);
586 
587 
588 // Structure representing an iterator for vorbis comments in a VORBIS_COMMENT metadata block.
589 struct drflac_vorbis_comment_iterator {
590   uint countRemaining;
591   const(char)* pRunningData;
592 }
593 
594 // Initializes a vorbis comment iterator. This can be used for iterating over the vorbis comments in a VORBIS_COMMENT
595 // metadata block.
596 //void drflac_init_vorbis_comment_iterator(drflac_vorbis_comment_iterator* pIter, uint commentCount, const(char)* pComments);
597 
598 // Goes to the next vorbis comment in the given iterator. If null is returned it means there are no more comments. The
599 // returned string is NOT null terminated.
600 //const(char)* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, uint* pCommentLengthOut);
601 
602 
603 ///////////////////////////////////////////////////////////////////////////////
604 //
605 // IMPLEMENTATION
606 //
607 ///////////////////////////////////////////////////////////////////////////////
608 private: nothrow {
609 enum DRFLAC_SUBFRAME_CONSTANT = 0;
610 enum DRFLAC_SUBFRAME_VERBATIM = 1;
611 enum DRFLAC_SUBFRAME_FIXED = 8;
612 enum DRFLAC_SUBFRAME_LPC = 32;
613 enum DRFLAC_SUBFRAME_RESERVED = 255;
614 
615 enum DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE = 0;
616 enum DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2 = 1;
617 
618 enum DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT = 0;
619 enum DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE = 8;
620 enum DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE = 9;
621 enum DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE = 10;
622 
623 
624 //// Endian Management ////
625 version(LittleEndian) enum drflac__is_little_endian = true; else enum drflac__is_little_endian = false;
626 
627 ushort drflac__be2host_16 (ushort n) pure nothrow @safe @nogc {
628   static if (__VERSION__ > 2067) pragma(inline, true);
629   version(LittleEndian) {
630     return cast(ushort)((n>>8)|((n&0xff)<<8));
631   } else {
632     return n;
633   }
634 }
635 
636 uint drflac__be2host_32 (uint n) pure nothrow @safe @nogc {
637   static if (__VERSION__ > 2067) pragma(inline, true);
638   version(LittleEndian) {
639     import core.bitop : bswap;
640     return bswap(n);
641   } else {
642     return n;
643   }
644 }
645 
646 ulong drflac__be2host_64 (ulong n) pure nothrow @safe @nogc {
647   static if (__VERSION__ > 2067) pragma(inline, true);
648   version(LittleEndian) {
649     import core.bitop : bswap;
650     version(GNU) {
651       auto n0 = cast(ulong)bswap(cast(uint)n);
652       auto n1 = cast(ulong)bswap(cast(uint)(n>>32));
653       return (n0<<32)|n1;
654     } else {
655       return bswap(n);
656     }
657   } else {
658     return n;
659   }
660 }
661 
662 
663 uint drflac__le2host_32 (uint n) pure nothrow @safe @nogc {
664   static if (__VERSION__ > 2067) pragma(inline, true);
665   version(LittleEndian) {
666     return n;
667   } else {
668     import core.bitop : bswap;
669     return bswap(n);
670   }
671 }
672 
673 
674 version(DRFLAC_64BIT) {
675   alias drflac__be2host__cache_line = drflac__be2host_64;
676 } else {
677   alias drflac__be2host__cache_line = drflac__be2host_32;
678 }
679 
680 // BIT READING ATTEMPT #2
681 //
682 // This uses a 32- or 64-bit bit-shifted cache - as bits are read, the cache is shifted such that the first valid bit is sitting
683 // on the most significant bit. It uses the notion of an L1 and L2 cache (borrowed from CPU architecture), where the L1 cache
684 // is a 32- or 64-bit unsigned integer (depending on whether or not a 32- or 64-bit build is being compiled) and the L2 is an
685 // array of "cache lines", with each cache line being the same size as the L1. The L2 is a buffer of about 4KB and is where data
686 // from onRead() is read into.
687 enum DRFLAC_CACHE_L1_SIZE_BYTES(string bs) = "((("~bs~").cache).sizeof)";
688 enum DRFLAC_CACHE_L1_SIZE_BITS(string bs) = "((("~bs~").cache).sizeof*8)";
689 enum DRFLAC_CACHE_L1_BITS_REMAINING(string bs) = "("~DRFLAC_CACHE_L1_SIZE_BITS!(bs)~"-(("~bs~").consumedBits))";
690 version(DRFLAC_64BIT) {
691   enum DRFLAC_CACHE_L1_SELECTION_MASK(string _bitCount) = "(~((cast(ulong)-1L)>>("~_bitCount~")))";
692 } else {
693   enum DRFLAC_CACHE_L1_SELECTION_MASK(string _bitCount) = "(~((cast(uint)-1)>>("~_bitCount~")))";
694 }
695 enum DRFLAC_CACHE_L1_SELECTION_SHIFT(string bs, string _bitCount) = "("~DRFLAC_CACHE_L1_SIZE_BITS!bs~"-("~_bitCount~"))";
696 enum DRFLAC_CACHE_L1_SELECT(string bs, string _bitCount) = "((("~bs~").cache)&"~DRFLAC_CACHE_L1_SELECTION_MASK!_bitCount~")";
697 enum DRFLAC_CACHE_L1_SELECT_AND_SHIFT(string bs, string _bitCount) = "("~DRFLAC_CACHE_L1_SELECT!(bs, _bitCount)~">>"~DRFLAC_CACHE_L1_SELECTION_SHIFT!(bs, _bitCount)~")";
698 enum DRFLAC_CACHE_L2_SIZE_BYTES(string bs) = "((("~bs~").cacheL2).sizeof)";
699 enum DRFLAC_CACHE_L2_LINE_COUNT(string bs) = "("~DRFLAC_CACHE_L2_SIZE_BYTES!bs~"/(("~bs~").cacheL2[0]).sizeof)";
700 enum DRFLAC_CACHE_L2_LINES_REMAINING(string bs) = "("~DRFLAC_CACHE_L2_LINE_COUNT!bs~"-("~bs~").nextL2Line)";
701 
702 bool drflac__reload_l1_cache_from_l2 (drflac_bs* bs) {
703   // Fast path. Try loading straight from L2.
704   if (bs.nextL2Line < mixin(DRFLAC_CACHE_L2_LINE_COUNT!"bs")) {
705     bs.cache = bs.cacheL2.ptr[bs.nextL2Line++];
706     return true;
707   }
708 
709   // If we get here it means we've run out of data in the L2 cache. We'll need to fetch more from the client, if there's any left.
710   if (bs.unalignedByteCount > 0) return false; // If we have any unaligned bytes it means there's no more aligned bytes left in the client.
711 
712   size_t bytesRead = bs.rs.read(bs.cacheL2.ptr, mixin(DRFLAC_CACHE_L2_SIZE_BYTES!"bs"));
713 
714   bs.nextL2Line = 0;
715   if (bytesRead == mixin(DRFLAC_CACHE_L2_SIZE_BYTES!"bs")) {
716     bs.cache = bs.cacheL2.ptr[bs.nextL2Line++];
717     return true;
718   }
719 
720   // If we get here it means we were unable to retrieve enough data to fill the entire L2 cache. It probably
721   // means we've just reached the end of the file. We need to move the valid data down to the end of the buffer
722   // and adjust the index of the next line accordingly. Also keep in mind that the L2 cache must be aligned to
723   // the size of the L1 so we'll need to seek backwards by any misaligned bytes.
724   size_t alignedL1LineCount = bytesRead/mixin(DRFLAC_CACHE_L1_SIZE_BYTES!"bs");
725 
726   // We need to keep track of any unaligned bytes for later use.
727   bs.unalignedByteCount = bytesRead-(alignedL1LineCount*mixin(DRFLAC_CACHE_L1_SIZE_BYTES!"bs"));
728   if (bs.unalignedByteCount > 0) {
729       bs.unalignedCache = bs.cacheL2.ptr[alignedL1LineCount];
730   }
731 
732   if (alignedL1LineCount > 0) {
733     size_t offset = mixin(DRFLAC_CACHE_L2_LINE_COUNT!"bs")-alignedL1LineCount;
734     for (size_t i = alignedL1LineCount; i > 0; --i) bs.cacheL2.ptr[i-1+offset] = bs.cacheL2.ptr[i-1];
735     bs.nextL2Line = offset;
736     bs.cache = bs.cacheL2.ptr[bs.nextL2Line++];
737     return true;
738   } else {
739     // If we get into this branch it means we weren't able to load any L1-aligned data.
740     bs.nextL2Line = mixin(DRFLAC_CACHE_L2_LINE_COUNT!"bs");
741     return false;
742   }
743 }
744 
745 bool drflac__reload_cache (drflac_bs* bs) {
746   // Fast path. Try just moving the next value in the L2 cache to the L1 cache.
747   if (drflac__reload_l1_cache_from_l2(bs)) {
748     bs.cache = drflac__be2host__cache_line(bs.cache);
749     bs.consumedBits = 0;
750     return true;
751   }
752 
753   // Slow path.
754 
755   // If we get here it means we have failed to load the L1 cache from the L2. Likely we've just reached the end of the stream and the last
756   // few bytes did not meet the alignment requirements for the L2 cache. In this case we need to fall back to a slower path and read the
757   // data from the unaligned cache.
758   size_t bytesRead = bs.unalignedByteCount;
759   if (bytesRead == 0) return false;
760 
761   assert(bytesRead < mixin(DRFLAC_CACHE_L1_SIZE_BYTES!"bs"));
762   bs.consumedBits = (mixin(DRFLAC_CACHE_L1_SIZE_BYTES!"bs")-bytesRead)*8;
763 
764   bs.cache = drflac__be2host__cache_line(bs.unalignedCache);
765   //bs.cache &= DRFLAC_CACHE_L1_SELECTION_MASK(DRFLAC_CACHE_L1_SIZE_BITS(bs)-bs.consumedBits);
766   bs.cache &= mixin(DRFLAC_CACHE_L1_SELECTION_MASK!(DRFLAC_CACHE_L1_SIZE_BITS!"bs"~"-bs.consumedBits"));
767     // <-- Make sure the consumed bits are always set to zero. Other parts of the library depend on this property.
768   bs.unalignedByteCount = 0; // <-- At this point the unaligned bytes have been moved into the cache and we thus have no more unaligned bytes.
769   return true;
770 }
771 
772 void drflac__reset_cache (drflac_bs* bs) {
773   bs.nextL2Line   = mixin(DRFLAC_CACHE_L2_LINE_COUNT!"bs");  // <-- This clears the L2 cache.
774   bs.consumedBits = mixin(DRFLAC_CACHE_L1_SIZE_BITS!"bs");   // <-- This clears the L1 cache.
775   bs.cache = 0;
776   bs.unalignedByteCount = 0; // <-- This clears the trailing unaligned bytes.
777   bs.unalignedCache = 0;
778 }
779 
780 bool drflac__seek_bits (drflac_bs* bs, size_t bitsToSeek) {
781   if (bitsToSeek <= mixin(DRFLAC_CACHE_L1_BITS_REMAINING!"bs")) {
782     bs.consumedBits += bitsToSeek;
783     bs.cache <<= bitsToSeek;
784     return true;
785   } else {
786     // It straddles the cached data. This function isn't called too frequently so I'm favouring simplicity here.
787     bitsToSeek -= mixin(DRFLAC_CACHE_L1_BITS_REMAINING!"bs");
788     bs.consumedBits += mixin(DRFLAC_CACHE_L1_BITS_REMAINING!"bs");
789     bs.cache = 0;
790 
791     size_t wholeBytesRemainingToSeek = bitsToSeek/8;
792     if (wholeBytesRemainingToSeek > 0) {
793       // The next bytes to seek will be located in the L2 cache. The problem is that the L2 cache is not byte aligned,
794       // but rather DRFLAC_CACHE_L1_SIZE_BYTES aligned (usually 4 or 8). If, for example, the number of bytes to seek is
795       // 3, we'll need to handle it in a special way.
796       size_t wholeCacheLinesRemaining = wholeBytesRemainingToSeek/mixin(DRFLAC_CACHE_L1_SIZE_BYTES!"bs");
797       if (wholeCacheLinesRemaining < mixin(DRFLAC_CACHE_L2_LINES_REMAINING!"bs")) {
798         wholeBytesRemainingToSeek -= wholeCacheLinesRemaining*mixin(DRFLAC_CACHE_L1_SIZE_BYTES!"bs");
799         bitsToSeek -= wholeCacheLinesRemaining*mixin(DRFLAC_CACHE_L1_SIZE_BITS!"bs");
800         bs.nextL2Line += wholeCacheLinesRemaining;
801       } else {
802         wholeBytesRemainingToSeek -= mixin(DRFLAC_CACHE_L2_LINES_REMAINING!"bs")*mixin(DRFLAC_CACHE_L1_SIZE_BYTES!"bs");
803         bitsToSeek -= mixin(DRFLAC_CACHE_L2_LINES_REMAINING!"bs")*mixin(DRFLAC_CACHE_L1_SIZE_BITS!"bs");
804         bs.nextL2Line += mixin(DRFLAC_CACHE_L2_LINES_REMAINING!"bs");
805         // Note that we only seek on the client side if it's got any data left to seek. We can know this by checking
806         // if we have any unaligned data which can be determined with bs->unalignedByteCount.
807         if (wholeBytesRemainingToSeek > 0 && bs.unalignedByteCount == 0) {
808           if (!bs.rs.seek(cast(int)wholeBytesRemainingToSeek, drflac_seek_origin_current)) return false;
809           bitsToSeek -= wholeBytesRemainingToSeek*8;
810         }
811       }
812     }
813     if (bitsToSeek > 0) {
814       if (!drflac__reload_cache(bs)) return false;
815       return drflac__seek_bits(bs, bitsToSeek);
816     }
817     return true;
818   }
819 }
820 
821 bool drflac__read_uint32 (drflac_bs* bs, uint bitCount, uint* pResultOut) {
822   assert(bs !is null);
823   assert(pResultOut !is null);
824   assert(bitCount > 0);
825   assert(bitCount <= 32);
826 
827   if (bs.consumedBits == mixin(DRFLAC_CACHE_L1_SIZE_BITS!"bs")) {
828     if (!drflac__reload_cache(bs)) return false;
829   }
830 
831   if (bitCount <= mixin(DRFLAC_CACHE_L1_BITS_REMAINING!"bs")) {
832     if (bitCount < mixin(DRFLAC_CACHE_L1_SIZE_BITS!"bs")) {
833       *pResultOut = cast(uint)mixin(DRFLAC_CACHE_L1_SELECT_AND_SHIFT!("bs", "bitCount")); //k8
834       bs.consumedBits += bitCount;
835       bs.cache <<= bitCount;
836     } else {
837       *pResultOut = cast(uint)bs.cache;
838       bs.consumedBits = mixin(DRFLAC_CACHE_L1_SIZE_BITS!"bs");
839       bs.cache = 0;
840     }
841     return true;
842   } else {
843     // It straddles the cached data. It will never cover more than the next chunk. We just read the number in two parts and combine them.
844     size_t bitCountHi = mixin(DRFLAC_CACHE_L1_BITS_REMAINING!"bs");
845     size_t bitCountLo = bitCount-bitCountHi;
846     uint resultHi = cast(uint)mixin(DRFLAC_CACHE_L1_SELECT_AND_SHIFT!("bs", "bitCountHi")); //k8
847     if (!drflac__reload_cache(bs)) return false;
848     *pResultOut = cast(uint)((resultHi<<bitCountLo)|mixin(DRFLAC_CACHE_L1_SELECT_AND_SHIFT!("bs", "bitCountLo"))); //k8
849     bs.consumedBits += bitCountLo;
850     bs.cache <<= bitCountLo;
851     return true;
852   }
853 }
854 
855 bool drflac__read_int32 (drflac_bs* bs, uint bitCount, int* pResult) {
856   assert(bs !is null);
857   assert(pResult !is null);
858   assert(bitCount > 0);
859   assert(bitCount <= 32);
860 
861   uint result;
862   if (!drflac__read_uint32(bs, bitCount, &result)) return false;
863 
864   uint signbit = ((result>>(bitCount-1))&0x01);
865   result |= (~signbit+1)<<bitCount;
866 
867   *pResult = cast(int)result;
868   return true;
869 }
870 
871 bool drflac__read_uint64 (drflac_bs* bs, uint bitCount, ulong* pResultOut) {
872   assert(bitCount <= 64);
873   assert(bitCount >  32);
874 
875   uint resultHi;
876   if (!drflac__read_uint32(bs, bitCount-32, &resultHi)) return false;
877 
878   uint resultLo;
879   if (!drflac__read_uint32(bs, 32, &resultLo)) return false;
880 
881   *pResultOut = ((cast(ulong)resultHi)<<32)|(cast(ulong)resultLo);
882   return true;
883 }
884 
885 bool drflac__read_uint16 (drflac_bs* bs, uint bitCount, ushort* pResult) {
886   assert(bs !is null);
887   assert(pResult !is null);
888   assert(bitCount > 0);
889   assert(bitCount <= 16);
890 
891   uint result;
892   if (!drflac__read_uint32(bs, bitCount, &result)) return false;
893 
894   *pResult = cast(ushort)result;
895   return true;
896 }
897 
898 bool drflac__read_int16 (drflac_bs* bs, uint bitCount, short* pResult) {
899   assert(bs !is null);
900   assert(pResult !is null);
901   assert(bitCount > 0);
902   assert(bitCount <= 16);
903 
904   int result;
905   if (!drflac__read_int32(bs, bitCount, &result)) return false;
906 
907   *pResult = cast(short)result;
908   return true;
909 }
910 
911 bool drflac__read_uint8 (drflac_bs* bs, uint bitCount, ubyte* pResult) {
912   assert(bs !is null);
913   assert(pResult !is null);
914   assert(bitCount > 0);
915   assert(bitCount <= 8);
916 
917   uint result;
918   if (!drflac__read_uint32(bs, bitCount, &result)) return false;
919 
920   *pResult = cast(ubyte)result;
921   return true;
922 }
923 
924 bool drflac__read_int8 (drflac_bs* bs, uint bitCount, byte* pResult) {
925   assert(bs !is null);
926   assert(pResult !is null);
927   assert(bitCount > 0);
928   assert(bitCount <= 8);
929 
930   int result;
931   if (!drflac__read_int32(bs, bitCount, &result)) return false;
932 
933   *pResult = cast(byte)result;
934   return true;
935 }
936 
937 
938 bool drflac__seek_past_next_set_bit (drflac_bs* bs, uint* pOffsetOut) {
939   uint zeroCounter = 0;
940   while (bs.cache == 0) {
941     zeroCounter += cast(uint)mixin(DRFLAC_CACHE_L1_BITS_REMAINING!"bs");
942     if (!drflac__reload_cache(bs)) return false;
943   }
944 
945   // At this point the cache should not be zero, in which case we know the first set bit should be somewhere in here. There is
946   // no need for us to perform any cache reloading logic here which should make things much faster.
947   assert(bs.cache != 0);
948 
949   static immutable uint[16] bitOffsetTable = [
950     0,
951     4,
952     3, 3,
953     2, 2, 2, 2,
954     1, 1, 1, 1, 1, 1, 1, 1
955   ];
956 
957   uint setBitOffsetPlus1 = bitOffsetTable.ptr[mixin(DRFLAC_CACHE_L1_SELECT_AND_SHIFT!("bs", "4"))];
958   if (setBitOffsetPlus1 == 0) {
959     if (bs.cache == 1) {
960       setBitOffsetPlus1 = mixin(DRFLAC_CACHE_L1_SIZE_BITS!"bs");
961     } else {
962       setBitOffsetPlus1 = 5;
963       for (;;) {
964         if ((bs.cache&mixin(DRFLAC_CACHE_L1_SELECT!("bs", "setBitOffsetPlus1")))) break;
965         setBitOffsetPlus1 += 1;
966       }
967     }
968   }
969 
970   bs.consumedBits += setBitOffsetPlus1;
971   bs.cache <<= setBitOffsetPlus1;
972 
973   *pOffsetOut = zeroCounter+setBitOffsetPlus1-1;
974   return true;
975 }
976 
977 
978 bool drflac__seek_to_byte (drflac_bs* bs, ulong offsetFromStart) {
979   assert(bs !is null);
980   assert(offsetFromStart > 0);
981 
982   // Seeking from the start is not quite as trivial as it sounds because the onSeek callback takes a signed 32-bit integer (which
983   // is intentional because it simplifies the implementation of the onSeek callbacks), however offsetFromStart is unsigned 64-bit.
984   // To resolve we just need to do an initial seek from the start, and then a series of offset seeks to make up the remainder.
985   if (offsetFromStart > 0x7FFFFFFF) {
986     ulong bytesRemaining = offsetFromStart;
987     if (!bs.rs.seek(0x7FFFFFFF, drflac_seek_origin_start)) return false;
988     bytesRemaining -= 0x7FFFFFFF;
989     while (bytesRemaining > 0x7FFFFFFF) {
990       if (!bs.rs.seek(0x7FFFFFFF, drflac_seek_origin_current)) return false;
991       bytesRemaining -= 0x7FFFFFFF;
992     }
993     if (bytesRemaining > 0) {
994       if (!bs.rs.seek(cast(int)bytesRemaining, drflac_seek_origin_current)) return false;
995     }
996   } else {
997     if (!bs.rs.seek(cast(int)offsetFromStart, drflac_seek_origin_start)) return false;
998   }
999   // The cache should be reset to force a reload of fresh data from the client.
1000   drflac__reset_cache(bs);
1001   return true;
1002 }
1003 
1004 
1005 bool drflac__read_utf8_coded_number (drflac_bs* bs, ulong* pNumberOut) {
1006   assert(bs !is null);
1007   assert(pNumberOut !is null);
1008 
1009   ubyte[7] utf8 = 0;
1010   if (!drflac__read_uint8(bs, 8, utf8.ptr)) {
1011     *pNumberOut = 0;
1012     return false;
1013   }
1014 
1015   if ((utf8.ptr[0]&0x80) == 0) {
1016     *pNumberOut = utf8.ptr[0];
1017     return true;
1018   }
1019 
1020   int byteCount = 1;
1021        if ((utf8.ptr[0]&0xE0) == 0xC0) byteCount = 2;
1022   else if ((utf8.ptr[0]&0xF0) == 0xE0) byteCount = 3;
1023   else if ((utf8.ptr[0]&0xF8) == 0xF0) byteCount = 4;
1024   else if ((utf8.ptr[0]&0xFC) == 0xF8) byteCount = 5;
1025   else if ((utf8.ptr[0]&0xFE) == 0xFC) byteCount = 6;
1026   else if ((utf8.ptr[0]&0xFF) == 0xFE) byteCount = 7;
1027   else { *pNumberOut = 0; return false; } // Bad UTF-8 encoding.
1028 
1029   // Read extra bytes.
1030   assert(byteCount > 1);
1031 
1032   ulong result = cast(ulong)(utf8.ptr[0]&(0xFF>>(byteCount+1)));
1033   for (int i = 1; i < byteCount; ++i) {
1034     if (!drflac__read_uint8(bs, 8, utf8.ptr+i)) {
1035       *pNumberOut = 0;
1036       return false;
1037     }
1038     result = (result<<6)|(utf8.ptr[i]&0x3F);
1039   }
1040 
1041   *pNumberOut = result;
1042   return true;
1043 }
1044 
1045 
1046 bool drflac__read_and_seek_rice (drflac_bs* bs, ubyte m) {
1047   uint unused;
1048   if (!drflac__seek_past_next_set_bit(bs, &unused)) return false;
1049   if (m > 0) {
1050     if (!drflac__seek_bits(bs, m)) return false;
1051   }
1052   return true;
1053 }
1054 
1055 
1056 // The next two functions are responsible for calculating the prediction.
1057 //
1058 // When the bits per sample is >16 we need to use 64-bit integer arithmetic because otherwise we'll run out of precision. It's
1059 // safe to assume this will be slower on 32-bit platforms so we use a more optimal solution when the bits per sample is <=16.
1060 int drflac__calculate_prediction_32 (uint order, int shift, const(short)* coefficients, int* pDecodedSamples) {
1061   assert(order <= 32);
1062   int prediction = 0;
1063   switch (order) {
1064     case 32: prediction += coefficients[31]*pDecodedSamples[-32]; goto case;
1065     case 31: prediction += coefficients[30]*pDecodedSamples[-31]; goto case;
1066     case 30: prediction += coefficients[29]*pDecodedSamples[-30]; goto case;
1067     case 29: prediction += coefficients[28]*pDecodedSamples[-29]; goto case;
1068     case 28: prediction += coefficients[27]*pDecodedSamples[-28]; goto case;
1069     case 27: prediction += coefficients[26]*pDecodedSamples[-27]; goto case;
1070     case 26: prediction += coefficients[25]*pDecodedSamples[-26]; goto case;
1071     case 25: prediction += coefficients[24]*pDecodedSamples[-25]; goto case;
1072     case 24: prediction += coefficients[23]*pDecodedSamples[-24]; goto case;
1073     case 23: prediction += coefficients[22]*pDecodedSamples[-23]; goto case;
1074     case 22: prediction += coefficients[21]*pDecodedSamples[-22]; goto case;
1075     case 21: prediction += coefficients[20]*pDecodedSamples[-21]; goto case;
1076     case 20: prediction += coefficients[19]*pDecodedSamples[-20]; goto case;
1077     case 19: prediction += coefficients[18]*pDecodedSamples[-19]; goto case;
1078     case 18: prediction += coefficients[17]*pDecodedSamples[-18]; goto case;
1079     case 17: prediction += coefficients[16]*pDecodedSamples[-17]; goto case;
1080     case 16: prediction += coefficients[15]*pDecodedSamples[-16]; goto case;
1081     case 15: prediction += coefficients[14]*pDecodedSamples[-15]; goto case;
1082     case 14: prediction += coefficients[13]*pDecodedSamples[-14]; goto case;
1083     case 13: prediction += coefficients[12]*pDecodedSamples[-13]; goto case;
1084     case 12: prediction += coefficients[11]*pDecodedSamples[-12]; goto case;
1085     case 11: prediction += coefficients[10]*pDecodedSamples[-11]; goto case;
1086     case 10: prediction += coefficients[ 9]*pDecodedSamples[-10]; goto case;
1087     case  9: prediction += coefficients[ 8]*pDecodedSamples[- 9]; goto case;
1088     case  8: prediction += coefficients[ 7]*pDecodedSamples[- 8]; goto case;
1089     case  7: prediction += coefficients[ 6]*pDecodedSamples[- 7]; goto case;
1090     case  6: prediction += coefficients[ 5]*pDecodedSamples[- 6]; goto case;
1091     case  5: prediction += coefficients[ 4]*pDecodedSamples[- 5]; goto case;
1092     case  4: prediction += coefficients[ 3]*pDecodedSamples[- 4]; goto case;
1093     case  3: prediction += coefficients[ 2]*pDecodedSamples[- 3]; goto case;
1094     case  2: prediction += coefficients[ 1]*pDecodedSamples[- 2]; goto case;
1095     case  1: prediction += coefficients[ 0]*pDecodedSamples[- 1]; goto default;
1096     default:
1097   }
1098   return cast(int)(prediction>>shift);
1099 }
1100 
1101 int drflac__calculate_prediction_64 (uint order, int shift, const(short)* coefficients, int* pDecodedSamples) {
1102   assert(order <= 32);
1103   long prediction = 0;
1104   switch (order) {
1105     case 32: prediction += coefficients[31]*cast(long)pDecodedSamples[-32]; goto case;
1106     case 31: prediction += coefficients[30]*cast(long)pDecodedSamples[-31]; goto case;
1107     case 30: prediction += coefficients[29]*cast(long)pDecodedSamples[-30]; goto case;
1108     case 29: prediction += coefficients[28]*cast(long)pDecodedSamples[-29]; goto case;
1109     case 28: prediction += coefficients[27]*cast(long)pDecodedSamples[-28]; goto case;
1110     case 27: prediction += coefficients[26]*cast(long)pDecodedSamples[-27]; goto case;
1111     case 26: prediction += coefficients[25]*cast(long)pDecodedSamples[-26]; goto case;
1112     case 25: prediction += coefficients[24]*cast(long)pDecodedSamples[-25]; goto case;
1113     case 24: prediction += coefficients[23]*cast(long)pDecodedSamples[-24]; goto case;
1114     case 23: prediction += coefficients[22]*cast(long)pDecodedSamples[-23]; goto case;
1115     case 22: prediction += coefficients[21]*cast(long)pDecodedSamples[-22]; goto case;
1116     case 21: prediction += coefficients[20]*cast(long)pDecodedSamples[-21]; goto case;
1117     case 20: prediction += coefficients[19]*cast(long)pDecodedSamples[-20]; goto case;
1118     case 19: prediction += coefficients[18]*cast(long)pDecodedSamples[-19]; goto case;
1119     case 18: prediction += coefficients[17]*cast(long)pDecodedSamples[-18]; goto case;
1120     case 17: prediction += coefficients[16]*cast(long)pDecodedSamples[-17]; goto case;
1121     case 16: prediction += coefficients[15]*cast(long)pDecodedSamples[-16]; goto case;
1122     case 15: prediction += coefficients[14]*cast(long)pDecodedSamples[-15]; goto case;
1123     case 14: prediction += coefficients[13]*cast(long)pDecodedSamples[-14]; goto case;
1124     case 13: prediction += coefficients[12]*cast(long)pDecodedSamples[-13]; goto case;
1125     case 12: prediction += coefficients[11]*cast(long)pDecodedSamples[-12]; goto case;
1126     case 11: prediction += coefficients[10]*cast(long)pDecodedSamples[-11]; goto case;
1127     case 10: prediction += coefficients[ 9]*cast(long)pDecodedSamples[-10]; goto case;
1128     case  9: prediction += coefficients[ 8]*cast(long)pDecodedSamples[- 9]; goto case;
1129     case  8: prediction += coefficients[ 7]*cast(long)pDecodedSamples[- 8]; goto case;
1130     case  7: prediction += coefficients[ 6]*cast(long)pDecodedSamples[- 7]; goto case;
1131     case  6: prediction += coefficients[ 5]*cast(long)pDecodedSamples[- 6]; goto case;
1132     case  5: prediction += coefficients[ 4]*cast(long)pDecodedSamples[- 5]; goto case;
1133     case  4: prediction += coefficients[ 3]*cast(long)pDecodedSamples[- 4]; goto case;
1134     case  3: prediction += coefficients[ 2]*cast(long)pDecodedSamples[- 3]; goto case;
1135     case  2: prediction += coefficients[ 1]*cast(long)pDecodedSamples[- 2]; goto case;
1136     case  1: prediction += coefficients[ 0]*cast(long)pDecodedSamples[- 1]; goto default;
1137     default:
1138   }
1139   return cast(int)(prediction>>shift);
1140 }
1141 
1142 
1143 // Reads and decodes a string of residual values as Rice codes. The decoder should be sitting on the first bit of the Rice codes.
1144 //
1145 // This is the most frequently called function in the library. It does both the Rice decoding and the prediction in a single loop
1146 // iteration. The prediction is done at the end, and there's an annoying branch I'd like to avoid so the main function is defined
1147 // as a #define - sue me!
1148 //#define DRFLAC__DECODE_SAMPLES_WITH_RESIDULE__RICE__PROC(funcName, predictionFunc)
1149 enum DRFLAC__DECODE_SAMPLES_WITH_RESIDULE__RICE__PROC(string funcName, string predictionFunc) =
1150 "static bool "~funcName~" (drflac_bs* bs, uint count, ubyte riceParam, uint order, int shift, const(short)* coefficients, int* pSamplesOut) {\n"~
1151 "  assert(bs !is null);\n"~
1152 "  assert(count > 0);\n"~
1153 "  assert(pSamplesOut !is null);\n"~
1154 "\n"~
1155 "  static immutable uint[16] bitOffsetTable = [\n"~
1156 "    0,\n"~
1157 "    4,\n"~
1158 "    3, 3,\n"~
1159 "    2, 2, 2, 2,\n"~
1160 "    1, 1, 1, 1, 1, 1, 1, 1\n"~
1161 "  ];\n"~
1162 "\n"~
1163 "  drflac_cache_t riceParamMask = cast(drflac_cache_t)("~DRFLAC_CACHE_L1_SELECTION_MASK!"riceParam"~");\n"~
1164 "  drflac_cache_t resultHiShift = cast(drflac_cache_t)("~DRFLAC_CACHE_L1_SIZE_BITS!"bs"~"-riceParam);\n"~
1165 "\n"~
1166 "  for (int i = 0; i < cast(int)count; ++i) {\n"~
1167 "    uint zeroCounter = 0;\n"~
1168 "    while (bs.cache == 0) {\n"~
1169 "      zeroCounter += cast(uint)"~DRFLAC_CACHE_L1_BITS_REMAINING!"bs"~";\n"~
1170 "      if (!drflac__reload_cache(bs)) return false;\n"~
1171 "    }\n"~
1172 "\n"~
1173 "    /* At this point the cache should not be zero, in which case we know the first set bit should be somewhere in here. There is\n"~
1174 "       no need for us to perform any cache reloading logic here which should make things much faster. */\n"~
1175 "    assert(bs.cache != 0);\n"~
1176 "    uint decodedRice;\n"~
1177 "\n"~
1178 "    uint setBitOffsetPlus1 = bitOffsetTable.ptr["~DRFLAC_CACHE_L1_SELECT_AND_SHIFT!("bs", "4")~"];\n"~
1179 "    if (setBitOffsetPlus1 > 0) {\n"~
1180 "      decodedRice = (zeroCounter+(setBitOffsetPlus1-1))<<riceParam;\n"~
1181 "    } else {\n"~
1182 "      if (bs.cache == 1) {\n"~
1183 "        setBitOffsetPlus1 = cast(uint)("~DRFLAC_CACHE_L1_SIZE_BITS!"bs"~");\n"~
1184 "        decodedRice = cast(uint)((zeroCounter+("~DRFLAC_CACHE_L1_SIZE_BITS!"bs"~"-1))<<riceParam);\n"~
1185 "      } else {\n"~
1186 "        setBitOffsetPlus1 = 5;\n"~
1187 "        for (;;) {\n"~
1188 "          if ((bs.cache&"~DRFLAC_CACHE_L1_SELECT!("bs", "setBitOffsetPlus1")~")) {\n"~
1189 "            decodedRice = (zeroCounter+(setBitOffsetPlus1-1))<<riceParam;\n"~
1190 "            break;\n"~
1191 "          }\n"~
1192 "          setBitOffsetPlus1 += 1;\n"~
1193 "        }\n"~
1194 "      }\n"~
1195 "    }\n"~
1196 "\n"~
1197 "    uint bitsLo = 0;\n"~
1198 "    uint riceLength = setBitOffsetPlus1+riceParam;\n"~
1199 "    if (riceLength < "~DRFLAC_CACHE_L1_BITS_REMAINING!"bs"~") {\n"~
1200 "      bitsLo = cast(uint)((bs.cache&(riceParamMask>>setBitOffsetPlus1))>>("~DRFLAC_CACHE_L1_SIZE_BITS!"bs"~"-riceLength));\n"~
1201 "      bs.consumedBits += riceLength;\n"~
1202 "      bs.cache <<= riceLength;\n"~
1203 "    } else {\n"~
1204 "      bs.consumedBits += riceLength;\n"~
1205 "      bs.cache <<= setBitOffsetPlus1;\n"~
1206 "\n"~
1207 "      /* It straddles the cached data. It will never cover more than the next chunk. We just read the number in two parts and combine them. */\n"~
1208 "      size_t bitCountLo = bs.consumedBits-"~DRFLAC_CACHE_L1_SIZE_BITS!"bs"~";\n"~
1209 "      drflac_cache_t resultHi = bs.cache&riceParamMask;    /* <-- This mask is OK because all bits after the first bits are always zero. */\n"~
1210 "\n"~
1211 "      if (bs.nextL2Line < "~DRFLAC_CACHE_L2_LINE_COUNT!"bs"~") {\n"~
1212 "        bs.cache = drflac__be2host__cache_line(bs.cacheL2.ptr[bs.nextL2Line++]);\n"~
1213 "      } else {\n"~
1214 "        /* Slow path. We need to fetch more data from the client. */\n"~
1215 "        if (!drflac__reload_cache(bs)) return false;\n"~
1216 "      }\n"~
1217 "\n"~
1218 "      bitsLo = cast(uint)((resultHi>>resultHiShift)|"~DRFLAC_CACHE_L1_SELECT_AND_SHIFT!("bs", "bitCountLo")~");\n"~
1219 "      bs.consumedBits = bitCountLo;\n"~
1220 "      bs.cache <<= bitCountLo;\n"~
1221 "    }\n"~
1222 "\n"~
1223 "    decodedRice |= bitsLo;\n"~
1224 "    decodedRice = (decodedRice>>1)^(~(decodedRice&0x01)+1);   /* <-- Ah, much faster! :) */\n"~
1225 "    /*\n"~
1226 "    if ((decodedRice&0x01)) {\n"~
1227 "      decodedRice = ~(decodedRice>>1);\n"~
1228 "    } else {\n"~
1229 "      decodedRice = (decodedRice>>1);\n"~
1230 "    }\n"~
1231 "    */\n"~
1232 "\n"~
1233 "    /* In order to properly calculate the prediction when the bits per sample is >16 we need to do it using 64-bit arithmetic. We can assume this\n"~
1234 "       is probably going to be slower on 32-bit systems so we'll do a more optimized 32-bit version when the bits per sample is low enough.*/\n"~
1235 "    pSamplesOut[i] = (cast(int)decodedRice+"~predictionFunc~"(order, shift, coefficients, pSamplesOut+i));\n"~
1236 "  }\n"~
1237 "\n"~
1238 "  return true;\n"~
1239 "}\n";
1240 
1241 mixin(DRFLAC__DECODE_SAMPLES_WITH_RESIDULE__RICE__PROC!("drflac__decode_samples_with_residual__rice_64", "drflac__calculate_prediction_64"));
1242 mixin(DRFLAC__DECODE_SAMPLES_WITH_RESIDULE__RICE__PROC!("drflac__decode_samples_with_residual__rice_32", "drflac__calculate_prediction_32"));
1243 
1244 
1245 // Reads and seeks past a string of residual values as Rice codes. The decoder should be sitting on the first bit of the Rice codes.
1246 bool drflac__read_and_seek_residual__rice (drflac_bs* bs, uint count, ubyte riceParam) {
1247   assert(bs !is null);
1248   assert(count > 0);
1249 
1250   for (uint i = 0; i < count; ++i) {
1251     if (!drflac__read_and_seek_rice(bs, riceParam)) return false;
1252   }
1253 
1254   return true;
1255 }
1256 
1257 bool drflac__decode_samples_with_residual__unencoded (drflac_bs* bs, uint bitsPerSample, uint count, ubyte unencodedBitsPerSample, uint order, int shift, const short* coefficients, int* pSamplesOut) {
1258   assert(bs !is null);
1259   assert(count > 0);
1260   assert(unencodedBitsPerSample > 0 && unencodedBitsPerSample <= 32);
1261   assert(pSamplesOut !is null);
1262 
1263   for (uint i = 0; i < count; ++i) {
1264     if (!drflac__read_int32(bs, unencodedBitsPerSample, pSamplesOut+i)) return false;
1265     if (bitsPerSample > 16) {
1266       pSamplesOut[i] += drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut+i);
1267     } else {
1268       pSamplesOut[i] += drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut+i);
1269     }
1270   }
1271 
1272   return true;
1273 }
1274 
1275 
1276 // Reads and decodes the residual for the sub-frame the decoder is currently sitting on. This function should be called
1277 // when the decoder is sitting at the very start of the RESIDUAL block. The first <order> residuals will be ignored. The
1278 // <blockSize> and <order> parameters are used to determine how many residual values need to be decoded.
1279 bool drflac__decode_samples_with_residual (drflac_bs* bs, uint bitsPerSample, uint blockSize, uint order, int shift, const short* coefficients, int* pDecodedSamples) {
1280   assert(bs !is null);
1281   assert(blockSize != 0);
1282   assert(pDecodedSamples !is null);       // <-- Should we allow null, in which case we just seek past the residual rather than do a full decode?
1283 
1284   ubyte residualMethod;
1285   if (!drflac__read_uint8(bs, 2, &residualMethod)) return false;
1286 
1287   if (residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) return false; // Unknown or unsupported residual coding method.
1288 
1289   // Ignore the first <order> values.
1290   pDecodedSamples += order;
1291 
1292   ubyte partitionOrder;
1293   if (!drflac__read_uint8(bs, 4, &partitionOrder)) return false;
1294 
1295   uint samplesInPartition = (blockSize/(1<<partitionOrder))-order;
1296   uint partitionsRemaining = (1<<partitionOrder);
1297   for (;;) {
1298     ubyte riceParam = 0;
1299     if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) {
1300       if (!drflac__read_uint8(bs, 4, &riceParam)) return false;
1301       if (riceParam == 16) riceParam = 0xFF;
1302     } else if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {
1303       if (!drflac__read_uint8(bs, 5, &riceParam)) return false;
1304       if (riceParam == 32) riceParam = 0xFF;
1305     }
1306 
1307     if (riceParam != 0xFF) {
1308       if (bitsPerSample > 16) {
1309         if (!drflac__decode_samples_with_residual__rice_64(bs, samplesInPartition, riceParam, order, shift, coefficients, pDecodedSamples)) return false;
1310       } else {
1311         if (!drflac__decode_samples_with_residual__rice_32(bs, samplesInPartition, riceParam, order, shift, coefficients, pDecodedSamples)) return false;
1312       }
1313     } else {
1314       ubyte unencodedBitsPerSample = 0;
1315       if (!drflac__read_uint8(bs, 5, &unencodedBitsPerSample)) return false;
1316       if (!drflac__decode_samples_with_residual__unencoded(bs, bitsPerSample, samplesInPartition, unencodedBitsPerSample, order, shift, coefficients, pDecodedSamples)) return false;
1317     }
1318 
1319     pDecodedSamples += samplesInPartition;
1320 
1321     if (partitionsRemaining == 1) break;
1322 
1323     partitionsRemaining -= 1;
1324     samplesInPartition = blockSize/(1<<partitionOrder);
1325   }
1326 
1327   return true;
1328 }
1329 
1330 // Reads and seeks past the residual for the sub-frame the decoder is currently sitting on. This function should be called
1331 // when the decoder is sitting at the very start of the RESIDUAL block. The first <order> residuals will be set to 0. The
1332 // <blockSize> and <order> parameters are used to determine how many residual values need to be decoded.
1333 bool drflac__read_and_seek_residual (drflac_bs* bs, uint blockSize, uint order) {
1334   assert(bs !is null);
1335   assert(blockSize != 0);
1336 
1337   ubyte residualMethod;
1338   if (!drflac__read_uint8(bs, 2, &residualMethod)) return false;
1339 
1340   if (residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) return false; // Unknown or unsupported residual coding method.
1341 
1342   ubyte partitionOrder;
1343   if (!drflac__read_uint8(bs, 4, &partitionOrder)) return false;
1344 
1345   uint samplesInPartition = (blockSize/(1<<partitionOrder))-order;
1346   uint partitionsRemaining = (1<<partitionOrder);
1347   for (;;) {
1348     ubyte riceParam = 0;
1349     if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) {
1350       if (!drflac__read_uint8(bs, 4, &riceParam)) return false;
1351       if (riceParam == 16) riceParam = 0xFF;
1352     } else if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {
1353       if (!drflac__read_uint8(bs, 5, &riceParam)) return false;
1354       if (riceParam == 32) riceParam = 0xFF;
1355     }
1356 
1357     if (riceParam != 0xFF) {
1358       if (!drflac__read_and_seek_residual__rice(bs, samplesInPartition, riceParam)) return false;
1359     } else {
1360       ubyte unencodedBitsPerSample = 0;
1361       if (!drflac__read_uint8(bs, 5, &unencodedBitsPerSample)) return false;
1362       if (!drflac__seek_bits(bs, unencodedBitsPerSample*samplesInPartition)) return false;
1363     }
1364 
1365     if (partitionsRemaining == 1) break;
1366 
1367     partitionsRemaining -= 1;
1368     samplesInPartition = blockSize/(1<<partitionOrder);
1369   }
1370 
1371   return true;
1372 }
1373 
1374 
1375 bool drflac__decode_samples__constant (drflac_bs* bs, uint blockSize, uint bitsPerSample, int* pDecodedSamples) {
1376   // Only a single sample needs to be decoded here.
1377   int sample;
1378   if (!drflac__read_int32(bs, bitsPerSample, &sample)) return false;
1379 
1380   // We don't really need to expand this, but it does simplify the process of reading samples. If this becomes a performance issue (unlikely)
1381   // we'll want to look at a more efficient way.
1382   for (uint i = 0; i < blockSize; ++i) pDecodedSamples[i] = sample;
1383 
1384   return true;
1385 }
1386 
1387 bool drflac__decode_samples__verbatim (drflac_bs* bs, uint blockSize, uint bitsPerSample, int* pDecodedSamples) {
1388   for (uint i = 0; i < blockSize; ++i) {
1389     int sample;
1390     if (!drflac__read_int32(bs, bitsPerSample, &sample)) return false;
1391     pDecodedSamples[i] = sample;
1392   }
1393   return true;
1394 }
1395 
1396 bool drflac__decode_samples__fixed (drflac_bs* bs, uint blockSize, uint bitsPerSample, ubyte lpcOrder, int* pDecodedSamples) {
1397   static immutable short[4][5] lpcCoefficientsTable = [
1398       [0,  0, 0,  0],
1399       [1,  0, 0,  0],
1400       [2, -1, 0,  0],
1401       [3, -3, 1,  0],
1402       [4, -6, 4, -1]
1403   ];
1404 
1405   // Warm up samples and coefficients.
1406   for (uint i = 0; i < lpcOrder; ++i) {
1407     int sample;
1408     if (!drflac__read_int32(bs, bitsPerSample, &sample)) return false;
1409     pDecodedSamples[i] = sample;
1410   }
1411 
1412   if (!drflac__decode_samples_with_residual(bs, bitsPerSample, blockSize, lpcOrder, 0, lpcCoefficientsTable.ptr[lpcOrder].ptr, pDecodedSamples)) return false;
1413 
1414   return true;
1415 }
1416 
1417 bool drflac__decode_samples__lpc (drflac_bs* bs, uint blockSize, uint bitsPerSample, ubyte lpcOrder, int* pDecodedSamples) {
1418   // Warm up samples.
1419   for (ubyte i = 0; i < lpcOrder; ++i) {
1420     int sample;
1421     if (!drflac__read_int32(bs, bitsPerSample, &sample)) return false;
1422     pDecodedSamples[i] = sample;
1423   }
1424 
1425   ubyte lpcPrecision;
1426   if (!drflac__read_uint8(bs, 4, &lpcPrecision)) return false;
1427   if (lpcPrecision == 15) return false;    // Invalid.
1428   lpcPrecision += 1;
1429 
1430   byte lpcShift;
1431   if (!drflac__read_int8(bs, 5, &lpcShift)) return false;
1432 
1433   short[32] coefficients;
1434   for (ubyte i = 0; i < lpcOrder; ++i) {
1435     if (!drflac__read_int16(bs, lpcPrecision, coefficients.ptr+i)) return false;
1436   }
1437 
1438   if (!drflac__decode_samples_with_residual(bs, bitsPerSample, blockSize, lpcOrder, lpcShift, coefficients.ptr, pDecodedSamples)) return false;
1439 
1440   return true;
1441 }
1442 
1443 
1444 bool drflac__read_next_frame_header (drflac_bs* bs, ubyte streaminfoBitsPerSample, drflac_frame_header* header) {
1445   assert(bs !is null);
1446   assert(header !is null);
1447 
1448   // At the moment the sync code is as a form of basic validation. The CRC is stored, but is unused at the moment. This
1449   // should probably be handled better in the future.
1450 
1451   static immutable uint[12] sampleRateTable  = [0, 88200, 176400, 192000, 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000];
1452   static immutable ubyte[8] bitsPerSampleTable = [0, 8, 12, cast(ubyte)-1, 16, 20, 24, cast(ubyte)-1];   // -1 = reserved.
1453 
1454   ushort syncCode = 0;
1455   if (!drflac__read_uint16(bs, 14, &syncCode)) return false;
1456 
1457   if (syncCode != 0x3FFE) return false; // TODO: Try and recover by attempting to seek to and read the next frame?
1458 
1459   ubyte reserved;
1460   if (!drflac__read_uint8(bs, 1, &reserved)) return false;
1461 
1462   ubyte blockingStrategy = 0;
1463   if (!drflac__read_uint8(bs, 1, &blockingStrategy)) return false;
1464 
1465   ubyte blockSize = 0;
1466   if (!drflac__read_uint8(bs, 4, &blockSize)) return false;
1467 
1468   ubyte sampleRate = 0;
1469   if (!drflac__read_uint8(bs, 4, &sampleRate)) return false;
1470 
1471   ubyte channelAssignment = 0;
1472   if (!drflac__read_uint8(bs, 4, &channelAssignment)) return false;
1473 
1474   ubyte bitsPerSample = 0;
1475   if (!drflac__read_uint8(bs, 3, &bitsPerSample)) return false;
1476 
1477   if (!drflac__read_uint8(bs, 1, &reserved)) return false;
1478 
1479   bool isVariableBlockSize = blockingStrategy == 1;
1480   if (isVariableBlockSize) {
1481     ulong sampleNumber;
1482     if (!drflac__read_utf8_coded_number(bs, &sampleNumber)) return false;
1483     header.frameNumber  = 0;
1484     header.sampleNumber = sampleNumber;
1485   } else {
1486     ulong frameNumber = 0;
1487     if (!drflac__read_utf8_coded_number(bs, &frameNumber)) return false;
1488     header.frameNumber  = cast(uint)frameNumber;   // <-- Safe cast.
1489     header.sampleNumber = 0;
1490   }
1491 
1492   if (blockSize == 1) {
1493     header.blockSize = 192;
1494   } else if (blockSize >= 2 && blockSize <= 5) {
1495     header.blockSize = cast(ushort)(576*(1<<(blockSize-2))); //k8
1496   } else if (blockSize == 6) {
1497     if (!drflac__read_uint16(bs, 8, &header.blockSize)) return false;
1498     header.blockSize += 1;
1499   } else if (blockSize == 7) {
1500     if (!drflac__read_uint16(bs, 16, &header.blockSize)) return false;
1501     header.blockSize += 1;
1502   } else {
1503     header.blockSize = cast(ushort)(256*(1<<(blockSize-8))); //k8
1504   }
1505 
1506   if (sampleRate <= 11) {
1507     header.sampleRate = sampleRateTable.ptr[sampleRate];
1508   } else if (sampleRate == 12) {
1509     if (!drflac__read_uint32(bs, 8, &header.sampleRate)) return false;
1510     header.sampleRate *= 1000;
1511   } else if (sampleRate == 13) {
1512     if (!drflac__read_uint32(bs, 16, &header.sampleRate)) return false;
1513   } else if (sampleRate == 14) {
1514     if (!drflac__read_uint32(bs, 16, &header.sampleRate)) return false;
1515     header.sampleRate *= 10;
1516   } else {
1517     return false;  // Invalid.
1518   }
1519 
1520   header.channelAssignment = channelAssignment;
1521 
1522   header.bitsPerSample = bitsPerSampleTable.ptr[bitsPerSample];
1523   if (header.bitsPerSample == 0) header.bitsPerSample = streaminfoBitsPerSample;
1524 
1525   if (drflac__read_uint8(bs, 8, &header.crc8) != 1) return false;
1526 
1527   return true;
1528 }
1529 
1530 bool drflac__read_subframe_header (drflac_bs* bs, drflac_subframe* pSubframe) {
1531   ubyte header;
1532   if (!drflac__read_uint8(bs, 8, &header)) return false;
1533 
1534   // First bit should always be 0.
1535   if ((header&0x80) != 0) return false;
1536 
1537   int type = (header&0x7E)>>1;
1538   if (type == 0) {
1539     pSubframe.subframeType = DRFLAC_SUBFRAME_CONSTANT;
1540   } else if (type == 1) {
1541     pSubframe.subframeType = DRFLAC_SUBFRAME_VERBATIM;
1542   } else {
1543     if ((type&0x20) != 0) {
1544       pSubframe.subframeType = DRFLAC_SUBFRAME_LPC;
1545       pSubframe.lpcOrder = (type&0x1F)+1;
1546     } else if ((type&0x08) != 0) {
1547       pSubframe.subframeType = DRFLAC_SUBFRAME_FIXED;
1548       pSubframe.lpcOrder = (type&0x07);
1549       if (pSubframe.lpcOrder > 4) {
1550         pSubframe.subframeType = DRFLAC_SUBFRAME_RESERVED;
1551         pSubframe.lpcOrder = 0;
1552       }
1553     } else {
1554       pSubframe.subframeType = DRFLAC_SUBFRAME_RESERVED;
1555     }
1556   }
1557 
1558   if (pSubframe.subframeType == DRFLAC_SUBFRAME_RESERVED) return false;
1559 
1560   // Wasted bits per sample.
1561   pSubframe.wastedBitsPerSample = 0;
1562   if ((header&0x01) == 1) {
1563     uint wastedBitsPerSample;
1564     if (!drflac__seek_past_next_set_bit(bs, &wastedBitsPerSample)) return false;
1565     pSubframe.wastedBitsPerSample = cast(ubyte)(cast(ubyte)wastedBitsPerSample+1); // k8
1566   }
1567 
1568   return true;
1569 }
1570 
1571 bool drflac__decode_subframe (drflac_bs* bs, drflac_frame* frame, int subframeIndex, int* pDecodedSamplesOut) {
1572   assert(bs !is null);
1573   assert(frame !is null);
1574 
1575   drflac_subframe* pSubframe = frame.subframes.ptr+subframeIndex;
1576   if (!drflac__read_subframe_header(bs, pSubframe)) return false;
1577 
1578   // Side channels require an extra bit per sample. Took a while to figure that one out...
1579   pSubframe.bitsPerSample = frame.header.bitsPerSample;
1580   if ((frame.header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame.header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) {
1581     pSubframe.bitsPerSample += 1;
1582   } else if (frame.header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) {
1583     pSubframe.bitsPerSample += 1;
1584   }
1585 
1586   // Need to handle wasted bits per sample.
1587   pSubframe.bitsPerSample -= pSubframe.wastedBitsPerSample;
1588   pSubframe.pDecodedSamples = pDecodedSamplesOut;
1589 
1590   switch (pSubframe.subframeType) {
1591     case DRFLAC_SUBFRAME_CONSTANT: drflac__decode_samples__constant(bs, frame.header.blockSize, pSubframe.bitsPerSample, pSubframe.pDecodedSamples); break;
1592     case DRFLAC_SUBFRAME_VERBATIM: drflac__decode_samples__verbatim(bs, frame.header.blockSize, pSubframe.bitsPerSample, pSubframe.pDecodedSamples); break;
1593     case DRFLAC_SUBFRAME_FIXED: drflac__decode_samples__fixed(bs, frame.header.blockSize, pSubframe.bitsPerSample, pSubframe.lpcOrder, pSubframe.pDecodedSamples); break;
1594     case DRFLAC_SUBFRAME_LPC: drflac__decode_samples__lpc(bs, frame.header.blockSize, pSubframe.bitsPerSample, pSubframe.lpcOrder, pSubframe.pDecodedSamples); break;
1595     default: return false;
1596   }
1597 
1598   return true;
1599 }
1600 
1601 bool drflac__seek_subframe (drflac_bs* bs, drflac_frame* frame, int subframeIndex) {
1602   assert(bs !is null);
1603   assert(frame !is null);
1604 
1605   drflac_subframe* pSubframe = frame.subframes.ptr+subframeIndex;
1606   if (!drflac__read_subframe_header(bs, pSubframe)) return false;
1607 
1608   // Side channels require an extra bit per sample. Took a while to figure that one out...
1609   pSubframe.bitsPerSample = frame.header.bitsPerSample;
1610   if ((frame.header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame.header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) {
1611     pSubframe.bitsPerSample += 1;
1612   } else if (frame.header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) {
1613     pSubframe.bitsPerSample += 1;
1614   }
1615 
1616   // Need to handle wasted bits per sample.
1617   pSubframe.bitsPerSample -= pSubframe.wastedBitsPerSample;
1618   pSubframe.pDecodedSamples = null;
1619   //pSubframe.pDecodedSamples = pFlac.pDecodedSamples+(pFlac.currentFrame.header.blockSize*subframeIndex);
1620 
1621   switch (pSubframe.subframeType) {
1622     case DRFLAC_SUBFRAME_CONSTANT:
1623       if (!drflac__seek_bits(bs, pSubframe.bitsPerSample)) return false;
1624       break;
1625 
1626     case DRFLAC_SUBFRAME_VERBATIM:
1627       uint bitsToSeek = frame.header.blockSize*pSubframe.bitsPerSample;
1628       if (!drflac__seek_bits(bs, bitsToSeek)) return false;
1629       break;
1630 
1631     case DRFLAC_SUBFRAME_FIXED:
1632       uint bitsToSeek = pSubframe.lpcOrder*pSubframe.bitsPerSample;
1633       if (!drflac__seek_bits(bs, bitsToSeek)) return false;
1634       if (!drflac__read_and_seek_residual(bs, frame.header.blockSize, pSubframe.lpcOrder)) return false;
1635       break;
1636 
1637     case DRFLAC_SUBFRAME_LPC:
1638       uint bitsToSeek = pSubframe.lpcOrder*pSubframe.bitsPerSample;
1639       if (!drflac__seek_bits(bs, bitsToSeek)) return false;
1640       ubyte lpcPrecision;
1641       if (!drflac__read_uint8(bs, 4, &lpcPrecision)) return false;
1642       if (lpcPrecision == 15) return false;    // Invalid.
1643       lpcPrecision += 1;
1644       bitsToSeek = (pSubframe.lpcOrder*lpcPrecision)+5;    // +5 for shift.
1645       if (!drflac__seek_bits(bs, bitsToSeek)) return false;
1646       if (!drflac__read_and_seek_residual(bs, frame.header.blockSize, pSubframe.lpcOrder)) return false;
1647       break;
1648 
1649     default: return false;
1650   }
1651 
1652   return true;
1653 }
1654 
1655 
1656 ubyte drflac__get_channel_count_from_channel_assignment (byte channelAssignment) {
1657   assert(channelAssignment <= 10);
1658   static immutable ubyte[11] lookup = [1, 2, 3, 4, 5, 6, 7, 8, 2, 2, 2];
1659   return lookup.ptr[channelAssignment];
1660 }
1661 
1662 bool drflac__decode_frame (drflac* pFlac) {
1663   import core.stdc.string : memset;
1664   // This function should be called while the stream is sitting on the first byte after the frame header.
1665   memset(pFlac.currentFrame.subframes.ptr, 0, (pFlac.currentFrame.subframes).sizeof);
1666 
1667   int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac.currentFrame.header.channelAssignment);
1668   for (int i = 0; i < channelCount; ++i) {
1669     if (!drflac__decode_subframe(&pFlac.bs, &pFlac.currentFrame, i, pFlac.pDecodedSamples+(pFlac.currentFrame.header.blockSize*i))) return false;
1670   }
1671 
1672   // At the end of the frame sits the padding and CRC. We don't use these so we can just seek past.
1673   if (!drflac__seek_bits(&pFlac.bs, (mixin(DRFLAC_CACHE_L1_BITS_REMAINING!"(&pFlac.bs)")&7)+16)) return false;
1674 
1675   pFlac.currentFrame.samplesRemaining = pFlac.currentFrame.header.blockSize*channelCount;
1676 
1677   return true;
1678 }
1679 
1680 bool drflac__seek_frame (drflac* pFlac) {
1681   int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac.currentFrame.header.channelAssignment);
1682   for (int i = 0; i < channelCount; ++i) {
1683     if (!drflac__seek_subframe(&pFlac.bs, &pFlac.currentFrame, i)) return false;
1684   }
1685   // Padding and CRC.
1686   return drflac__seek_bits(&pFlac.bs, (mixin(DRFLAC_CACHE_L1_BITS_REMAINING!"(&pFlac.bs)")&7)+16);
1687 }
1688 
1689 bool drflac__read_and_decode_next_frame (drflac* pFlac) {
1690   assert(pFlac !is null);
1691 
1692   if (!drflac__read_next_frame_header(&pFlac.bs, pFlac.bitsPerSample, &pFlac.currentFrame.header)) return false;
1693 
1694   return drflac__decode_frame(pFlac);
1695 }
1696 
1697 
1698 void drflac__get_current_frame_sample_range (drflac* pFlac, ulong* pFirstSampleInFrameOut, ulong* pLastSampleInFrameOut) {
1699   assert(pFlac !is null);
1700 
1701   uint channelCount = drflac__get_channel_count_from_channel_assignment(pFlac.currentFrame.header.channelAssignment);
1702 
1703   ulong firstSampleInFrame = pFlac.currentFrame.header.sampleNumber;
1704   if (firstSampleInFrame == 0) firstSampleInFrame = pFlac.currentFrame.header.frameNumber*pFlac.maxBlockSize*channelCount;
1705 
1706   ulong lastSampleInFrame = firstSampleInFrame+(pFlac.currentFrame.header.blockSize*channelCount);
1707   if (lastSampleInFrame > 0) lastSampleInFrame -= 1; // Needs to be zero based.
1708 
1709   if (pFirstSampleInFrameOut) *pFirstSampleInFrameOut = firstSampleInFrame;
1710   if (pLastSampleInFrameOut) *pLastSampleInFrameOut = lastSampleInFrame;
1711 }
1712 
1713 bool drflac__seek_to_first_frame (drflac* pFlac) {
1714   import core.stdc.string : memset;
1715   assert(pFlac !is null);
1716 
1717   bool result = drflac__seek_to_byte(&pFlac.bs, pFlac.firstFramePos);
1718 
1719   memset(&pFlac.currentFrame, 0, (pFlac.currentFrame).sizeof);
1720   return result;
1721 }
1722 
1723 bool drflac__seek_to_next_frame (drflac* pFlac) {
1724   // This function should only ever be called while the decoder is sitting on the first byte past the FRAME_HEADER section.
1725   assert(pFlac !is null);
1726   return drflac__seek_frame(pFlac);
1727 }
1728 
1729 bool drflac__seek_to_frame_containing_sample (drflac* pFlac, ulong sampleIndex) {
1730   assert(pFlac !is null);
1731 
1732   if (!drflac__seek_to_first_frame(pFlac)) return false;
1733 
1734   ulong firstSampleInFrame = 0;
1735   ulong lastSampleInFrame = 0;
1736   for (;;) {
1737     // We need to read the frame's header in order to determine the range of samples it contains.
1738     if (!drflac__read_next_frame_header(&pFlac.bs, pFlac.bitsPerSample, &pFlac.currentFrame.header)) return false;
1739     drflac__get_current_frame_sample_range(pFlac, &firstSampleInFrame, &lastSampleInFrame);
1740     if (sampleIndex >= firstSampleInFrame && sampleIndex <= lastSampleInFrame) break;  // The sample is in this frame.
1741     if (!drflac__seek_to_next_frame(pFlac)) return false;
1742   }
1743 
1744   // If we get here we should be right at the start of the frame containing the sample.
1745   return true;
1746 }
1747 
1748 public bool drflac__seek_to_sample__brute_force (drflac* pFlac, ulong sampleIndex) {
1749   if (!drflac__seek_to_frame_containing_sample(pFlac, sampleIndex)) return false;
1750 
1751   // At this point we should be sitting on the first byte of the frame containing the sample. We need to decode every sample up to (but
1752   // not including) the sample we're seeking to.
1753   ulong firstSampleInFrame = 0;
1754   drflac__get_current_frame_sample_range(pFlac, &firstSampleInFrame, null);
1755 
1756   assert(firstSampleInFrame <= sampleIndex);
1757   size_t samplesToDecode = cast(size_t)(sampleIndex-firstSampleInFrame);    // <-- Safe cast because the maximum number of samples in a frame is 65535.
1758   if (samplesToDecode == 0) return true;
1759 
1760   // At this point we are just sitting on the byte after the frame header. We need to decode the frame before reading anything from it.
1761   if (!drflac__decode_frame(pFlac)) return false;
1762 
1763   return drflac_read_s32(pFlac, samplesToDecode, null) != 0;
1764 }
1765 
1766 
1767 bool drflac__seek_to_sample__seek_table (drflac* pFlac, ulong sampleIndex) {
1768   assert(pFlac !is null);
1769 
1770   if (pFlac.seektablePos == 0) return false;
1771 
1772   if (!drflac__seek_to_byte(&pFlac.bs, pFlac.seektablePos)) return false;
1773 
1774   // The number of seek points is derived from the size of the SEEKTABLE block.
1775   uint seekpointCount = pFlac.seektableSize/18;   // 18 = the size of each seek point.
1776   if (seekpointCount == 0) return false;   // Would this ever happen?
1777 
1778   drflac_seekpoint closestSeekpoint = {0};
1779 
1780   uint seekpointsRemaining = seekpointCount;
1781   while (seekpointsRemaining > 0) {
1782     drflac_seekpoint seekpoint;
1783     if (!drflac__read_uint64(&pFlac.bs, 64, &seekpoint.firstSample)) break;
1784     if (!drflac__read_uint64(&pFlac.bs, 64, &seekpoint.frameOffset)) break;
1785     if (!drflac__read_uint16(&pFlac.bs, 16, &seekpoint.sampleCount)) break;
1786     if (seekpoint.firstSample*pFlac.channels > sampleIndex) break;
1787     closestSeekpoint = seekpoint;
1788     seekpointsRemaining -= 1;
1789   }
1790 
1791   // At this point we should have found the seekpoint closest to our sample. We need to seek to it using basically the same
1792   // technique as we use with the brute force method.
1793   if (!drflac__seek_to_byte(&pFlac.bs, pFlac.firstFramePos+closestSeekpoint.frameOffset)) return false;
1794 
1795   ulong firstSampleInFrame = 0;
1796   ulong lastSampleInFrame = 0;
1797   for (;;) {
1798     // We need to read the frame's header in order to determine the range of samples it contains.
1799     if (!drflac__read_next_frame_header(&pFlac.bs, pFlac.bitsPerSample, &pFlac.currentFrame.header)) return false;
1800     drflac__get_current_frame_sample_range(pFlac, &firstSampleInFrame, &lastSampleInFrame);
1801     if (sampleIndex >= firstSampleInFrame && sampleIndex <= lastSampleInFrame) break;  // The sample is in this frame.
1802     if (!drflac__seek_to_next_frame(pFlac)) return false;
1803   }
1804 
1805   assert(firstSampleInFrame <= sampleIndex);
1806 
1807   // At this point we are just sitting on the byte after the frame header. We need to decode the frame before reading anything from it.
1808   if (!drflac__decode_frame(pFlac)) return false;
1809 
1810   size_t samplesToDecode = cast(size_t)(sampleIndex-firstSampleInFrame);    // <-- Safe cast because the maximum number of samples in a frame is 65535.
1811   return drflac_read_s32(pFlac, samplesToDecode, null) == samplesToDecode;
1812 }
1813 
1814 
1815 //#ifndef DR_FLAC_NO_OGG
1816 struct drflac_ogg_page_header {
1817   ubyte[4] capturePattern;  // Should be "OggS"
1818   ubyte structureVersion;   // Always 0.
1819   ubyte headerType;
1820   ulong granulePosition;
1821   uint serialNumber;
1822   uint sequenceNumber;
1823   uint checksum;
1824   ubyte segmentCount;
1825   ubyte[255] segmentTable;
1826 }
1827 //#endif
1828 
1829 struct drflac_init_info {
1830   //drflac_read_proc onRead;
1831   //drflac_seek_proc onSeek;
1832   //void* pUserData;
1833   ReadStruct rs;
1834   //drflac_meta_proc onMeta;
1835   //void* pUserDataMD;
1836   drflac_container container;
1837   uint sampleRate;
1838   ubyte  channels;
1839   ubyte  bitsPerSample;
1840   ulong totalSampleCount;
1841   ushort maxBlockSize;
1842   ulong runningFilePos;
1843   bool hasMetadataBlocks;
1844 
1845 //#ifndef DR_FLAC_NO_OGG
1846   uint oggSerial;
1847   ulong oggFirstBytePos;
1848   drflac_ogg_page_header oggBosHeader;
1849 //#endif
1850 }
1851 
1852 private struct ReadStruct {
1853 @nogc:	
1854   drflac_read_proc onReadCB;
1855   drflac_seek_proc onSeekCB;
1856   void* pUserData;
1857 
1858   size_t read (void* pBufferOut, size_t bytesToRead) nothrow {
1859     auto b = cast(ubyte*)pBufferOut;
1860     auto res = 0;
1861     try {
1862       while (bytesToRead > 0) {
1863         size_t rd = 0;
1864         if (onReadCB !is null) {
1865           rd = onReadCB(pUserData, b, bytesToRead);
1866         } else {
1867          }
1868         if (rd == 0) break;
1869         b += rd;
1870         res += rd;
1871         bytesToRead -= rd;
1872       }
1873       return res;
1874     } catch (Exception e) {
1875       return 0;
1876     }
1877   }
1878 
1879   bool seek (int offset, drflac_seek_origin origin) nothrow {
1880     try {
1881       if (onSeekCB !is null) {
1882         return onSeekCB(pUserData, offset, origin);
1883       } else {
1884       }
1885       return false;
1886     } catch (Exception e) {
1887       return 0;
1888     }
1889   }
1890 }
1891 
1892 
1893 void drflac__decode_block_header (uint blockHeader, ubyte* isLastBlock, ubyte* blockType, uint* blockSize) {
1894   blockHeader = drflac__be2host_32(blockHeader);
1895   *isLastBlock = (blockHeader&(0x01<<31))>>31;
1896   *blockType   = (blockHeader&(0x7F<<24))>>24;
1897   *blockSize   = (blockHeader&0xFFFFFF);
1898 }
1899 
1900 bool drflac__read_and_decode_block_header (ref ReadStruct rs, ubyte* isLastBlock, ubyte* blockType, uint* blockSize) {
1901   uint blockHeader;
1902   if (rs.read(&blockHeader, 4) != 4) return false;
1903   drflac__decode_block_header(blockHeader, isLastBlock, blockType, blockSize);
1904   return true;
1905 }
1906 
1907 bool drflac__read_streaminfo (ref ReadStruct rs, drflac_streaminfo* pStreamInfo) {
1908   import core.stdc.string : memcpy;
1909   // min/max block size.
1910   uint blockSizes;
1911   if (rs.read(&blockSizes, 4) != 4) return false;
1912   // min/max frame size.
1913   ulong frameSizes = 0;
1914   if (rs.read(&frameSizes, 6) != 6) return false;
1915   // Sample rate, channels, bits per sample and total sample count.
1916   ulong importantProps;
1917   if (rs.read(&importantProps, 8) != 8) return false;
1918   // MD5
1919   ubyte[16] md5;
1920   if (rs.read(md5.ptr, md5.sizeof) != md5.sizeof) return false;
1921 
1922   blockSizes     = drflac__be2host_32(blockSizes);
1923   frameSizes     = drflac__be2host_64(frameSizes);
1924   importantProps = drflac__be2host_64(importantProps);
1925 
1926   pStreamInfo.minBlockSize     = (blockSizes&0xFFFF0000)>>16;
1927   pStreamInfo.maxBlockSize     = blockSizes&0x0000FFFF;
1928   pStreamInfo.minFrameSize     = cast(uint)((frameSizes&0xFFFFFF0000000000UL)>>40);
1929   pStreamInfo.maxFrameSize     = cast(uint)((frameSizes&0x000000FFFFFF0000UL)>>16);
1930   pStreamInfo.sampleRate       = cast(uint)((importantProps&0xFFFFF00000000000UL)>>44);
1931   pStreamInfo.channels         = cast(ubyte )((importantProps&0x00000E0000000000UL)>>41)+1;
1932   pStreamInfo.bitsPerSample    = cast(ubyte )((importantProps&0x000001F000000000UL)>>36)+1;
1933   pStreamInfo.totalSampleCount = (importantProps&0x0000000FFFFFFFFFUL)*pStreamInfo.channels;
1934   memcpy(pStreamInfo.md5.ptr, md5.ptr, md5.sizeof);
1935 
1936   return true;
1937 }
1938 
1939 bool drflac__read_and_decode_metadata (drflac* pFlac, scope drflac_meta_proc onMeta, void* pUserDataMD) {
1940   import core.stdc.stdlib : malloc, free;
1941   assert(pFlac !is null);
1942 
1943   // We want to keep track of the byte position in the stream of the seektable. At the time of calling this function we know that
1944   // we'll be sitting on byte 42.
1945   ulong runningFilePos = 42;
1946   ulong seektablePos  = 0;
1947   uint seektableSize = 0;
1948 
1949   for (;;) {
1950     ubyte isLastBlock = 0;
1951     ubyte blockType;
1952     uint blockSize;
1953     if (!drflac__read_and_decode_block_header(pFlac.bs.rs, &isLastBlock, &blockType, &blockSize)) return false;
1954     runningFilePos += 4;
1955 
1956     drflac_metadata metadata;
1957     metadata.type = blockType;
1958     metadata.pRawData = null;
1959     metadata.rawDataSize = 0;
1960 
1961     switch (blockType) {
1962       case DRFLAC_METADATA_BLOCK_TYPE_APPLICATION:
1963         if (onMeta) {
1964             void* pRawData = malloc(blockSize);
1965             if (pRawData is null) return false;
1966             scope(exit) free(pRawData);
1967 
1968             if (pFlac.bs.rs.read(pRawData, blockSize) != blockSize) return false;
1969 
1970             metadata.pRawData = pRawData;
1971             metadata.rawDataSize = blockSize;
1972             metadata.data.application.id       = drflac__be2host_32(*cast(uint*)pRawData);
1973             metadata.data.application.pData    = cast(const(void)*)(cast(ubyte*)pRawData+uint.sizeof);
1974             metadata.data.application.dataSize = blockSize-cast(uint)uint.sizeof;
1975             try { onMeta(pUserDataMD, &metadata); } catch (Exception e) { return false; }
1976         }
1977         break;
1978 
1979       case DRFLAC_METADATA_BLOCK_TYPE_SEEKTABLE:
1980         seektablePos  = runningFilePos;
1981         seektableSize = blockSize;
1982 
1983         if (onMeta) {
1984           void* pRawData = malloc(blockSize);
1985           if (pRawData is null) return false;
1986           scope(exit) free(pRawData);
1987 
1988           if (pFlac.bs.rs.read(pRawData, blockSize) != blockSize) return false;
1989 
1990           metadata.pRawData = pRawData;
1991           metadata.rawDataSize = blockSize;
1992           metadata.data.seektable.seekpointCount = blockSize/(drflac_seekpoint).sizeof;
1993           metadata.data.seektable.pSeekpoints = cast(const(drflac_seekpoint)*)pRawData;
1994 
1995           // Endian swap.
1996           for (uint iSeekpoint = 0; iSeekpoint < metadata.data.seektable.seekpointCount; ++iSeekpoint) {
1997             drflac_seekpoint* pSeekpoint = cast(drflac_seekpoint*)pRawData+iSeekpoint;
1998             pSeekpoint.firstSample = drflac__be2host_64(pSeekpoint.firstSample);
1999             pSeekpoint.frameOffset = drflac__be2host_64(pSeekpoint.frameOffset);
2000             pSeekpoint.sampleCount = drflac__be2host_16(pSeekpoint.sampleCount);
2001           }
2002 
2003           try { onMeta(pUserDataMD, &metadata); } catch (Exception e) { return false; }
2004         }
2005         break;
2006 
2007       case DRFLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT:
2008         if (onMeta) {
2009           void* pRawData = malloc(blockSize);
2010           if (pRawData is null) return false;
2011           scope(exit) free(pRawData);
2012 
2013           if (pFlac.bs.rs.read(pRawData, blockSize) != blockSize) return false;
2014 
2015           metadata.pRawData = pRawData;
2016           metadata.rawDataSize = blockSize;
2017 
2018           const(char)* pRunningData = cast(const(char)*)pRawData;
2019           metadata.data.vorbis_comment.vendorLength = drflac__le2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2020           metadata.data.vorbis_comment.vendor       = pRunningData;                                 pRunningData += metadata.data.vorbis_comment.vendorLength;
2021           metadata.data.vorbis_comment.commentCount = drflac__le2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2022           metadata.data.vorbis_comment.comments     = pRunningData;
2023           try { onMeta(pUserDataMD, &metadata); } catch (Exception e) { return false; }
2024         }
2025         break;
2026 
2027       case DRFLAC_METADATA_BLOCK_TYPE_CUESHEET:
2028         if (onMeta) {
2029           import core.stdc.string : memcpy;
2030           void* pRawData = malloc(blockSize);
2031           if (pRawData is null) return false;
2032           scope(exit) free(pRawData);
2033 
2034           if (pFlac.bs.rs.read(pRawData, blockSize) != blockSize) return false;
2035 
2036           metadata.pRawData = pRawData;
2037           metadata.rawDataSize = blockSize;
2038 
2039           const(char)* pRunningData = cast(const(char)*)pRawData;
2040           memcpy(metadata.data.cuesheet.catalog.ptr, pRunningData, 128);                           pRunningData += 128;
2041           metadata.data.cuesheet.leadInSampleCount = drflac__be2host_64(*cast(ulong*)pRunningData);pRunningData += 4;
2042           metadata.data.cuesheet.isCD              = ((pRunningData[0]&0x80)>>7) != 0;         pRunningData += 259;
2043           metadata.data.cuesheet.trackCount        = pRunningData[0];                              pRunningData += 1;
2044           metadata.data.cuesheet.pTrackData        = cast(const(ubyte)*)pRunningData;
2045           try { onMeta(pUserDataMD, &metadata); } catch (Exception e) { return false; }
2046         }
2047         break;
2048 
2049       case DRFLAC_METADATA_BLOCK_TYPE_PICTURE:
2050         if (onMeta) {
2051           void* pRawData = malloc(blockSize);
2052           if (pRawData is null) return false;
2053           scope(exit) free(pRawData);
2054 
2055           if (pFlac.bs.rs.read(pRawData, blockSize) != blockSize) return false;
2056 
2057           metadata.pRawData = pRawData;
2058           metadata.rawDataSize = blockSize;
2059 
2060           const(char)* pRunningData = cast(const(char)*)pRawData;
2061           metadata.data.picture.type              = drflac__be2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2062           metadata.data.picture.mimeLength        = drflac__be2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2063           metadata.data.picture.mime              = pRunningData;                                 pRunningData += metadata.data.picture.mimeLength;
2064           metadata.data.picture.descriptionLength = drflac__be2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2065           metadata.data.picture.description       = pRunningData;
2066           metadata.data.picture.width             = drflac__be2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2067           metadata.data.picture.height            = drflac__be2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2068           metadata.data.picture.colorDepth        = drflac__be2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2069           metadata.data.picture.indexColorCount   = drflac__be2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2070           metadata.data.picture.pictureDataSize   = drflac__be2host_32(*cast(uint*)pRunningData); pRunningData += 4;
2071           metadata.data.picture.pPictureData      = cast(const(ubyte)*)pRunningData;
2072           try { onMeta(pUserDataMD, &metadata); } catch (Exception e) { return false; }
2073         }
2074         break;
2075 
2076       case DRFLAC_METADATA_BLOCK_TYPE_PADDING:
2077         if (onMeta) {
2078           metadata.data.padding.unused = 0;
2079           // Padding doesn't have anything meaningful in it, so just skip over it.
2080           if (!pFlac.bs.rs.seek(blockSize, drflac_seek_origin_current)) return false;
2081           //onMeta(pUserDataMD, &metadata);
2082         }
2083         break;
2084 
2085       case DRFLAC_METADATA_BLOCK_TYPE_INVALID:
2086         // Invalid chunk. Just skip over this one.
2087         if (onMeta) {
2088           if (!pFlac.bs.rs.seek(blockSize, drflac_seek_origin_current)) return false;
2089         }
2090         goto default;
2091 
2092       default:
2093         // It's an unknown chunk, but not necessarily invalid. There's a chance more metadata blocks might be defined later on, so we
2094         // can at the very least report the chunk to the application and let it look at the raw data.
2095         if (onMeta) {
2096           void* pRawData = malloc(blockSize);
2097           if (pRawData is null) return false;
2098           scope(exit) free(pRawData);
2099 
2100           if (pFlac.bs.rs.read(pRawData, blockSize) != blockSize) return false;
2101 
2102           metadata.pRawData = pRawData;
2103           metadata.rawDataSize = blockSize;
2104           try { onMeta(pUserDataMD, &metadata); } catch (Exception e) { return false; }
2105         }
2106         break;
2107     }
2108 
2109     // If we're not handling metadata, just skip over the block. If we are, it will have been handled earlier in the switch statement above.
2110     if (onMeta is null) {
2111       if (!pFlac.bs.rs.seek(blockSize, drflac_seek_origin_current)) return false;
2112     }
2113 
2114     runningFilePos += blockSize;
2115     if (isLastBlock) break;
2116   }
2117 
2118   pFlac.seektablePos = seektablePos;
2119   pFlac.seektableSize = seektableSize;
2120   pFlac.firstFramePos = runningFilePos;
2121 
2122   return true;
2123 }
2124 
2125 bool drflac__init_private__native (drflac_init_info* pInit, ref ReadStruct rs, scope drflac_meta_proc onMeta, void* pUserDataMD) {
2126   // Pre: The bit stream should be sitting just past the 4-byte id header.
2127 
2128   pInit.container = drflac_container_native;
2129 
2130   // The first metadata block should be the STREAMINFO block.
2131   ubyte isLastBlock;
2132   ubyte blockType;
2133   uint blockSize;
2134   if (!drflac__read_and_decode_block_header(rs, &isLastBlock, &blockType, &blockSize)) return false;
2135 
2136   if (blockType != DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) return false;    // Invalid block type. First block must be the STREAMINFO block.
2137 
2138   drflac_streaminfo streaminfo;
2139   if (!drflac__read_streaminfo(rs, &streaminfo)) return false;
2140 
2141   pInit.sampleRate       = streaminfo.sampleRate;
2142   pInit.channels         = streaminfo.channels;
2143   pInit.bitsPerSample    = streaminfo.bitsPerSample;
2144   pInit.totalSampleCount = streaminfo.totalSampleCount;
2145   pInit.maxBlockSize     = streaminfo.maxBlockSize;    // Don't care about the min block size - only the max (used for determining the size of the memory allocation).
2146 
2147   if (onMeta !is null) {
2148     drflac_metadata metadata;
2149     metadata.type = DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO;
2150     metadata.pRawData = null;
2151     metadata.rawDataSize = 0;
2152     metadata.data.streaminfo = streaminfo;
2153     try { onMeta(pUserDataMD, &metadata); } catch (Exception e) { return false; }
2154   }
2155 
2156   pInit.hasMetadataBlocks = !isLastBlock;
2157   return true;
2158 }
2159 
2160 //#ifndef DR_FLAC_NO_OGG
2161 bool drflac_ogg__is_capture_pattern (const(ubyte)* pattern/*[4]*/) {
2162   return pattern[0] == 'O' && pattern[1] == 'g' && pattern[2] == 'g' && pattern[3] == 'S';
2163 }
2164 
2165 uint drflac_ogg__get_page_header_size (drflac_ogg_page_header* pHeader) {
2166   return 27+pHeader.segmentCount;
2167 }
2168 
2169 uint drflac_ogg__get_page_body_size (drflac_ogg_page_header* pHeader) {
2170   uint pageBodySize = 0;
2171   for (int i = 0; i < pHeader.segmentCount; ++i) pageBodySize += pHeader.segmentTable.ptr[i];
2172   return pageBodySize;
2173 }
2174 
2175 bool drflac_ogg__read_page_header_after_capture_pattern (ref ReadStruct rs, drflac_ogg_page_header* pHeader, uint* pHeaderSize) {
2176   if (rs.read(&pHeader.structureVersion, 1) != 1 || pHeader.structureVersion != 0) return false;   // Unknown structure version. Possibly corrupt stream.
2177   if (rs.read(&pHeader.headerType, 1) != 1) return false;
2178   if (rs.read(&pHeader.granulePosition, 8) != 8) return false;
2179   if (rs.read(&pHeader.serialNumber, 4) != 4) return false;
2180   if (rs.read(&pHeader.sequenceNumber, 4) != 4) return false;
2181   if (rs.read(&pHeader.checksum, 4) != 4) return false;
2182   if (rs.read(&pHeader.segmentCount, 1) != 1 || pHeader.segmentCount == 0) return false;   // Should not have a segment count of 0.
2183   if (rs.read(&pHeader.segmentTable, pHeader.segmentCount) != pHeader.segmentCount) return false;
2184   if (pHeaderSize) *pHeaderSize = (27+pHeader.segmentCount);
2185   return true;
2186 }
2187 
2188 bool drflac_ogg__read_page_header (ref ReadStruct rs, drflac_ogg_page_header* pHeader, uint* pHeaderSize) {
2189   ubyte[4] id;
2190   if (rs.read(id.ptr, 4) != 4) return false;
2191   if (id.ptr[0] != 'O' || id.ptr[1] != 'g' || id.ptr[2] != 'g' || id.ptr[3] != 'S') return false;
2192   return drflac_ogg__read_page_header_after_capture_pattern(rs, pHeader, pHeaderSize);
2193 }
2194 
2195 
2196 // The main part of the Ogg encapsulation is the conversion from the physical Ogg bitstream to the native FLAC bitstream. It works
2197 // in three general stages: Ogg Physical Bitstream . Ogg/FLAC Logical Bitstream . FLAC Native Bitstream. dr_flac is architecured
2198 // in such a way that the core sections assume everything is delivered in native format. Therefore, for each encapsulation type
2199 // dr_flac is supporting there needs to be a layer sitting on top of the onRead and onSeek callbacks that ensures the bits read from
2200 // the physical Ogg bitstream are converted and delivered in native FLAC format.
2201 struct drflac_oggbs {
2202   //drflac_read_proc onRead;    // The original onRead callback from drflac_open() and family.
2203   //drflac_seek_proc onSeek;    // The original onSeek callback from drflac_open() and family.
2204   //void* pUserData;            // The user data passed on onRead and onSeek. This is the user data that was passed on drflac_open() and family.
2205   ReadStruct rs;
2206   ulong currentBytePos;    // The position of the byte we are sitting on in the physical byte stream. Used for efficient seeking.
2207   ulong firstBytePos;      // The position of the first byte in the physical bitstream. Points to the start of the "OggS" identifier of the FLAC bos page.
2208   uint serialNumber;      // The serial number of the FLAC audio pages. This is determined by the initial header page that was read during initialization.
2209   drflac_ogg_page_header bosPageHeader;   // Used for seeking.
2210   drflac_ogg_page_header currentPageHeader;
2211   uint bytesRemainingInPage;
2212   bool stdio; //k8: it is drflac's stdio shit
2213 } // oggbs = Ogg Bitstream
2214 
2215 size_t drflac_oggbs__read_physical (drflac_oggbs* oggbs, void* bufferOut, size_t bytesToRead) {
2216   size_t bytesActuallyRead = oggbs.rs.read(bufferOut, bytesToRead);
2217   oggbs.currentBytePos += bytesActuallyRead;
2218   return bytesActuallyRead;
2219 }
2220 
2221 bool drflac_oggbs__seek_physical (drflac_oggbs* oggbs, ulong offset, drflac_seek_origin origin) {
2222   if (origin == drflac_seek_origin_start) {
2223     if (offset <= 0x7FFFFFFF) {
2224       if (!oggbs.rs.seek(cast(int)offset, drflac_seek_origin_start)) return false;
2225       oggbs.currentBytePos = offset;
2226       return true;
2227     } else {
2228       if (!oggbs.rs.seek(0x7FFFFFFF, drflac_seek_origin_start)) return false;
2229       oggbs.currentBytePos = offset;
2230       return drflac_oggbs__seek_physical(oggbs, offset-0x7FFFFFFF, drflac_seek_origin_current);
2231     }
2232   } else {
2233     while (offset > 0x7FFFFFFF) {
2234       if (!oggbs.rs.seek(0x7FFFFFFF, drflac_seek_origin_current)) return false;
2235       oggbs.currentBytePos += 0x7FFFFFFF;
2236       offset -= 0x7FFFFFFF;
2237     }
2238     if (!oggbs.rs.seek(cast(int)offset, drflac_seek_origin_current)) return false; // <-- Safe cast thanks to the loop above.
2239     oggbs.currentBytePos += offset;
2240     return true;
2241   }
2242 }
2243 
2244 bool drflac_oggbs__goto_next_page (drflac_oggbs* oggbs) {
2245   drflac_ogg_page_header header;
2246   for (;;) {
2247     uint headerSize;
2248     if (!drflac_ogg__read_page_header(oggbs.rs, &header, &headerSize)) return false;
2249     oggbs.currentBytePos += headerSize;
2250     uint pageBodySize = drflac_ogg__get_page_body_size(&header);
2251     if (header.serialNumber == oggbs.serialNumber) {
2252       oggbs.currentPageHeader = header;
2253       oggbs.bytesRemainingInPage = pageBodySize;
2254       return true;
2255     }
2256     // If we get here it means the page is not a FLAC page - skip it.
2257     if (pageBodySize > 0 && !drflac_oggbs__seek_physical(oggbs, pageBodySize, drflac_seek_origin_current)) return false; // <-- Safe cast - maximum size of a page is way below that of an int.
2258   }
2259 }
2260 
2261 size_t drflac__on_read_ogg (void* pUserData, void* bufferOut, size_t bytesToRead) {
2262   drflac_oggbs* oggbs = cast(drflac_oggbs*)pUserData;
2263   assert(oggbs !is null);
2264 
2265   ubyte* pRunningBufferOut = cast(ubyte*)bufferOut;
2266 
2267   // Reading is done page-by-page. If we've run out of bytes in the page we need to move to the next one.
2268   size_t bytesRead = 0;
2269   while (bytesRead < bytesToRead) {
2270     size_t bytesRemainingToRead = bytesToRead-bytesRead;
2271 
2272     if (oggbs.bytesRemainingInPage >= bytesRemainingToRead) {
2273       bytesRead += oggbs.rs.read(pRunningBufferOut, bytesRemainingToRead);
2274       oggbs.bytesRemainingInPage -= cast(uint)bytesRemainingToRead;
2275       break;
2276     }
2277 
2278     // If we get here it means some of the requested data is contained in the next pages.
2279     if (oggbs.bytesRemainingInPage > 0) {
2280       size_t bytesJustRead = oggbs.rs.read(pRunningBufferOut, oggbs.bytesRemainingInPage);
2281       bytesRead += bytesJustRead;
2282       pRunningBufferOut += bytesJustRead;
2283       if (bytesJustRead != oggbs.bytesRemainingInPage) break;  // Ran out of data.
2284     }
2285 
2286     assert(bytesRemainingToRead > 0);
2287     if (!drflac_oggbs__goto_next_page(oggbs)) break;  // Failed to go to the next chunk. Might have simply hit the end of the stream.
2288   }
2289 
2290   oggbs.currentBytePos += bytesRead;
2291   return bytesRead;
2292 }
2293 
2294 bool drflac__on_seek_ogg (void* pUserData, int offset, drflac_seek_origin origin) {
2295   drflac_oggbs* oggbs = cast(drflac_oggbs*)pUserData;
2296   assert(oggbs !is null);
2297   assert(offset > 0 || (offset == 0 && origin == drflac_seek_origin_start));
2298 
2299   // Seeking is always forward which makes things a lot simpler.
2300   if (origin == drflac_seek_origin_start) {
2301     int startBytePos = cast(int)oggbs.firstBytePos+(79-42);  // 79 = size of bos page; 42 = size of FLAC header data. Seek up to the first byte of the native FLAC data.
2302     if (!drflac_oggbs__seek_physical(oggbs, startBytePos, drflac_seek_origin_start)) return false;
2303     oggbs.currentPageHeader = oggbs.bosPageHeader;
2304     oggbs.bytesRemainingInPage = 42;   // 42 = size of the native FLAC header data. That's our start point for seeking.
2305     return drflac__on_seek_ogg(pUserData, offset, drflac_seek_origin_current);
2306   }
2307 
2308   assert(origin == drflac_seek_origin_current);
2309 
2310   int bytesSeeked = 0;
2311   while (bytesSeeked < offset) {
2312     int bytesRemainingToSeek = offset-bytesSeeked;
2313     assert(bytesRemainingToSeek >= 0);
2314 
2315     if (oggbs.bytesRemainingInPage >= cast(size_t)bytesRemainingToSeek) {
2316       if (!drflac_oggbs__seek_physical(oggbs, bytesRemainingToSeek, drflac_seek_origin_current)) return false;
2317       bytesSeeked += bytesRemainingToSeek;
2318       oggbs.bytesRemainingInPage -= bytesRemainingToSeek;
2319       break;
2320     }
2321 
2322     // If we get here it means some of the requested data is contained in the next pages.
2323     if (oggbs.bytesRemainingInPage > 0) {
2324       if (!drflac_oggbs__seek_physical(oggbs, oggbs.bytesRemainingInPage, drflac_seek_origin_current)) return false;
2325       bytesSeeked += cast(int)oggbs.bytesRemainingInPage;
2326     }
2327 
2328     assert(bytesRemainingToSeek > 0);
2329     if (!drflac_oggbs__goto_next_page(oggbs)) break;  // Failed to go to the next chunk. Might have simply hit the end of the stream.
2330   }
2331 
2332   return true;
2333 }
2334 
2335 bool drflac_ogg__seek_to_sample (drflac* pFlac, ulong sample) {
2336   drflac_oggbs* oggbs = cast(drflac_oggbs*)((cast(int*)pFlac.pExtraData)+pFlac.maxBlockSize*pFlac.channels);
2337 
2338   ulong originalBytePos = oggbs.currentBytePos;   // For recovery.
2339 
2340   // First seek to the first frame.
2341   if (!drflac__seek_to_byte(&pFlac.bs, pFlac.firstFramePos)) return false;
2342   oggbs.bytesRemainingInPage = 0;
2343 
2344   ulong runningGranulePosition = 0;
2345   ulong runningFrameBytePos = oggbs.currentBytePos;   // <-- Points to the OggS identifier.
2346   for (;;) {
2347     if (!drflac_oggbs__goto_next_page(oggbs)) {
2348       drflac_oggbs__seek_physical(oggbs, originalBytePos, drflac_seek_origin_start);
2349       return false;   // Never did find that sample...
2350     }
2351 
2352     runningFrameBytePos = oggbs.currentBytePos-drflac_ogg__get_page_header_size(&oggbs.currentPageHeader);
2353     if (oggbs.currentPageHeader.granulePosition*pFlac.channels >= sample) break; // The sample is somewhere in the previous page.
2354 
2355     // At this point we know the sample is not in the previous page. It could possibly be in this page. For simplicity we
2356     // disregard any pages that do not begin a fresh packet.
2357     if ((oggbs.currentPageHeader.headerType&0x01) == 0) {    // <-- Is it a fresh page?
2358       if (oggbs.currentPageHeader.segmentTable.ptr[0] >= 2) {
2359         ubyte[2] firstBytesInPage;
2360         if (drflac_oggbs__read_physical(oggbs, firstBytesInPage.ptr, 2) != 2) {
2361           drflac_oggbs__seek_physical(oggbs, originalBytePos, drflac_seek_origin_start);
2362           return false;
2363         }
2364         if ((firstBytesInPage.ptr[0] == 0xFF) && (firstBytesInPage.ptr[1]&0xFC) == 0xF8) {    // <-- Does the page begin with a frame's sync code?
2365           runningGranulePosition = oggbs.currentPageHeader.granulePosition*pFlac.channels;
2366         }
2367 
2368         if (!drflac_oggbs__seek_physical(oggbs, cast(int)oggbs.bytesRemainingInPage-2, drflac_seek_origin_current)) {
2369           drflac_oggbs__seek_physical(oggbs, originalBytePos, drflac_seek_origin_start);
2370           return false;
2371         }
2372 
2373         continue;
2374       }
2375     }
2376 
2377     if (!drflac_oggbs__seek_physical(oggbs, cast(int)oggbs.bytesRemainingInPage, drflac_seek_origin_current)) {
2378       drflac_oggbs__seek_physical(oggbs, originalBytePos, drflac_seek_origin_start);
2379       return false;
2380     }
2381   }
2382 
2383   // We found the page that that is closest to the sample, so now we need to find it. The first thing to do is seek to the
2384   // start of that page. In the loop above we checked that it was a fresh page which means this page is also the start of
2385   // a new frame. This property means that after we've seeked to the page we can immediately start looping over frames until
2386   // we find the one containing the target sample.
2387   if (!drflac_oggbs__seek_physical(oggbs, runningFrameBytePos, drflac_seek_origin_start)) return false;
2388   if (!drflac_oggbs__goto_next_page(oggbs)) return false;
2389 
2390   // At this point we'll be sitting on the first byte of the frame header of the first frame in the page. We just keep
2391   // looping over these frames until we find the one containing the sample we're after.
2392   ulong firstSampleInFrame = runningGranulePosition;
2393   for (;;) {
2394     // NOTE for later: When using Ogg's page/segment based seeking later on we can't use this function (or any drflac__*
2395     // reading functions) because otherwise it will pull extra data for use in it's own internal caches which will then
2396     // break the positioning of the read pointer for the Ogg bitstream.
2397     if (!drflac__read_next_frame_header(&pFlac.bs, pFlac.bitsPerSample, &pFlac.currentFrame.header)) return false;
2398 
2399     int channels = drflac__get_channel_count_from_channel_assignment(pFlac.currentFrame.header.channelAssignment);
2400     ulong lastSampleInFrame = firstSampleInFrame+(pFlac.currentFrame.header.blockSize*channels);
2401     lastSampleInFrame -= 1; // <-- Zero based.
2402 
2403     if (sample >= firstSampleInFrame && sample <= lastSampleInFrame) break;  // The sample is in this frame.
2404 
2405     // If we get here it means the sample is not in this frame so we need to move to the next one. Now the cool thing
2406     // with Ogg is that we can efficiently seek past the frame by looking at the lacing values of each segment in
2407     // the page.
2408     firstSampleInFrame = lastSampleInFrame+1;
2409 
2410     version(all) {
2411       // Slow way. This uses the native FLAC decoder to seek past the frame. This is slow because it needs to do a partial
2412       // decode of the frame. Although this is how the native version works, we can use Ogg's framing system to make it
2413       // more efficient. Leaving this here for reference and to use as a basis for debugging purposes.
2414       if (!drflac__seek_to_next_frame(pFlac)) return false;
2415     } else {
2416       // TODO: This is not yet complete. See note at the top of this loop body.
2417 
2418       // Fast(er) way. This uses Ogg's framing system to seek past the frame. This should be much more efficient than the
2419       // native FLAC seeking.
2420       if (!drflac_oggbs__seek_to_next_frame(oggbs)) return false;
2421     }
2422   }
2423 
2424   assert(firstSampleInFrame <= sample);
2425 
2426   if (!drflac__decode_frame(pFlac)) return false;
2427 
2428   size_t samplesToDecode = cast(size_t)(sample-firstSampleInFrame);    // <-- Safe cast because the maximum number of samples in a frame is 65535.
2429   return drflac_read_s32(pFlac, samplesToDecode, null) == samplesToDecode;
2430 }
2431 
2432 
2433 bool drflac__init_private__ogg (drflac_init_info* pInit, ref ReadStruct rs, scope drflac_meta_proc onMeta, void* pUserDataMD) {
2434   // Pre: The bit stream should be sitting just past the 4-byte OggS capture pattern.
2435 
2436   pInit.container = drflac_container_ogg;
2437   pInit.oggFirstBytePos = 0;
2438 
2439   // We'll get here if the first 4 bytes of the stream were the OggS capture pattern, however it doesn't necessarily mean the
2440   // stream includes FLAC encoded audio. To check for this we need to scan the beginning-of-stream page markers and check if
2441   // any match the FLAC specification. Important to keep in mind that the stream may be multiplexed.
2442   drflac_ogg_page_header header;
2443 
2444   uint headerSize = 0;
2445   if (!drflac_ogg__read_page_header_after_capture_pattern(rs, &header, &headerSize)) return false;
2446   pInit.runningFilePos += headerSize;
2447 
2448   for (;;) {
2449     // Break if we're past the beginning of stream page.
2450     if ((header.headerType&0x02) == 0) return false;
2451 
2452     // Check if it's a FLAC header.
2453     int pageBodySize = drflac_ogg__get_page_body_size(&header);
2454     if (pageBodySize == 51) { // 51 = the lacing value of the FLAC header packet.
2455       // It could be a FLAC page...
2456       uint bytesRemainingInPage = pageBodySize;
2457 
2458       ubyte packetType;
2459       if (rs.read(&packetType, 1) != 1) return false;
2460 
2461       bytesRemainingInPage -= 1;
2462       if (packetType == 0x7F) {
2463         // Increasingly more likely to be a FLAC page...
2464         ubyte[4] sig;
2465         if (rs.read(sig.ptr, 4) != 4) return false;
2466 
2467         bytesRemainingInPage -= 4;
2468         if (sig.ptr[0] == 'F' && sig.ptr[1] == 'L' && sig.ptr[2] == 'A' && sig.ptr[3] == 'C') {
2469           // Almost certainly a FLAC page...
2470           ubyte[2] mappingVersion;
2471           if (rs.read(mappingVersion.ptr, 2) != 2) return false;
2472 
2473           if (mappingVersion.ptr[0] != 1) return false;   // Only supporting version 1.x of the Ogg mapping.
2474 
2475           // The next 2 bytes are the non-audio packets, not including this one. We don't care about this because we're going to
2476           // be handling it in a generic way based on the serial number and packet types.
2477           if (!rs.seek(2, drflac_seek_origin_current)) return false;
2478 
2479           // Expecting the native FLAC signature "fLaC".
2480           if (rs.read(sig.ptr, 4) != 4) return false;
2481 
2482           if (sig.ptr[0] == 'f' && sig.ptr[1] == 'L' && sig.ptr[2] == 'a' && sig.ptr[3] == 'C') {
2483             // The remaining data in the page should be the STREAMINFO block.
2484             ubyte isLastBlock;
2485             ubyte blockType;
2486             uint blockSize;
2487             if (!drflac__read_and_decode_block_header(rs, &isLastBlock, &blockType, &blockSize)) return false;
2488 
2489             if (blockType != DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) return false;    // Invalid block type. First block must be the STREAMINFO block.
2490 
2491             drflac_streaminfo streaminfo;
2492             if (drflac__read_streaminfo(rs, &streaminfo)) {
2493               // Success!
2494               pInit.sampleRate       = streaminfo.sampleRate;
2495               pInit.channels         = streaminfo.channels;
2496               pInit.bitsPerSample    = streaminfo.bitsPerSample;
2497               pInit.totalSampleCount = streaminfo.totalSampleCount;
2498               pInit.maxBlockSize     = streaminfo.maxBlockSize;
2499 
2500               if (onMeta !is null) {
2501                 drflac_metadata metadata;
2502                 metadata.type = DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO;
2503                 metadata.pRawData = null;
2504                 metadata.rawDataSize = 0;
2505                 metadata.data.streaminfo = streaminfo;
2506                 try { onMeta(pUserDataMD, &metadata); } catch (Exception e) { return false; }
2507               }
2508 
2509               pInit.runningFilePos  += pageBodySize;
2510               pInit.oggFirstBytePos  = pInit.runningFilePos-79;   // Subtracting 79 will place us right on top of the "OggS" identifier of the FLAC bos page.
2511               pInit.oggSerial        = header.serialNumber;
2512               pInit.oggBosHeader     = header;
2513               break;
2514             } else {
2515               // Failed to read STREAMINFO block. Aww, so close...
2516               return false;
2517             }
2518           } else {
2519             // Invalid file.
2520             return false;
2521           }
2522         } else {
2523           // Not a FLAC header. Skip it.
2524           if (!rs.seek(bytesRemainingInPage, drflac_seek_origin_current)) return false;
2525         }
2526       } else {
2527         // Not a FLAC header. Seek past the entire page and move on to the next.
2528         if (!rs.seek(bytesRemainingInPage, drflac_seek_origin_current)) return false;
2529       }
2530     } else {
2531       if (!rs.seek(pageBodySize, drflac_seek_origin_current)) return false;
2532     }
2533 
2534     pInit.runningFilePos += pageBodySize;
2535 
2536     // Read the header of the next page.
2537     if (!drflac_ogg__read_page_header(rs, &header, &headerSize)) return false;
2538     pInit.runningFilePos += headerSize;
2539   }
2540 
2541 
2542   // If we get here it means we found a FLAC audio stream. We should be sitting on the first byte of the header of the next page. The next
2543   // packets in the FLAC logical stream contain the metadata. The only thing left to do in the initialiation phase for Ogg is to create the
2544   // Ogg bistream object.
2545   pInit.hasMetadataBlocks = true;    // <-- Always have at least VORBIS_COMMENT metadata block.
2546   return true;
2547 }
2548 //#endif
2549 
2550 bool drflac__check_init_private (drflac_init_info* pInit, scope drflac_meta_proc onMeta, void* pUserDataMD) {
2551   ubyte[4] id;
2552   if (pInit.rs.read(id.ptr, 4) != 4) return false;
2553   if (id.ptr[0] == 'f' && id.ptr[1] == 'L' && id.ptr[2] == 'a' && id.ptr[3] == 'C') return drflac__init_private__native(pInit, pInit.rs, onMeta, pUserDataMD);
2554 //#ifndef DR_FLAC_NO_OGG
2555   if (id.ptr[0] == 'O' && id.ptr[1] == 'g' && id.ptr[2] == 'g' && id.ptr[3] == 'S') return drflac__init_private__ogg(pInit, pInit.rs, onMeta, pUserDataMD);
2556 //#endif
2557   // unsupported container
2558   return false;
2559 }
2560 
2561 bool drflac__init_private (drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, scope drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD) {
2562   if (pInit is null || onRead is null || onSeek is null) return false;
2563 
2564   pInit.rs.onReadCB  = onRead;
2565   pInit.rs.onSeekCB  = onSeek;
2566   pInit.rs.pUserData = pUserData;
2567   //pInit.onMeta       = onMeta;
2568   //pInit.pUserDataMD  = pUserDataMD;
2569 
2570   return drflac__check_init_private(pInit, onMeta, pUserDataMD);
2571 }
2572 
2573 } //nothrow
2574 
2575 nothrow {
2576 void drflac__init_from_info (drflac* pFlac, drflac_init_info* pInit) {
2577   import core.stdc.string : memcpy, memset;
2578   assert(pFlac !is null);
2579   assert(pInit !is null);
2580 
2581   memset(pFlac, 0, (*pFlac).sizeof);
2582   pFlac.bs.rs            = pInit.rs;
2583   pFlac.bs.nextL2Line    = (pFlac.bs.cacheL2).sizeof/(pFlac.bs.cacheL2.ptr[0]).sizeof; // <-- Initialize to this to force a client-side data retrieval right from the start.
2584   pFlac.bs.consumedBits  = (pFlac.bs.cache).sizeof*8;
2585 
2586   //pFlac.onMeta           = pInit.onMeta;
2587   //pFlac.pUserDataMD      = pInit.pUserDataMD;
2588   pFlac.maxBlockSize     = pInit.maxBlockSize;
2589   pFlac.sampleRate       = pInit.sampleRate;
2590   pFlac.channels         = cast(ubyte)pInit.channels;
2591   pFlac.bitsPerSample    = cast(ubyte)pInit.bitsPerSample;
2592   pFlac.totalSampleCount = pInit.totalSampleCount;
2593   pFlac.container        = pInit.container;
2594 }
2595 
2596 drflac* drflac_open_with_metadata_private_xx (drflac_init_info* init, scope drflac_meta_proc onMeta, void* pUserDataMD, bool stdio) {
2597   import core.stdc.stdlib : malloc, free;
2598   import core.stdc.string : memset;
2599 
2600   size_t allocationSize = (drflac).sizeof;
2601   allocationSize += init.maxBlockSize*init.channels*(int).sizeof;
2602   //allocationSize += init.seektableSize;
2603 
2604 //#ifndef DR_FLAC_NO_OGG
2605   // There's additional data required for Ogg streams.
2606   if (init.container == drflac_container_ogg) allocationSize += (drflac_oggbs).sizeof;
2607 //#endif
2608 
2609   drflac* pFlac = cast(drflac*)malloc(allocationSize);
2610   memset(pFlac, 0, (*pFlac).sizeof);
2611   drflac__init_from_info(pFlac, init);
2612   pFlac.pDecodedSamples = cast(int*)pFlac.pExtraData;
2613 
2614 //#ifndef DR_FLAC_NO_OGG
2615   if (init.container == drflac_container_ogg) {
2616     drflac_oggbs* oggbs = cast(drflac_oggbs*)((cast(int*)pFlac.pExtraData)+init.maxBlockSize*init.channels);
2617     oggbs.stdio = stdio;
2618     oggbs.rs = init.rs;
2619     oggbs.currentBytePos = init.oggFirstBytePos;
2620     oggbs.firstBytePos = init.oggFirstBytePos;
2621     oggbs.serialNumber = init.oggSerial;
2622     oggbs.bosPageHeader = init.oggBosHeader;
2623     oggbs.bytesRemainingInPage = 0;
2624 
2625     // The Ogg bistream needs to be layered on top of the original bitstream.
2626     pFlac.bs.rs.onReadCB = &drflac__on_read_ogg;
2627     pFlac.bs.rs.onSeekCB = &drflac__on_seek_ogg;
2628     pFlac.bs.rs.pUserData = cast(void*)oggbs;
2629   }
2630 //#endif
2631 
2632   // Decode metadata before returning.
2633   if (init.hasMetadataBlocks) {
2634     if (!drflac__read_and_decode_metadata(pFlac, onMeta, pUserDataMD)) {
2635       free(pFlac);
2636       return null;
2637     }
2638   }
2639 
2640   return pFlac;
2641 }
2642 
2643 
2644 drflac* drflac_open_with_metadata_private (drflac_read_proc onRead, drflac_seek_proc onSeek, scope drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, bool stdio) {
2645   drflac_init_info init;
2646   if (!drflac__init_private(&init, onRead, onSeek, onMeta, pUserData, pUserDataMD)) return null;
2647   return drflac_open_with_metadata_private_xx(&init, onMeta, pUserDataMD, stdio);
2648 }
2649 
2650 } //nothrow
2651 
2652 nothrow {
2653 alias drflac_file = void*;
2654 
2655 size_t drflac__on_read_stdio (void* pUserData, void* bufferOut, size_t bytesToRead) {
2656   import core.stdc.stdio;
2657   return fread(bufferOut, 1, bytesToRead, cast(FILE*)pUserData);
2658 }
2659 
2660 bool drflac__on_seek_stdio (void* pUserData, int offset, drflac_seek_origin origin) {
2661   import core.stdc.stdio;
2662   assert(offset > 0 || (offset == 0 && origin == drflac_seek_origin_start));
2663   return fseek(cast(FILE*)pUserData, offset, (origin == drflac_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;
2664 }
2665 
2666 drflac_file drflac__open_file_handle (const(char)[] filename) {
2667   import std.internal.cstring : tempCString;
2668   import core.stdc.stdio;
2669   FILE* pFile = fopen(filename.tempCString, "rb");
2670   if (pFile is null) return null;
2671   return cast(drflac_file)pFile;
2672 }
2673 
2674 void drflac__close_file_handle (drflac_file file) {
2675   import core.stdc.stdio;
2676   fclose(cast(FILE*)file);
2677 }
2678 
2679 deprecated public drflac* drflac_open_file (const(char)[] filename) {
2680   
2681 
2682   drflac_file file = drflac__open_file_handle(filename);
2683   if (file is null) return null;
2684 
2685   drflac* pFlac = drflac_open(&drflac__on_read_stdio, &drflac__on_seek_stdio, cast(void*)file);
2686   if (pFlac is null) {
2687     drflac__close_file_handle(file);
2688     return null;
2689   }
2690   pFlac.bs.stdio = true;
2691 
2692   return pFlac;
2693 }
2694 
2695 deprecated  public drflac* drflac_open_file_with_metadata (const(char)[] filename, scope drflac_meta_proc onMeta, void* pUserData=null) {
2696 
2697   drflac_file file = drflac__open_file_handle(filename);
2698   if (file is null) return null;
2699 
2700   drflac* pFlac = drflac_open_with_metadata_private(&drflac__on_read_stdio, &drflac__on_seek_stdio, onMeta, cast(void*)file, pUserData, true);
2701   if (pFlac is null) {
2702     drflac__close_file_handle(file);
2703     return pFlac;
2704   }
2705   pFlac.bs.stdio = true;
2706 
2707   return pFlac;
2708 }
2709 
2710 } //nothrow
2711 
2712 nothrow {
2713 
2714 size_t drflac__on_read_memory (void* pUserData, void* bufferOut, size_t bytesToRead) {
2715   drflac__memory_stream* memoryStream = cast(drflac__memory_stream*)pUserData;
2716   assert(memoryStream !is null);
2717   assert(memoryStream.dataSize >= memoryStream.currentReadPos);
2718 
2719   size_t bytesRemaining = memoryStream.dataSize-memoryStream.currentReadPos;
2720   if (bytesToRead > bytesRemaining) bytesToRead = bytesRemaining;
2721 
2722   if (bytesToRead > 0) {
2723     import core.stdc.string : memcpy;
2724     memcpy(bufferOut, memoryStream.data+memoryStream.currentReadPos, bytesToRead);
2725     memoryStream.currentReadPos += bytesToRead;
2726   }
2727 
2728   return bytesToRead;
2729 }
2730 
2731 bool drflac__on_seek_memory (void* pUserData, int offset, drflac_seek_origin origin) {
2732   drflac__memory_stream* memoryStream = cast(drflac__memory_stream*)pUserData;
2733   assert(memoryStream !is null);
2734   assert(offset > 0 || (offset == 0 && origin == drflac_seek_origin_start));
2735 
2736   if (origin == drflac_seek_origin_current) {
2737     if (memoryStream.currentReadPos+offset <= memoryStream.dataSize) {
2738       memoryStream.currentReadPos += offset;
2739     } else {
2740       memoryStream.currentReadPos = memoryStream.dataSize;  // Trying to seek too far forward.
2741     }
2742   } else {
2743     if (cast(uint)offset <= memoryStream.dataSize) {
2744       memoryStream.currentReadPos = offset;
2745     } else {
2746       memoryStream.currentReadPos = memoryStream.dataSize;  // Trying to seek too far forward.
2747     }
2748   }
2749 
2750   return true;
2751 }
2752 
2753 public drflac* drflac_open_memory (const(void)* data, size_t dataSize) {
2754 
2755   drflac__memory_stream memoryStream;
2756   memoryStream.data = cast(const(ubyte)*)data;
2757   memoryStream.dataSize = dataSize;
2758   memoryStream.currentReadPos = 0;
2759 
2760   drflac* pFlac = drflac_open(&drflac__on_read_memory, &drflac__on_seek_memory, &memoryStream);
2761   if (pFlac is null) return null;
2762 
2763   pFlac.memoryStream = memoryStream;
2764 
2765   // This is an awful hack...
2766 //#ifndef DR_FLAC_NO_OGG
2767   if (pFlac.container == drflac_container_ogg) {
2768     drflac_oggbs* oggbs = cast(drflac_oggbs*)((cast(int*)pFlac.pExtraData)+pFlac.maxBlockSize*pFlac.channels);
2769     oggbs.rs.pUserData = &pFlac.memoryStream;
2770   }
2771   else
2772 //#endif
2773   {
2774     pFlac.bs.rs.pUserData = &pFlac.memoryStream;
2775   }
2776 
2777   return pFlac;
2778 }
2779 
2780 public drflac* drflac_open_memory_with_metadata (const(void)* data, size_t dataSize, scope drflac_meta_proc onMeta, void* pUserData) {
2781 
2782   drflac__memory_stream memoryStream;
2783   memoryStream.data = cast(const(ubyte)*)data;
2784   memoryStream.dataSize = dataSize;
2785   memoryStream.currentReadPos = 0;
2786 
2787   drflac* pFlac = drflac_open_with_metadata_private(&drflac__on_read_memory, &drflac__on_seek_memory, onMeta, &memoryStream, pUserData, false);
2788   if (pFlac is null) return null;
2789 
2790   pFlac.memoryStream = memoryStream;
2791 
2792   // This is an awful hack...
2793 //#ifndef DR_FLAC_NO_OGG
2794   if (pFlac.container == drflac_container_ogg) {
2795     drflac_oggbs* oggbs = cast(drflac_oggbs*)((cast(int*)pFlac.pExtraData)+pFlac.maxBlockSize*pFlac.channels);
2796     oggbs.rs.pUserData = &pFlac.memoryStream;
2797   } else
2798 //#endif
2799   {
2800     pFlac.bs.rs.pUserData = &pFlac.memoryStream;
2801   }
2802 
2803   return pFlac;
2804 }
2805 
2806 public drflac* drflac_open (drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData) {
2807   return drflac_open_with_metadata_private(onRead, onSeek, null, pUserData, pUserData, false);
2808 }
2809 
2810 } //nothrow
2811 
2812 
2813 nothrow {
2814 
2815 public drflac* drflac_open_with_metadata (drflac_read_proc onRead, drflac_seek_proc onSeek, scope drflac_meta_proc onMeta, void* pUserData) {
2816   return drflac_open_with_metadata_private(onRead, onSeek, onMeta, pUserData, pUserData, false);
2817 }
2818 
2819 public void drflac_close (drflac* pFlac) {
2820   import core.stdc.stdlib : free;
2821   if (pFlac is null) return;
2822 
2823   // If we opened the file with drflac_open_file() we will want to close the file handle. We can know whether or not drflac_open_file()
2824   // was used by looking at the callbacks.
2825   //if (pFlac.bs.onRead == drflac__on_read_stdio) drflac__close_file_handle(cast(drflac_file)pFlac.bs.pUserData);
2826   if (pFlac.bs.stdio) drflac__close_file_handle(cast(drflac_file)pFlac.bs.rs.pUserData);
2827 
2828 //#ifndef DR_FLAC_NO_OGG
2829   // Need to clean up Ogg streams a bit differently due to the way the bit streaming is chained.
2830   if (pFlac.container == drflac_container_ogg) {
2831     //assert(pFlac.bs.onRead == drflac__on_read_ogg);
2832     drflac_oggbs* oggbs = cast(drflac_oggbs*)(cast(int*)pFlac.pExtraData+pFlac.maxBlockSize*pFlac.channels);
2833     //if (oggbs.onRead == drflac__on_read_stdio) drflac__close_file_handle(cast(drflac_file)oggbs.pUserData);
2834     if (oggbs.stdio) drflac__close_file_handle(cast(drflac_file)oggbs.rs.pUserData);
2835   }
2836 //#endif
2837   free(pFlac);
2838 }
2839 
2840 
2841 ulong drflac__read_s32__misaligned (drflac* pFlac, ulong samplesToRead, int* bufferOut) {
2842   uint channelCount = drflac__get_channel_count_from_channel_assignment(pFlac.currentFrame.header.channelAssignment);
2843 
2844   // We should never be calling this when the number of samples to read is >= the sample count.
2845   assert(samplesToRead < channelCount);
2846   assert(pFlac.currentFrame.samplesRemaining > 0 && samplesToRead <= pFlac.currentFrame.samplesRemaining);
2847 
2848   ulong samplesRead = 0;
2849   while (samplesToRead > 0) {
2850     ulong totalSamplesInFrame = pFlac.currentFrame.header.blockSize*channelCount;
2851     ulong samplesReadFromFrameSoFar = totalSamplesInFrame-pFlac.currentFrame.samplesRemaining;
2852     uint channelIndex = samplesReadFromFrameSoFar%channelCount;
2853 
2854     ulong nextSampleInFrame = samplesReadFromFrameSoFar/channelCount;
2855 
2856     int decodedSample = 0;
2857     switch (pFlac.currentFrame.header.channelAssignment) {
2858       case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:
2859         if (channelIndex == 0) {
2860           decodedSample = pFlac.currentFrame.subframes.ptr[channelIndex].pDecodedSamples[cast(uint)nextSampleInFrame];
2861         } else {
2862           int side = pFlac.currentFrame.subframes.ptr[channelIndex+0].pDecodedSamples[cast(uint)nextSampleInFrame];
2863           int left = pFlac.currentFrame.subframes.ptr[channelIndex-1].pDecodedSamples[cast(uint)nextSampleInFrame];
2864           decodedSample = left-side;
2865         }
2866         break;
2867 
2868       case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:
2869         if (channelIndex == 0) {
2870           int side  = pFlac.currentFrame.subframes.ptr[channelIndex+0].pDecodedSamples[cast(uint)nextSampleInFrame];
2871           int right = pFlac.currentFrame.subframes.ptr[channelIndex+1].pDecodedSamples[cast(uint)nextSampleInFrame];
2872           decodedSample = side+right;
2873         } else {
2874           decodedSample = pFlac.currentFrame.subframes.ptr[channelIndex].pDecodedSamples[cast(uint)nextSampleInFrame];
2875         }
2876         break;
2877 
2878       case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE:
2879         int mid;
2880         int side;
2881         if (channelIndex == 0) {
2882           mid  = pFlac.currentFrame.subframes.ptr[channelIndex+0].pDecodedSamples[cast(uint)nextSampleInFrame];
2883           side = pFlac.currentFrame.subframes.ptr[channelIndex+1].pDecodedSamples[cast(uint)nextSampleInFrame];
2884           mid = ((cast(uint)mid)<<1)|(side&0x01);
2885           decodedSample = (mid+side)>>1;
2886         } else {
2887           mid  = pFlac.currentFrame.subframes.ptr[channelIndex-1].pDecodedSamples[cast(uint)nextSampleInFrame];
2888           side = pFlac.currentFrame.subframes.ptr[channelIndex+0].pDecodedSamples[cast(uint)nextSampleInFrame];
2889           mid = ((cast(uint)mid)<<1)|(side&0x01);
2890           decodedSample = (mid-side)>>1;
2891         }
2892         break;
2893 
2894       case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT: goto default;
2895       default:
2896         decodedSample = pFlac.currentFrame.subframes.ptr[channelIndex].pDecodedSamples[cast(uint)nextSampleInFrame];
2897         break;
2898     }
2899 
2900     decodedSample <<= ((32-pFlac.bitsPerSample)+pFlac.currentFrame.subframes.ptr[channelIndex].wastedBitsPerSample);
2901 
2902     if (bufferOut) *bufferOut++ = decodedSample;
2903 
2904     samplesRead += 1;
2905     pFlac.currentFrame.samplesRemaining -= 1;
2906     samplesToRead -= 1;
2907   }
2908 
2909   return samplesRead;
2910 }
2911 
2912 ulong drflac__seek_forward_by_samples (drflac* pFlac, ulong samplesToRead) {
2913   ulong samplesRead = 0;
2914   while (samplesToRead > 0) {
2915     if (pFlac.currentFrame.samplesRemaining == 0) {
2916       if (!drflac__read_and_decode_next_frame(pFlac)) break;  // Couldn't read the next frame, so just break from the loop and return.
2917     } else {
2918       samplesRead += 1;
2919       pFlac.currentFrame.samplesRemaining -= 1;
2920       samplesToRead -= 1;
2921     }
2922   }
2923   return samplesRead;
2924 }
2925 
2926 public ulong drflac_read_s32 (drflac* pFlac, ulong samplesToRead, int* bufferOut) {
2927   // Note that <bufferOut> is allowed to be null, in which case this will be treated as something like a seek.
2928   if (pFlac is null || samplesToRead == 0) return 0;
2929 
2930   if (bufferOut is null) 
2931   {
2932      // wtf
2933      return drflac__seek_forward_by_samples(pFlac, samplesToRead);
2934   }
2935 
2936   ulong samplesRead = 0;
2937   while (samplesToRead > 0) {
2938     // If we've run out of samples in this frame, go to the next.
2939     if (pFlac.currentFrame.samplesRemaining == 0) {
2940       if (!drflac__read_and_decode_next_frame(pFlac)) break;  // Couldn't read the next frame, so just break from the loop and return.
2941     } else {
2942       // Here is where we grab the samples and interleave them.
2943 
2944       uint channelCount = drflac__get_channel_count_from_channel_assignment(pFlac.currentFrame.header.channelAssignment);
2945       ulong totalSamplesInFrame = pFlac.currentFrame.header.blockSize*channelCount;
2946       ulong samplesReadFromFrameSoFar = totalSamplesInFrame-pFlac.currentFrame.samplesRemaining;
2947 
2948       int misalignedSampleCount = cast(int)(samplesReadFromFrameSoFar%channelCount);
2949       if (misalignedSampleCount > 0) {
2950         ulong misalignedSamplesRead = drflac__read_s32__misaligned(pFlac, misalignedSampleCount, bufferOut);
2951         samplesRead   += misalignedSamplesRead;
2952         samplesReadFromFrameSoFar += misalignedSamplesRead;
2953         bufferOut     += misalignedSamplesRead;
2954         samplesToRead -= misalignedSamplesRead;
2955       }
2956 
2957       ulong alignedSampleCountPerChannel = samplesToRead/channelCount;
2958       if (alignedSampleCountPerChannel > pFlac.currentFrame.samplesRemaining/channelCount) {
2959         alignedSampleCountPerChannel = pFlac.currentFrame.samplesRemaining/channelCount;
2960       }
2961 
2962       ulong firstAlignedSampleInFrame = samplesReadFromFrameSoFar/channelCount;
2963       uint unusedBitsPerSample = 32-pFlac.bitsPerSample;
2964 
2965       switch (pFlac.currentFrame.header.channelAssignment) {
2966         case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:
2967           const int* pDecodedSamples0 = pFlac.currentFrame.subframes.ptr[0].pDecodedSamples+firstAlignedSampleInFrame;
2968           const int* pDecodedSamples1 = pFlac.currentFrame.subframes.ptr[1].pDecodedSamples+firstAlignedSampleInFrame;
2969 
2970           for (/*ulong*/uint i = 0; i < alignedSampleCountPerChannel; ++i) {
2971             int left  = pDecodedSamples0[i];
2972             int side  = pDecodedSamples1[i];
2973             int right = left-side;
2974             bufferOut[i*2+0] = left<<(unusedBitsPerSample+pFlac.currentFrame.subframes.ptr[0].wastedBitsPerSample);
2975             bufferOut[i*2+1] = right<<(unusedBitsPerSample+pFlac.currentFrame.subframes.ptr[1].wastedBitsPerSample);
2976           }
2977           break;
2978 
2979         case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:
2980           const int* pDecodedSamples0 = pFlac.currentFrame.subframes.ptr[0].pDecodedSamples+firstAlignedSampleInFrame;
2981           const int* pDecodedSamples1 = pFlac.currentFrame.subframes.ptr[1].pDecodedSamples+firstAlignedSampleInFrame;
2982           for (/*ulong*/uint i = 0; i < alignedSampleCountPerChannel; ++i) {
2983             int side  = pDecodedSamples0[i];
2984             int right = pDecodedSamples1[i];
2985             int left  = right+side;
2986             bufferOut[i*2+0] = left<<(unusedBitsPerSample+pFlac.currentFrame.subframes.ptr[0].wastedBitsPerSample);
2987             bufferOut[i*2+1] = right<<(unusedBitsPerSample+pFlac.currentFrame.subframes.ptr[1].wastedBitsPerSample);
2988           }
2989           break;
2990 
2991         case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE:
2992           const int* pDecodedSamples0 = pFlac.currentFrame.subframes.ptr[0].pDecodedSamples+firstAlignedSampleInFrame;
2993           const int* pDecodedSamples1 = pFlac.currentFrame.subframes.ptr[1].pDecodedSamples+firstAlignedSampleInFrame;
2994           for (/*ulong*/uint i = 0; i < alignedSampleCountPerChannel; ++i) {
2995             int side = pDecodedSamples1[i];
2996             int mid  = ((cast(uint)pDecodedSamples0[i])<<1)|(side&0x01);
2997             bufferOut[i*2+0] = ((mid+side)>>1)<<(unusedBitsPerSample+pFlac.currentFrame.subframes.ptr[0].wastedBitsPerSample);
2998             bufferOut[i*2+1] = ((mid-side)>>1)<<(unusedBitsPerSample+pFlac.currentFrame.subframes.ptr[1].wastedBitsPerSample);
2999           }
3000           break;
3001 
3002         case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT: goto default;
3003         default:
3004           if (pFlac.currentFrame.header.channelAssignment == 1) { // 1 = Stereo
3005             // Stereo optimized inner loop unroll.
3006             const int* pDecodedSamples0 = pFlac.currentFrame.subframes.ptr[0].pDecodedSamples+firstAlignedSampleInFrame;
3007             const int* pDecodedSamples1 = pFlac.currentFrame.subframes.ptr[1].pDecodedSamples+firstAlignedSampleInFrame;
3008             for (/*ulong*/uint i = 0; i < alignedSampleCountPerChannel; ++i) {
3009               bufferOut[i*2+0] = pDecodedSamples0[i]<<(unusedBitsPerSample+pFlac.currentFrame.subframes.ptr[0].wastedBitsPerSample);
3010               bufferOut[i*2+1] = pDecodedSamples1[i]<<(unusedBitsPerSample+pFlac.currentFrame.subframes.ptr[1].wastedBitsPerSample);
3011             }
3012           } else {
3013             // Generic interleaving.
3014             for (/*ulong*/uint i = 0; i < alignedSampleCountPerChannel; ++i) {
3015               for (uint j = 0; j < channelCount; ++j) {
3016                 bufferOut[(i*channelCount)+j] = (pFlac.currentFrame.subframes.ptr[j].pDecodedSamples[cast(uint)firstAlignedSampleInFrame+i])<<(unusedBitsPerSample+pFlac.currentFrame.subframes.ptr[j].wastedBitsPerSample);
3017               }
3018             }
3019           }
3020           break;
3021       }
3022 
3023       ulong alignedSamplesRead = alignedSampleCountPerChannel*channelCount;
3024       samplesRead   += alignedSamplesRead;
3025       samplesReadFromFrameSoFar += alignedSamplesRead;
3026       bufferOut     += alignedSamplesRead;
3027       samplesToRead -= alignedSamplesRead;
3028       pFlac.currentFrame.samplesRemaining -= cast(uint)alignedSamplesRead;
3029 
3030       // At this point we may still have some excess samples left to read.
3031       if (samplesToRead > 0 && pFlac.currentFrame.samplesRemaining > 0) {
3032         ulong excessSamplesRead = 0;
3033         if (samplesToRead < pFlac.currentFrame.samplesRemaining) {
3034           excessSamplesRead = drflac__read_s32__misaligned(pFlac, samplesToRead, bufferOut);
3035         } else {
3036           excessSamplesRead = drflac__read_s32__misaligned(pFlac, pFlac.currentFrame.samplesRemaining, bufferOut);
3037         }
3038 
3039         samplesRead   += excessSamplesRead;
3040         samplesReadFromFrameSoFar += excessSamplesRead;
3041         bufferOut     += excessSamplesRead;
3042         samplesToRead -= excessSamplesRead;
3043       }
3044     }
3045   }
3046 
3047   return samplesRead;
3048 }
3049 
3050 public bool drflac_seek_to_sample (drflac* pFlac, ulong sampleIndex) {
3051   if (pFlac is null) return false;
3052 
3053   // If we don't know where the first frame begins then we can't seek. This will happen when the STREAMINFO block was not present
3054   // when the decoder was opened.
3055   if (pFlac.firstFramePos == 0) return false;
3056 
3057   if (sampleIndex == 0) return drflac__seek_to_first_frame(pFlac);
3058 
3059   // Clamp the sample to the end.
3060   if (sampleIndex >= pFlac.totalSampleCount) sampleIndex  = pFlac.totalSampleCount-1;
3061 
3062   // Different techniques depending on encapsulation. Using the native FLAC seektable with Ogg encapsulation is a bit awkward so
3063   // we'll instead use Ogg's natural seeking facility.
3064 //#ifndef DR_FLAC_NO_OGG
3065   if (pFlac.container == drflac_container_ogg) {
3066     return drflac_ogg__seek_to_sample(pFlac, sampleIndex);
3067   }
3068   else
3069 //#endif
3070   {
3071     // First try seeking via the seek table. If this fails, fall back to a brute force seek which is much slower.
3072     if (!drflac__seek_to_sample__seek_table(pFlac, sampleIndex)) return drflac__seek_to_sample__brute_force(pFlac, sampleIndex);
3073   }
3074 
3075   return true;
3076 }
3077 
3078 public void drflac_free (void* pSampleDataReturnedByOpenAndDecode) {
3079   import core.stdc.stdlib : free;
3080   free(pSampleDataReturnedByOpenAndDecode);
3081 }
3082 
3083 
3084 public void drflac_init_vorbis_comment_iterator (drflac_vorbis_comment_iterator* pIter, uint commentCount, const(char)* pComments) {
3085   if (pIter is null) return;
3086   pIter.countRemaining = commentCount;
3087   pIter.pRunningData   = pComments;
3088 }
3089 
3090 public const(char)* drflac_next_vorbis_comment (drflac_vorbis_comment_iterator* pIter, uint* pCommentLengthOut) {
3091   // Safety.
3092   if (pCommentLengthOut) *pCommentLengthOut = 0;
3093 
3094   if (pIter is null || pIter.countRemaining == 0 || pIter.pRunningData is null) return null;
3095 
3096   uint length = drflac__le2host_32(*cast(uint*)pIter.pRunningData);
3097   pIter.pRunningData += 4;
3098 
3099   const(char)* pComment = pIter.pRunningData;
3100   pIter.pRunningData += length;
3101   pIter.countRemaining -= 1;
3102 
3103   if (pCommentLengthOut) *pCommentLengthOut = length;
3104   return pComment;
3105 }
3106 
3107 
3108 public long drflac_vorbis_comment_size (uint commentCount, const(char)* pComments) {
3109   uint res = 0;
3110   while (commentCount-- > 0) {
3111     uint length = drflac__le2host_32(*cast(uint*)pComments);
3112     pComments += 4;
3113     pComments += length;
3114     res += length+4;
3115   }
3116   return res;
3117 }
3118 
3119 }
3120 
3121 // REVISION HISTORY
3122 //
3123 // v0.3d - 11/06/2016
3124 //   - Minor clean up.
3125 //
3126 // v0.3c - 28/05/2016
3127 //   - Fixed compilation error.
3128 //
3129 // v0.3b - 16/05/2016
3130 //   - Fixed Linux/GCC build.
3131 //   - Updated documentation.
3132 //
3133 // v0.3a - 15/05/2016
3134 //   - Minor fixes to documentation.
3135 //
3136 // v0.3 - 11/05/2016
3137 //   - Optimizations. Now at about parity with the reference implementation on 32-bit builds.
3138 //   - Lots of clean up.
3139 //
3140 // v0.2b - 10/05/2016
3141 //   - Bug fixes.
3142 //
3143 // v0.2a - 10/05/2016
3144 //   - Made drflac_open_and_decode() more robust.
3145 //   - Removed an unused debugging variable
3146 //
3147 // v0.2 - 09/05/2016
3148 //   - Added support for Ogg encapsulation.
3149 //   - API CHANGE. Have the onSeek callback take a third argument which specifies whether or not the seek
3150 //     should be relative to the start or the current position. Also changes the seeking rules such that
3151 //     seeking offsets will never be negative.
3152 //   - Have drflac_open_and_decode() fail gracefully if the stream has an unknown total sample count.
3153 //
3154 // v0.1b - 07/05/2016
3155 //   - Properly close the file handle in drflac_open_file() and family when the decoder fails to initialize.
3156 //   - Removed a stale comment.
3157 //
3158 // v0.1a - 05/05/2016
3159 //   - Minor formatting changes.
3160 //   - Fixed a warning on the GCC build.
3161 //
3162 // v0.1 - 03/05/2016
3163 //   - Initial versioned release.
3164 
3165 // TODO
3166 // - Add support for initializing the decoder without a header STREAMINFO block.
3167 // - Test CUESHEET metadata blocks.
3168 
3169 
3170 /*
3171 This is free and unencumbered software released into the public domain.
3172 
3173 Anyone is free to copy, modify, publish, use, compile, sell, or
3174 distribute this software, either in source code form or as a compiled
3175 binary, for any purpose, commercial or non-commercial, and by any
3176 means.
3177 
3178 In jurisdictions that recognize copyright laws, the author or authors
3179 of this software dedicate any and all copyright interest in the
3180 software to the public domain. We make this dedication for the benefit
3181 of the public at large and to the detriment of our heirs and
3182 successors. We intend this dedication to be an overt act of
3183 relinquishment in perpetuity of all present and future rights to this
3184 software under copyright law.
3185 
3186 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
3187 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3188 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
3189 IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
3190 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
3191 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
3192 OTHER DEALINGS IN THE SOFTWARE.
3193 
3194 For more information, please refer to <http://unlicense.org/>
3195 */