kfr

Fast, modern C++ DSP framework, FFT, Sample Rate Conversion, FIR/IIR/Biquad Filters (SSE, AVX, AVX-512, ARM NEON)
Log | Files | Refs | README

dr_mp3.h (165957B)


      1 /*
      2 MP3 audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file.
      3 dr_mp3 - v0.5.3 - 2019-11-14
      4 
      5 David Reid - [email protected]
      6 
      7 Based off minimp3 (https://github.com/lieff/minimp3) which is where the real work was done. See the bottom of this file for
      8 differences between minimp3 and dr_mp3.
      9 */
     10 
     11 /*
     12 RELEASE NOTES - v0.5.0
     13 =======================
     14 Version 0.5.0 has breaking API changes.
     15 
     16 Improved Client-Defined Memory Allocation
     17 -----------------------------------------
     18 The main change with this release is the addition of a more flexible way of implementing custom memory allocation routines. The
     19 existing system of DRMP3_MALLOC, DRMP3_REALLOC and DRMP3_FREE are still in place and will be used by default when no custom
     20 allocation callbacks are specified.
     21 
     22 To use the new system, you pass in a pointer to a drmp3_allocation_callbacks object to drmp3_init() and family, like this:
     23 
     24     void* my_malloc(size_t sz, void* pUserData)
     25     {
     26         return malloc(sz);
     27     }
     28     void* my_realloc(void* p, size_t sz, void* pUserData)
     29     {
     30         return realloc(p, sz);
     31     }
     32     void my_free(void* p, void* pUserData)
     33     {
     34         free(p);
     35     }
     36 
     37     ...
     38 
     39     drmp3_allocation_callbacks allocationCallbacks;
     40     allocationCallbacks.pUserData = &myData;
     41     allocationCallbacks.onMalloc  = my_malloc;
     42     allocationCallbacks.onRealloc = my_realloc;
     43     allocationCallbacks.onFree    = my_free;
     44     drmp3_init_file(&mp3, "my_file.mp3", NULL, &allocationCallbacks);
     45 
     46 The advantage of this new system is that it allows you to specify user data which will be passed in to the allocation routines.
     47 
     48 Passing in null for the allocation callbacks object will cause dr_mp3 to use defaults which is the same as DRMP3_MALLOC,
     49 DRMP3_REALLOC and DRMP3_FREE and the equivalent of how it worked in previous versions.
     50 
     51 Every API that opens a drmp3 object now takes this extra parameter. These include the following:
     52 
     53     drmp3_init()
     54     drmp3_init_file()
     55     drmp3_init_memory()
     56     drmp3_open_and_read_pcm_frames_f32()
     57     drmp3_open_and_read_pcm_frames_s16()
     58     drmp3_open_memory_and_read_pcm_frames_f32()
     59     drmp3_open_memory_and_read_pcm_frames_s16()
     60     drmp3_open_file_and_read_pcm_frames_f32()
     61     drmp3_open_file_and_read_pcm_frames_s16()
     62 
     63 Renamed APIs
     64 ------------
     65 The following APIs have been renamed for consistency with other dr_* libraries and to make it clear that they return PCM frame
     66 counts rather than sample counts.
     67 
     68     drmp3_open_and_read_f32()        -> drmp3_open_and_read_pcm_frames_f32()
     69     drmp3_open_and_read_s16()        -> drmp3_open_and_read_pcm_frames_s16()
     70     drmp3_open_memory_and_read_f32() -> drmp3_open_memory_and_read_pcm_frames_f32()
     71     drmp3_open_memory_and_read_s16() -> drmp3_open_memory_and_read_pcm_frames_s16()
     72     drmp3_open_file_and_read_f32()   -> drmp3_open_file_and_read_pcm_frames_f32()
     73     drmp3_open_file_and_read_s16()   -> drmp3_open_file_and_read_pcm_frames_s16()
     74 */
     75 
     76 /*
     77 USAGE
     78 =====
     79 dr_mp3 is a single-file library. To use it, do something like the following in one .c file.
     80     #define DR_MP3_IMPLEMENTATION
     81     #include "dr_mp3.h"
     82 
     83 You can then #include this file in other parts of the program as you would with any other header file. To decode audio data,
     84 do something like the following:
     85 
     86     drmp3 mp3;
     87     if (!drmp3_init_file(&mp3, "MySong.mp3", NULL)) {
     88         // Failed to open file
     89     }
     90 
     91     ...
     92 
     93     drmp3_uint64 framesRead = drmp3_read_pcm_frames_f32(pMP3, framesToRead, pFrames);
     94 
     95 The drmp3 object is transparent so you can get access to the channel count and sample rate like so:
     96 
     97     drmp3_uint32 channels = mp3.channels;
     98     drmp3_uint32 sampleRate = mp3.sampleRate;
     99 
    100 The third parameter of drmp3_init_file() in the example above allows you to control the output channel count and sample rate. It
    101 is a pointer to a drmp3_config object. Setting any of the variables of this object to 0 will cause dr_mp3 to use defaults.
    102 
    103 The example above initializes a decoder from a file, but you can also initialize it from a block of memory and read and seek
    104 callbacks with drmp3_init_memory() and drmp3_init() respectively.
    105 
    106 You do not need to do any annoying memory management when reading PCM frames - this is all managed internally. You can request
    107 any number of PCM frames in each call to drmp3_read_pcm_frames_f32() and it will return as many PCM frames as it can, up to the
    108 requested amount.
    109 
    110 You can also decode an entire file in one go with drmp3_open_and_read_pcm_frames_f32(), drmp3_open_memory_and_read_pcm_frames_f32() and
    111 drmp3_open_file_and_read_pcm_frames_f32().
    112 
    113 
    114 OPTIONS
    115 =======
    116 #define these options before including this file.
    117 
    118 #define DR_MP3_NO_STDIO
    119   Disable drmp3_init_file(), etc.
    120 
    121 #define DR_MP3_NO_SIMD
    122   Disable SIMD optimizations.
    123 */
    124 
    125 #ifndef dr_mp3_h
    126 #define dr_mp3_h
    127 
    128 #ifdef __cplusplus
    129 extern "C" {
    130 #endif
    131 
    132 #include <stddef.h>
    133 
    134 #if defined(_MSC_VER) && _MSC_VER < 1600
    135 typedef   signed char    drmp3_int8;
    136 typedef unsigned char    drmp3_uint8;
    137 typedef   signed short   drmp3_int16;
    138 typedef unsigned short   drmp3_uint16;
    139 typedef   signed int     drmp3_int32;
    140 typedef unsigned int     drmp3_uint32;
    141 typedef   signed __int64 drmp3_int64;
    142 typedef unsigned __int64 drmp3_uint64;
    143 #else
    144 #include <stdint.h>
    145 typedef int8_t           drmp3_int8;
    146 typedef uint8_t          drmp3_uint8;
    147 typedef int16_t          drmp3_int16;
    148 typedef uint16_t         drmp3_uint16;
    149 typedef int32_t          drmp3_int32;
    150 typedef uint32_t         drmp3_uint32;
    151 typedef int64_t          drmp3_int64;
    152 typedef uint64_t         drmp3_uint64;
    153 #endif
    154 typedef drmp3_uint8      drmp3_bool8;
    155 typedef drmp3_uint32     drmp3_bool32;
    156 #define DRMP3_TRUE       1
    157 #define DRMP3_FALSE      0
    158 
    159 #define DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME  1152
    160 #define DRMP3_MAX_SAMPLES_PER_FRAME         (DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME*2)
    161 
    162 #ifdef _MSC_VER
    163     #define DRMP3_INLINE __forceinline
    164 #elif defined(__GNUC__)
    165     /*
    166     I've had a bug report where GCC is emitting warnings about functions possibly not being inlineable. This warning happens when
    167     the __attribute__((always_inline)) attribute is defined without an "inline" statement. I think therefore there must be some
    168     case where "__inline__" is not always defined, thus the compiler emitting these warnings. When using -std=c89 or -ansi on the
    169     command line, we cannot use the "inline" keyword and instead need to use "__inline__". In an attempt to work around this issue
    170     I am using "__inline__" only when we're compiling in strict ANSI mode.
    171     */
    172     #if defined(__STRICT_ANSI__)
    173         #define DRMP3_INLINE __inline__ __attribute__((always_inline))
    174     #else
    175         #define DRMP3_INLINE inline __attribute__((always_inline))
    176     #endif
    177 #else
    178     #define DRMP3_INLINE
    179 #endif
    180 
    181 /*
    182 Low Level Push API
    183 ==================
    184 */
    185 typedef struct
    186 {
    187     int frame_bytes, channels, hz, layer, bitrate_kbps;
    188 } drmp3dec_frame_info;
    189 
    190 typedef struct
    191 {
    192     float mdct_overlap[2][9*32], qmf_state[15*2*32];
    193     int reserv, free_format_bytes;
    194     unsigned char header[4], reserv_buf[511];
    195 } drmp3dec;
    196 
    197 /* Initializes a low level decoder. */
    198 void drmp3dec_init(drmp3dec *dec);
    199 
    200 /* Reads a frame from a low level decoder. */
    201 int drmp3dec_decode_frame(drmp3dec *dec, const unsigned char *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info);
    202 
    203 /* Helper for converting between f32 and s16. */
    204 void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, int num_samples);
    205 
    206 
    207 
    208 /*
    209 Main API (Pull API)
    210 ===================
    211 */
    212 #ifndef DR_MP3_DEFAULT_CHANNELS
    213 #define DR_MP3_DEFAULT_CHANNELS         2
    214 #endif
    215 #ifndef DR_MP3_DEFAULT_SAMPLE_RATE
    216 #define DR_MP3_DEFAULT_SAMPLE_RATE      44100
    217 #endif
    218 
    219 typedef struct drmp3_src drmp3_src;
    220 typedef drmp3_uint64 (* drmp3_src_read_proc)(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, void* pUserData); /* Returns the number of frames that were read. */
    221 
    222 typedef enum
    223 {
    224     drmp3_src_algorithm_none,
    225     drmp3_src_algorithm_linear
    226 } drmp3_src_algorithm;
    227 
    228 #define DRMP3_SRC_CACHE_SIZE_IN_FRAMES    512
    229 typedef struct
    230 {
    231     drmp3_src* pSRC;
    232     float pCachedFrames[2 * DRMP3_SRC_CACHE_SIZE_IN_FRAMES];
    233     drmp3_uint32 cachedFrameCount;
    234     drmp3_uint32 iNextFrame;
    235 } drmp3_src_cache;
    236 
    237 typedef struct
    238 {
    239     drmp3_uint32 sampleRateIn;
    240     drmp3_uint32 sampleRateOut;
    241     drmp3_uint32 channels;
    242     drmp3_src_algorithm algorithm;
    243     drmp3_uint32 cacheSizeInFrames;  /* The number of frames to read from the client at a time. */
    244 } drmp3_src_config;
    245 
    246 struct drmp3_src
    247 {
    248     drmp3_src_config config;
    249     drmp3_src_read_proc onRead;
    250     void* pUserData;
    251     float bin[256];
    252     drmp3_src_cache cache;    /* <-- For simplifying and optimizing client -> memory reading. */
    253     union
    254     {
    255         struct
    256         {
    257             double alpha;
    258             drmp3_bool32 isPrevFramesLoaded : 1;
    259             drmp3_bool32 isNextFramesLoaded : 1;
    260         } linear;
    261     } algo;
    262 };
    263 
    264 typedef enum
    265 {
    266     drmp3_seek_origin_start,
    267     drmp3_seek_origin_current
    268 } drmp3_seek_origin;
    269 
    270 typedef struct
    271 {
    272     drmp3_uint64 seekPosInBytes;        /* Points to the first byte of an MP3 frame. */
    273     drmp3_uint64 pcmFrameIndex;         /* The index of the PCM frame this seek point targets. */
    274     drmp3_uint16 mp3FramesToDiscard;    /* The number of whole MP3 frames to be discarded before pcmFramesToDiscard. */
    275     drmp3_uint16 pcmFramesToDiscard;    /* The number of leading samples to read and discard. These are discarded after mp3FramesToDiscard. */
    276 } drmp3_seek_point;
    277 
    278 /*
    279 Callback for when data is read. Return value is the number of bytes actually read.
    280 
    281 pUserData   [in]  The user data that was passed to drmp3_init(), drmp3_open() and family.
    282 pBufferOut  [out] The output buffer.
    283 bytesToRead [in]  The number of bytes to read.
    284 
    285 Returns the number of bytes actually read.
    286 
    287 A return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until
    288 either the entire bytesToRead is filled or you have reached the end of the stream.
    289 */
    290 typedef size_t (* drmp3_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);
    291 
    292 /*
    293 Callback for when data needs to be seeked.
    294 
    295 pUserData [in] The user data that was passed to drmp3_init(), drmp3_open() and family.
    296 offset    [in] The number of bytes to move, relative to the origin. Will never be negative.
    297 origin    [in] The origin of the seek - the current position or the start of the stream.
    298 
    299 Returns whether or not the seek was successful.
    300 
    301 Whether or not it is relative to the beginning or current position is determined by the "origin" parameter which
    302 will be either drmp3_seek_origin_start or drmp3_seek_origin_current.
    303 */
    304 typedef drmp3_bool32 (* drmp3_seek_proc)(void* pUserData, int offset, drmp3_seek_origin origin);
    305 
    306 typedef struct
    307 {
    308     void* pUserData;
    309     void* (* onMalloc)(size_t sz, void* pUserData);
    310     void* (* onRealloc)(void* p, size_t sz, void* pUserData);
    311     void  (* onFree)(void* p, void* pUserData);
    312 } drmp3_allocation_callbacks;
    313 
    314 typedef struct
    315 {
    316     drmp3_uint32 outputChannels;
    317     drmp3_uint32 outputSampleRate;
    318 } drmp3_config;
    319 
    320 typedef struct
    321 {
    322     drmp3dec decoder;
    323     drmp3dec_frame_info frameInfo;
    324     drmp3_uint32 channels;
    325     drmp3_uint32 sampleRate;
    326     drmp3_read_proc onRead;
    327     drmp3_seek_proc onSeek;
    328     void* pUserData;
    329     drmp3_allocation_callbacks allocationCallbacks;
    330     drmp3_uint32 mp3FrameChannels;      /* The number of channels in the currently loaded MP3 frame. Internal use only. */
    331     drmp3_uint32 mp3FrameSampleRate;    /* The sample rate of the currently loaded MP3 frame. Internal use only. */
    332     drmp3_uint32 pcmFramesConsumedInMP3Frame;
    333     drmp3_uint32 pcmFramesRemainingInMP3Frame;
    334     drmp3_uint8 pcmFrames[sizeof(float)*DRMP3_MAX_SAMPLES_PER_FRAME];  /* <-- Multipled by sizeof(float) to ensure there's enough room for DR_MP3_FLOAT_OUTPUT. */
    335     drmp3_uint64 currentPCMFrame;       /* The current PCM frame, globally, based on the output sample rate. Mainly used for seeking. */
    336     drmp3_uint64 streamCursor;          /* The current byte the decoder is sitting on in the raw stream. */
    337     drmp3_src src;
    338     drmp3_seek_point* pSeekPoints;      /* NULL by default. Set with drmp3_bind_seek_table(). Memory is owned by the client. dr_mp3 will never attempt to free this pointer. */
    339     drmp3_uint32 seekPointCount;        /* The number of items in pSeekPoints. When set to 0 assumes to no seek table. Defaults to zero. */
    340     size_t dataSize;
    341     size_t dataCapacity;
    342     drmp3_uint8* pData;
    343     drmp3_bool32 atEnd : 1;
    344     struct
    345     {
    346         const drmp3_uint8* pData;
    347         size_t dataSize;
    348         size_t currentReadPos;
    349     } memory;   /* Only used for decoders that were opened against a block of memory. */
    350 } drmp3;
    351 
    352 /*
    353 Initializes an MP3 decoder.
    354 
    355 onRead    [in]           The function to call when data needs to be read from the client.
    356 onSeek    [in]           The function to call when the read position of the client data needs to move.
    357 pUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek.
    358 
    359 Returns true if successful; false otherwise.
    360 
    361 Close the loader with drmp3_uninit().
    362 
    363 See also: drmp3_init_file(), drmp3_init_memory(), drmp3_uninit()
    364 */
    365 drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig, const drmp3_allocation_callbacks* pAllocationCallbacks);
    366 
    367 /*
    368 Initializes an MP3 decoder from a block of memory.
    369 
    370 This does not create a copy of the data. It is up to the application to ensure the buffer remains valid for
    371 the lifetime of the drmp3 object.
    372 
    373 The buffer should contain the contents of the entire MP3 file.
    374 */
    375 drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_config* pConfig, const drmp3_allocation_callbacks* pAllocationCallbacks);
    376 
    377 #ifndef DR_MP3_NO_STDIO
    378 /*
    379 Initializes an MP3 decoder from a file.
    380 
    381 This holds the internal FILE object until drmp3_uninit() is called. Keep this in mind if you're caching drmp3
    382 objects because the operating system may restrict the number of file handles an application can have open at
    383 any given time.
    384 */
    385 drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* filePath, const drmp3_config* pConfig, const drmp3_allocation_callbacks* pAllocationCallbacks);
    386 #endif
    387 
    388 /*
    389 Uninitializes an MP3 decoder.
    390 */
    391 void drmp3_uninit(drmp3* pMP3);
    392 
    393 /*
    394 Reads PCM frames as interleaved 32-bit IEEE floating point PCM.
    395 
    396 Note that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames.
    397 */
    398 drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut);
    399 
    400 /*
    401 Reads PCM frames as interleaved signed 16-bit integer PCM.
    402 
    403 Note that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames.
    404 */
    405 drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut);
    406 
    407 /*
    408 Seeks to a specific frame.
    409 
    410 Note that this is _not_ an MP3 frame, but rather a PCM frame.
    411 */
    412 drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex);
    413 
    414 /*
    415 Calculates the total number of PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet
    416 radio. Runs in linear time. Returns 0 on error.
    417 */
    418 drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3);
    419 
    420 /*
    421 Calculates the total number of MP3 frames in the MP3 stream. Cannot be used for infinite streams such as internet
    422 radio. Runs in linear time. Returns 0 on error.
    423 */
    424 drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3);
    425 
    426 /*
    427 Calculates the total number of MP3 and PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet
    428 radio. Runs in linear time. Returns 0 on error.
    429 
    430 This is equivalent to calling drmp3_get_mp3_frame_count() and drmp3_get_pcm_frame_count() except that it's more efficient.
    431 */
    432 drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount);
    433 
    434 /*
    435 Calculates the seekpoints based on PCM frames. This is slow.
    436 
    437 pSeekpoint count is a pointer to a uint32 containing the seekpoint count. On input it contains the desired count.
    438 On output it contains the actual count. The reason for this design is that the client may request too many
    439 seekpoints, in which case dr_mp3 will return a corrected count.
    440 
    441 Note that seektable seeking is not quite sample exact when the MP3 stream contains inconsistent sample rates.
    442 */
    443 drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints);
    444 
    445 /*
    446 Binds a seek table to the decoder.
    447 
    448 This does _not_ make a copy of pSeekPoints - it only references it. It is up to the application to ensure this
    449 remains valid while it is bound to the decoder.
    450 
    451 Use drmp3_calculate_seek_points() to calculate the seek points.
    452 */
    453 drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints);
    454 
    455 
    456 /*
    457 Opens an decodes an entire MP3 stream as a single operation.
    458 
    459 pConfig is both an input and output. On input it contains what you want. On output it contains what you got.
    460 
    461 Free the returned pointer with drmp3_free().
    462 */
    463 float* drmp3_open_and_read_pcm_frames_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);
    464 drmp3_int16* drmp3_open_and_read_pcm_frames_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);
    465 
    466 float* drmp3_open_memory_and_read_pcm_frames_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);
    467 drmp3_int16* drmp3_open_memory_and_read_pcm_frames_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);
    468 
    469 #ifndef DR_MP3_NO_STDIO
    470 float* drmp3_open_file_and_read_pcm_frames_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);
    471 drmp3_int16* drmp3_open_file_and_read_pcm_frames_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks);
    472 #endif
    473 
    474 /*
    475 Frees any memory that was allocated by a public drmp3 API.
    476 */
    477 void drmp3_free(void* p, const drmp3_allocation_callbacks* pAllocationCallbacks);
    478 
    479 #ifdef __cplusplus
    480 }
    481 #endif
    482 #endif  /* dr_mp3_h */
    483 
    484 
    485 /************************************************************************************************************************************************************
    486  ************************************************************************************************************************************************************
    487 
    488  IMPLEMENTATION
    489 
    490  ************************************************************************************************************************************************************
    491  ************************************************************************************************************************************************************/
    492 #ifdef DR_MP3_IMPLEMENTATION
    493 #include <stdlib.h>
    494 #include <string.h>
    495 #include <limits.h> /* For INT_MAX */
    496 
    497 /* Disable SIMD when compiling with TCC for now. */
    498 #if defined(__TINYC__)
    499 #define DR_MP3_NO_SIMD
    500 #endif
    501 
    502 #define DRMP3_OFFSET_PTR(p, offset) ((void*)((drmp3_uint8*)(p) + (offset)))
    503 
    504 #define DRMP3_MAX_FREE_FORMAT_FRAME_SIZE  2304    /* more than ISO spec's */
    505 #ifndef DRMP3_MAX_FRAME_SYNC_MATCHES
    506 #define DRMP3_MAX_FRAME_SYNC_MATCHES      10
    507 #endif
    508 
    509 #define DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES  DRMP3_MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */
    510 
    511 #define DRMP3_MAX_BITRESERVOIR_BYTES      511
    512 #define DRMP3_SHORT_BLOCK_TYPE            2
    513 #define DRMP3_STOP_BLOCK_TYPE             3
    514 #define DRMP3_MODE_MONO                   3
    515 #define DRMP3_MODE_JOINT_STEREO           1
    516 #define DRMP3_HDR_SIZE                    4
    517 #define DRMP3_HDR_IS_MONO(h)              (((h[3]) & 0xC0) == 0xC0)
    518 #define DRMP3_HDR_IS_MS_STEREO(h)         (((h[3]) & 0xE0) == 0x60)
    519 #define DRMP3_HDR_IS_FREE_FORMAT(h)       (((h[2]) & 0xF0) == 0)
    520 #define DRMP3_HDR_IS_CRC(h)               (!((h[1]) & 1))
    521 #define DRMP3_HDR_TEST_PADDING(h)         ((h[2]) & 0x2)
    522 #define DRMP3_HDR_TEST_MPEG1(h)           ((h[1]) & 0x8)
    523 #define DRMP3_HDR_TEST_NOT_MPEG25(h)      ((h[1]) & 0x10)
    524 #define DRMP3_HDR_TEST_I_STEREO(h)        ((h[3]) & 0x10)
    525 #define DRMP3_HDR_TEST_MS_STEREO(h)       ((h[3]) & 0x20)
    526 #define DRMP3_HDR_GET_STEREO_MODE(h)      (((h[3]) >> 6) & 3)
    527 #define DRMP3_HDR_GET_STEREO_MODE_EXT(h)  (((h[3]) >> 4) & 3)
    528 #define DRMP3_HDR_GET_LAYER(h)            (((h[1]) >> 1) & 3)
    529 #define DRMP3_HDR_GET_BITRATE(h)          ((h[2]) >> 4)
    530 #define DRMP3_HDR_GET_SAMPLE_RATE(h)      (((h[2]) >> 2) & 3)
    531 #define DRMP3_HDR_GET_MY_SAMPLE_RATE(h)   (DRMP3_HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3)
    532 #define DRMP3_HDR_IS_FRAME_576(h)         ((h[1] & 14) == 2)
    533 #define DRMP3_HDR_IS_LAYER_1(h)           ((h[1] & 6) == 6)
    534 
    535 #define DRMP3_BITS_DEQUANTIZER_OUT        -1
    536 #define DRMP3_MAX_SCF                     (255 + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210)
    537 #define DRMP3_MAX_SCFI                    ((DRMP3_MAX_SCF + 3) & ~3)
    538 
    539 #define DRMP3_MIN(a, b)           ((a) > (b) ? (b) : (a))
    540 #define DRMP3_MAX(a, b)           ((a) < (b) ? (b) : (a))
    541 
    542 #if !defined(DR_MP3_NO_SIMD)
    543 
    544 #if !defined(DR_MP3_ONLY_SIMD) && (defined(_M_X64) || defined(_M_ARM64) || defined(__x86_64__) || defined(__aarch64__))
    545 /* x64 always have SSE2, arm64 always have neon, no need for generic code */
    546 #define DR_MP3_ONLY_SIMD
    547 #endif
    548 
    549 #if ((defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__))
    550 #if defined(_MSC_VER)
    551 #include <intrin.h>
    552 #endif
    553 #include <emmintrin.h>
    554 #define DRMP3_HAVE_SSE 1
    555 #define DRMP3_HAVE_SIMD 1
    556 #define DRMP3_VSTORE _mm_storeu_ps
    557 #define DRMP3_VLD _mm_loadu_ps
    558 #define DRMP3_VSET _mm_set1_ps
    559 #define DRMP3_VADD _mm_add_ps
    560 #define DRMP3_VSUB _mm_sub_ps
    561 #define DRMP3_VMUL _mm_mul_ps
    562 #define DRMP3_VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y))
    563 #define DRMP3_VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y))
    564 #define DRMP3_VMUL_S(x, s)  _mm_mul_ps(x, _mm_set1_ps(s))
    565 #define DRMP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3))
    566 typedef __m128 drmp3_f4;
    567 #if defined(_MSC_VER) || defined(DR_MP3_ONLY_SIMD)
    568 #define drmp3_cpuid __cpuid
    569 #else
    570 static __inline__ __attribute__((always_inline)) void drmp3_cpuid(int CPUInfo[], const int InfoType)
    571 {
    572 #if defined(__PIC__)
    573     __asm__ __volatile__(
    574 #if defined(__x86_64__)
    575         "push %%rbx\n"
    576         "cpuid\n"
    577         "xchgl %%ebx, %1\n"
    578         "pop  %%rbx\n"
    579 #else
    580         "xchgl %%ebx, %1\n"
    581         "cpuid\n"
    582         "xchgl %%ebx, %1\n"
    583 #endif
    584         : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
    585         : "a" (InfoType));
    586 #else
    587     __asm__ __volatile__(
    588         "cpuid"
    589         : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
    590         : "a" (InfoType));
    591 #endif
    592 }
    593 #endif
    594 static int drmp3_have_simd()
    595 {
    596 #ifdef DR_MP3_ONLY_SIMD
    597     return 1;
    598 #else
    599     static int g_have_simd;
    600     int CPUInfo[4];
    601 #ifdef MINIMP3_TEST
    602     static int g_counter;
    603     if (g_counter++ > 100)
    604         return 0;
    605 #endif
    606     if (g_have_simd)
    607         goto end;
    608     drmp3_cpuid(CPUInfo, 0);
    609     if (CPUInfo[0] > 0)
    610     {
    611         drmp3_cpuid(CPUInfo, 1);
    612         g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */
    613         return g_have_simd - 1;
    614     }
    615 
    616 end:
    617     return g_have_simd - 1;
    618 #endif
    619 }
    620 #elif defined(__ARM_NEON) || defined(__aarch64__)
    621 #include <arm_neon.h>
    622 #define DRMP3_HAVE_SSE 0
    623 #define DRMP3_HAVE_SIMD 1
    624 #define DRMP3_VSTORE vst1q_f32
    625 #define DRMP3_VLD vld1q_f32
    626 #define DRMP3_VSET vmovq_n_f32
    627 #define DRMP3_VADD vaddq_f32
    628 #define DRMP3_VSUB vsubq_f32
    629 #define DRMP3_VMUL vmulq_f32
    630 #define DRMP3_VMAC(a, x, y) vmlaq_f32(a, x, y)
    631 #define DRMP3_VMSB(a, x, y) vmlsq_f32(a, x, y)
    632 #define DRMP3_VMUL_S(x, s)  vmulq_f32(x, vmovq_n_f32(s))
    633 #define DRMP3_VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x)))
    634 typedef float32x4_t drmp3_f4;
    635 static int drmp3_have_simd()
    636 {   /* TODO: detect neon for !DR_MP3_ONLY_SIMD */
    637     return 1;
    638 }
    639 #else
    640 #define DRMP3_HAVE_SSE 0
    641 #define DRMP3_HAVE_SIMD 0
    642 #ifdef DR_MP3_ONLY_SIMD
    643 #error DR_MP3_ONLY_SIMD used, but SSE/NEON not enabled
    644 #endif
    645 #endif
    646 
    647 #else
    648 
    649 #define DRMP3_HAVE_SIMD 0
    650 
    651 #endif
    652 
    653 typedef struct
    654 {
    655     const drmp3_uint8 *buf;
    656     int pos, limit;
    657 } drmp3_bs;
    658 
    659 typedef struct
    660 {
    661     float scf[3*64];
    662     drmp3_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64];
    663 } drmp3_L12_scale_info;
    664 
    665 typedef struct
    666 {
    667     drmp3_uint8 tab_offset, code_tab_width, band_count;
    668 } drmp3_L12_subband_alloc;
    669 
    670 typedef struct
    671 {
    672     const drmp3_uint8 *sfbtab;
    673     drmp3_uint16 part_23_length, big_values, scalefac_compress;
    674     drmp3_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;
    675     drmp3_uint8 table_select[3], region_count[3], subblock_gain[3];
    676     drmp3_uint8 preflag, scalefac_scale, count1_table, scfsi;
    677 } drmp3_L3_gr_info;
    678 
    679 typedef struct
    680 {
    681     drmp3_bs bs;
    682     drmp3_uint8 maindata[DRMP3_MAX_BITRESERVOIR_BYTES + DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES];
    683     drmp3_L3_gr_info gr_info[4];
    684     float grbuf[2][576], scf[40], syn[18 + 15][2*32];
    685     drmp3_uint8 ist_pos[2][39];
    686 } drmp3dec_scratch;
    687 
    688 static void drmp3_bs_init(drmp3_bs *bs, const drmp3_uint8 *data, int bytes)
    689 {
    690     bs->buf   = data;
    691     bs->pos   = 0;
    692     bs->limit = bytes*8;
    693 }
    694 
    695 static drmp3_uint32 drmp3_bs_get_bits(drmp3_bs *bs, int n)
    696 {
    697     drmp3_uint32 next, cache = 0, s = bs->pos & 7;
    698     int shl = n + s;
    699     const drmp3_uint8 *p = bs->buf + (bs->pos >> 3);
    700     if ((bs->pos += n) > bs->limit)
    701         return 0;
    702     next = *p++ & (255 >> s);
    703     while ((shl -= 8) > 0)
    704     {
    705         cache |= next << shl;
    706         next = *p++;
    707     }
    708     return cache | (next >> -shl);
    709 }
    710 
    711 static int drmp3_hdr_valid(const drmp3_uint8 *h)
    712 {
    713     return h[0] == 0xff &&
    714         ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) &&
    715         (DRMP3_HDR_GET_LAYER(h) != 0) &&
    716         (DRMP3_HDR_GET_BITRATE(h) != 15) &&
    717         (DRMP3_HDR_GET_SAMPLE_RATE(h) != 3);
    718 }
    719 
    720 static int drmp3_hdr_compare(const drmp3_uint8 *h1, const drmp3_uint8 *h2)
    721 {
    722     return drmp3_hdr_valid(h2) &&
    723         ((h1[1] ^ h2[1]) & 0xFE) == 0 &&
    724         ((h1[2] ^ h2[2]) & 0x0C) == 0 &&
    725         !(DRMP3_HDR_IS_FREE_FORMAT(h1) ^ DRMP3_HDR_IS_FREE_FORMAT(h2));
    726 }
    727 
    728 static unsigned drmp3_hdr_bitrate_kbps(const drmp3_uint8 *h)
    729 {
    730     static const drmp3_uint8 halfrate[2][3][15] = {
    731         { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } },
    732         { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } },
    733     };
    734     return 2*halfrate[!!DRMP3_HDR_TEST_MPEG1(h)][DRMP3_HDR_GET_LAYER(h) - 1][DRMP3_HDR_GET_BITRATE(h)];
    735 }
    736 
    737 static unsigned drmp3_hdr_sample_rate_hz(const drmp3_uint8 *h)
    738 {
    739     static const unsigned g_hz[3] = { 44100, 48000, 32000 };
    740     return g_hz[DRMP3_HDR_GET_SAMPLE_RATE(h)] >> (int)!DRMP3_HDR_TEST_MPEG1(h) >> (int)!DRMP3_HDR_TEST_NOT_MPEG25(h);
    741 }
    742 
    743 static unsigned drmp3_hdr_frame_samples(const drmp3_uint8 *h)
    744 {
    745     return DRMP3_HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)DRMP3_HDR_IS_FRAME_576(h));
    746 }
    747 
    748 static int drmp3_hdr_frame_bytes(const drmp3_uint8 *h, int free_format_size)
    749 {
    750     int frame_bytes = drmp3_hdr_frame_samples(h)*drmp3_hdr_bitrate_kbps(h)*125/drmp3_hdr_sample_rate_hz(h);
    751     if (DRMP3_HDR_IS_LAYER_1(h))
    752     {
    753         frame_bytes &= ~3; /* slot align */
    754     }
    755     return frame_bytes ? frame_bytes : free_format_size;
    756 }
    757 
    758 static int drmp3_hdr_padding(const drmp3_uint8 *h)
    759 {
    760     return DRMP3_HDR_TEST_PADDING(h) ? (DRMP3_HDR_IS_LAYER_1(h) ? 4 : 1) : 0;
    761 }
    762 
    763 #ifndef DR_MP3_ONLY_MP3
    764 static const drmp3_L12_subband_alloc *drmp3_L12_subband_alloc_table(const drmp3_uint8 *hdr, drmp3_L12_scale_info *sci)
    765 {
    766     const drmp3_L12_subband_alloc *alloc;
    767     int mode = DRMP3_HDR_GET_STEREO_MODE(hdr);
    768     int nbands, stereo_bands = (mode == DRMP3_MODE_MONO) ? 0 : (mode == DRMP3_MODE_JOINT_STEREO) ? (DRMP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;
    769 
    770     if (DRMP3_HDR_IS_LAYER_1(hdr))
    771     {
    772         static const drmp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } };
    773         alloc = g_alloc_L1;
    774         nbands = 32;
    775     } else if (!DRMP3_HDR_TEST_MPEG1(hdr))
    776     {
    777         static const drmp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
    778         alloc = g_alloc_L2M2;
    779         nbands = 30;
    780     } else
    781     {
    782         static const drmp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };
    783         int sample_rate_idx = DRMP3_HDR_GET_SAMPLE_RATE(hdr);
    784         unsigned kbps = drmp3_hdr_bitrate_kbps(hdr) >> (int)(mode != DRMP3_MODE_MONO);
    785         if (!kbps) /* free-format */
    786         {
    787             kbps = 192;
    788         }
    789 
    790         alloc = g_alloc_L2M1;
    791         nbands = 27;
    792         if (kbps < 56)
    793         {
    794             static const drmp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };
    795             alloc = g_alloc_L2M1_lowrate;
    796             nbands = sample_rate_idx == 2 ? 12 : 8;
    797         } else if (kbps >= 96 && sample_rate_idx != 1)
    798         {
    799             nbands = 30;
    800         }
    801     }
    802 
    803     sci->total_bands = (drmp3_uint8)nbands;
    804     sci->stereo_bands = (drmp3_uint8)DRMP3_MIN(stereo_bands, nbands);
    805 
    806     return alloc;
    807 }
    808 
    809 static void drmp3_L12_read_scalefactors(drmp3_bs *bs, drmp3_uint8 *pba, drmp3_uint8 *scfcod, int bands, float *scf)
    810 {
    811     static const float g_deq_L12[18*3] = {
    812 #define DRMP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x
    813         DRMP3_DQ(3),DRMP3_DQ(7),DRMP3_DQ(15),DRMP3_DQ(31),DRMP3_DQ(63),DRMP3_DQ(127),DRMP3_DQ(255),DRMP3_DQ(511),DRMP3_DQ(1023),DRMP3_DQ(2047),DRMP3_DQ(4095),DRMP3_DQ(8191),DRMP3_DQ(16383),DRMP3_DQ(32767),DRMP3_DQ(65535),DRMP3_DQ(3),DRMP3_DQ(5),DRMP3_DQ(9)
    814     };
    815     int i, m;
    816     for (i = 0; i < bands; i++)
    817     {
    818         float s = 0;
    819         int ba = *pba++;
    820         int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;
    821         for (m = 4; m; m >>= 1)
    822         {
    823             if (mask & m)
    824             {
    825                 int b = drmp3_bs_get_bits(bs, 6);
    826                 s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3);
    827             }
    828             *scf++ = s;
    829         }
    830     }
    831 }
    832 
    833 static void drmp3_L12_read_scale_info(const drmp3_uint8 *hdr, drmp3_bs *bs, drmp3_L12_scale_info *sci)
    834 {
    835     static const drmp3_uint8 g_bitalloc_code_tab[] = {
    836         0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,
    837         0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,
    838         0,17,18, 3,19,4,5,16,
    839         0,17,18,16,
    840         0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,
    841         0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,
    842         0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16
    843     };
    844     const drmp3_L12_subband_alloc *subband_alloc = drmp3_L12_subband_alloc_table(hdr, sci);
    845 
    846     int i, k = 0, ba_bits = 0;
    847     const drmp3_uint8 *ba_code_tab = g_bitalloc_code_tab;
    848 
    849     for (i = 0; i < sci->total_bands; i++)
    850     {
    851         drmp3_uint8 ba;
    852         if (i == k)
    853         {
    854             k += subband_alloc->band_count;
    855             ba_bits = subband_alloc->code_tab_width;
    856             ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;
    857             subband_alloc++;
    858         }
    859         ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
    860         sci->bitalloc[2*i] = ba;
    861         if (i < sci->stereo_bands)
    862         {
    863             ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)];
    864         }
    865         sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;
    866     }
    867 
    868     for (i = 0; i < 2*sci->total_bands; i++)
    869     {
    870         sci->scfcod[i] = (drmp3_uint8)(sci->bitalloc[i] ? DRMP3_HDR_IS_LAYER_1(hdr) ? 2 : drmp3_bs_get_bits(bs, 2) : 6);
    871     }
    872 
    873     drmp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
    874 
    875     for (i = sci->stereo_bands; i < sci->total_bands; i++)
    876     {
    877         sci->bitalloc[2*i + 1] = 0;
    878     }
    879 }
    880 
    881 static int drmp3_L12_dequantize_granule(float *grbuf, drmp3_bs *bs, drmp3_L12_scale_info *sci, int group_size)
    882 {
    883     int i, j, k, choff = 576;
    884     for (j = 0; j < 4; j++)
    885     {
    886         float *dst = grbuf + group_size*j;
    887         for (i = 0; i < 2*sci->total_bands; i++)
    888         {
    889             int ba = sci->bitalloc[i];
    890             if (ba != 0)
    891             {
    892                 if (ba < 17)
    893                 {
    894                     int half = (1 << (ba - 1)) - 1;
    895                     for (k = 0; k < group_size; k++)
    896                     {
    897                         dst[k] = (float)((int)drmp3_bs_get_bits(bs, ba) - half);
    898                     }
    899                 } else
    900                 {
    901                     unsigned mod = (2 << (ba - 17)) + 1;    /* 3, 5, 9 */
    902                     unsigned code = drmp3_bs_get_bits(bs, mod + 2 - (mod >> 3));  /* 5, 7, 10 */
    903                     for (k = 0; k < group_size; k++, code /= mod)
    904                     {
    905                         dst[k] = (float)((int)(code % mod - mod/2));
    906                     }
    907                 }
    908             }
    909             dst += choff;
    910             choff = 18 - choff;
    911         }
    912     }
    913     return group_size*4;
    914 }
    915 
    916 static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci, const float *scf, float *dst)
    917 {
    918     int i, k;
    919     memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float));
    920     for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)
    921     {
    922         for (k = 0; k < 12; k++)
    923         {
    924             dst[k + 0]   *= scf[0];
    925             dst[k + 576] *= scf[3];
    926         }
    927     }
    928 }
    929 #endif
    930 
    931 static int drmp3_L3_read_side_info(drmp3_bs *bs, drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr)
    932 {
    933     static const drmp3_uint8 g_scf_long[8][23] = {
    934         { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
    935         { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },
    936         { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
    937         { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },
    938         { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
    939         { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },
    940         { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },
    941         { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }
    942     };
    943     static const drmp3_uint8 g_scf_short[8][40] = {
    944         { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
    945         { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },
    946         { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },
    947         { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },
    948         { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
    949         { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },
    950         { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },
    951         { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }
    952     };
    953     static const drmp3_uint8 g_scf_mixed[8][40] = {
    954         { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
    955         { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },
    956         { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },
    957         { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },
    958         { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
    959         { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },
    960         { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },
    961         { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }
    962     };
    963 
    964     unsigned tables, scfsi = 0;
    965     int main_data_begin, part_23_sum = 0;
    966     int gr_count = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
    967     int sr_idx = DRMP3_HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);
    968 
    969     if (DRMP3_HDR_TEST_MPEG1(hdr))
    970     {
    971         gr_count *= 2;
    972         main_data_begin = drmp3_bs_get_bits(bs, 9);
    973         scfsi = drmp3_bs_get_bits(bs, 7 + gr_count);
    974     } else
    975     {
    976         main_data_begin = drmp3_bs_get_bits(bs, 8 + gr_count) >> gr_count;
    977     }
    978 
    979     do
    980     {
    981         if (DRMP3_HDR_IS_MONO(hdr))
    982         {
    983             scfsi <<= 4;
    984         }
    985         gr->part_23_length = (drmp3_uint16)drmp3_bs_get_bits(bs, 12);
    986         part_23_sum += gr->part_23_length;
    987         gr->big_values = (drmp3_uint16)drmp3_bs_get_bits(bs,  9);
    988         if (gr->big_values > 288)
    989         {
    990             return -1;
    991         }
    992         gr->global_gain = (drmp3_uint8)drmp3_bs_get_bits(bs, 8);
    993         gr->scalefac_compress = (drmp3_uint16)drmp3_bs_get_bits(bs, DRMP3_HDR_TEST_MPEG1(hdr) ? 4 : 9);
    994         gr->sfbtab = g_scf_long[sr_idx];
    995         gr->n_long_sfb  = 22;
    996         gr->n_short_sfb = 0;
    997         if (drmp3_bs_get_bits(bs, 1))
    998         {
    999             gr->block_type = (drmp3_uint8)drmp3_bs_get_bits(bs, 2);
   1000             if (!gr->block_type)
   1001             {
   1002                 return -1;
   1003             }
   1004             gr->mixed_block_flag = (drmp3_uint8)drmp3_bs_get_bits(bs, 1);
   1005             gr->region_count[0] = 7;
   1006             gr->region_count[1] = 255;
   1007             if (gr->block_type == DRMP3_SHORT_BLOCK_TYPE)
   1008             {
   1009                 scfsi &= 0x0F0F;
   1010                 if (!gr->mixed_block_flag)
   1011                 {
   1012                     gr->region_count[0] = 8;
   1013                     gr->sfbtab = g_scf_short[sr_idx];
   1014                     gr->n_long_sfb = 0;
   1015                     gr->n_short_sfb = 39;
   1016                 } else
   1017                 {
   1018                     gr->sfbtab = g_scf_mixed[sr_idx];
   1019                     gr->n_long_sfb = DRMP3_HDR_TEST_MPEG1(hdr) ? 8 : 6;
   1020                     gr->n_short_sfb = 30;
   1021                 }
   1022             }
   1023             tables = drmp3_bs_get_bits(bs, 10);
   1024             tables <<= 5;
   1025             gr->subblock_gain[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);
   1026             gr->subblock_gain[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);
   1027             gr->subblock_gain[2] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);
   1028         } else
   1029         {
   1030             gr->block_type = 0;
   1031             gr->mixed_block_flag = 0;
   1032             tables = drmp3_bs_get_bits(bs, 15);
   1033             gr->region_count[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 4);
   1034             gr->region_count[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3);
   1035             gr->region_count[2] = 255;
   1036         }
   1037         gr->table_select[0] = (drmp3_uint8)(tables >> 10);
   1038         gr->table_select[1] = (drmp3_uint8)((tables >> 5) & 31);
   1039         gr->table_select[2] = (drmp3_uint8)((tables) & 31);
   1040         gr->preflag = (drmp3_uint8)(DRMP3_HDR_TEST_MPEG1(hdr) ? drmp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500));
   1041         gr->scalefac_scale = (drmp3_uint8)drmp3_bs_get_bits(bs, 1);
   1042         gr->count1_table = (drmp3_uint8)drmp3_bs_get_bits(bs, 1);
   1043         gr->scfsi = (drmp3_uint8)((scfsi >> 12) & 15);
   1044         scfsi <<= 4;
   1045         gr++;
   1046     } while(--gr_count);
   1047 
   1048     if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
   1049     {
   1050         return -1;
   1051     }
   1052 
   1053     return main_data_begin;
   1054 }
   1055 
   1056 static void drmp3_L3_read_scalefactors(drmp3_uint8 *scf, drmp3_uint8 *ist_pos, const drmp3_uint8 *scf_size, const drmp3_uint8 *scf_count, drmp3_bs *bitbuf, int scfsi)
   1057 {
   1058     int i, k;
   1059     for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)
   1060     {
   1061         int cnt = scf_count[i];
   1062         if (scfsi & 8)
   1063         {
   1064             memcpy(scf, ist_pos, cnt);
   1065         } else
   1066         {
   1067             int bits = scf_size[i];
   1068             if (!bits)
   1069             {
   1070                 memset(scf, 0, cnt);
   1071                 memset(ist_pos, 0, cnt);
   1072             } else
   1073             {
   1074                 int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
   1075                 for (k = 0; k < cnt; k++)
   1076                 {
   1077                     int s = drmp3_bs_get_bits(bitbuf, bits);
   1078                     ist_pos[k] = (drmp3_uint8)(s == max_scf ? -1 : s);
   1079                     scf[k] = (drmp3_uint8)s;
   1080                 }
   1081             }
   1082         }
   1083         ist_pos += cnt;
   1084         scf += cnt;
   1085     }
   1086     scf[0] = scf[1] = scf[2] = 0;
   1087 }
   1088 
   1089 static float drmp3_L3_ldexp_q2(float y, int exp_q2)
   1090 {
   1091     static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };
   1092     int e;
   1093     do
   1094     {
   1095         e = DRMP3_MIN(30*4, exp_q2);
   1096         y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));
   1097     } while ((exp_q2 -= e) > 0);
   1098     return y;
   1099 }
   1100 
   1101 static void drmp3_L3_decode_scalefactors(const drmp3_uint8 *hdr, drmp3_uint8 *ist_pos, drmp3_bs *bs, const drmp3_L3_gr_info *gr, float *scf, int ch)
   1102 {
   1103     static const drmp3_uint8 g_scf_partitions[3][28] = {
   1104         { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 },
   1105         { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 },
   1106         { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 }
   1107     };
   1108     const drmp3_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];
   1109     drmp3_uint8 scf_size[4], iscf[40];
   1110     int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;
   1111     float gain;
   1112 
   1113     if (DRMP3_HDR_TEST_MPEG1(hdr))
   1114     {
   1115         static const drmp3_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };
   1116         int part = g_scfc_decode[gr->scalefac_compress];
   1117         scf_size[1] = scf_size[0] = (drmp3_uint8)(part >> 2);
   1118         scf_size[3] = scf_size[2] = (drmp3_uint8)(part & 3);
   1119     } else
   1120     {
   1121         static const drmp3_uint8 g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 };
   1122         int k, modprod, sfc, ist = DRMP3_HDR_TEST_I_STEREO(hdr) && ch;
   1123         sfc = gr->scalefac_compress >> ist;
   1124         for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)
   1125         {
   1126             for (modprod = 1, i = 3; i >= 0; i--)
   1127             {
   1128                 scf_size[i] = (drmp3_uint8)(sfc / modprod % g_mod[k + i]);
   1129                 modprod *= g_mod[k + i];
   1130             }
   1131         }
   1132         scf_partition += k;
   1133         scfsi = -16;
   1134     }
   1135     drmp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
   1136 
   1137     if (gr->n_short_sfb)
   1138     {
   1139         int sh = 3 - scf_shift;
   1140         for (i = 0; i < gr->n_short_sfb; i += 3)
   1141         {
   1142             iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh;
   1143             iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh;
   1144             iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh;
   1145         }
   1146     } else if (gr->preflag)
   1147     {
   1148         static const drmp3_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };
   1149         for (i = 0; i < 10; i++)
   1150         {
   1151             iscf[11 + i] += g_preamp[i];
   1152         }
   1153     }
   1154 
   1155     gain_exp = gr->global_gain + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210 - (DRMP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0);
   1156     gain = drmp3_L3_ldexp_q2(1 << (DRMP3_MAX_SCFI/4),  DRMP3_MAX_SCFI - gain_exp);
   1157     for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++)
   1158     {
   1159         scf[i] = drmp3_L3_ldexp_q2(gain, iscf[i] << scf_shift);
   1160     }
   1161 }
   1162 
   1163 static const float g_drmp3_pow43[129 + 16] = {
   1164     0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f,
   1165     0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f
   1166 };
   1167 
   1168 static float drmp3_L3_pow_43(int x)
   1169 {
   1170     float frac;
   1171     int sign, mult = 256;
   1172 
   1173     if (x < 129)
   1174     {
   1175         return g_drmp3_pow43[16 + x];
   1176     }
   1177 
   1178     if (x < 1024)
   1179     {
   1180         mult = 16;
   1181         x <<= 3;
   1182     }
   1183 
   1184     sign = 2*x & 64;
   1185     frac = (float)((x & 63) - sign) / ((x & ~63) + sign);
   1186     return g_drmp3_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;
   1187 }
   1188 
   1189 static void drmp3_L3_huffman(float *dst, drmp3_bs *bs, const drmp3_L3_gr_info *gr_info, const float *scf, int layer3gr_limit)
   1190 {
   1191     static const drmp3_int16 tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1192         785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,
   1193         -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288,
   1194         -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288,
   1195         -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258,
   1196         -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259,
   1197         -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258,
   1198         -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258,
   1199         -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259,
   1200         -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258,
   1201         -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290,
   1202         -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259,
   1203         -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258,
   1204         -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259,
   1205         -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258,
   1206         -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 };
   1207     static const drmp3_uint8 tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205};
   1208     static const drmp3_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };
   1209     static const drmp3_int16 tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 };
   1210     static const drmp3_uint8 g_linbits[] =  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 };
   1211 
   1212 #define DRMP3_PEEK_BITS(n)    (bs_cache >> (32 - n))
   1213 #define DRMP3_FLUSH_BITS(n)   { bs_cache <<= (n); bs_sh += (n); }
   1214 #define DRMP3_CHECK_BITS      while (bs_sh >= 0) { bs_cache |= (drmp3_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }
   1215 #define DRMP3_BSPOS           ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)
   1216 
   1217     float one = 0.0f;
   1218     int ireg = 0, big_val_cnt = gr_info->big_values;
   1219     const drmp3_uint8 *sfb = gr_info->sfbtab;
   1220     const drmp3_uint8 *bs_next_ptr = bs->buf + bs->pos/8;
   1221     drmp3_uint32 bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7);
   1222     int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;
   1223     bs_next_ptr += 4;
   1224 
   1225     while (big_val_cnt > 0)
   1226     {
   1227         int tab_num = gr_info->table_select[ireg];
   1228         int sfb_cnt = gr_info->region_count[ireg++];
   1229         const drmp3_int16 *codebook = tabs + tabindex[tab_num];
   1230         int linbits = g_linbits[tab_num];
   1231         if (linbits)
   1232         {
   1233             do
   1234             {
   1235                 np = *sfb++ / 2;
   1236                 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
   1237                 one = *scf++;
   1238                 do
   1239                 {
   1240                     int j, w = 5;
   1241                     int leaf = codebook[DRMP3_PEEK_BITS(w)];
   1242                     while (leaf < 0)
   1243                     {
   1244                         DRMP3_FLUSH_BITS(w);
   1245                         w = leaf & 7;
   1246                         leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)];
   1247                     }
   1248                     DRMP3_FLUSH_BITS(leaf >> 8);
   1249 
   1250                     for (j = 0; j < 2; j++, dst++, leaf >>= 4)
   1251                     {
   1252                         int lsb = leaf & 0x0F;
   1253                         if (lsb == 15)
   1254                         {
   1255                             lsb += DRMP3_PEEK_BITS(linbits);
   1256                             DRMP3_FLUSH_BITS(linbits);
   1257                             DRMP3_CHECK_BITS;
   1258                             *dst = one*drmp3_L3_pow_43(lsb)*((drmp3_int32)bs_cache < 0 ? -1: 1);
   1259                         } else
   1260                         {
   1261                             *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
   1262                         }
   1263                         DRMP3_FLUSH_BITS(lsb ? 1 : 0);
   1264                     }
   1265                     DRMP3_CHECK_BITS;
   1266                 } while (--pairs_to_decode);
   1267             } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
   1268         } else
   1269         {
   1270             do
   1271             {
   1272                 np = *sfb++ / 2;
   1273                 pairs_to_decode = DRMP3_MIN(big_val_cnt, np);
   1274                 one = *scf++;
   1275                 do
   1276                 {
   1277                     int j, w = 5;
   1278                     int leaf = codebook[DRMP3_PEEK_BITS(w)];
   1279                     while (leaf < 0)
   1280                     {
   1281                         DRMP3_FLUSH_BITS(w);
   1282                         w = leaf & 7;
   1283                         leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)];
   1284                     }
   1285                     DRMP3_FLUSH_BITS(leaf >> 8);
   1286 
   1287                     for (j = 0; j < 2; j++, dst++, leaf >>= 4)
   1288                     {
   1289                         int lsb = leaf & 0x0F;
   1290                         *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
   1291                         DRMP3_FLUSH_BITS(lsb ? 1 : 0);
   1292                     }
   1293                     DRMP3_CHECK_BITS;
   1294                 } while (--pairs_to_decode);
   1295             } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
   1296         }
   1297     }
   1298 
   1299     for (np = 1 - big_val_cnt;; dst += 4)
   1300     {
   1301         const drmp3_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
   1302         int leaf = codebook_count1[DRMP3_PEEK_BITS(4)];
   1303         if (!(leaf & 8))
   1304         {
   1305             leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
   1306         }
   1307         DRMP3_FLUSH_BITS(leaf & 7);
   1308         if (DRMP3_BSPOS > layer3gr_limit)
   1309         {
   1310             break;
   1311         }
   1312 #define DRMP3_RELOAD_SCALEFACTOR  if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; }
   1313 #define DRMP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((drmp3_int32)bs_cache < 0) ? -one : one; DRMP3_FLUSH_BITS(1) }
   1314         DRMP3_RELOAD_SCALEFACTOR;
   1315         DRMP3_DEQ_COUNT1(0);
   1316         DRMP3_DEQ_COUNT1(1);
   1317         DRMP3_RELOAD_SCALEFACTOR;
   1318         DRMP3_DEQ_COUNT1(2);
   1319         DRMP3_DEQ_COUNT1(3);
   1320         DRMP3_CHECK_BITS;
   1321     }
   1322 
   1323     bs->pos = layer3gr_limit;
   1324 }
   1325 
   1326 static void drmp3_L3_midside_stereo(float *left, int n)
   1327 {
   1328     int i = 0;
   1329     float *right = left + 576;
   1330 #if DRMP3_HAVE_SIMD
   1331     if (drmp3_have_simd()) for (; i < n - 3; i += 4)
   1332     {
   1333         drmp3_f4 vl = DRMP3_VLD(left + i);
   1334         drmp3_f4 vr = DRMP3_VLD(right + i);
   1335         DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr));
   1336         DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr));
   1337     }
   1338 #endif
   1339     for (; i < n; i++)
   1340     {
   1341         float a = left[i];
   1342         float b = right[i];
   1343         left[i] = a + b;
   1344         right[i] = a - b;
   1345     }
   1346 }
   1347 
   1348 static void drmp3_L3_intensity_stereo_band(float *left, int n, float kl, float kr)
   1349 {
   1350     int i;
   1351     for (i = 0; i < n; i++)
   1352     {
   1353         left[i + 576] = left[i]*kr;
   1354         left[i] = left[i]*kl;
   1355     }
   1356 }
   1357 
   1358 static void drmp3_L3_stereo_top_band(const float *right, const drmp3_uint8 *sfb, int nbands, int max_band[3])
   1359 {
   1360     int i, k;
   1361 
   1362     max_band[0] = max_band[1] = max_band[2] = -1;
   1363 
   1364     for (i = 0; i < nbands; i++)
   1365     {
   1366         for (k = 0; k < sfb[i]; k += 2)
   1367         {
   1368             if (right[k] != 0 || right[k + 1] != 0)
   1369             {
   1370                 max_band[i % 3] = i;
   1371                 break;
   1372             }
   1373         }
   1374         right += sfb[i];
   1375     }
   1376 }
   1377 
   1378 static void drmp3_L3_stereo_process(float *left, const drmp3_uint8 *ist_pos, const drmp3_uint8 *sfb, const drmp3_uint8 *hdr, int max_band[3], int mpeg2_sh)
   1379 {
   1380     static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 };
   1381     unsigned i, max_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 7 : 64;
   1382 
   1383     for (i = 0; sfb[i]; i++)
   1384     {
   1385         unsigned ipos = ist_pos[i];
   1386         if ((int)i > max_band[i % 3] && ipos < max_pos)
   1387         {
   1388             float kl, kr, s = DRMP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
   1389             if (DRMP3_HDR_TEST_MPEG1(hdr))
   1390             {
   1391                 kl = g_pan[2*ipos];
   1392                 kr = g_pan[2*ipos + 1];
   1393             } else
   1394             {
   1395                 kl = 1;
   1396                 kr = drmp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
   1397                 if (ipos & 1)
   1398                 {
   1399                     kl = kr;
   1400                     kr = 1;
   1401                 }
   1402             }
   1403             drmp3_L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s);
   1404         } else if (DRMP3_HDR_TEST_MS_STEREO(hdr))
   1405         {
   1406             drmp3_L3_midside_stereo(left, sfb[i]);
   1407         }
   1408         left += sfb[i];
   1409     }
   1410 }
   1411 
   1412 static void drmp3_L3_intensity_stereo(float *left, drmp3_uint8 *ist_pos, const drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr)
   1413 {
   1414     int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;
   1415     int i, max_blocks = gr->n_short_sfb ? 3 : 1;
   1416 
   1417     drmp3_L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);
   1418     if (gr->n_long_sfb)
   1419     {
   1420         max_band[0] = max_band[1] = max_band[2] = DRMP3_MAX(DRMP3_MAX(max_band[0], max_band[1]), max_band[2]);
   1421     }
   1422     for (i = 0; i < max_blocks; i++)
   1423     {
   1424         int default_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 3 : 0;
   1425         int itop = n_sfb - max_blocks + i;
   1426         int prev = itop - max_blocks;
   1427         ist_pos[itop] = (drmp3_uint8)(max_band[i] >= prev ? default_pos : ist_pos[prev]);
   1428     }
   1429     drmp3_L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);
   1430 }
   1431 
   1432 static void drmp3_L3_reorder(float *grbuf, float *scratch, const drmp3_uint8 *sfb)
   1433 {
   1434     int i, len;
   1435     float *src = grbuf, *dst = scratch;
   1436 
   1437     for (;0 != (len = *sfb); sfb += 3, src += 2*len)
   1438     {
   1439         for (i = 0; i < len; i++, src++)
   1440         {
   1441             *dst++ = src[0*len];
   1442             *dst++ = src[1*len];
   1443             *dst++ = src[2*len];
   1444         }
   1445     }
   1446     memcpy(grbuf, scratch, (dst - scratch)*sizeof(float));
   1447 }
   1448 
   1449 static void drmp3_L3_antialias(float *grbuf, int nbands)
   1450 {
   1451     static const float g_aa[2][8] = {
   1452         {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},
   1453         {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}
   1454     };
   1455 
   1456     for (; nbands > 0; nbands--, grbuf += 18)
   1457     {
   1458         int i = 0;
   1459 #if DRMP3_HAVE_SIMD
   1460         if (drmp3_have_simd()) for (; i < 8; i += 4)
   1461         {
   1462             drmp3_f4 vu = DRMP3_VLD(grbuf + 18 + i);
   1463             drmp3_f4 vd = DRMP3_VLD(grbuf + 14 - i);
   1464             drmp3_f4 vc0 = DRMP3_VLD(g_aa[0] + i);
   1465             drmp3_f4 vc1 = DRMP3_VLD(g_aa[1] + i);
   1466             vd = DRMP3_VREV(vd);
   1467             DRMP3_VSTORE(grbuf + 18 + i, DRMP3_VSUB(DRMP3_VMUL(vu, vc0), DRMP3_VMUL(vd, vc1)));
   1468             vd = DRMP3_VADD(DRMP3_VMUL(vu, vc1), DRMP3_VMUL(vd, vc0));
   1469             DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vd));
   1470         }
   1471 #endif
   1472 #ifndef DR_MP3_ONLY_SIMD
   1473         for(; i < 8; i++)
   1474         {
   1475             float u = grbuf[18 + i];
   1476             float d = grbuf[17 - i];
   1477             grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i];
   1478             grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i];
   1479         }
   1480 #endif
   1481     }
   1482 }
   1483 
   1484 static void drmp3_L3_dct3_9(float *y)
   1485 {
   1486     float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;
   1487 
   1488     s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8];
   1489     t0 = s0 + s6*0.5f;
   1490     s0 -= s6;
   1491     t4 = (s4 + s2)*0.93969262f;
   1492     t2 = (s8 + s2)*0.76604444f;
   1493     s6 = (s4 - s8)*0.17364818f;
   1494     s4 += s8 - s2;
   1495 
   1496     s2 = s0 - s4*0.5f;
   1497     y[4] = s4 + s0;
   1498     s8 = t0 - t2 + s6;
   1499     s0 = t0 - t4 + t2;
   1500     s4 = t0 + t4 - s6;
   1501 
   1502     s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7];
   1503 
   1504     s3 *= 0.86602540f;
   1505     t0 = (s5 + s1)*0.98480775f;
   1506     t4 = (s5 - s7)*0.34202014f;
   1507     t2 = (s1 + s7)*0.64278761f;
   1508     s1 = (s1 - s5 - s7)*0.86602540f;
   1509 
   1510     s5 = t0 - s3 - t2;
   1511     s7 = t4 - s3 - t0;
   1512     s3 = t4 + s3 - t2;
   1513 
   1514     y[0] = s4 - s7;
   1515     y[1] = s2 + s1;
   1516     y[2] = s0 - s3;
   1517     y[3] = s8 + s5;
   1518     y[5] = s8 - s5;
   1519     y[6] = s0 + s3;
   1520     y[7] = s2 - s1;
   1521     y[8] = s4 + s7;
   1522 }
   1523 
   1524 static void drmp3_L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands)
   1525 {
   1526     int i, j;
   1527     static const float g_twid9[18] = {
   1528         0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f
   1529     };
   1530 
   1531     for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9)
   1532     {
   1533         float co[9], si[9];
   1534         co[0] = -grbuf[0];
   1535         si[0] = grbuf[17];
   1536         for (i = 0; i < 4; i++)
   1537         {
   1538             si[8 - 2*i] =   grbuf[4*i + 1] - grbuf[4*i + 2];
   1539             co[1 + 2*i] =   grbuf[4*i + 1] + grbuf[4*i + 2];
   1540             si[7 - 2*i] =   grbuf[4*i + 4] - grbuf[4*i + 3];
   1541             co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]);
   1542         }
   1543         drmp3_L3_dct3_9(co);
   1544         drmp3_L3_dct3_9(si);
   1545 
   1546         si[1] = -si[1];
   1547         si[3] = -si[3];
   1548         si[5] = -si[5];
   1549         si[7] = -si[7];
   1550 
   1551         i = 0;
   1552 
   1553 #if DRMP3_HAVE_SIMD
   1554         if (drmp3_have_simd()) for (; i < 8; i += 4)
   1555         {
   1556             drmp3_f4 vovl = DRMP3_VLD(overlap + i);
   1557             drmp3_f4 vc = DRMP3_VLD(co + i);
   1558             drmp3_f4 vs = DRMP3_VLD(si + i);
   1559             drmp3_f4 vr0 = DRMP3_VLD(g_twid9 + i);
   1560             drmp3_f4 vr1 = DRMP3_VLD(g_twid9 + 9 + i);
   1561             drmp3_f4 vw0 = DRMP3_VLD(window + i);
   1562             drmp3_f4 vw1 = DRMP3_VLD(window + 9 + i);
   1563             drmp3_f4 vsum = DRMP3_VADD(DRMP3_VMUL(vc, vr1), DRMP3_VMUL(vs, vr0));
   1564             DRMP3_VSTORE(overlap + i, DRMP3_VSUB(DRMP3_VMUL(vc, vr0), DRMP3_VMUL(vs, vr1)));
   1565             DRMP3_VSTORE(grbuf + i, DRMP3_VSUB(DRMP3_VMUL(vovl, vw0), DRMP3_VMUL(vsum, vw1)));
   1566             vsum = DRMP3_VADD(DRMP3_VMUL(vovl, vw1), DRMP3_VMUL(vsum, vw0));
   1567             DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vsum));
   1568         }
   1569 #endif
   1570         for (; i < 9; i++)
   1571         {
   1572             float ovl  = overlap[i];
   1573             float sum  = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i];
   1574             overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i];
   1575             grbuf[i]      = ovl*window[0 + i] - sum*window[9 + i];
   1576             grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i];
   1577         }
   1578     }
   1579 }
   1580 
   1581 static void drmp3_L3_idct3(float x0, float x1, float x2, float *dst)
   1582 {
   1583     float m1 = x1*0.86602540f;
   1584     float a1 = x0 - x2*0.5f;
   1585     dst[1] = x0 + x2;
   1586     dst[0] = a1 + m1;
   1587     dst[2] = a1 - m1;
   1588 }
   1589 
   1590 static void drmp3_L3_imdct12(float *x, float *dst, float *overlap)
   1591 {
   1592     static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
   1593     float co[3], si[3];
   1594     int i;
   1595 
   1596     drmp3_L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co);
   1597     drmp3_L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si);
   1598     si[1] = -si[1];
   1599 
   1600     for (i = 0; i < 3; i++)
   1601     {
   1602         float ovl  = overlap[i];
   1603         float sum  = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i];
   1604         overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i];
   1605         dst[i]     = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i];
   1606         dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i];
   1607     }
   1608 }
   1609 
   1610 static void drmp3_L3_imdct_short(float *grbuf, float *overlap, int nbands)
   1611 {
   1612     for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
   1613     {
   1614         float tmp[18];
   1615         memcpy(tmp, grbuf, sizeof(tmp));
   1616         memcpy(grbuf, overlap, 6*sizeof(float));
   1617         drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);
   1618         drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
   1619         drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6);
   1620     }
   1621 }
   1622 
   1623 static void drmp3_L3_change_sign(float *grbuf)
   1624 {
   1625     int b, i;
   1626     for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36)
   1627         for (i = 1; i < 18; i += 2)
   1628             grbuf[i] = -grbuf[i];
   1629 }
   1630 
   1631 static void drmp3_L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands)
   1632 {
   1633     static const float g_mdct_window[2][18] = {
   1634         { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f },
   1635         { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }
   1636     };
   1637     if (n_long_bands)
   1638     {
   1639         drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
   1640         grbuf += 18*n_long_bands;
   1641         overlap += 9*n_long_bands;
   1642     }
   1643     if (block_type == DRMP3_SHORT_BLOCK_TYPE)
   1644         drmp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
   1645     else
   1646         drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == DRMP3_STOP_BLOCK_TYPE], 32 - n_long_bands);
   1647 }
   1648 
   1649 static void drmp3_L3_save_reservoir(drmp3dec *h, drmp3dec_scratch *s)
   1650 {
   1651     int pos = (s->bs.pos + 7)/8u;
   1652     int remains = s->bs.limit/8u - pos;
   1653     if (remains > DRMP3_MAX_BITRESERVOIR_BYTES)
   1654     {
   1655         pos += remains - DRMP3_MAX_BITRESERVOIR_BYTES;
   1656         remains = DRMP3_MAX_BITRESERVOIR_BYTES;
   1657     }
   1658     if (remains > 0)
   1659     {
   1660         memmove(h->reserv_buf, s->maindata + pos, remains);
   1661     }
   1662     h->reserv = remains;
   1663 }
   1664 
   1665 static int drmp3_L3_restore_reservoir(drmp3dec *h, drmp3_bs *bs, drmp3dec_scratch *s, int main_data_begin)
   1666 {
   1667     int frame_bytes = (bs->limit - bs->pos)/8;
   1668     int bytes_have = DRMP3_MIN(h->reserv, main_data_begin);
   1669     memcpy(s->maindata, h->reserv_buf + DRMP3_MAX(0, h->reserv - main_data_begin), DRMP3_MIN(h->reserv, main_data_begin));
   1670     memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
   1671     drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);
   1672     return h->reserv >= main_data_begin;
   1673 }
   1674 
   1675 static void drmp3_L3_decode(drmp3dec *h, drmp3dec_scratch *s, drmp3_L3_gr_info *gr_info, int nch)
   1676 {
   1677     int ch;
   1678 
   1679     for (ch = 0; ch < nch; ch++)
   1680     {
   1681         int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length;
   1682         drmp3_L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch);
   1683         drmp3_L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit);
   1684     }
   1685 
   1686     if (DRMP3_HDR_TEST_I_STEREO(h->header))
   1687     {
   1688         drmp3_L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header);
   1689     } else if (DRMP3_HDR_IS_MS_STEREO(h->header))
   1690     {
   1691         drmp3_L3_midside_stereo(s->grbuf[0], 576);
   1692     }
   1693 
   1694     for (ch = 0; ch < nch; ch++, gr_info++)
   1695     {
   1696         int aa_bands = 31;
   1697         int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(DRMP3_HDR_GET_MY_SAMPLE_RATE(h->header) == 2);
   1698 
   1699         if (gr_info->n_short_sfb)
   1700         {
   1701             aa_bands = n_long_bands - 1;
   1702             drmp3_L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);
   1703         }
   1704 
   1705         drmp3_L3_antialias(s->grbuf[ch], aa_bands);
   1706         drmp3_L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands);
   1707         drmp3_L3_change_sign(s->grbuf[ch]);
   1708     }
   1709 }
   1710 
   1711 static void drmp3d_DCT_II(float *grbuf, int n)
   1712 {
   1713     static const float g_sec[24] = {
   1714         10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f
   1715     };
   1716     int i, k = 0;
   1717 #if DRMP3_HAVE_SIMD
   1718     if (drmp3_have_simd()) for (; k < n; k += 4)
   1719     {
   1720         drmp3_f4 t[4][8], *x;
   1721         float *y = grbuf + k;
   1722 
   1723         for (x = t[0], i = 0; i < 8; i++, x++)
   1724         {
   1725             drmp3_f4 x0 = DRMP3_VLD(&y[i*18]);
   1726             drmp3_f4 x1 = DRMP3_VLD(&y[(15 - i)*18]);
   1727             drmp3_f4 x2 = DRMP3_VLD(&y[(16 + i)*18]);
   1728             drmp3_f4 x3 = DRMP3_VLD(&y[(31 - i)*18]);
   1729             drmp3_f4 t0 = DRMP3_VADD(x0, x3);
   1730             drmp3_f4 t1 = DRMP3_VADD(x1, x2);
   1731             drmp3_f4 t2 = DRMP3_VMUL_S(DRMP3_VSUB(x1, x2), g_sec[3*i + 0]);
   1732             drmp3_f4 t3 = DRMP3_VMUL_S(DRMP3_VSUB(x0, x3), g_sec[3*i + 1]);
   1733             x[0] = DRMP3_VADD(t0, t1);
   1734             x[8] = DRMP3_VMUL_S(DRMP3_VSUB(t0, t1), g_sec[3*i + 2]);
   1735             x[16] = DRMP3_VADD(t3, t2);
   1736             x[24] = DRMP3_VMUL_S(DRMP3_VSUB(t3, t2), g_sec[3*i + 2]);
   1737         }
   1738         for (x = t[0], i = 0; i < 4; i++, x += 8)
   1739         {
   1740             drmp3_f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;
   1741             xt = DRMP3_VSUB(x0, x7); x0 = DRMP3_VADD(x0, x7);
   1742             x7 = DRMP3_VSUB(x1, x6); x1 = DRMP3_VADD(x1, x6);
   1743             x6 = DRMP3_VSUB(x2, x5); x2 = DRMP3_VADD(x2, x5);
   1744             x5 = DRMP3_VSUB(x3, x4); x3 = DRMP3_VADD(x3, x4);
   1745             x4 = DRMP3_VSUB(x0, x3); x0 = DRMP3_VADD(x0, x3);
   1746             x3 = DRMP3_VSUB(x1, x2); x1 = DRMP3_VADD(x1, x2);
   1747             x[0] = DRMP3_VADD(x0, x1);
   1748             x[4] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x1), 0.70710677f);
   1749             x5 = DRMP3_VADD(x5, x6);
   1750             x6 = DRMP3_VMUL_S(DRMP3_VADD(x6, x7), 0.70710677f);
   1751             x7 = DRMP3_VADD(x7, xt);
   1752             x3 = DRMP3_VMUL_S(DRMP3_VADD(x3, x4), 0.70710677f);
   1753             x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */
   1754             x7 = DRMP3_VADD(x7, DRMP3_VMUL_S(x5, 0.382683432f));
   1755             x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f));
   1756             x0 = DRMP3_VSUB(xt, x6); xt = DRMP3_VADD(xt, x6);
   1757             x[1] = DRMP3_VMUL_S(DRMP3_VADD(xt, x7), 0.50979561f);
   1758             x[2] = DRMP3_VMUL_S(DRMP3_VADD(x4, x3), 0.54119611f);
   1759             x[3] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x5), 0.60134488f);
   1760             x[5] = DRMP3_VMUL_S(DRMP3_VADD(x0, x5), 0.89997619f);
   1761             x[6] = DRMP3_VMUL_S(DRMP3_VSUB(x4, x3), 1.30656302f);
   1762             x[7] = DRMP3_VMUL_S(DRMP3_VSUB(xt, x7), 2.56291556f);
   1763         }
   1764 
   1765         if (k > n - 3)
   1766         {
   1767 #if DRMP3_HAVE_SSE
   1768 #define DRMP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)
   1769 #else
   1770 #define DRMP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18],  vget_low_f32(v))
   1771 #endif
   1772             for (i = 0; i < 7; i++, y += 4*18)
   1773             {
   1774                 drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]);
   1775                 DRMP3_VSAVE2(0, t[0][i]);
   1776                 DRMP3_VSAVE2(1, DRMP3_VADD(t[2][i], s));
   1777                 DRMP3_VSAVE2(2, DRMP3_VADD(t[1][i], t[1][i + 1]));
   1778                 DRMP3_VSAVE2(3, DRMP3_VADD(t[2][1 + i], s));
   1779             }
   1780             DRMP3_VSAVE2(0, t[0][7]);
   1781             DRMP3_VSAVE2(1, DRMP3_VADD(t[2][7], t[3][7]));
   1782             DRMP3_VSAVE2(2, t[1][7]);
   1783             DRMP3_VSAVE2(3, t[3][7]);
   1784         } else
   1785         {
   1786 #define DRMP3_VSAVE4(i, v) DRMP3_VSTORE(&y[i*18], v)
   1787             for (i = 0; i < 7; i++, y += 4*18)
   1788             {
   1789                 drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]);
   1790                 DRMP3_VSAVE4(0, t[0][i]);
   1791                 DRMP3_VSAVE4(1, DRMP3_VADD(t[2][i], s));
   1792                 DRMP3_VSAVE4(2, DRMP3_VADD(t[1][i], t[1][i + 1]));
   1793                 DRMP3_VSAVE4(3, DRMP3_VADD(t[2][1 + i], s));
   1794             }
   1795             DRMP3_VSAVE4(0, t[0][7]);
   1796             DRMP3_VSAVE4(1, DRMP3_VADD(t[2][7], t[3][7]));
   1797             DRMP3_VSAVE4(2, t[1][7]);
   1798             DRMP3_VSAVE4(3, t[3][7]);
   1799         }
   1800     } else
   1801 #endif
   1802 #ifdef DR_MP3_ONLY_SIMD
   1803     {}
   1804 #else
   1805     for (; k < n; k++)
   1806     {
   1807         float t[4][8], *x, *y = grbuf + k;
   1808 
   1809         for (x = t[0], i = 0; i < 8; i++, x++)
   1810         {
   1811             float x0 = y[i*18];
   1812             float x1 = y[(15 - i)*18];
   1813             float x2 = y[(16 + i)*18];
   1814             float x3 = y[(31 - i)*18];
   1815             float t0 = x0 + x3;
   1816             float t1 = x1 + x2;
   1817             float t2 = (x1 - x2)*g_sec[3*i + 0];
   1818             float t3 = (x0 - x3)*g_sec[3*i + 1];
   1819             x[0] = t0 + t1;
   1820             x[8] = (t0 - t1)*g_sec[3*i + 2];
   1821             x[16] = t3 + t2;
   1822             x[24] = (t3 - t2)*g_sec[3*i + 2];
   1823         }
   1824         for (x = t[0], i = 0; i < 4; i++, x += 8)
   1825         {
   1826             float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;
   1827             xt = x0 - x7; x0 += x7;
   1828             x7 = x1 - x6; x1 += x6;
   1829             x6 = x2 - x5; x2 += x5;
   1830             x5 = x3 - x4; x3 += x4;
   1831             x4 = x0 - x3; x0 += x3;
   1832             x3 = x1 - x2; x1 += x2;
   1833             x[0] = x0 + x1;
   1834             x[4] = (x0 - x1)*0.70710677f;
   1835             x5 =  x5 + x6;
   1836             x6 = (x6 + x7)*0.70710677f;
   1837             x7 =  x7 + xt;
   1838             x3 = (x3 + x4)*0.70710677f;
   1839             x5 -= x7*0.198912367f;  /* rotate by PI/8 */
   1840             x7 += x5*0.382683432f;
   1841             x5 -= x7*0.198912367f;
   1842             x0 = xt - x6; xt += x6;
   1843             x[1] = (xt + x7)*0.50979561f;
   1844             x[2] = (x4 + x3)*0.54119611f;
   1845             x[3] = (x0 - x5)*0.60134488f;
   1846             x[5] = (x0 + x5)*0.89997619f;
   1847             x[6] = (x4 - x3)*1.30656302f;
   1848             x[7] = (xt - x7)*2.56291556f;
   1849 
   1850         }
   1851         for (i = 0; i < 7; i++, y += 4*18)
   1852         {
   1853             y[0*18] = t[0][i];
   1854             y[1*18] = t[2][i] + t[3][i] + t[3][i + 1];
   1855             y[2*18] = t[1][i] + t[1][i + 1];
   1856             y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1];
   1857         }
   1858         y[0*18] = t[0][7];
   1859         y[1*18] = t[2][7] + t[3][7];
   1860         y[2*18] = t[1][7];
   1861         y[3*18] = t[3][7];
   1862     }
   1863 #endif
   1864 }
   1865 
   1866 #ifndef DR_MP3_FLOAT_OUTPUT
   1867 typedef drmp3_int16 drmp3d_sample_t;
   1868 
   1869 static drmp3_int16 drmp3d_scale_pcm(float sample)
   1870 {
   1871     drmp3_int16 s;
   1872     if (sample >=  32766.5) return (drmp3_int16) 32767;
   1873     if (sample <= -32767.5) return (drmp3_int16)-32768;
   1874     s = (drmp3_int16)(sample + .5f);
   1875     s -= (s < 0);   /* away from zero, to be compliant */
   1876     return (drmp3_int16)s;
   1877 }
   1878 #else
   1879 typedef float drmp3d_sample_t;
   1880 
   1881 static float drmp3d_scale_pcm(float sample)
   1882 {
   1883     return sample*(1.f/32768.f);
   1884 }
   1885 #endif
   1886 
   1887 static void drmp3d_synth_pair(drmp3d_sample_t *pcm, int nch, const float *z)
   1888 {
   1889     float a;
   1890     a  = (z[14*64] - z[    0]) * 29;
   1891     a += (z[ 1*64] + z[13*64]) * 213;
   1892     a += (z[12*64] - z[ 2*64]) * 459;
   1893     a += (z[ 3*64] + z[11*64]) * 2037;
   1894     a += (z[10*64] - z[ 4*64]) * 5153;
   1895     a += (z[ 5*64] + z[ 9*64]) * 6574;
   1896     a += (z[ 8*64] - z[ 6*64]) * 37489;
   1897     a +=  z[ 7*64]             * 75038;
   1898     pcm[0] = drmp3d_scale_pcm(a);
   1899 
   1900     z += 2;
   1901     a  = z[14*64] * 104;
   1902     a += z[12*64] * 1567;
   1903     a += z[10*64] * 9727;
   1904     a += z[ 8*64] * 64019;
   1905     a += z[ 6*64] * -9975;
   1906     a += z[ 4*64] * -45;
   1907     a += z[ 2*64] * 146;
   1908     a += z[ 0*64] * -5;
   1909     pcm[16*nch] = drmp3d_scale_pcm(a);
   1910 }
   1911 
   1912 static void drmp3d_synth(float *xl, drmp3d_sample_t *dstl, int nch, float *lins)
   1913 {
   1914     int i;
   1915     float *xr = xl + 576*(nch - 1);
   1916     drmp3d_sample_t *dstr = dstl + (nch - 1);
   1917 
   1918     static const float g_win[] = {
   1919         -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
   1920         -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
   1921         -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
   1922         -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
   1923         -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
   1924         -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
   1925         -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
   1926         -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
   1927         -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
   1928         -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
   1929         -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
   1930         -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
   1931         -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
   1932         -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
   1933         -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
   1934     };
   1935     float *zlin = lins + 15*64;
   1936     const float *w = g_win;
   1937 
   1938     zlin[4*15]     = xl[18*16];
   1939     zlin[4*15 + 1] = xr[18*16];
   1940     zlin[4*15 + 2] = xl[0];
   1941     zlin[4*15 + 3] = xr[0];
   1942 
   1943     zlin[4*31]     = xl[1 + 18*16];
   1944     zlin[4*31 + 1] = xr[1 + 18*16];
   1945     zlin[4*31 + 2] = xl[1];
   1946     zlin[4*31 + 3] = xr[1];
   1947 
   1948     drmp3d_synth_pair(dstr, nch, lins + 4*15 + 1);
   1949     drmp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);
   1950     drmp3d_synth_pair(dstl, nch, lins + 4*15);
   1951     drmp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);
   1952 
   1953 #if DRMP3_HAVE_SIMD
   1954     if (drmp3_have_simd()) for (i = 14; i >= 0; i--)
   1955     {
   1956 #define DRMP3_VLOAD(k) drmp3_f4 w0 = DRMP3_VSET(*w++); drmp3_f4 w1 = DRMP3_VSET(*w++); drmp3_f4 vz = DRMP3_VLD(&zlin[4*i - 64*k]); drmp3_f4 vy = DRMP3_VLD(&zlin[4*i - 64*(15 - k)]);
   1957 #define DRMP3_V0(k) { DRMP3_VLOAD(k) b =               DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0)) ; a =               DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1));  }
   1958 #define DRMP3_V1(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1))); }
   1959 #define DRMP3_V2(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vy, w1), DRMP3_VMUL(vz, w0))); }
   1960         drmp3_f4 a, b;
   1961         zlin[4*i]     = xl[18*(31 - i)];
   1962         zlin[4*i + 1] = xr[18*(31 - i)];
   1963         zlin[4*i + 2] = xl[1 + 18*(31 - i)];
   1964         zlin[4*i + 3] = xr[1 + 18*(31 - i)];
   1965         zlin[4*i + 64] = xl[1 + 18*(1 + i)];
   1966         zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)];
   1967         zlin[4*i - 64 + 2] = xl[18*(1 + i)];
   1968         zlin[4*i - 64 + 3] = xr[18*(1 + i)];
   1969 
   1970         DRMP3_V0(0) DRMP3_V2(1) DRMP3_V1(2) DRMP3_V2(3) DRMP3_V1(4) DRMP3_V2(5) DRMP3_V1(6) DRMP3_V2(7)
   1971 
   1972         {
   1973 #ifndef DR_MP3_FLOAT_OUTPUT
   1974 #if DRMP3_HAVE_SSE
   1975             static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
   1976             static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
   1977             __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
   1978                                            _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
   1979             dstr[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 1);
   1980             dstr[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 5);
   1981             dstl[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 0);
   1982             dstl[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 4);
   1983             dstr[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 3);
   1984             dstr[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 7);
   1985             dstl[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 2);
   1986             dstl[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 6);
   1987 #else
   1988             int16x4_t pcma, pcmb;
   1989             a = DRMP3_VADD(a, DRMP3_VSET(0.5f));
   1990             b = DRMP3_VADD(b, DRMP3_VSET(0.5f));
   1991             pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));
   1992             pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));
   1993             vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1);
   1994             vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1);
   1995             vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0);
   1996             vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0);
   1997             vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3);
   1998             vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3);
   1999             vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2);
   2000             vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2);
   2001 #endif
   2002 #else
   2003             static const drmp3_f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
   2004             a = DRMP3_VMUL(a, g_scale);
   2005             b = DRMP3_VMUL(b, g_scale);
   2006 #if DRMP3_HAVE_SSE
   2007             _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));
   2008             _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1)));
   2009             _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)));
   2010             _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0)));
   2011             _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)));
   2012             _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3)));
   2013             _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
   2014             _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2)));
   2015 #else
   2016             vst1q_lane_f32(dstr + (15 - i)*nch, a, 1);
   2017             vst1q_lane_f32(dstr + (17 + i)*nch, b, 1);
   2018             vst1q_lane_f32(dstl + (15 - i)*nch, a, 0);
   2019             vst1q_lane_f32(dstl + (17 + i)*nch, b, 0);
   2020             vst1q_lane_f32(dstr + (47 - i)*nch, a, 3);
   2021             vst1q_lane_f32(dstr + (49 + i)*nch, b, 3);
   2022             vst1q_lane_f32(dstl + (47 - i)*nch, a, 2);
   2023             vst1q_lane_f32(dstl + (49 + i)*nch, b, 2);
   2024 #endif
   2025 #endif /* DR_MP3_FLOAT_OUTPUT */
   2026         }
   2027     } else
   2028 #endif
   2029 #ifdef DR_MP3_ONLY_SIMD
   2030     {}
   2031 #else
   2032     for (i = 14; i >= 0; i--)
   2033     {
   2034 #define DRMP3_LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64];
   2035 #define DRMP3_S0(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j]  = vz[j]*w1 + vy[j]*w0, a[j]  = vz[j]*w0 - vy[j]*w1; }
   2036 #define DRMP3_S1(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; }
   2037 #define DRMP3_S2(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; }
   2038         float a[4], b[4];
   2039 
   2040         zlin[4*i]     = xl[18*(31 - i)];
   2041         zlin[4*i + 1] = xr[18*(31 - i)];
   2042         zlin[4*i + 2] = xl[1 + 18*(31 - i)];
   2043         zlin[4*i + 3] = xr[1 + 18*(31 - i)];
   2044         zlin[4*(i + 16)]   = xl[1 + 18*(1 + i)];
   2045         zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];
   2046         zlin[4*(i - 16) + 2] = xl[18*(1 + i)];
   2047         zlin[4*(i - 16) + 3] = xr[18*(1 + i)];
   2048 
   2049         DRMP3_S0(0) DRMP3_S2(1) DRMP3_S1(2) DRMP3_S2(3) DRMP3_S1(4) DRMP3_S2(5) DRMP3_S1(6) DRMP3_S2(7)
   2050 
   2051         dstr[(15 - i)*nch] = drmp3d_scale_pcm(a[1]);
   2052         dstr[(17 + i)*nch] = drmp3d_scale_pcm(b[1]);
   2053         dstl[(15 - i)*nch] = drmp3d_scale_pcm(a[0]);
   2054         dstl[(17 + i)*nch] = drmp3d_scale_pcm(b[0]);
   2055         dstr[(47 - i)*nch] = drmp3d_scale_pcm(a[3]);
   2056         dstr[(49 + i)*nch] = drmp3d_scale_pcm(b[3]);
   2057         dstl[(47 - i)*nch] = drmp3d_scale_pcm(a[2]);
   2058         dstl[(49 + i)*nch] = drmp3d_scale_pcm(b[2]);
   2059     }
   2060 #endif
   2061 }
   2062 
   2063 static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, drmp3d_sample_t *pcm, float *lins)
   2064 {
   2065     int i;
   2066     for (i = 0; i < nch; i++)
   2067     {
   2068         drmp3d_DCT_II(grbuf + 576*i, nbands);
   2069     }
   2070 
   2071     memcpy(lins, qmf_state, sizeof(float)*15*64);
   2072 
   2073     for (i = 0; i < nbands; i += 2)
   2074     {
   2075         drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
   2076     }
   2077 #ifndef DR_MP3_NONSTANDARD_BUT_LOGICAL
   2078     if (nch == 1)
   2079     {
   2080         for (i = 0; i < 15*64; i += 2)
   2081         {
   2082             qmf_state[i] = lins[nbands*64 + i];
   2083         }
   2084     } else
   2085 #endif
   2086     {
   2087         memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64);
   2088     }
   2089 }
   2090 
   2091 static int drmp3d_match_frame(const drmp3_uint8 *hdr, int mp3_bytes, int frame_bytes)
   2092 {
   2093     int i, nmatch;
   2094     for (i = 0, nmatch = 0; nmatch < DRMP3_MAX_FRAME_SYNC_MATCHES; nmatch++)
   2095     {
   2096         i += drmp3_hdr_frame_bytes(hdr + i, frame_bytes) + drmp3_hdr_padding(hdr + i);
   2097         if (i + DRMP3_HDR_SIZE > mp3_bytes)
   2098             return nmatch > 0;
   2099         if (!drmp3_hdr_compare(hdr, hdr + i))
   2100             return 0;
   2101     }
   2102     return 1;
   2103 }
   2104 
   2105 static int drmp3d_find_frame(const drmp3_uint8 *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes)
   2106 {
   2107     int i, k;
   2108     for (i = 0; i < mp3_bytes - DRMP3_HDR_SIZE; i++, mp3++)
   2109     {
   2110         if (drmp3_hdr_valid(mp3))
   2111         {
   2112             int frame_bytes = drmp3_hdr_frame_bytes(mp3, *free_format_bytes);
   2113             int frame_and_padding = frame_bytes + drmp3_hdr_padding(mp3);
   2114 
   2115             for (k = DRMP3_HDR_SIZE; !frame_bytes && k < DRMP3_MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - DRMP3_HDR_SIZE; k++)
   2116             {
   2117                 if (drmp3_hdr_compare(mp3, mp3 + k))
   2118                 {
   2119                     int fb = k - drmp3_hdr_padding(mp3);
   2120                     int nextfb = fb + drmp3_hdr_padding(mp3 + k);
   2121                     if (i + k + nextfb + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + k + nextfb))
   2122                         continue;
   2123                     frame_and_padding = k;
   2124                     frame_bytes = fb;
   2125                     *free_format_bytes = fb;
   2126                 }
   2127             }
   2128 
   2129             if ((frame_bytes && i + frame_and_padding <= mp3_bytes &&
   2130                 drmp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) ||
   2131                 (!i && frame_and_padding == mp3_bytes))
   2132             {
   2133                 *ptr_frame_bytes = frame_and_padding;
   2134                 return i;
   2135             }
   2136             *free_format_bytes = 0;
   2137         }
   2138     }
   2139     *ptr_frame_bytes = 0;
   2140     return i;
   2141 }
   2142 
   2143 void drmp3dec_init(drmp3dec *dec)
   2144 {
   2145     dec->header[0] = 0;
   2146 }
   2147 
   2148 int drmp3dec_decode_frame(drmp3dec *dec, const unsigned char *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info)
   2149 {
   2150     int i = 0, igr, frame_size = 0, success = 1;
   2151     const drmp3_uint8 *hdr;
   2152     drmp3_bs bs_frame[1];
   2153     drmp3dec_scratch scratch;
   2154 
   2155     if (mp3_bytes > 4 && dec->header[0] == 0xff && drmp3_hdr_compare(dec->header, mp3))
   2156     {
   2157         frame_size = drmp3_hdr_frame_bytes(mp3, dec->free_format_bytes) + drmp3_hdr_padding(mp3);
   2158         if (frame_size != mp3_bytes && (frame_size + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + frame_size)))
   2159         {
   2160             frame_size = 0;
   2161         }
   2162     }
   2163     if (!frame_size)
   2164     {
   2165         memset(dec, 0, sizeof(drmp3dec));
   2166         i = drmp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size);
   2167         if (!frame_size || i + frame_size > mp3_bytes)
   2168         {
   2169             info->frame_bytes = i;
   2170             return 0;
   2171         }
   2172     }
   2173 
   2174     hdr = mp3 + i;
   2175     memcpy(dec->header, hdr, DRMP3_HDR_SIZE);
   2176     info->frame_bytes = i + frame_size;
   2177     info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2;
   2178     info->hz = drmp3_hdr_sample_rate_hz(hdr);
   2179     info->layer = 4 - DRMP3_HDR_GET_LAYER(hdr);
   2180     info->bitrate_kbps = drmp3_hdr_bitrate_kbps(hdr);
   2181 
   2182     drmp3_bs_init(bs_frame, hdr + DRMP3_HDR_SIZE, frame_size - DRMP3_HDR_SIZE);
   2183     if (DRMP3_HDR_IS_CRC(hdr))
   2184     {
   2185         drmp3_bs_get_bits(bs_frame, 16);
   2186     }
   2187 
   2188     if (info->layer == 3)
   2189     {
   2190         int main_data_begin = drmp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr);
   2191         if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)
   2192         {
   2193             drmp3dec_init(dec);
   2194             return 0;
   2195         }
   2196         success = drmp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
   2197         if (success && pcm != NULL)
   2198         {
   2199             for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*576*info->channels))
   2200             {
   2201                 memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
   2202                 drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels);
   2203                 drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
   2204             }
   2205         }
   2206         drmp3_L3_save_reservoir(dec, &scratch);
   2207     } else
   2208     {
   2209 #ifdef DR_MP3_ONLY_MP3
   2210         return 0;
   2211 #else
   2212         drmp3_L12_scale_info sci[1];
   2213 
   2214         if (pcm == NULL) {
   2215             return drmp3_hdr_frame_samples(hdr);
   2216         }
   2217 
   2218         drmp3_L12_read_scale_info(hdr, bs_frame, sci);
   2219 
   2220         memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
   2221         for (i = 0, igr = 0; igr < 3; igr++)
   2222         {
   2223             if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1)))
   2224             {
   2225                 i = 0;
   2226                 drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
   2227                 drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]);
   2228                 memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
   2229                 pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*384*info->channels);
   2230             }
   2231             if (bs_frame->pos > bs_frame->limit)
   2232             {
   2233                 drmp3dec_init(dec);
   2234                 return 0;
   2235             }
   2236         }
   2237 #endif
   2238     }
   2239 
   2240     return success*drmp3_hdr_frame_samples(dec->header);
   2241 }
   2242 
   2243 void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, int num_samples)
   2244 {
   2245     if(num_samples > 0)
   2246     {
   2247         int i = 0;
   2248 #if DRMP3_HAVE_SIMD
   2249         int aligned_count = num_samples & ~7;
   2250         for(; i < aligned_count; i+=8)
   2251         {
   2252             drmp3_f4 scale = DRMP3_VSET(32768.0f);
   2253             drmp3_f4 a = DRMP3_VMUL(DRMP3_VLD(&in[i  ]), scale);
   2254             drmp3_f4 b = DRMP3_VMUL(DRMP3_VLD(&in[i+4]), scale);
   2255 #if DRMP3_HAVE_SSE
   2256             drmp3_f4 s16max = DRMP3_VSET( 32767.0f);
   2257             drmp3_f4 s16min = DRMP3_VSET(-32768.0f);
   2258             __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, s16max), s16min)),
   2259                                            _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, s16max), s16min)));
   2260             out[i  ] = (drmp3_int16)_mm_extract_epi16(pcm8, 0);
   2261             out[i+1] = (drmp3_int16)_mm_extract_epi16(pcm8, 1);
   2262             out[i+2] = (drmp3_int16)_mm_extract_epi16(pcm8, 2);
   2263             out[i+3] = (drmp3_int16)_mm_extract_epi16(pcm8, 3);
   2264             out[i+4] = (drmp3_int16)_mm_extract_epi16(pcm8, 4);
   2265             out[i+5] = (drmp3_int16)_mm_extract_epi16(pcm8, 5);
   2266             out[i+6] = (drmp3_int16)_mm_extract_epi16(pcm8, 6);
   2267             out[i+7] = (drmp3_int16)_mm_extract_epi16(pcm8, 7);
   2268 #else
   2269             int16x4_t pcma, pcmb;
   2270             a = DRMP3_VADD(a, DRMP3_VSET(0.5f));
   2271             b = DRMP3_VADD(b, DRMP3_VSET(0.5f));
   2272             pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0)))));
   2273             pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0)))));
   2274             vst1_lane_s16(out+i  , pcma, 0);
   2275             vst1_lane_s16(out+i+1, pcma, 1);
   2276             vst1_lane_s16(out+i+2, pcma, 2);
   2277             vst1_lane_s16(out+i+3, pcma, 3);
   2278             vst1_lane_s16(out+i+4, pcmb, 0);
   2279             vst1_lane_s16(out+i+5, pcmb, 1);
   2280             vst1_lane_s16(out+i+6, pcmb, 2);
   2281             vst1_lane_s16(out+i+7, pcmb, 3);
   2282 #endif
   2283         }
   2284 #endif
   2285         for(; i < num_samples; i++)
   2286         {
   2287             float sample = in[i] * 32768.0f;
   2288             if (sample >=  32766.5)
   2289                 out[i] = (drmp3_int16) 32767;
   2290             else if (sample <= -32767.5)
   2291                 out[i] = (drmp3_int16)-32768;
   2292             else
   2293             {
   2294                 short s = (drmp3_int16)(sample + .5f);
   2295                 s -= (s < 0);   /* away from zero, to be compliant */
   2296                 out[i] = s;
   2297             }
   2298         }
   2299     }
   2300 }
   2301 
   2302 
   2303 
   2304 /************************************************************************************************************************************************************
   2305 
   2306  Main Public API
   2307 
   2308  ************************************************************************************************************************************************************/
   2309 
   2310 #if defined(SIZE_MAX)
   2311     #define DRMP3_SIZE_MAX  SIZE_MAX
   2312 #else
   2313     #if defined(_WIN64) || defined(_LP64) || defined(__LP64__)
   2314         #define DRMP3_SIZE_MAX  ((drmp3_uint64)0xFFFFFFFFFFFFFFFF)
   2315     #else
   2316         #define DRMP3_SIZE_MAX  0xFFFFFFFF
   2317     #endif
   2318 #endif
   2319 
   2320 /* Options. */
   2321 #ifndef DRMP3_SEEK_LEADING_MP3_FRAMES
   2322 #define DRMP3_SEEK_LEADING_MP3_FRAMES   2
   2323 #endif
   2324 
   2325 
   2326 /* Standard library stuff. */
   2327 #ifndef DRMP3_ASSERT
   2328 #include <assert.h>
   2329 #define DRMP3_ASSERT(expression) assert(expression)
   2330 #endif
   2331 #ifndef DRMP3_COPY_MEMORY
   2332 #define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))
   2333 #endif
   2334 #ifndef DRMP3_ZERO_MEMORY
   2335 #define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))
   2336 #endif
   2337 #define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p)))
   2338 #ifndef DRMP3_MALLOC
   2339 #define DRMP3_MALLOC(sz) malloc((sz))
   2340 #endif
   2341 #ifndef DRMP3_REALLOC
   2342 #define DRMP3_REALLOC(p, sz) realloc((p), (sz))
   2343 #endif
   2344 #ifndef DRMP3_FREE
   2345 #define DRMP3_FREE(p) free((p))
   2346 #endif
   2347 
   2348 #define drmp3_countof(x)  (sizeof(x) / sizeof(x[0]))
   2349 #define drmp3_max(x, y)   (((x) > (y)) ? (x) : (y))
   2350 #define drmp3_min(x, y)   (((x) < (y)) ? (x) : (y))
   2351 
   2352 #define DRMP3_DATA_CHUNK_SIZE  16384    /* The size in bytes of each chunk of data to read from the MP3 stream. minimp3 recommends 16K. */
   2353 
   2354 static DRMP3_INLINE float drmp3_mix_f32(float x, float y, float a)
   2355 {
   2356     return x*(1-a) + y*a;
   2357 }
   2358 
   2359 static void drmp3_blend_f32(float* pOut, float* pInA, float* pInB, float factor, drmp3_uint32 channels)
   2360 {
   2361     drmp3_uint32 i;
   2362     for (i = 0; i < channels; ++i) {
   2363         pOut[i] = drmp3_mix_f32(pInA[i], pInB[i], factor);
   2364     }
   2365 }
   2366 
   2367 
   2368 static void* drmp3__malloc_default(size_t sz, void* pUserData)
   2369 {
   2370     (void)pUserData;
   2371     return DRMP3_MALLOC(sz);
   2372 }
   2373 
   2374 static void* drmp3__realloc_default(void* p, size_t sz, void* pUserData)
   2375 {
   2376     (void)pUserData;
   2377     return DRMP3_REALLOC(p, sz);
   2378 }
   2379 
   2380 static void drmp3__free_default(void* p, void* pUserData)
   2381 {
   2382     (void)pUserData;
   2383     DRMP3_FREE(p);
   2384 }
   2385 
   2386 
   2387 #if 0   /* Unused, but leaving here in case I need to add it again later. */
   2388 static void* drmp3__malloc_from_callbacks(size_t sz, const drmp3_allocation_callbacks* pAllocationCallbacks)
   2389 {
   2390     if (pAllocationCallbacks == NULL) {
   2391         return NULL;
   2392     }
   2393 
   2394     if (pAllocationCallbacks->onMalloc != NULL) {
   2395         return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData);
   2396     }
   2397 
   2398     /* Try using realloc(). */
   2399     if (pAllocationCallbacks->onRealloc != NULL) {
   2400         return pAllocationCallbacks->onRealloc(NULL, sz, pAllocationCallbacks->pUserData);
   2401     }
   2402 
   2403     return NULL;
   2404 }
   2405 #endif
   2406 
   2407 static void* drmp3__realloc_from_callbacks(void* p, size_t szNew, size_t szOld, const drmp3_allocation_callbacks* pAllocationCallbacks)
   2408 {
   2409     if (pAllocationCallbacks == NULL) {
   2410         return NULL;
   2411     }
   2412 
   2413     if (pAllocationCallbacks->onRealloc != NULL) {
   2414         return pAllocationCallbacks->onRealloc(p, szNew, pAllocationCallbacks->pUserData);
   2415     }
   2416 
   2417     /* Try emulating realloc() in terms of malloc()/free(). */
   2418     if (pAllocationCallbacks->onMalloc != NULL && pAllocationCallbacks->onFree != NULL) {
   2419         void* p2;
   2420 
   2421         p2 = pAllocationCallbacks->onMalloc(szNew, pAllocationCallbacks->pUserData);
   2422         if (p2 == NULL) {
   2423             return NULL;
   2424         }
   2425 
   2426         DRMP3_COPY_MEMORY(p2, p, szOld);
   2427         pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);
   2428 
   2429         return p2;
   2430     }
   2431 
   2432     return NULL;
   2433 }
   2434 
   2435 static void drmp3__free_from_callbacks(void* p, const drmp3_allocation_callbacks* pAllocationCallbacks)
   2436 {
   2437     if (p == NULL || pAllocationCallbacks == NULL) {
   2438         return;
   2439     }
   2440 
   2441     if (pAllocationCallbacks->onFree != NULL) {
   2442         pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);
   2443     }
   2444 }
   2445 
   2446 
   2447 drmp3_allocation_callbacks drmp3_copy_allocation_callbacks_or_defaults(const drmp3_allocation_callbacks* pAllocationCallbacks)
   2448 {
   2449     if (pAllocationCallbacks != NULL) {
   2450         /* Copy. */
   2451         return *pAllocationCallbacks;
   2452     } else {
   2453         /* Defaults. */
   2454         drmp3_allocation_callbacks allocationCallbacks;
   2455         allocationCallbacks.pUserData = NULL;
   2456         allocationCallbacks.onMalloc  = drmp3__malloc_default;
   2457         allocationCallbacks.onRealloc = drmp3__realloc_default;
   2458         allocationCallbacks.onFree    = drmp3__free_default;
   2459         return allocationCallbacks;
   2460     }
   2461 }
   2462 
   2463 
   2464 void drmp3_src_cache_init(drmp3_src* pSRC, drmp3_src_cache* pCache)
   2465 {
   2466     DRMP3_ASSERT(pSRC != NULL);
   2467     DRMP3_ASSERT(pCache != NULL);
   2468 
   2469     pCache->pSRC = pSRC;
   2470     pCache->cachedFrameCount = 0;
   2471     pCache->iNextFrame = 0;
   2472 }
   2473 
   2474 drmp3_uint64 drmp3_src_cache_read_frames(drmp3_src_cache* pCache, drmp3_uint64 frameCount, float* pFramesOut)
   2475 {
   2476     drmp3_uint32 channels;
   2477     drmp3_uint64 totalFramesRead = 0;
   2478 
   2479     DRMP3_ASSERT(pCache != NULL);
   2480     DRMP3_ASSERT(pCache->pSRC != NULL);
   2481     DRMP3_ASSERT(pCache->pSRC->onRead != NULL);
   2482     DRMP3_ASSERT(frameCount > 0);
   2483     DRMP3_ASSERT(pFramesOut != NULL);
   2484 
   2485     channels = pCache->pSRC->config.channels;
   2486 
   2487     while (frameCount > 0) {
   2488         /* If there's anything in memory go ahead and copy that over first. */
   2489         drmp3_uint32 framesToReadFromClient;
   2490         drmp3_uint64 framesRemainingInMemory = pCache->cachedFrameCount - pCache->iNextFrame;
   2491         drmp3_uint64 framesToReadFromMemory = frameCount;
   2492         if (framesToReadFromMemory > framesRemainingInMemory) {
   2493             framesToReadFromMemory = framesRemainingInMemory;
   2494         }
   2495 
   2496         DRMP3_COPY_MEMORY(pFramesOut, pCache->pCachedFrames + pCache->iNextFrame*channels, (drmp3_uint32)(framesToReadFromMemory * channels * sizeof(float)));
   2497         pCache->iNextFrame += (drmp3_uint32)framesToReadFromMemory;
   2498 
   2499         totalFramesRead += framesToReadFromMemory;
   2500         frameCount -= framesToReadFromMemory;
   2501         if (frameCount == 0) {
   2502             break;
   2503         }
   2504 
   2505 
   2506         /* At this point there are still more frames to read from the client, so we'll need to reload the cache with fresh data. */
   2507         DRMP3_ASSERT(frameCount > 0);
   2508         pFramesOut += framesToReadFromMemory * channels;
   2509 
   2510         pCache->iNextFrame = 0;
   2511         pCache->cachedFrameCount = 0;
   2512 
   2513         framesToReadFromClient = drmp3_countof(pCache->pCachedFrames) / pCache->pSRC->config.channels;
   2514         if (framesToReadFromClient > pCache->pSRC->config.cacheSizeInFrames) {
   2515             framesToReadFromClient = pCache->pSRC->config.cacheSizeInFrames;
   2516         }
   2517 
   2518         pCache->cachedFrameCount = (drmp3_uint32)pCache->pSRC->onRead(pCache->pSRC, framesToReadFromClient, pCache->pCachedFrames, pCache->pSRC->pUserData);
   2519 
   2520 
   2521         /* Get out of this loop if nothing was able to be retrieved. */
   2522         if (pCache->cachedFrameCount == 0) {
   2523             break;
   2524         }
   2525     }
   2526 
   2527     return totalFramesRead;
   2528 }
   2529 
   2530 
   2531 drmp3_uint64 drmp3_src_read_frames_passthrough(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush);
   2532 drmp3_uint64 drmp3_src_read_frames_linear(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush);
   2533 
   2534 drmp3_bool32 drmp3_src_init(const drmp3_src_config* pConfig, drmp3_src_read_proc onRead, void* pUserData, drmp3_src* pSRC)
   2535 {
   2536     if (pSRC == NULL) {
   2537         return DRMP3_FALSE;
   2538     }
   2539 
   2540     DRMP3_ZERO_OBJECT(pSRC);
   2541 
   2542     if (pConfig == NULL || onRead == NULL) {
   2543         return DRMP3_FALSE;
   2544     }
   2545 
   2546     if (pConfig->channels == 0 || pConfig->channels > 2) {
   2547         return DRMP3_FALSE;
   2548     }
   2549 
   2550     pSRC->config = *pConfig;
   2551     pSRC->onRead = onRead;
   2552     pSRC->pUserData = pUserData;
   2553 
   2554     if (pSRC->config.cacheSizeInFrames > DRMP3_SRC_CACHE_SIZE_IN_FRAMES || pSRC->config.cacheSizeInFrames == 0) {
   2555         pSRC->config.cacheSizeInFrames = DRMP3_SRC_CACHE_SIZE_IN_FRAMES;
   2556     }
   2557 
   2558     drmp3_src_cache_init(pSRC, &pSRC->cache);
   2559     return DRMP3_TRUE;
   2560 }
   2561 
   2562 drmp3_bool32 drmp3_src_set_input_sample_rate(drmp3_src* pSRC, drmp3_uint32 sampleRateIn)
   2563 {
   2564     if (pSRC == NULL) {
   2565         return DRMP3_FALSE;
   2566     }
   2567 
   2568     /* Must have a sample rate of > 0. */
   2569     if (sampleRateIn == 0) {
   2570         return DRMP3_FALSE;
   2571     }
   2572 
   2573     pSRC->config.sampleRateIn = sampleRateIn;
   2574     return DRMP3_TRUE;
   2575 }
   2576 
   2577 drmp3_bool32 drmp3_src_set_output_sample_rate(drmp3_src* pSRC, drmp3_uint32 sampleRateOut)
   2578 {
   2579     if (pSRC == NULL) {
   2580         return DRMP3_FALSE;
   2581     }
   2582 
   2583     /* Must have a sample rate of > 0. */
   2584     if (sampleRateOut == 0) {
   2585         return DRMP3_FALSE;
   2586     }
   2587 
   2588     pSRC->config.sampleRateOut = sampleRateOut;
   2589     return DRMP3_TRUE;
   2590 }
   2591 
   2592 drmp3_uint64 drmp3_src_read_frames_ex(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush)
   2593 {
   2594     drmp3_src_algorithm algorithm;
   2595 
   2596     if (pSRC == NULL || frameCount == 0 || pFramesOut == NULL) {
   2597         return 0;
   2598     }
   2599 
   2600     algorithm = pSRC->config.algorithm;
   2601 
   2602     /* Always use passthrough if the sample rates are the same. */
   2603     if (pSRC->config.sampleRateIn == pSRC->config.sampleRateOut) {
   2604         algorithm = drmp3_src_algorithm_none;
   2605     }
   2606 
   2607     /* Could just use a function pointer instead of a switch for this... */
   2608     switch (algorithm)
   2609     {
   2610         case drmp3_src_algorithm_none:   return drmp3_src_read_frames_passthrough(pSRC, frameCount, pFramesOut, flush);
   2611         case drmp3_src_algorithm_linear: return drmp3_src_read_frames_linear(pSRC, frameCount, pFramesOut, flush);
   2612         default: return 0;
   2613     }
   2614 }
   2615 
   2616 drmp3_uint64 drmp3_src_read_frames(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut)
   2617 {
   2618     return drmp3_src_read_frames_ex(pSRC, frameCount, pFramesOut, DRMP3_FALSE);
   2619 }
   2620 
   2621 drmp3_uint64 drmp3_src_read_frames_passthrough(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush)
   2622 {
   2623     DRMP3_ASSERT(pSRC != NULL);
   2624     DRMP3_ASSERT(frameCount > 0);
   2625     DRMP3_ASSERT(pFramesOut != NULL);
   2626 
   2627     (void)flush;    /* Passthrough need not care about flushing. */
   2628     return pSRC->onRead(pSRC, frameCount, pFramesOut, pSRC->pUserData);
   2629 }
   2630 
   2631 drmp3_uint64 drmp3_src_read_frames_linear(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush)
   2632 {
   2633     double factor;
   2634     drmp3_uint64 totalFramesRead;
   2635 
   2636     DRMP3_ASSERT(pSRC != NULL);
   2637     DRMP3_ASSERT(frameCount > 0);
   2638     DRMP3_ASSERT(pFramesOut != NULL);
   2639 
   2640     /* For linear SRC, the bin is only 2 frames: 1 prior, 1 future. */
   2641 
   2642     /* Load the bin if necessary. */
   2643     if (!pSRC->algo.linear.isPrevFramesLoaded) {
   2644         drmp3_uint64 framesRead = drmp3_src_cache_read_frames(&pSRC->cache, 1, pSRC->bin);
   2645         if (framesRead == 0) {
   2646             return 0;
   2647         }
   2648         pSRC->algo.linear.isPrevFramesLoaded = DRMP3_TRUE;
   2649     }
   2650     if (!pSRC->algo.linear.isNextFramesLoaded) {
   2651         drmp3_uint64 framesRead = drmp3_src_cache_read_frames(&pSRC->cache, 1, pSRC->bin + pSRC->config.channels);
   2652         if (framesRead == 0) {
   2653             return 0;
   2654         }
   2655         pSRC->algo.linear.isNextFramesLoaded = DRMP3_TRUE;
   2656     }
   2657 
   2658     factor = (double)pSRC->config.sampleRateIn / pSRC->config.sampleRateOut;
   2659 
   2660     totalFramesRead = 0;
   2661     while (frameCount > 0) {
   2662         drmp3_uint32 i;
   2663         drmp3_uint32 framesToReadFromClient;
   2664 
   2665         /* The bin is where the previous and next frames are located. */
   2666         float* pPrevFrame = pSRC->bin;
   2667         float* pNextFrame = pSRC->bin + pSRC->config.channels;
   2668 
   2669         drmp3_blend_f32((float*)pFramesOut, pPrevFrame, pNextFrame, (float)pSRC->algo.linear.alpha, pSRC->config.channels);
   2670 
   2671         pSRC->algo.linear.alpha += factor;
   2672 
   2673         /* The new alpha value is how we determine whether or not we need to read fresh frames. */
   2674         framesToReadFromClient = (drmp3_uint32)pSRC->algo.linear.alpha;
   2675         pSRC->algo.linear.alpha = pSRC->algo.linear.alpha - framesToReadFromClient;
   2676 
   2677         for (i = 0; i < framesToReadFromClient; ++i) {
   2678             drmp3_uint64 framesRead;
   2679             drmp3_uint32 j;
   2680 
   2681             for (j = 0; j < pSRC->config.channels; ++j) {
   2682                 pPrevFrame[j] = pNextFrame[j];
   2683             }
   2684 
   2685             framesRead = drmp3_src_cache_read_frames(&pSRC->cache, 1, pNextFrame);
   2686             if (framesRead == 0) {
   2687                 drmp3_uint32 k;
   2688                 for (k = 0; k < pSRC->config.channels; ++k) {
   2689                     pNextFrame[k] = 0;
   2690                 }
   2691 
   2692                 if (pSRC->algo.linear.isNextFramesLoaded) {
   2693                     pSRC->algo.linear.isNextFramesLoaded = DRMP3_FALSE;
   2694                 } else {
   2695                     if (flush) {
   2696                         pSRC->algo.linear.isPrevFramesLoaded = DRMP3_FALSE;
   2697                     }
   2698                 }
   2699 
   2700                 break;
   2701             }
   2702         }
   2703 
   2704         pFramesOut  = (drmp3_uint8*)pFramesOut + (1 * pSRC->config.channels * sizeof(float));
   2705         frameCount -= 1;
   2706         totalFramesRead += 1;
   2707 
   2708         /* If there's no frames available we need to get out of this loop. */
   2709         if (!pSRC->algo.linear.isNextFramesLoaded && (!flush || !pSRC->algo.linear.isPrevFramesLoaded)) {
   2710             break;
   2711         }
   2712     }
   2713 
   2714     return totalFramesRead;
   2715 }
   2716 
   2717 
   2718 static size_t drmp3__on_read(drmp3* pMP3, void* pBufferOut, size_t bytesToRead)
   2719 {
   2720     size_t bytesRead = pMP3->onRead(pMP3->pUserData, pBufferOut, bytesToRead);
   2721     pMP3->streamCursor += bytesRead;
   2722     return bytesRead;
   2723 }
   2724 
   2725 static drmp3_bool32 drmp3__on_seek(drmp3* pMP3, int offset, drmp3_seek_origin origin)
   2726 {
   2727     DRMP3_ASSERT(offset >= 0);
   2728 
   2729     if (!pMP3->onSeek(pMP3->pUserData, offset, origin)) {
   2730         return DRMP3_FALSE;
   2731     }
   2732 
   2733     if (origin == drmp3_seek_origin_start) {
   2734         pMP3->streamCursor = (drmp3_uint64)offset;
   2735     } else {
   2736         pMP3->streamCursor += offset;
   2737     }
   2738 
   2739     return DRMP3_TRUE;
   2740 }
   2741 
   2742 static drmp3_bool32 drmp3__on_seek_64(drmp3* pMP3, drmp3_uint64 offset, drmp3_seek_origin origin)
   2743 {
   2744     if (offset <= 0x7FFFFFFF) {
   2745         return drmp3__on_seek(pMP3, (int)offset, origin);
   2746     }
   2747 
   2748 
   2749     /* Getting here "offset" is too large for a 32-bit integer. We just keep seeking forward until we hit the offset. */
   2750     if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_start)) {
   2751         return DRMP3_FALSE;
   2752     }
   2753 
   2754     offset -= 0x7FFFFFFF;
   2755     while (offset > 0) {
   2756         if (offset <= 0x7FFFFFFF) {
   2757             if (!drmp3__on_seek(pMP3, (int)offset, drmp3_seek_origin_current)) {
   2758                 return DRMP3_FALSE;
   2759             }
   2760             offset = 0;
   2761         } else {
   2762             if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_current)) {
   2763                 return DRMP3_FALSE;
   2764             }
   2765             offset -= 0x7FFFFFFF;
   2766         }
   2767     }
   2768 
   2769     return DRMP3_TRUE;
   2770 }
   2771 
   2772 static drmp3_uint32 drmp3_decode_next_frame_ex(drmp3* pMP3, drmp3d_sample_t* pPCMFrames, drmp3_bool32 discard);
   2773 static drmp3_uint32 drmp3_decode_next_frame(drmp3* pMP3);
   2774 
   2775 static drmp3_uint64 drmp3_read_src(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, void* pUserData)
   2776 {
   2777     drmp3* pMP3 = (drmp3*)pUserData;
   2778     float* pFramesOutF = (float*)pFramesOut;
   2779     drmp3_uint64 totalFramesRead = 0;
   2780 
   2781     DRMP3_ASSERT(pMP3 != NULL);
   2782     DRMP3_ASSERT(pMP3->onRead != NULL);
   2783 
   2784     while (frameCount > 0) {
   2785         /* Read from the in-memory buffer first. */
   2786         while (pMP3->pcmFramesRemainingInMP3Frame > 0 && frameCount > 0) {
   2787             drmp3d_sample_t* frames = (drmp3d_sample_t*)pMP3->pcmFrames;
   2788 #ifndef DR_MP3_FLOAT_OUTPUT
   2789             if (pMP3->mp3FrameChannels == 1) {
   2790                 if (pMP3->channels == 1) {
   2791                     /* Mono -> Mono. */
   2792                     pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame] / 32768.0f;
   2793                 } else {
   2794                     /* Mono -> Stereo. */
   2795                     pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame] / 32768.0f;
   2796                     pFramesOutF[1] = frames[pMP3->pcmFramesConsumedInMP3Frame] / 32768.0f;
   2797                 }
   2798             } else {
   2799                 if (pMP3->channels == 1) {
   2800                     /* Stereo -> Mono */
   2801                     float sample = 0;
   2802                     sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0] / 32768.0f;
   2803                     sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1] / 32768.0f;
   2804                     pFramesOutF[0] = sample * 0.5f;
   2805                 } else {
   2806                     /* Stereo -> Stereo */
   2807                     pFramesOutF[0] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0] / 32768.0f;
   2808                     pFramesOutF[1] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1] / 32768.0f;
   2809                 }
   2810             }
   2811 #else
   2812             if (pMP3->mp3FrameChannels == 1) {
   2813                 if (pMP3->channels == 1) {
   2814                     /* Mono -> Mono. */
   2815                     pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame];
   2816                 } else {
   2817                     /* Mono -> Stereo. */
   2818                     pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame];
   2819                     pFramesOutF[1] = frames[pMP3->pcmFramesConsumedInMP3Frame];
   2820                 }
   2821             } else {
   2822                 if (pMP3->channels == 1) {
   2823                     /* Stereo -> Mono */
   2824                     float sample = 0;
   2825                     sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0];
   2826                     sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1];
   2827                     pFramesOutF[0] = sample * 0.5f;
   2828                 } else {
   2829                     /* Stereo -> Stereo */
   2830                     pFramesOutF[0] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0];
   2831                     pFramesOutF[1] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1];
   2832                 }
   2833             }
   2834 #endif
   2835 
   2836             pMP3->pcmFramesConsumedInMP3Frame += 1;
   2837             pMP3->pcmFramesRemainingInMP3Frame -= 1;
   2838             totalFramesRead += 1;
   2839             frameCount -= 1;
   2840             pFramesOutF += pSRC->config.channels;
   2841         }
   2842 
   2843         if (frameCount == 0) {
   2844             break;
   2845         }
   2846 
   2847         DRMP3_ASSERT(pMP3->pcmFramesRemainingInMP3Frame == 0);
   2848 
   2849         /*
   2850         At this point we have exhausted our in-memory buffer so we need to re-fill. Note that the sample rate may have changed
   2851         at this point which means we'll also need to update our sample rate conversion pipeline.
   2852         */
   2853         if (drmp3_decode_next_frame(pMP3) == 0) {
   2854             break;
   2855         }
   2856     }
   2857 
   2858     return totalFramesRead;
   2859 }
   2860 
   2861 static drmp3_bool32 drmp3_init_src(drmp3* pMP3)
   2862 {
   2863     drmp3_src_config srcConfig;
   2864     DRMP3_ZERO_OBJECT(&srcConfig);
   2865     srcConfig.sampleRateIn = DR_MP3_DEFAULT_SAMPLE_RATE;
   2866     srcConfig.sampleRateOut = pMP3->sampleRate;
   2867     srcConfig.channels = pMP3->channels;
   2868     srcConfig.algorithm = drmp3_src_algorithm_linear;
   2869     if (!drmp3_src_init(&srcConfig, drmp3_read_src, pMP3, &pMP3->src)) {
   2870         drmp3_uninit(pMP3);
   2871         return DRMP3_FALSE;
   2872     }
   2873 
   2874     return DRMP3_TRUE;
   2875 }
   2876 
   2877 static drmp3_uint32 drmp3_decode_next_frame_ex(drmp3* pMP3, drmp3d_sample_t* pPCMFrames, drmp3_bool32 discard)
   2878 {
   2879     drmp3_uint32 pcmFramesRead = 0;
   2880 
   2881     DRMP3_ASSERT(pMP3 != NULL);
   2882     DRMP3_ASSERT(pMP3->onRead != NULL);
   2883 
   2884     if (pMP3->atEnd) {
   2885         return 0;
   2886     }
   2887 
   2888     do {
   2889         drmp3dec_frame_info info;
   2890         size_t leftoverDataSize;
   2891 
   2892         /* minimp3 recommends doing data submission in 16K chunks. If we don't have at least 16K bytes available, get more. */
   2893         if (pMP3->dataSize < DRMP3_DATA_CHUNK_SIZE) {
   2894             size_t bytesRead;
   2895 
   2896             if (pMP3->dataCapacity < DRMP3_DATA_CHUNK_SIZE) {
   2897                 drmp3_uint8* pNewData;
   2898                 size_t newDataCap;
   2899 
   2900                 newDataCap = DRMP3_DATA_CHUNK_SIZE;
   2901 
   2902                 pNewData = (drmp3_uint8*)drmp3__realloc_from_callbacks(pMP3->pData, newDataCap, pMP3->dataCapacity, &pMP3->allocationCallbacks);
   2903                 if (pNewData == NULL) {
   2904                     return 0; /* Out of memory. */
   2905                 }
   2906 
   2907                 pMP3->pData = pNewData;
   2908                 pMP3->dataCapacity = newDataCap;
   2909             }
   2910 
   2911             bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize));
   2912             if (bytesRead == 0) {
   2913                 if (pMP3->dataSize == 0) {
   2914                     pMP3->atEnd = DRMP3_TRUE;
   2915                     return 0; /* No data. */
   2916                 }
   2917             }
   2918 
   2919             pMP3->dataSize += bytesRead;
   2920         }
   2921 
   2922         if (pMP3->dataSize > INT_MAX) {
   2923             pMP3->atEnd = DRMP3_TRUE;
   2924             return 0; /* File too big. */
   2925         }
   2926 
   2927         pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->pData, (int)pMP3->dataSize, pPCMFrames, &info);    /* <-- Safe size_t -> int conversion thanks to the check above. */
   2928         
   2929         /* Consume the data. */
   2930         leftoverDataSize = (pMP3->dataSize - (size_t)info.frame_bytes);
   2931         if (info.frame_bytes > 0) {
   2932             memmove(pMP3->pData, pMP3->pData + info.frame_bytes, leftoverDataSize);
   2933             pMP3->dataSize = leftoverDataSize;
   2934         }
   2935 
   2936         /*
   2937         pcmFramesRead will be equal to 0 if decoding failed. If it is zero and info.frame_bytes > 0 then we have successfully
   2938         decoded the frame. A special case is if we are wanting to discard the frame, in which case we return successfully.
   2939         */
   2940         if (pcmFramesRead > 0 || (info.frame_bytes > 0 && discard)) {
   2941             pcmFramesRead = drmp3_hdr_frame_samples(pMP3->decoder.header);
   2942             pMP3->pcmFramesConsumedInMP3Frame = 0;
   2943             pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead;
   2944             pMP3->mp3FrameChannels = info.channels;
   2945             pMP3->mp3FrameSampleRate = info.hz;
   2946 
   2947             /* We need to initialize the resampler if we don't yet have the channel count or sample rate. */
   2948             if (pMP3->channels == 0 || pMP3->sampleRate == 0) {
   2949                 if (pMP3->channels == 0) {
   2950                     pMP3->channels = info.channels;
   2951                 }
   2952                 if (pMP3->sampleRate == 0) {
   2953                     pMP3->sampleRate = info.hz;
   2954                 }
   2955                 drmp3_init_src(pMP3);
   2956             }
   2957 
   2958             drmp3_src_set_input_sample_rate(&pMP3->src, pMP3->mp3FrameSampleRate);
   2959             break;
   2960         } else if (info.frame_bytes == 0) {
   2961             size_t bytesRead;
   2962 
   2963             /* Need more data. minimp3 recommends doing data submission in 16K chunks. */
   2964             if (pMP3->dataCapacity == pMP3->dataSize) {
   2965                 /* No room. Expand. */
   2966                 drmp3_uint8* pNewData;
   2967                 size_t newDataCap;
   2968 
   2969                 newDataCap = pMP3->dataCapacity + DRMP3_DATA_CHUNK_SIZE;
   2970 
   2971                 pNewData = (drmp3_uint8*)drmp3__realloc_from_callbacks(pMP3->pData, newDataCap, pMP3->dataCapacity, &pMP3->allocationCallbacks);
   2972                 if (pNewData == NULL) {
   2973                     return 0; /* Out of memory. */
   2974                 }
   2975 
   2976                 pMP3->pData = pNewData;
   2977                 pMP3->dataCapacity = newDataCap;
   2978             }
   2979 
   2980             /* Fill in a chunk. */
   2981             bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize));
   2982             if (bytesRead == 0) {
   2983                 pMP3->atEnd = DRMP3_TRUE;
   2984                 return 0; /* Error reading more data. */
   2985             }
   2986 
   2987             pMP3->dataSize += bytesRead;
   2988         }
   2989     } while (DRMP3_TRUE);
   2990 
   2991     return pcmFramesRead;
   2992 }
   2993 
   2994 static drmp3_uint32 drmp3_decode_next_frame(drmp3* pMP3)
   2995 {
   2996     DRMP3_ASSERT(pMP3 != NULL);
   2997     return drmp3_decode_next_frame_ex(pMP3, (drmp3d_sample_t*)pMP3->pcmFrames, DRMP3_FALSE);
   2998 }
   2999 
   3000 #if 0
   3001 static drmp3_uint32 drmp3_seek_next_frame(drmp3* pMP3)
   3002 {
   3003     drmp3_uint32 pcmFrameCount;
   3004 
   3005     DRMP3_ASSERT(pMP3 != NULL);
   3006 
   3007     pcmFrameCount = drmp3_decode_next_frame_ex(pMP3, NULL);
   3008     if (pcmFrameCount == 0) {
   3009         return 0;
   3010     }
   3011 
   3012     /* We have essentially just skipped past the frame, so just set the remaining samples to 0. */
   3013     pMP3->currentPCMFrame             += pcmFrameCount;
   3014     pMP3->pcmFramesConsumedInMP3Frame  = pcmFrameCount;
   3015     pMP3->pcmFramesRemainingInMP3Frame = 0;
   3016 
   3017     return pcmFrameCount;
   3018 }
   3019 #endif
   3020 
   3021 drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3022 {
   3023     drmp3_config config;
   3024 
   3025     DRMP3_ASSERT(pMP3 != NULL);
   3026     DRMP3_ASSERT(onRead != NULL);
   3027 
   3028     /* This function assumes the output object has already been reset to 0. Do not do that here, otherwise things will break. */
   3029     drmp3dec_init(&pMP3->decoder);
   3030 
   3031     /* The config can be null in which case we use defaults. */
   3032     if (pConfig != NULL) {
   3033         config = *pConfig;
   3034     } else {
   3035         DRMP3_ZERO_OBJECT(&config);
   3036     }
   3037 
   3038     pMP3->channels = config.outputChannels;
   3039 
   3040     /* Cannot have more than 2 channels. */
   3041     if (pMP3->channels > 2) {
   3042         pMP3->channels = 2;
   3043     }
   3044 
   3045     pMP3->sampleRate = config.outputSampleRate;
   3046 
   3047     pMP3->onRead = onRead;
   3048     pMP3->onSeek = onSeek;
   3049     pMP3->pUserData = pUserData;
   3050     pMP3->allocationCallbacks = drmp3_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);
   3051 
   3052     if (pMP3->allocationCallbacks.onFree == NULL || (pMP3->allocationCallbacks.onMalloc == NULL && pMP3->allocationCallbacks.onRealloc == NULL)) {
   3053         return DRMP3_FALSE;    /* Invalid allocation callbacks. */
   3054     }
   3055 
   3056     /*
   3057     We need a sample rate converter for converting the sample rate from the MP3 frames to the requested output sample rate. Note that if
   3058     we don't yet know the channel count or sample rate we defer this until the first frame is read.
   3059     */
   3060     if (pMP3->channels != 0 && pMP3->sampleRate != 0) {
   3061         drmp3_init_src(pMP3);
   3062     }
   3063     
   3064     /* Decode the first frame to confirm that it is indeed a valid MP3 stream. */
   3065     if (!drmp3_decode_next_frame(pMP3)) {
   3066         drmp3_uninit(pMP3);
   3067         return DRMP3_FALSE; /* Not a valid MP3 stream. */
   3068     }
   3069 
   3070     return DRMP3_TRUE;
   3071 }
   3072 
   3073 drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3074 {
   3075     if (pMP3 == NULL || onRead == NULL) {
   3076         return DRMP3_FALSE;
   3077     }
   3078 
   3079     DRMP3_ZERO_OBJECT(pMP3);
   3080     return drmp3_init_internal(pMP3, onRead, onSeek, pUserData, pConfig, pAllocationCallbacks);
   3081 }
   3082 
   3083 
   3084 static size_t drmp3__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead)
   3085 {
   3086     drmp3* pMP3 = (drmp3*)pUserData;
   3087     size_t bytesRemaining;
   3088 
   3089     DRMP3_ASSERT(pMP3 != NULL);
   3090     DRMP3_ASSERT(pMP3->memory.dataSize >= pMP3->memory.currentReadPos);
   3091 
   3092     bytesRemaining = pMP3->memory.dataSize - pMP3->memory.currentReadPos;
   3093     if (bytesToRead > bytesRemaining) {
   3094         bytesToRead = bytesRemaining;
   3095     }
   3096 
   3097     if (bytesToRead > 0) {
   3098         DRMP3_COPY_MEMORY(pBufferOut, pMP3->memory.pData + pMP3->memory.currentReadPos, bytesToRead);
   3099         pMP3->memory.currentReadPos += bytesToRead;
   3100     }
   3101 
   3102     return bytesToRead;
   3103 }
   3104 
   3105 static drmp3_bool32 drmp3__on_seek_memory(void* pUserData, int byteOffset, drmp3_seek_origin origin)
   3106 {
   3107     drmp3* pMP3 = (drmp3*)pUserData;
   3108 
   3109     DRMP3_ASSERT(pMP3 != NULL);
   3110 
   3111     if (origin == drmp3_seek_origin_current) {
   3112         if (byteOffset > 0) {
   3113             if (pMP3->memory.currentReadPos + byteOffset > pMP3->memory.dataSize) {
   3114                 byteOffset = (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos);  /* Trying to seek too far forward. */
   3115             }
   3116         } else {
   3117             if (pMP3->memory.currentReadPos < (size_t)-byteOffset) {
   3118                 byteOffset = -(int)pMP3->memory.currentReadPos;  /* Trying to seek too far backwards. */
   3119             }
   3120         }
   3121 
   3122         /* This will never underflow thanks to the clamps above. */
   3123         pMP3->memory.currentReadPos += byteOffset;
   3124     } else {
   3125         if ((drmp3_uint32)byteOffset <= pMP3->memory.dataSize) {
   3126             pMP3->memory.currentReadPos = byteOffset;
   3127         } else {
   3128             pMP3->memory.currentReadPos = pMP3->memory.dataSize;  /* Trying to seek too far forward. */
   3129         }
   3130     }
   3131 
   3132     return DRMP3_TRUE;
   3133 }
   3134 
   3135 drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_config* pConfig, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3136 {
   3137     if (pMP3 == NULL) {
   3138         return DRMP3_FALSE;
   3139     }
   3140 
   3141     DRMP3_ZERO_OBJECT(pMP3);
   3142 
   3143     if (pData == NULL || dataSize == 0) {
   3144         return DRMP3_FALSE;
   3145     }
   3146 
   3147     pMP3->memory.pData = (const drmp3_uint8*)pData;
   3148     pMP3->memory.dataSize = dataSize;
   3149     pMP3->memory.currentReadPos = 0;
   3150 
   3151     return drmp3_init_internal(pMP3, drmp3__on_read_memory, drmp3__on_seek_memory, pMP3, pConfig, pAllocationCallbacks);
   3152 }
   3153 
   3154 
   3155 #ifndef DR_MP3_NO_STDIO
   3156 #include <stdio.h>
   3157 
   3158 static size_t drmp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead)
   3159 {
   3160     return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData);
   3161 }
   3162 
   3163 static drmp3_bool32 drmp3__on_seek_stdio(void* pUserData, int offset, drmp3_seek_origin origin)
   3164 {
   3165     return fseek((FILE*)pUserData, offset, (origin == drmp3_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;
   3166 }
   3167 
   3168 drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* filePath, const drmp3_config* pConfig, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3169 {
   3170     FILE* pFile;
   3171 #if defined(_MSC_VER) && _MSC_VER >= 1400
   3172     if (fopen_s(&pFile, filePath, "rb") != 0) {
   3173         return DRMP3_FALSE;
   3174     }
   3175 #else
   3176     pFile = fopen(filePath, "rb");
   3177     if (pFile == NULL) {
   3178         return DRMP3_FALSE;
   3179     }
   3180 #endif
   3181 
   3182     return drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (void*)pFile, pConfig, pAllocationCallbacks);
   3183 }
   3184 #endif
   3185 
   3186 void drmp3_uninit(drmp3* pMP3)
   3187 {
   3188     if (pMP3 == NULL) {
   3189         return;
   3190     }
   3191     
   3192 #ifndef DR_MP3_NO_STDIO
   3193     if (pMP3->onRead == drmp3__on_read_stdio) {
   3194         fclose((FILE*)pMP3->pUserData);
   3195     }
   3196 #endif
   3197 
   3198     drmp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks);
   3199 }
   3200 
   3201 drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut)
   3202 {
   3203     drmp3_uint64 totalFramesRead = 0;
   3204 
   3205     if (pMP3 == NULL || pMP3->onRead == NULL) {
   3206         return 0;
   3207     }
   3208 
   3209     if (pBufferOut == NULL) {
   3210         float temp[4096];
   3211         while (framesToRead > 0) {
   3212             drmp3_uint64 framesJustRead;
   3213             drmp3_uint64 framesToReadRightNow = sizeof(temp)/sizeof(temp[0]) / pMP3->channels;
   3214             if (framesToReadRightNow > framesToRead) {
   3215                 framesToReadRightNow = framesToRead;
   3216             }
   3217 
   3218             framesJustRead = drmp3_read_pcm_frames_f32(pMP3, framesToReadRightNow, temp);
   3219             if (framesJustRead == 0) {
   3220                 break;
   3221             }
   3222 
   3223             framesToRead -= framesJustRead;
   3224             totalFramesRead += framesJustRead;
   3225         }
   3226     } else {
   3227         totalFramesRead = drmp3_src_read_frames_ex(&pMP3->src, framesToRead, pBufferOut, DRMP3_TRUE);
   3228         pMP3->currentPCMFrame += totalFramesRead;
   3229     }
   3230 
   3231     return totalFramesRead;
   3232 }
   3233 
   3234 drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut)
   3235 {
   3236     float tempF32[4096];
   3237     drmp3_uint64 pcmFramesJustRead;
   3238     drmp3_uint64 totalPCMFramesRead = 0;
   3239 
   3240     if (pMP3 == NULL || pMP3->onRead == NULL) {
   3241         return 0;
   3242     }
   3243 
   3244     /* Naive implementation: read into a temp f32 buffer, then convert. */
   3245     for (;;) {
   3246         drmp3_uint64 pcmFramesToReadThisIteration = (framesToRead - totalPCMFramesRead);
   3247         if (pcmFramesToReadThisIteration > drmp3_countof(tempF32)/pMP3->channels) {
   3248             pcmFramesToReadThisIteration = drmp3_countof(tempF32)/pMP3->channels;
   3249         }
   3250 
   3251         pcmFramesJustRead = drmp3_read_pcm_frames_f32(pMP3, pcmFramesToReadThisIteration, tempF32);
   3252         if (pcmFramesJustRead == 0) {
   3253             break;
   3254         }
   3255 
   3256         drmp3dec_f32_to_s16(tempF32, pBufferOut, (int)(pcmFramesJustRead * pMP3->channels));    /* <-- Safe cast since pcmFramesJustRead will be clamped based on the size of tempF32 which is always small. */
   3257         pBufferOut += pcmFramesJustRead * pMP3->channels;
   3258 
   3259         totalPCMFramesRead += pcmFramesJustRead;
   3260 
   3261         if (pcmFramesJustRead < pcmFramesToReadThisIteration) {
   3262             break;
   3263         }
   3264     }
   3265 
   3266     return totalPCMFramesRead;
   3267 }
   3268 
   3269 void drmp3_reset(drmp3* pMP3)
   3270 {
   3271     DRMP3_ASSERT(pMP3 != NULL);
   3272 
   3273     pMP3->pcmFramesConsumedInMP3Frame = 0;
   3274     pMP3->pcmFramesRemainingInMP3Frame = 0;
   3275     pMP3->currentPCMFrame = 0;
   3276     pMP3->dataSize = 0;
   3277     pMP3->atEnd = DRMP3_FALSE;
   3278     pMP3->src.bin[0] = 0;
   3279     pMP3->src.bin[1] = 0;
   3280     pMP3->src.bin[2] = 0;
   3281     pMP3->src.bin[3] = 0;
   3282     pMP3->src.cache.cachedFrameCount = 0;
   3283     pMP3->src.cache.iNextFrame = 0;
   3284     pMP3->src.algo.linear.alpha = 0;
   3285     pMP3->src.algo.linear.isNextFramesLoaded = 0;
   3286     pMP3->src.algo.linear.isPrevFramesLoaded = 0;
   3287     drmp3dec_init(&pMP3->decoder);
   3288 }
   3289 
   3290 drmp3_bool32 drmp3_seek_to_start_of_stream(drmp3* pMP3)
   3291 {
   3292     DRMP3_ASSERT(pMP3 != NULL);
   3293     DRMP3_ASSERT(pMP3->onSeek != NULL);
   3294 
   3295     /* Seek to the start of the stream to begin with. */
   3296     if (!drmp3__on_seek(pMP3, 0, drmp3_seek_origin_start)) {
   3297         return DRMP3_FALSE;
   3298     }
   3299 
   3300     /* Clear any cached data. */
   3301     drmp3_reset(pMP3);
   3302     return DRMP3_TRUE;
   3303 }
   3304 
   3305 float drmp3_get_cached_pcm_frame_count_from_src(drmp3* pMP3)
   3306 {
   3307     return (pMP3->src.cache.cachedFrameCount - pMP3->src.cache.iNextFrame) + (float)pMP3->src.algo.linear.alpha;
   3308 }
   3309 
   3310 float drmp3_get_pcm_frames_remaining_in_mp3_frame(drmp3* pMP3)
   3311 {
   3312     float factor = (float)pMP3->src.config.sampleRateOut / (float)pMP3->src.config.sampleRateIn;
   3313     float frameCountPreSRC = drmp3_get_cached_pcm_frame_count_from_src(pMP3) + pMP3->pcmFramesRemainingInMP3Frame;
   3314     return frameCountPreSRC * factor;
   3315 }
   3316 
   3317 /*
   3318 NOTE ON SEEKING
   3319 ===============
   3320 The seeking code below is a complete mess and is broken for cases when the sample rate changes. The problem
   3321 is with the resampling and the crappy resampler used by dr_mp3. What needs to happen is the following:
   3322 
   3323 1) The resampler needs to be replaced.
   3324 2) The resampler has state which needs to be updated whenever an MP3 frame is decoded outside of
   3325    drmp3_read_pcm_frames_f32(). The resampler needs an API to "flush" some imaginary input so that it's
   3326    state is updated accordingly.
   3327 */
   3328 drmp3_bool32 drmp3_seek_forward_by_pcm_frames__brute_force(drmp3* pMP3, drmp3_uint64 frameOffset)
   3329 {
   3330     drmp3_uint64 framesRead;
   3331 
   3332 #if 0
   3333     /*
   3334     MP3 is a bit annoying when it comes to seeking because of the bit reservoir. It basically means that an MP3 frame can possibly
   3335     depend on some of the data of prior frames. This means it's not as simple as seeking to the first byte of the MP3 frame that
   3336     contains the sample because that MP3 frame will need the data from the previous MP3 frame (which we just seeked past!). To
   3337     resolve this we seek past a number of MP3 frames up to a point, and then read-and-discard the remainder.
   3338     */
   3339     drmp3_uint64 maxFramesToReadAndDiscard = (drmp3_uint64)(DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME * 3 * ((float)pMP3->src.config.sampleRateOut / (float)pMP3->src.config.sampleRateIn));
   3340 
   3341     /* Now get rid of leading whole frames. */
   3342     while (frameOffset > maxFramesToReadAndDiscard) {
   3343         float        pcmFramesRemainingInCurrentMP3FrameF = drmp3_get_pcm_frames_remaining_in_mp3_frame(pMP3);
   3344         drmp3_uint32 pcmFramesRemainingInCurrentMP3Frame  = (drmp3_uint32)pcmFramesRemainingInCurrentMP3FrameF;
   3345         if (frameOffset > pcmFramesRemainingInCurrentMP3Frame) {
   3346             frameOffset                       -= pcmFramesRemainingInCurrentMP3Frame;
   3347             pMP3->currentPCMFrame             += pcmFramesRemainingInCurrentMP3Frame;
   3348             pMP3->pcmFramesConsumedInMP3Frame += pMP3->pcmFramesRemainingInMP3Frame;
   3349             pMP3->pcmFramesRemainingInMP3Frame = 0;
   3350         } else {
   3351             break;
   3352         }
   3353 
   3354         drmp3_uint32 pcmFrameCount = drmp3_decode_next_frame_ex(pMP3, pMP3->pcmFrames, DRMP3_FALSE);
   3355         if (pcmFrameCount == 0) {
   3356             break;
   3357         }
   3358     }
   3359 
   3360     /* The last step is to read-and-discard any remaining PCM frames to make it sample-exact. */
   3361     framesRead = drmp3_read_pcm_frames_f32(pMP3, frameOffset, NULL);
   3362     if (framesRead != frameOffset) {
   3363         return DRMP3_FALSE;
   3364     }
   3365 #else
   3366     /* Just using a dumb read-and-discard for now pending updates to the resampler. */
   3367     framesRead = drmp3_read_pcm_frames_f32(pMP3, frameOffset, NULL);
   3368     if (framesRead != frameOffset) {
   3369         return DRMP3_FALSE;
   3370     }
   3371 #endif
   3372 
   3373     return DRMP3_TRUE;
   3374 }
   3375 
   3376 drmp3_bool32 drmp3_seek_to_pcm_frame__brute_force(drmp3* pMP3, drmp3_uint64 frameIndex)
   3377 {
   3378     DRMP3_ASSERT(pMP3 != NULL);
   3379 
   3380     if (frameIndex == pMP3->currentPCMFrame) {
   3381         return DRMP3_TRUE;
   3382     }
   3383 
   3384     /*
   3385     If we're moving foward we just read from where we're at. Otherwise we need to move back to the start of
   3386     the stream and read from the beginning.
   3387     */
   3388     if (frameIndex < pMP3->currentPCMFrame) {
   3389         /* Moving backward. Move to the start of the stream and then move forward. */
   3390         if (!drmp3_seek_to_start_of_stream(pMP3)) {
   3391             return DRMP3_FALSE;
   3392         }
   3393     }
   3394 
   3395     DRMP3_ASSERT(frameIndex >= pMP3->currentPCMFrame);
   3396     return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, (frameIndex - pMP3->currentPCMFrame));
   3397 }
   3398 
   3399 drmp3_bool32 drmp3_find_closest_seek_point(drmp3* pMP3, drmp3_uint64 frameIndex, drmp3_uint32* pSeekPointIndex)
   3400 {
   3401     drmp3_uint32 iSeekPoint;
   3402 
   3403     DRMP3_ASSERT(pSeekPointIndex != NULL);
   3404 
   3405     *pSeekPointIndex = 0;
   3406 
   3407     if (frameIndex < pMP3->pSeekPoints[0].pcmFrameIndex) {
   3408         return DRMP3_FALSE;
   3409     }
   3410 
   3411     /* Linear search for simplicity to begin with while I'm getting this thing working. Once it's all working change this to a binary search. */
   3412     for (iSeekPoint = 0; iSeekPoint < pMP3->seekPointCount; ++iSeekPoint) {
   3413         if (pMP3->pSeekPoints[iSeekPoint].pcmFrameIndex > frameIndex) {
   3414             break;  /* Found it. */
   3415         }
   3416 
   3417         *pSeekPointIndex = iSeekPoint;
   3418     }
   3419 
   3420     return DRMP3_TRUE;
   3421 }
   3422 
   3423 drmp3_bool32 drmp3_seek_to_pcm_frame__seek_table(drmp3* pMP3, drmp3_uint64 frameIndex)
   3424 {
   3425     drmp3_seek_point seekPoint;
   3426     drmp3_uint32 priorSeekPointIndex;
   3427     drmp3_uint16 iMP3Frame;
   3428     drmp3_uint64 leftoverFrames;
   3429 
   3430     DRMP3_ASSERT(pMP3 != NULL);
   3431     DRMP3_ASSERT(pMP3->pSeekPoints != NULL);
   3432     DRMP3_ASSERT(pMP3->seekPointCount > 0);
   3433 
   3434     /* If there is no prior seekpoint it means the target PCM frame comes before the first seek point. Just assume a seekpoint at the start of the file in this case. */
   3435     if (drmp3_find_closest_seek_point(pMP3, frameIndex, &priorSeekPointIndex)) {
   3436         seekPoint = pMP3->pSeekPoints[priorSeekPointIndex];
   3437     } else {
   3438         seekPoint.seekPosInBytes     = 0;
   3439         seekPoint.pcmFrameIndex      = 0;
   3440         seekPoint.mp3FramesToDiscard = 0;
   3441         seekPoint.pcmFramesToDiscard = 0;
   3442     }
   3443 
   3444     /* First thing to do is seek to the first byte of the relevant MP3 frame. */
   3445     if (!drmp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, drmp3_seek_origin_start)) {
   3446         return DRMP3_FALSE; /* Failed to seek. */
   3447     }
   3448 
   3449     /* Clear any cached data. */
   3450     drmp3_reset(pMP3);
   3451 
   3452     /* Whole MP3 frames need to be discarded first. */
   3453     for (iMP3Frame = 0; iMP3Frame < seekPoint.mp3FramesToDiscard; ++iMP3Frame) {
   3454         drmp3_uint32 pcmFramesReadPreSRC;
   3455         drmp3d_sample_t* pPCMFrames;
   3456 
   3457         /* Pass in non-null for the last frame because we want to ensure the sample rate converter is preloaded correctly. */
   3458         pPCMFrames = NULL;
   3459         if (iMP3Frame == seekPoint.mp3FramesToDiscard-1) {
   3460             pPCMFrames = (drmp3d_sample_t*)pMP3->pcmFrames;
   3461         }
   3462 
   3463         /* We first need to decode the next frame, and then we need to flush the resampler. */
   3464         pcmFramesReadPreSRC = drmp3_decode_next_frame_ex(pMP3, pPCMFrames, DRMP3_TRUE);
   3465         if (pcmFramesReadPreSRC == 0) {
   3466             return DRMP3_FALSE;
   3467         }
   3468     }
   3469 
   3470     /* We seeked to an MP3 frame in the raw stream so we need to make sure the current PCM frame is set correctly. */
   3471     pMP3->currentPCMFrame = seekPoint.pcmFrameIndex - seekPoint.pcmFramesToDiscard;
   3472 
   3473     /*
   3474     Update resampler. This is wrong. Need to instead update it on a per MP3 frame basis. Also broken for cases when
   3475     the sample rate is being reduced in my testing. Should work fine when the input and output sample rate is the same
   3476     or a clean multiple.
   3477     */
   3478     pMP3->src.algo.linear.alpha = (drmp3_int64)pMP3->currentPCMFrame * ((double)pMP3->src.config.sampleRateIn / pMP3->src.config.sampleRateOut); /* <-- Cast to int64 is required for VC6. */
   3479     pMP3->src.algo.linear.alpha = pMP3->src.algo.linear.alpha - (drmp3_uint32)(pMP3->src.algo.linear.alpha);
   3480     if (pMP3->src.algo.linear.alpha > 0) {
   3481         pMP3->src.algo.linear.isPrevFramesLoaded = 1;
   3482     }
   3483 
   3484     /*
   3485     Now at this point we can follow the same process as the brute force technique where we just skip over unnecessary MP3 frames and then
   3486     read-and-discard at least 2 whole MP3 frames.
   3487     */
   3488     leftoverFrames = frameIndex - pMP3->currentPCMFrame;
   3489     return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, leftoverFrames);
   3490 }
   3491 
   3492 drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex)
   3493 {
   3494     if (pMP3 == NULL || pMP3->onSeek == NULL) {
   3495         return DRMP3_FALSE;
   3496     }
   3497 
   3498     if (frameIndex == 0) {
   3499         return drmp3_seek_to_start_of_stream(pMP3);
   3500     }
   3501 
   3502     /* Use the seek table if we have one. */
   3503     if (pMP3->pSeekPoints != NULL && pMP3->seekPointCount > 0) {
   3504         return drmp3_seek_to_pcm_frame__seek_table(pMP3, frameIndex);
   3505     } else {
   3506         return drmp3_seek_to_pcm_frame__brute_force(pMP3, frameIndex);
   3507     }
   3508 }
   3509 
   3510 drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount)
   3511 {
   3512     drmp3_uint64 currentPCMFrame;
   3513     drmp3_uint64 totalPCMFrameCount;
   3514     drmp3_uint64 totalMP3FrameCount;
   3515     float totalPCMFrameCountFractionalPart;
   3516 
   3517     if (pMP3 == NULL) {
   3518         return DRMP3_FALSE;
   3519     }
   3520 
   3521     /*
   3522     The way this works is we move back to the start of the stream, iterate over each MP3 frame and calculate the frame count based
   3523     on our output sample rate, the seek back to the PCM frame we were sitting on before calling this function.
   3524     */
   3525 
   3526     /* The stream must support seeking for this to work. */
   3527     if (pMP3->onSeek == NULL) {
   3528         return DRMP3_FALSE;
   3529     }
   3530 
   3531     /* We'll need to seek back to where we were, so grab the PCM frame we're currently sitting on so we can restore later. */
   3532     currentPCMFrame = pMP3->currentPCMFrame;
   3533     
   3534     if (!drmp3_seek_to_start_of_stream(pMP3)) {
   3535         return DRMP3_FALSE;
   3536     }
   3537 
   3538     totalPCMFrameCount = 0;
   3539     totalMP3FrameCount = 0;
   3540 
   3541     totalPCMFrameCountFractionalPart = 0; /* <-- With resampling there will be a fractional part to each MP3 frame that we need to accumulate. */
   3542     for (;;) {
   3543         drmp3_uint32 pcmFramesInCurrentMP3FrameIn;
   3544         float srcRatio;
   3545         float pcmFramesInCurrentMP3FrameOutF;
   3546         drmp3_uint32 pcmFramesInCurrentMP3FrameOut;
   3547 
   3548         pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL, DRMP3_FALSE);
   3549         if (pcmFramesInCurrentMP3FrameIn == 0) {
   3550             break;
   3551         }
   3552 
   3553         srcRatio = (float)pMP3->mp3FrameSampleRate / (float)pMP3->sampleRate;
   3554         DRMP3_ASSERT(srcRatio > 0);
   3555 
   3556         pcmFramesInCurrentMP3FrameOutF = totalPCMFrameCountFractionalPart + (pcmFramesInCurrentMP3FrameIn / srcRatio);
   3557         pcmFramesInCurrentMP3FrameOut  = (drmp3_uint32)pcmFramesInCurrentMP3FrameOutF;
   3558         totalPCMFrameCountFractionalPart = pcmFramesInCurrentMP3FrameOutF - pcmFramesInCurrentMP3FrameOut;
   3559         totalPCMFrameCount += pcmFramesInCurrentMP3FrameOut;
   3560         totalMP3FrameCount += 1;
   3561     }
   3562 
   3563     /* Finally, we need to seek back to where we were. */
   3564     if (!drmp3_seek_to_start_of_stream(pMP3)) {
   3565         return DRMP3_FALSE;
   3566     }
   3567 
   3568     if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) {
   3569         return DRMP3_FALSE;
   3570     }
   3571 
   3572     if (pMP3FrameCount != NULL) {
   3573         *pMP3FrameCount = totalMP3FrameCount;
   3574     }
   3575     if (pPCMFrameCount != NULL) {
   3576         *pPCMFrameCount = totalPCMFrameCount;
   3577     }
   3578 
   3579     return DRMP3_TRUE;
   3580 }
   3581 
   3582 drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3)
   3583 {
   3584     drmp3_uint64 totalPCMFrameCount;
   3585     if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, NULL, &totalPCMFrameCount)) {
   3586         return 0;
   3587     }
   3588 
   3589     return totalPCMFrameCount;
   3590 }
   3591 
   3592 drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3)
   3593 {
   3594     drmp3_uint64 totalMP3FrameCount;
   3595     if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, NULL)) {
   3596         return 0;
   3597     }
   3598 
   3599     return totalMP3FrameCount;
   3600 }
   3601 
   3602 void drmp3__accumulate_running_pcm_frame_count(drmp3* pMP3, drmp3_uint32 pcmFrameCountIn, drmp3_uint64* pRunningPCMFrameCount, float* pRunningPCMFrameCountFractionalPart)
   3603 {
   3604     float srcRatio;
   3605     float pcmFrameCountOutF;
   3606     drmp3_uint32 pcmFrameCountOut;
   3607 
   3608     srcRatio = (float)pMP3->mp3FrameSampleRate / (float)pMP3->sampleRate;
   3609     DRMP3_ASSERT(srcRatio > 0);
   3610 
   3611     pcmFrameCountOutF = *pRunningPCMFrameCountFractionalPart + (pcmFrameCountIn / srcRatio);
   3612     pcmFrameCountOut  = (drmp3_uint32)pcmFrameCountOutF;
   3613     *pRunningPCMFrameCountFractionalPart = pcmFrameCountOutF - pcmFrameCountOut;
   3614     *pRunningPCMFrameCount += pcmFrameCountOut;
   3615 }
   3616 
   3617 typedef struct
   3618 {
   3619     drmp3_uint64 bytePos;
   3620     drmp3_uint64 pcmFrameIndex; /* <-- After sample rate conversion. */
   3621 } drmp3__seeking_mp3_frame_info;
   3622 
   3623 drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints)
   3624 {
   3625     drmp3_uint32 seekPointCount;
   3626     drmp3_uint64 currentPCMFrame;
   3627     drmp3_uint64 totalMP3FrameCount;
   3628     drmp3_uint64 totalPCMFrameCount;
   3629 
   3630     if (pMP3 == NULL || pSeekPointCount == NULL || pSeekPoints == NULL) {
   3631         return DRMP3_FALSE; /* Invalid args. */
   3632     }
   3633 
   3634     seekPointCount = *pSeekPointCount;
   3635     if (seekPointCount == 0) {
   3636         return DRMP3_FALSE;  /* The client has requested no seek points. Consider this to be invalid arguments since the client has probably not intended this. */
   3637     }
   3638 
   3639     /* We'll need to seek back to the current sample after calculating the seekpoints so we need to go ahead and grab the current location at the top. */
   3640     currentPCMFrame = pMP3->currentPCMFrame;
   3641     
   3642     /* We never do more than the total number of MP3 frames and we limit it to 32-bits. */
   3643     if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, &totalPCMFrameCount)) {
   3644         return DRMP3_FALSE;
   3645     }
   3646 
   3647     /* If there's less than DRMP3_SEEK_LEADING_MP3_FRAMES+1 frames we just report 1 seek point which will be the very start of the stream. */
   3648     if (totalMP3FrameCount < DRMP3_SEEK_LEADING_MP3_FRAMES+1) {
   3649         seekPointCount = 1;
   3650         pSeekPoints[0].seekPosInBytes     = 0;
   3651         pSeekPoints[0].pcmFrameIndex      = 0;
   3652         pSeekPoints[0].mp3FramesToDiscard = 0;
   3653         pSeekPoints[0].pcmFramesToDiscard = 0;
   3654     } else {
   3655         drmp3_uint64 pcmFramesBetweenSeekPoints;
   3656         drmp3__seeking_mp3_frame_info mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES+1];
   3657         drmp3_uint64 runningPCMFrameCount = 0;
   3658         float runningPCMFrameCountFractionalPart = 0;
   3659         drmp3_uint64 nextTargetPCMFrame;
   3660         drmp3_uint32 iMP3Frame;
   3661         drmp3_uint32 iSeekPoint;
   3662 
   3663         if (seekPointCount > totalMP3FrameCount-1) {
   3664             seekPointCount = (drmp3_uint32)totalMP3FrameCount-1;
   3665         }
   3666 
   3667         pcmFramesBetweenSeekPoints = totalPCMFrameCount / (seekPointCount+1);
   3668 
   3669         /*
   3670         Here is where we actually calculate the seek points. We need to start by moving the start of the stream. We then enumerate over each
   3671         MP3 frame.
   3672         */
   3673         if (!drmp3_seek_to_start_of_stream(pMP3)) {
   3674             return DRMP3_FALSE;
   3675         }
   3676 
   3677         /*
   3678         We need to cache the byte positions of the previous MP3 frames. As a new MP3 frame is iterated, we cycle the byte positions in this
   3679         array. The value in the first item in this array is the byte position that will be reported in the next seek point.
   3680         */
   3681 
   3682         /* We need to initialize the array of MP3 byte positions for the leading MP3 frames. */
   3683         for (iMP3Frame = 0; iMP3Frame < DRMP3_SEEK_LEADING_MP3_FRAMES+1; ++iMP3Frame) {
   3684             drmp3_uint32 pcmFramesInCurrentMP3FrameIn;
   3685 
   3686             /* The byte position of the next frame will be the stream's cursor position, minus whatever is sitting in the buffer. */
   3687             DRMP3_ASSERT(pMP3->streamCursor >= pMP3->dataSize);
   3688             mp3FrameInfo[iMP3Frame].bytePos       = pMP3->streamCursor - pMP3->dataSize;
   3689             mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount;
   3690 
   3691             /* We need to get information about this frame so we can know how many samples it contained. */
   3692             pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL, DRMP3_FALSE);
   3693             if (pcmFramesInCurrentMP3FrameIn == 0) {
   3694                 return DRMP3_FALSE; /* This should never happen. */
   3695             }
   3696 
   3697             drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
   3698         }
   3699 
   3700         /*
   3701         At this point we will have extracted the byte positions of the leading MP3 frames. We can now start iterating over each seek point and
   3702         calculate them.
   3703         */
   3704         nextTargetPCMFrame = 0;
   3705         for (iSeekPoint = 0; iSeekPoint < seekPointCount; ++iSeekPoint) {
   3706             nextTargetPCMFrame += pcmFramesBetweenSeekPoints;
   3707 
   3708             for (;;) {
   3709                 if (nextTargetPCMFrame < runningPCMFrameCount) {
   3710                     /* The next seek point is in the current MP3 frame. */
   3711                     pSeekPoints[iSeekPoint].seekPosInBytes     = mp3FrameInfo[0].bytePos;
   3712                     pSeekPoints[iSeekPoint].pcmFrameIndex      = nextTargetPCMFrame;
   3713                     pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES;
   3714                     pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex);
   3715                     break;
   3716                 } else {
   3717                     size_t i;
   3718                     drmp3_uint32 pcmFramesInCurrentMP3FrameIn;
   3719 
   3720                     /*
   3721                     The next seek point is not in the current MP3 frame, so continue on to the next one. The first thing to do is cycle the cached
   3722                     MP3 frame info.
   3723                     */
   3724                     for (i = 0; i < drmp3_countof(mp3FrameInfo)-1; ++i) {
   3725                         mp3FrameInfo[i] = mp3FrameInfo[i+1];
   3726                     }
   3727 
   3728                     /* Cache previous MP3 frame info. */
   3729                     mp3FrameInfo[drmp3_countof(mp3FrameInfo)-1].bytePos       = pMP3->streamCursor - pMP3->dataSize;
   3730                     mp3FrameInfo[drmp3_countof(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount;
   3731 
   3732                     /*
   3733                     Go to the next MP3 frame. This shouldn't ever fail, but just in case it does we just set the seek point and break. If it happens, it
   3734                     should only ever do it for the last seek point.
   3735                     */
   3736                     pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL, DRMP3_TRUE);
   3737                     if (pcmFramesInCurrentMP3FrameIn == 0) {
   3738                         pSeekPoints[iSeekPoint].seekPosInBytes     = mp3FrameInfo[0].bytePos;
   3739                         pSeekPoints[iSeekPoint].pcmFrameIndex      = nextTargetPCMFrame;
   3740                         pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES;
   3741                         pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex);
   3742                         break;
   3743                     }
   3744 
   3745                     drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);
   3746                 }
   3747             }
   3748         }
   3749 
   3750         /* Finally, we need to seek back to where we were. */
   3751         if (!drmp3_seek_to_start_of_stream(pMP3)) {
   3752             return DRMP3_FALSE;
   3753         }
   3754         if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) {
   3755             return DRMP3_FALSE;
   3756         }
   3757     }
   3758 
   3759     *pSeekPointCount = seekPointCount;
   3760     return DRMP3_TRUE;
   3761 }
   3762 
   3763 drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints)
   3764 {
   3765     if (pMP3 == NULL) {
   3766         return DRMP3_FALSE;
   3767     }
   3768 
   3769     if (seekPointCount == 0 || pSeekPoints == NULL) {
   3770         /* Unbinding. */
   3771         pMP3->seekPointCount = 0;
   3772         pMP3->pSeekPoints = NULL;
   3773     } else {
   3774         /* Binding. */
   3775         pMP3->seekPointCount = seekPointCount;
   3776         pMP3->pSeekPoints = pSeekPoints;
   3777     }
   3778 
   3779     return DRMP3_TRUE;
   3780 }
   3781 
   3782 
   3783 float* drmp3__full_read_and_close_f32(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
   3784 {
   3785     drmp3_uint64 totalFramesRead = 0;
   3786     drmp3_uint64 framesCapacity = 0;
   3787     float* pFrames = NULL;
   3788     float temp[4096];
   3789 
   3790     DRMP3_ASSERT(pMP3 != NULL);
   3791 
   3792     for (;;) {
   3793         drmp3_uint64 framesToReadRightNow = drmp3_countof(temp) / pMP3->channels;
   3794         drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_f32(pMP3, framesToReadRightNow, temp);
   3795         if (framesJustRead == 0) {
   3796             break;
   3797         }
   3798 
   3799         /* Reallocate the output buffer if there's not enough room. */
   3800         if (framesCapacity < totalFramesRead + framesJustRead) {
   3801             drmp3_uint64 oldFramesBufferSize;
   3802             drmp3_uint64 newFramesBufferSize;
   3803             drmp3_uint64 newFramesCap;
   3804             float* pNewFrames;
   3805 
   3806             newFramesCap = framesCapacity * 2;
   3807             if (newFramesCap < totalFramesRead + framesJustRead) {
   3808                 newFramesCap = totalFramesRead + framesJustRead;
   3809             }
   3810 
   3811             oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(float);
   3812             newFramesBufferSize = newFramesCap   * pMP3->channels * sizeof(float);
   3813             if (newFramesBufferSize > DRMP3_SIZE_MAX) {
   3814                 break;
   3815             }
   3816 
   3817             pNewFrames = (float*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);
   3818             if (pNewFrames == NULL) {
   3819                 drmp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks);
   3820                 break;
   3821             }
   3822 
   3823             pFrames = pNewFrames;
   3824             framesCapacity = newFramesCap;
   3825         }
   3826 
   3827         DRMP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(float)));
   3828         totalFramesRead += framesJustRead;
   3829 
   3830         /* If the number of frames we asked for is less that what we actually read it means we've reached the end. */
   3831         if (framesJustRead != framesToReadRightNow) {
   3832             break;
   3833         }
   3834     }
   3835 
   3836     if (pConfig != NULL) {
   3837         pConfig->outputChannels = pMP3->channels;
   3838         pConfig->outputSampleRate = pMP3->sampleRate;
   3839     }
   3840 
   3841     drmp3_uninit(pMP3);
   3842 
   3843     if (pTotalFrameCount) {
   3844         *pTotalFrameCount = totalFramesRead;
   3845     }
   3846 
   3847     return pFrames;
   3848 }
   3849 
   3850 drmp3_int16* drmp3__full_read_and_close_s16(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount)
   3851 {
   3852     drmp3_uint64 totalFramesRead = 0;
   3853     drmp3_uint64 framesCapacity = 0;
   3854     drmp3_int16* pFrames = NULL;
   3855     drmp3_int16 temp[4096];
   3856 
   3857     DRMP3_ASSERT(pMP3 != NULL);
   3858 
   3859     for (;;) {
   3860         drmp3_uint64 framesToReadRightNow = drmp3_countof(temp) / pMP3->channels;
   3861         drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_s16(pMP3, framesToReadRightNow, temp);
   3862         if (framesJustRead == 0) {
   3863             break;
   3864         }
   3865 
   3866         /* Reallocate the output buffer if there's not enough room. */
   3867         if (framesCapacity < totalFramesRead + framesJustRead) {
   3868             drmp3_uint64 newFramesBufferSize;
   3869             drmp3_uint64 oldFramesBufferSize;
   3870             drmp3_uint64 newFramesCap;
   3871             drmp3_int16* pNewFrames;
   3872 
   3873            newFramesCap = framesCapacity * 2;
   3874             if (newFramesCap < totalFramesRead + framesJustRead) {
   3875                 newFramesCap = totalFramesRead + framesJustRead;
   3876             }
   3877 
   3878             oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(drmp3_int16);
   3879             newFramesBufferSize = newFramesCap   * pMP3->channels * sizeof(drmp3_int16);
   3880             if (newFramesBufferSize > DRMP3_SIZE_MAX) {
   3881                 break;
   3882             }
   3883 
   3884             pNewFrames = (drmp3_int16*)drmp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);
   3885             if (pNewFrames == NULL) {
   3886                 drmp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks);
   3887                 break;
   3888             }
   3889 
   3890             pFrames = pNewFrames;
   3891         }
   3892 
   3893         DRMP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(drmp3_int16)));
   3894         totalFramesRead += framesJustRead;
   3895 
   3896         /* If the number of frames we asked for is less that what we actually read it means we've reached the end. */
   3897         if (framesJustRead != framesToReadRightNow) {
   3898             break;
   3899         }
   3900     }
   3901 
   3902     if (pConfig != NULL) {
   3903         pConfig->outputChannels = pMP3->channels;
   3904         pConfig->outputSampleRate = pMP3->sampleRate;
   3905     }
   3906 
   3907     drmp3_uninit(pMP3);
   3908 
   3909     if (pTotalFrameCount) {
   3910         *pTotalFrameCount = totalFramesRead;
   3911     }
   3912 
   3913     return pFrames;
   3914 }
   3915 
   3916 
   3917 float* drmp3_open_and_read_pcm_frames_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3918 {
   3919     drmp3 mp3;
   3920     if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pConfig, pAllocationCallbacks)) {
   3921         return NULL;
   3922     }
   3923 
   3924     return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
   3925 }
   3926 
   3927 drmp3_int16* drmp3_open_and_read_pcm_frames_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3928 {
   3929     drmp3 mp3;
   3930     if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pConfig, pAllocationCallbacks)) {
   3931         return NULL;
   3932     }
   3933 
   3934     return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
   3935 }
   3936 
   3937 
   3938 float* drmp3_open_memory_and_read_pcm_frames_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3939 {
   3940     drmp3 mp3;
   3941     if (!drmp3_init_memory(&mp3, pData, dataSize, pConfig, pAllocationCallbacks)) {
   3942         return NULL;
   3943     }
   3944 
   3945     return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
   3946 }
   3947 
   3948 drmp3_int16* drmp3_open_memory_and_read_pcm_frames_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3949 {
   3950     drmp3 mp3;
   3951     if (!drmp3_init_memory(&mp3, pData, dataSize, pConfig, pAllocationCallbacks)) {
   3952         return NULL;
   3953     }
   3954 
   3955     return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
   3956 }
   3957 
   3958 
   3959 #ifndef DR_MP3_NO_STDIO
   3960 float* drmp3_open_file_and_read_pcm_frames_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3961 {
   3962     drmp3 mp3;
   3963     if (!drmp3_init_file(&mp3, filePath, pConfig, pAllocationCallbacks)) {
   3964         return NULL;
   3965     }
   3966 
   3967     return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);
   3968 }
   3969 
   3970 drmp3_int16* drmp3_open_file_and_read_pcm_frames_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3971 {
   3972     drmp3 mp3;
   3973     if (!drmp3_init_file(&mp3, filePath, pConfig, pAllocationCallbacks)) {
   3974         return NULL;
   3975     }
   3976 
   3977     return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);
   3978 }
   3979 #endif
   3980 
   3981 void drmp3_free(void* p, const drmp3_allocation_callbacks* pAllocationCallbacks)
   3982 {
   3983     if (pAllocationCallbacks != NULL) {
   3984         drmp3__free_from_callbacks(p, pAllocationCallbacks);
   3985     } else {
   3986         drmp3__free_default(p, NULL);
   3987     }
   3988 }
   3989 
   3990 #endif /*DR_MP3_IMPLEMENTATION*/
   3991 
   3992 /*
   3993 DIFFERENCES BETWEEN minimp3 AND dr_mp3
   3994 ======================================
   3995 - First, keep in mind that minimp3 (https://github.com/lieff/minimp3) is where all the real work was done. All of the
   3996   code relating to the actual decoding remains mostly unmodified, apart from some namespacing changes.
   3997 - dr_mp3 adds a pulling style API which allows you to deliver raw data via callbacks. So, rather than pushing data
   3998   to the decoder, the decoder _pulls_ data from your callbacks.
   3999 - In addition to callbacks, a decoder can be initialized from a block of memory and a file.
   4000 - The dr_mp3 pull API reads PCM frames rather than whole MP3 frames.
   4001 - dr_mp3 adds convenience APIs for opening and decoding entire files in one go.
   4002 - dr_mp3 is fully namespaced, including the implementation section, which is more suitable when compiling projects
   4003   as a single translation unit (aka unity builds). At the time of writing this, a unity build is not possible when
   4004   using minimp3 in conjunction with stb_vorbis. dr_mp3 addresses this.
   4005 */
   4006 
   4007 /*
   4008 REVISION HISTORY
   4009 ================
   4010 v0.5.3 - 2019-11-14
   4011   - Fix typos in documentation.
   4012 
   4013 v0.5.2 - 2019-11-02
   4014   - Bring up to date with minimp3.
   4015 
   4016 v0.5.1 - 2019-10-08
   4017   - Fix a warning with GCC.
   4018 
   4019 v0.5.0 - 2019-10-07
   4020   - API CHANGE: Add support for user defined memory allocation routines. This system allows the program to specify their own memory allocation
   4021     routines with a user data pointer for client-specific contextual data. This adds an extra parameter to the end of the following APIs:
   4022     - drmp3_init()
   4023     - drmp3_init_file()
   4024     - drmp3_init_memory()
   4025     - drmp3_open_and_read_pcm_frames_f32()
   4026     - drmp3_open_and_read_pcm_frames_s16()
   4027     - drmp3_open_memory_and_read_pcm_frames_f32()
   4028     - drmp3_open_memory_and_read_pcm_frames_s16()
   4029     - drmp3_open_file_and_read_pcm_frames_f32()
   4030     - drmp3_open_file_and_read_pcm_frames_s16()
   4031   - API CHANGE: Renamed the following APIs:
   4032     - drmp3_open_and_read_f32()        -> drmp3_open_and_read_pcm_frames_f32()
   4033     - drmp3_open_and_read_s16()        -> drmp3_open_and_read_pcm_frames_s16()
   4034     - drmp3_open_memory_and_read_f32() -> drmp3_open_memory_and_read_pcm_frames_f32()
   4035     - drmp3_open_memory_and_read_s16() -> drmp3_open_memory_and_read_pcm_frames_s16()
   4036     - drmp3_open_file_and_read_f32()   -> drmp3_open_file_and_read_pcm_frames_f32()
   4037     - drmp3_open_file_and_read_s16()   -> drmp3_open_file_and_read_pcm_frames_s16()
   4038 
   4039 v0.4.7 - 2019-07-28
   4040   - Fix a compiler error.
   4041 
   4042 v0.4.6 - 2019-06-14
   4043   - Fix a compiler error.
   4044 
   4045 v0.4.5 - 2019-06-06
   4046   - Bring up to date with minimp3.
   4047 
   4048 v0.4.4 - 2019-05-06
   4049   - Fixes to the VC6 build.
   4050 
   4051 v0.4.3 - 2019-05-05
   4052   - Use the channel count and/or sample rate of the first MP3 frame instead of DR_MP3_DEFAULT_CHANNELS and
   4053     DR_MP3_DEFAULT_SAMPLE_RATE when they are set to 0. To use the old behaviour, just set the relevant property to
   4054     DR_MP3_DEFAULT_CHANNELS or DR_MP3_DEFAULT_SAMPLE_RATE.
   4055   - Add s16 reading APIs
   4056     - drmp3_read_pcm_frames_s16
   4057     - drmp3_open_memory_and_read_pcm_frames_s16
   4058     - drmp3_open_and_read_pcm_frames_s16
   4059     - drmp3_open_file_and_read_pcm_frames_s16
   4060   - Add drmp3_get_mp3_and_pcm_frame_count() to the public header section.
   4061   - Add support for C89.
   4062   - Change license to choice of public domain or MIT-0.
   4063 
   4064 v0.4.2 - 2019-02-21
   4065   - Fix a warning.
   4066 
   4067 v0.4.1 - 2018-12-30
   4068   - Fix a warning.
   4069 
   4070 v0.4.0 - 2018-12-16
   4071   - API CHANGE: Rename some APIs:
   4072     - drmp3_read_f32 -> to drmp3_read_pcm_frames_f32
   4073     - drmp3_seek_to_frame -> drmp3_seek_to_pcm_frame
   4074     - drmp3_open_and_decode_f32 -> drmp3_open_and_read_pcm_frames_f32
   4075     - drmp3_open_and_decode_memory_f32 -> drmp3_open_memory_and_read_pcm_frames_f32
   4076     - drmp3_open_and_decode_file_f32 -> drmp3_open_file_and_read_pcm_frames_f32
   4077   - Add drmp3_get_pcm_frame_count().
   4078   - Add drmp3_get_mp3_frame_count().
   4079   - Improve seeking performance.
   4080 
   4081 v0.3.2 - 2018-09-11
   4082   - Fix a couple of memory leaks.
   4083   - Bring up to date with minimp3.
   4084 
   4085 v0.3.1 - 2018-08-25
   4086   - Fix C++ build.
   4087 
   4088 v0.3.0 - 2018-08-25
   4089   - Bring up to date with minimp3. This has a minor API change: the "pcm" parameter of drmp3dec_decode_frame() has
   4090     been changed from short* to void* because it can now output both s16 and f32 samples, depending on whether or
   4091     not the DR_MP3_FLOAT_OUTPUT option is set.
   4092 
   4093 v0.2.11 - 2018-08-08
   4094   - Fix a bug where the last part of a file is not read.
   4095 
   4096 v0.2.10 - 2018-08-07
   4097   - Improve 64-bit detection.
   4098 
   4099 v0.2.9 - 2018-08-05
   4100   - Fix C++ build on older versions of GCC.
   4101   - Bring up to date with minimp3.
   4102 
   4103 v0.2.8 - 2018-08-02
   4104   - Fix compilation errors with older versions of GCC.
   4105 
   4106 v0.2.7 - 2018-07-13
   4107   - Bring up to date with minimp3.
   4108 
   4109 v0.2.6 - 2018-07-12
   4110   - Bring up to date with minimp3.
   4111 
   4112 v0.2.5 - 2018-06-22
   4113   - Bring up to date with minimp3.
   4114 
   4115 v0.2.4 - 2018-05-12
   4116   - Bring up to date with minimp3.
   4117 
   4118 v0.2.3 - 2018-04-29
   4119   - Fix TCC build.
   4120 
   4121 v0.2.2 - 2018-04-28
   4122   - Fix bug when opening a decoder from memory.
   4123 
   4124 v0.2.1 - 2018-04-27
   4125   - Efficiency improvements when the decoder reaches the end of the stream.
   4126 
   4127 v0.2 - 2018-04-21
   4128   - Bring up to date with minimp3.
   4129   - Start using major.minor.revision versioning.
   4130 
   4131 v0.1d - 2018-03-30
   4132   - Bring up to date with minimp3.
   4133 
   4134 v0.1c - 2018-03-11
   4135   - Fix C++ build error.
   4136 
   4137 v0.1b - 2018-03-07
   4138   - Bring up to date with minimp3.
   4139 
   4140 v0.1a - 2018-02-28
   4141   - Fix compilation error on GCC/Clang.
   4142   - Fix some warnings.
   4143 
   4144 v0.1 - 2018-02-xx
   4145   - Initial versioned release.
   4146 */
   4147 
   4148 /*
   4149 This software is available as a choice of the following licenses. Choose
   4150 whichever you prefer.
   4151 
   4152 ===============================================================================
   4153 ALTERNATIVE 1 - Public Domain (www.unlicense.org)
   4154 ===============================================================================
   4155 This is free and unencumbered software released into the public domain.
   4156 
   4157 Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
   4158 software, either in source code form or as a compiled binary, for any purpose,
   4159 commercial or non-commercial, and by any means.
   4160 
   4161 In jurisdictions that recognize copyright laws, the author or authors of this
   4162 software dedicate any and all copyright interest in the software to the public
   4163 domain. We make this dedication for the benefit of the public at large and to
   4164 the detriment of our heirs and successors. We intend this dedication to be an
   4165 overt act of relinquishment in perpetuity of all present and future rights to
   4166 this software under copyright law.
   4167 
   4168 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   4169 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   4170 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   4171 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
   4172 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
   4173 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   4174 
   4175 For more information, please refer to <http://unlicense.org/>
   4176 
   4177 ===============================================================================
   4178 ALTERNATIVE 2 - MIT No Attribution
   4179 ===============================================================================
   4180 Copyright 2018 David Reid
   4181 
   4182 Permission is hereby granted, free of charge, to any person obtaining a copy of
   4183 this software and associated documentation files (the "Software"), to deal in
   4184 the Software without restriction, including without limitation the rights to
   4185 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
   4186 of the Software, and to permit persons to whom the Software is furnished to do
   4187 so.
   4188 
   4189 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   4190 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   4191 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   4192 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   4193 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   4194 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
   4195 SOFTWARE.
   4196 */
   4197 
   4198 /*
   4199     https://github.com/lieff/minimp3
   4200     To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide.
   4201     This software is distributed without any warranty.
   4202     See <http://creativecommons.org/publicdomain/zero/1.0/>.
   4203 */