From eb898405fa5e7c8d13044a8e3d27c7eecf5832d5 Mon Sep 17 00:00:00 2001 From: Joel16 Date: Sun, 31 Mar 2019 20:29:13 -0500 Subject: [PATCH] Inital source commit --- CMakeLists.txt | 108 + README.md | 18 +- include/audio/audio.h | 32 + include/audio/dr_flac.h | 8196 ++++++++++++++++++++++++ include/audio/dr_wav.h | 4377 +++++++++++++ include/audio/flac.h | 14 + include/audio/jar_xm.h | 2667 ++++++++ include/audio/mp3.h | 14 + include/audio/ogg.h | 14 + include/audio/vitaaudiolib.h | 40 + include/audio/wav.h | 14 + include/audio/xm.h | 14 + include/common.h | 26 + include/dirbrowse.h | 21 + include/fs.h | 13 + include/menus/menu_audioplayer.h | 6 + include/menus/menu_displayfiles.h | 6 + include/status_bar.h | 6 + include/textures.h | 14 + include/utils.h | 14 + res/Roboto-Regular.ttf | Bin 0 -> 170984 bytes res/battery_20.png | Bin 0 -> 273 bytes res/battery_20_charging.png | Bin 0 -> 449 bytes res/battery_30.png | Bin 0 -> 274 bytes res/battery_30_charging.png | Bin 0 -> 467 bytes res/battery_50.png | Bin 0 -> 269 bytes res/battery_50_charging.png | Bin 0 -> 462 bytes res/battery_60.png | Bin 0 -> 269 bytes res/battery_60_charging.png | Bin 0 -> 449 bytes res/battery_80.png | Bin 0 -> 277 bytes res/battery_80_charging.png | Bin 0 -> 464 bytes res/battery_90.png | Bin 0 -> 276 bytes res/battery_90_charging.png | Bin 0 -> 482 bytes res/battery_full.png | Bin 0 -> 236 bytes res/battery_full_charging.png | Bin 0 -> 436 bytes res/battery_low.png | Bin 0 -> 258 bytes res/battery_unknown.png | Bin 0 -> 592 bytes res/btn_playback_forward.png | Bin 0 -> 1582 bytes res/btn_playback_pause.png | Bin 0 -> 174 bytes res/btn_playback_play.png | Bin 0 -> 608 bytes res/btn_playback_repeat.png | Bin 0 -> 2041 bytes res/btn_playback_repeat_overlay.png | Bin 0 -> 2041 bytes res/btn_playback_rewind.png | Bin 0 -> 1535 bytes res/btn_playback_shuffle.png | Bin 0 -> 2669 bytes res/btn_playback_shuffle_overlay.png | Bin 0 -> 2669 bytes res/default_artwork.png | Bin 0 -> 4618 bytes res/default_artwork_blur.png | Bin 0 -> 807490 bytes res/icon_audio.png | Bin 0 -> 669 bytes res/icon_back.png | Bin 0 -> 397 bytes res/icon_file.png | Bin 0 -> 575 bytes res/icon_folder.png | Bin 0 -> 476 bytes sce_sys/icon0.png | Bin 0 -> 8058 bytes sce_sys/livearea/contents/bg.png | Bin 0 -> 328540 bytes sce_sys/livearea/contents/startup.png | Bin 0 -> 2061 bytes sce_sys/livearea/contents/template.xml | 11 + source/audio/audio.c | 289 + source/audio/flac.c | 42 + source/audio/mp3.c | 204 + source/audio/ogg.c | 48 + source/audio/stb_vorbis.c | 5494 ++++++++++++++++ source/audio/vitaaudiolib.c | 169 + source/audio/wav.c | 41 + source/audio/xm.c | 57 + source/common.c | 8 + source/dirbrowse.c | 205 + source/fs.c | 74 + source/main.c | 77 + source/menus/menu_audioplayer.c | 238 + source/menus/menu_displayfiles.c | 56 + source/status_bar.c | 105 + source/textures.c | 118 + source/utils.c | 92 + 72 files changed, 22941 insertions(+), 1 deletion(-) create mode 100644 CMakeLists.txt create mode 100644 include/audio/audio.h create mode 100644 include/audio/dr_flac.h create mode 100644 include/audio/dr_wav.h create mode 100644 include/audio/flac.h create mode 100644 include/audio/jar_xm.h create mode 100644 include/audio/mp3.h create mode 100644 include/audio/ogg.h create mode 100644 include/audio/vitaaudiolib.h create mode 100644 include/audio/wav.h create mode 100644 include/audio/xm.h create mode 100644 include/common.h create mode 100644 include/dirbrowse.h create mode 100644 include/fs.h create mode 100644 include/menus/menu_audioplayer.h create mode 100644 include/menus/menu_displayfiles.h create mode 100644 include/status_bar.h create mode 100644 include/textures.h create mode 100644 include/utils.h create mode 100644 res/Roboto-Regular.ttf create mode 100644 res/battery_20.png create mode 100644 res/battery_20_charging.png create mode 100644 res/battery_30.png create mode 100644 res/battery_30_charging.png create mode 100644 res/battery_50.png create mode 100644 res/battery_50_charging.png create mode 100644 res/battery_60.png create mode 100644 res/battery_60_charging.png create mode 100644 res/battery_80.png create mode 100644 res/battery_80_charging.png create mode 100644 res/battery_90.png create mode 100644 res/battery_90_charging.png create mode 100644 res/battery_full.png create mode 100644 res/battery_full_charging.png create mode 100644 res/battery_low.png create mode 100644 res/battery_unknown.png create mode 100644 res/btn_playback_forward.png create mode 100644 res/btn_playback_pause.png create mode 100644 res/btn_playback_play.png create mode 100644 res/btn_playback_repeat.png create mode 100644 res/btn_playback_repeat_overlay.png create mode 100644 res/btn_playback_rewind.png create mode 100644 res/btn_playback_shuffle.png create mode 100644 res/btn_playback_shuffle_overlay.png create mode 100644 res/default_artwork.png create mode 100644 res/default_artwork_blur.png create mode 100644 res/icon_audio.png create mode 100644 res/icon_back.png create mode 100644 res/icon_file.png create mode 100644 res/icon_folder.png create mode 100644 sce_sys/icon0.png create mode 100644 sce_sys/livearea/contents/bg.png create mode 100644 sce_sys/livearea/contents/startup.png create mode 100644 sce_sys/livearea/contents/template.xml create mode 100644 source/audio/audio.c create mode 100644 source/audio/flac.c create mode 100644 source/audio/mp3.c create mode 100644 source/audio/ogg.c create mode 100644 source/audio/stb_vorbis.c create mode 100644 source/audio/vitaaudiolib.c create mode 100644 source/audio/wav.c create mode 100644 source/audio/xm.c create mode 100644 source/common.c create mode 100644 source/dirbrowse.c create mode 100644 source/fs.c create mode 100644 source/main.c create mode 100644 source/menus/menu_audioplayer.c create mode 100644 source/menus/menu_displayfiles.c create mode 100644 source/status_bar.c create mode 100644 source/textures.c create mode 100644 source/utils.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f50646a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,108 @@ +cmake_minimum_required(VERSION 2.8) + +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + if(DEFINED ENV{VITASDK}) + set(CMAKE_TOOLCHAIN_FILE "$ENV{VITASDK}/share/vita.toolchain.cmake" CACHE PATH "toolchain file") + else() + message(FATAL_ERROR "Please define VITASDK to point to your SDK path!") + endif() +endif() + +project(eleven_music_player_vita) +include("${VITASDK}/share/vita.cmake" REQUIRED) + +set(VITA_APP_NAME "Eleven Music Player") +set(VITA_TITLEID "ELEVENMPV") +set(VITA_VERSION "01.00") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -Wall -Werror -ffast-math") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS} -d PARENTAL_LEVEL=1") + +FUNCTION(ADD_RESOURCES out_var) + SET(result) + FOREACH(in_f ${ARGN}) + SET(out_f "${CMAKE_CURRENT_BINARY_DIR}/${in_f}.o") + GET_FILENAME_COMPONENT(out_dir ${out_f} DIRECTORY) + ADD_CUSTOM_COMMAND(OUTPUT ${out_f} + COMMAND ${CMAKE_COMMAND} -E make_directory ${out_dir} + COMMAND ${CMAKE_LINKER} -r -b binary -o ${out_f} ${in_f} + DEPENDS ${in_f} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Building resource ${out_f}" + VERBATIM + ) + LIST(APPEND result ${out_f}) + ENDFOREACH() + SET(${out_var} "${result}" PARENT_SCOPE) +ENDFUNCTION() + +file(GLOB res_files RELATIVE + ${CMAKE_SOURCE_DIR} + res/*.png +) +add_resources(elevenmp_res ${res_files}) + +include_directories( + include + include/audio + include/menus +) + +link_directories( + ${CMAKE_CURRENT_BINARY_DIR} +) + +add_executable(${PROJECT_NAME} + ${elevenmp_res} + source/common.c + source/dirbrowse.c + source/fs.c + source/main.c + source/status_bar.c + source/textures.c + source/utils.c + source/audio/audio.c + source/audio/flac.c + source/audio/mp3.c + source/audio/ogg.c + source/audio/stb_vorbis.c + source/audio/vitaaudiolib.c + source/audio/wav.c + source/audio/xm.c + source/menus/menu_displayfiles.c + source/menus/menu_audioplayer.c +) + +target_link_libraries(${PROJECT_NAME} + vita2d + freetype + png + jpeg + z + m + c + mpg123 + SceAppUtil_stub + SceAudio_stub + SceAudiodec_stub + SceCommonDialog_stub + SceCtrl_stub + SceDisplay_stub + SceGxm_stub + ScePower_stub + SceRtc_stub + SceSysmodule_stub + SceTouch_stub +) + +vita_create_self(${PROJECT_NAME}.self ${PROJECT_NAME}) +vita_create_vpk(${PROJECT_NAME}.vpk ${VITA_TITLEID} ${PROJECT_NAME}.self + VERSION ${VITA_VERSION} + NAME ${VITA_APP_NAME} + FILE sce_sys/icon0.png sce_sys/icon0.png + FILE sce_sys/livearea/contents/bg.png sce_sys/livearea/contents/bg.png + FILE sce_sys/livearea/contents/startup.png sce_sys/livearea/contents/startup.png + FILE sce_sys/livearea/contents/template.xml sce_sys/livearea/contents/template.xml + FILE res/Roboto-Regular.ttf Roboto-Regular.ttf +) diff --git a/README.md b/README.md index 8fa1984..722fb32 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -# ElevenMPV +# ElevenMPV - Eleven Music Player VITA + +A homebrew music player for Playstation VITA that aims to support many different audio formats compared to the offical PS VITA music application. + +# Currently supported formats: (16 bit signed samples) +- FLAC +- MP3 +- OGG +- WAV (A-law and u-law, Microsoft ADPCM, IMA ADPCM) +- XM (Extended module) + +# Features: +- Browse ux0:/ to play the above audio formats. +- Pause/Play audio. +- Shuffle/Repeat audio. +- Next/Previous track in current working directory. +- Display ID3v1 and ID3v2 metadata for MP3 files. diff --git a/include/audio/audio.h b/include/audio/audio.h new file mode 100644 index 0000000..f5191e9 --- /dev/null +++ b/include/audio/audio.h @@ -0,0 +1,32 @@ +#ifndef _ELEVENMPV_AUDIO_H_ +#define _ELEVENMPV_AUDIO_H_ + +#include +#include + +extern SceBool playing, paused; + +typedef struct { + SceBool has_meta; + char title[31]; + char album[31]; + char artist[31]; + char year[5]; + char comment[31]; + char genre[31]; + vita2d_texture *cover_image; +} Audio_Metadata; + +extern Audio_Metadata metadata; + +int Audio_Init(const char *path); +SceBool Audio_IsPaused(void); +void Audio_Pause(void); +void Audio_Stop(void); +SceUInt64 Audio_GetPosition(void); +SceUInt64 Audio_GetLength(void); +SceUInt64 Audio_GetPositionSeconds(void); +SceUInt64 Audio_GetLengthSeconds(void); +void Audio_Term(void); + +#endif diff --git a/include/audio/dr_flac.h b/include/audio/dr_flac.h new file mode 100644 index 0000000..9dd59d2 --- /dev/null +++ b/include/audio/dr_flac.h @@ -0,0 +1,8196 @@ +// FLAC audio decoder. Public domain. See "unlicense" statement at the end of this file. +// dr_flac - v0.11.2 - 2018-03-10 +// +// David Reid - mackron@gmail.com + +// USAGE +// +// dr_flac is a single-file library. To use it, do something like the following in one .c file. +// #define DR_FLAC_IMPLEMENTATION +// #include "dr_flac.h" +// +// You can then #include this file in other parts of the program as you would with any other header file. To decode audio data, +// do something like the following: +// +// drflac* pFlac = drflac_open_file("MySong.flac"); +// if (pFlac == NULL) { +// // Failed to open FLAC file +// } +// +// drflac_int32* pSamples = malloc(pFlac->totalPCMFrameCount * pFlac->channels * sizeof(drflac_int32)); +// drflac_uint64 numberOfInterleavedSamplesActuallyRead = drflac_read_pcm_frames_s32(pFlac, pFlac->totalPCMFrameCount, pSamples); +// +// The drflac object represents the decoder. It is a transparent type so all the information you need, such as the number of +// channels and the bits per sample, should be directly accessible - just make sure you don't change their values. Samples are +// always output as interleaved signed 32-bit PCM. In the example above a native FLAC stream was opened, however dr_flac has +// seamless support for Ogg encapsulated FLAC streams as well. +// +// You do not need to decode the entire stream in one go - you just specify how many samples you'd like at any given time and +// the decoder will give you as many samples as it can, up to the amount requested. Later on when you need the next batch of +// samples, just call it again. Example: +// +// while (drflac_read_pcm_frames_s32(pFlac, chunkSizeInPCMFrames, pChunkSamples) > 0) { +// do_something(); +// } +// +// You can seek to a specific sample with drflac_seek_to_sample(). The given sample is based on interleaving. So for example, +// if you were to seek to the sample at index 0 in a stereo stream, you'll be seeking to the first sample of the left channel. +// The sample at index 1 will be the first sample of the right channel. The sample at index 2 will be the second sample of the +// left channel, etc. +// +// +// If you just want to quickly decode an entire FLAC file in one go you can do something like this: +// +// unsigned int channels; +// unsigned int sampleRate; +// drflac_uint64 totalPCMFrameCount; +// drflac_int32* pSampleData = drflac_open_file_and_read_pcm_frames_s32("MySong.flac", &channels, &sampleRate, &totalPCMFrameCount); +// if (pSampleData == NULL) { +// // Failed to open and decode FLAC file. +// } +// +// ... +// +// drflac_free(pSampleData); +// +// +// You can read samples as signed 16-bit integer and 32-bit floating-point PCM with the *_s16() and *_f32() family of APIs +// respectively, but note that these should be considered lossy. +// +// +// If you need access to metadata (album art, etc.), use drflac_open_with_metadata(), drflac_open_file_with_metdata() or +// drflac_open_memory_with_metadata(). The rationale for keeping these APIs separate is that they're slightly slower than the +// normal versions and also just a little bit harder to use. +// +// dr_flac reports metadata to the application through the use of a callback, and every metadata block is reported before +// drflac_open_with_metdata() returns. +// +// +// The main opening APIs (drflac_open(), etc.) will fail if the header is not present. The presents a problem in certain +// scenarios such as broadcast style streams like internet radio where the header may not be present because the user has +// started playback mid-stream. To handle this, use the relaxed APIs: drflac_open_relaxed() and drflac_open_with_metadata_relaxed(). +// +// It is not recommended to use these APIs for file based streams because a missing header would usually indicate a +// corrupted or perverse file. In addition, these APIs can take a long time to initialize because they may need to spend +// a lot of time finding the first frame. +// +// +// +// OPTIONS +// #define these options before including this file. +// +// #define DR_FLAC_NO_STDIO +// Disable drflac_open_file() and family. +// +// #define DR_FLAC_NO_OGG +// Disables support for Ogg/FLAC streams. +// +// #define DR_FLAC_BUFFER_SIZE +// Defines the size of the internal buffer to store data from onRead(). This buffer is used to reduce the number of calls +// back to the client for more data. Larger values means more memory, but better performance. My tests show diminishing +// returns after about 4KB (which is the default). Consider reducing this if you have a very efficient implementation of +// onRead(), or increase it if it's very inefficient. Must be a multiple of 8. +// +// #define DR_FLAC_NO_CRC +// Disables CRC checks. This will offer a performance boost when CRC is unnecessary. +// +// #define DR_FLAC_NO_SIMD +// Disables SIMD optimizations (SSE on x86/x64 architectures). Use this if you are having compatibility issues with your +// compiler. +// +// +// +// QUICK NOTES +// - dr_flac does not currently support changing the sample rate nor channel count mid stream. +// - Audio data is output as signed 32-bit PCM, regardless of the bits per sample the FLAC stream is encoded as. +// - This has not been tested on big-endian architectures. +// - dr_flac is not thread-safe, but its APIs can be called from any thread so long as you do your own synchronization. +// - When using Ogg encapsulation, a corrupted metadata block will result in drflac_open_with_metadata() and drflac_open() +// returning inconsistent samples. + +#ifndef dr_flac_h +#define dr_flac_h + +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +typedef signed char drflac_int8; +typedef unsigned char drflac_uint8; +typedef signed short drflac_int16; +typedef unsigned short drflac_uint16; +typedef signed int drflac_int32; +typedef unsigned int drflac_uint32; +typedef signed __int64 drflac_int64; +typedef unsigned __int64 drflac_uint64; +#else +#include +typedef int8_t drflac_int8; +typedef uint8_t drflac_uint8; +typedef int16_t drflac_int16; +typedef uint16_t drflac_uint16; +typedef int32_t drflac_int32; +typedef uint32_t drflac_uint32; +typedef int64_t drflac_int64; +typedef uint64_t drflac_uint64; +#endif +typedef drflac_uint8 drflac_bool8; +typedef drflac_uint32 drflac_bool32; +#define DRFLAC_TRUE 1 +#define DRFLAC_FALSE 0 + +#if defined(_MSC_VER) && _MSC_VER >= 1700 // Visual Studio 2012 +#define DRFLAC_DEPRECATED __declspec(deprecated) +#elif (defined(__GNUC__) && __GNUC__ >= 4) +#define DRFLAC_DEPRECATED __attribute__((deprecated)) +#elif (defined(__clang__) && __has_feature(attribute_deprecated)) +#define DRFLAC_DEPRECATED __attribute__((deprecated)) +#else +#define DRFLAC_DEPRECATED +#endif + +// As data is read from the client it is placed into an internal buffer for fast access. This controls the +// size of that buffer. Larger values means more speed, but also more memory. In my testing there is diminishing +// returns after about 4KB, but you can fiddle with this to suit your own needs. Must be a multiple of 8. +#ifndef DR_FLAC_BUFFER_SIZE +#define DR_FLAC_BUFFER_SIZE 4096 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// Check if we can enable 64-bit optimizations. +#if defined(_WIN64) || defined(_LP64) || defined(__LP64__) +#define DRFLAC_64BIT +#endif + +#ifdef DRFLAC_64BIT +typedef drflac_uint64 drflac_cache_t; +#else +typedef drflac_uint32 drflac_cache_t; +#endif + +// The various metadata block types. +#define DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO 0 +#define DRFLAC_METADATA_BLOCK_TYPE_PADDING 1 +#define DRFLAC_METADATA_BLOCK_TYPE_APPLICATION 2 +#define DRFLAC_METADATA_BLOCK_TYPE_SEEKTABLE 3 +#define DRFLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT 4 +#define DRFLAC_METADATA_BLOCK_TYPE_CUESHEET 5 +#define DRFLAC_METADATA_BLOCK_TYPE_PICTURE 6 +#define DRFLAC_METADATA_BLOCK_TYPE_INVALID 127 + +// The various picture types specified in the PICTURE block. +#define DRFLAC_PICTURE_TYPE_OTHER 0 +#define DRFLAC_PICTURE_TYPE_FILE_ICON 1 +#define DRFLAC_PICTURE_TYPE_OTHER_FILE_ICON 2 +#define DRFLAC_PICTURE_TYPE_COVER_FRONT 3 +#define DRFLAC_PICTURE_TYPE_COVER_BACK 4 +#define DRFLAC_PICTURE_TYPE_LEAFLET_PAGE 5 +#define DRFLAC_PICTURE_TYPE_MEDIA 6 +#define DRFLAC_PICTURE_TYPE_LEAD_ARTIST 7 +#define DRFLAC_PICTURE_TYPE_ARTIST 8 +#define DRFLAC_PICTURE_TYPE_CONDUCTOR 9 +#define DRFLAC_PICTURE_TYPE_BAND 10 +#define DRFLAC_PICTURE_TYPE_COMPOSER 11 +#define DRFLAC_PICTURE_TYPE_LYRICIST 12 +#define DRFLAC_PICTURE_TYPE_RECORDING_LOCATION 13 +#define DRFLAC_PICTURE_TYPE_DURING_RECORDING 14 +#define DRFLAC_PICTURE_TYPE_DURING_PERFORMANCE 15 +#define DRFLAC_PICTURE_TYPE_SCREEN_CAPTURE 16 +#define DRFLAC_PICTURE_TYPE_BRIGHT_COLORED_FISH 17 +#define DRFLAC_PICTURE_TYPE_ILLUSTRATION 18 +#define DRFLAC_PICTURE_TYPE_BAND_LOGOTYPE 19 +#define DRFLAC_PICTURE_TYPE_PUBLISHER_LOGOTYPE 20 + +typedef enum +{ + drflac_container_native, + drflac_container_ogg, + drflac_container_unknown +} drflac_container; + +typedef enum +{ + drflac_seek_origin_start, + drflac_seek_origin_current +} drflac_seek_origin; + +// Packing is important on this structure because we map this directly to the raw data within the SEEKTABLE metadata block. +#pragma pack(2) +typedef struct +{ + drflac_uint64 firstSample; + drflac_uint64 frameOffset; // The offset from the first byte of the header of the first frame. + drflac_uint16 sampleCount; +} drflac_seekpoint; +#pragma pack() + +typedef struct +{ + drflac_uint16 minBlockSize; + drflac_uint16 maxBlockSize; + drflac_uint32 minFrameSize; + drflac_uint32 maxFrameSize; + drflac_uint32 sampleRate; + drflac_uint8 channels; + drflac_uint8 bitsPerSample; + drflac_uint64 totalSampleCount; + drflac_uint8 md5[16]; +} drflac_streaminfo; + +typedef struct +{ + // The metadata type. Use this to know how to interpret the data below. + drflac_uint32 type; + + // A pointer to the raw data. This points to a temporary buffer so don't hold on to it. It's best to + // not modify the contents of this buffer. Use the structures below for more meaningful and structured + // information about the metadata. It's possible for this to be null. + const void* pRawData; + + // The size in bytes of the block and the buffer pointed to by pRawData if it's non-NULL. + drflac_uint32 rawDataSize; + + union + { + drflac_streaminfo streaminfo; + + struct + { + int unused; + } padding; + + struct + { + drflac_uint32 id; + const void* pData; + drflac_uint32 dataSize; + } application; + + struct + { + drflac_uint32 seekpointCount; + const drflac_seekpoint* pSeekpoints; + } seektable; + + struct + { + drflac_uint32 vendorLength; + const char* vendor; + drflac_uint32 commentCount; + const void* pComments; + } vorbis_comment; + + struct + { + char catalog[128]; + drflac_uint64 leadInSampleCount; + drflac_bool32 isCD; + drflac_uint8 trackCount; + const void* pTrackData; + } cuesheet; + + struct + { + drflac_uint32 type; + drflac_uint32 mimeLength; + const char* mime; + drflac_uint32 descriptionLength; + const char* description; + drflac_uint32 width; + drflac_uint32 height; + drflac_uint32 colorDepth; + drflac_uint32 indexColorCount; + drflac_uint32 pictureDataSize; + const drflac_uint8* pPictureData; + } picture; + } data; +} drflac_metadata; + + +// Callback for when data needs to be read from the client. +// +// pUserData [in] The user data that was passed to drflac_open() and family. +// pBufferOut [out] The output buffer. +// bytesToRead [in] The number of bytes to read. +// +// Returns the number of bytes actually read. +// +// A return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until +// either the entire bytesToRead is filled or you have reached the end of the stream. +typedef size_t (* drflac_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); + +// Callback for when data needs to be seeked. +// +// pUserData [in] The user data that was passed to drflac_open() and family. +// offset [in] The number of bytes to move, relative to the origin. Will never be negative. +// origin [in] The origin of the seek - the current position or the start of the stream. +// +// Returns whether or not the seek was successful. +// +// The offset will never be negative. Whether or not it is relative to the beginning or current position is determined +// by the "origin" parameter which will be either drflac_seek_origin_start or drflac_seek_origin_current. +typedef drflac_bool32 (* drflac_seek_proc)(void* pUserData, int offset, drflac_seek_origin origin); + +// Callback for when a metadata block is read. +// +// pUserData [in] The user data that was passed to drflac_open() and family. +// pMetadata [in] A pointer to a structure containing the data of the metadata block. +// +// Use pMetadata->type to determine which metadata block is being handled and how to read the data. +typedef void (* drflac_meta_proc)(void* pUserData, drflac_metadata* pMetadata); + + +// Structure for internal use. Only used for decoders opened with drflac_open_memory. +typedef struct +{ + const drflac_uint8* data; + size_t dataSize; + size_t currentReadPos; +} drflac__memory_stream; + +// Structure for internal use. Used for bit streaming. +typedef struct +{ + // The function to call when more data needs to be read. + drflac_read_proc onRead; + + // The function to call when the current read position needs to be moved. + drflac_seek_proc onSeek; + + // The user data to pass around to onRead and onSeek. + void* pUserData; + + + // The number of unaligned bytes in the L2 cache. This will always be 0 until the end of the stream is hit. At the end of the + // stream there will be a number of bytes that don't cleanly fit in an L1 cache line, so we use this variable to know whether + // or not the bistreamer needs to run on a slower path to read those last bytes. This will never be more than sizeof(drflac_cache_t). + size_t unalignedByteCount; + + // The content of the unaligned bytes. + drflac_cache_t unalignedCache; + + // The index of the next valid cache line in the "L2" cache. + drflac_uint32 nextL2Line; + + // The number of bits that have been consumed by the cache. This is used to determine how many valid bits are remaining. + drflac_uint32 consumedBits; + + // The cached data which was most recently read from the client. There are two levels of cache. Data flows as such: + // Client -> L2 -> L1. The L2 -> L1 movement is aligned and runs on a fast path in just a few instructions. + drflac_cache_t cacheL2[DR_FLAC_BUFFER_SIZE/sizeof(drflac_cache_t)]; + drflac_cache_t cache; + + // CRC-16. This is updated whenever bits are read from the bit stream. Manually set this to 0 to reset the CRC. For FLAC, this + // is reset to 0 at the beginning of each frame. + drflac_uint16 crc16; + drflac_cache_t crc16Cache; // A cache for optimizing CRC calculations. This is filled when when the L1 cache is reloaded. + drflac_uint32 crc16CacheIgnoredBytes; // The number of bytes to ignore when updating the CRC-16 from the CRC-16 cache. +} drflac_bs; + +typedef struct +{ + // The type of the subframe: SUBFRAME_CONSTANT, SUBFRAME_VERBATIM, SUBFRAME_FIXED or SUBFRAME_LPC. + drflac_uint8 subframeType; + + // The number of wasted bits per sample as specified by the sub-frame header. + drflac_uint8 wastedBitsPerSample; + + // The order to use for the prediction stage for SUBFRAME_FIXED and SUBFRAME_LPC. + drflac_uint8 lpcOrder; + + // The number of bits per sample for this subframe. This is not always equal to the current frame's bit per sample because + // an extra bit is required for side channels when interchannel decorrelation is being used. + drflac_uint32 bitsPerSample; + + // A pointer to the buffer containing the decoded samples in the subframe. This pointer is an offset from drflac::pExtraData. Note that + // it's a signed 32-bit integer for each value. + drflac_int32* pDecodedSamples; +} drflac_subframe; + +typedef struct +{ + // If the stream uses variable block sizes, this will be set to the index of the first sample. If fixed block sizes are used, this will + // always be set to 0. + drflac_uint64 sampleNumber; + + // If the stream uses fixed block sizes, this will be set to the frame number. If variable block sizes are used, this will always be 0. + drflac_uint32 frameNumber; + + // The sample rate of this frame. + drflac_uint32 sampleRate; + + // The number of samples in each sub-frame within this frame. + drflac_uint16 blockSize; + + // The channel assignment of this frame. This is not always set to the channel count. If interchannel decorrelation is being used this + // will be set to DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE, DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE or DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE. + drflac_uint8 channelAssignment; + + // The number of bits per sample within this frame. + drflac_uint8 bitsPerSample; + + // The frame's CRC. + drflac_uint8 crc8; +} drflac_frame_header; + +typedef struct +{ + // The header. + drflac_frame_header header; + + // The number of samples left to be read in this frame. This is initially set to the block size multiplied by the channel count. As samples + // are read, this will be decremented. When it reaches 0, the decoder will see this frame as fully consumed and load the next frame. + drflac_uint32 samplesRemaining; + + // The list of sub-frames within the frame. There is one sub-frame for each channel, and there's a maximum of 8 channels. + drflac_subframe subframes[8]; +} drflac_frame; + +typedef struct +{ + // The function to call when a metadata block is read. + drflac_meta_proc onMeta; + + // The user data posted to the metadata callback function. + void* pUserDataMD; + + + // The sample rate. Will be set to something like 44100. + drflac_uint32 sampleRate; + + // The number of channels. This will be set to 1 for monaural streams, 2 for stereo, etc. Maximum 8. This is set based on the + // value specified in the STREAMINFO block. + drflac_uint8 channels; + + // The bits per sample. Will be set to something like 16, 24, etc. + drflac_uint8 bitsPerSample; + + // The maximum block size, in samples. This number represents the number of samples in each channel (not combined). + drflac_uint16 maxBlockSize; + + // The total number of samples making up the stream. This includes every channel. For example, if the stream has 2 channels, + // with each channel having a total of 4096, this value will be set to 2*4096 = 8192. Can be 0 in which case it's still a + // valid stream, but just means the total sample count is unknown. Likely the case with streams like internet radio. + drflac_uint64 totalSampleCount; + drflac_uint64 totalPCMFrameCount; // <-- Equal to totalSampleCount / channels. + + + // The container type. This is set based on whether or not the decoder was opened from a native or Ogg stream. + drflac_container container; + + // The number of seekpoints in the seektable. + drflac_uint32 seekpointCount; + + + // Information about the frame the decoder is currently sitting on. + drflac_frame currentFrame; + + // The index of the sample the decoder is currently sitting on. This is only used for seeking. + drflac_uint64 currentSample; + + // The position of the first frame in the stream. This is only ever used for seeking. + drflac_uint64 firstFramePos; + + + // A hack to avoid a malloc() when opening a decoder with drflac_open_memory(). + drflac__memory_stream memoryStream; + + + // A pointer to the decoded sample data. This is an offset of pExtraData. + drflac_int32* pDecodedSamples; + + // A pointer to the seek table. This is an offset of pExtraData, or NULL if there is no seek table. + drflac_seekpoint* pSeekpoints; + + // Internal use only. Only used with Ogg containers. Points to a drflac_oggbs object. This is an offset of pExtraData. + void* _oggbs; + + // The bit streamer. The raw FLAC data is fed through this object. + drflac_bs bs; + + // Variable length extra data. We attach this to the end of the object so we can avoid unnecessary mallocs. + drflac_uint8 pExtraData[1]; +} drflac; + + +// Opens a FLAC decoder. +// +// onRead [in] The function to call when data needs to be read from the client. +// onSeek [in] The function to call when the read position of the client data needs to move. +// pUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek. +// +// Returns a pointer to an object representing the decoder. +// +// Close the decoder with drflac_close(). +// +// This function will automatically detect whether or not you are attempting to open a native or Ogg encapsulated +// FLAC, both of which should work seamlessly without any manual intervention. Ogg encapsulation also works with +// multiplexed streams which basically means it can play FLAC encoded audio tracks in videos. +// +// This is the lowest level function for opening a FLAC stream. You can also use drflac_open_file() and drflac_open_memory() +// to open the stream from a file or from a block of memory respectively. +// +// The STREAMINFO block must be present for this to succeed. Use drflac_open_relaxed() to open a FLAC stream where +// the header may not be present. +// +// See also: drflac_open_file(), drflac_open_memory(), drflac_open_with_metadata(), drflac_close() +drflac* drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData); + +// The same as drflac_open(), except attempts to open the stream even when a header block is not present. +// +// Because the header is not necessarily available, the caller must explicitly define the container (Native or Ogg). Do +// not set this to drflac_container_unknown - that is for internal use only. +// +// Opening in relaxed mode will continue reading data from onRead until it finds a valid frame. If a frame is never +// found it will continue forever. To abort, force your onRead callback to return 0, which dr_flac will use as an +// indicator that the end of the stream was found. +drflac* drflac_open_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_container container, void* pUserData); + +// Opens a FLAC decoder and notifies the caller of the metadata chunks (album art, etc.). +// +// onRead [in] The function to call when data needs to be read from the client. +// onSeek [in] The function to call when the read position of the client data needs to move. +// onMeta [in] The function to call for every metadata block. +// pUserData [in, optional] A pointer to application defined data that will be passed to onRead, onSeek and onMeta. +// +// Returns a pointer to an object representing the decoder. +// +// Close the decoder with drflac_close(). +// +// This is slower than drflac_open(), so avoid this one if you don't need metadata. Internally, this will do a DRFLAC_MALLOC() +// and DRFLAC_FREE() for every metadata block except for STREAMINFO and PADDING blocks. +// +// The caller is notified of the metadata via the onMeta callback. All metadata blocks will be handled before the function +// returns. +// +// The STREAMINFO block must be present for this to succeed. Use drflac_open_with_metadata_relaxed() to open a FLAC +// stream where the header may not be present. +// +// Note that this will behave inconsistently with drflac_open() if the stream is an Ogg encapsulated stream and a metadata +// block is corrupted. This is due to the way the Ogg stream recovers from corrupted pages. When drflac_open_with_metadata() +// is being used, the open routine will try to read the contents of the metadata block, whereas drflac_open() will simply +// seek past it (for the sake of efficiency). This inconsistency can result in different samples being returned depending on +// whether or not the stream is being opened with metadata. +// +// See also: drflac_open_file_with_metadata(), drflac_open_memory_with_metadata(), drflac_open(), drflac_close() +drflac* drflac_open_with_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData); + +// The same as drflac_open_with_metadata(), except attempts to open the stream even when a header block is not present. +// +// See also: drflac_open_with_metadata(), drflac_open_relaxed() +drflac* drflac_open_with_metadata_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData); + +// Closes the given FLAC decoder. +// +// pFlac [in] The decoder to close. +// +// This will destroy the decoder object. +void drflac_close(drflac* pFlac); + + +// Reads sample data from the given FLAC decoder, output as interleaved signed 32-bit PCM. +// +// pFlac [in] The decoder. +// framesToRead [in] The number of PCM frames to read. +// pBufferOut [out, optional] A pointer to the buffer that will receive the decoded samples. +// +// Returns the number of PCM frames actually read. +// +// pBufferOut can be null, in which case the call will act as a seek, and the return value will be the number of frames +// seeked. +drflac_uint64 drflac_read_pcm_frames_s32(drflac* pFlac, drflac_uint64 framesToRead, drflac_int32* pBufferOut); + +// Same as drflac_read_pcm_frames_s32(), except outputs samples as 16-bit integer PCM rather than 32-bit. +// +// Note that this is lossy for streams where the bits per sample is larger than 16. +drflac_uint64 drflac_read_pcm_frames_s16(drflac* pFlac, drflac_uint64 framesToRead, drflac_int16* pBufferOut); + +// Same as drflac_read_pcm_frames_s32(), except outputs samples as 32-bit floating-point PCM. +// +// Note that this should be considered lossy due to the nature of floating point numbers not being able to exactly +// represent every possible number. +drflac_uint64 drflac_read_pcm_frames_f32(drflac* pFlac, drflac_uint64 framesToRead, float* pBufferOut); + +// Seeks to the PCM frame at the given index. +// +// pFlac [in] The decoder. +// pcmFrameIndex [in] The index of the PCM frame to seek to. See notes below. +// +// Returns DRFLAC_TRUE if successful; DRFLAC_FALSE otherwise. +drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex); + + + +#ifndef DR_FLAC_NO_STDIO +// Opens a FLAC decoder from the file at the given path. +// +// filename [in] The path of the file to open, either absolute or relative to the current directory. +// +// Returns a pointer to an object representing the decoder. +// +// Close the decoder with drflac_close(). +// +// This will hold a handle to the file until the decoder is closed with drflac_close(). Some platforms will restrict the +// number of files a process can have open at any given time, so keep this mind if you have many decoders open at the +// same time. +// +// See also: drflac_open(), drflac_open_file_with_metadata(), drflac_close() +drflac* drflac_open_file(const char* filename); + +// Opens a FLAC decoder from the file at the given path and notifies the caller of the metadata chunks (album art, etc.) +// +// Look at the documentation for drflac_open_with_metadata() for more information on how metadata is handled. +drflac* drflac_open_file_with_metadata(const char* filename, drflac_meta_proc onMeta, void* pUserData); +#endif + +// Opens a FLAC decoder from a pre-allocated block of memory +// +// This does not create a copy of the data. It is up to the application to ensure the buffer remains valid for +// the lifetime of the decoder. +drflac* drflac_open_memory(const void* data, size_t dataSize); + +// Opens a FLAC decoder from a pre-allocated block of memory and notifies the caller of the metadata chunks (album art, etc.) +// +// Look at the documentation for drflac_open_with_metadata() for more information on how metadata is handled. +drflac* drflac_open_memory_with_metadata(const void* data, size_t dataSize, drflac_meta_proc onMeta, void* pUserData); + + + +//// High Level APIs //// + +// Opens a FLAC stream from the given callbacks and fully decodes it in a single operation. The return value is a +// pointer to the sample data as interleaved signed 32-bit PCM. The returned data must be freed with DRFLAC_FREE(). +// +// Sometimes a FLAC file won't keep track of the total sample count. In this situation the function will continuously +// read samples into a dynamically sized buffer on the heap until no samples are left. +// +// Do not call this function on a broadcast type of stream (like internet radio streams and whatnot). +drflac_int32* drflac_open_and_read_pcm_frames_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount); + +// Same as drflac_open_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. +drflac_int16* drflac_open_and_read_pcm_frames_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount); + +// Same as drflac_open_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. +float* drflac_open_and_read_pcm_frames_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount); + +#ifndef DR_FLAC_NO_STDIO +// Same as drflac_open_and_read_pcm_frames_s32() except opens the decoder from a file. +drflac_int32* drflac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount); + +// Same as drflac_open_file_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. +drflac_int16* drflac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount); + +// Same as drflac_open_file_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. +float* drflac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount); +#endif + +// Same as drflac_open_and_read_pcm_frames_s32() except opens the decoder from a block of memory. +drflac_int32* drflac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount); + +// Same as drflac_open_memory_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. +drflac_int16* drflac_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount); + +// Same as drflac_open_memory_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. +float* drflac_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount); + +// Frees memory that was allocated internally by dr_flac. +void drflac_free(void* p); + + +// Structure representing an iterator for vorbis comments in a VORBIS_COMMENT metadata block. +typedef struct +{ + drflac_uint32 countRemaining; + const char* pRunningData; +} drflac_vorbis_comment_iterator; + +// Initializes a vorbis comment iterator. This can be used for iterating over the vorbis comments in a VORBIS_COMMENT +// metadata block. +void drflac_init_vorbis_comment_iterator(drflac_vorbis_comment_iterator* pIter, drflac_uint32 commentCount, const void* pComments); + +// Goes to the next vorbis comment in the given iterator. If null is returned it means there are no more comments. The +// returned string is NOT null terminated. +const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, drflac_uint32* pCommentLengthOut); + + +// Structure representing an iterator for cuesheet tracks in a CUESHEET metadata block. +typedef struct +{ + drflac_uint32 countRemaining; + const char* pRunningData; +} drflac_cuesheet_track_iterator; + +// Packing is important on this structure because we map this directly to the raw data within the CUESHEET metadata block. +#pragma pack(4) +typedef struct +{ + drflac_uint64 offset; + drflac_uint8 index; + drflac_uint8 reserved[3]; +} drflac_cuesheet_track_index; +#pragma pack() + +typedef struct +{ + drflac_uint64 offset; + drflac_uint8 trackNumber; + char ISRC[12]; + drflac_bool8 isAudio; + drflac_bool8 preEmphasis; + drflac_uint8 indexCount; + const drflac_cuesheet_track_index* pIndexPoints; +} drflac_cuesheet_track; + +// Initializes a cuesheet track iterator. This can be used for iterating over the cuesheet tracks in a CUESHEET metadata +// block. +void drflac_init_cuesheet_track_iterator(drflac_cuesheet_track_iterator* pIter, drflac_uint32 trackCount, const void* pTrackData); + +// Goes to the next cuesheet track in the given iterator. If DRFLAC_FALSE is returned it means there are no more comments. +drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter, drflac_cuesheet_track* pCuesheetTrack); + + +//// Deprecated APIs //// +DRFLAC_DEPRECATED drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac_int32* pBufferOut); // Use drflac_read_pcm_frames_s32() instead. +DRFLAC_DEPRECATED drflac_uint64 drflac_read_s16(drflac* pFlac, drflac_uint64 samplesToRead, drflac_int16* pBufferOut); // Use drflac_read_pcm_frames_s16() instead. +DRFLAC_DEPRECATED drflac_uint64 drflac_read_f32(drflac* pFlac, drflac_uint64 samplesToRead, float* pBufferOut); // Use drflac_read_pcm_frames_f32() instead. +DRFLAC_DEPRECATED drflac_bool32 drflac_seek_to_sample(drflac* pFlac, drflac_uint64 sampleIndex); // Use drflac_seek_to_pcm_frame() instead. +DRFLAC_DEPRECATED drflac_int32* drflac_open_and_decode_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalSampleCount); // Use drflac_open_and_read_pcm_frames_s32(). +DRFLAC_DEPRECATED drflac_int16* drflac_open_and_decode_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalSampleCount); // Use drflac_open_and_read_pcm_frames_s16(). +DRFLAC_DEPRECATED float* drflac_open_and_decode_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalSampleCount); // Use drflac_open_and_read_pcm_frames_f32(). +DRFLAC_DEPRECATED drflac_int32* drflac_open_and_decode_file_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalSampleCount); // Use drflac_open_file_and_read_pcm_frames_s32(). +DRFLAC_DEPRECATED drflac_int16* drflac_open_and_decode_file_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalSampleCount); // Use drflac_open_file_and_read_pcm_frames_s16(). +DRFLAC_DEPRECATED float* drflac_open_and_decode_file_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalSampleCount); // Use drflac_open_file_and_read_pcm_frames_f32(). +DRFLAC_DEPRECATED drflac_int32* drflac_open_and_decode_memory_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalSampleCount); // Use drflac_open_memory_and_read_pcm_frames_s32(). +DRFLAC_DEPRECATED drflac_int16* drflac_open_and_decode_memory_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalSampleCount); // Use drflac_open_memory_and_read_pcm_frames_s16(). +DRFLAC_DEPRECATED float* drflac_open_and_decode_memory_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalSampleCount); // Use drflac_open_memory_and_read_pcm_frames_f32(). + +#ifdef __cplusplus +} +#endif +#endif //dr_flac_h + + +/////////////////////////////////////////////////////////////////////////////// +// +// IMPLEMENTATION +// +/////////////////////////////////////////////////////////////////////////////// +#ifdef DR_FLAC_IMPLEMENTATION +#ifdef __linux__ + #ifndef _BSD_SOURCE + #define _BSD_SOURCE + #endif + #ifndef __USE_BSD + #define __USE_BSD + #endif + #include +#endif + +#include +#include + +#ifdef _MSC_VER +#define DRFLAC_INLINE __forceinline +#else +#ifdef __GNUC__ +#define DRFLAC_INLINE inline __attribute__((always_inline)) +#else +#define DRFLAC_INLINE inline +#endif +#endif + +// CPU architecture. +#if defined(__x86_64__) || defined(_M_X64) + #define DRFLAC_X64 +#elif defined(__i386) || defined(_M_IX86) + #define DRFLAC_X86 +#elif defined(__arm__) || defined(_M_ARM) + #define DRFLAC_ARM +#endif + +// Intrinsics Support +#if !defined(DR_FLAC_NO_SIMD) + #if defined(DRFLAC_X64) || defined(DRFLAC_X86) + #if defined(_MSC_VER) && !defined(__clang__) + // MSVC. + #if !defined(DRFLAC_NO_SSE2) // Assume all MSVC compilers support SSE2 intrinsics. + #define DRFLAC_SUPPORT_SSE2 + #endif + #if _MSC_VER >= 1600 && !defined(DRFLAC_NO_SSE41) // 2010 + #define DRFLAC_SUPPORT_SSE41 + #endif + #else + // Assume GNUC-style. + #if defined(__SSE2__) && !defined(DRFLAC_NO_SSE2) + #define DRFLAC_SUPPORT_SSE2 + #endif + #if defined(__SSE4_1__) && !defined(DRFLAC_NO_SSE41) + #define DRFLAC_SUPPORT_SSE41 + #endif + #endif + + // If at this point we still haven't determined compiler support for the intrinsics just fall back to __has_include. + #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include) + #if !defined(DRFLAC_SUPPORT_SSE2) && !defined(DRFLAC_NO_SSE2) && __has_include() + #define DRFLAC_SUPPORT_SSE2 + #endif + #if !defined(DRFLAC_SUPPORT_SSE41) && !defined(DRFLAC_NO_SSE41) && __has_include() + #define DRFLAC_SUPPORT_SSE41 + #endif + #endif + + #if defined(DRFLAC_SUPPORT_SSE41) + #include + #elif defined(DRFLAC_SUPPORT_SSE2) + #include + #endif + #endif + + #if defined(DRFLAC_ARM) + #if !defined(DRFLAC_NO_NEON) && (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)) + #define DRFLAC_SUPPORT_NEON + #endif + + // Fall back to looking for the #include file. + #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include) + #if !defined(DRFLAC_SUPPORT_NEON) && !defined(DRFLAC_NO_NEON) && __has_include() + #define DRFLAC_SUPPORT_NEON + #endif + #endif + + #if defined(DRFLAC_SUPPORT_NEON) + #include + #endif + #endif +#endif + +// Compile-time CPU feature support. +#if !defined(DR_FLAC_NO_SIMD) && (defined(DRFLAC_X86) || defined(DRFLAC_X64)) + #if defined(_MSC_VER) && !defined(__clang__) + #if _MSC_VER >= 1400 + #include + static void drflac__cpuid(int info[4], int fid) + { + __cpuid(info, fid); + } + #else + #define DRFLAC_NO_CPUID + #endif + #else + #if defined(__GNUC__) || defined(__clang__) + static void drflac__cpuid(int info[4], int fid) + { + // It looks like the -fPIC option uses the ebx register which GCC complains about. We can work around this by just using a different register, the + // specific register of which I'm letting the compiler decide on. The "k" prefix is used to specify a 32-bit register. The {...} syntax is for + // supporting different assembly dialects. + // + // What's basically happening is that we're saving and restoring the ebx register manually. + #if defined(DRFLAC_X86) && defined(__PIC__) + __asm__ __volatile__ ( + "xchg{l} {%%}ebx, %k1;" + "cpuid;" + "xchg{l} {%%}ebx, %k1;" + : "=a"(info[0]), "=&r"(info[1]), "=c"(info[2]), "=d"(info[3]) : "a"(fid), "c"(0) + ); + #else + __asm__ __volatile__ ( + "cpuid" : "=a"(info[0]), "=b"(info[1]), "=c"(info[2]), "=d"(info[3]) : "a"(fid), "c"(0) + ); + #endif + } + #else + #define DRFLAC_NO_CPUID + #endif + #endif +#else + #define DRFLAC_NO_CPUID +#endif + +static DRFLAC_INLINE drflac_bool32 drflac_has_sse2() +{ +#if defined(DRFLAC_SUPPORT_SSE2) + #if (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(DRFLAC_NO_SSE2) + #if defined(DRFLAC_X64) + return DRFLAC_TRUE; // 64-bit targets always support SSE2. + #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__) + return DRFLAC_TRUE; // If the compiler is allowed to freely generate SSE2 code we can assume support. + #else + #if defined(DRFLAC_NO_CPUID) + return DRFLAC_FALSE; + #else + int info[4]; + drflac_cpuid(info, 1); + return (info[3] & (1 << 26)) != 0; + #endif + #endif + #else + return DRFLAC_FALSE; // SSE2 is only supported on x86 and x64 architectures. + #endif +#else + return DRFLAC_FALSE; // No compiler support. +#endif +} + +static DRFLAC_INLINE drflac_bool32 drflac_has_sse41() +{ +#if defined(DRFLAC_SUPPORT_SSE41) + #if (defined(DRFLAC_X64) || defined(DRFLAC_X86)) && !defined(DRFLAC_NO_SSE41) + #if defined(DRFLAC_X64) + return DRFLAC_TRUE; // 64-bit targets always support SSE4.1. + #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE4_1__) + return DRFLAC_TRUE; // If the compiler is allowed to freely generate SSE41 code we can assume support. + #else + #if defined(DRFLAC_NO_CPUID) + return DRFLAC_FALSE; + #else + int info[4]; + drflac_cpuid(info, 1); + return (info[2] & (1 << 19)) != 0; + #endif + #endif + #else + return DRFLAC_FALSE; // SSE41 is only supported on x86 and x64 architectures. + #endif +#else + return DRFLAC_FALSE; // No compiler support. +#endif +} + + +#if defined(_MSC_VER) && _MSC_VER >= 1500 && (defined(DRFLAC_X86) || defined(DRFLAC_X64)) + #define DRFLAC_HAS_LZCNT_INTRINSIC +#elif (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) + #define DRFLAC_HAS_LZCNT_INTRINSIC +#elif defined(__clang__) + #if __has_builtin(__builtin_clzll) || __has_builtin(__builtin_clzl) + #define DRFLAC_HAS_LZCNT_INTRINSIC + #endif +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1300 + #define DRFLAC_HAS_BYTESWAP16_INTRINSIC + #define DRFLAC_HAS_BYTESWAP32_INTRINSIC + #define DRFLAC_HAS_BYTESWAP64_INTRINSIC +#elif defined(__clang__) + #if __has_builtin(__builtin_bswap16) + #define DRFLAC_HAS_BYTESWAP16_INTRINSIC + #endif + #if __has_builtin(__builtin_bswap32) + #define DRFLAC_HAS_BYTESWAP32_INTRINSIC + #endif + #if __has_builtin(__builtin_bswap64) + #define DRFLAC_HAS_BYTESWAP64_INTRINSIC + #endif +#elif defined(__GNUC__) + #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define DRFLAC_HAS_BYTESWAP32_INTRINSIC + #define DRFLAC_HAS_BYTESWAP64_INTRINSIC + #endif + #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) + #define DRFLAC_HAS_BYTESWAP16_INTRINSIC + #endif +#endif + + +// Standard library stuff. +#ifndef DRFLAC_ASSERT +#include +#define DRFLAC_ASSERT(expression) assert(expression) +#endif +#ifndef DRFLAC_MALLOC +#define DRFLAC_MALLOC(sz) malloc((sz)) +#endif +#ifndef DRFLAC_REALLOC +#define DRFLAC_REALLOC(p, sz) realloc((p), (sz)) +#endif +#ifndef DRFLAC_FREE +#define DRFLAC_FREE(p) free((p)) +#endif +#ifndef DRFLAC_COPY_MEMORY +#define DRFLAC_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz)) +#endif +#ifndef DRFLAC_ZERO_MEMORY +#define DRFLAC_ZERO_MEMORY(p, sz) memset((p), 0, (sz)) +#endif + +#define DRFLAC_MAX_SIMD_VECTOR_SIZE 64 // 64 for AVX-512 in the future. + +typedef drflac_int32 drflac_result; +#define DRFLAC_SUCCESS 0 +#define DRFLAC_ERROR -1 // A generic error. +#define DRFLAC_INVALID_ARGS -2 +#define DRFLAC_END_OF_STREAM -128 +#define DRFLAC_CRC_MISMATCH -129 + +#define DRFLAC_SUBFRAME_CONSTANT 0 +#define DRFLAC_SUBFRAME_VERBATIM 1 +#define DRFLAC_SUBFRAME_FIXED 8 +#define DRFLAC_SUBFRAME_LPC 32 +#define DRFLAC_SUBFRAME_RESERVED 255 + +#define DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE 0 +#define DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2 1 + +#define DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT 0 +#define DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE 8 +#define DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE 9 +#define DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE 10 + +// Keeps track of the number of leading samples for each sub-frame. This is required because the SSE pipeline will occasionally +// reference excess prior samples. +#define DRFLAC_LEADING_SAMPLES 32 + + +#define drflac_align(x, a) ((((x) + (a) - 1) / (a)) * (a)) +#define drflac_assert DRFLAC_ASSERT +#define drflac_copy_memory DRFLAC_COPY_MEMORY +#define drflac_zero_memory DRFLAC_ZERO_MEMORY + + +// CPU caps. +static drflac_bool32 drflac__gIsLZCNTSupported = DRFLAC_FALSE; +#ifndef DRFLAC_NO_CPUID +static drflac_bool32 drflac__gIsSSE2Supported = DRFLAC_FALSE; +static drflac_bool32 drflac__gIsSSE41Supported = DRFLAC_FALSE; +static void drflac__init_cpu_caps() +{ + int info[4] = {0}; + + // LZCNT + drflac__cpuid(info, 0x80000001); + drflac__gIsLZCNTSupported = (info[2] & (1 << 5)) != 0; + + // SSE2 + drflac__gIsSSE2Supported = drflac_has_sse2(); + + // SSE4.1 + drflac__gIsSSE41Supported = drflac_has_sse41(); +} +#endif + + +//// Endian Management //// +static DRFLAC_INLINE drflac_bool32 drflac__is_little_endian() +{ +#if defined(DRFLAC_X86) || defined(DRFLAC_X64) + return DRFLAC_TRUE; +#else + int n = 1; + return (*(char*)&n) == 1; +#endif +} + +static DRFLAC_INLINE drflac_uint16 drflac__swap_endian_uint16(drflac_uint16 n) +{ +#ifdef DRFLAC_HAS_BYTESWAP16_INTRINSIC + #if defined(_MSC_VER) + return _byteswap_ushort(n); + #elif defined(__GNUC__) || defined(__clang__) + return __builtin_bswap16(n); + #else + #error "This compiler does not support the byte swap intrinsic." + #endif +#else + return ((n & 0xFF00) >> 8) | + ((n & 0x00FF) << 8); +#endif +} + +static DRFLAC_INLINE drflac_uint32 drflac__swap_endian_uint32(drflac_uint32 n) +{ +#ifdef DRFLAC_HAS_BYTESWAP32_INTRINSIC + #if defined(_MSC_VER) + return _byteswap_ulong(n); + #elif defined(__GNUC__) || defined(__clang__) + return __builtin_bswap32(n); + #else + #error "This compiler does not support the byte swap intrinsic." + #endif +#else + return ((n & 0xFF000000) >> 24) | + ((n & 0x00FF0000) >> 8) | + ((n & 0x0000FF00) << 8) | + ((n & 0x000000FF) << 24); +#endif +} + +static DRFLAC_INLINE drflac_uint64 drflac__swap_endian_uint64(drflac_uint64 n) +{ +#ifdef DRFLAC_HAS_BYTESWAP64_INTRINSIC + #if defined(_MSC_VER) + return _byteswap_uint64(n); + #elif defined(__GNUC__) || defined(__clang__) + return __builtin_bswap64(n); + #else + #error "This compiler does not support the byte swap intrinsic." + #endif +#else + return ((n & (drflac_uint64)0xFF00000000000000) >> 56) | + ((n & (drflac_uint64)0x00FF000000000000) >> 40) | + ((n & (drflac_uint64)0x0000FF0000000000) >> 24) | + ((n & (drflac_uint64)0x000000FF00000000) >> 8) | + ((n & (drflac_uint64)0x00000000FF000000) << 8) | + ((n & (drflac_uint64)0x0000000000FF0000) << 24) | + ((n & (drflac_uint64)0x000000000000FF00) << 40) | + ((n & (drflac_uint64)0x00000000000000FF) << 56); +#endif +} + + +static DRFLAC_INLINE drflac_uint16 drflac__be2host_16(drflac_uint16 n) +{ +#ifdef __linux__ + return be16toh(n); +#else + if (drflac__is_little_endian()) { + return drflac__swap_endian_uint16(n); + } + + return n; +#endif +} + +static DRFLAC_INLINE drflac_uint32 drflac__be2host_32(drflac_uint32 n) +{ +#ifdef __linux__ + return be32toh(n); +#else + if (drflac__is_little_endian()) { + return drflac__swap_endian_uint32(n); + } + + return n; +#endif +} + +static DRFLAC_INLINE drflac_uint64 drflac__be2host_64(drflac_uint64 n) +{ +#ifdef __linux__ + return be64toh(n); +#else + if (drflac__is_little_endian()) { + return drflac__swap_endian_uint64(n); + } + + return n; +#endif +} + + +static DRFLAC_INLINE drflac_uint32 drflac__le2host_32(drflac_uint32 n) +{ +#ifdef __linux__ + return le32toh(n); +#else + if (!drflac__is_little_endian()) { + return drflac__swap_endian_uint32(n); + } + + return n; +#endif +} + + +static DRFLAC_INLINE drflac_uint32 drflac__unsynchsafe_32(drflac_uint32 n) +{ + drflac_uint32 result = 0; + result |= (n & 0x7F000000) >> 3; + result |= (n & 0x007F0000) >> 2; + result |= (n & 0x00007F00) >> 1; + result |= (n & 0x0000007F) >> 0; + + return result; +} + + + +// The CRC code below is based on this document: http://zlib.net/crc_v3.txt +static drflac_uint8 drflac__crc8_table[] = { + 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, + 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, + 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, + 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, + 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, + 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, + 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, + 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, + 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, + 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, + 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, + 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, + 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, + 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, + 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, + 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 +}; + +static drflac_uint16 drflac__crc16_table[] = { + 0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011, + 0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022, + 0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072, + 0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041, + 0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2, + 0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1, + 0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1, + 0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082, + 0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192, + 0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1, + 0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1, + 0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2, + 0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151, + 0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162, + 0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132, + 0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101, + 0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312, + 0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321, + 0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371, + 0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342, + 0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1, + 0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2, + 0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2, + 0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381, + 0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291, + 0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2, + 0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2, + 0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1, + 0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252, + 0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261, + 0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231, + 0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202 +}; + +static DRFLAC_INLINE drflac_uint8 drflac_crc8_byte(drflac_uint8 crc, drflac_uint8 data) +{ + return drflac__crc8_table[crc ^ data]; +} + +static DRFLAC_INLINE drflac_uint8 drflac_crc8(drflac_uint8 crc, drflac_uint32 data, drflac_uint32 count) +{ + drflac_assert(count <= 32); + +#ifdef DR_FLAC_NO_CRC + (void)crc; + (void)data; + (void)count; + return 0; +#else +#if 0 + // REFERENCE (use of this implementation requires an explicit flush by doing "drflac_crc8(crc, 0, 8);") + drflac_uint8 p = 0x07; + for (int i = count-1; i >= 0; --i) { + drflac_uint8 bit = (data & (1 << i)) >> i; + if (crc & 0x80) { + crc = ((crc << 1) | bit) ^ p; + } else { + crc = ((crc << 1) | bit); + } + } + return crc; +#else + drflac_uint32 wholeBytes = count >> 3; + drflac_uint32 leftoverBits = count - (wholeBytes*8); + + static drflac_uint64 leftoverDataMaskTable[8] = { + 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F + }; + drflac_uint64 leftoverDataMask = leftoverDataMaskTable[leftoverBits]; + + switch (wholeBytes) { + case 4: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0xFF000000UL << leftoverBits)) >> (24 + leftoverBits))); + case 3: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0x00FF0000UL << leftoverBits)) >> (16 + leftoverBits))); + case 2: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0x0000FF00UL << leftoverBits)) >> ( 8 + leftoverBits))); + case 1: crc = drflac_crc8_byte(crc, (drflac_uint8)((data & (0x000000FFUL << leftoverBits)) >> ( 0 + leftoverBits))); + case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc8_table[(crc >> (8 - leftoverBits)) ^ (data & leftoverDataMask)]; + } + return crc; +#endif +#endif +} + +static DRFLAC_INLINE drflac_uint16 drflac_crc16_byte(drflac_uint16 crc, drflac_uint8 data) +{ + return (crc << 8) ^ drflac__crc16_table[(drflac_uint8)(crc >> 8) ^ data]; +} + +static DRFLAC_INLINE drflac_uint16 drflac_crc16_bytes(drflac_uint16 crc, drflac_cache_t data, drflac_uint32 byteCount) +{ + switch (byteCount) + { +#ifdef DRFLAC_64BIT + case 8: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 56) & 0xFF)); + case 7: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 48) & 0xFF)); + case 6: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 40) & 0xFF)); + case 5: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 32) & 0xFF)); +#endif + case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 24) & 0xFF)); + case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 16) & 0xFF)); + case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 8) & 0xFF)); + case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data >> 0) & 0xFF)); + } + + return crc; +} + +static DRFLAC_INLINE drflac_uint16 drflac_crc16__32bit(drflac_uint16 crc, drflac_uint32 data, drflac_uint32 count) +{ + drflac_assert(count <= 64); + +#ifdef DR_FLAC_NO_CRC + (void)crc; + (void)data; + (void)count; + return 0; +#else +#if 0 + // REFERENCE (use of this implementation requires an explicit flush by doing "drflac_crc16(crc, 0, 16);") + drflac_uint16 p = 0x8005; + for (int i = count-1; i >= 0; --i) { + drflac_uint16 bit = (data & (1ULL << i)) >> i; + if (r & 0x8000) { + r = ((r << 1) | bit) ^ p; + } else { + r = ((r << 1) | bit); + } + } + + return crc; +#else + drflac_uint32 wholeBytes = count >> 3; + drflac_uint32 leftoverBits = count - (wholeBytes*8); + + static drflac_uint64 leftoverDataMaskTable[8] = { + 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F + }; + drflac_uint64 leftoverDataMask = leftoverDataMaskTable[leftoverBits]; + + switch (wholeBytes) { + default: + case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0xFF000000UL << leftoverBits)) >> (24 + leftoverBits))); + case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x00FF0000UL << leftoverBits)) >> (16 + leftoverBits))); + case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x0000FF00UL << leftoverBits)) >> ( 8 + leftoverBits))); + case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & (0x000000FFUL << leftoverBits)) >> ( 0 + leftoverBits))); + case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)]; + } + return crc; +#endif +#endif +} + +static DRFLAC_INLINE drflac_uint16 drflac_crc16__64bit(drflac_uint16 crc, drflac_uint64 data, drflac_uint32 count) +{ + drflac_assert(count <= 64); + +#ifdef DR_FLAC_NO_CRC + (void)crc; + (void)data; + (void)count; + return 0; +#else + drflac_uint32 wholeBytes = count >> 3; + drflac_uint32 leftoverBits = count - (wholeBytes*8); + + static drflac_uint64 leftoverDataMaskTable[8] = { + 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F + }; + drflac_uint64 leftoverDataMask = leftoverDataMaskTable[leftoverBits]; + + switch (wholeBytes) { + default: + case 8: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & ((drflac_uint64)0xFF00000000000000 << leftoverBits)) >> (56 + leftoverBits))); + case 7: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & ((drflac_uint64)0x00FF000000000000 << leftoverBits)) >> (48 + leftoverBits))); + case 6: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & ((drflac_uint64)0x0000FF0000000000 << leftoverBits)) >> (40 + leftoverBits))); + case 5: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & ((drflac_uint64)0x000000FF00000000 << leftoverBits)) >> (32 + leftoverBits))); + case 4: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & ((drflac_uint64)0x00000000FF000000 << leftoverBits)) >> (24 + leftoverBits))); + case 3: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & ((drflac_uint64)0x0000000000FF0000 << leftoverBits)) >> (16 + leftoverBits))); + case 2: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & ((drflac_uint64)0x000000000000FF00 << leftoverBits)) >> ( 8 + leftoverBits))); + case 1: crc = drflac_crc16_byte(crc, (drflac_uint8)((data & ((drflac_uint64)0x00000000000000FF << leftoverBits)) >> ( 0 + leftoverBits))); + case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ drflac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)]; + } + return crc; +#endif +} + + +static DRFLAC_INLINE drflac_uint16 drflac_crc16(drflac_uint16 crc, drflac_cache_t data, drflac_uint32 count) +{ +#ifdef DRFLAC_64BIT + return drflac_crc16__64bit(crc, data, count); +#else + return drflac_crc16__32bit(crc, data, count); +#endif +} + + +#ifdef DRFLAC_64BIT +#define drflac__be2host__cache_line drflac__be2host_64 +#else +#define drflac__be2host__cache_line drflac__be2host_32 +#endif + +// BIT READING ATTEMPT #2 +// +// This uses a 32- or 64-bit bit-shifted cache - as bits are read, the cache is shifted such that the first valid bit is sitting +// on the most significant bit. It uses the notion of an L1 and L2 cache (borrowed from CPU architecture), where the L1 cache +// is a 32- or 64-bit unsigned integer (depending on whether or not a 32- or 64-bit build is being compiled) and the L2 is an +// array of "cache lines", with each cache line being the same size as the L1. The L2 is a buffer of about 4KB and is where data +// from onRead() is read into. +#define DRFLAC_CACHE_L1_SIZE_BYTES(bs) (sizeof((bs)->cache)) +#define DRFLAC_CACHE_L1_SIZE_BITS(bs) (sizeof((bs)->cache)*8) +#define DRFLAC_CACHE_L1_BITS_REMAINING(bs) (DRFLAC_CACHE_L1_SIZE_BITS(bs) - (bs)->consumedBits) +#define DRFLAC_CACHE_L1_SELECTION_MASK(_bitCount) (~((~(drflac_cache_t)0) >> (_bitCount))) +#define DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, _bitCount) (DRFLAC_CACHE_L1_SIZE_BITS(bs) - (_bitCount)) +#define DRFLAC_CACHE_L1_SELECT(bs, _bitCount) (((bs)->cache) & DRFLAC_CACHE_L1_SELECTION_MASK(_bitCount)) +#define DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, _bitCount) (DRFLAC_CACHE_L1_SELECT((bs), (_bitCount)) >> DRFLAC_CACHE_L1_SELECTION_SHIFT((bs), (_bitCount))) +#define DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE(bs, _bitCount)(DRFLAC_CACHE_L1_SELECT((bs), (_bitCount)) >> (DRFLAC_CACHE_L1_SELECTION_SHIFT((bs), (_bitCount)) & (DRFLAC_CACHE_L1_SIZE_BITS(bs)-1))) +#define DRFLAC_CACHE_L2_SIZE_BYTES(bs) (sizeof((bs)->cacheL2)) +#define DRFLAC_CACHE_L2_LINE_COUNT(bs) (DRFLAC_CACHE_L2_SIZE_BYTES(bs) / sizeof((bs)->cacheL2[0])) +#define DRFLAC_CACHE_L2_LINES_REMAINING(bs) (DRFLAC_CACHE_L2_LINE_COUNT(bs) - (bs)->nextL2Line) + + +#ifndef DR_FLAC_NO_CRC +static DRFLAC_INLINE void drflac__reset_crc16(drflac_bs* bs) +{ + bs->crc16 = 0; + bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3; +} + +static DRFLAC_INLINE void drflac__update_crc16(drflac_bs* bs) +{ + bs->crc16 = drflac_crc16_bytes(bs->crc16, bs->crc16Cache, DRFLAC_CACHE_L1_SIZE_BYTES(bs) - bs->crc16CacheIgnoredBytes); + bs->crc16CacheIgnoredBytes = 0; +} + +static DRFLAC_INLINE drflac_uint16 drflac__flush_crc16(drflac_bs* bs) +{ + // We should never be flushing in a situation where we are not aligned on a byte boundary. + drflac_assert((DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7) == 0); + + // The bits that were read from the L1 cache need to be accumulated. The number of bytes needing to be accumulated is determined + // by the number of bits that have been consumed. + if (DRFLAC_CACHE_L1_BITS_REMAINING(bs) == 0) { + drflac__update_crc16(bs); + } else { + // We only accumulate the consumed bits. + bs->crc16 = drflac_crc16_bytes(bs->crc16, bs->crc16Cache >> DRFLAC_CACHE_L1_BITS_REMAINING(bs), (bs->consumedBits >> 3) - bs->crc16CacheIgnoredBytes); + + // The bits that we just accumulated should never be accumulated again. We need to keep track of how many bytes were accumulated + // so we can handle that later. + bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3; + } + + return bs->crc16; +} +#endif + +static DRFLAC_INLINE drflac_bool32 drflac__reload_l1_cache_from_l2(drflac_bs* bs) +{ + // Fast path. Try loading straight from L2. + if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { + bs->cache = bs->cacheL2[bs->nextL2Line++]; + return DRFLAC_TRUE; + } + + // If we get here it means we've run out of data in the L2 cache. We'll need to fetch more from the client, if there's + // any left. + if (bs->unalignedByteCount > 0) { + return DRFLAC_FALSE; // If we have any unaligned bytes it means there's no more aligned bytes left in the client. + } + + size_t bytesRead = bs->onRead(bs->pUserData, bs->cacheL2, DRFLAC_CACHE_L2_SIZE_BYTES(bs)); + + bs->nextL2Line = 0; + if (bytesRead == DRFLAC_CACHE_L2_SIZE_BYTES(bs)) { + bs->cache = bs->cacheL2[bs->nextL2Line++]; + return DRFLAC_TRUE; + } + + + // If we get here it means we were unable to retrieve enough data to fill the entire L2 cache. It probably + // means we've just reached the end of the file. We need to move the valid data down to the end of the buffer + // and adjust the index of the next line accordingly. Also keep in mind that the L2 cache must be aligned to + // the size of the L1 so we'll need to seek backwards by any misaligned bytes. + size_t alignedL1LineCount = bytesRead / DRFLAC_CACHE_L1_SIZE_BYTES(bs); + + // We need to keep track of any unaligned bytes for later use. + bs->unalignedByteCount = bytesRead - (alignedL1LineCount * DRFLAC_CACHE_L1_SIZE_BYTES(bs)); + if (bs->unalignedByteCount > 0) { + bs->unalignedCache = bs->cacheL2[alignedL1LineCount]; + } + + if (alignedL1LineCount > 0) { + size_t offset = DRFLAC_CACHE_L2_LINE_COUNT(bs) - alignedL1LineCount; + for (size_t i = alignedL1LineCount; i > 0; --i) { + bs->cacheL2[i-1 + offset] = bs->cacheL2[i-1]; + } + + bs->nextL2Line = (drflac_uint32)offset; + bs->cache = bs->cacheL2[bs->nextL2Line++]; + return DRFLAC_TRUE; + } else { + // If we get into this branch it means we weren't able to load any L1-aligned data. + bs->nextL2Line = DRFLAC_CACHE_L2_LINE_COUNT(bs); + return DRFLAC_FALSE; + } +} + +static drflac_bool32 drflac__reload_cache(drflac_bs* bs) +{ +#ifndef DR_FLAC_NO_CRC + drflac__update_crc16(bs); +#endif + + // Fast path. Try just moving the next value in the L2 cache to the L1 cache. + if (drflac__reload_l1_cache_from_l2(bs)) { + bs->cache = drflac__be2host__cache_line(bs->cache); + bs->consumedBits = 0; +#ifndef DR_FLAC_NO_CRC + bs->crc16Cache = bs->cache; +#endif + return DRFLAC_TRUE; + } + + // Slow path. + + // If we get here it means we have failed to load the L1 cache from the L2. Likely we've just reached the end of the stream and the last + // few bytes did not meet the alignment requirements for the L2 cache. In this case we need to fall back to a slower path and read the + // data from the unaligned cache. + size_t bytesRead = bs->unalignedByteCount; + if (bytesRead == 0) { + bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs); // <-- The stream has been exhausted, so marked the bits as consumed. + return DRFLAC_FALSE; + } + + drflac_assert(bytesRead < DRFLAC_CACHE_L1_SIZE_BYTES(bs)); + bs->consumedBits = (drflac_uint32)(DRFLAC_CACHE_L1_SIZE_BYTES(bs) - bytesRead) * 8; + + bs->cache = drflac__be2host__cache_line(bs->unalignedCache); + bs->cache &= DRFLAC_CACHE_L1_SELECTION_MASK(DRFLAC_CACHE_L1_BITS_REMAINING(bs)); // <-- Make sure the consumed bits are always set to zero. Other parts of the library depend on this property. + bs->unalignedByteCount = 0; // <-- At this point the unaligned bytes have been moved into the cache and we thus have no more unaligned bytes. + +#ifndef DR_FLAC_NO_CRC + bs->crc16Cache = bs->cache >> bs->consumedBits; + bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3; +#endif + return DRFLAC_TRUE; +} + +static void drflac__reset_cache(drflac_bs* bs) +{ + bs->nextL2Line = DRFLAC_CACHE_L2_LINE_COUNT(bs); // <-- This clears the L2 cache. + bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs); // <-- This clears the L1 cache. + bs->cache = 0; + bs->unalignedByteCount = 0; // <-- This clears the trailing unaligned bytes. + bs->unalignedCache = 0; + +#ifndef DR_FLAC_NO_CRC + bs->crc16Cache = 0; + bs->crc16CacheIgnoredBytes = 0; +#endif +} + + +static DRFLAC_INLINE drflac_bool32 drflac__read_uint32(drflac_bs* bs, unsigned int bitCount, drflac_uint32* pResultOut) +{ + drflac_assert(bs != NULL); + drflac_assert(pResultOut != NULL); + drflac_assert(bitCount > 0); + drflac_assert(bitCount <= 32); + + if (bs->consumedBits == DRFLAC_CACHE_L1_SIZE_BITS(bs)) { + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + } + + if (bitCount <= DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { + // If we want to load all 32-bits from a 32-bit cache we need to do it slightly differently because we can't do + // a 32-bit shift on a 32-bit integer. This will never be the case on 64-bit caches, so we can have a slightly + // more optimal solution for this. +#ifdef DRFLAC_64BIT + *pResultOut = (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCount); + bs->consumedBits += bitCount; + bs->cache <<= bitCount; +#else + if (bitCount < DRFLAC_CACHE_L1_SIZE_BITS(bs)) { + *pResultOut = (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCount); + bs->consumedBits += bitCount; + bs->cache <<= bitCount; + } else { + // Cannot shift by 32-bits, so need to do it differently. + *pResultOut = (drflac_uint32)bs->cache; + bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs); + bs->cache = 0; + } +#endif + + return DRFLAC_TRUE; + } else { + // It straddles the cached data. It will never cover more than the next chunk. We just read the number in two parts and combine them. + drflac_uint32 bitCountHi = DRFLAC_CACHE_L1_BITS_REMAINING(bs); + drflac_uint32 bitCountLo = bitCount - bitCountHi; + drflac_uint32 resultHi = (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCountHi); + + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + + *pResultOut = (resultHi << bitCountLo) | (drflac_uint32)DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCountLo); + bs->consumedBits += bitCountLo; + bs->cache <<= bitCountLo; + return DRFLAC_TRUE; + } +} + +static drflac_bool32 drflac__read_int32(drflac_bs* bs, unsigned int bitCount, drflac_int32* pResult) +{ + drflac_assert(bs != NULL); + drflac_assert(pResult != NULL); + drflac_assert(bitCount > 0); + drflac_assert(bitCount <= 32); + + drflac_uint32 result; + if (!drflac__read_uint32(bs, bitCount, &result)) { + return DRFLAC_FALSE; + } + + drflac_uint32 signbit = ((result >> (bitCount-1)) & 0x01); + result |= (~signbit + 1) << bitCount; + + *pResult = (drflac_int32)result; + return DRFLAC_TRUE; +} + +#ifdef DRFLAC_64BIT +static drflac_bool32 drflac__read_uint64(drflac_bs* bs, unsigned int bitCount, drflac_uint64* pResultOut) +{ + drflac_assert(bitCount <= 64); + drflac_assert(bitCount > 32); + + drflac_uint32 resultHi; + if (!drflac__read_uint32(bs, bitCount - 32, &resultHi)) { + return DRFLAC_FALSE; + } + + drflac_uint32 resultLo; + if (!drflac__read_uint32(bs, 32, &resultLo)) { + return DRFLAC_FALSE; + } + + *pResultOut = (((drflac_uint64)resultHi) << 32) | ((drflac_uint64)resultLo); + return DRFLAC_TRUE; +} +#endif + +// Function below is unused, but leaving it here in case I need to quickly add it again. +#if 0 +static drflac_bool32 drflac__read_int64(drflac_bs* bs, unsigned int bitCount, drflac_int64* pResultOut) +{ + drflac_assert(bitCount <= 64); + + drflac_uint64 result; + if (!drflac__read_uint64(bs, bitCount, &result)) { + return DRFLAC_FALSE; + } + + drflac_uint64 signbit = ((result >> (bitCount-1)) & 0x01); + result |= (~signbit + 1) << bitCount; + + *pResultOut = (drflac_int64)result; + return DRFLAC_TRUE; +} +#endif + +static drflac_bool32 drflac__read_uint16(drflac_bs* bs, unsigned int bitCount, drflac_uint16* pResult) +{ + drflac_assert(bs != NULL); + drflac_assert(pResult != NULL); + drflac_assert(bitCount > 0); + drflac_assert(bitCount <= 16); + + drflac_uint32 result; + if (!drflac__read_uint32(bs, bitCount, &result)) { + return DRFLAC_FALSE; + } + + *pResult = (drflac_uint16)result; + return DRFLAC_TRUE; +} + +#if 0 +static drflac_bool32 drflac__read_int16(drflac_bs* bs, unsigned int bitCount, drflac_int16* pResult) +{ + drflac_assert(bs != NULL); + drflac_assert(pResult != NULL); + drflac_assert(bitCount > 0); + drflac_assert(bitCount <= 16); + + drflac_int32 result; + if (!drflac__read_int32(bs, bitCount, &result)) { + return DRFLAC_FALSE; + } + + *pResult = (drflac_int16)result; + return DRFLAC_TRUE; +} +#endif + +static drflac_bool32 drflac__read_uint8(drflac_bs* bs, unsigned int bitCount, drflac_uint8* pResult) +{ + drflac_assert(bs != NULL); + drflac_assert(pResult != NULL); + drflac_assert(bitCount > 0); + drflac_assert(bitCount <= 8); + + drflac_uint32 result; + if (!drflac__read_uint32(bs, bitCount, &result)) { + return DRFLAC_FALSE; + } + + *pResult = (drflac_uint8)result; + return DRFLAC_TRUE; +} + +static drflac_bool32 drflac__read_int8(drflac_bs* bs, unsigned int bitCount, drflac_int8* pResult) +{ + drflac_assert(bs != NULL); + drflac_assert(pResult != NULL); + drflac_assert(bitCount > 0); + drflac_assert(bitCount <= 8); + + drflac_int32 result; + if (!drflac__read_int32(bs, bitCount, &result)) { + return DRFLAC_FALSE; + } + + *pResult = (drflac_int8)result; + return DRFLAC_TRUE; +} + + +static drflac_bool32 drflac__seek_bits(drflac_bs* bs, size_t bitsToSeek) +{ + if (bitsToSeek <= DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { + bs->consumedBits += (drflac_uint32)bitsToSeek; + bs->cache <<= bitsToSeek; + return DRFLAC_TRUE; + } else { + // It straddles the cached data. This function isn't called too frequently so I'm favouring simplicity here. + bitsToSeek -= DRFLAC_CACHE_L1_BITS_REMAINING(bs); + bs->consumedBits += DRFLAC_CACHE_L1_BITS_REMAINING(bs); + bs->cache = 0; + + // Simple case. Seek in groups of the same number as bits that fit within a cache line. +#ifdef DRFLAC_64BIT + while (bitsToSeek >= DRFLAC_CACHE_L1_SIZE_BITS(bs)) { + drflac_uint64 bin; + if (!drflac__read_uint64(bs, DRFLAC_CACHE_L1_SIZE_BITS(bs), &bin)) { + return DRFLAC_FALSE; + } + bitsToSeek -= DRFLAC_CACHE_L1_SIZE_BITS(bs); + } +#else + while (bitsToSeek >= DRFLAC_CACHE_L1_SIZE_BITS(bs)) { + drflac_uint32 bin; + if (!drflac__read_uint32(bs, DRFLAC_CACHE_L1_SIZE_BITS(bs), &bin)) { + return DRFLAC_FALSE; + } + bitsToSeek -= DRFLAC_CACHE_L1_SIZE_BITS(bs); + } +#endif + + // Whole leftover bytes. + while (bitsToSeek >= 8) { + drflac_uint8 bin; + if (!drflac__read_uint8(bs, 8, &bin)) { + return DRFLAC_FALSE; + } + bitsToSeek -= 8; + } + + // Leftover bits. + if (bitsToSeek > 0) { + drflac_uint8 bin; + if (!drflac__read_uint8(bs, (drflac_uint32)bitsToSeek, &bin)) { + return DRFLAC_FALSE; + } + bitsToSeek = 0; // <-- Necessary for the assert below. + } + + drflac_assert(bitsToSeek == 0); + return DRFLAC_TRUE; + } +} + + +// This function moves the bit streamer to the first bit after the sync code (bit 15 of the of the frame header). It will also update the CRC-16. +static drflac_bool32 drflac__find_and_seek_to_next_sync_code(drflac_bs* bs) +{ + drflac_assert(bs != NULL); + + // The sync code is always aligned to 8 bits. This is convenient for us because it means we can do byte-aligned movements. The first + // thing to do is align to the next byte. + if (!drflac__seek_bits(bs, DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7)) { + return DRFLAC_FALSE; + } + + for (;;) { +#ifndef DR_FLAC_NO_CRC + drflac__reset_crc16(bs); +#endif + + drflac_uint8 hi; + if (!drflac__read_uint8(bs, 8, &hi)) { + return DRFLAC_FALSE; + } + + if (hi == 0xFF) { + drflac_uint8 lo; + if (!drflac__read_uint8(bs, 6, &lo)) { + return DRFLAC_FALSE; + } + + if (lo == 0x3E) { + return DRFLAC_TRUE; + } else { + if (!drflac__seek_bits(bs, DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7)) { + return DRFLAC_FALSE; + } + } + } + } + + // Should never get here. + //return DRFLAC_FALSE; +} + + +#if !defined(DR_FLAC_NO_SIMD) && defined(DRFLAC_HAS_LZCNT_INTRINSIC) +#define DRFLAC_IMPLEMENT_CLZ_LZCNT +#endif +#if defined(_MSC_VER) && _MSC_VER >= 1400 && (defined(DRFLAC_X64) || defined(DRFLAC_X86)) +#define DRFLAC_IMPLEMENT_CLZ_MSVC +#endif + +static DRFLAC_INLINE drflac_uint32 drflac__clz_software(drflac_cache_t x) +{ + if (x == 0) { + return sizeof(x)*8; + } + + static drflac_uint32 clz_table_4[] = { + 0, + 4, + 3, 3, + 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1 + }; + + drflac_uint32 n = clz_table_4[x >> (sizeof(x)*8 - 4)]; + if (n == 0) { +#ifdef DRFLAC_64BIT + if ((x & 0xFFFFFFFF00000000ULL) == 0) { n = 32; x <<= 32; } + if ((x & 0xFFFF000000000000ULL) == 0) { n += 16; x <<= 16; } + if ((x & 0xFF00000000000000ULL) == 0) { n += 8; x <<= 8; } + if ((x & 0xF000000000000000ULL) == 0) { n += 4; x <<= 4; } +#else + if ((x & 0xFFFF0000) == 0) { n = 16; x <<= 16; } + if ((x & 0xFF000000) == 0) { n += 8; x <<= 8; } + if ((x & 0xF0000000) == 0) { n += 4; x <<= 4; } +#endif + n += clz_table_4[x >> (sizeof(x)*8 - 4)]; + } + + return n - 1; +} + +#ifdef DRFLAC_IMPLEMENT_CLZ_LZCNT +static DRFLAC_INLINE drflac_bool32 drflac__is_lzcnt_supported() +{ + // If the compiler itself does not support the intrinsic then we'll need to return false. +#ifdef DRFLAC_HAS_LZCNT_INTRINSIC + return drflac__gIsLZCNTSupported; +#else + return DRFLAC_FALSE; +#endif +} + +static DRFLAC_INLINE drflac_uint32 drflac__clz_lzcnt(drflac_cache_t x) +{ +#if defined(_MSC_VER) && !defined(__clang__) + #ifdef DRFLAC_64BIT + return (drflac_uint32)__lzcnt64(x); + #else + return (drflac_uint32)__lzcnt(x); + #endif +#else + #if defined(__GNUC__) || defined(__clang__) + if (x == 0) { + return sizeof(x)*8; + } + #ifdef DRFLAC_64BIT + return (drflac_uint32)__builtin_clzll((unsigned long long)x); + #else + return (drflac_uint32)__builtin_clzl((unsigned long)x); + #endif + #else + // Unsupported compiler. + #error "This compiler does not support the lzcnt intrinsic." + #endif +#endif +} +#endif + +#ifdef DRFLAC_IMPLEMENT_CLZ_MSVC +#include // For BitScanReverse(). + +static DRFLAC_INLINE drflac_uint32 drflac__clz_msvc(drflac_cache_t x) +{ + if (x == 0) { + return sizeof(x)*8; + } + + drflac_uint32 n; +#ifdef DRFLAC_64BIT + _BitScanReverse64((unsigned long*)&n, x); +#else + _BitScanReverse((unsigned long*)&n, x); +#endif + return sizeof(x)*8 - n - 1; +} +#endif + +static DRFLAC_INLINE drflac_uint32 drflac__clz(drflac_cache_t x) +{ +#ifdef DRFLAC_IMPLEMENT_CLZ_LZCNT + if (drflac__is_lzcnt_supported()) { + return drflac__clz_lzcnt(x); + } else +#endif + { +#ifdef DRFLAC_IMPLEMENT_CLZ_MSVC + return drflac__clz_msvc(x); +#else + return drflac__clz_software(x); +#endif + } +} + + +static inline drflac_bool32 drflac__seek_past_next_set_bit(drflac_bs* bs, unsigned int* pOffsetOut) +{ + drflac_uint32 zeroCounter = 0; + while (bs->cache == 0) { + zeroCounter += (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs); + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + } + + drflac_uint32 setBitOffsetPlus1 = drflac__clz(bs->cache); + setBitOffsetPlus1 += 1; + + bs->consumedBits += setBitOffsetPlus1; + bs->cache <<= setBitOffsetPlus1; + + *pOffsetOut = zeroCounter + setBitOffsetPlus1 - 1; + return DRFLAC_TRUE; +} + + + +static drflac_bool32 drflac__seek_to_byte(drflac_bs* bs, drflac_uint64 offsetFromStart) +{ + drflac_assert(bs != NULL); + drflac_assert(offsetFromStart > 0); + + // Seeking from the start is not quite as trivial as it sounds because the onSeek callback takes a signed 32-bit integer (which + // is intentional because it simplifies the implementation of the onSeek callbacks), however offsetFromStart is unsigned 64-bit. + // To resolve we just need to do an initial seek from the start, and then a series of offset seeks to make up the remainder. + if (offsetFromStart > 0x7FFFFFFF) { + drflac_uint64 bytesRemaining = offsetFromStart; + if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, drflac_seek_origin_start)) { + return DRFLAC_FALSE; + } + bytesRemaining -= 0x7FFFFFFF; + + while (bytesRemaining > 0x7FFFFFFF) { + if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, drflac_seek_origin_current)) { + return DRFLAC_FALSE; + } + bytesRemaining -= 0x7FFFFFFF; + } + + if (bytesRemaining > 0) { + if (!bs->onSeek(bs->pUserData, (int)bytesRemaining, drflac_seek_origin_current)) { + return DRFLAC_FALSE; + } + } + } else { + if (!bs->onSeek(bs->pUserData, (int)offsetFromStart, drflac_seek_origin_start)) { + return DRFLAC_FALSE; + } + } + + // The cache should be reset to force a reload of fresh data from the client. + drflac__reset_cache(bs); + return DRFLAC_TRUE; +} + + +static drflac_result drflac__read_utf8_coded_number(drflac_bs* bs, drflac_uint64* pNumberOut, drflac_uint8* pCRCOut) +{ + drflac_assert(bs != NULL); + drflac_assert(pNumberOut != NULL); + + drflac_uint8 crc = *pCRCOut; + + unsigned char utf8[7] = {0}; + if (!drflac__read_uint8(bs, 8, utf8)) { + *pNumberOut = 0; + return DRFLAC_END_OF_STREAM; + } + crc = drflac_crc8(crc, utf8[0], 8); + + if ((utf8[0] & 0x80) == 0) { + *pNumberOut = utf8[0]; + *pCRCOut = crc; + return DRFLAC_SUCCESS; + } + + int byteCount = 1; + if ((utf8[0] & 0xE0) == 0xC0) { + byteCount = 2; + } else if ((utf8[0] & 0xF0) == 0xE0) { + byteCount = 3; + } else if ((utf8[0] & 0xF8) == 0xF0) { + byteCount = 4; + } else if ((utf8[0] & 0xFC) == 0xF8) { + byteCount = 5; + } else if ((utf8[0] & 0xFE) == 0xFC) { + byteCount = 6; + } else if ((utf8[0] & 0xFF) == 0xFE) { + byteCount = 7; + } else { + *pNumberOut = 0; + return DRFLAC_CRC_MISMATCH; // Bad UTF-8 encoding. + } + + // Read extra bytes. + drflac_assert(byteCount > 1); + + drflac_uint64 result = (drflac_uint64)(utf8[0] & (0xFF >> (byteCount + 1))); + for (int i = 1; i < byteCount; ++i) { + if (!drflac__read_uint8(bs, 8, utf8 + i)) { + *pNumberOut = 0; + return DRFLAC_END_OF_STREAM; + } + crc = drflac_crc8(crc, utf8[i], 8); + + result = (result << 6) | (utf8[i] & 0x3F); + } + + *pNumberOut = result; + *pCRCOut = crc; + return DRFLAC_SUCCESS; +} + + + + +// The next two functions are responsible for calculating the prediction. +// +// When the bits per sample is >16 we need to use 64-bit integer arithmetic because otherwise we'll run out of precision. It's +// safe to assume this will be slower on 32-bit platforms so we use a more optimal solution when the bits per sample is <=16. +static DRFLAC_INLINE drflac_int32 drflac__calculate_prediction_32(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) +{ + drflac_assert(order <= 32); + + // 32-bit version. + + // VC++ optimizes this to a single jmp. I've not yet verified this for other compilers. + drflac_int32 prediction = 0; + + switch (order) + { + case 32: prediction += coefficients[31] * pDecodedSamples[-32]; + case 31: prediction += coefficients[30] * pDecodedSamples[-31]; + case 30: prediction += coefficients[29] * pDecodedSamples[-30]; + case 29: prediction += coefficients[28] * pDecodedSamples[-29]; + case 28: prediction += coefficients[27] * pDecodedSamples[-28]; + case 27: prediction += coefficients[26] * pDecodedSamples[-27]; + case 26: prediction += coefficients[25] * pDecodedSamples[-26]; + case 25: prediction += coefficients[24] * pDecodedSamples[-25]; + case 24: prediction += coefficients[23] * pDecodedSamples[-24]; + case 23: prediction += coefficients[22] * pDecodedSamples[-23]; + case 22: prediction += coefficients[21] * pDecodedSamples[-22]; + case 21: prediction += coefficients[20] * pDecodedSamples[-21]; + case 20: prediction += coefficients[19] * pDecodedSamples[-20]; + case 19: prediction += coefficients[18] * pDecodedSamples[-19]; + case 18: prediction += coefficients[17] * pDecodedSamples[-18]; + case 17: prediction += coefficients[16] * pDecodedSamples[-17]; + case 16: prediction += coefficients[15] * pDecodedSamples[-16]; + case 15: prediction += coefficients[14] * pDecodedSamples[-15]; + case 14: prediction += coefficients[13] * pDecodedSamples[-14]; + case 13: prediction += coefficients[12] * pDecodedSamples[-13]; + case 12: prediction += coefficients[11] * pDecodedSamples[-12]; + case 11: prediction += coefficients[10] * pDecodedSamples[-11]; + case 10: prediction += coefficients[ 9] * pDecodedSamples[-10]; + case 9: prediction += coefficients[ 8] * pDecodedSamples[- 9]; + case 8: prediction += coefficients[ 7] * pDecodedSamples[- 8]; + case 7: prediction += coefficients[ 6] * pDecodedSamples[- 7]; + case 6: prediction += coefficients[ 5] * pDecodedSamples[- 6]; + case 5: prediction += coefficients[ 4] * pDecodedSamples[- 5]; + case 4: prediction += coefficients[ 3] * pDecodedSamples[- 4]; + case 3: prediction += coefficients[ 2] * pDecodedSamples[- 3]; + case 2: prediction += coefficients[ 1] * pDecodedSamples[- 2]; + case 1: prediction += coefficients[ 0] * pDecodedSamples[- 1]; + } + + return (drflac_int32)(prediction >> shift); +} + +static DRFLAC_INLINE drflac_int32 drflac__calculate_prediction_64(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) +{ + drflac_assert(order <= 32); + + // 64-bit version. + + // This method is faster on the 32-bit build when compiling with VC++. See note below. +#ifndef DRFLAC_64BIT + drflac_int64 prediction; + if (order == 8) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; + prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; + prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; + prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; + prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; + } + else if (order == 7) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; + prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; + prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; + prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; + } + else if (order == 3) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + } + else if (order == 6) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; + prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; + prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; + } + else if (order == 5) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; + prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; + } + else if (order == 4) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; + } + else if (order == 12) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; + prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; + prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; + prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; + prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; + prediction += coefficients[8] * (drflac_int64)pDecodedSamples[-9]; + prediction += coefficients[9] * (drflac_int64)pDecodedSamples[-10]; + prediction += coefficients[10] * (drflac_int64)pDecodedSamples[-11]; + prediction += coefficients[11] * (drflac_int64)pDecodedSamples[-12]; + } + else if (order == 2) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + } + else if (order == 1) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + } + else if (order == 10) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; + prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; + prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; + prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; + prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; + prediction += coefficients[8] * (drflac_int64)pDecodedSamples[-9]; + prediction += coefficients[9] * (drflac_int64)pDecodedSamples[-10]; + } + else if (order == 9) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; + prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; + prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; + prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; + prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; + prediction += coefficients[8] * (drflac_int64)pDecodedSamples[-9]; + } + else if (order == 11) + { + prediction = coefficients[0] * (drflac_int64)pDecodedSamples[-1]; + prediction += coefficients[1] * (drflac_int64)pDecodedSamples[-2]; + prediction += coefficients[2] * (drflac_int64)pDecodedSamples[-3]; + prediction += coefficients[3] * (drflac_int64)pDecodedSamples[-4]; + prediction += coefficients[4] * (drflac_int64)pDecodedSamples[-5]; + prediction += coefficients[5] * (drflac_int64)pDecodedSamples[-6]; + prediction += coefficients[6] * (drflac_int64)pDecodedSamples[-7]; + prediction += coefficients[7] * (drflac_int64)pDecodedSamples[-8]; + prediction += coefficients[8] * (drflac_int64)pDecodedSamples[-9]; + prediction += coefficients[9] * (drflac_int64)pDecodedSamples[-10]; + prediction += coefficients[10] * (drflac_int64)pDecodedSamples[-11]; + } + else + { + prediction = 0; + for (int j = 0; j < (int)order; ++j) { + prediction += coefficients[j] * (drflac_int64)pDecodedSamples[-j-1]; + } + } +#endif + + // VC++ optimizes this to a single jmp instruction, but only the 64-bit build. The 32-bit build generates less efficient code for some + // reason. The ugly version above is faster so we'll just switch between the two depending on the target platform. +#ifdef DRFLAC_64BIT + drflac_int64 prediction = 0; + + switch (order) + { + case 32: prediction += coefficients[31] * (drflac_int64)pDecodedSamples[-32]; + case 31: prediction += coefficients[30] * (drflac_int64)pDecodedSamples[-31]; + case 30: prediction += coefficients[29] * (drflac_int64)pDecodedSamples[-30]; + case 29: prediction += coefficients[28] * (drflac_int64)pDecodedSamples[-29]; + case 28: prediction += coefficients[27] * (drflac_int64)pDecodedSamples[-28]; + case 27: prediction += coefficients[26] * (drflac_int64)pDecodedSamples[-27]; + case 26: prediction += coefficients[25] * (drflac_int64)pDecodedSamples[-26]; + case 25: prediction += coefficients[24] * (drflac_int64)pDecodedSamples[-25]; + case 24: prediction += coefficients[23] * (drflac_int64)pDecodedSamples[-24]; + case 23: prediction += coefficients[22] * (drflac_int64)pDecodedSamples[-23]; + case 22: prediction += coefficients[21] * (drflac_int64)pDecodedSamples[-22]; + case 21: prediction += coefficients[20] * (drflac_int64)pDecodedSamples[-21]; + case 20: prediction += coefficients[19] * (drflac_int64)pDecodedSamples[-20]; + case 19: prediction += coefficients[18] * (drflac_int64)pDecodedSamples[-19]; + case 18: prediction += coefficients[17] * (drflac_int64)pDecodedSamples[-18]; + case 17: prediction += coefficients[16] * (drflac_int64)pDecodedSamples[-17]; + case 16: prediction += coefficients[15] * (drflac_int64)pDecodedSamples[-16]; + case 15: prediction += coefficients[14] * (drflac_int64)pDecodedSamples[-15]; + case 14: prediction += coefficients[13] * (drflac_int64)pDecodedSamples[-14]; + case 13: prediction += coefficients[12] * (drflac_int64)pDecodedSamples[-13]; + case 12: prediction += coefficients[11] * (drflac_int64)pDecodedSamples[-12]; + case 11: prediction += coefficients[10] * (drflac_int64)pDecodedSamples[-11]; + case 10: prediction += coefficients[ 9] * (drflac_int64)pDecodedSamples[-10]; + case 9: prediction += coefficients[ 8] * (drflac_int64)pDecodedSamples[- 9]; + case 8: prediction += coefficients[ 7] * (drflac_int64)pDecodedSamples[- 8]; + case 7: prediction += coefficients[ 6] * (drflac_int64)pDecodedSamples[- 7]; + case 6: prediction += coefficients[ 5] * (drflac_int64)pDecodedSamples[- 6]; + case 5: prediction += coefficients[ 4] * (drflac_int64)pDecodedSamples[- 5]; + case 4: prediction += coefficients[ 3] * (drflac_int64)pDecodedSamples[- 4]; + case 3: prediction += coefficients[ 2] * (drflac_int64)pDecodedSamples[- 3]; + case 2: prediction += coefficients[ 1] * (drflac_int64)pDecodedSamples[- 2]; + case 1: prediction += coefficients[ 0] * (drflac_int64)pDecodedSamples[- 1]; + } +#endif + + return (drflac_int32)(prediction >> shift); +} + +static DRFLAC_INLINE void drflac__calculate_prediction_64_x4(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, const drflac_uint32 riceParamParts[4], drflac_int32* pDecodedSamples) +{ + drflac_assert(order <= 32); + + drflac_int64 prediction0 = 0; + drflac_int64 prediction1 = 0; + drflac_int64 prediction2 = 0; + drflac_int64 prediction3 = 0; + + switch (order) + { + case 32: + prediction0 += coefficients[31] * (drflac_int64)pDecodedSamples[-32]; + prediction1 += coefficients[31] * (drflac_int64)pDecodedSamples[-31]; + prediction2 += coefficients[31] * (drflac_int64)pDecodedSamples[-30]; + prediction3 += coefficients[31] * (drflac_int64)pDecodedSamples[-29]; + case 31: + prediction0 += coefficients[30] * (drflac_int64)pDecodedSamples[-31]; + prediction1 += coefficients[30] * (drflac_int64)pDecodedSamples[-30]; + prediction2 += coefficients[30] * (drflac_int64)pDecodedSamples[-29]; + prediction3 += coefficients[30] * (drflac_int64)pDecodedSamples[-28]; + case 30: + prediction0 += coefficients[29] * (drflac_int64)pDecodedSamples[-30]; + prediction1 += coefficients[29] * (drflac_int64)pDecodedSamples[-29]; + prediction2 += coefficients[29] * (drflac_int64)pDecodedSamples[-28]; + prediction3 += coefficients[29] * (drflac_int64)pDecodedSamples[-27]; + case 29: + prediction0 += coefficients[28] * (drflac_int64)pDecodedSamples[-29]; + prediction1 += coefficients[28] * (drflac_int64)pDecodedSamples[-28]; + prediction2 += coefficients[28] * (drflac_int64)pDecodedSamples[-27]; + prediction3 += coefficients[28] * (drflac_int64)pDecodedSamples[-26]; + case 28: + prediction0 += coefficients[27] * (drflac_int64)pDecodedSamples[-28]; + prediction1 += coefficients[27] * (drflac_int64)pDecodedSamples[-27]; + prediction2 += coefficients[27] * (drflac_int64)pDecodedSamples[-26]; + prediction3 += coefficients[27] * (drflac_int64)pDecodedSamples[-25]; + case 27: + prediction0 += coefficients[26] * (drflac_int64)pDecodedSamples[-27]; + prediction1 += coefficients[26] * (drflac_int64)pDecodedSamples[-26]; + prediction2 += coefficients[26] * (drflac_int64)pDecodedSamples[-25]; + prediction3 += coefficients[26] * (drflac_int64)pDecodedSamples[-24]; + case 26: + prediction0 += coefficients[25] * (drflac_int64)pDecodedSamples[-26]; + prediction1 += coefficients[25] * (drflac_int64)pDecodedSamples[-25]; + prediction2 += coefficients[25] * (drflac_int64)pDecodedSamples[-24]; + prediction3 += coefficients[25] * (drflac_int64)pDecodedSamples[-23]; + case 25: + prediction0 += coefficients[24] * (drflac_int64)pDecodedSamples[-25]; + prediction1 += coefficients[24] * (drflac_int64)pDecodedSamples[-24]; + prediction2 += coefficients[24] * (drflac_int64)pDecodedSamples[-23]; + prediction3 += coefficients[24] * (drflac_int64)pDecodedSamples[-22]; + case 24: + prediction0 += coefficients[23] * (drflac_int64)pDecodedSamples[-24]; + prediction1 += coefficients[23] * (drflac_int64)pDecodedSamples[-23]; + prediction2 += coefficients[23] * (drflac_int64)pDecodedSamples[-22]; + prediction3 += coefficients[23] * (drflac_int64)pDecodedSamples[-21]; + case 23: + prediction0 += coefficients[22] * (drflac_int64)pDecodedSamples[-23]; + prediction1 += coefficients[22] * (drflac_int64)pDecodedSamples[-22]; + prediction2 += coefficients[22] * (drflac_int64)pDecodedSamples[-21]; + prediction3 += coefficients[22] * (drflac_int64)pDecodedSamples[-20]; + case 22: + prediction0 += coefficients[21] * (drflac_int64)pDecodedSamples[-22]; + prediction1 += coefficients[21] * (drflac_int64)pDecodedSamples[-21]; + prediction2 += coefficients[21] * (drflac_int64)pDecodedSamples[-20]; + prediction3 += coefficients[21] * (drflac_int64)pDecodedSamples[-19]; + case 21: + prediction0 += coefficients[20] * (drflac_int64)pDecodedSamples[-21]; + prediction1 += coefficients[20] * (drflac_int64)pDecodedSamples[-20]; + prediction2 += coefficients[20] * (drflac_int64)pDecodedSamples[-19]; + prediction3 += coefficients[20] * (drflac_int64)pDecodedSamples[-18]; + case 20: + prediction0 += coefficients[19] * (drflac_int64)pDecodedSamples[-20]; + prediction1 += coefficients[19] * (drflac_int64)pDecodedSamples[-19]; + prediction2 += coefficients[19] * (drflac_int64)pDecodedSamples[-18]; + prediction3 += coefficients[19] * (drflac_int64)pDecodedSamples[-17]; + case 19: + prediction0 += coefficients[18] * (drflac_int64)pDecodedSamples[-19]; + prediction1 += coefficients[18] * (drflac_int64)pDecodedSamples[-18]; + prediction2 += coefficients[18] * (drflac_int64)pDecodedSamples[-17]; + prediction3 += coefficients[18] * (drflac_int64)pDecodedSamples[-16]; + case 18: + prediction0 += coefficients[17] * (drflac_int64)pDecodedSamples[-18]; + prediction1 += coefficients[17] * (drflac_int64)pDecodedSamples[-17]; + prediction2 += coefficients[17] * (drflac_int64)pDecodedSamples[-16]; + prediction3 += coefficients[17] * (drflac_int64)pDecodedSamples[-15]; + case 17: + prediction0 += coefficients[16] * (drflac_int64)pDecodedSamples[-17]; + prediction1 += coefficients[16] * (drflac_int64)pDecodedSamples[-16]; + prediction2 += coefficients[16] * (drflac_int64)pDecodedSamples[-15]; + prediction3 += coefficients[16] * (drflac_int64)pDecodedSamples[-14]; + + case 16: + prediction0 += coefficients[15] * (drflac_int64)pDecodedSamples[-16]; + prediction1 += coefficients[15] * (drflac_int64)pDecodedSamples[-15]; + prediction2 += coefficients[15] * (drflac_int64)pDecodedSamples[-14]; + prediction3 += coefficients[15] * (drflac_int64)pDecodedSamples[-13]; + case 15: + prediction0 += coefficients[14] * (drflac_int64)pDecodedSamples[-15]; + prediction1 += coefficients[14] * (drflac_int64)pDecodedSamples[-14]; + prediction2 += coefficients[14] * (drflac_int64)pDecodedSamples[-13]; + prediction3 += coefficients[14] * (drflac_int64)pDecodedSamples[-12]; + case 14: + prediction0 += coefficients[13] * (drflac_int64)pDecodedSamples[-14]; + prediction1 += coefficients[13] * (drflac_int64)pDecodedSamples[-13]; + prediction2 += coefficients[13] * (drflac_int64)pDecodedSamples[-12]; + prediction3 += coefficients[13] * (drflac_int64)pDecodedSamples[-11]; + case 13: + prediction0 += coefficients[12] * (drflac_int64)pDecodedSamples[-13]; + prediction1 += coefficients[12] * (drflac_int64)pDecodedSamples[-12]; + prediction2 += coefficients[12] * (drflac_int64)pDecodedSamples[-11]; + prediction3 += coefficients[12] * (drflac_int64)pDecodedSamples[-10]; + case 12: + prediction0 += coefficients[11] * (drflac_int64)pDecodedSamples[-12]; + prediction1 += coefficients[11] * (drflac_int64)pDecodedSamples[-11]; + prediction2 += coefficients[11] * (drflac_int64)pDecodedSamples[-10]; + prediction3 += coefficients[11] * (drflac_int64)pDecodedSamples[- 9]; + case 11: + prediction0 += coefficients[10] * (drflac_int64)pDecodedSamples[-11]; + prediction1 += coefficients[10] * (drflac_int64)pDecodedSamples[-10]; + prediction2 += coefficients[10] * (drflac_int64)pDecodedSamples[- 9]; + prediction3 += coefficients[10] * (drflac_int64)pDecodedSamples[- 8]; + case 10: + prediction0 += coefficients[9] * (drflac_int64)pDecodedSamples[-10]; + prediction1 += coefficients[9] * (drflac_int64)pDecodedSamples[- 9]; + prediction2 += coefficients[9] * (drflac_int64)pDecodedSamples[- 8]; + prediction3 += coefficients[9] * (drflac_int64)pDecodedSamples[- 7]; + case 9: + prediction0 += coefficients[8] * (drflac_int64)pDecodedSamples[- 9]; + prediction1 += coefficients[8] * (drflac_int64)pDecodedSamples[- 8]; + prediction2 += coefficients[8] * (drflac_int64)pDecodedSamples[- 7]; + prediction3 += coefficients[8] * (drflac_int64)pDecodedSamples[- 6]; + case 8: + prediction0 += coefficients[7] * (drflac_int64)pDecodedSamples[- 8]; + prediction1 += coefficients[7] * (drflac_int64)pDecodedSamples[- 7]; + prediction2 += coefficients[7] * (drflac_int64)pDecodedSamples[- 6]; + prediction3 += coefficients[7] * (drflac_int64)pDecodedSamples[- 5]; + case 7: + prediction0 += coefficients[6] * (drflac_int64)pDecodedSamples[- 7]; + prediction1 += coefficients[6] * (drflac_int64)pDecodedSamples[- 6]; + prediction2 += coefficients[6] * (drflac_int64)pDecodedSamples[- 5]; + prediction3 += coefficients[6] * (drflac_int64)pDecodedSamples[- 4]; + case 6: + prediction0 += coefficients[5] * (drflac_int64)pDecodedSamples[- 6]; + prediction1 += coefficients[5] * (drflac_int64)pDecodedSamples[- 5]; + prediction2 += coefficients[5] * (drflac_int64)pDecodedSamples[- 4]; + prediction3 += coefficients[5] * (drflac_int64)pDecodedSamples[- 3]; + case 5: + prediction0 += coefficients[4] * (drflac_int64)pDecodedSamples[- 5]; + prediction1 += coefficients[4] * (drflac_int64)pDecodedSamples[- 4]; + prediction2 += coefficients[4] * (drflac_int64)pDecodedSamples[- 3]; + prediction3 += coefficients[4] * (drflac_int64)pDecodedSamples[- 2]; + case 4: + prediction0 += coefficients[3] * (drflac_int64)pDecodedSamples[- 4]; + prediction1 += coefficients[3] * (drflac_int64)pDecodedSamples[- 3]; + prediction2 += coefficients[3] * (drflac_int64)pDecodedSamples[- 2]; + prediction3 += coefficients[3] * (drflac_int64)pDecodedSamples[- 1]; + order = 3; + } + + switch (order) + { + case 3: prediction0 += coefficients[ 2] * (drflac_int64)pDecodedSamples[- 3]; + case 2: prediction0 += coefficients[ 1] * (drflac_int64)pDecodedSamples[- 2]; + case 1: prediction0 += coefficients[ 0] * (drflac_int64)pDecodedSamples[- 1]; + } + pDecodedSamples[0] = riceParamParts[0] + (drflac_int32)(prediction0 >> shift); + + switch (order) + { + case 3: prediction1 += coefficients[ 2] * (drflac_int64)pDecodedSamples[- 2]; + case 2: prediction1 += coefficients[ 1] * (drflac_int64)pDecodedSamples[- 1]; + case 1: prediction1 += coefficients[ 0] * (drflac_int64)pDecodedSamples[ 0]; + } + pDecodedSamples[1] = riceParamParts[1] + (drflac_int32)(prediction1 >> shift); + + switch (order) + { + case 3: prediction2 += coefficients[ 2] * (drflac_int64)pDecodedSamples[- 1]; + case 2: prediction2 += coefficients[ 1] * (drflac_int64)pDecodedSamples[ 0]; + case 1: prediction2 += coefficients[ 0] * (drflac_int64)pDecodedSamples[ 1]; + } + pDecodedSamples[2] = riceParamParts[2] + (drflac_int32)(prediction2 >> shift); + + switch (order) + { + case 3: prediction3 += coefficients[ 2] * (drflac_int64)pDecodedSamples[ 0]; + case 2: prediction3 += coefficients[ 1] * (drflac_int64)pDecodedSamples[ 1]; + case 1: prediction3 += coefficients[ 0] * (drflac_int64)pDecodedSamples[ 2]; + } + pDecodedSamples[3] = riceParamParts[3] + (drflac_int32)(prediction3 >> shift); +} + +#if defined(DRFLAC_SUPPORT_SSE41) +static DRFLAC_INLINE drflac_int32 drflac__calculate_prediction_64__sse41(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) +{ + drflac_assert(order <= 32); + + __m128i prediction = _mm_setzero_si128(); + + switch (order) + { + case 32: + case 31: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[31], 0, coefficients[30]), _mm_set_epi32(0, pDecodedSamples[-32], 0, pDecodedSamples[-31]))); + case 30: + case 29: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[29], 0, coefficients[28]), _mm_set_epi32(0, pDecodedSamples[-30], 0, pDecodedSamples[-29]))); + case 28: + case 27: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[27], 0, coefficients[26]), _mm_set_epi32(0, pDecodedSamples[-28], 0, pDecodedSamples[-27]))); + case 26: + case 25: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[25], 0, coefficients[24]), _mm_set_epi32(0, pDecodedSamples[-26], 0, pDecodedSamples[-25]))); + case 24: + case 23: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[23], 0, coefficients[22]), _mm_set_epi32(0, pDecodedSamples[-24], 0, pDecodedSamples[-23]))); + case 22: + case 21: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[21], 0, coefficients[20]), _mm_set_epi32(0, pDecodedSamples[-22], 0, pDecodedSamples[-21]))); + case 20: + case 19: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[19], 0, coefficients[18]), _mm_set_epi32(0, pDecodedSamples[-20], 0, pDecodedSamples[-19]))); + case 18: + case 17: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[17], 0, coefficients[16]), _mm_set_epi32(0, pDecodedSamples[-18], 0, pDecodedSamples[-17]))); + case 16: + case 15: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[15], 0, coefficients[14]), _mm_set_epi32(0, pDecodedSamples[-16], 0, pDecodedSamples[-15]))); + case 14: + case 13: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[13], 0, coefficients[12]), _mm_set_epi32(0, pDecodedSamples[-14], 0, pDecodedSamples[-13]))); + case 12: + case 11: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[11], 0, coefficients[10]), _mm_set_epi32(0, pDecodedSamples[-12], 0, pDecodedSamples[-11]))); + case 10: + case 9: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 9], 0, coefficients[ 8]), _mm_set_epi32(0, pDecodedSamples[-10], 0, pDecodedSamples[- 9]))); + case 8: + case 7: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 7], 0, coefficients[ 6]), _mm_set_epi32(0, pDecodedSamples[- 8], 0, pDecodedSamples[- 7]))); + case 6: + case 5: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 5], 0, coefficients[ 4]), _mm_set_epi32(0, pDecodedSamples[- 6], 0, pDecodedSamples[- 5]))); + case 4: + case 3: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 3], 0, coefficients[ 2]), _mm_set_epi32(0, pDecodedSamples[- 4], 0, pDecodedSamples[- 3]))); + case 2: + case 1: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 1], 0, coefficients[ 0]), _mm_set_epi32(0, pDecodedSamples[- 2], 0, pDecodedSamples[- 1]))); + } + + return (drflac_int32)(( + ((drflac_uint64*)&prediction)[0] + + ((drflac_uint64*)&prediction)[1]) >> shift); +} + +static DRFLAC_INLINE void drflac__calculate_prediction_64_x2__sse41(drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, const drflac_uint32 riceParamParts[4], drflac_int32* pDecodedSamples) +{ + drflac_assert(order <= 32); + + __m128i prediction = _mm_setzero_si128(); + drflac_int64 predictions[2] = {0, 0}; + + switch (order) + { + case 32: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[31], 0, coefficients[31]), _mm_set_epi32(0, pDecodedSamples[-31], 0, pDecodedSamples[-32]))); + case 31: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[30], 0, coefficients[30]), _mm_set_epi32(0, pDecodedSamples[-30], 0, pDecodedSamples[-31]))); + case 30: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[29], 0, coefficients[29]), _mm_set_epi32(0, pDecodedSamples[-29], 0, pDecodedSamples[-30]))); + case 29: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[28], 0, coefficients[28]), _mm_set_epi32(0, pDecodedSamples[-28], 0, pDecodedSamples[-29]))); + case 28: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[27], 0, coefficients[27]), _mm_set_epi32(0, pDecodedSamples[-27], 0, pDecodedSamples[-28]))); + case 27: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[26], 0, coefficients[26]), _mm_set_epi32(0, pDecodedSamples[-26], 0, pDecodedSamples[-27]))); + case 26: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[25], 0, coefficients[25]), _mm_set_epi32(0, pDecodedSamples[-25], 0, pDecodedSamples[-26]))); + case 25: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[24], 0, coefficients[24]), _mm_set_epi32(0, pDecodedSamples[-24], 0, pDecodedSamples[-25]))); + case 24: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[23], 0, coefficients[23]), _mm_set_epi32(0, pDecodedSamples[-23], 0, pDecodedSamples[-24]))); + case 23: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[22], 0, coefficients[22]), _mm_set_epi32(0, pDecodedSamples[-22], 0, pDecodedSamples[-23]))); + case 22: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[21], 0, coefficients[21]), _mm_set_epi32(0, pDecodedSamples[-21], 0, pDecodedSamples[-22]))); + case 21: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[20], 0, coefficients[20]), _mm_set_epi32(0, pDecodedSamples[-20], 0, pDecodedSamples[-21]))); + case 20: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[19], 0, coefficients[19]), _mm_set_epi32(0, pDecodedSamples[-19], 0, pDecodedSamples[-20]))); + case 19: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[18], 0, coefficients[18]), _mm_set_epi32(0, pDecodedSamples[-18], 0, pDecodedSamples[-19]))); + case 18: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[17], 0, coefficients[17]), _mm_set_epi32(0, pDecodedSamples[-17], 0, pDecodedSamples[-18]))); + case 17: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[16], 0, coefficients[16]), _mm_set_epi32(0, pDecodedSamples[-16], 0, pDecodedSamples[-17]))); + case 16: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[15], 0, coefficients[15]), _mm_set_epi32(0, pDecodedSamples[-15], 0, pDecodedSamples[-16]))); + case 15: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[14], 0, coefficients[14]), _mm_set_epi32(0, pDecodedSamples[-14], 0, pDecodedSamples[-15]))); + case 14: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[13], 0, coefficients[13]), _mm_set_epi32(0, pDecodedSamples[-13], 0, pDecodedSamples[-14]))); + case 13: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[12], 0, coefficients[12]), _mm_set_epi32(0, pDecodedSamples[-12], 0, pDecodedSamples[-13]))); + case 12: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[11], 0, coefficients[11]), _mm_set_epi32(0, pDecodedSamples[-11], 0, pDecodedSamples[-12]))); + case 11: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[10], 0, coefficients[10]), _mm_set_epi32(0, pDecodedSamples[-10], 0, pDecodedSamples[-11]))); + case 10: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 9], 0, coefficients[ 9]), _mm_set_epi32(0, pDecodedSamples[- 9], 0, pDecodedSamples[-10]))); + case 9: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 8], 0, coefficients[ 8]), _mm_set_epi32(0, pDecodedSamples[- 8], 0, pDecodedSamples[- 9]))); + case 8: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 7], 0, coefficients[ 7]), _mm_set_epi32(0, pDecodedSamples[- 7], 0, pDecodedSamples[- 8]))); + case 7: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 6], 0, coefficients[ 6]), _mm_set_epi32(0, pDecodedSamples[- 6], 0, pDecodedSamples[- 7]))); + case 6: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 5], 0, coefficients[ 5]), _mm_set_epi32(0, pDecodedSamples[- 5], 0, pDecodedSamples[- 6]))); + case 5: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 4], 0, coefficients[ 4]), _mm_set_epi32(0, pDecodedSamples[- 4], 0, pDecodedSamples[- 5]))); + case 4: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 3], 0, coefficients[ 3]), _mm_set_epi32(0, pDecodedSamples[- 3], 0, pDecodedSamples[- 4]))); + case 3: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 2], 0, coefficients[ 2]), _mm_set_epi32(0, pDecodedSamples[- 2], 0, pDecodedSamples[- 3]))); + case 2: prediction = _mm_add_epi64(prediction, _mm_mul_epi32(_mm_set_epi32(0, coefficients[ 1], 0, coefficients[ 1]), _mm_set_epi32(0, pDecodedSamples[- 1], 0, pDecodedSamples[- 2]))); + order = 1; + } + + _mm_storeu_si128((__m128i*)predictions, prediction); + + switch (order) + { + case 1: predictions[0] += coefficients[ 0] * (drflac_int64)pDecodedSamples[- 1]; + } + pDecodedSamples[0] = riceParamParts[0] + (drflac_int32)(predictions[0] >> shift); + + switch (order) + { + case 1: predictions[1] += coefficients[ 0] * (drflac_int64)pDecodedSamples[ 0]; + } + pDecodedSamples[1] = riceParamParts[1] + (drflac_int32)(predictions[1] >> shift); +} + + +static DRFLAC_INLINE __m128i drflac__mm_not_si128(__m128i a) +{ + return _mm_xor_si128(a, _mm_cmpeq_epi32(_mm_setzero_si128(), _mm_setzero_si128())); +} + +static DRFLAC_INLINE __m128i drflac__mm_slide1_epi32(__m128i a, __m128i b) +{ + // a3a2a1a0/b3b2b1b0 -> a2a1a0b3 + + // Result = a2a1a0b3 + __m128i b3a3b2a2 = _mm_unpackhi_epi32(a, b); + __m128i a2b3a2b3 = _mm_shuffle_epi32(b3a3b2a2, _MM_SHUFFLE(0, 3, 0, 3)); + __m128i a1a2a0b3 = _mm_unpacklo_epi32(a2b3a2b3, a); + __m128i a2a1a0b3 = _mm_shuffle_epi32(a1a2a0b3, _MM_SHUFFLE(2, 3, 1, 0)); + return a2a1a0b3; +} + +static DRFLAC_INLINE __m128i drflac__mm_slide2_epi32(__m128i a, __m128i b) +{ + // Result = a1a0b3b2 + __m128i b1b0b3b2 = _mm_shuffle_epi32(b, _MM_SHUFFLE(1, 0, 3, 2)); + __m128i a1b3a0b2 = _mm_unpacklo_epi32(b1b0b3b2, a); + __m128i a1a0b3b2 = _mm_shuffle_epi32(a1b3a0b2, _MM_SHUFFLE(3, 1, 2, 0)); + return a1a0b3b2; +} + +static DRFLAC_INLINE __m128i drflac__mm_slide3_epi32(__m128i a, __m128i b) +{ + // Result = a0b3b2b1 + __m128i b1a1b0a0 = _mm_unpacklo_epi32(a, b); + __m128i a0b1a0b1 = _mm_shuffle_epi32(b1a1b0a0, _MM_SHUFFLE(0, 3, 0, 3)); + __m128i b3a0b2b1 = _mm_unpackhi_epi32(a0b1a0b1, b); + __m128i a0b3b2b1 = _mm_shuffle_epi32(b3a0b2b1, _MM_SHUFFLE(2, 3, 1, 0)); + return a0b3b2b1; +} + +static DRFLAC_INLINE void drflac__calculate_prediction_32_x4__sse41(drflac_uint32 order, drflac_int32 shift, const __m128i* coefficients128, const __m128i riceParamParts128, drflac_int32* pDecodedSamples) +{ + drflac_assert(order <= 32); + + // I don't think this is as efficient as it could be. More work needs to be done on this. + if (order > 0) { + __m128i s_09_10_11_12 = _mm_loadu_si128((const __m128i*)(pDecodedSamples - 12)); + __m128i s_05_06_07_08 = _mm_loadu_si128((const __m128i*)(pDecodedSamples - 8)); + __m128i s_01_02_03_04 = _mm_loadu_si128((const __m128i*)(pDecodedSamples - 4)); + + __m128i prediction = _mm_setzero_si128(); + + // The idea with this switch is to do do a single jump based on the value of "order". In my test library, "order" is never larger than 12, so + // I have decided to do a less optimal solution in the order > 12 case. + switch (order) + { + case 32: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[31], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 32)))); + case 31: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[30], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 31)))); + case 30: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[29], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 30)))); + case 29: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[28], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 29)))); + case 28: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[27], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 28)))); + case 27: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[26], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 27)))); + case 26: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[25], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 26)))); + case 25: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[24], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 25)))); + case 24: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[23], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 24)))); + case 23: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[22], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 23)))); + case 22: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[21], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 22)))); + case 21: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[20], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 21)))); + case 20: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[19], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 20)))); + case 19: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[18], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 19)))); + case 18: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[17], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 18)))); + case 17: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[16], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 17)))); + case 16: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[15], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 16)))); + case 15: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[14], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 15)))); + case 14: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[13], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 14)))); + case 13: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[12], _mm_loadu_si128((const __m128i*)(pDecodedSamples - 13)))); + + case 12: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[11], s_09_10_11_12)); + case 11: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[10], drflac__mm_slide3_epi32(s_05_06_07_08, s_09_10_11_12))); + case 10: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 9], drflac__mm_slide2_epi32(s_05_06_07_08, s_09_10_11_12))); + case 9: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 8], drflac__mm_slide1_epi32(s_05_06_07_08, s_09_10_11_12))); + case 8: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 7], s_05_06_07_08)); + case 7: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 6], drflac__mm_slide3_epi32(s_01_02_03_04, s_05_06_07_08))); + case 6: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 5], drflac__mm_slide2_epi32(s_01_02_03_04, s_05_06_07_08))); + case 5: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 4], drflac__mm_slide1_epi32(s_01_02_03_04, s_05_06_07_08))); + case 4: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 3], s_01_02_03_04)); order = 3; // <-- Don't forget to set order to 3 here! + case 3: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 2], drflac__mm_slide3_epi32(_mm_setzero_si128(), s_01_02_03_04))); + case 2: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 1], drflac__mm_slide2_epi32(_mm_setzero_si128(), s_01_02_03_04))); + case 1: prediction = _mm_add_epi32(prediction, _mm_mullo_epi32(coefficients128[ 0], drflac__mm_slide1_epi32(_mm_setzero_si128(), s_01_02_03_04))); + } + + drflac_int32 predictions[4]; + _mm_storeu_si128((__m128i*)predictions, prediction); + + drflac_uint32 riceParamParts[4]; + _mm_storeu_si128((__m128i*)riceParamParts, riceParamParts128); + + predictions[0] = riceParamParts[0] + (predictions[0] >> shift); + + switch (order) + { + case 3: predictions[3] += ((const drflac_int32*)&coefficients128[ 2])[0] * predictions[ 0]; + case 2: predictions[2] += ((const drflac_int32*)&coefficients128[ 1])[0] * predictions[ 0]; + case 1: predictions[1] += ((const drflac_int32*)&coefficients128[ 0])[0] * predictions[ 0]; + } + predictions[1] = riceParamParts[1] + (predictions[1] >> shift); + + switch (order) + { + case 3: + case 2: predictions[3] += ((const drflac_int32*)&coefficients128[ 1])[0] * predictions[ 1]; + case 1: predictions[2] += ((const drflac_int32*)&coefficients128[ 0])[0] * predictions[ 1]; + } + predictions[2] = riceParamParts[2] + (predictions[2] >> shift); + + switch (order) + { + case 3: + case 2: + case 1: predictions[3] += ((const drflac_int32*)&coefficients128[ 0])[0] * predictions[ 2]; + } + predictions[3] = riceParamParts[3] + (predictions[3] >> shift); + + pDecodedSamples[0] = predictions[0]; + pDecodedSamples[1] = predictions[1]; + pDecodedSamples[2] = predictions[2]; + pDecodedSamples[3] = predictions[3]; + } else { + _mm_storeu_si128((__m128i*)pDecodedSamples, riceParamParts128); + } +} +#endif + +#if 0 +// Reference implementation for reading and decoding samples with residual. This is intentionally left unoptimized for the +// sake of readability and should only be used as a reference. +static drflac_bool32 drflac__decode_samples_with_residual__rice__reference(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +{ + drflac_assert(bs != NULL); + drflac_assert(count > 0); + drflac_assert(pSamplesOut != NULL); + + for (drflac_uint32 i = 0; i < count; ++i) { + drflac_uint32 zeroCounter = 0; + for (;;) { + drflac_uint8 bit; + if (!drflac__read_uint8(bs, 1, &bit)) { + return DRFLAC_FALSE; + } + + if (bit == 0) { + zeroCounter += 1; + } else { + break; + } + } + + drflac_uint32 decodedRice; + if (riceParam > 0) { + if (!drflac__read_uint32(bs, riceParam, &decodedRice)) { + return DRFLAC_FALSE; + } + } else { + decodedRice = 0; + } + + decodedRice |= (zeroCounter << riceParam); + if ((decodedRice & 0x01)) { + decodedRice = ~(decodedRice >> 1); + } else { + decodedRice = (decodedRice >> 1); + } + + + if (bitsPerSample > 16) { + pSamplesOut[i] = decodedRice + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + i); + } else { + pSamplesOut[i] = decodedRice + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + i); + } + } + + return DRFLAC_TRUE; +} +#endif + +#if 0 +static drflac_bool32 drflac__read_rice_parts__reference(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) +{ + drflac_uint32 zeroCounter = 0; + for (;;) { + drflac_uint8 bit; + if (!drflac__read_uint8(bs, 1, &bit)) { + return DRFLAC_FALSE; + } + + if (bit == 0) { + zeroCounter += 1; + } else { + break; + } + } + + drflac_uint32 decodedRice; + if (riceParam > 0) { + if (!drflac__read_uint32(bs, riceParam, &decodedRice)) { + return DRFLAC_FALSE; + } + } else { + decodedRice = 0; + } + + *pZeroCounterOut = zeroCounter; + *pRiceParamPartOut = decodedRice; + return DRFLAC_TRUE; +} +#endif + +#if 0 +static DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) +{ + drflac_assert(riceParam > 0); // <-- riceParam should never be 0. drflac__read_rice_parts__param_equals_zero() should be used instead for this case. + + drflac_cache_t riceParamMask = DRFLAC_CACHE_L1_SELECTION_MASK(riceParam); + + drflac_uint32 zeroCounter = 0; + while (bs->cache == 0) { + zeroCounter += (drflac_uint32)DRFLAC_CACHE_L1_BITS_REMAINING(bs); + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + } + + drflac_uint32 setBitOffsetPlus1 = drflac__clz(bs->cache); + zeroCounter += setBitOffsetPlus1; + setBitOffsetPlus1 += 1; + + + drflac_uint32 riceParamPart; + drflac_uint32 riceLength = setBitOffsetPlus1 + riceParam; + if (riceLength < DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { + riceParamPart = (drflac_uint32)((bs->cache & (riceParamMask >> setBitOffsetPlus1)) >> DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceLength)); + + bs->consumedBits += riceLength; + bs->cache <<= riceLength; + } else { + bs->consumedBits += riceLength; + bs->cache <<= setBitOffsetPlus1 & (DRFLAC_CACHE_L1_SIZE_BITS(bs)-1); // <-- Equivalent to "if (setBitOffsetPlus1 < DRFLAC_CACHE_L1_SIZE_BITS(bs)) { bs->cache <<= setBitOffsetPlus1; }" + + // It straddles the cached data. It will never cover more than the next chunk. We just read the number in two parts and combine them. + drflac_uint32 bitCountLo = bs->consumedBits - DRFLAC_CACHE_L1_SIZE_BITS(bs); + drflac_cache_t resultHi = DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, riceParam); // <-- Use DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE() if ever this function allows riceParam=0. + + if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { +#ifndef DR_FLAC_NO_CRC + drflac__update_crc16(bs); +#endif + bs->cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); + bs->consumedBits = 0; +#ifndef DR_FLAC_NO_CRC + bs->crc16Cache = bs->cache; +#endif + } else { + // Slow path. We need to fetch more data from the client. + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + } + + riceParamPart = (drflac_uint32)(resultHi | DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE(bs, bitCountLo)); + + bs->consumedBits += bitCountLo; + bs->cache <<= bitCountLo; + } + + pZeroCounterOut[0] = zeroCounter; + pRiceParamPartOut[0] = riceParamPart; + + return DRFLAC_TRUE; +} +#endif + +static DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts_x1(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) +{ + drflac_uint32 riceParamPlus1 = riceParam + 1; + //drflac_cache_t riceParamPlus1Mask = DRFLAC_CACHE_L1_SELECTION_MASK(riceParamPlus1); + drflac_uint32 riceParamPlus1Shift = DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPlus1); + drflac_uint32 riceParamPlus1MaxConsumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1; + + // The idea here is to use local variables for the cache in an attempt to encourage the compiler to store them in registers. I have + // no idea how this will work in practice... + drflac_cache_t bs_cache = bs->cache; + drflac_uint32 bs_consumedBits = bs->consumedBits; + + // The first thing to do is find the first unset bit. Most likely a bit will be set in the current cache line. + drflac_uint32 lzcount = drflac__clz(bs_cache); + if (lzcount < sizeof(bs_cache)*8) { + pZeroCounterOut[0] = lzcount; + + // It is most likely that the riceParam part (which comes after the zero counter) is also on this cache line. When extracting + // this, we include the set bit from the unary coded part because it simplifies cache management. This bit will be handled + // outside of this function at a higher level. + extract_rice_param_part: + bs_cache <<= lzcount; + bs_consumedBits += lzcount; + + if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) { + // Getting here means the rice parameter part is wholly contained within the current cache line. + pRiceParamPartOut[0] = (drflac_uint32)(bs_cache >> riceParamPlus1Shift); + bs_cache <<= riceParamPlus1; + bs_consumedBits += riceParamPlus1; + } else { + // Getting here means the rice parameter part straddles the cache line. We need to read from the tail of the current cache + // line, reload the cache, and then combine it with the head of the next cache line. + + // Grab the high part of the rice parameter part. + drflac_uint32 riceParamPartHi = (drflac_uint32)(bs_cache >> riceParamPlus1Shift); + + // Before reloading the cache we need to grab the size in bits of the low part. + drflac_uint32 riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits; + drflac_assert(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32); + + // Now reload the cache. + if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { + #ifndef DR_FLAC_NO_CRC + drflac__update_crc16(bs); + #endif + bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); + bs_consumedBits = riceParamPartLoBitCount; + #ifndef DR_FLAC_NO_CRC + bs->crc16Cache = bs_cache; + #endif + } else { + // Slow path. We need to fetch more data from the client. + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + + bs_cache = bs->cache; + bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount; + } + + // We should now have enough information to construct the rice parameter part. + drflac_uint32 riceParamPartLo = (drflac_uint32)(bs_cache >> (DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPartLoBitCount))); + pRiceParamPartOut[0] = riceParamPartHi | riceParamPartLo; + + bs_cache <<= riceParamPartLoBitCount; + } + } else { + // Getting here means there are no bits set on the cache line. This is a less optimal case because we just wasted a call + // to drflac__clz() and we need to reload the cache. + drflac_uint32 zeroCounter = (drflac_uint32)(DRFLAC_CACHE_L1_SIZE_BITS(bs) - bs_consumedBits); + for (;;) { + if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { + #ifndef DR_FLAC_NO_CRC + drflac__update_crc16(bs); + #endif + bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); + bs_consumedBits = 0; + #ifndef DR_FLAC_NO_CRC + bs->crc16Cache = bs_cache; + #endif + } else { + // Slow path. We need to fetch more data from the client. + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + + bs_cache = bs->cache; + bs_consumedBits = bs->consumedBits; + } + + lzcount = drflac__clz(bs_cache); + zeroCounter += lzcount; + + if (lzcount < sizeof(bs_cache)*8) { + break; + } + } + + pZeroCounterOut[0] = zeroCounter; + goto extract_rice_param_part; + } + + // Make sure the cache is restored at the end of it all. + bs->cache = bs_cache; + bs->consumedBits = bs_consumedBits; + + return DRFLAC_TRUE; +} + +static DRFLAC_INLINE drflac_bool32 drflac__read_rice_parts_x4(drflac_bs* bs, drflac_uint8 riceParam, drflac_uint32* pZeroCounterOut, drflac_uint32* pRiceParamPartOut) +{ + drflac_uint32 riceParamPlus1 = riceParam + 1; + //drflac_cache_t riceParamPlus1Mask = DRFLAC_CACHE_L1_SELECTION_MASK(riceParamPlus1); + drflac_uint32 riceParamPlus1Shift = DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPlus1); + drflac_uint32 riceParamPlus1MaxConsumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1; + + // The idea here is to use local variables for the cache in an attempt to encourage the compiler to store them in registers. I have + // no idea how this will work in practice... + drflac_cache_t bs_cache = bs->cache; + drflac_uint32 bs_consumedBits = bs->consumedBits; + + // What this is doing is trying to efficiently extract 4 rice parts at a time, the idea being that we can exploit certain properties + // to our advantage to make things more efficient. + for (int i = 0; i < 4; ++i) { + // The first thing to do is find the first unset bit. Most likely a bit will be set in the current cache line. + drflac_uint32 lzcount = drflac__clz(bs_cache); + if (lzcount < sizeof(bs_cache)*8) { + pZeroCounterOut[i] = lzcount; + + // It is most likely that the riceParam part (which comes after the zero counter) is also on this cache line. When extracting + // this, we include the set bit from the unary coded part because it simplifies cache management. This bit will be handled + // outside of this function at a higher level. + extract_rice_param_part: + bs_cache <<= lzcount; + bs_consumedBits += lzcount; + + if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) { + // Getting here means the rice parameter part is wholly contained within the current cache line. + pRiceParamPartOut[i] = (drflac_uint32)(bs_cache >> riceParamPlus1Shift); + bs_cache <<= riceParamPlus1; + bs_consumedBits += riceParamPlus1; + } else { + // Getting here means the rice parameter part straddles the cache line. We need to read from the tail of the current cache + // line, reload the cache, and then combine it with the head of the next cache line. + + // Grab the high part of the rice parameter part. + drflac_uint32 riceParamPartHi = (drflac_uint32)(bs_cache >> riceParamPlus1Shift); + + // Before reloading the cache we need to grab the size in bits of the low part. + drflac_uint32 riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits; + + // Now reload the cache. + if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { + #ifndef DR_FLAC_NO_CRC + drflac__update_crc16(bs); + #endif + bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); + bs_consumedBits = riceParamPartLoBitCount; + #ifndef DR_FLAC_NO_CRC + bs->crc16Cache = bs_cache; + #endif + } else { + // Slow path. We need to fetch more data from the client. + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + + bs_cache = bs->cache; + bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount; + } + + // We should now have enough information to construct the rice parameter part. + drflac_uint32 riceParamPartLo = (drflac_uint32)(bs_cache >> (DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPartLoBitCount))); + pRiceParamPartOut[i] = riceParamPartHi | riceParamPartLo; + + bs_cache <<= riceParamPartLoBitCount; + } + } else { + // Getting here means there are no bits set on the cache line. This is a less optimal case because we just wasted a call + // to drflac__clz() and we need to reload the cache. + drflac_uint32 zeroCounter = (drflac_uint32)(DRFLAC_CACHE_L1_SIZE_BITS(bs) - bs_consumedBits); + for (;;) { + if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { + #ifndef DR_FLAC_NO_CRC + drflac__update_crc16(bs); + #endif + bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); + bs_consumedBits = 0; + #ifndef DR_FLAC_NO_CRC + bs->crc16Cache = bs_cache; + #endif + } else { + // Slow path. We need to fetch more data from the client. + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + + bs_cache = bs->cache; + bs_consumedBits = bs->consumedBits; + } + + lzcount = drflac__clz(bs_cache); + zeroCounter += lzcount; + + if (lzcount < sizeof(bs_cache)*8) { + break; + } + } + + pZeroCounterOut[i] = zeroCounter; + goto extract_rice_param_part; + } + } + + // Make sure the cache is restored at the end of it all. + bs->cache = bs_cache; + bs->consumedBits = bs_consumedBits; + + return DRFLAC_TRUE; +} + +static DRFLAC_INLINE drflac_bool32 drflac__seek_rice_parts(drflac_bs* bs, drflac_uint8 riceParam) +{ + drflac_uint32 riceParamPlus1 = riceParam + 1; + drflac_uint32 riceParamPlus1MaxConsumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1; + + // The idea here is to use local variables for the cache in an attempt to encourage the compiler to store them in registers. I have + // no idea how this will work in practice... + drflac_cache_t bs_cache = bs->cache; + drflac_uint32 bs_consumedBits = bs->consumedBits; + + // The first thing to do is find the first unset bit. Most likely a bit will be set in the current cache line. + drflac_uint32 lzcount = drflac__clz(bs_cache); + if (lzcount < sizeof(bs_cache)*8) { + // It is most likely that the riceParam part (which comes after the zero counter) is also on this cache line. When extracting + // this, we include the set bit from the unary coded part because it simplifies cache management. This bit will be handled + // outside of this function at a higher level. + extract_rice_param_part: + bs_cache <<= lzcount; + bs_consumedBits += lzcount; + + if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) { + // Getting here means the rice parameter part is wholly contained within the current cache line. + bs_cache <<= riceParamPlus1; + bs_consumedBits += riceParamPlus1; + } else { + // Getting here means the rice parameter part straddles the cache line. We need to read from the tail of the current cache + // line, reload the cache, and then combine it with the head of the next cache line. + + // Before reloading the cache we need to grab the size in bits of the low part. + drflac_uint32 riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits; + drflac_assert(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32); + + // Now reload the cache. + if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { + #ifndef DR_FLAC_NO_CRC + drflac__update_crc16(bs); + #endif + bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); + bs_consumedBits = riceParamPartLoBitCount; + #ifndef DR_FLAC_NO_CRC + bs->crc16Cache = bs_cache; + #endif + } else { + // Slow path. We need to fetch more data from the client. + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + + bs_cache = bs->cache; + bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount; + } + + bs_cache <<= riceParamPartLoBitCount; + } + } else { + // Getting here means there are no bits set on the cache line. This is a less optimal case because we just wasted a call + // to drflac__clz() and we need to reload the cache. + for (;;) { + if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { + #ifndef DR_FLAC_NO_CRC + drflac__update_crc16(bs); + #endif + bs_cache = drflac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]); + bs_consumedBits = 0; + #ifndef DR_FLAC_NO_CRC + bs->crc16Cache = bs_cache; + #endif + } else { + // Slow path. We need to fetch more data from the client. + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + + bs_cache = bs->cache; + bs_consumedBits = bs->consumedBits; + } + + lzcount = drflac__clz(bs_cache); + if (lzcount < sizeof(bs_cache)*8) { + break; + } + } + + goto extract_rice_param_part; + } + + // Make sure the cache is restored at the end of it all. + bs->cache = bs_cache; + bs->consumedBits = bs_consumedBits; + + return DRFLAC_TRUE; +} + + +static drflac_bool32 drflac__decode_samples_with_residual__rice__scalar(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +{ + drflac_assert(bs != NULL); + drflac_assert(count > 0); + drflac_assert(pSamplesOut != NULL); + + drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; + + drflac_uint32 zeroCountPart0; + drflac_uint32 zeroCountPart1; + drflac_uint32 zeroCountPart2; + drflac_uint32 zeroCountPart3; + drflac_uint32 riceParamPart0; + drflac_uint32 riceParamPart1; + drflac_uint32 riceParamPart2; + drflac_uint32 riceParamPart3; + drflac_uint32 riceParamMask = ~((~0UL) << riceParam); + const drflac_int32* pSamplesOutEnd = pSamplesOut + ((count >> 2) << 2); + + if (bitsPerSample >= 24) { + while (pSamplesOut < pSamplesOutEnd) { + // Rice extraction. It's faster to do this one at a time against local variables than it is to use the x4 version + // against an array. Not sure why, but perhaps it's making more efficient use of registers? + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart1, &riceParamPart1) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart2, &riceParamPart2) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart3, &riceParamPart3)) { + return DRFLAC_FALSE; + } + + riceParamPart0 &= riceParamMask; + riceParamPart1 &= riceParamMask; + riceParamPart2 &= riceParamMask; + riceParamPart3 &= riceParamMask; + + riceParamPart0 |= (zeroCountPart0 << riceParam); + riceParamPart1 |= (zeroCountPart1 << riceParam); + riceParamPart2 |= (zeroCountPart2 << riceParam); + riceParamPart3 |= (zeroCountPart3 << riceParam); + + riceParamPart0 = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01]; + riceParamPart1 = (riceParamPart1 >> 1) ^ t[riceParamPart1 & 0x01]; + riceParamPart2 = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01]; + riceParamPart3 = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01]; + + pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 0); + pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 1); + pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 2); + pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 3); + + pSamplesOut += 4; + } + } else { + while (pSamplesOut < pSamplesOutEnd) { + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart1, &riceParamPart1) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart2, &riceParamPart2) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart3, &riceParamPart3)) { + return DRFLAC_FALSE; + } + + riceParamPart0 &= riceParamMask; + riceParamPart1 &= riceParamMask; + riceParamPart2 &= riceParamMask; + riceParamPart3 &= riceParamMask; + + riceParamPart0 |= (zeroCountPart0 << riceParam); + riceParamPart1 |= (zeroCountPart1 << riceParam); + riceParamPart2 |= (zeroCountPart2 << riceParam); + riceParamPart3 |= (zeroCountPart3 << riceParam); + + riceParamPart0 = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01]; + riceParamPart1 = (riceParamPart1 >> 1) ^ t[riceParamPart1 & 0x01]; + riceParamPart2 = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01]; + riceParamPart3 = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01]; + + pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 0); + pSamplesOut[1] = riceParamPart1 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 1); + pSamplesOut[2] = riceParamPart2 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 2); + pSamplesOut[3] = riceParamPart3 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 3); + + pSamplesOut += 4; + } + } + + + + drflac_uint32 i = ((count >> 2) << 2); + while (i < count) { + // Rice extraction. + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0)) { + return DRFLAC_FALSE; + } + + // Rice reconstruction. + riceParamPart0 &= riceParamMask; + riceParamPart0 |= (zeroCountPart0 << riceParam); + riceParamPart0 = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01]; + //riceParamPart0 = (riceParamPart0 >> 1) ^ (~(riceParamPart0 & 0x01) + 1); + + // Sample reconstruction. + if (bitsPerSample >= 24) { + pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 0); + } else { + pSamplesOut[0] = riceParamPart0 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 0); + } + + i += 1; + pSamplesOut += 1; + } + + return DRFLAC_TRUE; +} + +#if defined(DRFLAC_SUPPORT_SSE41) +static drflac_bool32 drflac__decode_samples_with_residual__rice__sse41(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +{ + drflac_assert(bs != NULL); + drflac_assert(count > 0); + drflac_assert(pSamplesOut != NULL); + + static drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; + + //drflac_uint32 zeroCountParts[4]; + //drflac_uint32 riceParamParts[4]; + + drflac_uint32 zeroCountParts0; + drflac_uint32 zeroCountParts1; + drflac_uint32 zeroCountParts2; + drflac_uint32 zeroCountParts3; + drflac_uint32 riceParamParts0; + drflac_uint32 riceParamParts1; + drflac_uint32 riceParamParts2; + drflac_uint32 riceParamParts3; + + drflac_uint32 riceParamMask = ~((~0UL) << riceParam); + __m128i riceParamMask128 = _mm_set1_epi32(riceParamMask); + __m128i one = _mm_set1_epi32(0x01); + + const drflac_int32* pSamplesOutEnd = pSamplesOut + ((count >> 2) << 2); + + if (bitsPerSample >= 24) { + while (pSamplesOut < pSamplesOutEnd) { + // Rice extraction. + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts1, &riceParamParts1) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts2, &riceParamParts2) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts3, &riceParamParts3)) { + return DRFLAC_FALSE; + } + + __m128i zeroCountPart128 = _mm_set_epi32(zeroCountParts3, zeroCountParts2, zeroCountParts1, zeroCountParts0); + __m128i riceParamPart128 = _mm_set_epi32(riceParamParts3, riceParamParts2, riceParamParts1, riceParamParts0); + + riceParamPart128 = _mm_and_si128(riceParamPart128, riceParamMask128); + riceParamPart128 = _mm_or_si128(riceParamPart128, _mm_slli_epi32(zeroCountPart128, riceParam)); + riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_mullo_epi32(_mm_and_si128(riceParamPart128, one), _mm_set1_epi32(0xFFFFFFFF))); // <-- Only supported from SSE4.1 + //riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_add_epi32(drflac__mm_not_si128(_mm_and_si128(riceParamPart128, one)), one)); // <-- SSE2 compatible + + drflac_uint32 riceParamParts[4]; + _mm_storeu_si128((__m128i*)riceParamParts, riceParamPart128); + + #if defined(DRFLAC_64BIT) + // The scalar implementation seems to be faster on 64-bit in my testing. + drflac__calculate_prediction_64_x4(order, shift, coefficients, riceParamParts, pSamplesOut); + #else + pSamplesOut[0] = riceParamParts[0] + drflac__calculate_prediction_64__sse41(order, shift, coefficients, pSamplesOut + 0); + pSamplesOut[1] = riceParamParts[1] + drflac__calculate_prediction_64__sse41(order, shift, coefficients, pSamplesOut + 1); + pSamplesOut[2] = riceParamParts[2] + drflac__calculate_prediction_64__sse41(order, shift, coefficients, pSamplesOut + 2); + pSamplesOut[3] = riceParamParts[3] + drflac__calculate_prediction_64__sse41(order, shift, coefficients, pSamplesOut + 3); + #endif + + pSamplesOut += 4; + } + } else { + drflac_int32 coefficientsUnaligned[32*4 + 4] = {0}; + drflac_int32* coefficients128 = (drflac_int32*)(((size_t)coefficientsUnaligned + 15) & ~15); + for (drflac_uint32 i = 0; i < order; ++i) { + coefficients128[i*4+0] = coefficients[i]; + coefficients128[i*4+1] = coefficients[i]; + coefficients128[i*4+2] = coefficients[i]; + coefficients128[i*4+3] = coefficients[i]; + } + + while (pSamplesOut < pSamplesOutEnd) { + // Rice extraction. +#if 1 + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts1, &riceParamParts1) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts2, &riceParamParts2) || + !drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts3, &riceParamParts3)) { + return DRFLAC_FALSE; + } + + __m128i zeroCountPart128 = _mm_set_epi32(zeroCountParts3, zeroCountParts2, zeroCountParts1, zeroCountParts0); + __m128i riceParamPart128 = _mm_set_epi32(riceParamParts3, riceParamParts2, riceParamParts1, riceParamParts0); +#else + if (!drflac__read_rice_parts_x4(bs, riceParam, zeroCountParts, riceParamParts)) { + return DRFLAC_FALSE; + } + + __m128i zeroCountPart128 = _mm_set_epi32(zeroCountParts[3], zeroCountParts[2], zeroCountParts[1], zeroCountParts[0]); + __m128i riceParamPart128 = _mm_set_epi32(riceParamParts[3], riceParamParts[2], riceParamParts[1], riceParamParts[0]); +#endif + + riceParamPart128 = _mm_and_si128(riceParamPart128, riceParamMask128); + riceParamPart128 = _mm_or_si128(riceParamPart128, _mm_slli_epi32(zeroCountPart128, riceParam)); + riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_mullo_epi32(_mm_and_si128(riceParamPart128, one), _mm_set1_epi32(0xFFFFFFFF))); + +#if 1 + drflac__calculate_prediction_32_x4__sse41(order, shift, (const __m128i*)coefficients128, riceParamPart128, pSamplesOut); +#else + drflac_int32 riceParamParts[4]; + _mm_storeu_si128((__m128i*)riceParamParts, riceParamPart128); + + pSamplesOut[0] = riceParamParts[0] + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 0); + pSamplesOut[1] = riceParamParts[1] + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 1); + pSamplesOut[2] = riceParamParts[2] + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 2); + pSamplesOut[3] = riceParamParts[3] + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 3); +#endif + + pSamplesOut += 4; + } + } + + + drflac_uint32 i = ((count >> 2) << 2); + while (i < count) { + // Rice extraction. + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0)) { + return DRFLAC_FALSE; + } + + // Rice reconstruction. + riceParamParts0 &= riceParamMask; + riceParamParts0 |= (zeroCountParts0 << riceParam); + riceParamParts0 = (riceParamParts0 >> 1) ^ t[riceParamParts0 & 0x01]; + + // Sample reconstruction. + if (bitsPerSample >= 24) { + pSamplesOut[0] = riceParamParts0 + drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + 0); + } else { + pSamplesOut[0] = riceParamParts0 + drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + 0); + } + + i += 1; + pSamplesOut += 1; + } + + return DRFLAC_TRUE; +} +#endif + +static drflac_bool32 drflac__decode_samples_with_residual__rice(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 riceParam, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +{ +#if defined(DRFLAC_SUPPORT_SSE41) + if (drflac__gIsSSE41Supported) { + return drflac__decode_samples_with_residual__rice__sse41(bs, bitsPerSample, count, riceParam, order, shift, coefficients, pSamplesOut); + } else +#endif + { + // Scalar fallback. + #if 0 + return drflac__decode_samples_with_residual__rice__reference(bs, bitsPerSample, count, riceParam, order, shift, coefficients, pSamplesOut); + #else + return drflac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, order, shift, coefficients, pSamplesOut); + #endif + } +} + +// Reads and seeks past a string of residual values as Rice codes. The decoder should be sitting on the first bit of the Rice codes. +static drflac_bool32 drflac__read_and_seek_residual__rice(drflac_bs* bs, drflac_uint32 count, drflac_uint8 riceParam) +{ + drflac_assert(bs != NULL); + drflac_assert(count > 0); + + for (drflac_uint32 i = 0; i < count; ++i) { + if (!drflac__seek_rice_parts(bs, riceParam)) { + return DRFLAC_FALSE; + } + } + + return DRFLAC_TRUE; +} + +static drflac_bool32 drflac__decode_samples_with_residual__unencoded(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 count, drflac_uint8 unencodedBitsPerSample, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pSamplesOut) +{ + drflac_assert(bs != NULL); + drflac_assert(count > 0); + drflac_assert(unencodedBitsPerSample <= 31); // <-- unencodedBitsPerSample is a 5 bit number, so cannot exceed 31. + drflac_assert(pSamplesOut != NULL); + + for (unsigned int i = 0; i < count; ++i) { + if (unencodedBitsPerSample > 0) { + if (!drflac__read_int32(bs, unencodedBitsPerSample, pSamplesOut + i)) { + return DRFLAC_FALSE; + } + } else { + pSamplesOut[i] = 0; + } + + if (bitsPerSample > 16) { + pSamplesOut[i] += drflac__calculate_prediction_64(order, shift, coefficients, pSamplesOut + i); + } else { + pSamplesOut[i] += drflac__calculate_prediction_32(order, shift, coefficients, pSamplesOut + i); + } + } + + return DRFLAC_TRUE; +} + + +// Reads and decodes the residual for the sub-frame the decoder is currently sitting on. This function should be called +// when the decoder is sitting at the very start of the RESIDUAL block. The first residuals will be ignored. The +// and parameters are used to determine how many residual values need to be decoded. +static drflac_bool32 drflac__decode_samples_with_residual(drflac_bs* bs, drflac_uint32 bitsPerSample, drflac_uint32 blockSize, drflac_uint32 order, drflac_int32 shift, const drflac_int32* coefficients, drflac_int32* pDecodedSamples) +{ + drflac_assert(bs != NULL); + drflac_assert(blockSize != 0); + drflac_assert(pDecodedSamples != NULL); // <-- Should we allow NULL, in which case we just seek past the residual rather than do a full decode? + + drflac_uint8 residualMethod; + if (!drflac__read_uint8(bs, 2, &residualMethod)) { + return DRFLAC_FALSE; + } + + if (residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) { + return DRFLAC_FALSE; // Unknown or unsupported residual coding method. + } + + // Ignore the first values. + pDecodedSamples += order; + + + drflac_uint8 partitionOrder; + if (!drflac__read_uint8(bs, 4, &partitionOrder)) { + return DRFLAC_FALSE; + } + + // From the FLAC spec: + // The Rice partition order in a Rice-coded residual section must be less than or equal to 8. + if (partitionOrder > 8) { + return DRFLAC_FALSE; + } + + // Validation check. + if ((blockSize / (1 << partitionOrder)) <= order) { + return DRFLAC_FALSE; + } + + drflac_uint32 samplesInPartition = (blockSize / (1 << partitionOrder)) - order; + drflac_uint32 partitionsRemaining = (1 << partitionOrder); + for (;;) { + drflac_uint8 riceParam = 0; + if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) { + if (!drflac__read_uint8(bs, 4, &riceParam)) { + return DRFLAC_FALSE; + } + if (riceParam == 15) { + riceParam = 0xFF; + } + } else if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) { + if (!drflac__read_uint8(bs, 5, &riceParam)) { + return DRFLAC_FALSE; + } + if (riceParam == 31) { + riceParam = 0xFF; + } + } + + if (riceParam != 0xFF) { + if (!drflac__decode_samples_with_residual__rice(bs, bitsPerSample, samplesInPartition, riceParam, order, shift, coefficients, pDecodedSamples)) { + return DRFLAC_FALSE; + } + } else { + unsigned char unencodedBitsPerSample = 0; + if (!drflac__read_uint8(bs, 5, &unencodedBitsPerSample)) { + return DRFLAC_FALSE; + } + + if (!drflac__decode_samples_with_residual__unencoded(bs, bitsPerSample, samplesInPartition, unencodedBitsPerSample, order, shift, coefficients, pDecodedSamples)) { + return DRFLAC_FALSE; + } + } + + pDecodedSamples += samplesInPartition; + + + if (partitionsRemaining == 1) { + break; + } + + partitionsRemaining -= 1; + + if (partitionOrder != 0) { + samplesInPartition = blockSize / (1 << partitionOrder); + } + } + + return DRFLAC_TRUE; +} + +// Reads and seeks past the residual for the sub-frame the decoder is currently sitting on. This function should be called +// when the decoder is sitting at the very start of the RESIDUAL block. The first residuals will be set to 0. The +// and parameters are used to determine how many residual values need to be decoded. +static drflac_bool32 drflac__read_and_seek_residual(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 order) +{ + drflac_assert(bs != NULL); + drflac_assert(blockSize != 0); + + drflac_uint8 residualMethod; + if (!drflac__read_uint8(bs, 2, &residualMethod)) { + return DRFLAC_FALSE; + } + + if (residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) { + return DRFLAC_FALSE; // Unknown or unsupported residual coding method. + } + + drflac_uint8 partitionOrder; + if (!drflac__read_uint8(bs, 4, &partitionOrder)) { + return DRFLAC_FALSE; + } + + // From the FLAC spec: + // The Rice partition order in a Rice-coded residual section must be less than or equal to 8. + if (partitionOrder > 8) { + return DRFLAC_FALSE; + } + + // Validation check. + if ((blockSize / (1 << partitionOrder)) <= order) { + return DRFLAC_FALSE; + } + + drflac_uint32 samplesInPartition = (blockSize / (1 << partitionOrder)) - order; + drflac_uint32 partitionsRemaining = (1 << partitionOrder); + for (;;) + { + drflac_uint8 riceParam = 0; + if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) { + if (!drflac__read_uint8(bs, 4, &riceParam)) { + return DRFLAC_FALSE; + } + if (riceParam == 15) { + riceParam = 0xFF; + } + } else if (residualMethod == DRFLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) { + if (!drflac__read_uint8(bs, 5, &riceParam)) { + return DRFLAC_FALSE; + } + if (riceParam == 31) { + riceParam = 0xFF; + } + } + + if (riceParam != 0xFF) { + if (!drflac__read_and_seek_residual__rice(bs, samplesInPartition, riceParam)) { + return DRFLAC_FALSE; + } + } else { + unsigned char unencodedBitsPerSample = 0; + if (!drflac__read_uint8(bs, 5, &unencodedBitsPerSample)) { + return DRFLAC_FALSE; + } + + if (!drflac__seek_bits(bs, unencodedBitsPerSample * samplesInPartition)) { + return DRFLAC_FALSE; + } + } + + + if (partitionsRemaining == 1) { + break; + } + + partitionsRemaining -= 1; + samplesInPartition = blockSize / (1 << partitionOrder); + } + + return DRFLAC_TRUE; +} + + +static drflac_bool32 drflac__decode_samples__constant(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 bitsPerSample, drflac_int32* pDecodedSamples) +{ + // Only a single sample needs to be decoded here. + drflac_int32 sample; + if (!drflac__read_int32(bs, bitsPerSample, &sample)) { + return DRFLAC_FALSE; + } + + // We don't really need to expand this, but it does simplify the process of reading samples. If this becomes a performance issue (unlikely) + // we'll want to look at a more efficient way. + for (drflac_uint32 i = 0; i < blockSize; ++i) { + pDecodedSamples[i] = sample; + } + + return DRFLAC_TRUE; +} + +static drflac_bool32 drflac__decode_samples__verbatim(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 bitsPerSample, drflac_int32* pDecodedSamples) +{ + for (drflac_uint32 i = 0; i < blockSize; ++i) { + drflac_int32 sample; + if (!drflac__read_int32(bs, bitsPerSample, &sample)) { + return DRFLAC_FALSE; + } + + pDecodedSamples[i] = sample; + } + + return DRFLAC_TRUE; +} + +static drflac_bool32 drflac__decode_samples__fixed(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 bitsPerSample, drflac_uint8 lpcOrder, drflac_int32* pDecodedSamples) +{ + static drflac_int32 lpcCoefficientsTable[5][4] = { + {0, 0, 0, 0}, + {1, 0, 0, 0}, + {2, -1, 0, 0}, + {3, -3, 1, 0}, + {4, -6, 4, -1} + }; + + // Warm up samples and coefficients. + for (drflac_uint32 i = 0; i < lpcOrder; ++i) { + drflac_int32 sample; + if (!drflac__read_int32(bs, bitsPerSample, &sample)) { + return DRFLAC_FALSE; + } + + pDecodedSamples[i] = sample; + } + + + if (!drflac__decode_samples_with_residual(bs, bitsPerSample, blockSize, lpcOrder, 0, lpcCoefficientsTable[lpcOrder], pDecodedSamples)) { + return DRFLAC_FALSE; + } + + return DRFLAC_TRUE; +} + +static drflac_bool32 drflac__decode_samples__lpc(drflac_bs* bs, drflac_uint32 blockSize, drflac_uint32 bitsPerSample, drflac_uint8 lpcOrder, drflac_int32* pDecodedSamples) +{ + drflac_uint8 i; + + // Warm up samples. + for (i = 0; i < lpcOrder; ++i) { + drflac_int32 sample; + if (!drflac__read_int32(bs, bitsPerSample, &sample)) { + return DRFLAC_FALSE; + } + + pDecodedSamples[i] = sample; + } + + drflac_uint8 lpcPrecision; + if (!drflac__read_uint8(bs, 4, &lpcPrecision)) { + return DRFLAC_FALSE; + } + if (lpcPrecision == 15) { + return DRFLAC_FALSE; // Invalid. + } + lpcPrecision += 1; + + + drflac_int8 lpcShift; + if (!drflac__read_int8(bs, 5, &lpcShift)) { + return DRFLAC_FALSE; + } + + + drflac_int32 coefficients[32]; + drflac_zero_memory(coefficients, sizeof(coefficients)); + for (i = 0; i < lpcOrder; ++i) { + if (!drflac__read_int32(bs, lpcPrecision, coefficients + i)) { + return DRFLAC_FALSE; + } + } + + if (!drflac__decode_samples_with_residual(bs, bitsPerSample, blockSize, lpcOrder, lpcShift, coefficients, pDecodedSamples)) { + return DRFLAC_FALSE; + } + + return DRFLAC_TRUE; +} + + +static drflac_bool32 drflac__read_next_flac_frame_header(drflac_bs* bs, drflac_uint8 streaminfoBitsPerSample, drflac_frame_header* header) +{ + drflac_assert(bs != NULL); + drflac_assert(header != NULL); + + const drflac_uint32 sampleRateTable[12] = {0, 88200, 176400, 192000, 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000}; + const drflac_uint8 bitsPerSampleTable[8] = {0, 8, 12, (drflac_uint8)-1, 16, 20, 24, (drflac_uint8)-1}; // -1 = reserved. + + // Keep looping until we find a valid sync code. + for (;;) { + if (!drflac__find_and_seek_to_next_sync_code(bs)) { + return DRFLAC_FALSE; + } + + drflac_uint8 crc8 = 0xCE; // 0xCE = drflac_crc8(0, 0x3FFE, 14); + + drflac_uint8 reserved = 0; + if (!drflac__read_uint8(bs, 1, &reserved)) { + return DRFLAC_FALSE; + } + if (reserved == 1) { + continue; + } + crc8 = drflac_crc8(crc8, reserved, 1); + + + drflac_uint8 blockingStrategy = 0; + if (!drflac__read_uint8(bs, 1, &blockingStrategy)) { + return DRFLAC_FALSE; + } + crc8 = drflac_crc8(crc8, blockingStrategy, 1); + + + drflac_uint8 blockSize = 0; + if (!drflac__read_uint8(bs, 4, &blockSize)) { + return DRFLAC_FALSE; + } + if (blockSize == 0) { + continue; + } + crc8 = drflac_crc8(crc8, blockSize, 4); + + + drflac_uint8 sampleRate = 0; + if (!drflac__read_uint8(bs, 4, &sampleRate)) { + return DRFLAC_FALSE; + } + crc8 = drflac_crc8(crc8, sampleRate, 4); + + + drflac_uint8 channelAssignment = 0; + if (!drflac__read_uint8(bs, 4, &channelAssignment)) { + return DRFLAC_FALSE; + } + if (channelAssignment > 10) { + continue; + } + crc8 = drflac_crc8(crc8, channelAssignment, 4); + + + drflac_uint8 bitsPerSample = 0; + if (!drflac__read_uint8(bs, 3, &bitsPerSample)) { + return DRFLAC_FALSE; + } + if (bitsPerSample == 3 || bitsPerSample == 7) { + continue; + } + crc8 = drflac_crc8(crc8, bitsPerSample, 3); + + + if (!drflac__read_uint8(bs, 1, &reserved)) { + return DRFLAC_FALSE; + } + if (reserved == 1) { + continue; + } + crc8 = drflac_crc8(crc8, reserved, 1); + + + drflac_bool32 isVariableBlockSize = blockingStrategy == 1; + if (isVariableBlockSize) { + drflac_uint64 sampleNumber; + drflac_result result = drflac__read_utf8_coded_number(bs, &sampleNumber, &crc8); + if (result != DRFLAC_SUCCESS) { + if (result == DRFLAC_END_OF_STREAM) { + return DRFLAC_FALSE; + } else { + continue; + } + } + header->frameNumber = 0; + header->sampleNumber = sampleNumber; + } else { + drflac_uint64 frameNumber = 0; + drflac_result result = drflac__read_utf8_coded_number(bs, &frameNumber, &crc8); + if (result != DRFLAC_SUCCESS) { + if (result == DRFLAC_END_OF_STREAM) { + return DRFLAC_FALSE; + } else { + continue; + } + } + header->frameNumber = (drflac_uint32)frameNumber; // <-- Safe cast. + header->sampleNumber = 0; + } + + + if (blockSize == 1) { + header->blockSize = 192; + } else if (blockSize >= 2 && blockSize <= 5) { + header->blockSize = 576 * (1 << (blockSize - 2)); + } else if (blockSize == 6) { + if (!drflac__read_uint16(bs, 8, &header->blockSize)) { + return DRFLAC_FALSE; + } + crc8 = drflac_crc8(crc8, header->blockSize, 8); + header->blockSize += 1; + } else if (blockSize == 7) { + if (!drflac__read_uint16(bs, 16, &header->blockSize)) { + return DRFLAC_FALSE; + } + crc8 = drflac_crc8(crc8, header->blockSize, 16); + header->blockSize += 1; + } else { + header->blockSize = 256 * (1 << (blockSize - 8)); + } + + + if (sampleRate <= 11) { + header->sampleRate = sampleRateTable[sampleRate]; + } else if (sampleRate == 12) { + if (!drflac__read_uint32(bs, 8, &header->sampleRate)) { + return DRFLAC_FALSE; + } + crc8 = drflac_crc8(crc8, header->sampleRate, 8); + header->sampleRate *= 1000; + } else if (sampleRate == 13) { + if (!drflac__read_uint32(bs, 16, &header->sampleRate)) { + return DRFLAC_FALSE; + } + crc8 = drflac_crc8(crc8, header->sampleRate, 16); + } else if (sampleRate == 14) { + if (!drflac__read_uint32(bs, 16, &header->sampleRate)) { + return DRFLAC_FALSE; + } + crc8 = drflac_crc8(crc8, header->sampleRate, 16); + header->sampleRate *= 10; + } else { + continue; // Invalid. Assume an invalid block. + } + + + header->channelAssignment = channelAssignment; + + header->bitsPerSample = bitsPerSampleTable[bitsPerSample]; + if (header->bitsPerSample == 0) { + header->bitsPerSample = streaminfoBitsPerSample; + } + + if (!drflac__read_uint8(bs, 8, &header->crc8)) { + return DRFLAC_FALSE; + } + +#ifndef DR_FLAC_NO_CRC + if (header->crc8 != crc8) { + continue; // CRC mismatch. Loop back to the top and find the next sync code. + } +#endif + return DRFLAC_TRUE; + } +} + +static drflac_bool32 drflac__read_subframe_header(drflac_bs* bs, drflac_subframe* pSubframe) +{ + drflac_uint8 header; + if (!drflac__read_uint8(bs, 8, &header)) { + return DRFLAC_FALSE; + } + + // First bit should always be 0. + if ((header & 0x80) != 0) { + return DRFLAC_FALSE; + } + + int type = (header & 0x7E) >> 1; + if (type == 0) { + pSubframe->subframeType = DRFLAC_SUBFRAME_CONSTANT; + } else if (type == 1) { + pSubframe->subframeType = DRFLAC_SUBFRAME_VERBATIM; + } else { + if ((type & 0x20) != 0) { + pSubframe->subframeType = DRFLAC_SUBFRAME_LPC; + pSubframe->lpcOrder = (type & 0x1F) + 1; + } else if ((type & 0x08) != 0) { + pSubframe->subframeType = DRFLAC_SUBFRAME_FIXED; + pSubframe->lpcOrder = (type & 0x07); + if (pSubframe->lpcOrder > 4) { + pSubframe->subframeType = DRFLAC_SUBFRAME_RESERVED; + pSubframe->lpcOrder = 0; + } + } else { + pSubframe->subframeType = DRFLAC_SUBFRAME_RESERVED; + } + } + + if (pSubframe->subframeType == DRFLAC_SUBFRAME_RESERVED) { + return DRFLAC_FALSE; + } + + // Wasted bits per sample. + pSubframe->wastedBitsPerSample = 0; + if ((header & 0x01) == 1) { + unsigned int wastedBitsPerSample; + if (!drflac__seek_past_next_set_bit(bs, &wastedBitsPerSample)) { + return DRFLAC_FALSE; + } + pSubframe->wastedBitsPerSample = (unsigned char)wastedBitsPerSample + 1; + } + + return DRFLAC_TRUE; +} + +static drflac_bool32 drflac__decode_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex, drflac_int32* pDecodedSamplesOut) +{ + drflac_assert(bs != NULL); + drflac_assert(frame != NULL); + + drflac_subframe* pSubframe = frame->subframes + subframeIndex; + if (!drflac__read_subframe_header(bs, pSubframe)) { + return DRFLAC_FALSE; + } + + // Side channels require an extra bit per sample. Took a while to figure that one out... + pSubframe->bitsPerSample = frame->header.bitsPerSample; + if ((frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) { + pSubframe->bitsPerSample += 1; + } else if (frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) { + pSubframe->bitsPerSample += 1; + } + + // Need to handle wasted bits per sample. + if (pSubframe->wastedBitsPerSample >= pSubframe->bitsPerSample) { + return DRFLAC_FALSE; + } + pSubframe->bitsPerSample -= pSubframe->wastedBitsPerSample; + pSubframe->pDecodedSamples = pDecodedSamplesOut; + + switch (pSubframe->subframeType) + { + case DRFLAC_SUBFRAME_CONSTANT: + { + drflac__decode_samples__constant(bs, frame->header.blockSize, pSubframe->bitsPerSample, pSubframe->pDecodedSamples); + } break; + + case DRFLAC_SUBFRAME_VERBATIM: + { + drflac__decode_samples__verbatim(bs, frame->header.blockSize, pSubframe->bitsPerSample, pSubframe->pDecodedSamples); + } break; + + case DRFLAC_SUBFRAME_FIXED: + { + drflac__decode_samples__fixed(bs, frame->header.blockSize, pSubframe->bitsPerSample, pSubframe->lpcOrder, pSubframe->pDecodedSamples); + } break; + + case DRFLAC_SUBFRAME_LPC: + { + drflac__decode_samples__lpc(bs, frame->header.blockSize, pSubframe->bitsPerSample, pSubframe->lpcOrder, pSubframe->pDecodedSamples); + } break; + + default: return DRFLAC_FALSE; + } + + return DRFLAC_TRUE; +} + +static drflac_bool32 drflac__seek_subframe(drflac_bs* bs, drflac_frame* frame, int subframeIndex) +{ + drflac_assert(bs != NULL); + drflac_assert(frame != NULL); + + drflac_subframe* pSubframe = frame->subframes + subframeIndex; + if (!drflac__read_subframe_header(bs, pSubframe)) { + return DRFLAC_FALSE; + } + + // Side channels require an extra bit per sample. Took a while to figure that one out... + pSubframe->bitsPerSample = frame->header.bitsPerSample; + if ((frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) { + pSubframe->bitsPerSample += 1; + } else if (frame->header.channelAssignment == DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) { + pSubframe->bitsPerSample += 1; + } + + // Need to handle wasted bits per sample. + if (pSubframe->wastedBitsPerSample >= pSubframe->bitsPerSample) { + return DRFLAC_FALSE; + } + pSubframe->bitsPerSample -= pSubframe->wastedBitsPerSample; + pSubframe->pDecodedSamples = NULL; + + switch (pSubframe->subframeType) + { + case DRFLAC_SUBFRAME_CONSTANT: + { + if (!drflac__seek_bits(bs, pSubframe->bitsPerSample)) { + return DRFLAC_FALSE; + } + } break; + + case DRFLAC_SUBFRAME_VERBATIM: + { + unsigned int bitsToSeek = frame->header.blockSize * pSubframe->bitsPerSample; + if (!drflac__seek_bits(bs, bitsToSeek)) { + return DRFLAC_FALSE; + } + } break; + + case DRFLAC_SUBFRAME_FIXED: + { + unsigned int bitsToSeek = pSubframe->lpcOrder * pSubframe->bitsPerSample; + if (!drflac__seek_bits(bs, bitsToSeek)) { + return DRFLAC_FALSE; + } + + if (!drflac__read_and_seek_residual(bs, frame->header.blockSize, pSubframe->lpcOrder)) { + return DRFLAC_FALSE; + } + } break; + + case DRFLAC_SUBFRAME_LPC: + { + unsigned int bitsToSeek = pSubframe->lpcOrder * pSubframe->bitsPerSample; + if (!drflac__seek_bits(bs, bitsToSeek)) { + return DRFLAC_FALSE; + } + + unsigned char lpcPrecision; + if (!drflac__read_uint8(bs, 4, &lpcPrecision)) { + return DRFLAC_FALSE; + } + if (lpcPrecision == 15) { + return DRFLAC_FALSE; // Invalid. + } + lpcPrecision += 1; + + + bitsToSeek = (pSubframe->lpcOrder * lpcPrecision) + 5; // +5 for shift. + if (!drflac__seek_bits(bs, bitsToSeek)) { + return DRFLAC_FALSE; + } + + if (!drflac__read_and_seek_residual(bs, frame->header.blockSize, pSubframe->lpcOrder)) { + return DRFLAC_FALSE; + } + } break; + + default: return DRFLAC_FALSE; + } + + return DRFLAC_TRUE; +} + + +static DRFLAC_INLINE drflac_uint8 drflac__get_channel_count_from_channel_assignment(drflac_int8 channelAssignment) +{ + drflac_assert(channelAssignment <= 10); + + drflac_uint8 lookup[] = {1, 2, 3, 4, 5, 6, 7, 8, 2, 2, 2}; + return lookup[channelAssignment]; +} + +static drflac_result drflac__decode_flac_frame(drflac* pFlac) +{ + // This function should be called while the stream is sitting on the first byte after the frame header. + drflac_zero_memory(pFlac->currentFrame.subframes, sizeof(pFlac->currentFrame.subframes)); + + // The frame block size must never be larger than the maximum block size defined by the FLAC stream. + if (pFlac->currentFrame.header.blockSize > pFlac->maxBlockSize) { + return DRFLAC_ERROR; + } + + // The number of channels in the frame must match the channel count from the STREAMINFO block. + int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFrame.header.channelAssignment); + if (channelCount != (int)pFlac->channels) { + return DRFLAC_ERROR; + } + + for (int i = 0; i < channelCount; ++i) { + if (!drflac__decode_subframe(&pFlac->bs, &pFlac->currentFrame, i, pFlac->pDecodedSamples + ((pFlac->currentFrame.header.blockSize+DRFLAC_LEADING_SAMPLES) * i) + DRFLAC_LEADING_SAMPLES)) { + return DRFLAC_ERROR; + } + } + + drflac_uint8 paddingSizeInBits = DRFLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7; + if (paddingSizeInBits > 0) { + drflac_uint8 padding = 0; + if (!drflac__read_uint8(&pFlac->bs, paddingSizeInBits, &padding)) { + return DRFLAC_END_OF_STREAM; + } + } + +#ifndef DR_FLAC_NO_CRC + drflac_uint16 actualCRC16 = drflac__flush_crc16(&pFlac->bs); +#endif + drflac_uint16 desiredCRC16; + if (!drflac__read_uint16(&pFlac->bs, 16, &desiredCRC16)) { + return DRFLAC_END_OF_STREAM; + } + +#ifndef DR_FLAC_NO_CRC + if (actualCRC16 != desiredCRC16) { + return DRFLAC_CRC_MISMATCH; // CRC mismatch. + } +#endif + + pFlac->currentFrame.samplesRemaining = pFlac->currentFrame.header.blockSize * channelCount; + + return DRFLAC_SUCCESS; +} + +static drflac_result drflac__seek_flac_frame(drflac* pFlac) +{ + int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFrame.header.channelAssignment); + for (int i = 0; i < channelCount; ++i) { + if (!drflac__seek_subframe(&pFlac->bs, &pFlac->currentFrame, i)) { + return DRFLAC_ERROR; + } + } + + // Padding. + if (!drflac__seek_bits(&pFlac->bs, DRFLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7)) { + return DRFLAC_ERROR; + } + + // CRC. +#ifndef DR_FLAC_NO_CRC + drflac_uint16 actualCRC16 = drflac__flush_crc16(&pFlac->bs); +#endif + drflac_uint16 desiredCRC16; + if (!drflac__read_uint16(&pFlac->bs, 16, &desiredCRC16)) { + return DRFLAC_END_OF_STREAM; + } + +#ifndef DR_FLAC_NO_CRC + if (actualCRC16 != desiredCRC16) { + return DRFLAC_CRC_MISMATCH; // CRC mismatch. + } +#endif + + return DRFLAC_SUCCESS; +} + +static drflac_bool32 drflac__read_and_decode_next_flac_frame(drflac* pFlac) +{ + drflac_assert(pFlac != NULL); + + for (;;) { + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { + return DRFLAC_FALSE; + } + + drflac_result result = drflac__decode_flac_frame(pFlac); + if (result != DRFLAC_SUCCESS) { + if (result == DRFLAC_CRC_MISMATCH) { + continue; // CRC mismatch. Skip to the next frame. + } else { + return DRFLAC_FALSE; + } + } + + return DRFLAC_TRUE; + } +} + + +static void drflac__get_current_frame_sample_range(drflac* pFlac, drflac_uint64* pFirstSampleInFrameOut, drflac_uint64* pLastSampleInFrameOut) +{ + drflac_assert(pFlac != NULL); + + unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFrame.header.channelAssignment); + + drflac_uint64 firstSampleInFrame = pFlac->currentFrame.header.sampleNumber*channelCount; + if (firstSampleInFrame == 0) { + firstSampleInFrame = pFlac->currentFrame.header.frameNumber * pFlac->maxBlockSize*channelCount; + } + + drflac_uint64 lastSampleInFrame = firstSampleInFrame + (pFlac->currentFrame.header.blockSize*channelCount); + if (lastSampleInFrame > 0) { + lastSampleInFrame -= 1; // Needs to be zero based. + } + + if (pFirstSampleInFrameOut) *pFirstSampleInFrameOut = firstSampleInFrame; + if (pLastSampleInFrameOut) *pLastSampleInFrameOut = lastSampleInFrame; +} + +/* This function will be replacing drflac__get_current_frame_sample_range(), but it's not currently used so I have commented it out to silence a compiler warning. */ +#if 0 +static void drflac__get_pcm_frame_range_of_current_flac_frame(drflac* pFlac, drflac_uint64* pFirstPCMFrame, drflac_uint64* pLastPCMFrame) +{ + drflac_assert(pFlac != NULL); + + drflac_uint64 firstPCMFrame = pFlac->currentFrame.header.sampleNumber; + if (firstPCMFrame == 0) { + firstPCMFrame = pFlac->currentFrame.header.frameNumber * pFlac->maxBlockSize; + } + + drflac_uint64 lastPCMFrame = firstPCMFrame + (pFlac->currentFrame.header.blockSize); + if (lastPCMFrame > 0) { + lastPCMFrame -= 1; // Needs to be zero based. + } + + if (pFirstPCMFrame) { + *pFirstPCMFrame = firstPCMFrame; + } + if (pLastPCMFrame) { + *pLastPCMFrame = lastPCMFrame; + } +} +#endif + +static drflac_bool32 drflac__seek_to_first_frame(drflac* pFlac) +{ + drflac_assert(pFlac != NULL); + + drflac_bool32 result = drflac__seek_to_byte(&pFlac->bs, pFlac->firstFramePos); + + drflac_zero_memory(&pFlac->currentFrame, sizeof(pFlac->currentFrame)); + pFlac->currentSample = 0; + + return result; +} + +static DRFLAC_INLINE drflac_result drflac__seek_to_next_flac_frame(drflac* pFlac) +{ + // This function should only ever be called while the decoder is sitting on the first byte past the FRAME_HEADER section. + drflac_assert(pFlac != NULL); + return drflac__seek_flac_frame(pFlac); +} + +drflac_uint64 drflac__seek_forward_by_samples(drflac* pFlac, drflac_uint64 samplesToRead) +{ + drflac_uint64 samplesRead = 0; + while (samplesToRead > 0) { + if (pFlac->currentFrame.samplesRemaining == 0) { + if (!drflac__read_and_decode_next_flac_frame(pFlac)) { + break; // Couldn't read the next frame, so just break from the loop and return. + } + } else { + if (pFlac->currentFrame.samplesRemaining > samplesToRead) { + samplesRead += samplesToRead; + pFlac->currentFrame.samplesRemaining -= (drflac_uint32)samplesToRead; // <-- Safe cast. Will always be < currentFrame.samplesRemaining < 65536. + samplesToRead = 0; + } else { + samplesRead += pFlac->currentFrame.samplesRemaining; + samplesToRead -= pFlac->currentFrame.samplesRemaining; + pFlac->currentFrame.samplesRemaining = 0; + } + } + } + + pFlac->currentSample += samplesRead; + return samplesRead; +} + +drflac_uint64 drflac__seek_forward_by_pcm_frames(drflac* pFlac, drflac_uint64 pcmFramesToSeek) +{ + return drflac__seek_forward_by_samples(pFlac, pcmFramesToSeek*pFlac->channels); +} + +static drflac_bool32 drflac__seek_to_sample__brute_force(drflac* pFlac, drflac_uint64 sampleIndex) +{ + drflac_assert(pFlac != NULL); + + drflac_bool32 isMidFrame = DRFLAC_FALSE; + + // If we are seeking forward we start from the current position. Otherwise we need to start all the way from the start of the file. + drflac_uint64 runningSampleCount; + if (sampleIndex >= pFlac->currentSample) { + // Seeking forward. Need to seek from the current position. + runningSampleCount = pFlac->currentSample; + + // The frame header for the first frame may not yet have been read. We need to do that if necessary. + if (pFlac->currentSample == 0 && pFlac->currentFrame.samplesRemaining == 0) { + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { + return DRFLAC_FALSE; + } + } else { + isMidFrame = DRFLAC_TRUE; + } + } else { + // Seeking backwards. Need to seek from the start of the file. + runningSampleCount = 0; + + // Move back to the start. + if (!drflac__seek_to_first_frame(pFlac)) { + return DRFLAC_FALSE; + } + + // Decode the first frame in preparation for sample-exact seeking below. + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { + return DRFLAC_FALSE; + } + } + + // We need to as quickly as possible find the frame that contains the target sample. To do this, we iterate over each frame and inspect its + // header. If based on the header we can determine that the frame contains the sample, we do a full decode of that frame. + for (;;) { + drflac_uint64 firstSampleInFrame = 0; + drflac_uint64 lastSampleInFrame = 0; + drflac__get_current_frame_sample_range(pFlac, &firstSampleInFrame, &lastSampleInFrame); + + drflac_uint64 sampleCountInThisFrame = (lastSampleInFrame - firstSampleInFrame) + 1; + if (sampleIndex < (runningSampleCount + sampleCountInThisFrame)) { + // The sample should be in this frame. We need to fully decode it, however if it's an invalid frame (a CRC mismatch), we need to pretend + // it never existed and keep iterating. + drflac_uint64 samplesToDecode = sampleIndex - runningSampleCount; + + if (!isMidFrame) { + drflac_result result = drflac__decode_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + // The frame is valid. We just need to skip over some samples to ensure it's sample-exact. + return drflac__seek_forward_by_samples(pFlac, samplesToDecode) == samplesToDecode; // <-- If this fails, something bad has happened (it should never fail). + } else { + if (result == DRFLAC_CRC_MISMATCH) { + goto next_iteration; // CRC mismatch. Pretend this frame never existed. + } else { + return DRFLAC_FALSE; + } + } + } else { + // We started seeking mid-frame which means we need to skip the frame decoding part. + return drflac__seek_forward_by_samples(pFlac, samplesToDecode) == samplesToDecode; + } + } else { + // It's not in this frame. We need to seek past the frame, but check if there was a CRC mismatch. If so, we pretend this + // frame never existed and leave the running sample count untouched. + if (!isMidFrame) { + drflac_result result = drflac__seek_to_next_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + runningSampleCount += sampleCountInThisFrame; + } else { + if (result == DRFLAC_CRC_MISMATCH) { + goto next_iteration; // CRC mismatch. Pretend this frame never existed. + } else { + return DRFLAC_FALSE; + } + } + } else { + // We started seeking mid-frame which means we need to seek by reading to the end of the frame instead of with + // drflac__seek_to_next_flac_frame() which only works if the decoder is sitting on the byte just after the frame header. + runningSampleCount += pFlac->currentFrame.samplesRemaining; + pFlac->currentFrame.samplesRemaining = 0; + isMidFrame = DRFLAC_FALSE; + } + } + + next_iteration: + // Grab the next frame in preparation for the next iteration. + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { + return DRFLAC_FALSE; + } + } +} + + +static drflac_bool32 drflac__seek_to_sample__seek_table(drflac* pFlac, drflac_uint64 sampleIndex) +{ + drflac_assert(pFlac != NULL); + + if (pFlac->pSeekpoints == NULL || pFlac->seekpointCount == 0) { + return DRFLAC_FALSE; + } + + + drflac_uint32 iClosestSeekpoint = 0; + for (drflac_uint32 iSeekpoint = 0; iSeekpoint < pFlac->seekpointCount; ++iSeekpoint) { + if (pFlac->pSeekpoints[iSeekpoint].firstSample*pFlac->channels >= sampleIndex) { + break; + } + + iClosestSeekpoint = iSeekpoint; + } + + + drflac_bool32 isMidFrame = DRFLAC_FALSE; + + // At this point we should have found the seekpoint closest to our sample. If we are seeking forward and the closest seekpoint is _before_ the current sample, we + // just seek forward from where we are. Otherwise we start seeking from the seekpoint's first sample. + drflac_uint64 runningSampleCount; + if ((sampleIndex >= pFlac->currentSample) && (pFlac->pSeekpoints[iClosestSeekpoint].firstSample*pFlac->channels <= pFlac->currentSample)) { + // Optimized case. Just seek forward from where we are. + runningSampleCount = pFlac->currentSample; + + // The frame header for the first frame may not yet have been read. We need to do that if necessary. + if (pFlac->currentSample == 0 && pFlac->currentFrame.samplesRemaining == 0) { + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { + return DRFLAC_FALSE; + } + } else { + isMidFrame = DRFLAC_TRUE; + } + } else { + // Slower case. Seek to the start of the seekpoint and then seek forward from there. + runningSampleCount = pFlac->pSeekpoints[iClosestSeekpoint].firstSample*pFlac->channels; + + if (!drflac__seek_to_byte(&pFlac->bs, pFlac->firstFramePos + pFlac->pSeekpoints[iClosestSeekpoint].frameOffset)) { + return DRFLAC_FALSE; + } + + // Grab the frame the seekpoint is sitting on in preparation for the sample-exact seeking below. + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { + return DRFLAC_FALSE; + } + } + + for (;;) { + drflac_uint64 firstSampleInFrame = 0; + drflac_uint64 lastSampleInFrame = 0; + drflac__get_current_frame_sample_range(pFlac, &firstSampleInFrame, &lastSampleInFrame); + + drflac_uint64 sampleCountInThisFrame = (lastSampleInFrame - firstSampleInFrame) + 1; + if (sampleIndex < (runningSampleCount + sampleCountInThisFrame)) { + // The sample should be in this frame. We need to fully decode it, but if it's an invalid frame (a CRC mismatch) we need to pretend + // it never existed and keep iterating. + drflac_uint64 samplesToDecode = sampleIndex - runningSampleCount; + + if (!isMidFrame) { + drflac_result result = drflac__decode_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + // The frame is valid. We just need to skip over some samples to ensure it's sample-exact. + return drflac__seek_forward_by_samples(pFlac, samplesToDecode) == samplesToDecode; // <-- If this fails, something bad has happened (it should never fail). + } else { + if (result == DRFLAC_CRC_MISMATCH) { + goto next_iteration; // CRC mismatch. Pretend this frame never existed. + } else { + return DRFLAC_FALSE; + } + } + } else { + // We started seeking mid-frame which means we need to skip the frame decoding part. + return drflac__seek_forward_by_samples(pFlac, samplesToDecode) == samplesToDecode; + } + } else { + // It's not in this frame. We need to seek past the frame, but check if there was a CRC mismatch. If so, we pretend this + // frame never existed and leave the running sample count untouched. + if (!isMidFrame) { + drflac_result result = drflac__seek_to_next_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + runningSampleCount += sampleCountInThisFrame; + } else { + if (result == DRFLAC_CRC_MISMATCH) { + goto next_iteration; // CRC mismatch. Pretend this frame never existed. + } else { + return DRFLAC_FALSE; + } + } + } else { + // We started seeking mid-frame which means we need to seek by reading to the end of the frame instead of with + // drflac__seek_to_next_flac_frame() which only works if the decoder is sitting on the byte just after the frame header. + runningSampleCount += pFlac->currentFrame.samplesRemaining; + pFlac->currentFrame.samplesRemaining = 0; + isMidFrame = DRFLAC_FALSE; + } + } + + next_iteration: + // Grab the next frame in preparation for the next iteration. + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { + return DRFLAC_FALSE; + } + } +} + + +#ifndef DR_FLAC_NO_OGG +typedef struct +{ + drflac_uint8 capturePattern[4]; // Should be "OggS" + drflac_uint8 structureVersion; // Always 0. + drflac_uint8 headerType; + drflac_uint64 granulePosition; + drflac_uint32 serialNumber; + drflac_uint32 sequenceNumber; + drflac_uint32 checksum; + drflac_uint8 segmentCount; + drflac_uint8 segmentTable[255]; +} drflac_ogg_page_header; +#endif + +typedef struct +{ + drflac_read_proc onRead; + drflac_seek_proc onSeek; + drflac_meta_proc onMeta; + drflac_container container; + void* pUserData; + void* pUserDataMD; + drflac_uint32 sampleRate; + drflac_uint8 channels; + drflac_uint8 bitsPerSample; + drflac_uint64 totalSampleCount; + drflac_uint16 maxBlockSize; + drflac_uint64 runningFilePos; + drflac_bool32 hasStreamInfoBlock; + drflac_bool32 hasMetadataBlocks; + drflac_bs bs; // <-- A bit streamer is required for loading data during initialization. + drflac_frame_header firstFrameHeader; // <-- The header of the first frame that was read during relaxed initalization. Only set if there is no STREAMINFO block. + +#ifndef DR_FLAC_NO_OGG + drflac_uint32 oggSerial; + drflac_uint64 oggFirstBytePos; + drflac_ogg_page_header oggBosHeader; +#endif +} drflac_init_info; + +static DRFLAC_INLINE void drflac__decode_block_header(drflac_uint32 blockHeader, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize) +{ + blockHeader = drflac__be2host_32(blockHeader); + *isLastBlock = (blockHeader & (0x01 << 31)) >> 31; + *blockType = (blockHeader & (0x7F << 24)) >> 24; + *blockSize = (blockHeader & 0xFFFFFF); +} + +static DRFLAC_INLINE drflac_bool32 drflac__read_and_decode_block_header(drflac_read_proc onRead, void* pUserData, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize) +{ + drflac_uint32 blockHeader; + if (onRead(pUserData, &blockHeader, 4) != 4) { + return DRFLAC_FALSE; + } + + drflac__decode_block_header(blockHeader, isLastBlock, blockType, blockSize); + return DRFLAC_TRUE; +} + +drflac_bool32 drflac__read_streaminfo(drflac_read_proc onRead, void* pUserData, drflac_streaminfo* pStreamInfo) +{ + // min/max block size. + drflac_uint32 blockSizes; + if (onRead(pUserData, &blockSizes, 4) != 4) { + return DRFLAC_FALSE; + } + + // min/max frame size. + drflac_uint64 frameSizes = 0; + if (onRead(pUserData, &frameSizes, 6) != 6) { + return DRFLAC_FALSE; + } + + // Sample rate, channels, bits per sample and total sample count. + drflac_uint64 importantProps; + if (onRead(pUserData, &importantProps, 8) != 8) { + return DRFLAC_FALSE; + } + + // MD5 + drflac_uint8 md5[16]; + if (onRead(pUserData, md5, sizeof(md5)) != sizeof(md5)) { + return DRFLAC_FALSE; + } + + blockSizes = drflac__be2host_32(blockSizes); + frameSizes = drflac__be2host_64(frameSizes); + importantProps = drflac__be2host_64(importantProps); + + pStreamInfo->minBlockSize = (blockSizes & 0xFFFF0000) >> 16; + pStreamInfo->maxBlockSize = blockSizes & 0x0000FFFF; + pStreamInfo->minFrameSize = (drflac_uint32)((frameSizes & (drflac_uint64)0xFFFFFF0000000000) >> 40); + pStreamInfo->maxFrameSize = (drflac_uint32)((frameSizes & (drflac_uint64)0x000000FFFFFF0000) >> 16); + pStreamInfo->sampleRate = (drflac_uint32)((importantProps & (drflac_uint64)0xFFFFF00000000000) >> 44); + pStreamInfo->channels = (drflac_uint8 )((importantProps & (drflac_uint64)0x00000E0000000000) >> 41) + 1; + pStreamInfo->bitsPerSample = (drflac_uint8 )((importantProps & (drflac_uint64)0x000001F000000000) >> 36) + 1; + pStreamInfo->totalSampleCount = (importantProps & (drflac_uint64)0x0000000FFFFFFFFF) * pStreamInfo->channels; + drflac_copy_memory(pStreamInfo->md5, md5, sizeof(md5)); + + return DRFLAC_TRUE; +} + +drflac_bool32 drflac__read_and_decode_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_uint64* pFirstFramePos, drflac_uint64* pSeektablePos, drflac_uint32* pSeektableSize) +{ + // We want to keep track of the byte position in the stream of the seektable. At the time of calling this function we know that + // we'll be sitting on byte 42. + drflac_uint64 runningFilePos = 42; + drflac_uint64 seektablePos = 0; + drflac_uint32 seektableSize = 0; + + for (;;) { + drflac_uint8 isLastBlock = 0; + drflac_uint8 blockType; + drflac_uint32 blockSize; + if (!drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize)) { + return DRFLAC_FALSE; + } + runningFilePos += 4; + + + drflac_metadata metadata; + metadata.type = blockType; + metadata.pRawData = NULL; + metadata.rawDataSize = 0; + + switch (blockType) + { + case DRFLAC_METADATA_BLOCK_TYPE_APPLICATION: + { + if (blockSize < 4) { + return DRFLAC_FALSE; + } + + if (onMeta) { + void* pRawData = DRFLAC_MALLOC(blockSize); + if (pRawData == NULL) { + return DRFLAC_FALSE; + } + + if (onRead(pUserData, pRawData, blockSize) != blockSize) { + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + + metadata.pRawData = pRawData; + metadata.rawDataSize = blockSize; + metadata.data.application.id = drflac__be2host_32(*(drflac_uint32*)pRawData); + metadata.data.application.pData = (const void*)((drflac_uint8*)pRawData + sizeof(drflac_uint32)); + metadata.data.application.dataSize = blockSize - sizeof(drflac_uint32); + onMeta(pUserDataMD, &metadata); + + DRFLAC_FREE(pRawData); + } + } break; + + case DRFLAC_METADATA_BLOCK_TYPE_SEEKTABLE: + { + seektablePos = runningFilePos; + seektableSize = blockSize; + + if (onMeta) { + void* pRawData = DRFLAC_MALLOC(blockSize); + if (pRawData == NULL) { + return DRFLAC_FALSE; + } + + if (onRead(pUserData, pRawData, blockSize) != blockSize) { + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + + metadata.pRawData = pRawData; + metadata.rawDataSize = blockSize; + metadata.data.seektable.seekpointCount = blockSize/sizeof(drflac_seekpoint); + metadata.data.seektable.pSeekpoints = (const drflac_seekpoint*)pRawData; + + // Endian swap. + for (drflac_uint32 iSeekpoint = 0; iSeekpoint < metadata.data.seektable.seekpointCount; ++iSeekpoint) { + drflac_seekpoint* pSeekpoint = (drflac_seekpoint*)pRawData + iSeekpoint; + pSeekpoint->firstSample = drflac__be2host_64(pSeekpoint->firstSample); + pSeekpoint->frameOffset = drflac__be2host_64(pSeekpoint->frameOffset); + pSeekpoint->sampleCount = drflac__be2host_16(pSeekpoint->sampleCount); + } + + onMeta(pUserDataMD, &metadata); + + DRFLAC_FREE(pRawData); + } + } break; + + case DRFLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT: + { + if (blockSize < 8) { + return DRFLAC_FALSE; + } + + if (onMeta) { + void* pRawData = DRFLAC_MALLOC(blockSize); + if (pRawData == NULL) { + return DRFLAC_FALSE; + } + + if (onRead(pUserData, pRawData, blockSize) != blockSize) { + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + + metadata.pRawData = pRawData; + metadata.rawDataSize = blockSize; + + const char* pRunningData = (const char*)pRawData; + const char* const pRunningDataEnd = (const char*)pRawData + blockSize; + + metadata.data.vorbis_comment.vendorLength = drflac__le2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + + // Need space for the rest of the block + if ((pRunningDataEnd - pRunningData) - 4 < (drflac_int64)metadata.data.vorbis_comment.vendorLength) { // <-- Note the order of operations to avoid overflow to a valid value + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + metadata.data.vorbis_comment.vendor = pRunningData; pRunningData += metadata.data.vorbis_comment.vendorLength; + metadata.data.vorbis_comment.commentCount = drflac__le2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + + // Need space for 'commentCount' comments after the block, which at minimum is a drflac_uint32 per comment + if ((pRunningDataEnd - pRunningData) / sizeof(drflac_uint32) < metadata.data.vorbis_comment.commentCount) { // <-- Note the order of operations to avoid overflow to a valid value + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + metadata.data.vorbis_comment.pComments = pRunningData; + + // Check that the comments section is valid before passing it to the callback + for (drflac_uint32 i = 0; i < metadata.data.vorbis_comment.commentCount; ++i) { + if (pRunningDataEnd - pRunningData < 4) { + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + const drflac_uint32 commentLength = drflac__le2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + if (pRunningDataEnd - pRunningData < (drflac_int64)commentLength) { // <-- Note the order of operations to avoid overflow to a valid value + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + pRunningData += commentLength; + } + + onMeta(pUserDataMD, &metadata); + + DRFLAC_FREE(pRawData); + } + } break; + + case DRFLAC_METADATA_BLOCK_TYPE_CUESHEET: + { + if (blockSize < 396) { + return DRFLAC_FALSE; + } + + if (onMeta) { + void* pRawData = DRFLAC_MALLOC(blockSize); + if (pRawData == NULL) { + return DRFLAC_FALSE; + } + + if (onRead(pUserData, pRawData, blockSize) != blockSize) { + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + + metadata.pRawData = pRawData; + metadata.rawDataSize = blockSize; + + char* pRunningData = (char*)pRawData; + const char* const pRunningDataEnd = (const char*)pRawData + blockSize; + + drflac_copy_memory(metadata.data.cuesheet.catalog, pRunningData, 128); pRunningData += 128; + metadata.data.cuesheet.leadInSampleCount = drflac__be2host_64(*(const drflac_uint64*)pRunningData); pRunningData += 8; + metadata.data.cuesheet.isCD = (pRunningData[0] & 0x80) != 0; pRunningData += 259; + metadata.data.cuesheet.trackCount = pRunningData[0]; pRunningData += 1; + metadata.data.cuesheet.pTrackData = pRunningData; + + // Check that the cuesheet tracks are valid before passing it to the callback + for (drflac_uint8 i = 0; i < metadata.data.cuesheet.trackCount; ++i) { + if (pRunningDataEnd - pRunningData < 36) { + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + + // Skip to the index point count + pRunningData += 35; + const drflac_uint8 indexCount = pRunningData[0]; pRunningData += 1; + const drflac_uint32 indexPointSize = indexCount * sizeof(drflac_cuesheet_track_index); + if (pRunningDataEnd - pRunningData < (drflac_int64)indexPointSize) { + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + + // Endian swap. + for (drflac_uint8 index = 0; index < indexCount; ++index) { + drflac_cuesheet_track_index* pTrack = (drflac_cuesheet_track_index*)pRunningData; + pRunningData += sizeof(drflac_cuesheet_track_index); + pTrack->offset = drflac__be2host_64(pTrack->offset); + } + } + + onMeta(pUserDataMD, &metadata); + + DRFLAC_FREE(pRawData); + } + } break; + + case DRFLAC_METADATA_BLOCK_TYPE_PICTURE: + { + if (blockSize < 32) { + return DRFLAC_FALSE; + } + + if (onMeta) { + void* pRawData = DRFLAC_MALLOC(blockSize); + if (pRawData == NULL) { + return DRFLAC_FALSE; + } + + if (onRead(pUserData, pRawData, blockSize) != blockSize) { + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + + metadata.pRawData = pRawData; + metadata.rawDataSize = blockSize; + + const char* pRunningData = (const char*)pRawData; + const char* const pRunningDataEnd = (const char*)pRawData + blockSize; + + metadata.data.picture.type = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.mimeLength = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + + // Need space for the rest of the block + if ((pRunningDataEnd - pRunningData) - 24 < (drflac_int64)metadata.data.picture.mimeLength) { // <-- Note the order of operations to avoid overflow to a valid value + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + metadata.data.picture.mime = pRunningData; pRunningData += metadata.data.picture.mimeLength; + metadata.data.picture.descriptionLength = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + + // Need space for the rest of the block + if ((pRunningDataEnd - pRunningData) - 20 < (drflac_int64)metadata.data.picture.descriptionLength) { // <-- Note the order of operations to avoid overflow to a valid value + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + metadata.data.picture.description = pRunningData; pRunningData += metadata.data.picture.descriptionLength; + metadata.data.picture.width = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.height = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.colorDepth = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.indexColorCount = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.pictureDataSize = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + metadata.data.picture.pPictureData = (const drflac_uint8*)pRunningData; + + // Need space for the picture after the block + if (pRunningDataEnd - pRunningData < (drflac_int64)metadata.data.picture.pictureDataSize) { // <-- Note the order of operations to avoid overflow to a valid value + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + + onMeta(pUserDataMD, &metadata); + + DRFLAC_FREE(pRawData); + } + } break; + + case DRFLAC_METADATA_BLOCK_TYPE_PADDING: + { + if (onMeta) { + metadata.data.padding.unused = 0; + + // Padding doesn't have anything meaningful in it, so just skip over it, but make sure the caller is aware of it by firing the callback. + if (!onSeek(pUserData, blockSize, drflac_seek_origin_current)) { + isLastBlock = DRFLAC_TRUE; // An error occurred while seeking. Attempt to recover by treating this as the last block which will in turn terminate the loop. + } else { + onMeta(pUserDataMD, &metadata); + } + } + } break; + + case DRFLAC_METADATA_BLOCK_TYPE_INVALID: + { + // Invalid chunk. Just skip over this one. + if (onMeta) { + if (!onSeek(pUserData, blockSize, drflac_seek_origin_current)) { + isLastBlock = DRFLAC_TRUE; // An error occurred while seeking. Attempt to recover by treating this as the last block which will in turn terminate the loop. + } + } + } break; + + default: + { + // It's an unknown chunk, but not necessarily invalid. There's a chance more metadata blocks might be defined later on, so we + // can at the very least report the chunk to the application and let it look at the raw data. + if (onMeta) { + void* pRawData = DRFLAC_MALLOC(blockSize); + if (pRawData == NULL) { + return DRFLAC_FALSE; + } + + if (onRead(pUserData, pRawData, blockSize) != blockSize) { + DRFLAC_FREE(pRawData); + return DRFLAC_FALSE; + } + + metadata.pRawData = pRawData; + metadata.rawDataSize = blockSize; + onMeta(pUserDataMD, &metadata); + + DRFLAC_FREE(pRawData); + } + } break; + } + + // If we're not handling metadata, just skip over the block. If we are, it will have been handled earlier in the switch statement above. + if (onMeta == NULL && blockSize > 0) { + if (!onSeek(pUserData, blockSize, drflac_seek_origin_current)) { + isLastBlock = DRFLAC_TRUE; + } + } + + runningFilePos += blockSize; + if (isLastBlock) { + break; + } + } + + *pSeektablePos = seektablePos; + *pSeektableSize = seektableSize; + *pFirstFramePos = runningFilePos; + + return DRFLAC_TRUE; +} + +drflac_bool32 drflac__init_private__native(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_bool32 relaxed) +{ + (void)onSeek; + + // Pre: The bit stream should be sitting just past the 4-byte id header. + + pInit->container = drflac_container_native; + + // The first metadata block should be the STREAMINFO block. + drflac_uint8 isLastBlock; + drflac_uint8 blockType; + drflac_uint32 blockSize; + if (!drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize)) { + return DRFLAC_FALSE; + } + + if (blockType != DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) { + if (!relaxed) { + // We're opening in strict mode and the first block is not the STREAMINFO block. Error. + return DRFLAC_FALSE; + } else { + // Relaxed mode. To open from here we need to just find the first frame and set the sample rate, etc. to whatever is defined + // for that frame. + pInit->hasStreamInfoBlock = DRFLAC_FALSE; + pInit->hasMetadataBlocks = DRFLAC_FALSE; + + if (!drflac__read_next_flac_frame_header(&pInit->bs, 0, &pInit->firstFrameHeader)) { + return DRFLAC_FALSE; // Couldn't find a frame. + } + + if (pInit->firstFrameHeader.bitsPerSample == 0) { + return DRFLAC_FALSE; // Failed to initialize because the first frame depends on the STREAMINFO block, which does not exist. + } + + pInit->sampleRate = pInit->firstFrameHeader.sampleRate; + pInit->channels = drflac__get_channel_count_from_channel_assignment(pInit->firstFrameHeader.channelAssignment); + pInit->bitsPerSample = pInit->firstFrameHeader.bitsPerSample; + pInit->maxBlockSize = 65535; // <-- See notes here: https://xiph.org/flac/format.html#metadata_block_streaminfo + return DRFLAC_TRUE; + } + } else { + drflac_streaminfo streaminfo; + if (!drflac__read_streaminfo(onRead, pUserData, &streaminfo)) { + return DRFLAC_FALSE; + } + + pInit->hasStreamInfoBlock = DRFLAC_TRUE; + pInit->sampleRate = streaminfo.sampleRate; + pInit->channels = streaminfo.channels; + pInit->bitsPerSample = streaminfo.bitsPerSample; + pInit->totalSampleCount = streaminfo.totalSampleCount; + pInit->maxBlockSize = streaminfo.maxBlockSize; // Don't care about the min block size - only the max (used for determining the size of the memory allocation). + pInit->hasMetadataBlocks = !isLastBlock; + + if (onMeta) { + drflac_metadata metadata; + metadata.type = DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO; + metadata.pRawData = NULL; + metadata.rawDataSize = 0; + metadata.data.streaminfo = streaminfo; + onMeta(pUserDataMD, &metadata); + } + + return DRFLAC_TRUE; + } +} + +#ifndef DR_FLAC_NO_OGG +#define DRFLAC_OGG_MAX_PAGE_SIZE 65307 +#define DRFLAC_OGG_CAPTURE_PATTERN_CRC32 1605413199 // CRC-32 of "OggS". + +typedef enum +{ + drflac_ogg_recover_on_crc_mismatch, + drflac_ogg_fail_on_crc_mismatch +} drflac_ogg_crc_mismatch_recovery; + + +static drflac_uint32 drflac__crc32_table[] = { + 0x00000000L, 0x04C11DB7L, 0x09823B6EL, 0x0D4326D9L, + 0x130476DCL, 0x17C56B6BL, 0x1A864DB2L, 0x1E475005L, + 0x2608EDB8L, 0x22C9F00FL, 0x2F8AD6D6L, 0x2B4BCB61L, + 0x350C9B64L, 0x31CD86D3L, 0x3C8EA00AL, 0x384FBDBDL, + 0x4C11DB70L, 0x48D0C6C7L, 0x4593E01EL, 0x4152FDA9L, + 0x5F15ADACL, 0x5BD4B01BL, 0x569796C2L, 0x52568B75L, + 0x6A1936C8L, 0x6ED82B7FL, 0x639B0DA6L, 0x675A1011L, + 0x791D4014L, 0x7DDC5DA3L, 0x709F7B7AL, 0x745E66CDL, + 0x9823B6E0L, 0x9CE2AB57L, 0x91A18D8EL, 0x95609039L, + 0x8B27C03CL, 0x8FE6DD8BL, 0x82A5FB52L, 0x8664E6E5L, + 0xBE2B5B58L, 0xBAEA46EFL, 0xB7A96036L, 0xB3687D81L, + 0xAD2F2D84L, 0xA9EE3033L, 0xA4AD16EAL, 0xA06C0B5DL, + 0xD4326D90L, 0xD0F37027L, 0xDDB056FEL, 0xD9714B49L, + 0xC7361B4CL, 0xC3F706FBL, 0xCEB42022L, 0xCA753D95L, + 0xF23A8028L, 0xF6FB9D9FL, 0xFBB8BB46L, 0xFF79A6F1L, + 0xE13EF6F4L, 0xE5FFEB43L, 0xE8BCCD9AL, 0xEC7DD02DL, + 0x34867077L, 0x30476DC0L, 0x3D044B19L, 0x39C556AEL, + 0x278206ABL, 0x23431B1CL, 0x2E003DC5L, 0x2AC12072L, + 0x128E9DCFL, 0x164F8078L, 0x1B0CA6A1L, 0x1FCDBB16L, + 0x018AEB13L, 0x054BF6A4L, 0x0808D07DL, 0x0CC9CDCAL, + 0x7897AB07L, 0x7C56B6B0L, 0x71159069L, 0x75D48DDEL, + 0x6B93DDDBL, 0x6F52C06CL, 0x6211E6B5L, 0x66D0FB02L, + 0x5E9F46BFL, 0x5A5E5B08L, 0x571D7DD1L, 0x53DC6066L, + 0x4D9B3063L, 0x495A2DD4L, 0x44190B0DL, 0x40D816BAL, + 0xACA5C697L, 0xA864DB20L, 0xA527FDF9L, 0xA1E6E04EL, + 0xBFA1B04BL, 0xBB60ADFCL, 0xB6238B25L, 0xB2E29692L, + 0x8AAD2B2FL, 0x8E6C3698L, 0x832F1041L, 0x87EE0DF6L, + 0x99A95DF3L, 0x9D684044L, 0x902B669DL, 0x94EA7B2AL, + 0xE0B41DE7L, 0xE4750050L, 0xE9362689L, 0xEDF73B3EL, + 0xF3B06B3BL, 0xF771768CL, 0xFA325055L, 0xFEF34DE2L, + 0xC6BCF05FL, 0xC27DEDE8L, 0xCF3ECB31L, 0xCBFFD686L, + 0xD5B88683L, 0xD1799B34L, 0xDC3ABDEDL, 0xD8FBA05AL, + 0x690CE0EEL, 0x6DCDFD59L, 0x608EDB80L, 0x644FC637L, + 0x7A089632L, 0x7EC98B85L, 0x738AAD5CL, 0x774BB0EBL, + 0x4F040D56L, 0x4BC510E1L, 0x46863638L, 0x42472B8FL, + 0x5C007B8AL, 0x58C1663DL, 0x558240E4L, 0x51435D53L, + 0x251D3B9EL, 0x21DC2629L, 0x2C9F00F0L, 0x285E1D47L, + 0x36194D42L, 0x32D850F5L, 0x3F9B762CL, 0x3B5A6B9BL, + 0x0315D626L, 0x07D4CB91L, 0x0A97ED48L, 0x0E56F0FFL, + 0x1011A0FAL, 0x14D0BD4DL, 0x19939B94L, 0x1D528623L, + 0xF12F560EL, 0xF5EE4BB9L, 0xF8AD6D60L, 0xFC6C70D7L, + 0xE22B20D2L, 0xE6EA3D65L, 0xEBA91BBCL, 0xEF68060BL, + 0xD727BBB6L, 0xD3E6A601L, 0xDEA580D8L, 0xDA649D6FL, + 0xC423CD6AL, 0xC0E2D0DDL, 0xCDA1F604L, 0xC960EBB3L, + 0xBD3E8D7EL, 0xB9FF90C9L, 0xB4BCB610L, 0xB07DABA7L, + 0xAE3AFBA2L, 0xAAFBE615L, 0xA7B8C0CCL, 0xA379DD7BL, + 0x9B3660C6L, 0x9FF77D71L, 0x92B45BA8L, 0x9675461FL, + 0x8832161AL, 0x8CF30BADL, 0x81B02D74L, 0x857130C3L, + 0x5D8A9099L, 0x594B8D2EL, 0x5408ABF7L, 0x50C9B640L, + 0x4E8EE645L, 0x4A4FFBF2L, 0x470CDD2BL, 0x43CDC09CL, + 0x7B827D21L, 0x7F436096L, 0x7200464FL, 0x76C15BF8L, + 0x68860BFDL, 0x6C47164AL, 0x61043093L, 0x65C52D24L, + 0x119B4BE9L, 0x155A565EL, 0x18197087L, 0x1CD86D30L, + 0x029F3D35L, 0x065E2082L, 0x0B1D065BL, 0x0FDC1BECL, + 0x3793A651L, 0x3352BBE6L, 0x3E119D3FL, 0x3AD08088L, + 0x2497D08DL, 0x2056CD3AL, 0x2D15EBE3L, 0x29D4F654L, + 0xC5A92679L, 0xC1683BCEL, 0xCC2B1D17L, 0xC8EA00A0L, + 0xD6AD50A5L, 0xD26C4D12L, 0xDF2F6BCBL, 0xDBEE767CL, + 0xE3A1CBC1L, 0xE760D676L, 0xEA23F0AFL, 0xEEE2ED18L, + 0xF0A5BD1DL, 0xF464A0AAL, 0xF9278673L, 0xFDE69BC4L, + 0x89B8FD09L, 0x8D79E0BEL, 0x803AC667L, 0x84FBDBD0L, + 0x9ABC8BD5L, 0x9E7D9662L, 0x933EB0BBL, 0x97FFAD0CL, + 0xAFB010B1L, 0xAB710D06L, 0xA6322BDFL, 0xA2F33668L, + 0xBCB4666DL, 0xB8757BDAL, 0xB5365D03L, 0xB1F740B4L +}; + +static DRFLAC_INLINE drflac_uint32 drflac_crc32_byte(drflac_uint32 crc32, drflac_uint8 data) +{ +#ifndef DR_FLAC_NO_CRC + return (crc32 << 8) ^ drflac__crc32_table[(drflac_uint8)((crc32 >> 24) & 0xFF) ^ data]; +#else + (void)data; + return crc32; +#endif +} + +#if 0 +static DRFLAC_INLINE drflac_uint32 drflac_crc32_uint32(drflac_uint32 crc32, drflac_uint32 data) +{ + crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 24) & 0xFF)); + crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 16) & 0xFF)); + crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 8) & 0xFF)); + crc32 = drflac_crc32_byte(crc32, (drflac_uint8)((data >> 0) & 0xFF)); + return crc32; +} + +static DRFLAC_INLINE drflac_uint32 drflac_crc32_uint64(drflac_uint32 crc32, drflac_uint64 data) +{ + crc32 = drflac_crc32_uint32(crc32, (drflac_uint32)((data >> 32) & 0xFFFFFFFF)); + crc32 = drflac_crc32_uint32(crc32, (drflac_uint32)((data >> 0) & 0xFFFFFFFF)); + return crc32; +} +#endif + +static DRFLAC_INLINE drflac_uint32 drflac_crc32_buffer(drflac_uint32 crc32, drflac_uint8* pData, drflac_uint32 dataSize) +{ + // This can be optimized. + for (drflac_uint32 i = 0; i < dataSize; ++i) { + crc32 = drflac_crc32_byte(crc32, pData[i]); + } + return crc32; +} + + +static DRFLAC_INLINE drflac_bool32 drflac_ogg__is_capture_pattern(drflac_uint8 pattern[4]) +{ + return pattern[0] == 'O' && pattern[1] == 'g' && pattern[2] == 'g' && pattern[3] == 'S'; +} + +static DRFLAC_INLINE drflac_uint32 drflac_ogg__get_page_header_size(drflac_ogg_page_header* pHeader) +{ + return 27 + pHeader->segmentCount; +} + +static DRFLAC_INLINE drflac_uint32 drflac_ogg__get_page_body_size(drflac_ogg_page_header* pHeader) +{ + drflac_uint32 pageBodySize = 0; + for (int i = 0; i < pHeader->segmentCount; ++i) { + pageBodySize += pHeader->segmentTable[i]; + } + + return pageBodySize; +} + +drflac_result drflac_ogg__read_page_header_after_capture_pattern(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, drflac_uint32* pBytesRead, drflac_uint32* pCRC32) +{ + drflac_assert(*pCRC32 == DRFLAC_OGG_CAPTURE_PATTERN_CRC32); + + drflac_uint8 data[23]; + if (onRead(pUserData, data, 23) != 23) { + return DRFLAC_END_OF_STREAM; + } + *pBytesRead += 23; + + pHeader->structureVersion = data[0]; + pHeader->headerType = data[1]; + drflac_copy_memory(&pHeader->granulePosition, &data[ 2], 8); + drflac_copy_memory(&pHeader->serialNumber, &data[10], 4); + drflac_copy_memory(&pHeader->sequenceNumber, &data[14], 4); + drflac_copy_memory(&pHeader->checksum, &data[18], 4); + pHeader->segmentCount = data[22]; + + // Calculate the CRC. Note that for the calculation the checksum part of the page needs to be set to 0. + data[18] = 0; + data[19] = 0; + data[20] = 0; + data[21] = 0; + + drflac_uint32 i; + for (i = 0; i < 23; ++i) { + *pCRC32 = drflac_crc32_byte(*pCRC32, data[i]); + } + + + if (onRead(pUserData, pHeader->segmentTable, pHeader->segmentCount) != pHeader->segmentCount) { + return DRFLAC_END_OF_STREAM; + } + *pBytesRead += pHeader->segmentCount; + + for (i = 0; i < pHeader->segmentCount; ++i) { + *pCRC32 = drflac_crc32_byte(*pCRC32, pHeader->segmentTable[i]); + } + + return DRFLAC_SUCCESS; +} + +drflac_result drflac_ogg__read_page_header(drflac_read_proc onRead, void* pUserData, drflac_ogg_page_header* pHeader, drflac_uint32* pBytesRead, drflac_uint32* pCRC32) +{ + *pBytesRead = 0; + + drflac_uint8 id[4]; + if (onRead(pUserData, id, 4) != 4) { + return DRFLAC_END_OF_STREAM; + } + *pBytesRead += 4; + + // We need to read byte-by-byte until we find the OggS capture pattern. + for (;;) { + if (drflac_ogg__is_capture_pattern(id)) { + *pCRC32 = DRFLAC_OGG_CAPTURE_PATTERN_CRC32; + + drflac_result result = drflac_ogg__read_page_header_after_capture_pattern(onRead, pUserData, pHeader, pBytesRead, pCRC32); + if (result == DRFLAC_SUCCESS) { + return DRFLAC_SUCCESS; + } else { + if (result == DRFLAC_CRC_MISMATCH) { + continue; + } else { + return result; + } + } + } else { + // The first 4 bytes did not equal the capture pattern. Read the next byte and try again. + id[0] = id[1]; + id[1] = id[2]; + id[2] = id[3]; + if (onRead(pUserData, &id[3], 1) != 1) { + return DRFLAC_END_OF_STREAM; + } + *pBytesRead += 1; + } + } +} + + +// The main part of the Ogg encapsulation is the conversion from the physical Ogg bitstream to the native FLAC bitstream. It works +// in three general stages: Ogg Physical Bitstream -> Ogg/FLAC Logical Bitstream -> FLAC Native Bitstream. dr_flac is designed +// in such a way that the core sections assume everything is delivered in native format. Therefore, for each encapsulation type +// dr_flac is supporting there needs to be a layer sitting on top of the onRead and onSeek callbacks that ensures the bits read from +// the physical Ogg bitstream are converted and delivered in native FLAC format. +typedef struct +{ + drflac_read_proc onRead; // The original onRead callback from drflac_open() and family. + drflac_seek_proc onSeek; // The original onSeek callback from drflac_open() and family. + void* pUserData; // The user data passed on onRead and onSeek. This is the user data that was passed on drflac_open() and family. + drflac_uint64 currentBytePos; // The position of the byte we are sitting on in the physical byte stream. Used for efficient seeking. + drflac_uint64 firstBytePos; // The position of the first byte in the physical bitstream. Points to the start of the "OggS" identifier of the FLAC bos page. + drflac_uint32 serialNumber; // The serial number of the FLAC audio pages. This is determined by the initial header page that was read during initialization. + drflac_ogg_page_header bosPageHeader; // Used for seeking. + drflac_ogg_page_header currentPageHeader; + drflac_uint32 bytesRemainingInPage; + drflac_uint32 pageDataSize; + drflac_uint8 pageData[DRFLAC_OGG_MAX_PAGE_SIZE]; +} drflac_oggbs; // oggbs = Ogg Bitstream + +static size_t drflac_oggbs__read_physical(drflac_oggbs* oggbs, void* bufferOut, size_t bytesToRead) +{ + size_t bytesActuallyRead = oggbs->onRead(oggbs->pUserData, bufferOut, bytesToRead); + oggbs->currentBytePos += bytesActuallyRead; + + return bytesActuallyRead; +} + +static drflac_bool32 drflac_oggbs__seek_physical(drflac_oggbs* oggbs, drflac_uint64 offset, drflac_seek_origin origin) +{ + if (origin == drflac_seek_origin_start) { + if (offset <= 0x7FFFFFFF) { + if (!oggbs->onSeek(oggbs->pUserData, (int)offset, drflac_seek_origin_start)) { + return DRFLAC_FALSE; + } + oggbs->currentBytePos = offset; + + return DRFLAC_TRUE; + } else { + if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, drflac_seek_origin_start)) { + return DRFLAC_FALSE; + } + oggbs->currentBytePos = offset; + + return drflac_oggbs__seek_physical(oggbs, offset - 0x7FFFFFFF, drflac_seek_origin_current); + } + } else { + while (offset > 0x7FFFFFFF) { + if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, drflac_seek_origin_current)) { + return DRFLAC_FALSE; + } + oggbs->currentBytePos += 0x7FFFFFFF; + offset -= 0x7FFFFFFF; + } + + if (!oggbs->onSeek(oggbs->pUserData, (int)offset, drflac_seek_origin_current)) { // <-- Safe cast thanks to the loop above. + return DRFLAC_FALSE; + } + oggbs->currentBytePos += offset; + + return DRFLAC_TRUE; + } +} + +static drflac_bool32 drflac_oggbs__goto_next_page(drflac_oggbs* oggbs, drflac_ogg_crc_mismatch_recovery recoveryMethod) +{ + drflac_ogg_page_header header; + for (;;) { + drflac_uint32 crc32 = 0; + drflac_uint32 bytesRead; + if (drflac_ogg__read_page_header(oggbs->onRead, oggbs->pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) { + return DRFLAC_FALSE; + } + oggbs->currentBytePos += bytesRead; + + drflac_uint32 pageBodySize = drflac_ogg__get_page_body_size(&header); + if (pageBodySize > DRFLAC_OGG_MAX_PAGE_SIZE) { + continue; // Invalid page size. Assume it's corrupted and just move to the next page. + } + + if (header.serialNumber != oggbs->serialNumber) { + // It's not a FLAC page. Skip it. + if (pageBodySize > 0 && !drflac_oggbs__seek_physical(oggbs, pageBodySize, drflac_seek_origin_current)) { + return DRFLAC_FALSE; + } + continue; + } + + + // We need to read the entire page and then do a CRC check on it. If there's a CRC mismatch we need to skip this page. + if (drflac_oggbs__read_physical(oggbs, oggbs->pageData, pageBodySize) != pageBodySize) { + return DRFLAC_FALSE; + } + oggbs->pageDataSize = pageBodySize; + +#ifndef DR_FLAC_NO_CRC + drflac_uint32 actualCRC32 = drflac_crc32_buffer(crc32, oggbs->pageData, oggbs->pageDataSize); + if (actualCRC32 != header.checksum) { + if (recoveryMethod == drflac_ogg_recover_on_crc_mismatch) { + continue; // CRC mismatch. Skip this page. + } else { + // Even though we are failing on a CRC mismatch, we still want our stream to be in a good state. Therefore we + // go to the next valid page to ensure we're in a good state, but return false to let the caller know that the + // seek did not fully complete. + drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch); + return DRFLAC_FALSE; + } + } +#else + (void)recoveryMethod; // <-- Silence a warning. +#endif + + oggbs->currentPageHeader = header; + oggbs->bytesRemainingInPage = pageBodySize; + return DRFLAC_TRUE; + } +} + +// Function below is unused at the moment, but I might be re-adding it later. +#if 0 +static drflac_uint8 drflac_oggbs__get_current_segment_index(drflac_oggbs* oggbs, drflac_uint8* pBytesRemainingInSeg) +{ + drflac_uint32 bytesConsumedInPage = drflac_ogg__get_page_body_size(&oggbs->currentPageHeader) - oggbs->bytesRemainingInPage; + drflac_uint8 iSeg = 0; + drflac_uint32 iByte = 0; + while (iByte < bytesConsumedInPage) { + drflac_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg]; + if (iByte + segmentSize > bytesConsumedInPage) { + break; + } else { + iSeg += 1; + iByte += segmentSize; + } + } + + *pBytesRemainingInSeg = oggbs->currentPageHeader.segmentTable[iSeg] - (drflac_uint8)(bytesConsumedInPage - iByte); + return iSeg; +} + +static drflac_bool32 drflac_oggbs__seek_to_next_packet(drflac_oggbs* oggbs) +{ + // The current packet ends when we get to the segment with a lacing value of < 255 which is not at the end of a page. + for (;;) { + drflac_bool32 atEndOfPage = DRFLAC_FALSE; + + drflac_uint8 bytesRemainingInSeg; + drflac_uint8 iFirstSeg = drflac_oggbs__get_current_segment_index(oggbs, &bytesRemainingInSeg); + + drflac_uint32 bytesToEndOfPacketOrPage = bytesRemainingInSeg; + for (drflac_uint8 iSeg = iFirstSeg; iSeg < oggbs->currentPageHeader.segmentCount; ++iSeg) { + drflac_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg]; + if (segmentSize < 255) { + if (iSeg == oggbs->currentPageHeader.segmentCount-1) { + atEndOfPage = DRFLAC_TRUE; + } + + break; + } + + bytesToEndOfPacketOrPage += segmentSize; + } + + // At this point we will have found either the packet or the end of the page. If were at the end of the page we'll + // want to load the next page and keep searching for the end of the packet. + drflac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, drflac_seek_origin_current); + oggbs->bytesRemainingInPage -= bytesToEndOfPacketOrPage; + + if (atEndOfPage) { + // We're potentially at the next packet, but we need to check the next page first to be sure because the packet may + // straddle pages. + if (!drflac_oggbs__goto_next_page(oggbs)) { + return DRFLAC_FALSE; + } + + // If it's a fresh packet it most likely means we're at the next packet. + if ((oggbs->currentPageHeader.headerType & 0x01) == 0) { + return DRFLAC_TRUE; + } + } else { + // We're at the next packet. + return DRFLAC_TRUE; + } + } +} + +static drflac_bool32 drflac_oggbs__seek_to_next_frame(drflac_oggbs* oggbs) +{ + // The bitstream should be sitting on the first byte just after the header of the frame. + + // What we're actually doing here is seeking to the start of the next packet. + return drflac_oggbs__seek_to_next_packet(oggbs); +} +#endif + +static size_t drflac__on_read_ogg(void* pUserData, void* bufferOut, size_t bytesToRead) +{ + drflac_oggbs* oggbs = (drflac_oggbs*)pUserData; + drflac_assert(oggbs != NULL); + + drflac_uint8* pRunningBufferOut = (drflac_uint8*)bufferOut; + + // Reading is done page-by-page. If we've run out of bytes in the page we need to move to the next one. + size_t bytesRead = 0; + while (bytesRead < bytesToRead) { + size_t bytesRemainingToRead = bytesToRead - bytesRead; + + if (oggbs->bytesRemainingInPage >= bytesRemainingToRead) { + drflac_copy_memory(pRunningBufferOut, oggbs->pageData + (oggbs->pageDataSize - oggbs->bytesRemainingInPage), bytesRemainingToRead); + bytesRead += bytesRemainingToRead; + oggbs->bytesRemainingInPage -= (drflac_uint32)bytesRemainingToRead; + break; + } + + // If we get here it means some of the requested data is contained in the next pages. + if (oggbs->bytesRemainingInPage > 0) { + drflac_copy_memory(pRunningBufferOut, oggbs->pageData + (oggbs->pageDataSize - oggbs->bytesRemainingInPage), oggbs->bytesRemainingInPage); + bytesRead += oggbs->bytesRemainingInPage; + pRunningBufferOut += oggbs->bytesRemainingInPage; + oggbs->bytesRemainingInPage = 0; + } + + drflac_assert(bytesRemainingToRead > 0); + if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) { + break; // Failed to go to the next page. Might have simply hit the end of the stream. + } + } + + return bytesRead; +} + +static drflac_bool32 drflac__on_seek_ogg(void* pUserData, int offset, drflac_seek_origin origin) +{ + drflac_oggbs* oggbs = (drflac_oggbs*)pUserData; + drflac_assert(oggbs != NULL); + drflac_assert(offset >= 0); // <-- Never seek backwards. + + // Seeking is always forward which makes things a lot simpler. + if (origin == drflac_seek_origin_start) { + if (!drflac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos, drflac_seek_origin_start)) { + return DRFLAC_FALSE; + } + + if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_fail_on_crc_mismatch)) { + return DRFLAC_FALSE; + } + + return drflac__on_seek_ogg(pUserData, offset, drflac_seek_origin_current); + } + + + drflac_assert(origin == drflac_seek_origin_current); + + int bytesSeeked = 0; + while (bytesSeeked < offset) { + int bytesRemainingToSeek = offset - bytesSeeked; + drflac_assert(bytesRemainingToSeek >= 0); + + if (oggbs->bytesRemainingInPage >= (size_t)bytesRemainingToSeek) { + bytesSeeked += bytesRemainingToSeek; + oggbs->bytesRemainingInPage -= bytesRemainingToSeek; + break; + } + + // If we get here it means some of the requested data is contained in the next pages. + if (oggbs->bytesRemainingInPage > 0) { + bytesSeeked += (int)oggbs->bytesRemainingInPage; + oggbs->bytesRemainingInPage = 0; + } + + drflac_assert(bytesRemainingToSeek > 0); + if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_fail_on_crc_mismatch)) { + // Failed to go to the next page. We either hit the end of the stream or had a CRC mismatch. + return DRFLAC_FALSE; + } + } + + return DRFLAC_TRUE; +} + +drflac_bool32 drflac_ogg__seek_to_sample(drflac* pFlac, drflac_uint64 sampleIndex) +{ + drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs; + + drflac_uint64 originalBytePos = oggbs->currentBytePos; // For recovery. + + // First seek to the first frame. + if (!drflac__seek_to_byte(&pFlac->bs, pFlac->firstFramePos)) { + return DRFLAC_FALSE; + } + oggbs->bytesRemainingInPage = 0; + + drflac_uint64 runningGranulePosition = 0; + drflac_uint64 runningFrameBytePos = oggbs->currentBytePos; // <-- Points to the OggS identifier. + for (;;) { + if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) { + drflac_oggbs__seek_physical(oggbs, originalBytePos, drflac_seek_origin_start); + return DRFLAC_FALSE; // Never did find that sample... + } + + runningFrameBytePos = oggbs->currentBytePos - drflac_ogg__get_page_header_size(&oggbs->currentPageHeader) - oggbs->pageDataSize; + if (oggbs->currentPageHeader.granulePosition*pFlac->channels >= sampleIndex) { + break; // The sample is somewhere in the previous page. + } + + + // At this point we know the sample is not in the previous page. It could possibly be in this page. For simplicity we + // disregard any pages that do not begin a fresh packet. + if ((oggbs->currentPageHeader.headerType & 0x01) == 0) { // <-- Is it a fresh page? + if (oggbs->currentPageHeader.segmentTable[0] >= 2) { + drflac_uint8 firstBytesInPage[2]; + firstBytesInPage[0] = oggbs->pageData[0]; + firstBytesInPage[1] = oggbs->pageData[1]; + + if ((firstBytesInPage[0] == 0xFF) && (firstBytesInPage[1] & 0xFC) == 0xF8) { // <-- Does the page begin with a frame's sync code? + runningGranulePosition = oggbs->currentPageHeader.granulePosition*pFlac->channels; + } + + continue; + } + } + } + + + // We found the page that that is closest to the sample, so now we need to find it. The first thing to do is seek to the + // start of that page. In the loop above we checked that it was a fresh page which means this page is also the start of + // a new frame. This property means that after we've seeked to the page we can immediately start looping over frames until + // we find the one containing the target sample. + if (!drflac_oggbs__seek_physical(oggbs, runningFrameBytePos, drflac_seek_origin_start)) { + return DRFLAC_FALSE; + } + if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) { + return DRFLAC_FALSE; + } + + + // At this point we'll be sitting on the first byte of the frame header of the first frame in the page. We just keep + // looping over these frames until we find the one containing the sample we're after. + drflac_uint64 runningSampleCount = runningGranulePosition; + for (;;) { + // There are two ways to find the sample and seek past irrelevant frames: + // 1) Use the native FLAC decoder. + // 2) Use Ogg's framing system. + // + // Both of these options have their own pros and cons. Using the native FLAC decoder is slower because it needs to + // do a full decode of the frame. Using Ogg's framing system is faster, but more complicated and involves some code + // duplication for the decoding of frame headers. + // + // Another thing to consider is that using the Ogg framing system will perform direct seeking of the physical Ogg + // bitstream. This is important to consider because it means we cannot read data from the drflac_bs object using the + // standard drflac__*() APIs because that will read in extra data for its own internal caching which in turn breaks + // the positioning of the read pointer of the physical Ogg bitstream. Therefore, anything that would normally be read + // using the native FLAC decoding APIs, such as drflac__read_next_flac_frame_header(), need to be re-implemented so as to + // avoid the use of the drflac_bs object. + // + // Considering these issues, I have decided to use the slower native FLAC decoding method for the following reasons: + // 1) Seeking is already partially accelerated using Ogg's paging system in the code block above. + // 2) Seeking in an Ogg encapsulated FLAC stream is probably quite uncommon. + // 3) Simplicity. + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { + return DRFLAC_FALSE; + } + + drflac_uint64 firstSampleInFrame = 0; + drflac_uint64 lastSampleInFrame = 0; + drflac__get_current_frame_sample_range(pFlac, &firstSampleInFrame, &lastSampleInFrame); + + drflac_uint64 sampleCountInThisFrame = (lastSampleInFrame - firstSampleInFrame) + 1; + if (sampleIndex < (runningSampleCount + sampleCountInThisFrame)) { + // The sample should be in this frame. We need to fully decode it, however if it's an invalid frame (a CRC mismatch), we need to pretend + // it never existed and keep iterating. + drflac_result result = drflac__decode_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + // The frame is valid. We just need to skip over some samples to ensure it's sample-exact. + drflac_uint64 samplesToDecode = (size_t)(sampleIndex - runningSampleCount); // <-- Safe cast because the maximum number of samples in a frame is 65535. + if (samplesToDecode == 0) { + return DRFLAC_TRUE; + } + return drflac__seek_forward_by_samples(pFlac, samplesToDecode) == samplesToDecode; // <-- If this fails, something bad has happened (it should never fail). + } else { + if (result == DRFLAC_CRC_MISMATCH) { + continue; // CRC mismatch. Pretend this frame never existed. + } else { + return DRFLAC_FALSE; + } + } + } else { + // It's not in this frame. We need to seek past the frame, but check if there was a CRC mismatch. If so, we pretend this + // frame never existed and leave the running sample count untouched. + drflac_result result = drflac__seek_to_next_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + runningSampleCount += sampleCountInThisFrame; + } else { + if (result == DRFLAC_CRC_MISMATCH) { + continue; // CRC mismatch. Pretend this frame never existed. + } else { + return DRFLAC_FALSE; + } + } + } + } +} + + +drflac_bool32 drflac__init_private__ogg(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_bool32 relaxed) +{ + // Pre: The bit stream should be sitting just past the 4-byte OggS capture pattern. + (void)relaxed; + + pInit->container = drflac_container_ogg; + pInit->oggFirstBytePos = 0; + + // We'll get here if the first 4 bytes of the stream were the OggS capture pattern, however it doesn't necessarily mean the + // stream includes FLAC encoded audio. To check for this we need to scan the beginning-of-stream page markers and check if + // any match the FLAC specification. Important to keep in mind that the stream may be multiplexed. + drflac_ogg_page_header header; + + drflac_uint32 crc32 = DRFLAC_OGG_CAPTURE_PATTERN_CRC32; + drflac_uint32 bytesRead = 0; + if (drflac_ogg__read_page_header_after_capture_pattern(onRead, pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) { + return DRFLAC_FALSE; + } + pInit->runningFilePos += bytesRead; + + for (;;) { + // Break if we're past the beginning of stream page. + if ((header.headerType & 0x02) == 0) { + return DRFLAC_FALSE; + } + + + // Check if it's a FLAC header. + int pageBodySize = drflac_ogg__get_page_body_size(&header); + if (pageBodySize == 51) { // 51 = the lacing value of the FLAC header packet. + // It could be a FLAC page... + drflac_uint32 bytesRemainingInPage = pageBodySize; + + drflac_uint8 packetType; + if (onRead(pUserData, &packetType, 1) != 1) { + return DRFLAC_FALSE; + } + + bytesRemainingInPage -= 1; + if (packetType == 0x7F) { + // Increasingly more likely to be a FLAC page... + drflac_uint8 sig[4]; + if (onRead(pUserData, sig, 4) != 4) { + return DRFLAC_FALSE; + } + + bytesRemainingInPage -= 4; + if (sig[0] == 'F' && sig[1] == 'L' && sig[2] == 'A' && sig[3] == 'C') { + // Almost certainly a FLAC page... + drflac_uint8 mappingVersion[2]; + if (onRead(pUserData, mappingVersion, 2) != 2) { + return DRFLAC_FALSE; + } + + if (mappingVersion[0] != 1) { + return DRFLAC_FALSE; // Only supporting version 1.x of the Ogg mapping. + } + + // The next 2 bytes are the non-audio packets, not including this one. We don't care about this because we're going to + // be handling it in a generic way based on the serial number and packet types. + if (!onSeek(pUserData, 2, drflac_seek_origin_current)) { + return DRFLAC_FALSE; + } + + // Expecting the native FLAC signature "fLaC". + if (onRead(pUserData, sig, 4) != 4) { + return DRFLAC_FALSE; + } + + if (sig[0] == 'f' && sig[1] == 'L' && sig[2] == 'a' && sig[3] == 'C') { + // The remaining data in the page should be the STREAMINFO block. + drflac_uint8 isLastBlock; + drflac_uint8 blockType; + drflac_uint32 blockSize; + if (!drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize)) { + return DRFLAC_FALSE; + } + + if (blockType != DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) { + return DRFLAC_FALSE; // Invalid block type. First block must be the STREAMINFO block. + } + + drflac_streaminfo streaminfo; + if (drflac__read_streaminfo(onRead, pUserData, &streaminfo)) { + // Success! + pInit->hasStreamInfoBlock = DRFLAC_TRUE; + pInit->sampleRate = streaminfo.sampleRate; + pInit->channels = streaminfo.channels; + pInit->bitsPerSample = streaminfo.bitsPerSample; + pInit->totalSampleCount = streaminfo.totalSampleCount; + pInit->maxBlockSize = streaminfo.maxBlockSize; + pInit->hasMetadataBlocks = !isLastBlock; + + if (onMeta) { + drflac_metadata metadata; + metadata.type = DRFLAC_METADATA_BLOCK_TYPE_STREAMINFO; + metadata.pRawData = NULL; + metadata.rawDataSize = 0; + metadata.data.streaminfo = streaminfo; + onMeta(pUserDataMD, &metadata); + } + + pInit->runningFilePos += pageBodySize; + pInit->oggFirstBytePos = pInit->runningFilePos - 79; // Subtracting 79 will place us right on top of the "OggS" identifier of the FLAC bos page. + pInit->oggSerial = header.serialNumber; + pInit->oggBosHeader = header; + break; + } else { + // Failed to read STREAMINFO block. Aww, so close... + return DRFLAC_FALSE; + } + } else { + // Invalid file. + return DRFLAC_FALSE; + } + } else { + // Not a FLAC header. Skip it. + if (!onSeek(pUserData, bytesRemainingInPage, drflac_seek_origin_current)) { + return DRFLAC_FALSE; + } + } + } else { + // Not a FLAC header. Seek past the entire page and move on to the next. + if (!onSeek(pUserData, bytesRemainingInPage, drflac_seek_origin_current)) { + return DRFLAC_FALSE; + } + } + } else { + if (!onSeek(pUserData, pageBodySize, drflac_seek_origin_current)) { + return DRFLAC_FALSE; + } + } + + pInit->runningFilePos += pageBodySize; + + + // Read the header of the next page. + if (drflac_ogg__read_page_header(onRead, pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) { + return DRFLAC_FALSE; + } + pInit->runningFilePos += bytesRead; + } + + + // If we get here it means we found a FLAC audio stream. We should be sitting on the first byte of the header of the next page. The next + // packets in the FLAC logical stream contain the metadata. The only thing left to do in the initialization phase for Ogg is to create the + // Ogg bistream object. + pInit->hasMetadataBlocks = DRFLAC_TRUE; // <-- Always have at least VORBIS_COMMENT metadata block. + return DRFLAC_TRUE; +} +#endif + +drflac_bool32 drflac__init_private(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, void* pUserDataMD) +{ + if (pInit == NULL || onRead == NULL || onSeek == NULL) { + return DRFLAC_FALSE; + } + + drflac_zero_memory(pInit, sizeof(*pInit)); + pInit->onRead = onRead; + pInit->onSeek = onSeek; + pInit->onMeta = onMeta; + pInit->container = container; + pInit->pUserData = pUserData; + pInit->pUserDataMD = pUserDataMD; + + pInit->bs.onRead = onRead; + pInit->bs.onSeek = onSeek; + pInit->bs.pUserData = pUserData; + drflac__reset_cache(&pInit->bs); + + + // If the container is explicitly defined then we can try opening in relaxed mode. + drflac_bool32 relaxed = container != drflac_container_unknown; + + drflac_uint8 id[4]; + + // Skip over any ID3 tags. + for (;;) { + if (onRead(pUserData, id, 4) != 4) { + return DRFLAC_FALSE; // Ran out of data. + } + pInit->runningFilePos += 4; + + if (id[0] == 'I' && id[1] == 'D' && id[2] == '3') { + drflac_uint8 header[6]; + if (onRead(pUserData, header, 6) != 6) { + return DRFLAC_FALSE; // Ran out of data. + } + pInit->runningFilePos += 6; + + drflac_uint8 flags = header[1]; + drflac_uint32 headerSize; + drflac_copy_memory(&headerSize, header+2, 4); + headerSize = drflac__unsynchsafe_32(drflac__be2host_32(headerSize)); + if (flags & 0x10) { + headerSize += 10; + } + + if (!onSeek(pUserData, headerSize, drflac_seek_origin_current)) { + return DRFLAC_FALSE; // Failed to seek past the tag. + } + pInit->runningFilePos += headerSize; + } else { + break; + } + } + + if (id[0] == 'f' && id[1] == 'L' && id[2] == 'a' && id[3] == 'C') { + return drflac__init_private__native(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed); + } +#ifndef DR_FLAC_NO_OGG + if (id[0] == 'O' && id[1] == 'g' && id[2] == 'g' && id[3] == 'S') { + return drflac__init_private__ogg(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed); + } +#endif + + // If we get here it means we likely don't have a header. Try opening in relaxed mode, if applicable. + if (relaxed) { + if (container == drflac_container_native) { + return drflac__init_private__native(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed); + } +#ifndef DR_FLAC_NO_OGG + if (container == drflac_container_ogg) { + return drflac__init_private__ogg(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed); + } +#endif + } + + // Unsupported container. + return DRFLAC_FALSE; +} + +void drflac__init_from_info(drflac* pFlac, drflac_init_info* pInit) +{ + drflac_assert(pFlac != NULL); + drflac_assert(pInit != NULL); + + drflac_zero_memory(pFlac, sizeof(*pFlac)); + pFlac->bs = pInit->bs; + pFlac->onMeta = pInit->onMeta; + pFlac->pUserDataMD = pInit->pUserDataMD; + pFlac->maxBlockSize = pInit->maxBlockSize; + pFlac->sampleRate = pInit->sampleRate; + pFlac->channels = (drflac_uint8)pInit->channels; + pFlac->bitsPerSample = (drflac_uint8)pInit->bitsPerSample; + pFlac->totalSampleCount = pInit->totalSampleCount; + pFlac->totalPCMFrameCount = pInit->totalSampleCount / pFlac->channels; + pFlac->container = pInit->container; +} + +drflac* drflac_open_with_metadata_private(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData, void* pUserDataMD) +{ +#ifndef DRFLAC_NO_CPUID + // CPU support first. + drflac__init_cpu_caps(); +#endif + + drflac_init_info init; + if (!drflac__init_private(&init, onRead, onSeek, onMeta, container, pUserData, pUserDataMD)) { + return NULL; + } + + // The size of the allocation for the drflac object needs to be large enough to fit the following: + // 1) The main members of the drflac structure + // 2) A block of memory large enough to store the decoded samples of the largest frame in the stream + // 3) If the container is Ogg, a drflac_oggbs object + // + // The complicated part of the allocation is making sure there's enough room the decoded samples, taking into consideration + // the different SIMD instruction sets. + drflac_uint32 allocationSize = sizeof(drflac); + + // The allocation size for decoded frames depends on the number of 32-bit integers that fit inside the largest SIMD vector + // we are supporting. + drflac_uint32 wholeSIMDVectorCountPerChannel; + if (((init.maxBlockSize+DRFLAC_LEADING_SAMPLES) % (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) == 0) { + wholeSIMDVectorCountPerChannel = ((init.maxBlockSize+DRFLAC_LEADING_SAMPLES) / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))); + } else { + wholeSIMDVectorCountPerChannel = ((init.maxBlockSize+DRFLAC_LEADING_SAMPLES) / (DRFLAC_MAX_SIMD_VECTOR_SIZE / sizeof(drflac_int32))) + 1; + } + + drflac_uint32 decodedSamplesAllocationSize = wholeSIMDVectorCountPerChannel * DRFLAC_MAX_SIMD_VECTOR_SIZE * init.channels; + + allocationSize += decodedSamplesAllocationSize; + allocationSize += DRFLAC_MAX_SIMD_VECTOR_SIZE; // Allocate extra bytes to ensure we have enough for alignment. + +#ifndef DR_FLAC_NO_OGG + // There's additional data required for Ogg streams. + drflac_uint32 oggbsAllocationSize = 0; + if (init.container == drflac_container_ogg) { + oggbsAllocationSize = sizeof(drflac_oggbs); + allocationSize += oggbsAllocationSize; + } + + drflac_oggbs oggbs; + drflac_zero_memory(&oggbs, sizeof(oggbs)); + if (init.container == drflac_container_ogg) { + oggbs.onRead = onRead; + oggbs.onSeek = onSeek; + oggbs.pUserData = pUserData; + oggbs.currentBytePos = init.oggFirstBytePos; + oggbs.firstBytePos = init.oggFirstBytePos; + oggbs.serialNumber = init.oggSerial; + oggbs.bosPageHeader = init.oggBosHeader; + oggbs.bytesRemainingInPage = 0; + } +#endif + + // This part is a bit awkward. We need to load the seektable so that it can be referenced in-memory, but I want the drflac object to + // consist of only a single heap allocation. To this, the size of the seek table needs to be known, which we determine when reading + // and decoding the metadata. + drflac_uint64 firstFramePos = 42; // <-- We know we are at byte 42 at this point. + drflac_uint64 seektablePos = 0; + drflac_uint32 seektableSize = 0; + if (init.hasMetadataBlocks) { + drflac_read_proc onReadOverride = onRead; + drflac_seek_proc onSeekOverride = onSeek; + void* pUserDataOverride = pUserData; + +#ifndef DR_FLAC_NO_OGG + if (init.container == drflac_container_ogg) { + onReadOverride = drflac__on_read_ogg; + onSeekOverride = drflac__on_seek_ogg; + pUserDataOverride = (void*)&oggbs; + } +#endif + + if (!drflac__read_and_decode_metadata(onReadOverride, onSeekOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seektableSize)) { + return NULL; + } + + allocationSize += seektableSize; + } + + + drflac* pFlac = (drflac*)DRFLAC_MALLOC(allocationSize); + drflac__init_from_info(pFlac, &init); + pFlac->pDecodedSamples = (drflac_int32*)drflac_align((size_t)pFlac->pExtraData, DRFLAC_MAX_SIMD_VECTOR_SIZE); + +#ifndef DR_FLAC_NO_OGG + if (init.container == drflac_container_ogg) { + drflac_oggbs* pInternalOggbs = (drflac_oggbs*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize + seektableSize); + *pInternalOggbs = oggbs; + + // The Ogg bistream needs to be layered on top of the original bitstream. + pFlac->bs.onRead = drflac__on_read_ogg; + pFlac->bs.onSeek = drflac__on_seek_ogg; + pFlac->bs.pUserData = (void*)pInternalOggbs; + pFlac->_oggbs = (void*)pInternalOggbs; + } +#endif + + pFlac->firstFramePos = firstFramePos; + + // NOTE: Seektables are not currently compatible with Ogg encapsulation (Ogg has its own accelerated seeking system). I may change this later, so I'm leaving this here for now. +#ifndef DR_FLAC_NO_OGG + if (init.container == drflac_container_ogg) + { + pFlac->pSeekpoints = NULL; + pFlac->seekpointCount = 0; + } + else +#endif + { + // If we have a seektable we need to load it now, making sure we move back to where we were previously. + if (seektablePos != 0) { + pFlac->seekpointCount = seektableSize / sizeof(*pFlac->pSeekpoints); + pFlac->pSeekpoints = (drflac_seekpoint*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize); + + // Seek to the seektable, then just read directly into our seektable buffer. + if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, drflac_seek_origin_start)) { + if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints, seektableSize) == seektableSize) { + // Endian swap. + for (drflac_uint32 iSeekpoint = 0; iSeekpoint < pFlac->seekpointCount; ++iSeekpoint) { + pFlac->pSeekpoints[iSeekpoint].firstSample = drflac__be2host_64(pFlac->pSeekpoints[iSeekpoint].firstSample); + pFlac->pSeekpoints[iSeekpoint].frameOffset = drflac__be2host_64(pFlac->pSeekpoints[iSeekpoint].frameOffset); + pFlac->pSeekpoints[iSeekpoint].sampleCount = drflac__be2host_16(pFlac->pSeekpoints[iSeekpoint].sampleCount); + } + } else { + // Failed to read the seektable. Pretend we don't have one. + pFlac->pSeekpoints = NULL; + pFlac->seekpointCount = 0; + } + + // We need to seek back to where we were. If this fails it's a critical error. + if (!pFlac->bs.onSeek(pFlac->bs.pUserData, (int)pFlac->firstFramePos, drflac_seek_origin_start)) { + DRFLAC_FREE(pFlac); + return NULL; + } + } else { + // Failed to seek to the seektable. Ominous sign, but for now we can just pretend we don't have one. + pFlac->pSeekpoints = NULL; + pFlac->seekpointCount = 0; + } + } + } + + + + // If we get here, but don't have a STREAMINFO block, it means we've opened the stream in relaxed mode and need to decode + // the first frame. + if (!init.hasStreamInfoBlock) { + pFlac->currentFrame.header = init.firstFrameHeader; + do + { + drflac_result result = drflac__decode_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + break; + } else { + if (result == DRFLAC_CRC_MISMATCH) { + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFrame.header)) { + DRFLAC_FREE(pFlac); + return NULL; + } + continue; + } else { + DRFLAC_FREE(pFlac); + return NULL; + } + } + } while (1); + } + + return pFlac; +} + + + +#ifndef DR_FLAC_NO_STDIO +#include + +static size_t drflac__on_read_stdio(void* pUserData, void* bufferOut, size_t bytesToRead) +{ + return fread(bufferOut, 1, bytesToRead, (FILE*)pUserData); +} + +static drflac_bool32 drflac__on_seek_stdio(void* pUserData, int offset, drflac_seek_origin origin) +{ + drflac_assert(offset >= 0); // <-- Never seek backwards. + + return fseek((FILE*)pUserData, offset, (origin == drflac_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; +} + +static FILE* drflac__fopen(const char* filename) +{ + FILE* pFile; +#ifdef _MSC_VER + if (fopen_s(&pFile, filename, "rb") != 0) { + return NULL; + } +#else + pFile = fopen(filename, "rb"); + if (pFile == NULL) { + return NULL; + } +#endif + + return pFile; +} + + +drflac* drflac_open_file(const char* filename) +{ + FILE* file = drflac__fopen(filename); + if (file == NULL) { + return NULL; + } + + drflac* pFlac = drflac_open(drflac__on_read_stdio, drflac__on_seek_stdio, (void*)file); + if (pFlac == NULL) { + fclose(file); + return NULL; + } + + return pFlac; +} + +drflac* drflac_open_file_with_metadata(const char* filename, drflac_meta_proc onMeta, void* pUserData) +{ + FILE* file = drflac__fopen(filename); + if (file == NULL) { + return NULL; + } + + drflac* pFlac = drflac_open_with_metadata_private(drflac__on_read_stdio, drflac__on_seek_stdio, onMeta, drflac_container_unknown, (void*)file, pUserData); + if (pFlac == NULL) { + fclose(file); + return pFlac; + } + + return pFlac; +} +#endif //DR_FLAC_NO_STDIO + +static size_t drflac__on_read_memory(void* pUserData, void* bufferOut, size_t bytesToRead) +{ + drflac__memory_stream* memoryStream = (drflac__memory_stream*)pUserData; + drflac_assert(memoryStream != NULL); + drflac_assert(memoryStream->dataSize >= memoryStream->currentReadPos); + + size_t bytesRemaining = memoryStream->dataSize - memoryStream->currentReadPos; + if (bytesToRead > bytesRemaining) { + bytesToRead = bytesRemaining; + } + + if (bytesToRead > 0) { + drflac_copy_memory(bufferOut, memoryStream->data + memoryStream->currentReadPos, bytesToRead); + memoryStream->currentReadPos += bytesToRead; + } + + return bytesToRead; +} + +static drflac_bool32 drflac__on_seek_memory(void* pUserData, int offset, drflac_seek_origin origin) +{ + drflac__memory_stream* memoryStream = (drflac__memory_stream*)pUserData; + drflac_assert(memoryStream != NULL); + drflac_assert(offset >= 0); // <-- Never seek backwards. + + if (offset > (drflac_int64)memoryStream->dataSize) { + return DRFLAC_FALSE; + } + + if (origin == drflac_seek_origin_current) { + if (memoryStream->currentReadPos + offset <= memoryStream->dataSize) { + memoryStream->currentReadPos += offset; + } else { + return DRFLAC_FALSE; // Trying to seek too far forward. + } + } else { + if ((drflac_uint32)offset <= memoryStream->dataSize) { + memoryStream->currentReadPos = offset; + } else { + return DRFLAC_FALSE; // Trying to seek too far forward. + } + } + + return DRFLAC_TRUE; +} + +drflac* drflac_open_memory(const void* data, size_t dataSize) +{ + drflac__memory_stream memoryStream; + memoryStream.data = (const unsigned char*)data; + memoryStream.dataSize = dataSize; + memoryStream.currentReadPos = 0; + drflac* pFlac = drflac_open(drflac__on_read_memory, drflac__on_seek_memory, &memoryStream); + if (pFlac == NULL) { + return NULL; + } + + pFlac->memoryStream = memoryStream; + + // This is an awful hack... +#ifndef DR_FLAC_NO_OGG + if (pFlac->container == drflac_container_ogg) + { + drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs; + oggbs->pUserData = &pFlac->memoryStream; + } + else +#endif + { + pFlac->bs.pUserData = &pFlac->memoryStream; + } + + return pFlac; +} + +drflac* drflac_open_memory_with_metadata(const void* data, size_t dataSize, drflac_meta_proc onMeta, void* pUserData) +{ + drflac__memory_stream memoryStream; + memoryStream.data = (const unsigned char*)data; + memoryStream.dataSize = dataSize; + memoryStream.currentReadPos = 0; + drflac* pFlac = drflac_open_with_metadata_private(drflac__on_read_memory, drflac__on_seek_memory, onMeta, drflac_container_unknown, &memoryStream, pUserData); + if (pFlac == NULL) { + return NULL; + } + + pFlac->memoryStream = memoryStream; + + // This is an awful hack... +#ifndef DR_FLAC_NO_OGG + if (pFlac->container == drflac_container_ogg) + { + drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs; + oggbs->pUserData = &pFlac->memoryStream; + } + else +#endif + { + pFlac->bs.pUserData = &pFlac->memoryStream; + } + + return pFlac; +} + + + +drflac* drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData) +{ + return drflac_open_with_metadata_private(onRead, onSeek, NULL, drflac_container_unknown, pUserData, pUserData); +} +drflac* drflac_open_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_container container, void* pUserData) +{ + return drflac_open_with_metadata_private(onRead, onSeek, NULL, container, pUserData, pUserData); +} + +drflac* drflac_open_with_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, void* pUserData) +{ + return drflac_open_with_metadata_private(onRead, onSeek, onMeta, drflac_container_unknown, pUserData, pUserData); +} +drflac* drflac_open_with_metadata_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_meta_proc onMeta, drflac_container container, void* pUserData) +{ + return drflac_open_with_metadata_private(onRead, onSeek, onMeta, container, pUserData, pUserData); +} + +void drflac_close(drflac* pFlac) +{ + if (pFlac == NULL) { + return; + } + +#ifndef DR_FLAC_NO_STDIO + // If we opened the file with drflac_open_file() we will want to close the file handle. We can know whether or not drflac_open_file() + // was used by looking at the callbacks. + if (pFlac->bs.onRead == drflac__on_read_stdio) { + fclose((FILE*)pFlac->bs.pUserData); + } + +#ifndef DR_FLAC_NO_OGG + // Need to clean up Ogg streams a bit differently due to the way the bit streaming is chained. + if (pFlac->container == drflac_container_ogg) { + drflac_assert(pFlac->bs.onRead == drflac__on_read_ogg); + drflac_oggbs* oggbs = (drflac_oggbs*)pFlac->_oggbs; + if (oggbs->onRead == drflac__on_read_stdio) { + fclose((FILE*)oggbs->pUserData); + } + } +#endif +#endif + + DRFLAC_FREE(pFlac); +} + +drflac_uint64 drflac__read_s32__misaligned(drflac* pFlac, drflac_uint64 samplesToRead, drflac_int32* bufferOut) +{ + unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFrame.header.channelAssignment); + + // We should never be calling this when the number of samples to read is >= the sample count. + drflac_assert(samplesToRead < channelCount); + drflac_assert(pFlac->currentFrame.samplesRemaining > 0 && samplesToRead <= pFlac->currentFrame.samplesRemaining); + + + drflac_uint64 samplesRead = 0; + while (samplesToRead > 0) { + drflac_uint64 totalSamplesInFrame = pFlac->currentFrame.header.blockSize * channelCount; + drflac_uint64 samplesReadFromFrameSoFar = totalSamplesInFrame - pFlac->currentFrame.samplesRemaining; + drflac_uint64 channelIndex = samplesReadFromFrameSoFar % channelCount; + + drflac_uint64 nextSampleInFrame = samplesReadFromFrameSoFar / channelCount; + + int decodedSample = 0; + switch (pFlac->currentFrame.header.channelAssignment) + { + case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE: + { + if (channelIndex == 0) { + decodedSample = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample; + } else { + int side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample; + int left = pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex - 1].wastedBitsPerSample; + decodedSample = left - side; + } + } break; + + case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE: + { + if (channelIndex == 0) { + int side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample; + int right = pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 1].wastedBitsPerSample; + decodedSample = side + right; + } else { + decodedSample = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample; + } + } break; + + case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE: + { + int mid; + int side; + if (channelIndex == 0) { + mid = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample; + side = pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 1].wastedBitsPerSample; + + mid = (((unsigned int)mid) << 1) | (side & 0x01); + decodedSample = (mid + side) >> 1; + } else { + mid = pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex - 1].wastedBitsPerSample; + side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample; + + mid = (((unsigned int)mid) << 1) | (side & 0x01); + decodedSample = (mid - side) >> 1; + } + } break; + + case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT: + default: + { + decodedSample = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample; + } break; + } + + + decodedSample <<= (32 - pFlac->bitsPerSample); + + if (bufferOut) { + *bufferOut++ = decodedSample; + } + + samplesRead += 1; + pFlac->currentFrame.samplesRemaining -= 1; + samplesToRead -= 1; + } + + return samplesRead; +} + +drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac_int32* bufferOut) +{ + // Note that is allowed to be null, in which case this will act like a seek. + if (pFlac == NULL || samplesToRead == 0) { + return 0; + } + + if (bufferOut == NULL) { + return drflac__seek_forward_by_samples(pFlac, samplesToRead); + } + + + drflac_uint64 samplesRead = 0; + while (samplesToRead > 0) { + // If we've run out of samples in this frame, go to the next. + if (pFlac->currentFrame.samplesRemaining == 0) { + if (!drflac__read_and_decode_next_flac_frame(pFlac)) { + break; // Couldn't read the next frame, so just break from the loop and return. + } + } else { + // Here is where we grab the samples and interleave them. + + unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFrame.header.channelAssignment); + drflac_uint64 totalSamplesInFrame = pFlac->currentFrame.header.blockSize * channelCount; + drflac_uint64 samplesReadFromFrameSoFar = totalSamplesInFrame - pFlac->currentFrame.samplesRemaining; + + drflac_uint64 misalignedSampleCount = samplesReadFromFrameSoFar % channelCount; + if (misalignedSampleCount > 0) { + drflac_uint64 misalignedSamplesRead = drflac__read_s32__misaligned(pFlac, misalignedSampleCount, bufferOut); + samplesRead += misalignedSamplesRead; + samplesReadFromFrameSoFar += misalignedSamplesRead; + bufferOut += misalignedSamplesRead; + samplesToRead -= misalignedSamplesRead; + pFlac->currentSample += misalignedSamplesRead; + } + + + drflac_uint64 alignedSampleCountPerChannel = samplesToRead / channelCount; + if (alignedSampleCountPerChannel > pFlac->currentFrame.samplesRemaining / channelCount) { + alignedSampleCountPerChannel = pFlac->currentFrame.samplesRemaining / channelCount; + } + + drflac_uint64 firstAlignedSampleInFrame = samplesReadFromFrameSoFar / channelCount; + unsigned int unusedBitsPerSample = 32 - pFlac->bitsPerSample; + + switch (pFlac->currentFrame.header.channelAssignment) + { + case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE: + { + const drflac_int32* pDecodedSamples0 = pFlac->currentFrame.subframes[0].pDecodedSamples + firstAlignedSampleInFrame; + const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame; + + for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) { + int left = pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample); + int side = pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample); + int right = left - side; + + bufferOut[i*2+0] = left; + bufferOut[i*2+1] = right; + } + } break; + + case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE: + { + const drflac_int32* pDecodedSamples0 = pFlac->currentFrame.subframes[0].pDecodedSamples + firstAlignedSampleInFrame; + const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame; + + for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) { + int side = pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample); + int right = pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample); + int left = right + side; + + bufferOut[i*2+0] = left; + bufferOut[i*2+1] = right; + } + } break; + + case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE: + { + const drflac_int32* pDecodedSamples0 = pFlac->currentFrame.subframes[0].pDecodedSamples + firstAlignedSampleInFrame; + const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame; + + for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) { + int mid = pDecodedSamples0[i] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int side = pDecodedSamples1[i] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + + mid = (((drflac_uint32)mid) << 1) | (side & 0x01); + + bufferOut[i*2+0] = ((mid + side) >> 1) << (unusedBitsPerSample); + bufferOut[i*2+1] = ((mid - side) >> 1) << (unusedBitsPerSample); + } + } break; + + case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT: + default: + { + if (pFlac->currentFrame.header.channelAssignment == 1) // 1 = Stereo + { + // Stereo optimized inner loop unroll. + const drflac_int32* pDecodedSamples0 = pFlac->currentFrame.subframes[0].pDecodedSamples + firstAlignedSampleInFrame; + const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame; + + for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) { + bufferOut[i*2+0] = pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample); + bufferOut[i*2+1] = pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample); + } + } + else + { + // Generic interleaving. + for (drflac_uint64 i = 0; i < alignedSampleCountPerChannel; ++i) { + for (unsigned int j = 0; j < channelCount; ++j) { + bufferOut[(i*channelCount)+j] = (pFlac->currentFrame.subframes[j].pDecodedSamples[firstAlignedSampleInFrame + i]) << (unusedBitsPerSample + pFlac->currentFrame.subframes[j].wastedBitsPerSample); + } + } + } + } break; + } + + drflac_uint64 alignedSamplesRead = alignedSampleCountPerChannel * channelCount; + samplesRead += alignedSamplesRead; + samplesReadFromFrameSoFar += alignedSamplesRead; + bufferOut += alignedSamplesRead; + samplesToRead -= alignedSamplesRead; + pFlac->currentSample += alignedSamplesRead; + pFlac->currentFrame.samplesRemaining -= (unsigned int)alignedSamplesRead; + + + // At this point we may still have some excess samples left to read. + if (samplesToRead > 0 && pFlac->currentFrame.samplesRemaining > 0) { + drflac_uint64 excessSamplesRead = 0; + if (samplesToRead < pFlac->currentFrame.samplesRemaining) { + excessSamplesRead = drflac__read_s32__misaligned(pFlac, samplesToRead, bufferOut); + } else { + excessSamplesRead = drflac__read_s32__misaligned(pFlac, pFlac->currentFrame.samplesRemaining, bufferOut); + } + + samplesRead += excessSamplesRead; + samplesReadFromFrameSoFar += excessSamplesRead; + bufferOut += excessSamplesRead; + samplesToRead -= excessSamplesRead; + pFlac->currentSample += excessSamplesRead; + } + } + } + + return samplesRead; +} + +drflac_uint64 drflac_read_pcm_frames_s32(drflac* pFlac, drflac_uint64 framesToRead, drflac_int32* pBufferOut) +{ +#if defined(_MSC_VER) && !defined(__clang__) + #pragma warning(push) + #pragma warning(disable:4996) // was declared deprecated +#elif defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + return drflac_read_s32(pFlac, framesToRead*pFlac->channels, pBufferOut) / pFlac->channels; +#if defined(_MSC_VER) && !defined(__clang__) + #pragma warning(pop) +#elif defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop +#endif +} + + +drflac_uint64 drflac_read_s16(drflac* pFlac, drflac_uint64 samplesToRead, drflac_int16* pBufferOut) +{ + // This reads samples in 2 passes and can probably be optimized. + drflac_uint64 totalSamplesRead = 0; + +#if defined(_MSC_VER) && !defined(__clang__) + #pragma warning(push) + #pragma warning(disable:4996) // was declared deprecated +#elif defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + + while (samplesToRead > 0) { + drflac_int32 samples32[4096]; + drflac_uint64 samplesJustRead = drflac_read_s32(pFlac, (samplesToRead > 4096) ? 4096 : samplesToRead, samples32); + if (samplesJustRead == 0) { + break; // Reached the end. + } + + // s32 -> s16 + for (drflac_uint64 i = 0; i < samplesJustRead; ++i) { + pBufferOut[i] = (drflac_int16)(samples32[i] >> 16); + } + + totalSamplesRead += samplesJustRead; + samplesToRead -= samplesJustRead; + pBufferOut += samplesJustRead; + } + +#if defined(_MSC_VER) && !defined(__clang__) + #pragma warning(pop) +#elif defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop +#endif + + return totalSamplesRead; +} + +drflac_uint64 drflac_read_pcm_frames_s16(drflac* pFlac, drflac_uint64 framesToRead, drflac_int16* pBufferOut) +{ + // This reads samples in 2 passes and can probably be optimized. + drflac_uint64 totalPCMFramesRead = 0; + + while (framesToRead > 0) { + drflac_int32 samples32[4096]; + drflac_uint64 framesJustRead = drflac_read_pcm_frames_s32(pFlac, (framesToRead > 4096/pFlac->channels) ? 4096/pFlac->channels : framesToRead, samples32); + if (framesJustRead == 0) { + break; // Reached the end. + } + + // s32 -> s16 + for (drflac_uint64 iFrame = 0; iFrame < framesJustRead; ++iFrame) { + for (drflac_uint32 iChannel = 0; iChannel < pFlac->channels; ++iChannel) { + drflac_uint64 iSample = iFrame*pFlac->channels + iChannel; + pBufferOut[iSample] = (drflac_int16)(samples32[iSample] >> 16); + } + } + + totalPCMFramesRead += framesJustRead; + framesToRead -= framesJustRead; + pBufferOut += framesJustRead * pFlac->channels; + } + + return totalPCMFramesRead; +} + + +drflac_uint64 drflac_read_f32(drflac* pFlac, drflac_uint64 samplesToRead, float* pBufferOut) +{ + // This reads samples in 2 passes and can probably be optimized. + drflac_uint64 totalSamplesRead = 0; + +#if defined(_MSC_VER) && !defined(__clang__) + #pragma warning(push) + #pragma warning(disable:4996) // was declared deprecated +#elif defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + + while (samplesToRead > 0) { + drflac_int32 samples32[4096]; + drflac_uint64 samplesJustRead = drflac_read_s32(pFlac, (samplesToRead > 4096) ? 4096 : samplesToRead, samples32); + if (samplesJustRead == 0) { + break; // Reached the end. + } + + // s32 -> f32 + for (drflac_uint64 i = 0; i < samplesJustRead; ++i) { + pBufferOut[i] = (float)(samples32[i] / 2147483648.0); + } + + totalSamplesRead += samplesJustRead; + samplesToRead -= samplesJustRead; + pBufferOut += samplesJustRead; + } + +#if defined(_MSC_VER) && !defined(__clang__) + #pragma warning(pop) +#elif defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop +#endif + + return totalSamplesRead; +} + +#if 0 +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + for (drflac_uint64 i = 0; i < frameCount; ++i) { + int left = pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample); + int side = pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample); + int right = left - side; + + pOutputSamples[i*2+0] = (float)(left / 2147483648.0); + pOutputSamples[i*2+1] = (float)(right / 2147483648.0); + } +} +#endif + +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + drflac_uint64 frameCount4 = frameCount >> 2; + + float factor = 1 / 2147483648.0; + + drflac_int32 shift0 = unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample; + drflac_int32 shift1 = unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample; + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + drflac_int32 left0 = pInputSamples0[i*4+0] << shift0; + drflac_int32 left1 = pInputSamples0[i*4+1] << shift0; + drflac_int32 left2 = pInputSamples0[i*4+2] << shift0; + drflac_int32 left3 = pInputSamples0[i*4+3] << shift0; + + drflac_int32 side0 = pInputSamples1[i*4+0] << shift1; + drflac_int32 side1 = pInputSamples1[i*4+1] << shift1; + drflac_int32 side2 = pInputSamples1[i*4+2] << shift1; + drflac_int32 side3 = pInputSamples1[i*4+3] << shift1; + + drflac_int32 right0 = left0 - side0; + drflac_int32 right1 = left1 - side1; + drflac_int32 right2 = left2 - side2; + drflac_int32 right3 = left3 - side3; + + pOutputSamples[i*8+0] = left0 * factor; + pOutputSamples[i*8+1] = right0 * factor; + pOutputSamples[i*8+2] = left1 * factor; + pOutputSamples[i*8+3] = right1 * factor; + pOutputSamples[i*8+4] = left2 * factor; + pOutputSamples[i*8+5] = right2 * factor; + pOutputSamples[i*8+6] = left3 * factor; + pOutputSamples[i*8+7] = right3 * factor; + } + + for (drflac_uint64 i = (frameCount4 << 2); i < frameCount; ++i) { + int left = pInputSamples0[i] << shift0; + int side = pInputSamples1[i] << shift1; + int right = left - side; + + pOutputSamples[i*2+0] = (float)(left * factor); + pOutputSamples[i*2+1] = (float)(right * factor); + } +} + +#if defined(DRFLAC_SUPPORT_SSE2) +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + drflac_assert(pFlac->bitsPerSample <= 24); + + drflac_uint64 frameCount4 = frameCount >> 2; + + __m128 factor = _mm_set1_ps(1.0f / 8388608.0f); + int shift0 = (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample) - 8; + int shift1 = (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample) - 8; + + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + __m128i inputSample0 = _mm_loadu_si128((const __m128i*)pInputSamples0 + i); + __m128i inputSample1 = _mm_loadu_si128((const __m128i*)pInputSamples1 + i); + + __m128i left = _mm_slli_epi32(inputSample0, shift0); + __m128i side = _mm_slli_epi32(inputSample1, shift1); + __m128i right = _mm_sub_epi32(left, side); + __m128 leftf = _mm_mul_ps(_mm_cvtepi32_ps(left), factor); + __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(right), factor); + + pOutputSamples[i*8+0] = ((float*)&leftf)[0]; + pOutputSamples[i*8+1] = ((float*)&rightf)[0]; + pOutputSamples[i*8+2] = ((float*)&leftf)[1]; + pOutputSamples[i*8+3] = ((float*)&rightf)[1]; + pOutputSamples[i*8+4] = ((float*)&leftf)[2]; + pOutputSamples[i*8+5] = ((float*)&rightf)[2]; + pOutputSamples[i*8+6] = ((float*)&leftf)[3]; + pOutputSamples[i*8+7] = ((float*)&rightf)[3]; + } + + for (drflac_uint64 i = (frameCount4 << 2); i < frameCount; ++i) { + int left = pInputSamples0[i] << shift0; + int side = pInputSamples1[i] << shift1; + int right = left - side; + + pOutputSamples[i*2+0] = (float)(left / 8388608.0f); + pOutputSamples[i*2+1] = (float)(right / 8388608.0f); + } +} +#endif + +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_left_side(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ +#if defined(DRFLAC_SUPPORT_SSE2) + if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { + drflac_read_pcm_frames_f32__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); + } else +#endif + { + // Scalar fallback. +#if 0 + drflac_read_pcm_frames_f32__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); +#else + drflac_read_pcm_frames_f32__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); +#endif + } +} + + +#if 0 +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + for (drflac_uint64 i = 0; i < frameCount; ++i) { + int side = pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample); + int right = pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample); + int left = right + side; + + pOutputSamples[i*2+0] = (float)(left / 2147483648.0); + pOutputSamples[i*2+1] = (float)(right / 2147483648.0); + } +} +#endif + +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + drflac_uint64 frameCount4 = frameCount >> 2; + + float factor = 1 / 2147483648.0; + + drflac_int32 shift0 = unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample; + drflac_int32 shift1 = unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample; + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + drflac_int32 side0 = pInputSamples0[i*4+0] << shift0; + drflac_int32 side1 = pInputSamples0[i*4+1] << shift0; + drflac_int32 side2 = pInputSamples0[i*4+2] << shift0; + drflac_int32 side3 = pInputSamples0[i*4+3] << shift0; + + drflac_int32 right0 = pInputSamples1[i*4+0] << shift1; + drflac_int32 right1 = pInputSamples1[i*4+1] << shift1; + drflac_int32 right2 = pInputSamples1[i*4+2] << shift1; + drflac_int32 right3 = pInputSamples1[i*4+3] << shift1; + + drflac_int32 left0 = right0 + side0; + drflac_int32 left1 = right1 + side1; + drflac_int32 left2 = right2 + side2; + drflac_int32 left3 = right3 + side3; + + pOutputSamples[i*8+0] = left0 * factor; + pOutputSamples[i*8+1] = right0 * factor; + pOutputSamples[i*8+2] = left1 * factor; + pOutputSamples[i*8+3] = right1 * factor; + pOutputSamples[i*8+4] = left2 * factor; + pOutputSamples[i*8+5] = right2 * factor; + pOutputSamples[i*8+6] = left3 * factor; + pOutputSamples[i*8+7] = right3 * factor; + } + + for (drflac_uint64 i = (frameCount4 << 2); i < frameCount; ++i) { + int side = pInputSamples0[i] << shift0; + int right = pInputSamples1[i] << shift1; + int left = right + side; + + pOutputSamples[i*2+0] = (float)(left * factor); + pOutputSamples[i*2+1] = (float)(right * factor); + } +} + +#if defined(DRFLAC_SUPPORT_SSE2) +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + drflac_assert(pFlac->bitsPerSample <= 24); + + drflac_uint64 frameCount4 = frameCount >> 2; + + __m128 factor = _mm_set1_ps(1.0f / 8388608.0f); + int shift0 = (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample) - 8; + int shift1 = (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample) - 8; + + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + __m128i inputSample0 = _mm_loadu_si128((const __m128i*)pInputSamples0 + i); + __m128i inputSample1 = _mm_loadu_si128((const __m128i*)pInputSamples1 + i); + + __m128i side = _mm_slli_epi32(inputSample0, shift0); + __m128i right = _mm_slli_epi32(inputSample1, shift1); + __m128i left = _mm_add_epi32(right, side); + __m128 leftf = _mm_mul_ps(_mm_cvtepi32_ps(left), factor); + __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(right), factor); + + pOutputSamples[i*8+0] = ((float*)&leftf)[0]; + pOutputSamples[i*8+1] = ((float*)&rightf)[0]; + pOutputSamples[i*8+2] = ((float*)&leftf)[1]; + pOutputSamples[i*8+3] = ((float*)&rightf)[1]; + pOutputSamples[i*8+4] = ((float*)&leftf)[2]; + pOutputSamples[i*8+5] = ((float*)&rightf)[2]; + pOutputSamples[i*8+6] = ((float*)&leftf)[3]; + pOutputSamples[i*8+7] = ((float*)&rightf)[3]; + } + + for (drflac_uint64 i = (frameCount4 << 2); i < frameCount; ++i) { + int side = pInputSamples0[i] << shift0; + int right = pInputSamples1[i] << shift1; + int left = right + side; + + pOutputSamples[i*2+0] = (float)(left / 8388608.0f); + pOutputSamples[i*2+1] = (float)(right / 8388608.0f); + } +} +#endif + +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_right_side(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ +#if defined(DRFLAC_SUPPORT_SSE2) + if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { + drflac_read_pcm_frames_f32__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); + } else +#endif + { + // Scalar fallback. +#if 0 + drflac_read_pcm_frames_f32__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); +#else + drflac_read_pcm_frames_f32__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); +#endif + } +} + + +#if 0 +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + for (drflac_uint64 i = 0; i < frameCount; ++i) { + int mid = pInputSamples0[i] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int side = pInputSamples1[i] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + + mid = (((drflac_uint32)mid) << 1) | (side & 0x01); + + pOutputSamples[i*2+0] = (float)((((mid + side) >> 1) << (unusedBitsPerSample)) / 2147483648.0); + pOutputSamples[i*2+1] = (float)((((mid - side) >> 1) << (unusedBitsPerSample)) / 2147483648.0); + } +} +#endif + +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + drflac_uint64 frameCount4 = frameCount >> 2; + + float factor = 1 / 2147483648.0; + + int shift = unusedBitsPerSample; + if (shift > 0) { + shift -= 1; + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + int mid0 = pInputSamples0[i*4+0] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int mid1 = pInputSamples0[i*4+1] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int mid2 = pInputSamples0[i*4+2] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int mid3 = pInputSamples0[i*4+3] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + + int side0 = pInputSamples1[i*4+0] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + int side1 = pInputSamples1[i*4+1] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + int side2 = pInputSamples1[i*4+2] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + int side3 = pInputSamples1[i*4+3] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + + mid0 = (((drflac_uint32)mid0) << 1) | (side0 & 0x01); + mid1 = (((drflac_uint32)mid1) << 1) | (side1 & 0x01); + mid2 = (((drflac_uint32)mid2) << 1) | (side2 & 0x01); + mid3 = (((drflac_uint32)mid3) << 1) | (side3 & 0x01); + + int temp0L = ((mid0 + side0) << shift); + int temp1L = ((mid1 + side1) << shift); + int temp2L = ((mid2 + side2) << shift); + int temp3L = ((mid3 + side3) << shift); + + int temp0R = ((mid0 - side0) << shift); + int temp1R = ((mid1 - side1) << shift); + int temp2R = ((mid2 - side2) << shift); + int temp3R = ((mid3 - side3) << shift); + + pOutputSamples[i*8+0] = (float)(temp0L * factor); + pOutputSamples[i*8+1] = (float)(temp0R * factor); + pOutputSamples[i*8+2] = (float)(temp1L * factor); + pOutputSamples[i*8+3] = (float)(temp1R * factor); + pOutputSamples[i*8+4] = (float)(temp2L * factor); + pOutputSamples[i*8+5] = (float)(temp2R * factor); + pOutputSamples[i*8+6] = (float)(temp3L * factor); + pOutputSamples[i*8+7] = (float)(temp3R * factor); + } + } else { + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + int mid0 = pInputSamples0[i*4+0] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int mid1 = pInputSamples0[i*4+1] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int mid2 = pInputSamples0[i*4+2] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int mid3 = pInputSamples0[i*4+3] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + + int side0 = pInputSamples1[i*4+0] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + int side1 = pInputSamples1[i*4+1] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + int side2 = pInputSamples1[i*4+2] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + int side3 = pInputSamples1[i*4+3] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + + mid0 = (((drflac_uint32)mid0) << 1) | (side0 & 0x01); + mid1 = (((drflac_uint32)mid1) << 1) | (side1 & 0x01); + mid2 = (((drflac_uint32)mid2) << 1) | (side2 & 0x01); + mid3 = (((drflac_uint32)mid3) << 1) | (side3 & 0x01); + + int temp0L = ((mid0 + side0) >> 1); + int temp1L = ((mid1 + side1) >> 1); + int temp2L = ((mid2 + side2) >> 1); + int temp3L = ((mid3 + side3) >> 1); + + int temp0R = ((mid0 - side0) >> 1); + int temp1R = ((mid1 - side1) >> 1); + int temp2R = ((mid2 - side2) >> 1); + int temp3R = ((mid3 - side3) >> 1); + + pOutputSamples[i*8+0] = (float)(temp0L * factor); + pOutputSamples[i*8+1] = (float)(temp0R * factor); + pOutputSamples[i*8+2] = (float)(temp1L * factor); + pOutputSamples[i*8+3] = (float)(temp1R * factor); + pOutputSamples[i*8+4] = (float)(temp2L * factor); + pOutputSamples[i*8+5] = (float)(temp2R * factor); + pOutputSamples[i*8+6] = (float)(temp3L * factor); + pOutputSamples[i*8+7] = (float)(temp3R * factor); + } + } + + for (drflac_uint64 i = (frameCount4 << 2); i < frameCount; ++i) { + int mid = pInputSamples0[i] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int side = pInputSamples1[i] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + + mid = (((drflac_uint32)mid) << 1) | (side & 0x01); + + pOutputSamples[i*2+0] = (float)((((mid + side) >> 1) << unusedBitsPerSample) * factor); + pOutputSamples[i*2+1] = (float)((((mid - side) >> 1) << unusedBitsPerSample) * factor); + } +} + +#if defined(DRFLAC_SUPPORT_SSE2) +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + drflac_assert(pFlac->bitsPerSample <= 24); + + drflac_uint64 frameCount4 = frameCount >> 2; + + float factor = 1.0f / 8388608.0f; + __m128 factor128 = _mm_set1_ps(1.0f / 8388608.0f); + + int shift = unusedBitsPerSample - 8; + if (shift == 0) { + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + __m128i inputSample0 = _mm_loadu_si128((const __m128i*)pInputSamples0 + i); + __m128i inputSample1 = _mm_loadu_si128((const __m128i*)pInputSamples1 + i); + + __m128i mid = _mm_slli_epi32(inputSample0, pFlac->currentFrame.subframes[0].wastedBitsPerSample); + __m128i side = _mm_slli_epi32(inputSample1, pFlac->currentFrame.subframes[1].wastedBitsPerSample); + + mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01))); + + __m128i tempL = _mm_add_epi32(mid, side); + __m128i tempR = _mm_sub_epi32(mid, side); + + // Signed bit shift. + tempL = _mm_or_si128(_mm_srli_epi32(tempL, 1), _mm_and_si128(tempL, _mm_set1_epi32(0x80000000))); + tempR = _mm_or_si128(_mm_srli_epi32(tempR, 1), _mm_and_si128(tempR, _mm_set1_epi32(0x80000000))); + + __m128 leftf = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128); + __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128); + + pOutputSamples[i*8+0] = ((float*)&leftf)[0]; + pOutputSamples[i*8+1] = ((float*)&rightf)[0]; + pOutputSamples[i*8+2] = ((float*)&leftf)[1]; + pOutputSamples[i*8+3] = ((float*)&rightf)[1]; + pOutputSamples[i*8+4] = ((float*)&leftf)[2]; + pOutputSamples[i*8+5] = ((float*)&rightf)[2]; + pOutputSamples[i*8+6] = ((float*)&leftf)[3]; + pOutputSamples[i*8+7] = ((float*)&rightf)[3]; + } + + for (drflac_uint64 i = (frameCount4 << 2); i < frameCount; ++i) { + int mid = pInputSamples0[i] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int side = pInputSamples1[i] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + + mid = (((drflac_uint32)mid) << 1) | (side & 0x01); + + pOutputSamples[i*2+0] = (float)(((mid + side) >> 1) * factor); + pOutputSamples[i*2+1] = (float)(((mid - side) >> 1) * factor); + } + } else { + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + __m128i inputSample0 = _mm_loadu_si128((const __m128i*)pInputSamples0 + i); + __m128i inputSample1 = _mm_loadu_si128((const __m128i*)pInputSamples1 + i); + + __m128i mid = _mm_slli_epi32(inputSample0, pFlac->currentFrame.subframes[0].wastedBitsPerSample); + __m128i side = _mm_slli_epi32(inputSample1, pFlac->currentFrame.subframes[1].wastedBitsPerSample); + + mid = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01))); + + __m128i tempL = _mm_slli_epi32(_mm_srli_epi32(_mm_add_epi32(mid, side), 1), shift); + __m128i tempR = _mm_slli_epi32(_mm_srli_epi32(_mm_sub_epi32(mid, side), 1), shift); + + __m128 leftf = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128); + __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128); + + pOutputSamples[i*8+0] = ((float*)&leftf)[0]; + pOutputSamples[i*8+1] = ((float*)&rightf)[0]; + pOutputSamples[i*8+2] = ((float*)&leftf)[1]; + pOutputSamples[i*8+3] = ((float*)&rightf)[1]; + pOutputSamples[i*8+4] = ((float*)&leftf)[2]; + pOutputSamples[i*8+5] = ((float*)&rightf)[2]; + pOutputSamples[i*8+6] = ((float*)&leftf)[3]; + pOutputSamples[i*8+7] = ((float*)&rightf)[3]; + } + + for (drflac_uint64 i = (frameCount4 << 2); i < frameCount; ++i) { + int mid = pInputSamples0[i] << pFlac->currentFrame.subframes[0].wastedBitsPerSample; + int side = pInputSamples1[i] << pFlac->currentFrame.subframes[1].wastedBitsPerSample; + + mid = (((drflac_uint32)mid) << 1) | (side & 0x01); + + pOutputSamples[i*2+0] = (float)((((mid + side) >> 1) << shift) * factor); + pOutputSamples[i*2+1] = (float)((((mid - side) >> 1) << shift) * factor); + } + } +} +#endif + + +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_mid_side(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ +#if defined(DRFLAC_SUPPORT_SSE2) + if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { + drflac_read_pcm_frames_f32__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); + } else +#endif + { + // Scalar fallback. +#if 0 + drflac_read_pcm_frames_f32__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); +#else + drflac_read_pcm_frames_f32__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); +#endif + } +} + +#if 0 +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__reference(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + for (drflac_uint64 i = 0; i < frameCount; ++i) { + pOutputSamples[i*2+0] = (float)((pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample)) / 2147483648.0); + pOutputSamples[i*2+1] = (float)((pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample)) / 2147483648.0); + } +} +#endif + +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__scalar(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + drflac_uint64 frameCount4 = frameCount >> 2; + + float factor = 1 / 2147483648.0; + + int shift0 = (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample); + int shift1 = (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample); + + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + int tempL0 = pInputSamples0[i*4+0] << shift0; + int tempL1 = pInputSamples0[i*4+1] << shift0; + int tempL2 = pInputSamples0[i*4+2] << shift0; + int tempL3 = pInputSamples0[i*4+3] << shift0; + + int tempR0 = pInputSamples1[i*4+0] << shift1; + int tempR1 = pInputSamples1[i*4+1] << shift1; + int tempR2 = pInputSamples1[i*4+2] << shift1; + int tempR3 = pInputSamples1[i*4+3] << shift1; + + pOutputSamples[i*8+0] = (float)(tempL0 * factor); + pOutputSamples[i*8+1] = (float)(tempR0 * factor); + pOutputSamples[i*8+2] = (float)(tempL1 * factor); + pOutputSamples[i*8+3] = (float)(tempR1 * factor); + pOutputSamples[i*8+4] = (float)(tempL2 * factor); + pOutputSamples[i*8+5] = (float)(tempR2 * factor); + pOutputSamples[i*8+6] = (float)(tempL3 * factor); + pOutputSamples[i*8+7] = (float)(tempR3 * factor); + } + + for (drflac_uint64 i = (frameCount4 << 2); i < frameCount; ++i) { + pOutputSamples[i*2+0] = (float)((pInputSamples0[i] << shift0) * factor); + pOutputSamples[i*2+1] = (float)((pInputSamples1[i] << shift1) * factor); + } +} + +#if defined(DRFLAC_SUPPORT_SSE2) +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo__sse2(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ + drflac_uint64 frameCount4 = frameCount >> 2; + + float factor = 1.0f / 8388608.0f; + __m128 factor128 = _mm_set1_ps(1.0f / 8388608.0f); + + int shift0 = (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample) - 8; + int shift1 = (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample) - 8; + + for (drflac_uint64 i = 0; i < frameCount4; ++i) { + __m128i inputSample0 = _mm_loadu_si128((const __m128i*)pInputSamples0 + i); + __m128i inputSample1 = _mm_loadu_si128((const __m128i*)pInputSamples1 + i); + + __m128i i32L = _mm_slli_epi32(inputSample0, shift0); + __m128i i32R = _mm_slli_epi32(inputSample1, shift1); + + __m128 f32L = _mm_mul_ps(_mm_cvtepi32_ps(i32L), factor128); + __m128 f32R = _mm_mul_ps(_mm_cvtepi32_ps(i32R), factor128); + + pOutputSamples[i*8+0] = ((float*)&f32L)[0]; + pOutputSamples[i*8+1] = ((float*)&f32R)[0]; + pOutputSamples[i*8+2] = ((float*)&f32L)[1]; + pOutputSamples[i*8+3] = ((float*)&f32R)[1]; + pOutputSamples[i*8+4] = ((float*)&f32L)[2]; + pOutputSamples[i*8+5] = ((float*)&f32R)[2]; + pOutputSamples[i*8+6] = ((float*)&f32L)[3]; + pOutputSamples[i*8+7] = ((float*)&f32R)[3]; + } + + for (drflac_uint64 i = (frameCount4 << 2); i < frameCount; ++i) { + pOutputSamples[i*2+0] = (float)((pInputSamples0[i] << shift0) * factor); + pOutputSamples[i*2+1] = (float)((pInputSamples1[i] << shift1) * factor); + } +} +#endif + +static DRFLAC_INLINE void drflac_read_pcm_frames_f32__decode_independent_stereo(drflac* pFlac, drflac_uint64 frameCount, drflac_int32 unusedBitsPerSample, const drflac_int32* pInputSamples0, const drflac_int32* pInputSamples1, float* pOutputSamples) +{ +#if defined(DRFLAC_SUPPORT_SSE2) + if (drflac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) { + drflac_read_pcm_frames_f32__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); + } else +#endif + { + // Scalar fallback. +#if 0 + drflac_read_pcm_frames_f32__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); +#else + drflac_read_pcm_frames_f32__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples); +#endif + } +} + +drflac_uint64 drflac_read_pcm_frames_f32(drflac* pFlac, drflac_uint64 framesToRead, float* pBufferOut) +{ + if (pFlac == NULL || framesToRead == 0) { + return 0; + } + + if (pBufferOut == NULL) { + return drflac__seek_forward_by_pcm_frames(pFlac, framesToRead); + } + + drflac_uint64 framesRead = 0; + while (framesToRead > 0) { + // If we've run out of samples in this frame, go to the next. + if (pFlac->currentFrame.samplesRemaining == 0) { + if (!drflac__read_and_decode_next_flac_frame(pFlac)) { + break; // Couldn't read the next frame, so just break from the loop and return. + } + } else { + unsigned int channelCount = drflac__get_channel_count_from_channel_assignment(pFlac->currentFrame.header.channelAssignment); + drflac_uint64 totalFramesInPacket = pFlac->currentFrame.header.blockSize; + drflac_uint64 framesReadFromPacketSoFar = totalFramesInPacket - (pFlac->currentFrame.samplesRemaining/channelCount); + drflac_uint64 iFirstPCMFrame = framesReadFromPacketSoFar; + drflac_int32 unusedBitsPerSample = 32 - pFlac->bitsPerSample; + + drflac_uint64 frameCountThisIteration = framesToRead; + if (frameCountThisIteration > pFlac->currentFrame.samplesRemaining / channelCount) { + frameCountThisIteration = pFlac->currentFrame.samplesRemaining / channelCount; + } + + if (channelCount == 2) { + const drflac_int32* pDecodedSamples0 = pFlac->currentFrame.subframes[0].pDecodedSamples + iFirstPCMFrame; + const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + iFirstPCMFrame; + + switch (pFlac->currentFrame.header.channelAssignment) + { + case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE: + { + drflac_read_pcm_frames_f32__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); + } break; + + case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE: + { + drflac_read_pcm_frames_f32__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); + } break; + + case DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE: + { + drflac_read_pcm_frames_f32__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); + } break; + + case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT: + default: + { + drflac_read_pcm_frames_f32__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut); + } break; + } + } else { + // Generic interleaving. + for (drflac_uint64 i = 0; i < frameCountThisIteration; ++i) { + for (unsigned int j = 0; j < channelCount; ++j) { + pBufferOut[(i*channelCount)+j] = (float)(((pFlac->currentFrame.subframes[j].pDecodedSamples[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFrame.subframes[j].wastedBitsPerSample)) / 2147483648.0); + } + } + } + + drflac_uint64 samplesReadThisIteration = frameCountThisIteration * channelCount; + framesRead += frameCountThisIteration; + framesReadFromPacketSoFar += frameCountThisIteration; + pBufferOut += samplesReadThisIteration; + framesToRead -= frameCountThisIteration; + pFlac->currentSample += samplesReadThisIteration; + pFlac->currentFrame.samplesRemaining -= (unsigned int)samplesReadThisIteration; + } + } + + return framesRead; +} + +drflac_bool32 drflac_seek_to_sample(drflac* pFlac, drflac_uint64 sampleIndex) +{ + if (pFlac == NULL) { + return DRFLAC_FALSE; + } + + // If we don't know where the first frame begins then we can't seek. This will happen when the STREAMINFO block was not present + // when the decoder was opened. + if (pFlac->firstFramePos == 0) { + return DRFLAC_FALSE; + } + + if (sampleIndex == 0) { + pFlac->currentSample = 0; + return drflac__seek_to_first_frame(pFlac); + } else { + drflac_bool32 wasSuccessful = DRFLAC_FALSE; + + // Clamp the sample to the end. + if (sampleIndex >= pFlac->totalSampleCount) { + sampleIndex = pFlac->totalSampleCount - 1; + } + + // If the target sample and the current sample are in the same frame we just move the position forward. + if (sampleIndex > pFlac->currentSample) { + // Forward. + drflac_uint32 offset = (drflac_uint32)(sampleIndex - pFlac->currentSample); + if (pFlac->currentFrame.samplesRemaining > offset) { + pFlac->currentFrame.samplesRemaining -= offset; + pFlac->currentSample = sampleIndex; + return DRFLAC_TRUE; + } + } else { + // Backward. + drflac_uint32 offsetAbs = (drflac_uint32)(pFlac->currentSample - sampleIndex); + drflac_uint32 currentFrameSampleCount = pFlac->currentFrame.header.blockSize * drflac__get_channel_count_from_channel_assignment(pFlac->currentFrame.header.channelAssignment); + drflac_uint32 currentFrameSamplesConsumed = (drflac_uint32)(currentFrameSampleCount - pFlac->currentFrame.samplesRemaining); + if (currentFrameSamplesConsumed > offsetAbs) { + pFlac->currentFrame.samplesRemaining += offsetAbs; + pFlac->currentSample = sampleIndex; + return DRFLAC_TRUE; + } + } + + // Different techniques depending on encapsulation. Using the native FLAC seektable with Ogg encapsulation is a bit awkward so + // we'll instead use Ogg's natural seeking facility. +#ifndef DR_FLAC_NO_OGG + if (pFlac->container == drflac_container_ogg) + { + wasSuccessful = drflac_ogg__seek_to_sample(pFlac, sampleIndex); + } + else +#endif + { + // First try seeking via the seek table. If this fails, fall back to a brute force seek which is much slower. + wasSuccessful = drflac__seek_to_sample__seek_table(pFlac, sampleIndex); + if (!wasSuccessful) { + wasSuccessful = drflac__seek_to_sample__brute_force(pFlac, sampleIndex); + } + } + + pFlac->currentSample = sampleIndex; + return wasSuccessful; + } +} + +drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex) +{ + if (pFlac == NULL) { + return DRFLAC_FALSE; + } + + // If we don't know where the first frame begins then we can't seek. This will happen when the STREAMINFO block was not present + // when the decoder was opened. + if (pFlac->firstFramePos == 0) { + return DRFLAC_FALSE; + } + + if (pcmFrameIndex == 0) { + pFlac->currentSample = 0; + return drflac__seek_to_first_frame(pFlac); + } else { + drflac_bool32 wasSuccessful = DRFLAC_FALSE; + + // Clamp the sample to the end. + if (pcmFrameIndex >= pFlac->totalPCMFrameCount) { + pcmFrameIndex = pFlac->totalPCMFrameCount - 1; + } + + // If the target sample and the current sample are in the same frame we just move the position forward. + if (pcmFrameIndex*pFlac->channels > pFlac->currentSample) { + // Forward. + drflac_uint32 offset = (drflac_uint32)(pcmFrameIndex*pFlac->channels - pFlac->currentSample); + if (pFlac->currentFrame.samplesRemaining > offset) { + pFlac->currentFrame.samplesRemaining -= offset; + pFlac->currentSample = pcmFrameIndex*pFlac->channels; + return DRFLAC_TRUE; + } + } else { + // Backward. + drflac_uint32 offsetAbs = (drflac_uint32)(pFlac->currentSample - pcmFrameIndex*pFlac->channels); + drflac_uint32 currentFrameSampleCount = pFlac->currentFrame.header.blockSize * drflac__get_channel_count_from_channel_assignment(pFlac->currentFrame.header.channelAssignment); + drflac_uint32 currentFrameSamplesConsumed = (drflac_uint32)(currentFrameSampleCount - pFlac->currentFrame.samplesRemaining); + if (currentFrameSamplesConsumed > offsetAbs) { + pFlac->currentFrame.samplesRemaining += offsetAbs; + pFlac->currentSample = pcmFrameIndex*pFlac->channels; + return DRFLAC_TRUE; + } + } + + // Different techniques depending on encapsulation. Using the native FLAC seektable with Ogg encapsulation is a bit awkward so + // we'll instead use Ogg's natural seeking facility. +#ifndef DR_FLAC_NO_OGG + if (pFlac->container == drflac_container_ogg) + { + wasSuccessful = drflac_ogg__seek_to_sample(pFlac, pcmFrameIndex*pFlac->channels); + } + else +#endif + { + // First try seeking via the seek table. If this fails, fall back to a brute force seek which is much slower. + wasSuccessful = drflac__seek_to_sample__seek_table(pFlac, pcmFrameIndex*pFlac->channels); + if (!wasSuccessful) { + wasSuccessful = drflac__seek_to_sample__brute_force(pFlac, pcmFrameIndex*pFlac->channels); + } + } + + pFlac->currentSample = pcmFrameIndex*pFlac->channels; + return wasSuccessful; + } +} + + + +//// High Level APIs //// + +#if defined(SIZE_MAX) + #define DRFLAC_SIZE_MAX SIZE_MAX +#else + #if defined(DRFLAC_64BIT) + #define DRFLAC_SIZE_MAX ((drflac_uint64)0xFFFFFFFFFFFFFFFF) + #else + #define DRFLAC_SIZE_MAX 0xFFFFFFFF + #endif +#endif + + +// Using a macro as the definition of the drflac__full_decode_and_close_*() API family. Sue me. +#define DRFLAC_DEFINE_FULL_READ_AND_CLOSE(extension, type) \ +static type* drflac__full_read_and_close_ ## extension (drflac* pFlac, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut)\ +{ \ + drflac_assert(pFlac != NULL); \ + \ + type* pSampleData = NULL; \ + drflac_uint64 totalPCMFrameCount = pFlac->totalPCMFrameCount; \ + \ + if (totalPCMFrameCount == 0) { \ + type buffer[4096]; \ + \ + size_t sampleDataBufferSize = sizeof(buffer); \ + pSampleData = (type*)DRFLAC_MALLOC(sampleDataBufferSize); \ + if (pSampleData == NULL) { \ + goto on_error; \ + } \ + \ + drflac_uint64 pcmFramesRead; \ + while ((pcmFramesRead = (drflac_uint64)drflac_read_pcm_frames_##extension(pFlac, sizeof(buffer)/sizeof(buffer[0])/pFlac->channels, buffer)) > 0) { \ + if (((totalPCMFrameCount + pcmFramesRead) * pFlac->channels * sizeof(type)) > sampleDataBufferSize) { \ + sampleDataBufferSize *= 2; \ + type* pNewSampleData = (type*)DRFLAC_REALLOC(pSampleData, sampleDataBufferSize); \ + if (pNewSampleData == NULL) { \ + DRFLAC_FREE(pSampleData); \ + goto on_error; \ + } \ + \ + pSampleData = pNewSampleData; \ + } \ + \ + drflac_copy_memory(pSampleData + (totalPCMFrameCount*pFlac->channels), buffer, (size_t)(pcmFramesRead*pFlac->channels*sizeof(type))); \ + totalPCMFrameCount += pcmFramesRead; \ + } \ + \ + /* At this point everything should be decoded, but we just want to fill the unused part buffer with silence - need to \ + protect those ears from random noise! */ \ + drflac_zero_memory(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \ + } else { \ + drflac_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type); \ + if (dataSize > DRFLAC_SIZE_MAX) { \ + goto on_error; /* The decoded data is too big. */ \ + } \ + \ + pSampleData = (type*)DRFLAC_MALLOC((size_t)dataSize); /* <-- Safe cast as per the check above. */ \ + if (pSampleData == NULL) { \ + goto on_error; \ + } \ + \ + totalPCMFrameCount = drflac_read_pcm_frames_##extension(pFlac, pFlac->totalPCMFrameCount, pSampleData); \ + } \ + \ + if (sampleRateOut) *sampleRateOut = pFlac->sampleRate; \ + if (channelsOut) *channelsOut = pFlac->channels; \ + if (totalPCMFrameCountOut) *totalPCMFrameCountOut = totalPCMFrameCount; \ + \ + drflac_close(pFlac); \ + return pSampleData; \ + \ +on_error: \ + drflac_close(pFlac); \ + return NULL; \ +} + +DRFLAC_DEFINE_FULL_READ_AND_CLOSE(s32, drflac_int32) +DRFLAC_DEFINE_FULL_READ_AND_CLOSE(s16, drflac_int16) +DRFLAC_DEFINE_FULL_READ_AND_CLOSE(f32, float) + +drflac_int32* drflac_open_and_read_pcm_frames_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalPCMFrameCountOut) *totalPCMFrameCountOut = 0; + + drflac* pFlac = drflac_open(onRead, onSeek, pUserData); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_read_and_close_s32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); +} + +drflac_int32* drflac_open_and_decode_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalSampleCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalSampleCountOut) *totalSampleCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + + drflac_int32* pResult = drflac_open_and_read_pcm_frames_s32(onRead, onSeek, pUserData, &channels, &sampleRate, &totalPCMFrameCount); + if (pResult == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalSampleCountOut) *totalSampleCountOut = totalPCMFrameCount * channels; + + return pResult; +} + + + +drflac_int16* drflac_open_and_read_pcm_frames_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalPCMFrameCountOut) *totalPCMFrameCountOut = 0; + + drflac* pFlac = drflac_open(onRead, onSeek, pUserData); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_read_and_close_s16(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); +} + +drflac_int16* drflac_open_and_decode_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalSampleCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalSampleCountOut) *totalSampleCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + + drflac_int16* pResult = drflac_open_and_read_pcm_frames_s16(onRead, onSeek, pUserData, &channels, &sampleRate, &totalPCMFrameCount); + if (pResult == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalSampleCountOut) *totalSampleCountOut = totalPCMFrameCount * channels; + + return pResult; +} + + +float* drflac_open_and_read_pcm_frames_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalPCMFrameCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalPCMFrameCountOut) *totalPCMFrameCountOut = 0; + + drflac* pFlac = drflac_open(onRead, onSeek, pUserData); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_read_and_close_f32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); +} + +float* drflac_open_and_decode_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalSampleCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalSampleCountOut) *totalSampleCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + + float* pResult = drflac_open_and_read_pcm_frames_f32(onRead, onSeek, pUserData, &channels, &sampleRate, &totalPCMFrameCount); + if (pResult == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalSampleCountOut) *totalSampleCountOut = totalPCMFrameCount * channels; + + return pResult; +} + +#ifndef DR_FLAC_NO_STDIO +drflac_int32* drflac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalPCMFrameCount) *totalPCMFrameCount = 0; + + drflac* pFlac = drflac_open_file(filename); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_read_and_close_s32(pFlac, channels, sampleRate, totalPCMFrameCount); +} + +drflac_int32* drflac_open_and_decode_file_s32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalSampleCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalSampleCountOut) *totalSampleCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + + drflac_int32* pResult = drflac_open_file_and_read_pcm_frames_s32(filename, &channels, &sampleRate, &totalPCMFrameCount); + if (pResult == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalSampleCountOut) *totalSampleCountOut = totalPCMFrameCount * channels; + + return pResult; +} + + +drflac_int16* drflac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalPCMFrameCount) *totalPCMFrameCount = 0; + + drflac* pFlac = drflac_open_file(filename); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_read_and_close_s16(pFlac, channels, sampleRate, totalPCMFrameCount); +} + +drflac_int16* drflac_open_and_decode_file_s16(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalSampleCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalSampleCountOut) *totalSampleCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + + drflac_int16* pResult = drflac_open_file_and_read_pcm_frames_s16(filename, &channels, &sampleRate, &totalPCMFrameCount); + if (pResult == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalSampleCountOut) *totalSampleCountOut = totalPCMFrameCount * channels; + + return pResult; +} + + +float* drflac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalPCMFrameCount) *totalPCMFrameCount = 0; + + drflac* pFlac = drflac_open_file(filename); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_read_and_close_f32(pFlac, channels, sampleRate, totalPCMFrameCount); +} + +float* drflac_open_and_decode_file_f32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalSampleCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalSampleCountOut) *totalSampleCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + + float* pResult = drflac_open_file_and_read_pcm_frames_f32(filename, &channels, &sampleRate, &totalPCMFrameCount); + if (pResult == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalSampleCountOut) *totalSampleCountOut = totalPCMFrameCount * channels; + + return pResult; +} +#endif + +drflac_int32* drflac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalPCMFrameCount) *totalPCMFrameCount = 0; + + drflac* pFlac = drflac_open_memory(data, dataSize); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_read_and_close_s32(pFlac, channels, sampleRate, totalPCMFrameCount); +} + +drflac_int32* drflac_open_and_decode_memory_s32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalSampleCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalSampleCountOut) *totalSampleCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + + drflac_int32* pResult = drflac_open_memory_and_read_pcm_frames_s32(data, dataSize, &channels, &sampleRate, &totalPCMFrameCount); + if (pResult == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalSampleCountOut) *totalSampleCountOut = totalPCMFrameCount * channels; + + return pResult; +} + + +drflac_int16* drflac_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalPCMFrameCount) *totalPCMFrameCount = 0; + + drflac* pFlac = drflac_open_memory(data, dataSize); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_read_and_close_s16(pFlac, channels, sampleRate, totalPCMFrameCount); +} + +drflac_int16* drflac_open_and_decode_memory_s16(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalSampleCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalSampleCountOut) *totalSampleCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + + drflac_int16* pResult = drflac_open_memory_and_read_pcm_frames_s16(data, dataSize, &channels, &sampleRate, &totalPCMFrameCount); + if (pResult == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalSampleCountOut) *totalSampleCountOut = totalPCMFrameCount * channels; + + return pResult; +} + + +float* drflac_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalPCMFrameCount) *totalPCMFrameCount = 0; + + drflac* pFlac = drflac_open_memory(data, dataSize); + if (pFlac == NULL) { + return NULL; + } + + return drflac__full_read_and_close_f32(pFlac, channels, sampleRate, totalPCMFrameCount); +} + +float* drflac_open_and_decode_memory_f32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drflac_uint64* totalSampleCountOut) +{ + // Safety. + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalSampleCountOut) *totalSampleCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + + float* pResult = drflac_open_memory_and_read_pcm_frames_f32(data, dataSize, &channels, &sampleRate, &totalPCMFrameCount); + if (pResult == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalSampleCountOut) *totalSampleCountOut = totalPCMFrameCount * channels; + + return pResult; +} + + +void drflac_free(void* pSampleDataReturnedByOpenAndDecode) +{ + DRFLAC_FREE(pSampleDataReturnedByOpenAndDecode); +} + + + + +void drflac_init_vorbis_comment_iterator(drflac_vorbis_comment_iterator* pIter, drflac_uint32 commentCount, const void* pComments) +{ + if (pIter == NULL) { + return; + } + + pIter->countRemaining = commentCount; + pIter->pRunningData = (const char*)pComments; +} + +const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, drflac_uint32* pCommentLengthOut) +{ + // Safety. + if (pCommentLengthOut) *pCommentLengthOut = 0; + + if (pIter == NULL || pIter->countRemaining == 0 || pIter->pRunningData == NULL) { + return NULL; + } + + drflac_uint32 length = drflac__le2host_32(*(const drflac_uint32*)pIter->pRunningData); + pIter->pRunningData += 4; + + const char* pComment = pIter->pRunningData; + pIter->pRunningData += length; + pIter->countRemaining -= 1; + + if (pCommentLengthOut) *pCommentLengthOut = length; + return pComment; +} + + + + +void drflac_init_cuesheet_track_iterator(drflac_cuesheet_track_iterator* pIter, drflac_uint32 trackCount, const void* pTrackData) +{ + if (pIter == NULL) { + return; + } + + pIter->countRemaining = trackCount; + pIter->pRunningData = (const char*)pTrackData; +} + +drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter, drflac_cuesheet_track* pCuesheetTrack) +{ + if (pIter == NULL || pIter->countRemaining == 0 || pIter->pRunningData == NULL) { + return DRFLAC_FALSE; + } + + drflac_cuesheet_track cuesheetTrack; + + const char* pRunningData = pIter->pRunningData; + + drflac_uint64 offsetHi = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + drflac_uint64 offsetLo = drflac__be2host_32(*(const drflac_uint32*)pRunningData); pRunningData += 4; + cuesheetTrack.offset = offsetLo | (offsetHi << 32); + cuesheetTrack.trackNumber = pRunningData[0]; pRunningData += 1; + drflac_copy_memory(cuesheetTrack.ISRC, pRunningData, sizeof(cuesheetTrack.ISRC)); pRunningData += 12; + cuesheetTrack.isAudio = (pRunningData[0] & 0x80) != 0; + cuesheetTrack.preEmphasis = (pRunningData[0] & 0x40) != 0; pRunningData += 14; + cuesheetTrack.indexCount = pRunningData[0]; pRunningData += 1; + cuesheetTrack.pIndexPoints = (const drflac_cuesheet_track_index*)pRunningData; pRunningData += cuesheetTrack.indexCount * sizeof(drflac_cuesheet_track_index); + + pIter->pRunningData = pRunningData; + pIter->countRemaining -= 1; + + if (pCuesheetTrack) *pCuesheetTrack = cuesheetTrack; + return DRFLAC_TRUE; +} +#endif //DR_FLAC_IMPLEMENTATION + + +// REVISION HISTORY +// +// v0.11.2 - 2018-03-10 +// - Fix a warning. +// +// v0.11.1 - 2018-02-17 +// - Fix a potential bug with seeking. +// +// v0.11.0 - 2018-12-16 +// - API CHANGE: Deprecated drflac_read_s32(), drflac_read_s16() and drflac_read_f32() and replaced them with +// drflac_read_pcm_frames_s32(), drflac_read_pcm_frames_s16() and drflac_read_pcm_frames_f32(). The new APIs take +// and return PCM frame counts instead of sample counts. To upgrade you will need to change the input count by +// dividing it by the channel count, and then do the same with the return value. +// - API_CHANGE: Deprecated drflac_seek_to_sample() and replaced with drflac_seek_to_pcm_frame(). Same rules as +// the changes to drflac_read_*() apply. +// - API CHANGE: Deprecated drflac_open_and_decode_*() and replaced with drflac_open_*_and_read_*(). Same rules as +// the changes to drflac_read_*() apply. +// - Optimizations. +// +// v0.10.0 - 2018-09-11 +// - Remove the DR_FLAC_NO_WIN32_IO option and the Win32 file IO functionality. If you need to use Win32 file IO you +// need to do it yourself via the callback API. +// - Fix the clang build. +// - Fix undefined behavior. +// - Fix errors with CUESHEET metdata blocks. +// - Add an API for iterating over each cuesheet track in the CUESHEET metadata block. This works the same way as the +// Vorbis comment API. +// - Other miscellaneous bug fixes, mostly relating to invalid FLAC streams. +// - Minor optimizations. +// +// v0.9.11 - 2018-08-29 +// - Fix a bug with sample reconstruction. +// +// v0.9.10 - 2018-08-07 +// - Improve 64-bit detection. +// +// v0.9.9 - 2018-08-05 +// - Fix C++ build on older versions of GCC. +// +// v0.9.8 - 2018-07-24 +// - Fix compilation errors. +// +// v0.9.7 - 2018-07-05 +// - Fix a warning. +// +// v0.9.6 - 2018-06-29 +// - Fix some typos. +// +// v0.9.5 - 2018-06-23 +// - Fix some warnings. +// +// v0.9.4 - 2018-06-14 +// - Optimizations to seeking. +// - Clean up. +// +// v0.9.3 - 2018-05-22 +// - Bug fix. +// +// v0.9.2 - 2018-05-12 +// - Fix a compilation error due to a missing break statement. +// +// v0.9.1 - 2018-04-29 +// - Fix compilation error with Clang. +// +// v0.9 - 2018-04-24 +// - Fix Clang build. +// - Start using major.minor.revision versioning. +// +// v0.8g - 2018-04-19 +// - Fix build on non-x86/x64 architectures. +// +// v0.8f - 2018-02-02 +// - Stop pretending to support changing rate/channels mid stream. +// +// v0.8e - 2018-02-01 +// - Fix a crash when the block size of a frame is larger than the maximum block size defined by the FLAC stream. +// - Fix a crash the the Rice partition order is invalid. +// +// v0.8d - 2017-09-22 +// - Add support for decoding streams with ID3 tags. ID3 tags are just skipped. +// +// v0.8c - 2017-09-07 +// - Fix warning on non-x86/x64 architectures. +// +// v0.8b - 2017-08-19 +// - Fix build on non-x86/x64 architectures. +// +// v0.8a - 2017-08-13 +// - A small optimization for the Clang build. +// +// v0.8 - 2017-08-12 +// - API CHANGE: Rename dr_* types to drflac_*. +// - Optimizations. This brings dr_flac back to about the same class of efficiency as the reference implementation. +// - Add support for custom implementations of malloc(), realloc(), etc. +// - Add CRC checking to Ogg encapsulated streams. +// - Fix VC++ 6 build. This is only for the C++ compiler. The C compiler is not currently supported. +// - Bug fixes. +// +// v0.7 - 2017-07-23 +// - Add support for opening a stream without a header block. To do this, use drflac_open_relaxed() / drflac_open_with_metadata_relaxed(). +// +// v0.6 - 2017-07-22 +// - Add support for recovering from invalid frames. With this change, dr_flac will simply skip over invalid frames as if they +// never existed. Frames are checked against their sync code, the CRC-8 of the frame header and the CRC-16 of the whole frame. +// +// v0.5 - 2017-07-16 +// - Fix typos. +// - Change drflac_bool* types to unsigned. +// - Add CRC checking. This makes dr_flac slower, but can be disabled with #define DR_FLAC_NO_CRC. +// +// v0.4f - 2017-03-10 +// - Fix a couple of bugs with the bitstreaming code. +// +// v0.4e - 2017-02-17 +// - Fix some warnings. +// +// v0.4d - 2016-12-26 +// - Add support for 32-bit floating-point PCM decoding. +// - Use drflac_int*/drflac_uint* sized types to improve compiler support. +// - Minor improvements to documentation. +// +// v0.4c - 2016-12-26 +// - Add support for signed 16-bit integer PCM decoding. +// +// v0.4b - 2016-10-23 +// - A minor change to drflac_bool8 and drflac_bool32 types. +// +// v0.4a - 2016-10-11 +// - Rename drBool32 to drflac_bool32 for styling consistency. +// +// v0.4 - 2016-09-29 +// - API/ABI CHANGE: Use fixed size 32-bit booleans instead of the built-in bool type. +// - API CHANGE: Rename drflac_open_and_decode*() to drflac_open_and_decode*_s32(). +// - API CHANGE: Swap the order of "channels" and "sampleRate" parameters in drflac_open_and_decode*(). Rationale for this is to +// keep it consistent with drflac_audio. +// +// v0.3f - 2016-09-21 +// - Fix a warning with GCC. +// +// v0.3e - 2016-09-18 +// - Fixed a bug where GCC 4.3+ was not getting properly identified. +// - Fixed a few typos. +// - Changed date formats to ISO 8601 (YYYY-MM-DD). +// +// v0.3d - 2016-06-11 +// - Minor clean up. +// +// v0.3c - 2016-05-28 +// - Fixed compilation error. +// +// v0.3b - 2016-05-16 +// - Fixed Linux/GCC build. +// - Updated documentation. +// +// v0.3a - 2016-05-15 +// - Minor fixes to documentation. +// +// v0.3 - 2016-05-11 +// - Optimizations. Now at about parity with the reference implementation on 32-bit builds. +// - Lots of clean up. +// +// v0.2b - 2016-05-10 +// - Bug fixes. +// +// v0.2a - 2016-05-10 +// - Made drflac_open_and_decode() more robust. +// - Removed an unused debugging variable +// +// v0.2 - 2016-05-09 +// - Added support for Ogg encapsulation. +// - API CHANGE. Have the onSeek callback take a third argument which specifies whether or not the seek +// should be relative to the start or the current position. Also changes the seeking rules such that +// seeking offsets will never be negative. +// - Have drflac_open_and_decode() fail gracefully if the stream has an unknown total sample count. +// +// v0.1b - 2016-05-07 +// - Properly close the file handle in drflac_open_file() and family when the decoder fails to initialize. +// - Removed a stale comment. +// +// v0.1a - 2016-05-05 +// - Minor formatting changes. +// - Fixed a warning on the GCC build. +// +// v0.1 - 2016-05-03 +// - Initial versioned release. + + +/* +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to +*/ diff --git a/include/audio/dr_wav.h b/include/audio/dr_wav.h new file mode 100644 index 0000000..ac4f6b5 --- /dev/null +++ b/include/audio/dr_wav.h @@ -0,0 +1,4377 @@ +// WAV audio loader and writer. Public domain. See "unlicense" statement at the end of this file. +// dr_wav - v0.9.0 - 2018-12-16 +// +// David Reid - mackron@gmail.com + +/* +DEPRECATED APIS +=============== +Version 0.9.0 deprecated the per-sample reading and seeking APIs and replaced them with versions that work on the resolution +of a PCM frame instead. For example, given a stereo WAV file, previously you would pass 2 to drwav_read_f32() to read one +PCM frame, whereas now you would pass in 1 to drwav_read_pcm_frames_f32(). The old APIs would return the number of samples +read, whereas now it will return the number of PCM frames. Below is a list of APIs that have been deprecated and their +replacements. + + drwav_read() -> drwav_read_pcm_frames() + drwav_read_s16() -> drwav_read_pcm_frames_s16() + drwav_read_f32() -> drwav_read_pcm_frames_f32() + drwav_read_s32() -> drwav_read_pcm_frames_s32() + drwav_seek_to_sample() -> drwav_seek_to_pcm_frame() + drwav_write() -> drwav_write_pcm_frames() + drwav_open_and_read_s16() -> drwav_open_and_read_pcm_frames_s16() + drwav_open_and_read_f32() -> drwav_open_and_read_pcm_frames_f32() + drwav_open_and_read_s32() -> drwav_open_and_read_pcm_frames_s32() + drwav_open_file_and_read_s16() -> drwav_open_file_and_read_pcm_frames_s16() + drwav_open_file_and_read_f32() -> drwav_open_file_and_read_pcm_frames_f32() + drwav_open_file_and_read_s32() -> drwav_open_file_and_read_pcm_frames_s32() + drwav_open_memory_and_read_s16() -> drwav_open_memory_and_read_pcm_frames_s16() + drwav_open_memory_and_read_f32() -> drwav_open_memory_and_read_pcm_frames_f32() + drwav_open_memory_and_read_s32() -> drwav_open_memory_and_read_pcm_frames_s32() + drwav::totalSampleCount -> drwav::totalPCMFrameCount + +Rationale: + 1) Most programs will want to read in multiples of the channel count which demands a per-frame reading API. Per-sample + reading just adds complexity and maintenance costs for no practical benefit. + 2) This is consistent with my other decoders - dr_flac and dr_mp3. + +These APIs will be removed completely in version 0.10.0. You can continue to use drwav_read_raw() if you need per-sample +reading. +*/ + +// USAGE +// +// This is a single-file library. To use it, do something like the following in one .c file. +// #define DR_WAV_IMPLEMENTATION +// #include "dr_wav.h" +// +// You can then #include this file in other parts of the program as you would with any other header file. Do something +// like the following to read audio data: +// +// drwav wav; +// if (!drwav_init_file(&wav, "my_song.wav")) { +// // Error opening WAV file. +// } +// +// drwav_int32* pDecodedInterleavedSamples = malloc(wav.totalPCMFrameCount * wav.channels * sizeof(drwav_int32)); +// size_t numberOfSamplesActuallyDecoded = drwav_read_pcm_frames_s32(&wav, wav.totalPCMFrameCount, pDecodedInterleavedSamples); +// +// ... +// +// drwav_uninit(&wav); +// +// You can also use drwav_open() to allocate and initialize the loader for you: +// +// drwav* pWav = drwav_open_file("my_song.wav"); +// if (pWav == NULL) { +// // Error opening WAV file. +// } +// +// ... +// +// drwav_close(pWav); +// +// If you just want to quickly open and read the audio data in a single operation you can do something like this: +// +// unsigned int channels; +// unsigned int sampleRate; +// drwav_uint64 totalPCMFrameCount; +// float* pSampleData = drwav_open_file_and_read_pcm_frames_f32("my_song.wav", &channels, &sampleRate, &totalPCMFrameCount); +// if (pSampleData == NULL) { +// // Error opening and reading WAV file. +// } +// +// ... +// +// drwav_free(pSampleData); +// +// The examples above use versions of the API that convert the audio data to a consistent format (32-bit signed PCM, in +// this case), but you can still output the audio data in its internal format (see notes below for supported formats): +// +// size_t samplesRead = drwav_read_pcm_frames(&wav, wav.totalPCMFrameCount, pDecodedInterleavedSamples); +// +// You can also read the raw bytes of audio data, which could be useful if dr_wav does not have native support for +// a particular data format: +// +// size_t bytesRead = drwav_read_raw(&wav, bytesToRead, pRawDataBuffer); +// +// +// dr_wav can also be used to output WAV files. This does not currently support compressed formats. To use this, look at +// drwav_open_write(), drwav_open_file_write(), etc. Use drwav_write_pcm_frames() to write samples, or drwav_write_raw() +// to write raw data in the "data" chunk. +// +// drwav_data_format format; +// format.container = drwav_container_riff; // <-- drwav_container_riff = normal WAV files, drwav_container_w64 = Sony Wave64. +// format.format = DR_WAVE_FORMAT_PCM; // <-- Any of the DR_WAVE_FORMAT_* codes. +// format.channels = 2; +// format.sampleRate = 44100; +// format.bitsPerSample = 16; +// drwav* pWav = drwav_open_file_write("data/recording.wav", &format); +// +// ... +// +// drwav_uint64 samplesWritten = drwav_write_pcm_frames(pWav, frameCount, pSamples); +// +// +// dr_wav has seamless support the Sony Wave64 format. The decoder will automatically detect it and it should Just Work +// without any manual intervention. +// +// +// OPTIONS +// #define these options before including this file. +// +// #define DR_WAV_NO_CONVERSION_API +// Disables conversion APIs such as drwav_read_pcm_frames_f32() and drwav_s16_to_f32(). +// +// #define DR_WAV_NO_STDIO +// Disables drwav_open_file(), drwav_open_file_write(), etc. +// +// +// +// QUICK NOTES +// - Samples are always interleaved. +// - The default read function does not do any data conversion. Use drwav_read_pcm_frames_f32(), drwav_read_pcm_frames_s32() +// and drwav_read_pcm_frames_s16() to read and convert audio data to 32-bit floating point, signed 32-bit integer and +// signed 16-bit integer samples respectively. Tested and supported internal formats include the following: +// - Unsigned 8-bit PCM +// - Signed 12-bit PCM +// - Signed 16-bit PCM +// - Signed 24-bit PCM +// - Signed 32-bit PCM +// - IEEE 32-bit floating point +// - IEEE 64-bit floating point +// - A-law and u-law +// - Microsoft ADPCM +// - IMA ADPCM (DVI, format code 0x11) +// - dr_wav will try to read the WAV file as best it can, even if it's not strictly conformant to the WAV format. + + +#ifndef dr_wav_h +#define dr_wav_h + +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +typedef signed char drwav_int8; +typedef unsigned char drwav_uint8; +typedef signed short drwav_int16; +typedef unsigned short drwav_uint16; +typedef signed int drwav_int32; +typedef unsigned int drwav_uint32; +typedef signed __int64 drwav_int64; +typedef unsigned __int64 drwav_uint64; +#else +#include +typedef int8_t drwav_int8; +typedef uint8_t drwav_uint8; +typedef int16_t drwav_int16; +typedef uint16_t drwav_uint16; +typedef int32_t drwav_int32; +typedef uint32_t drwav_uint32; +typedef int64_t drwav_int64; +typedef uint64_t drwav_uint64; +#endif +typedef drwav_uint8 drwav_bool8; +typedef drwav_uint32 drwav_bool32; +#define DRWAV_TRUE 1 +#define DRWAV_FALSE 0 + +#ifdef __cplusplus +extern "C" { +#endif + +// Common data formats. +#define DR_WAVE_FORMAT_PCM 0x1 +#define DR_WAVE_FORMAT_ADPCM 0x2 +#define DR_WAVE_FORMAT_IEEE_FLOAT 0x3 +#define DR_WAVE_FORMAT_ALAW 0x6 +#define DR_WAVE_FORMAT_MULAW 0x7 +#define DR_WAVE_FORMAT_DVI_ADPCM 0x11 +#define DR_WAVE_FORMAT_EXTENSIBLE 0xFFFE + +// Constants. +#ifndef DRWAV_MAX_SMPL_LOOPS +#define DRWAV_MAX_SMPL_LOOPS 1 +#endif + +// Flags to pass into drwav_init_ex(), etc. +#define DRWAV_SEQUENTIAL 0x00000001 + +typedef enum +{ + drwav_seek_origin_start, + drwav_seek_origin_current +} drwav_seek_origin; + +typedef enum +{ + drwav_container_riff, + drwav_container_w64 +} drwav_container; + +typedef struct +{ + union + { + drwav_uint8 fourcc[4]; + drwav_uint8 guid[16]; + } id; + + // The size in bytes of the chunk. + drwav_uint64 sizeInBytes; + + // RIFF = 2 byte alignment. + // W64 = 8 byte alignment. + unsigned int paddingSize; +} drwav_chunk_header; + +// Callback for when data is read. Return value is the number of bytes actually read. +// +// pUserData [in] The user data that was passed to drwav_init(), drwav_open() and family. +// pBufferOut [out] The output buffer. +// bytesToRead [in] The number of bytes to read. +// +// Returns the number of bytes actually read. +// +// A return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until +// either the entire bytesToRead is filled or you have reached the end of the stream. +typedef size_t (* drwav_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); + +// Callback for when data is written. Returns value is the number of bytes actually written. +// +// pUserData [in] The user data that was passed to drwav_init_write(), drwav_open_write() and family. +// pData [out] A pointer to the data to write. +// bytesToWrite [in] The number of bytes to write. +// +// Returns the number of bytes actually written. +// +// If the return value differs from bytesToWrite, it indicates an error. +typedef size_t (* drwav_write_proc)(void* pUserData, const void* pData, size_t bytesToWrite); + +// Callback for when data needs to be seeked. +// +// pUserData [in] The user data that was passed to drwav_init(), drwav_open() and family. +// offset [in] The number of bytes to move, relative to the origin. Will never be negative. +// origin [in] The origin of the seek - the current position or the start of the stream. +// +// Returns whether or not the seek was successful. +// +// Whether or not it is relative to the beginning or current position is determined by the "origin" parameter which +// will be either drwav_seek_origin_start or drwav_seek_origin_current. +typedef drwav_bool32 (* drwav_seek_proc)(void* pUserData, int offset, drwav_seek_origin origin); + +// Callback for when drwav_init_ex/drwav_open_ex finds a chunk. +// +// pChunkUserData [in] The user data that was passed to the pChunkUserData parameter of drwav_init_ex(), drwav_open_ex() and family. +// onRead [in] A pointer to the function to call when reading. +// onSeek [in] A pointer to the function to call when seeking. +// pReadSeekUserData [in] The user data that was passed to the pReadSeekUserData parameter of drwav_init_ex(), drwav_open_ex() and family. +// pChunkHeader [in] A pointer to an object containing basic header information about the chunk. Use this to identify the chunk. +// +// Returns the number of bytes read + seeked. +// +// To read data from the chunk, call onRead(), passing in pReadSeekUserData as the first parameter. Do the same +// for seeking with onSeek(). The return value must be the total number of bytes you have read _plus_ seeked. +// +// You must not attempt to read beyond the boundary of the chunk. +typedef drwav_uint64 (* drwav_chunk_proc)(void* pChunkUserData, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pReadSeekUserData, const drwav_chunk_header* pChunkHeader); + +// Structure for internal use. Only used for loaders opened with drwav_open_memory(). +typedef struct +{ + const drwav_uint8* data; + size_t dataSize; + size_t currentReadPos; +} drwav__memory_stream; + +// Structure for internal use. Only used for writers opened with drwav_open_memory_write(). +typedef struct +{ + void** ppData; + size_t* pDataSize; + size_t dataSize; + size_t dataCapacity; + size_t currentWritePos; +} drwav__memory_stream_write; + +typedef struct +{ + drwav_container container; // RIFF, W64. + drwav_uint32 format; // DR_WAVE_FORMAT_* + drwav_uint32 channels; + drwav_uint32 sampleRate; + drwav_uint32 bitsPerSample; +} drwav_data_format; + +typedef struct +{ + // The format tag exactly as specified in the wave file's "fmt" chunk. This can be used by applications + // that require support for data formats not natively supported by dr_wav. + drwav_uint16 formatTag; + + // The number of channels making up the audio data. When this is set to 1 it is mono, 2 is stereo, etc. + drwav_uint16 channels; + + // The sample rate. Usually set to something like 44100. + drwav_uint32 sampleRate; + + // Average bytes per second. You probably don't need this, but it's left here for informational purposes. + drwav_uint32 avgBytesPerSec; + + // Block align. This is equal to the number of channels * bytes per sample. + drwav_uint16 blockAlign; + + // Bits per sample. + drwav_uint16 bitsPerSample; + + // The size of the extended data. Only used internally for validation, but left here for informational purposes. + drwav_uint16 extendedSize; + + // The number of valid bits per sample. When is equal to WAVE_FORMAT_EXTENSIBLE, + // is always rounded up to the nearest multiple of 8. This variable contains information about exactly how + // many bits a valid per sample. Mainly used for informational purposes. + drwav_uint16 validBitsPerSample; + + // The channel mask. Not used at the moment. + drwav_uint32 channelMask; + + // The sub-format, exactly as specified by the wave file. + drwav_uint8 subFormat[16]; +} drwav_fmt; + +typedef struct +{ + drwav_uint32 cuePointId; + drwav_uint32 type; + drwav_uint32 start; + drwav_uint32 end; + drwav_uint32 fraction; + drwav_uint32 playCount; +} drwav_smpl_loop; + + typedef struct +{ + drwav_uint32 manufacturer; + drwav_uint32 product; + drwav_uint32 samplePeriod; + drwav_uint32 midiUnityNotes; + drwav_uint32 midiPitchFraction; + drwav_uint32 smpteFormat; + drwav_uint32 smpteOffset; + drwav_uint32 numSampleLoops; + drwav_uint32 samplerData; + drwav_smpl_loop loops[DRWAV_MAX_SMPL_LOOPS]; +} drwav_smpl; + +typedef struct +{ + // A pointer to the function to call when more data is needed. + drwav_read_proc onRead; + + // A pointer to the function to call when data needs to be written. Only used when the drwav object is opened in write mode. + drwav_write_proc onWrite; + + // A pointer to the function to call when the wav file needs to be seeked. + drwav_seek_proc onSeek; + + // The user data to pass to callbacks. + void* pUserData; + + + // Whether or not the WAV file is formatted as a standard RIFF file or W64. + drwav_container container; + + + // Structure containing format information exactly as specified by the wav file. + drwav_fmt fmt; + + // The sample rate. Will be set to something like 44100. + drwav_uint32 sampleRate; + + // The number of channels. This will be set to 1 for monaural streams, 2 for stereo, etc. + drwav_uint16 channels; + + // The bits per sample. Will be set to something like 16, 24, etc. + drwav_uint16 bitsPerSample; + + // Equal to fmt.formatTag, or the value specified by fmt.subFormat if fmt.formatTag is equal to 65534 (WAVE_FORMAT_EXTENSIBLE). + drwav_uint16 translatedFormatTag; + + // The total number of PCM frames making up the audio data. + drwav_uint64 totalPCMFrameCount; + + + // The size in bytes of the data chunk. + drwav_uint64 dataChunkDataSize; + + // The position in the stream of the first byte of the data chunk. This is used for seeking. + drwav_uint64 dataChunkDataPos; + + // The number of bytes remaining in the data chunk. + drwav_uint64 bytesRemaining; + + + // Only used in sequential write mode. Keeps track of the desired size of the "data" chunk at the point of initialization time. Always + // set to 0 for non-sequential writes and when the drwav object is opened in read mode. Used for validation. + drwav_uint64 dataChunkDataSizeTargetWrite; + + // Keeps track of whether or not the wav writer was initialized in sequential mode. + drwav_bool32 isSequentialWrite; + + + // smpl chunk. + drwav_smpl smpl; + + + // A hack to avoid a DRWAV_MALLOC() when opening a decoder with drwav_open_memory(). + drwav__memory_stream memoryStream; + drwav__memory_stream_write memoryStreamWrite; + + // Generic data for compressed formats. This data is shared across all block-compressed formats. + struct + { + drwav_uint64 iCurrentSample; // The index of the next sample that will be read by drwav_read_*(). This is used with "totalSampleCount" to ensure we don't read excess samples at the end of the last block. + } compressed; + + // Microsoft ADPCM specific data. + struct + { + drwav_uint32 bytesRemainingInBlock; + drwav_uint16 predictor[2]; + drwav_int32 delta[2]; + drwav_int32 cachedSamples[4]; // Samples are stored in this cache during decoding. + drwav_uint32 cachedSampleCount; + drwav_int32 prevSamples[2][2]; // The previous 2 samples for each channel (2 channels at most). + } msadpcm; + + // IMA ADPCM specific data. + struct + { + drwav_uint32 bytesRemainingInBlock; + drwav_int32 predictor[2]; + drwav_int32 stepIndex[2]; + drwav_int32 cachedSamples[16]; // Samples are stored in this cache during decoding. + drwav_uint32 cachedSampleCount; + } ima; + + + drwav_uint64 totalSampleCount; // <-- DEPRECATED. Will be removed in a future version. +} drwav; + + +// Initializes a pre-allocated drwav object. +// +// pWav [out] A pointer to the drwav object being initialized. +// onRead [in] The function to call when data needs to be read from the client. +// onSeek [in] The function to call when the read position of the client data needs to move. +// onChunk [in, optional] The function to call when a chunk is enumerated at initialized time. +// pUserData, pReadSeekUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek. +// pChunkUserData [in, optional] A pointer to application defined data that will be passed to onChunk. +// flags [in, optional] A set of flags for controlling how things are loaded. +// +// Returns true if successful; false otherwise. +// +// Close the loader with drwav_uninit(). +// +// This is the lowest level function for initializing a WAV file. You can also use drwav_init_file() and drwav_init_memory() +// to open the stream from a file or from a block of memory respectively. +// +// If you want dr_wav to manage the memory allocation for you, consider using drwav_open() instead. This will allocate +// a drwav object on the heap and return a pointer to it. +// +// Possible values for flags: +// DRWAV_SEQUENTIAL: Never perform a backwards seek while loading. This disables the chunk callback and will cause this function +// to return as soon as the data chunk is found. Any chunks after the data chunk will be ignored. +// +// drwav_init() is equivalent to "drwav_init_ex(pWav, onRead, onSeek, NULL, pUserData, NULL, 0);". +// +// The onChunk callback is not called for the WAVE or FMT chunks. The contents of the FMT chunk can be read from pWav->fmt +// after the function returns. +// +// See also: drwav_init_file(), drwav_init_memory(), drwav_uninit() +drwav_bool32 drwav_init(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData); +drwav_bool32 drwav_init_ex(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, drwav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, drwav_uint32 flags); + +// Initializes a pre-allocated drwav object for writing. +// +// onWrite [in] The function to call when data needs to be written. +// onSeek [in] The function to call when the write position needs to move. +// pUserData [in, optional] A pointer to application defined data that will be passed to onWrite and onSeek. +// +// Returns true if successful; false otherwise. +// +// Close the writer with drwav_uninit(). +// +// This is the lowest level function for initializing a WAV file. You can also use drwav_init_file() and drwav_init_memory() +// to open the stream from a file or from a block of memory respectively. +// +// If the total sample count is known, you can use drwav_init_write_sequential(). This avoids the need for dr_wav to perform +// a post-processing step for storing the total sample count and the size of the data chunk which requires a backwards seek. +// +// If you want dr_wav to manage the memory allocation for you, consider using drwav_open() instead. This will allocate +// a drwav object on the heap and return a pointer to it. +// +// See also: drwav_init_file_write(), drwav_init_memory_write(), drwav_uninit() +drwav_bool32 drwav_init_write(drwav* pWav, const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData); +drwav_bool32 drwav_init_write_sequential(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_write_proc onWrite, void* pUserData); + +// Uninitializes the given drwav object. +// +// Use this only for objects initialized with drwav_init(). +void drwav_uninit(drwav* pWav); + + +// Opens a wav file using the given callbacks. +// +// onRead [in] The function to call when data needs to be read from the client. +// onSeek [in] The function to call when the read position of the client data needs to move. +// pUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek. +// +// Returns null on error. +// +// Close the loader with drwav_close(). +// +// You can also use drwav_open_file() and drwav_open_memory() to open the stream from a file or from a block of +// memory respectively. +// +// This is different from drwav_init() in that it will allocate the drwav object for you via DRWAV_MALLOC() before +// initializing it. +// +// See also: drwav_init(), drwav_open_file(), drwav_open_memory(), drwav_close() +drwav* drwav_open(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData); +drwav* drwav_open_ex(drwav_read_proc onRead, drwav_seek_proc onSeek, drwav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, drwav_uint32 flags); + +// Opens a wav file for writing using the given callbacks. +// +// onWrite [in] The function to call when data needs to be written. +// onSeek [in] The function to call when the write position needs to move. +// pUserData [in, optional] A pointer to application defined data that will be passed to onWrite and onSeek. +// +// Returns null on error. +// +// Close the loader with drwav_close(). +// +// You can also use drwav_open_file_write() and drwav_open_memory_write() to open the stream from a file or from a block +// of memory respectively. +// +// This is different from drwav_init_write() in that it will allocate the drwav object for you via DRWAV_MALLOC() before +// initializing it. +// +// See also: drwav_open_file_write(), drwav_open_memory_write(), drwav_close() +drwav* drwav_open_write(const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData); +drwav* drwav_open_write_sequential(const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_write_proc onWrite, void* pUserData); + +// Uninitializes and deletes the the given drwav object. +// +// Use this only for objects created with drwav_open(). +void drwav_close(drwav* pWav); + + +// Reads raw audio data. +// +// This is the lowest level function for reading audio data. It simply reads the given number of +// bytes of the raw internal sample data. +// +// Consider using drwav_read_pcm_frames_s16(), drwav_read_pcm_frames_s32() or drwav_read_pcm_frames_f32() for +// reading sample data in a consistent format. +// +// Returns the number of bytes actually read. +size_t drwav_read_raw(drwav* pWav, size_t bytesToRead, void* pBufferOut); + +// Reads a chunk of audio data in the native internal format. +// +// This is typically the most efficient way to retrieve audio data, but it does not do any format +// conversions which means you'll need to convert the data manually if required. +// +// If the return value is less than it means the end of the file has been reached or +// you have requested more samples than can possibly fit in the output buffer. +// +// This function will only work when sample data is of a fixed size and uncompressed. If you are +// using a compressed format consider using drwav_read_raw() or drwav_read_pcm_frames_s16/s32/f32/etc(). +drwav_uint64 drwav_read_pcm_frames(drwav* pWav, drwav_uint64 framesToRead, void* pBufferOut); + +// Seeks to the given PCM frame. +// +// Returns true if successful; false otherwise. +drwav_bool32 drwav_seek_to_pcm_frame(drwav* pWav, drwav_uint64 targetFrameIndex); + + +// Writes raw audio data. +// +// Returns the number of bytes actually written. If this differs from bytesToWrite, it indicates an error. +size_t drwav_write_raw(drwav* pWav, size_t bytesToWrite, const void* pData); + +// Writes PCM frames. +// +// Returns the number of PCM frames written. +drwav_uint64 drwav_write_pcm_frames(drwav* pWav, drwav_uint64 framesToWrite, const void* pData); + + +//// Conversion Utilities //// +#ifndef DR_WAV_NO_CONVERSION_API + +// Reads a chunk of audio data and converts it to signed 16-bit PCM samples. +// +// Returns the number of PCM frames actually read. +// +// If the return value is less than it means the end of the file has been reached. +drwav_uint64 drwav_read_pcm_frames_s16(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut); + +// Low-level function for converting unsigned 8-bit PCM samples to signed 16-bit PCM samples. +void drwav_u8_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount); + +// Low-level function for converting signed 24-bit PCM samples to signed 16-bit PCM samples. +void drwav_s24_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount); + +// Low-level function for converting signed 32-bit PCM samples to signed 16-bit PCM samples. +void drwav_s32_to_s16(drwav_int16* pOut, const drwav_int32* pIn, size_t sampleCount); + +// Low-level function for converting IEEE 32-bit floating point samples to signed 16-bit PCM samples. +void drwav_f32_to_s16(drwav_int16* pOut, const float* pIn, size_t sampleCount); + +// Low-level function for converting IEEE 64-bit floating point samples to signed 16-bit PCM samples. +void drwav_f64_to_s16(drwav_int16* pOut, const double* pIn, size_t sampleCount); + +// Low-level function for converting A-law samples to signed 16-bit PCM samples. +void drwav_alaw_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount); + +// Low-level function for converting u-law samples to signed 16-bit PCM samples. +void drwav_mulaw_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount); + + + +// Reads a chunk of audio data and converts it to IEEE 32-bit floating point samples. +// +// Returns the number of PCM frames actually read. +// +// If the return value is less than it means the end of the file has been reached. +drwav_uint64 drwav_read_pcm_frames_f32(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut); + +// Low-level function for converting unsigned 8-bit PCM samples to IEEE 32-bit floating point samples. +void drwav_u8_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount); + +// Low-level function for converting signed 16-bit PCM samples to IEEE 32-bit floating point samples. +void drwav_s16_to_f32(float* pOut, const drwav_int16* pIn, size_t sampleCount); + +// Low-level function for converting signed 24-bit PCM samples to IEEE 32-bit floating point samples. +void drwav_s24_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount); + +// Low-level function for converting signed 32-bit PCM samples to IEEE 32-bit floating point samples. +void drwav_s32_to_f32(float* pOut, const drwav_int32* pIn, size_t sampleCount); + +// Low-level function for converting IEEE 64-bit floating point samples to IEEE 32-bit floating point samples. +void drwav_f64_to_f32(float* pOut, const double* pIn, size_t sampleCount); + +// Low-level function for converting A-law samples to IEEE 32-bit floating point samples. +void drwav_alaw_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount); + +// Low-level function for converting u-law samples to IEEE 32-bit floating point samples. +void drwav_mulaw_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount); + + + +// Reads a chunk of audio data and converts it to signed 32-bit PCM samples. +// +// Returns the number of PCM frames actually read. +// +// If the return value is less than it means the end of the file has been reached. +drwav_uint64 drwav_read_pcm_frames_s32(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut); + +// Low-level function for converting unsigned 8-bit PCM samples to signed 32-bit PCM samples. +void drwav_u8_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount); + +// Low-level function for converting signed 16-bit PCM samples to signed 32-bit PCM samples. +void drwav_s16_to_s32(drwav_int32* pOut, const drwav_int16* pIn, size_t sampleCount); + +// Low-level function for converting signed 24-bit PCM samples to signed 32-bit PCM samples. +void drwav_s24_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount); + +// Low-level function for converting IEEE 32-bit floating point samples to signed 32-bit PCM samples. +void drwav_f32_to_s32(drwav_int32* pOut, const float* pIn, size_t sampleCount); + +// Low-level function for converting IEEE 64-bit floating point samples to signed 32-bit PCM samples. +void drwav_f64_to_s32(drwav_int32* pOut, const double* pIn, size_t sampleCount); + +// Low-level function for converting A-law samples to signed 32-bit PCM samples. +void drwav_alaw_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount); + +// Low-level function for converting u-law samples to signed 32-bit PCM samples. +void drwav_mulaw_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount); + +#endif //DR_WAV_NO_CONVERSION_API + + +//// High-Level Convenience Helpers //// + +#ifndef DR_WAV_NO_STDIO + +// Helper for initializing a wave file using stdio. +// +// This holds the internal FILE object until drwav_uninit() is called. Keep this in mind if you're caching drwav +// objects because the operating system may restrict the number of file handles an application can have open at +// any given time. +drwav_bool32 drwav_init_file(drwav* pWav, const char* filename); +drwav_bool32 drwav_init_file_ex(drwav* pWav, const char* filename, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags); + +// Helper for initializing a wave file for writing using stdio. +// +// This holds the internal FILE object until drwav_uninit() is called. Keep this in mind if you're caching drwav +// objects because the operating system may restrict the number of file handles an application can have open at +// any given time. +drwav_bool32 drwav_init_file_write(drwav* pWav, const char* filename, const drwav_data_format* pFormat); +drwav_bool32 drwav_init_file_write_sequential(drwav* pWav, const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount); + +// Helper for opening a wave file using stdio. +// +// This holds the internal FILE object until drwav_close() is called. Keep this in mind if you're caching drwav +// objects because the operating system may restrict the number of file handles an application can have open at +// any given time. +drwav* drwav_open_file(const char* filename); +drwav* drwav_open_file_ex(const char* filename, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags); + +// Helper for opening a wave file for writing using stdio. +// +// This holds the internal FILE object until drwav_close() is called. Keep this in mind if you're caching drwav +// objects because the operating system may restrict the number of file handles an application can have open at +// any given time. +drwav* drwav_open_file_write(const char* filename, const drwav_data_format* pFormat); +drwav* drwav_open_file_write_sequential(const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount); + +#endif //DR_WAV_NO_STDIO + +// Helper for initializing a loader from a pre-allocated memory buffer. +// +// This does not create a copy of the data. It is up to the application to ensure the buffer remains valid for +// the lifetime of the drwav object. +// +// The buffer should contain the contents of the entire wave file, not just the sample data. +drwav_bool32 drwav_init_memory(drwav* pWav, const void* data, size_t dataSize); +drwav_bool32 drwav_init_memory_ex(drwav* pWav, const void* data, size_t dataSize, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags); + +// Helper for initializing a writer which outputs data to a memory buffer. +// +// dr_wav will manage the memory allocations, however it is up to the caller to free the data with drwav_free(). +// +// The buffer will remain allocated even after drwav_uninit() is called. Indeed, the buffer should not be +// considered valid until after drwav_uninit() has been called anyway. +drwav_bool32 drwav_init_memory_write(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat); +drwav_bool32 drwav_init_memory_write_sequential(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount); + +// Helper for opening a loader from a pre-allocated memory buffer. +// +// This does not create a copy of the data. It is up to the application to ensure the buffer remains valid for +// the lifetime of the drwav object. +// +// The buffer should contain the contents of the entire wave file, not just the sample data. +drwav* drwav_open_memory(const void* data, size_t dataSize); +drwav* drwav_open_memory_ex(const void* data, size_t dataSize, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags); + +// Helper for opening a writer which outputs data to a memory buffer. +// +// dr_wav will manage the memory allocations, however it is up to the caller to free the data with drwav_free(). +// +// The buffer will remain allocated even after drwav_close() is called. Indeed, the buffer should not be +// considered valid until after drwav_close() has been called anyway. +drwav* drwav_open_memory_write(void** ppData, size_t* pDataSize, const drwav_data_format* pFormat); +drwav* drwav_open_memory_write_sequential(void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount); + + +#ifndef DR_WAV_NO_CONVERSION_API +// Opens and reads a wav file in a single operation. +drwav_int16* drwav_open_and_read_pcm_frames_s16(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount); +float* drwav_open_and_read_pcm_frames_f32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount); +drwav_int32* drwav_open_and_read_pcm_frames_s32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount); +#ifndef DR_WAV_NO_STDIO +// Opens and decodes a wav file in a single operation. +drwav_int16* drwav_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount); +float* drwav_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount); +drwav_int32* drwav_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount); +#endif + +// Opens and decodes a wav file from a block of memory in a single operation. +drwav_int16* drwav_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount); +float* drwav_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount); +drwav_int32* drwav_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalFrameCount); +#endif + +// Frees data that was allocated internally by dr_wav. +void drwav_free(void* pDataReturnedByOpenAndRead); + + +// DEPRECATED APIS +// =============== +drwav_uint64 drwav_read(drwav* pWav, drwav_uint64 samplesToRead, void* pBufferOut); +drwav_uint64 drwav_read_s16(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut); +drwav_uint64 drwav_read_f32(drwav* pWav, drwav_uint64 samplesToRead, float* pBufferOut); +drwav_uint64 drwav_read_s32(drwav* pWav, drwav_uint64 samplesToRead, drwav_int32* pBufferOut); +drwav_bool32 drwav_seek_to_sample(drwav* pWav, drwav_uint64 sample); +drwav_uint64 drwav_write(drwav* pWav, drwav_uint64 samplesToWrite, const void* pData); +#ifndef DR_WAV_NO_CONVERSION_API +drwav_int16* drwav_open_and_read_s16(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount); +float* drwav_open_and_read_f32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount); +drwav_int32* drwav_open_and_read_s32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount); +#ifndef DR_WAV_NO_STDIO +drwav_int16* drwav_open_memory_and_read_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount); +float* drwav_open_file_and_read_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount); +drwav_int32* drwav_open_file_and_read_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount); +#endif +drwav_int16* drwav_open_memory_and_read_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount); +float* drwav_open_memory_and_read_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount); +drwav_int32* drwav_open_memory_and_read_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount); +#endif + + +#ifdef __cplusplus +} +#endif +#endif // dr_wav_h + + +///////////////////////////////////////////////////// +// +// IMPLEMENTATION +// +///////////////////////////////////////////////////// + +#ifdef DR_WAV_IMPLEMENTATION +#include +#include // For memcpy(), memset() +#include // For INT_MAX + +#ifndef DR_WAV_NO_STDIO +#include +#endif + +// Standard library stuff. +#ifndef DRWAV_ASSERT +#include +#define DRWAV_ASSERT(expression) assert(expression) +#endif +#ifndef DRWAV_MALLOC +#define DRWAV_MALLOC(sz) malloc((sz)) +#endif +#ifndef DRWAV_REALLOC +#define DRWAV_REALLOC(p, sz) realloc((p), (sz)) +#endif +#ifndef DRWAV_FREE +#define DRWAV_FREE(p) free((p)) +#endif +#ifndef DRWAV_COPY_MEMORY +#define DRWAV_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz)) +#endif +#ifndef DRWAV_ZERO_MEMORY +#define DRWAV_ZERO_MEMORY(p, sz) memset((p), 0, (sz)) +#endif + +#define drwav_countof(x) (sizeof(x) / sizeof(x[0])) +#define drwav_align(x, a) ((((x) + (a) - 1) / (a)) * (a)) +#define drwav_min(a, b) (((a) < (b)) ? (a) : (b)) +#define drwav_max(a, b) (((a) > (b)) ? (a) : (b)) +#define drwav_clamp(x, lo, hi) (drwav_max((lo), drwav_min((hi), (x)))) + +#define drwav_assert DRWAV_ASSERT +#define drwav_copy_memory DRWAV_COPY_MEMORY +#define drwav_zero_memory DRWAV_ZERO_MEMORY + +typedef drwav_int32 drwav_result; +#define DRWAV_SUCCESS 0 +#define DRWAV_ERROR -1 +#define DRWAV_INVALID_ARGS -2 +#define DRWAV_INVALID_OPERATION -3 +#define DRWAV_INVALID_FILE -100 +#define DRWAV_EOF -101 + +#define DRWAV_MAX_SIMD_VECTOR_SIZE 64 // 64 for AVX-512 in the future. + +#ifdef _MSC_VER +#define DRWAV_INLINE __forceinline +#else +#ifdef __GNUC__ +#define DRWAV_INLINE inline __attribute__((always_inline)) +#else +#define DRWAV_INLINE inline +#endif +#endif + +#if defined(SIZE_MAX) + #define DRWAV_SIZE_MAX SIZE_MAX +#else + #if defined(_WIN64) || defined(_LP64) || defined(__LP64__) + #define DRWAV_SIZE_MAX ((drwav_uint64)0xFFFFFFFFFFFFFFFF) + #else + #define DRWAV_SIZE_MAX 0xFFFFFFFF + #endif +#endif + +static const drwav_uint8 drwavGUID_W64_RIFF[16] = {0x72,0x69,0x66,0x66, 0x2E,0x91, 0xCF,0x11, 0xA5,0xD6, 0x28,0xDB,0x04,0xC1,0x00,0x00}; // 66666972-912E-11CF-A5D6-28DB04C10000 +static const drwav_uint8 drwavGUID_W64_WAVE[16] = {0x77,0x61,0x76,0x65, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; // 65766177-ACF3-11D3-8CD1-00C04F8EDB8A +static const drwav_uint8 drwavGUID_W64_JUNK[16] = {0x6A,0x75,0x6E,0x6B, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; // 6B6E756A-ACF3-11D3-8CD1-00C04F8EDB8A +static const drwav_uint8 drwavGUID_W64_FMT [16] = {0x66,0x6D,0x74,0x20, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; // 20746D66-ACF3-11D3-8CD1-00C04F8EDB8A +static const drwav_uint8 drwavGUID_W64_FACT[16] = {0x66,0x61,0x63,0x74, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; // 74636166-ACF3-11D3-8CD1-00C04F8EDB8A +static const drwav_uint8 drwavGUID_W64_DATA[16] = {0x64,0x61,0x74,0x61, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; // 61746164-ACF3-11D3-8CD1-00C04F8EDB8A +static const drwav_uint8 drwavGUID_W64_SMPL[16] = {0x73,0x6D,0x70,0x6C, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A}; // 6C706D73-ACF3-11D3-8CD1-00C04F8EDB8A + +static DRWAV_INLINE drwav_bool32 drwav__guid_equal(const drwav_uint8 a[16], const drwav_uint8 b[16]) +{ + const drwav_uint32* a32 = (const drwav_uint32*)a; + const drwav_uint32* b32 = (const drwav_uint32*)b; + + return + a32[0] == b32[0] && + a32[1] == b32[1] && + a32[2] == b32[2] && + a32[3] == b32[3]; +} + +static DRWAV_INLINE drwav_bool32 drwav__fourcc_equal(const unsigned char* a, const char* b) +{ + return + a[0] == b[0] && + a[1] == b[1] && + a[2] == b[2] && + a[3] == b[3]; +} + + + +static DRWAV_INLINE int drwav__is_little_endian() +{ + int n = 1; + return (*(char*)&n) == 1; +} + +static DRWAV_INLINE unsigned short drwav__bytes_to_u16(const unsigned char* data) +{ + return (data[0] << 0) | (data[1] << 8); +} + +static DRWAV_INLINE short drwav__bytes_to_s16(const unsigned char* data) +{ + return (short)drwav__bytes_to_u16(data); +} + +static DRWAV_INLINE unsigned int drwav__bytes_to_u32(const unsigned char* data) +{ + return (data[0] << 0) | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); +} + +static DRWAV_INLINE drwav_uint64 drwav__bytes_to_u64(const unsigned char* data) +{ + return + ((drwav_uint64)data[0] << 0) | ((drwav_uint64)data[1] << 8) | ((drwav_uint64)data[2] << 16) | ((drwav_uint64)data[3] << 24) | + ((drwav_uint64)data[4] << 32) | ((drwav_uint64)data[5] << 40) | ((drwav_uint64)data[6] << 48) | ((drwav_uint64)data[7] << 56); +} + +static DRWAV_INLINE void drwav__bytes_to_guid(const unsigned char* data, drwav_uint8* guid) +{ + for (int i = 0; i < 16; ++i) { + guid[i] = data[i]; + } +} + + +static DRWAV_INLINE drwav_bool32 drwav__is_compressed_format_tag(drwav_uint16 formatTag) +{ + return + formatTag == DR_WAVE_FORMAT_ADPCM || + formatTag == DR_WAVE_FORMAT_DVI_ADPCM; +} + +drwav_uint64 drwav_read_s16__msadpcm(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut); +drwav_uint64 drwav_read_s16__ima(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut); +drwav_bool32 drwav_init_write__internal(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData); +drwav* drwav_open_write__internal(const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData); + +static drwav_result drwav__read_chunk_header(drwav_read_proc onRead, void* pUserData, drwav_container container, drwav_uint64* pRunningBytesReadOut, drwav_chunk_header* pHeaderOut) +{ + if (container == drwav_container_riff) { + if (onRead(pUserData, pHeaderOut->id.fourcc, 4) != 4) { + return DRWAV_EOF; + } + + unsigned char sizeInBytes[4]; + if (onRead(pUserData, sizeInBytes, 4) != 4) { + return DRWAV_INVALID_FILE; + } + + pHeaderOut->sizeInBytes = drwav__bytes_to_u32(sizeInBytes); + pHeaderOut->paddingSize = (unsigned int)(pHeaderOut->sizeInBytes % 2); + *pRunningBytesReadOut += 8; + } else { + if (onRead(pUserData, pHeaderOut->id.guid, 16) != 16) { + return DRWAV_EOF; + } + + unsigned char sizeInBytes[8]; + if (onRead(pUserData, sizeInBytes, 8) != 8) { + return DRWAV_INVALID_FILE; + } + + pHeaderOut->sizeInBytes = drwav__bytes_to_u64(sizeInBytes) - 24; // <-- Subtract 24 because w64 includes the size of the header. + pHeaderOut->paddingSize = (unsigned int)(pHeaderOut->sizeInBytes % 8); + *pRunningBytesReadOut += 24; + } + + return DRWAV_SUCCESS; +} + +static drwav_bool32 drwav__seek_forward(drwav_seek_proc onSeek, drwav_uint64 offset, void* pUserData) +{ + drwav_uint64 bytesRemainingToSeek = offset; + while (bytesRemainingToSeek > 0) { + if (bytesRemainingToSeek > 0x7FFFFFFF) { + if (!onSeek(pUserData, 0x7FFFFFFF, drwav_seek_origin_current)) { + return DRWAV_FALSE; + } + bytesRemainingToSeek -= 0x7FFFFFFF; + } else { + if (!onSeek(pUserData, (int)bytesRemainingToSeek, drwav_seek_origin_current)) { + return DRWAV_FALSE; + } + bytesRemainingToSeek = 0; + } + } + + return DRWAV_TRUE; +} + +static drwav_bool32 drwav__seek_from_start(drwav_seek_proc onSeek, drwav_uint64 offset, void* pUserData) +{ + if (offset <= 0x7FFFFFFF) { + return onSeek(pUserData, (int)offset, drwav_seek_origin_start); + } + + // Larger than 32-bit seek. + if (!onSeek(pUserData, 0x7FFFFFFF, drwav_seek_origin_start)) { + return DRWAV_FALSE; + } + offset -= 0x7FFFFFFF; + + for (;;) { + if (offset <= 0x7FFFFFFF) { + return onSeek(pUserData, (int)offset, drwav_seek_origin_current); + } + + if (!onSeek(pUserData, 0x7FFFFFFF, drwav_seek_origin_current)) { + return DRWAV_FALSE; + } + offset -= 0x7FFFFFFF; + } + + // Should never get here. + //return DRWAV_TRUE; +} + + +static drwav_bool32 drwav__read_fmt(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, drwav_container container, drwav_uint64* pRunningBytesReadOut, drwav_fmt* fmtOut) +{ + drwav_chunk_header header; + if (drwav__read_chunk_header(onRead, pUserData, container, pRunningBytesReadOut, &header) != DRWAV_SUCCESS) { + return DRWAV_FALSE; + } + + + // Skip non-fmt chunks. + while ((container == drwav_container_riff && !drwav__fourcc_equal(header.id.fourcc, "fmt ")) || (container == drwav_container_w64 && !drwav__guid_equal(header.id.guid, drwavGUID_W64_FMT))) { + if (!drwav__seek_forward(onSeek, header.sizeInBytes + header.paddingSize, pUserData)) { + return DRWAV_FALSE; + } + *pRunningBytesReadOut += header.sizeInBytes + header.paddingSize; + + // Try the next header. + if (drwav__read_chunk_header(onRead, pUserData, container, pRunningBytesReadOut, &header) != DRWAV_SUCCESS) { + return DRWAV_FALSE; + } + } + + + // Validation. + if (container == drwav_container_riff) { + if (!drwav__fourcc_equal(header.id.fourcc, "fmt ")) { + return DRWAV_FALSE; + } + } else { + if (!drwav__guid_equal(header.id.guid, drwavGUID_W64_FMT)) { + return DRWAV_FALSE; + } + } + + + unsigned char fmt[16]; + if (onRead(pUserData, fmt, sizeof(fmt)) != sizeof(fmt)) { + return DRWAV_FALSE; + } + *pRunningBytesReadOut += sizeof(fmt); + + fmtOut->formatTag = drwav__bytes_to_u16(fmt + 0); + fmtOut->channels = drwav__bytes_to_u16(fmt + 2); + fmtOut->sampleRate = drwav__bytes_to_u32(fmt + 4); + fmtOut->avgBytesPerSec = drwav__bytes_to_u32(fmt + 8); + fmtOut->blockAlign = drwav__bytes_to_u16(fmt + 12); + fmtOut->bitsPerSample = drwav__bytes_to_u16(fmt + 14); + + fmtOut->extendedSize = 0; + fmtOut->validBitsPerSample = 0; + fmtOut->channelMask = 0; + memset(fmtOut->subFormat, 0, sizeof(fmtOut->subFormat)); + + if (header.sizeInBytes > 16) { + unsigned char fmt_cbSize[2]; + if (onRead(pUserData, fmt_cbSize, sizeof(fmt_cbSize)) != sizeof(fmt_cbSize)) { + return DRWAV_FALSE; // Expecting more data. + } + *pRunningBytesReadOut += sizeof(fmt_cbSize); + + int bytesReadSoFar = 18; + + fmtOut->extendedSize = drwav__bytes_to_u16(fmt_cbSize); + if (fmtOut->extendedSize > 0) { + // Simple validation. + if (fmtOut->formatTag == DR_WAVE_FORMAT_EXTENSIBLE) { + if (fmtOut->extendedSize != 22) { + return DRWAV_FALSE; + } + } + + if (fmtOut->formatTag == DR_WAVE_FORMAT_EXTENSIBLE) { + unsigned char fmtext[22]; + if (onRead(pUserData, fmtext, fmtOut->extendedSize) != fmtOut->extendedSize) { + return DRWAV_FALSE; // Expecting more data. + } + + fmtOut->validBitsPerSample = drwav__bytes_to_u16(fmtext + 0); + fmtOut->channelMask = drwav__bytes_to_u32(fmtext + 2); + drwav__bytes_to_guid(fmtext + 6, fmtOut->subFormat); + } else { + if (!onSeek(pUserData, fmtOut->extendedSize, drwav_seek_origin_current)) { + return DRWAV_FALSE; + } + } + *pRunningBytesReadOut += fmtOut->extendedSize; + + bytesReadSoFar += fmtOut->extendedSize; + } + + // Seek past any leftover bytes. For w64 the leftover will be defined based on the chunk size. + if (!onSeek(pUserData, (int)(header.sizeInBytes - bytesReadSoFar), drwav_seek_origin_current)) { + return DRWAV_FALSE; + } + *pRunningBytesReadOut += (header.sizeInBytes - bytesReadSoFar); + } + + if (header.paddingSize > 0) { + if (!onSeek(pUserData, header.paddingSize, drwav_seek_origin_current)) { + return DRWAV_FALSE; + } + *pRunningBytesReadOut += header.paddingSize; + } + + return DRWAV_TRUE; +} + + +#ifndef DR_WAV_NO_STDIO +FILE* drwav_fopen(const char* filePath, const char* openMode) +{ + FILE* pFile; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (fopen_s(&pFile, filePath, openMode) != 0) { + return DRWAV_FALSE; + } +#else + pFile = fopen(filePath, openMode); + if (pFile == NULL) { + return DRWAV_FALSE; + } +#endif + + return pFile; +} + +static size_t drwav__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead) +{ + return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData); +} + +static size_t drwav__on_write_stdio(void* pUserData, const void* pData, size_t bytesToWrite) +{ + return fwrite(pData, 1, bytesToWrite, (FILE*)pUserData); +} + +static drwav_bool32 drwav__on_seek_stdio(void* pUserData, int offset, drwav_seek_origin origin) +{ + return fseek((FILE*)pUserData, offset, (origin == drwav_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; +} + +drwav_bool32 drwav_init_file(drwav* pWav, const char* filename) +{ + return drwav_init_file_ex(pWav, filename, NULL, NULL, 0); +} + +drwav_bool32 drwav_init_file_ex(drwav* pWav, const char* filename, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags) +{ + FILE* pFile = drwav_fopen(filename, "rb"); + if (pFile == NULL) { + return DRWAV_FALSE; + } + + return drwav_init_ex(pWav, drwav__on_read_stdio, drwav__on_seek_stdio, onChunk, (void*)pFile, pChunkUserData, flags); +} + + +drwav_bool32 drwav_init_file_write__internal(drwav* pWav, const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential) +{ + FILE* pFile = drwav_fopen(filename, "wb"); + if (pFile == NULL) { + return DRWAV_FALSE; + } + + return drwav_init_write__internal(pWav, pFormat, totalSampleCount, isSequential, drwav__on_write_stdio, drwav__on_seek_stdio, (void*)pFile); +} + +drwav_bool32 drwav_init_file_write(drwav* pWav, const char* filename, const drwav_data_format* pFormat) +{ + return drwav_init_file_write__internal(pWav, filename, pFormat, 0, DRWAV_FALSE); +} + +drwav_bool32 drwav_init_file_write_sequential(drwav* pWav, const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount) +{ + return drwav_init_file_write__internal(pWav, filename, pFormat, totalSampleCount, DRWAV_TRUE); +} + +drwav* drwav_open_file(const char* filename) +{ + return drwav_open_file_ex(filename, NULL, NULL, 0); +} + +drwav* drwav_open_file_ex(const char* filename, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags) +{ + FILE* pFile = drwav_fopen(filename, "rb"); + if (pFile == NULL) { + return DRWAV_FALSE; + } + + drwav* pWav = drwav_open_ex(drwav__on_read_stdio, drwav__on_seek_stdio, onChunk, (void*)pFile, pChunkUserData, flags); + if (pWav == NULL) { + fclose(pFile); + return NULL; + } + + return pWav; +} + + +drwav* drwav_open_file_write__internal(const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential) +{ + FILE* pFile = drwav_fopen(filename, "wb"); + if (pFile == NULL) { + return DRWAV_FALSE; + } + + drwav* pWav = drwav_open_write__internal(pFormat, totalSampleCount, isSequential, drwav__on_write_stdio, drwav__on_seek_stdio, (void*)pFile); + if (pWav == NULL) { + fclose(pFile); + return NULL; + } + + return pWav; +} + +drwav* drwav_open_file_write(const char* filename, const drwav_data_format* pFormat) +{ + return drwav_open_file_write__internal(filename, pFormat, 0, DRWAV_FALSE); +} + +drwav* drwav_open_file_write_sequential(const char* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount) +{ + return drwav_open_file_write__internal(filename, pFormat, totalSampleCount, DRWAV_TRUE); +} +#endif //DR_WAV_NO_STDIO + + +static size_t drwav__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead) +{ + drwav__memory_stream* memory = (drwav__memory_stream*)pUserData; + drwav_assert(memory != NULL); + drwav_assert(memory->dataSize >= memory->currentReadPos); + + size_t bytesRemaining = memory->dataSize - memory->currentReadPos; + if (bytesToRead > bytesRemaining) { + bytesToRead = bytesRemaining; + } + + if (bytesToRead > 0) { + DRWAV_COPY_MEMORY(pBufferOut, memory->data + memory->currentReadPos, bytesToRead); + memory->currentReadPos += bytesToRead; + } + + return bytesToRead; +} + +static drwav_bool32 drwav__on_seek_memory(void* pUserData, int offset, drwav_seek_origin origin) +{ + drwav__memory_stream* memory = (drwav__memory_stream*)pUserData; + drwav_assert(memory != NULL); + + if (origin == drwav_seek_origin_current) { + if (offset > 0) { + if (memory->currentReadPos + offset > memory->dataSize) { + return DRWAV_FALSE; // Trying to seek too far forward. + } + } else { + if (memory->currentReadPos < (size_t)-offset) { + return DRWAV_FALSE; // Trying to seek too far backwards. + } + } + + // This will never underflow thanks to the clamps above. + memory->currentReadPos += offset; + } else { + if ((drwav_uint32)offset <= memory->dataSize) { + memory->currentReadPos = offset; + } else { + return DRWAV_FALSE; // Trying to seek too far forward. + } + } + + return DRWAV_TRUE; +} + +static size_t drwav__on_write_memory(void* pUserData, const void* pDataIn, size_t bytesToWrite) +{ + drwav__memory_stream_write* memory = (drwav__memory_stream_write*)pUserData; + drwav_assert(memory != NULL); + drwav_assert(memory->dataCapacity >= memory->currentWritePos); + + size_t bytesRemaining = memory->dataCapacity - memory->currentWritePos; + if (bytesRemaining < bytesToWrite) { + // Need to reallocate. + size_t newDataCapacity = (memory->dataCapacity == 0) ? 256 : memory->dataCapacity * 2; + + // If doubling wasn't enough, just make it the minimum required size to write the data. + if ((newDataCapacity - memory->currentWritePos) < bytesToWrite) { + newDataCapacity = memory->currentWritePos + bytesToWrite; + } + + void* pNewData = DRWAV_REALLOC(*memory->ppData, newDataCapacity); + if (pNewData == NULL) { + return 0; + } + + *memory->ppData = pNewData; + memory->dataCapacity = newDataCapacity; + } + + drwav_uint8* pDataOut = (drwav_uint8*)(*memory->ppData); + DRWAV_COPY_MEMORY(pDataOut + memory->currentWritePos, pDataIn, bytesToWrite); + + memory->currentWritePos += bytesToWrite; + if (memory->dataSize < memory->currentWritePos) { + memory->dataSize = memory->currentWritePos; + } + + *memory->pDataSize = memory->dataSize; + + return bytesToWrite; +} + +static drwav_bool32 drwav__on_seek_memory_write(void* pUserData, int offset, drwav_seek_origin origin) +{ + drwav__memory_stream_write* memory = (drwav__memory_stream_write*)pUserData; + drwav_assert(memory != NULL); + + if (origin == drwav_seek_origin_current) { + if (offset > 0) { + if (memory->currentWritePos + offset > memory->dataSize) { + offset = (int)(memory->dataSize - memory->currentWritePos); // Trying to seek too far forward. + } + } else { + if (memory->currentWritePos < (size_t)-offset) { + offset = -(int)memory->currentWritePos; // Trying to seek too far backwards. + } + } + + // This will never underflow thanks to the clamps above. + memory->currentWritePos += offset; + } else { + if ((drwav_uint32)offset <= memory->dataSize) { + memory->currentWritePos = offset; + } else { + memory->currentWritePos = memory->dataSize; // Trying to seek too far forward. + } + } + + return DRWAV_TRUE; +} + +drwav_bool32 drwav_init_memory(drwav* pWav, const void* data, size_t dataSize) +{ + return drwav_init_memory_ex(pWav, data, dataSize, NULL, NULL, 0); +} + +drwav_bool32 drwav_init_memory_ex(drwav* pWav, const void* data, size_t dataSize, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags) +{ + if (data == NULL || dataSize == 0) { + return DRWAV_FALSE; + } + + drwav__memory_stream memoryStream; + drwav_zero_memory(&memoryStream, sizeof(memoryStream)); + memoryStream.data = (const unsigned char*)data; + memoryStream.dataSize = dataSize; + memoryStream.currentReadPos = 0; + + if (!drwav_init_ex(pWav, drwav__on_read_memory, drwav__on_seek_memory, onChunk, (void*)&memoryStream, pChunkUserData, flags)) { + return DRWAV_FALSE; + } + + pWav->memoryStream = memoryStream; + pWav->pUserData = &pWav->memoryStream; + return DRWAV_TRUE; +} + + +drwav_bool32 drwav_init_memory_write__internal(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential) +{ + if (ppData == NULL) { + return DRWAV_FALSE; + } + + *ppData = NULL; // Important because we're using realloc()! + *pDataSize = 0; + + drwav__memory_stream_write memoryStreamWrite; + drwav_zero_memory(&memoryStreamWrite, sizeof(memoryStreamWrite)); + memoryStreamWrite.ppData = ppData; + memoryStreamWrite.pDataSize = pDataSize; + memoryStreamWrite.dataSize = 0; + memoryStreamWrite.dataCapacity = 0; + memoryStreamWrite.currentWritePos = 0; + + if (!drwav_init_write__internal(pWav, pFormat, totalSampleCount, isSequential, drwav__on_write_memory, drwav__on_seek_memory_write, (void*)&memoryStreamWrite)) { + return DRWAV_FALSE; + } + + pWav->memoryStreamWrite = memoryStreamWrite; + pWav->pUserData = &pWav->memoryStreamWrite; + return DRWAV_TRUE; +} + +drwav_bool32 drwav_init_memory_write(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat) +{ + return drwav_init_memory_write__internal(pWav, ppData, pDataSize, pFormat, 0, DRWAV_FALSE); +} + +drwav_bool32 drwav_init_memory_write_sequential(drwav* pWav, void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount) +{ + return drwav_init_memory_write__internal(pWav, ppData, pDataSize, pFormat, totalSampleCount, DRWAV_TRUE); +} + + +drwav* drwav_open_memory(const void* data, size_t dataSize) +{ + return drwav_open_memory_ex(data, dataSize, NULL, NULL, 0); +} + +drwav* drwav_open_memory_ex(const void* data, size_t dataSize, drwav_chunk_proc onChunk, void* pChunkUserData, drwav_uint32 flags) +{ + if (data == NULL || dataSize == 0) { + return NULL; + } + + drwav__memory_stream memoryStream; + drwav_zero_memory(&memoryStream, sizeof(memoryStream)); + memoryStream.data = (const unsigned char*)data; + memoryStream.dataSize = dataSize; + memoryStream.currentReadPos = 0; + + drwav* pWav = drwav_open_ex(drwav__on_read_memory, drwav__on_seek_memory, onChunk, (void*)&memoryStream, pChunkUserData, flags); + if (pWav == NULL) { + return NULL; + } + + pWav->memoryStream = memoryStream; + pWav->pUserData = &pWav->memoryStream; + return pWav; +} + + +drwav* drwav_open_memory_write__internal(void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential) +{ + if (ppData == NULL) { + return NULL; + } + + *ppData = NULL; // Important because we're using realloc()! + *pDataSize = 0; + + drwav__memory_stream_write memoryStreamWrite; + drwav_zero_memory(&memoryStreamWrite, sizeof(memoryStreamWrite)); + memoryStreamWrite.ppData = ppData; + memoryStreamWrite.pDataSize = pDataSize; + memoryStreamWrite.dataSize = 0; + memoryStreamWrite.dataCapacity = 0; + memoryStreamWrite.currentWritePos = 0; + + drwav* pWav = drwav_open_write__internal(pFormat, totalSampleCount, isSequential, drwav__on_write_memory, drwav__on_seek_memory_write, (void*)&memoryStreamWrite); + if (pWav == NULL) { + return NULL; + } + + pWav->memoryStreamWrite = memoryStreamWrite; + pWav->pUserData = &pWav->memoryStreamWrite; + return pWav; +} + +drwav* drwav_open_memory_write(void** ppData, size_t* pDataSize, const drwav_data_format* pFormat) +{ + return drwav_open_memory_write__internal(ppData, pDataSize, pFormat, 0, DRWAV_FALSE); +} + +drwav* drwav_open_memory_write_sequential(void** ppData, size_t* pDataSize, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount) +{ + return drwav_open_memory_write__internal(ppData, pDataSize, pFormat, totalSampleCount, DRWAV_TRUE); +} + + +size_t drwav__on_read(drwav_read_proc onRead, void* pUserData, void* pBufferOut, size_t bytesToRead, drwav_uint64* pCursor) +{ + drwav_assert(onRead != NULL); + drwav_assert(pCursor != NULL); + + size_t bytesRead = onRead(pUserData, pBufferOut, bytesToRead); + *pCursor += bytesRead; + return bytesRead; +} + +drwav_bool32 drwav__on_seek(drwav_seek_proc onSeek, void* pUserData, int offset, drwav_seek_origin origin, drwav_uint64* pCursor) +{ + drwav_assert(onSeek != NULL); + drwav_assert(pCursor != NULL); + + if (!onSeek(pUserData, offset, origin)) { + return DRWAV_FALSE; + } + + if (origin == drwav_seek_origin_start) { + *pCursor = offset; + } else { + *pCursor += offset; + } + + return DRWAV_TRUE; +} + + +static drwav_uint32 drwav_get_bytes_per_sample(drwav* pWav) +{ + // The number of bytes per sample is based on the bits per sample or the block align. We prioritize floor(bitsPerSample/8), but if + // this is zero or the bits per sample is not a multiple of 8 we need to fall back to the block align. + drwav_uint32 bytesPerSample = pWav->bitsPerSample >> 3; + if (bytesPerSample == 0 || (pWav->bitsPerSample & 0x7) != 0) { + bytesPerSample = pWav->fmt.blockAlign/pWav->fmt.channels; + } + + return bytesPerSample; +} + +static drwav_uint32 drwav_get_bytes_per_pcm_frame(drwav* pWav) +{ + // The number of bytes per frame is based on the bits per sample or the block align. We prioritize floor(bitsPerSample*channels/8), but if + // this is zero or the bits per frame is not a multiple of 8 we need to fall back to the block align. + drwav_uint32 bitsPerFrame = pWav->bitsPerSample * pWav->fmt.channels; + drwav_uint32 bytesPerFrame = bitsPerFrame >> 3; + if (bytesPerFrame == 0 || (bitsPerFrame & 0x7) != 0) { + bytesPerFrame = pWav->fmt.blockAlign; + } + + return bytesPerFrame; +} + + +drwav_bool32 drwav_init(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData) +{ + return drwav_init_ex(pWav, onRead, onSeek, NULL, pUserData, NULL, 0); +} + +drwav_bool32 drwav_init_ex(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, drwav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, drwav_uint32 flags) +{ + if (onRead == NULL || onSeek == NULL) { + return DRWAV_FALSE; + } + + drwav_uint64 cursor = 0; // <-- Keeps track of the byte position so we can seek to specific locations. + drwav_bool32 sequential = (flags & DRWAV_SEQUENTIAL) != 0; + + drwav_zero_memory(pWav, sizeof(*pWav)); + pWav->onRead = onRead; + pWav->onSeek = onSeek; + pWav->pUserData = pReadSeekUserData; + + // The first 4 bytes should be the RIFF identifier. + unsigned char riff[4]; + if (drwav__on_read(onRead, pReadSeekUserData, riff, sizeof(riff), &cursor) != sizeof(riff)) { + return DRWAV_FALSE; + } + + // The first 4 bytes can be used to identify the container. For RIFF files it will start with "RIFF" and for + // w64 it will start with "riff". + if (drwav__fourcc_equal(riff, "RIFF")) { + pWav->container = drwav_container_riff; + } else if (drwav__fourcc_equal(riff, "riff")) { + pWav->container = drwav_container_w64; + + // Check the rest of the GUID for validity. + drwav_uint8 riff2[12]; + if (drwav__on_read(onRead, pReadSeekUserData, riff2, sizeof(riff2), &cursor) != sizeof(riff2)) { + return DRWAV_FALSE; + } + + for (int i = 0; i < 12; ++i) { + if (riff2[i] != drwavGUID_W64_RIFF[i+4]) { + return DRWAV_FALSE; + } + } + } else { + return DRWAV_FALSE; // Unknown or unsupported container. + } + + + if (pWav->container == drwav_container_riff) { + // RIFF/WAVE + unsigned char chunkSizeBytes[4]; + if (drwav__on_read(onRead, pReadSeekUserData, chunkSizeBytes, sizeof(chunkSizeBytes), &cursor) != sizeof(chunkSizeBytes)) { + return DRWAV_FALSE; + } + + unsigned int chunkSize = drwav__bytes_to_u32(chunkSizeBytes); + if (chunkSize < 36) { + return DRWAV_FALSE; // Chunk size should always be at least 36 bytes. + } + + unsigned char wave[4]; + if (drwav__on_read(onRead, pReadSeekUserData, wave, sizeof(wave), &cursor) != sizeof(wave)) { + return DRWAV_FALSE; + } + + if (!drwav__fourcc_equal(wave, "WAVE")) { + return DRWAV_FALSE; // Expecting "WAVE". + } + } else { + // W64 + unsigned char chunkSize[8]; + if (drwav__on_read(onRead, pReadSeekUserData, chunkSize, sizeof(chunkSize), &cursor) != sizeof(chunkSize)) { + return DRWAV_FALSE; + } + + if (drwav__bytes_to_u64(chunkSize) < 80) { + return DRWAV_FALSE; + } + + drwav_uint8 wave[16]; + if (drwav__on_read(onRead, pReadSeekUserData, wave, sizeof(wave), &cursor) != sizeof(wave)) { + return DRWAV_FALSE; + } + + if (!drwav__guid_equal(wave, drwavGUID_W64_WAVE)) { + return DRWAV_FALSE; + } + } + + + // The next bytes should be the "fmt " chunk. + drwav_fmt fmt; + if (!drwav__read_fmt(onRead, onSeek, pReadSeekUserData, pWav->container, &cursor, &fmt)) { + return DRWAV_FALSE; // Failed to read the "fmt " chunk. + } + + // Basic validation. + if (fmt.sampleRate == 0 || fmt.channels == 0 || fmt.bitsPerSample == 0 || fmt.blockAlign == 0) { + return DRWAV_FALSE; // Invalid channel count. Probably an invalid WAV file. + } + + + // Translate the internal format. + unsigned short translatedFormatTag = fmt.formatTag; + if (translatedFormatTag == DR_WAVE_FORMAT_EXTENSIBLE) { + translatedFormatTag = drwav__bytes_to_u16(fmt.subFormat + 0); + } + + + + drwav_uint64 sampleCountFromFactChunk = 0; + + // We need to enumerate over each chunk for two reasons: + // 1) The "data" chunk may not be the next one + // 2) We may want to report each chunk back to the client + // + // In order to correctly report each chunk back to the client we will need to keep looping until the end of the file. + drwav_bool32 foundDataChunk = DRWAV_FALSE; + drwav_uint64 dataChunkSize = 0; + + // The next chunk we care about is the "data" chunk. This is not necessarily the next chunk so we'll need to loop. + drwav_uint64 chunkSize = 0; + for (;;) + { + drwav_chunk_header header; + drwav_result result = drwav__read_chunk_header(onRead, pReadSeekUserData, pWav->container, &cursor, &header); + if (result != DRWAV_SUCCESS) { + if (!foundDataChunk) { + return DRWAV_FALSE; + } else { + break; // Probably at the end of the file. Get out of the loop. + } + } + + // Tell the client about this chunk. + if (!sequential && onChunk != NULL) { + drwav_uint64 callbackBytesRead = onChunk(pChunkUserData, onRead, onSeek, pReadSeekUserData, &header); + + // dr_wav may need to read the contents of the chunk, so we now need to seek back to the position before + // we called the callback. + if (callbackBytesRead > 0) { + if (!drwav__seek_from_start(onSeek, cursor, pReadSeekUserData)) { + return DRWAV_FALSE; + } + } + } + + + if (!foundDataChunk) { + pWav->dataChunkDataPos = cursor; + } + + chunkSize = header.sizeInBytes; + if (pWav->container == drwav_container_riff) { + if (drwav__fourcc_equal(header.id.fourcc, "data")) { + foundDataChunk = DRWAV_TRUE; + dataChunkSize = chunkSize; + } + } else { + if (drwav__guid_equal(header.id.guid, drwavGUID_W64_DATA)) { + foundDataChunk = DRWAV_TRUE; + dataChunkSize = chunkSize; + } + } + + // If at this point we have found the data chunk and we're running in sequential mode, we need to break out of this loop. The reason for + // this is that we would otherwise require a backwards seek which sequential mode forbids. + if (foundDataChunk && sequential) { + break; + } + + // Optional. Get the total sample count from the FACT chunk. This is useful for compressed formats. + if (pWav->container == drwav_container_riff) { + if (drwav__fourcc_equal(header.id.fourcc, "fact")) { + drwav_uint32 sampleCount; + if (drwav__on_read(onRead, pReadSeekUserData, &sampleCount, 4, &cursor) != 4) { + return DRWAV_FALSE; + } + chunkSize -= 4; + + if (!foundDataChunk) { + pWav->dataChunkDataPos = cursor; + } + + // The sample count in the "fact" chunk is either unreliable, or I'm not understanding it properly. For now I am only enabling this + // for Microsoft ADPCM formats. + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { + sampleCountFromFactChunk = sampleCount; + } else { + sampleCountFromFactChunk = 0; + } + } + } else { + if (drwav__guid_equal(header.id.guid, drwavGUID_W64_FACT)) { + if (drwav__on_read(onRead, pReadSeekUserData, &sampleCountFromFactChunk, 8, &cursor) != 8) { + return DRWAV_FALSE; + } + chunkSize -= 8; + + if (!foundDataChunk) { + pWav->dataChunkDataPos = cursor; + } + } + } + + // "smpl" chunk. + if (pWav->container == drwav_container_riff) { + if (drwav__fourcc_equal(header.id.fourcc, "smpl")) { + unsigned char smplHeaderData[36]; // 36 = size of the smpl header section, not including the loop data. + if (chunkSize >= sizeof(smplHeaderData)) { + drwav_uint64 bytesJustRead = drwav__on_read(onRead, pReadSeekUserData, smplHeaderData, sizeof(smplHeaderData), &cursor); + chunkSize -= bytesJustRead; + + if (bytesJustRead == sizeof(smplHeaderData)) { + pWav->smpl.manufacturer = drwav__bytes_to_u32(smplHeaderData+0); + pWav->smpl.product = drwav__bytes_to_u32(smplHeaderData+4); + pWav->smpl.samplePeriod = drwav__bytes_to_u32(smplHeaderData+8); + pWav->smpl.midiUnityNotes = drwav__bytes_to_u32(smplHeaderData+12); + pWav->smpl.midiPitchFraction = drwav__bytes_to_u32(smplHeaderData+16); + pWav->smpl.smpteFormat = drwav__bytes_to_u32(smplHeaderData+20); + pWav->smpl.smpteOffset = drwav__bytes_to_u32(smplHeaderData+24); + pWav->smpl.numSampleLoops = drwav__bytes_to_u32(smplHeaderData+28); + pWav->smpl.samplerData = drwav__bytes_to_u32(smplHeaderData+32); + + for (drwav_uint32 iLoop = 0; iLoop < pWav->smpl.numSampleLoops && iLoop < drwav_countof(pWav->smpl.loops); ++iLoop) { + unsigned char smplLoopData[24]; // 24 = size of a loop section in the smpl chunk. + bytesJustRead = drwav__on_read(onRead, pReadSeekUserData, smplLoopData, sizeof(smplLoopData), &cursor); + chunkSize -= bytesJustRead; + + if (bytesJustRead == sizeof(smplLoopData)) { + pWav->smpl.loops[iLoop].cuePointId = drwav__bytes_to_u32(smplLoopData+0); + pWav->smpl.loops[iLoop].type = drwav__bytes_to_u32(smplLoopData+4); + pWav->smpl.loops[iLoop].start = drwav__bytes_to_u32(smplLoopData+8); + pWav->smpl.loops[iLoop].end = drwav__bytes_to_u32(smplLoopData+12); + pWav->smpl.loops[iLoop].fraction = drwav__bytes_to_u32(smplLoopData+16); + pWav->smpl.loops[iLoop].playCount = drwav__bytes_to_u32(smplLoopData+20); + } else { + break; // Break from the smpl loop for loop. + } + } + } + } else { + // Looks like invalid data. Ignore the chunk. + } + } + } else { + if (drwav__guid_equal(header.id.guid, drwavGUID_W64_SMPL)) { + // This path will be hit when a W64 WAV file contains a smpl chunk. I don't have a sample file to test this path, so a contribution + // is welcome to add support for this. + } + } + + // Make sure we seek past the padding. + chunkSize += header.paddingSize; + if (!drwav__seek_forward(onSeek, chunkSize, pReadSeekUserData)) { + break; + } + cursor += chunkSize; + + if (!foundDataChunk) { + pWav->dataChunkDataPos = cursor; + } + } + + // If we haven't found a data chunk, return an error. + if (!foundDataChunk) { + return DRWAV_FALSE; + } + + // We may have moved passed the data chunk. If so we need to move back. If running in sequential mode we can assume we are already sitting on the data chunk. + if (!sequential) { + if (!drwav__seek_from_start(onSeek, pWav->dataChunkDataPos, pReadSeekUserData)) { + return DRWAV_FALSE; + } + cursor = pWav->dataChunkDataPos; + } + + + // At this point we should be sitting on the first byte of the raw audio data. + + pWav->fmt = fmt; + pWav->sampleRate = fmt.sampleRate; + pWav->channels = fmt.channels; + pWav->bitsPerSample = fmt.bitsPerSample; + pWav->bytesRemaining = dataChunkSize; + pWav->translatedFormatTag = translatedFormatTag; + pWav->dataChunkDataSize = dataChunkSize; + + if (sampleCountFromFactChunk != 0) { + pWav->totalPCMFrameCount = sampleCountFromFactChunk; + } else { + pWav->totalPCMFrameCount = dataChunkSize / drwav_get_bytes_per_pcm_frame(pWav); + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { + drwav_uint64 blockCount = dataChunkSize / fmt.blockAlign; + pWav->totalPCMFrameCount = (((blockCount * (fmt.blockAlign - (6*pWav->channels))) * 2)) / fmt.channels; // x2 because two samples per byte. + } + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { + drwav_uint64 blockCount = dataChunkSize / fmt.blockAlign; + pWav->totalPCMFrameCount = (((blockCount * (fmt.blockAlign - (4*pWav->channels))) * 2) + (blockCount * pWav->channels)) / fmt.channels; + } + } + + // Some formats only support a certain number of channels. + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM || pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { + if (pWav->channels > 2) { + return DRWAV_FALSE; + } + } + +#ifdef DR_WAV_LIBSNDFILE_COMPAT + // I use libsndfile as a benchmark for testing, however in the version I'm using (from the Windows installer on the libsndfile website), + // it appears the total sample count libsndfile uses for MS-ADPCM is incorrect. It would seem they are computing the total sample count + // from the number of blocks, however this results in the inclusion of extra silent samples at the end of the last block. The correct + // way to know the total sample count is to inspect the "fact" chunk, which should always be present for compressed formats, and should + // always include the sample count. This little block of code below is only used to emulate the libsndfile logic so I can properly run my + // correctness tests against libsndfile, and is disabled by default. + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { + drwav_uint64 blockCount = dataChunkSize / fmt.blockAlign; + pWav->totalPCMFrameCount = (((blockCount * (fmt.blockAlign - (6*pWav->channels))) * 2)) / fmt.channels; // x2 because two samples per byte. + } + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { + drwav_uint64 blockCount = dataChunkSize / fmt.blockAlign; + pWav->totalPCMFrameCount = (((blockCount * (fmt.blockAlign - (4*pWav->channels))) * 2) + (blockCount * pWav->channels)) / fmt.channels; + } +#endif + + pWav->totalSampleCount = pWav->totalPCMFrameCount * pWav->channels; + + return DRWAV_TRUE; +} + + +drwav_uint32 drwav_riff_chunk_size_riff(drwav_uint64 dataChunkSize) +{ + if (dataChunkSize <= (0xFFFFFFFF - 36)) { + return 36 + (drwav_uint32)dataChunkSize; + } else { + return 0xFFFFFFFF; + } +} + +drwav_uint32 drwav_data_chunk_size_riff(drwav_uint64 dataChunkSize) +{ + if (dataChunkSize <= 0xFFFFFFFF) { + return (drwav_uint32)dataChunkSize; + } else { + return 0xFFFFFFFF; + } +} + +drwav_uint64 drwav_riff_chunk_size_w64(drwav_uint64 dataChunkSize) +{ + return 80 + 24 + dataChunkSize; // +24 because W64 includes the size of the GUID and size fields. +} + +drwav_uint64 drwav_data_chunk_size_w64(drwav_uint64 dataChunkSize) +{ + return 24 + dataChunkSize; // +24 because W64 includes the size of the GUID and size fields. +} + + +drwav_bool32 drwav_init_write__internal(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData) +{ + if (pWav == NULL) { + return DRWAV_FALSE; + } + + if (onWrite == NULL) { + return DRWAV_FALSE; + } + + if (!isSequential && onSeek == NULL) { + return DRWAV_FALSE; // <-- onSeek is required when in non-sequential mode. + } + + + // Not currently supporting compressed formats. Will need to add support for the "fact" chunk before we enable this. + if (pFormat->format == DR_WAVE_FORMAT_EXTENSIBLE) { + return DRWAV_FALSE; + } + if (pFormat->format == DR_WAVE_FORMAT_ADPCM || pFormat->format == DR_WAVE_FORMAT_DVI_ADPCM) { + return DRWAV_FALSE; + } + + + drwav_zero_memory(pWav, sizeof(*pWav)); + pWav->onWrite = onWrite; + pWav->onSeek = onSeek; + pWav->pUserData = pUserData; + pWav->fmt.formatTag = (drwav_uint16)pFormat->format; + pWav->fmt.channels = (drwav_uint16)pFormat->channels; + pWav->fmt.sampleRate = pFormat->sampleRate; + pWav->fmt.avgBytesPerSec = (drwav_uint32)((pFormat->bitsPerSample * pFormat->sampleRate * pFormat->channels) / 8); + pWav->fmt.blockAlign = (drwav_uint16)((pFormat->channels * pFormat->bitsPerSample) / 8); + pWav->fmt.bitsPerSample = (drwav_uint16)pFormat->bitsPerSample; + pWav->fmt.extendedSize = 0; + pWav->isSequentialWrite = isSequential; + + + size_t runningPos = 0; + + // The initial values for the "RIFF" and "data" chunks depends on whether or not we are initializing in sequential mode or not. In + // sequential mode we set this to its final values straight away since they can be calculated from the total sample count. In non- + // sequential mode we initialize it all to zero and fill it out in drwav_uninit() using a backwards seek. + drwav_uint64 initialDataChunkSize = 0; + if (isSequential) { + initialDataChunkSize = (totalSampleCount * pWav->fmt.bitsPerSample) / 8; + + // The RIFF container has a limit on the number of samples. drwav is not allowing this. There's no practical limits for Wave64 + // so for the sake of simplicity I'm not doing any validation for that. + if (pFormat->container == drwav_container_riff) { + if (initialDataChunkSize > (0xFFFFFFFF - 36)) { + return DRWAV_FALSE; // Not enough room to store every sample. + } + } + } + + pWav->dataChunkDataSizeTargetWrite = initialDataChunkSize; + + + // "RIFF" chunk. + if (pFormat->container == drwav_container_riff) { + drwav_uint32 chunkSizeRIFF = 36 + (drwav_uint32)initialDataChunkSize; // +36 = "RIFF"+[RIFF Chunk Size]+"WAVE" + [sizeof "fmt " chunk] + runningPos += pWav->onWrite(pUserData, "RIFF", 4); + runningPos += pWav->onWrite(pUserData, &chunkSizeRIFF, 4); + runningPos += pWav->onWrite(pUserData, "WAVE", 4); + } else { + drwav_uint64 chunkSizeRIFF = 80 + 24 + initialDataChunkSize; // +24 because W64 includes the size of the GUID and size fields. + runningPos += pWav->onWrite(pUserData, drwavGUID_W64_RIFF, 16); + runningPos += pWav->onWrite(pUserData, &chunkSizeRIFF, 8); + runningPos += pWav->onWrite(pUserData, drwavGUID_W64_WAVE, 16); + } + + // "fmt " chunk. + drwav_uint64 chunkSizeFMT; + if (pFormat->container == drwav_container_riff) { + chunkSizeFMT = 16; + runningPos += pWav->onWrite(pUserData, "fmt ", 4); + runningPos += pWav->onWrite(pUserData, &chunkSizeFMT, 4); + } else { + chunkSizeFMT = 40; + runningPos += pWav->onWrite(pUserData, drwavGUID_W64_FMT, 16); + runningPos += pWav->onWrite(pUserData, &chunkSizeFMT, 8); + } + + runningPos += pWav->onWrite(pUserData, &pWav->fmt.formatTag, 2); + runningPos += pWav->onWrite(pUserData, &pWav->fmt.channels, 2); + runningPos += pWav->onWrite(pUserData, &pWav->fmt.sampleRate, 4); + runningPos += pWav->onWrite(pUserData, &pWav->fmt.avgBytesPerSec, 4); + runningPos += pWav->onWrite(pUserData, &pWav->fmt.blockAlign, 2); + runningPos += pWav->onWrite(pUserData, &pWav->fmt.bitsPerSample, 2); + + pWav->dataChunkDataPos = runningPos; + + // "data" chunk. + if (pFormat->container == drwav_container_riff) { + drwav_uint32 chunkSizeDATA = (drwav_uint32)initialDataChunkSize; + runningPos += pWav->onWrite(pUserData, "data", 4); + runningPos += pWav->onWrite(pUserData, &chunkSizeDATA, 4); + } else { + drwav_uint64 chunkSizeDATA = 24 + initialDataChunkSize; // +24 because W64 includes the size of the GUID and size fields. + runningPos += pWav->onWrite(pUserData, drwavGUID_W64_DATA, 16); + runningPos += pWav->onWrite(pUserData, &chunkSizeDATA, 8); + } + + + // Simple validation. + if (pFormat->container == drwav_container_riff) { + if (runningPos != 20 + chunkSizeFMT + 8) { + return DRWAV_FALSE; + } + } else { + if (runningPos != 40 + chunkSizeFMT + 24) { + return DRWAV_FALSE; + } + } + + + + // Set some properties for the client's convenience. + pWav->container = pFormat->container; + pWav->channels = (drwav_uint16)pFormat->channels; + pWav->sampleRate = pFormat->sampleRate; + pWav->bitsPerSample = (drwav_uint16)pFormat->bitsPerSample; + pWav->translatedFormatTag = (drwav_uint16)pFormat->format; + + return DRWAV_TRUE; +} + + +drwav_bool32 drwav_init_write(drwav* pWav, const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData) +{ + return drwav_init_write__internal(pWav, pFormat, 0, DRWAV_FALSE, onWrite, onSeek, pUserData); // DRWAV_FALSE = Not Sequential +} + +drwav_bool32 drwav_init_write_sequential(drwav* pWav, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_write_proc onWrite, void* pUserData) +{ + return drwav_init_write__internal(pWav, pFormat, totalSampleCount, DRWAV_TRUE, onWrite, NULL, pUserData); // DRWAV_TRUE = Sequential +} + +void drwav_uninit(drwav* pWav) +{ + if (pWav == NULL) { + return; + } + + // If the drwav object was opened in write mode we'll need to finalize a few things: + // - Make sure the "data" chunk is aligned to 16-bits for RIFF containers, or 64 bits for W64 containers. + // - Set the size of the "data" chunk. + if (pWav->onWrite != NULL) { + // Validation for sequential mode. + if (pWav->isSequentialWrite) { + drwav_assert(pWav->dataChunkDataSize == pWav->dataChunkDataSizeTargetWrite); + } + + // Padding. Do not adjust pWav->dataChunkDataSize - this should not include the padding. + drwav_uint32 paddingSize = 0; + if (pWav->container == drwav_container_riff) { + paddingSize = (drwav_uint32)(pWav->dataChunkDataSize % 2); + } else { + paddingSize = (drwav_uint32)(pWav->dataChunkDataSize % 8); + } + + if (paddingSize > 0) { + drwav_uint64 paddingData = 0; + pWav->onWrite(pWav->pUserData, &paddingData, paddingSize); + } + + + // Chunk sizes. When using sequential mode, these will have been filled in at initialization time. We only need + // to do this when using non-sequential mode. + if (pWav->onSeek && !pWav->isSequentialWrite) { + if (pWav->container == drwav_container_riff) { + // The "RIFF" chunk size. + if (pWav->onSeek(pWav->pUserData, 4, drwav_seek_origin_start)) { + drwav_uint32 riffChunkSize = drwav_riff_chunk_size_riff(pWav->dataChunkDataSize); + pWav->onWrite(pWav->pUserData, &riffChunkSize, 4); + } + + // the "data" chunk size. + if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos + 4, drwav_seek_origin_start)) { + drwav_uint32 dataChunkSize = drwav_data_chunk_size_riff(pWav->dataChunkDataSize); + pWav->onWrite(pWav->pUserData, &dataChunkSize, 4); + } + } else { + // The "RIFF" chunk size. + if (pWav->onSeek(pWav->pUserData, 16, drwav_seek_origin_start)) { + drwav_uint64 riffChunkSize = drwav_riff_chunk_size_w64(pWav->dataChunkDataSize); + pWav->onWrite(pWav->pUserData, &riffChunkSize, 8); + } + + // The "data" chunk size. + if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos + 16, drwav_seek_origin_start)) { + drwav_uint64 dataChunkSize = drwav_data_chunk_size_w64(pWav->dataChunkDataSize); + pWav->onWrite(pWav->pUserData, &dataChunkSize, 8); + } + } + } + } + +#ifndef DR_WAV_NO_STDIO + // If we opened the file with drwav_open_file() we will want to close the file handle. We can know whether or not drwav_open_file() + // was used by looking at the onRead and onSeek callbacks. + if (pWav->onRead == drwav__on_read_stdio || pWav->onWrite == drwav__on_write_stdio) { + fclose((FILE*)pWav->pUserData); + } +#endif +} + + +drwav* drwav_open(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData) +{ + return drwav_open_ex(onRead, onSeek, NULL, pUserData, NULL, 0); +} + +drwav* drwav_open_ex(drwav_read_proc onRead, drwav_seek_proc onSeek, drwav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, drwav_uint32 flags) +{ + drwav* pWav = (drwav*)DRWAV_MALLOC(sizeof(*pWav)); + if (pWav == NULL) { + return NULL; + } + + if (!drwav_init_ex(pWav, onRead, onSeek, onChunk, pReadSeekUserData, pChunkUserData, flags)) { + DRWAV_FREE(pWav); + return NULL; + } + + return pWav; +} + + +drwav* drwav_open_write__internal(const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData) +{ + drwav* pWav = (drwav*)DRWAV_MALLOC(sizeof(*pWav)); + if (pWav == NULL) { + return NULL; + } + + if (!drwav_init_write__internal(pWav, pFormat, totalSampleCount, isSequential, onWrite, onSeek, pUserData)) { + DRWAV_FREE(pWav); + return NULL; + } + + return pWav; +} + +drwav* drwav_open_write(const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData) +{ + return drwav_open_write__internal(pFormat, 0, DRWAV_FALSE, onWrite, onSeek, pUserData); +} + +drwav* drwav_open_write_sequential(const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_write_proc onWrite, void* pUserData) +{ + return drwav_open_write__internal(pFormat, totalSampleCount, DRWAV_TRUE, onWrite, NULL, pUserData); +} + +void drwav_close(drwav* pWav) +{ + drwav_uninit(pWav); + DRWAV_FREE(pWav); +} + + +size_t drwav_read_raw(drwav* pWav, size_t bytesToRead, void* pBufferOut) +{ + if (pWav == NULL || bytesToRead == 0 || pBufferOut == NULL) { + return 0; + } + + if (bytesToRead > pWav->bytesRemaining) { + bytesToRead = (size_t)pWav->bytesRemaining; + } + + size_t bytesRead = pWav->onRead(pWav->pUserData, pBufferOut, bytesToRead); + + pWav->bytesRemaining -= bytesRead; + return bytesRead; +} + +drwav_uint64 drwav_read(drwav* pWav, drwav_uint64 samplesToRead, void* pBufferOut) +{ + if (pWav == NULL || samplesToRead == 0 || pBufferOut == NULL) { + return 0; + } + + // Cannot use this function for compressed formats. + if (drwav__is_compressed_format_tag(pWav->translatedFormatTag)) { + return 0; + } + + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + // Don't try to read more samples than can potentially fit in the output buffer. + if (samplesToRead * bytesPerSample > DRWAV_SIZE_MAX) { + samplesToRead = DRWAV_SIZE_MAX / bytesPerSample; + } + + size_t bytesRead = drwav_read_raw(pWav, (size_t)(samplesToRead * bytesPerSample), pBufferOut); + return bytesRead / bytesPerSample; +} + +drwav_uint64 drwav_read_pcm_frames(drwav* pWav, drwav_uint64 framesToRead, void* pBufferOut) +{ + if (pWav == NULL || framesToRead == 0 || pBufferOut == NULL) { + return 0; + } + + // Cannot use this function for compressed formats. + if (drwav__is_compressed_format_tag(pWav->translatedFormatTag)) { + return 0; + } + + drwav_uint32 bytesPerFrame = drwav_get_bytes_per_pcm_frame(pWav); + if (bytesPerFrame == 0) { + return 0; + } + + // Don't try to read more samples than can potentially fit in the output buffer. + if (framesToRead * bytesPerFrame > DRWAV_SIZE_MAX) { + framesToRead = DRWAV_SIZE_MAX / bytesPerFrame; + } + + size_t bytesRead = drwav_read_raw(pWav, (size_t)(framesToRead * bytesPerFrame), pBufferOut); + return bytesRead / bytesPerFrame; +} + +drwav_bool32 drwav_seek_to_first_pcm_frame(drwav* pWav) +{ + if (pWav->onWrite != NULL) { + return DRWAV_FALSE; // No seeking in write mode. + } + + if (!pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos, drwav_seek_origin_start)) { + return DRWAV_FALSE; + } + + if (drwav__is_compressed_format_tag(pWav->translatedFormatTag)) { + pWav->compressed.iCurrentSample = 0; + } + + pWav->bytesRemaining = pWav->dataChunkDataSize; + return DRWAV_TRUE; +} + +drwav_bool32 drwav_seek_to_sample(drwav* pWav, drwav_uint64 sample) +{ + // Seeking should be compatible with wave files > 2GB. + + if (pWav->onWrite != NULL) { + return DRWAV_FALSE; // No seeking in write mode. + } + + if (pWav == NULL || pWav->onSeek == NULL) { + return DRWAV_FALSE; + } + + // If there are no samples, just return DRWAV_TRUE without doing anything. + if (pWav->totalSampleCount == 0) { + return DRWAV_TRUE; + } + + // Make sure the sample is clamped. + if (sample >= pWav->totalSampleCount) { + sample = pWav->totalSampleCount - 1; + } + + + // For compressed formats we just use a slow generic seek. If we are seeking forward we just seek forward. If we are going backwards we need + // to seek back to the start. + if (drwav__is_compressed_format_tag(pWav->translatedFormatTag)) { + // TODO: This can be optimized. + + // If we're seeking forward it's simple - just keep reading samples until we hit the sample we're requesting. If we're seeking backwards, + // we first need to seek back to the start and then just do the same thing as a forward seek. + if (sample < pWav->compressed.iCurrentSample) { + if (!drwav_seek_to_first_pcm_frame(pWav)) { + return DRWAV_FALSE; + } + } + + if (sample > pWav->compressed.iCurrentSample) { + drwav_uint64 offset = sample - pWav->compressed.iCurrentSample; + + drwav_int16 devnull[2048]; + while (offset > 0) { + drwav_uint64 samplesToRead = offset; + if (samplesToRead > 2048) { + samplesToRead = 2048; + } + + drwav_uint64 samplesRead = 0; + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { + samplesRead = drwav_read_s16__msadpcm(pWav, samplesToRead, devnull); + } else if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { + samplesRead = drwav_read_s16__ima(pWav, samplesToRead, devnull); + } else { + assert(DRWAV_FALSE); // If this assertion is triggered it means I've implemented a new compressed format but forgot to add a branch for it here. + } + + if (samplesRead != samplesToRead) { + return DRWAV_FALSE; + } + + offset -= samplesRead; + } + } + } else { + drwav_uint64 totalSizeInBytes = pWav->totalPCMFrameCount * drwav_get_bytes_per_pcm_frame(pWav); + drwav_assert(totalSizeInBytes >= pWav->bytesRemaining); + + drwav_uint64 currentBytePos = totalSizeInBytes - pWav->bytesRemaining; + drwav_uint64 targetBytePos = sample * drwav_get_bytes_per_sample(pWav); + + drwav_uint64 offset; + if (currentBytePos < targetBytePos) { + // Offset forwards. + offset = (targetBytePos - currentBytePos); + } else { + // Offset backwards. + if (!drwav_seek_to_first_pcm_frame(pWav)) { + return DRWAV_FALSE; + } + offset = targetBytePos; + } + + while (offset > 0) { + int offset32 = ((offset > INT_MAX) ? INT_MAX : (int)offset); + if (!pWav->onSeek(pWav->pUserData, offset32, drwav_seek_origin_current)) { + return DRWAV_FALSE; + } + + pWav->bytesRemaining -= offset32; + offset -= offset32; + } + } + + return DRWAV_TRUE; +} + +drwav_bool32 drwav_seek_to_pcm_frame(drwav* pWav, drwav_uint64 targetFrameIndex) +{ + return drwav_seek_to_sample(pWav, targetFrameIndex * pWav->channels); +} + + +size_t drwav_write_raw(drwav* pWav, size_t bytesToWrite, const void* pData) +{ + if (pWav == NULL || bytesToWrite == 0 || pData == NULL) { + return 0; + } + + size_t bytesWritten = pWav->onWrite(pWav->pUserData, pData, bytesToWrite); + pWav->dataChunkDataSize += bytesWritten; + + return bytesWritten; +} + +drwav_uint64 drwav_write(drwav* pWav, drwav_uint64 samplesToWrite, const void* pData) +{ + if (pWav == NULL || samplesToWrite == 0 || pData == NULL) { + return 0; + } + + drwav_uint64 bytesToWrite = ((samplesToWrite * pWav->bitsPerSample) / 8); + if (bytesToWrite > DRWAV_SIZE_MAX) { + return 0; + } + + drwav_uint64 bytesWritten = 0; + const drwav_uint8* pRunningData = (const drwav_uint8*)pData; + while (bytesToWrite > 0) { + drwav_uint64 bytesToWriteThisIteration = bytesToWrite; + if (bytesToWriteThisIteration > DRWAV_SIZE_MAX) { + bytesToWriteThisIteration = DRWAV_SIZE_MAX; + } + + size_t bytesJustWritten = drwav_write_raw(pWav, (size_t)bytesToWriteThisIteration, pRunningData); + if (bytesJustWritten == 0) { + break; + } + + bytesToWrite -= bytesJustWritten; + bytesWritten += bytesJustWritten; + pRunningData += bytesJustWritten; + } + + return (bytesWritten * 8) / pWav->bitsPerSample; +} + +drwav_uint64 drwav_write_pcm_frames(drwav* pWav, drwav_uint64 framesToWrite, const void* pData) +{ + return drwav_write(pWav, framesToWrite * pWav->channels, pData) / pWav->channels; +} + + + +drwav_uint64 drwav_read_s16__msadpcm(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut) +{ + drwav_assert(pWav != NULL); + drwav_assert(samplesToRead > 0); + drwav_assert(pBufferOut != NULL); + + // TODO: Lots of room for optimization here. + + drwav_uint64 totalSamplesRead = 0; + + while (samplesToRead > 0 && pWav->compressed.iCurrentSample < pWav->totalSampleCount) { + // If there are no cached samples we need to load a new block. + if (pWav->msadpcm.cachedSampleCount == 0 && pWav->msadpcm.bytesRemainingInBlock == 0) { + if (pWav->channels == 1) { + // Mono. + drwav_uint8 header[7]; + if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) { + return totalSamplesRead; + } + pWav->msadpcm.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); + + pWav->msadpcm.predictor[0] = header[0]; + pWav->msadpcm.delta[0] = drwav__bytes_to_s16(header + 1); + pWav->msadpcm.prevSamples[0][1] = (drwav_int32)drwav__bytes_to_s16(header + 3); + pWav->msadpcm.prevSamples[0][0] = (drwav_int32)drwav__bytes_to_s16(header + 5); + pWav->msadpcm.cachedSamples[2] = pWav->msadpcm.prevSamples[0][0]; + pWav->msadpcm.cachedSamples[3] = pWav->msadpcm.prevSamples[0][1]; + pWav->msadpcm.cachedSampleCount = 2; + } else { + // Stereo. + drwav_uint8 header[14]; + if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) { + return totalSamplesRead; + } + pWav->msadpcm.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); + + pWav->msadpcm.predictor[0] = header[0]; + pWav->msadpcm.predictor[1] = header[1]; + pWav->msadpcm.delta[0] = drwav__bytes_to_s16(header + 2); + pWav->msadpcm.delta[1] = drwav__bytes_to_s16(header + 4); + pWav->msadpcm.prevSamples[0][1] = (drwav_int32)drwav__bytes_to_s16(header + 6); + pWav->msadpcm.prevSamples[1][1] = (drwav_int32)drwav__bytes_to_s16(header + 8); + pWav->msadpcm.prevSamples[0][0] = (drwav_int32)drwav__bytes_to_s16(header + 10); + pWav->msadpcm.prevSamples[1][0] = (drwav_int32)drwav__bytes_to_s16(header + 12); + + pWav->msadpcm.cachedSamples[0] = pWav->msadpcm.prevSamples[0][0]; + pWav->msadpcm.cachedSamples[1] = pWav->msadpcm.prevSamples[1][0]; + pWav->msadpcm.cachedSamples[2] = pWav->msadpcm.prevSamples[0][1]; + pWav->msadpcm.cachedSamples[3] = pWav->msadpcm.prevSamples[1][1]; + pWav->msadpcm.cachedSampleCount = 4; + } + } + + // Output anything that's cached. + while (samplesToRead > 0 && pWav->msadpcm.cachedSampleCount > 0 && pWav->compressed.iCurrentSample < pWav->totalSampleCount) { + pBufferOut[0] = (drwav_int16)pWav->msadpcm.cachedSamples[drwav_countof(pWav->msadpcm.cachedSamples) - pWav->msadpcm.cachedSampleCount]; + pWav->msadpcm.cachedSampleCount -= 1; + + pBufferOut += 1; + samplesToRead -= 1; + totalSamplesRead += 1; + pWav->compressed.iCurrentSample += 1; + } + + if (samplesToRead == 0) { + return totalSamplesRead; + } + + + // If there's nothing left in the cache, just go ahead and load more. If there's nothing left to load in the current block we just continue to the next + // loop iteration which will trigger the loading of a new block. + if (pWav->msadpcm.cachedSampleCount == 0) { + if (pWav->msadpcm.bytesRemainingInBlock == 0) { + continue; + } else { + drwav_uint8 nibbles; + if (pWav->onRead(pWav->pUserData, &nibbles, 1) != 1) { + return totalSamplesRead; + } + pWav->msadpcm.bytesRemainingInBlock -= 1; + + // TODO: Optimize away these if statements. + drwav_int32 nibble0 = ((nibbles & 0xF0) >> 4); if ((nibbles & 0x80)) { nibble0 |= 0xFFFFFFF0UL; } + drwav_int32 nibble1 = ((nibbles & 0x0F) >> 0); if ((nibbles & 0x08)) { nibble1 |= 0xFFFFFFF0UL; } + + static drwav_int32 adaptationTable[] = { + 230, 230, 230, 230, 307, 409, 512, 614, + 768, 614, 512, 409, 307, 230, 230, 230 + }; + static drwav_int32 coeff1Table[] = { 256, 512, 0, 192, 240, 460, 392 }; + static drwav_int32 coeff2Table[] = { 0, -256, 0, 64, 0, -208, -232 }; + + if (pWav->channels == 1) { + // Mono. + drwav_int32 newSample0; + newSample0 = ((pWav->msadpcm.prevSamples[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevSamples[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8; + newSample0 += nibble0 * pWav->msadpcm.delta[0]; + newSample0 = drwav_clamp(newSample0, -32768, 32767); + + pWav->msadpcm.delta[0] = (adaptationTable[((nibbles & 0xF0) >> 4)] * pWav->msadpcm.delta[0]) >> 8; + if (pWav->msadpcm.delta[0] < 16) { + pWav->msadpcm.delta[0] = 16; + } + + pWav->msadpcm.prevSamples[0][0] = pWav->msadpcm.prevSamples[0][1]; + pWav->msadpcm.prevSamples[0][1] = newSample0; + + + drwav_int32 newSample1; + newSample1 = ((pWav->msadpcm.prevSamples[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevSamples[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8; + newSample1 += nibble1 * pWav->msadpcm.delta[0]; + newSample1 = drwav_clamp(newSample1, -32768, 32767); + + pWav->msadpcm.delta[0] = (adaptationTable[((nibbles & 0x0F) >> 0)] * pWav->msadpcm.delta[0]) >> 8; + if (pWav->msadpcm.delta[0] < 16) { + pWav->msadpcm.delta[0] = 16; + } + + pWav->msadpcm.prevSamples[0][0] = pWav->msadpcm.prevSamples[0][1]; + pWav->msadpcm.prevSamples[0][1] = newSample1; + + + pWav->msadpcm.cachedSamples[2] = newSample0; + pWav->msadpcm.cachedSamples[3] = newSample1; + pWav->msadpcm.cachedSampleCount = 2; + } else { + // Stereo. + + // Left. + drwav_int32 newSample0; + newSample0 = ((pWav->msadpcm.prevSamples[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevSamples[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8; + newSample0 += nibble0 * pWav->msadpcm.delta[0]; + newSample0 = drwav_clamp(newSample0, -32768, 32767); + + pWav->msadpcm.delta[0] = (adaptationTable[((nibbles & 0xF0) >> 4)] * pWav->msadpcm.delta[0]) >> 8; + if (pWav->msadpcm.delta[0] < 16) { + pWav->msadpcm.delta[0] = 16; + } + + pWav->msadpcm.prevSamples[0][0] = pWav->msadpcm.prevSamples[0][1]; + pWav->msadpcm.prevSamples[0][1] = newSample0; + + + // Right. + drwav_int32 newSample1; + newSample1 = ((pWav->msadpcm.prevSamples[1][1] * coeff1Table[pWav->msadpcm.predictor[1]]) + (pWav->msadpcm.prevSamples[1][0] * coeff2Table[pWav->msadpcm.predictor[1]])) >> 8; + newSample1 += nibble1 * pWav->msadpcm.delta[1]; + newSample1 = drwav_clamp(newSample1, -32768, 32767); + + pWav->msadpcm.delta[1] = (adaptationTable[((nibbles & 0x0F) >> 0)] * pWav->msadpcm.delta[1]) >> 8; + if (pWav->msadpcm.delta[1] < 16) { + pWav->msadpcm.delta[1] = 16; + } + + pWav->msadpcm.prevSamples[1][0] = pWav->msadpcm.prevSamples[1][1]; + pWav->msadpcm.prevSamples[1][1] = newSample1; + + pWav->msadpcm.cachedSamples[2] = newSample0; + pWav->msadpcm.cachedSamples[3] = newSample1; + pWav->msadpcm.cachedSampleCount = 2; + } + } + } + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s16__ima(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut) +{ + drwav_assert(pWav != NULL); + drwav_assert(samplesToRead > 0); + drwav_assert(pBufferOut != NULL); + + // TODO: Lots of room for optimization here. + + drwav_uint64 totalSamplesRead = 0; + + while (samplesToRead > 0 && pWav->compressed.iCurrentSample < pWav->totalSampleCount) { + // If there are no cached samples we need to load a new block. + if (pWav->ima.cachedSampleCount == 0 && pWav->ima.bytesRemainingInBlock == 0) { + if (pWav->channels == 1) { + // Mono. + drwav_uint8 header[4]; + if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) { + return totalSamplesRead; + } + pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); + + pWav->ima.predictor[0] = drwav__bytes_to_s16(header + 0); + pWav->ima.stepIndex[0] = header[2]; + pWav->ima.cachedSamples[drwav_countof(pWav->ima.cachedSamples) - 1] = pWav->ima.predictor[0]; + pWav->ima.cachedSampleCount = 1; + } else { + // Stereo. + drwav_uint8 header[8]; + if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) { + return totalSamplesRead; + } + pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); + + pWav->ima.predictor[0] = drwav__bytes_to_s16(header + 0); + pWav->ima.stepIndex[0] = header[2]; + pWav->ima.predictor[1] = drwav__bytes_to_s16(header + 4); + pWav->ima.stepIndex[1] = header[6]; + + pWav->ima.cachedSamples[drwav_countof(pWav->ima.cachedSamples) - 2] = pWav->ima.predictor[0]; + pWav->ima.cachedSamples[drwav_countof(pWav->ima.cachedSamples) - 1] = pWav->ima.predictor[1]; + pWav->ima.cachedSampleCount = 2; + } + } + + // Output anything that's cached. + while (samplesToRead > 0 && pWav->ima.cachedSampleCount > 0 && pWav->compressed.iCurrentSample < pWav->totalSampleCount) { + pBufferOut[0] = (drwav_int16)pWav->ima.cachedSamples[drwav_countof(pWav->ima.cachedSamples) - pWav->ima.cachedSampleCount]; + pWav->ima.cachedSampleCount -= 1; + + pBufferOut += 1; + samplesToRead -= 1; + totalSamplesRead += 1; + pWav->compressed.iCurrentSample += 1; + } + + if (samplesToRead == 0) { + return totalSamplesRead; + } + + // If there's nothing left in the cache, just go ahead and load more. If there's nothing left to load in the current block we just continue to the next + // loop iteration which will trigger the loading of a new block. + if (pWav->ima.cachedSampleCount == 0) { + if (pWav->ima.bytesRemainingInBlock == 0) { + continue; + } else { + static drwav_int32 indexTable[16] = { + -1, -1, -1, -1, 2, 4, 6, 8, + -1, -1, -1, -1, 2, 4, 6, 8 + }; + + static drwav_int32 stepTable[89] = { + 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, + 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, + 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, + 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, + 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, + 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, + 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, + 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, + 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 + }; + + // From what I can tell with stereo streams, it looks like every 4 bytes (8 samples) is for one channel. So it goes 4 bytes for the + // left channel, 4 bytes for the right channel. + pWav->ima.cachedSampleCount = 8 * pWav->channels; + for (drwav_uint32 iChannel = 0; iChannel < pWav->channels; ++iChannel) { + drwav_uint8 nibbles[4]; + if (pWav->onRead(pWav->pUserData, &nibbles, 4) != 4) { + return totalSamplesRead; + } + pWav->ima.bytesRemainingInBlock -= 4; + + for (drwav_uint32 iByte = 0; iByte < 4; ++iByte) { + drwav_uint8 nibble0 = ((nibbles[iByte] & 0x0F) >> 0); + drwav_uint8 nibble1 = ((nibbles[iByte] & 0xF0) >> 4); + + drwav_int32 step = stepTable[pWav->ima.stepIndex[iChannel]]; + drwav_int32 predictor = pWav->ima.predictor[iChannel]; + + drwav_int32 diff = step >> 3; + if (nibble0 & 1) diff += step >> 2; + if (nibble0 & 2) diff += step >> 1; + if (nibble0 & 4) diff += step; + if (nibble0 & 8) diff = -diff; + + predictor = drwav_clamp(predictor + diff, -32768, 32767); + pWav->ima.predictor[iChannel] = predictor; + pWav->ima.stepIndex[iChannel] = drwav_clamp(pWav->ima.stepIndex[iChannel] + indexTable[nibble0], 0, (drwav_int32)drwav_countof(stepTable)-1); + pWav->ima.cachedSamples[(drwav_countof(pWav->ima.cachedSamples) - pWav->ima.cachedSampleCount) + (iByte*2+0)*pWav->channels + iChannel] = predictor; + + + step = stepTable[pWav->ima.stepIndex[iChannel]]; + predictor = pWav->ima.predictor[iChannel]; + + diff = step >> 3; + if (nibble1 & 1) diff += step >> 2; + if (nibble1 & 2) diff += step >> 1; + if (nibble1 & 4) diff += step; + if (nibble1 & 8) diff = -diff; + + predictor = drwav_clamp(predictor + diff, -32768, 32767); + pWav->ima.predictor[iChannel] = predictor; + pWav->ima.stepIndex[iChannel] = drwav_clamp(pWav->ima.stepIndex[iChannel] + indexTable[nibble1], 0, (drwav_int32)drwav_countof(stepTable)-1); + pWav->ima.cachedSamples[(drwav_countof(pWav->ima.cachedSamples) - pWav->ima.cachedSampleCount) + (iByte*2+1)*pWav->channels + iChannel] = predictor; + } + } + } + } + } + + return totalSamplesRead; +} + + +#ifndef DR_WAV_NO_CONVERSION_API +static unsigned short g_drwavAlawTable[256] = { + 0xEA80, 0xEB80, 0xE880, 0xE980, 0xEE80, 0xEF80, 0xEC80, 0xED80, 0xE280, 0xE380, 0xE080, 0xE180, 0xE680, 0xE780, 0xE480, 0xE580, + 0xF540, 0xF5C0, 0xF440, 0xF4C0, 0xF740, 0xF7C0, 0xF640, 0xF6C0, 0xF140, 0xF1C0, 0xF040, 0xF0C0, 0xF340, 0xF3C0, 0xF240, 0xF2C0, + 0xAA00, 0xAE00, 0xA200, 0xA600, 0xBA00, 0xBE00, 0xB200, 0xB600, 0x8A00, 0x8E00, 0x8200, 0x8600, 0x9A00, 0x9E00, 0x9200, 0x9600, + 0xD500, 0xD700, 0xD100, 0xD300, 0xDD00, 0xDF00, 0xD900, 0xDB00, 0xC500, 0xC700, 0xC100, 0xC300, 0xCD00, 0xCF00, 0xC900, 0xCB00, + 0xFEA8, 0xFEB8, 0xFE88, 0xFE98, 0xFEE8, 0xFEF8, 0xFEC8, 0xFED8, 0xFE28, 0xFE38, 0xFE08, 0xFE18, 0xFE68, 0xFE78, 0xFE48, 0xFE58, + 0xFFA8, 0xFFB8, 0xFF88, 0xFF98, 0xFFE8, 0xFFF8, 0xFFC8, 0xFFD8, 0xFF28, 0xFF38, 0xFF08, 0xFF18, 0xFF68, 0xFF78, 0xFF48, 0xFF58, + 0xFAA0, 0xFAE0, 0xFA20, 0xFA60, 0xFBA0, 0xFBE0, 0xFB20, 0xFB60, 0xF8A0, 0xF8E0, 0xF820, 0xF860, 0xF9A0, 0xF9E0, 0xF920, 0xF960, + 0xFD50, 0xFD70, 0xFD10, 0xFD30, 0xFDD0, 0xFDF0, 0xFD90, 0xFDB0, 0xFC50, 0xFC70, 0xFC10, 0xFC30, 0xFCD0, 0xFCF0, 0xFC90, 0xFCB0, + 0x1580, 0x1480, 0x1780, 0x1680, 0x1180, 0x1080, 0x1380, 0x1280, 0x1D80, 0x1C80, 0x1F80, 0x1E80, 0x1980, 0x1880, 0x1B80, 0x1A80, + 0x0AC0, 0x0A40, 0x0BC0, 0x0B40, 0x08C0, 0x0840, 0x09C0, 0x0940, 0x0EC0, 0x0E40, 0x0FC0, 0x0F40, 0x0CC0, 0x0C40, 0x0DC0, 0x0D40, + 0x5600, 0x5200, 0x5E00, 0x5A00, 0x4600, 0x4200, 0x4E00, 0x4A00, 0x7600, 0x7200, 0x7E00, 0x7A00, 0x6600, 0x6200, 0x6E00, 0x6A00, + 0x2B00, 0x2900, 0x2F00, 0x2D00, 0x2300, 0x2100, 0x2700, 0x2500, 0x3B00, 0x3900, 0x3F00, 0x3D00, 0x3300, 0x3100, 0x3700, 0x3500, + 0x0158, 0x0148, 0x0178, 0x0168, 0x0118, 0x0108, 0x0138, 0x0128, 0x01D8, 0x01C8, 0x01F8, 0x01E8, 0x0198, 0x0188, 0x01B8, 0x01A8, + 0x0058, 0x0048, 0x0078, 0x0068, 0x0018, 0x0008, 0x0038, 0x0028, 0x00D8, 0x00C8, 0x00F8, 0x00E8, 0x0098, 0x0088, 0x00B8, 0x00A8, + 0x0560, 0x0520, 0x05E0, 0x05A0, 0x0460, 0x0420, 0x04E0, 0x04A0, 0x0760, 0x0720, 0x07E0, 0x07A0, 0x0660, 0x0620, 0x06E0, 0x06A0, + 0x02B0, 0x0290, 0x02F0, 0x02D0, 0x0230, 0x0210, 0x0270, 0x0250, 0x03B0, 0x0390, 0x03F0, 0x03D0, 0x0330, 0x0310, 0x0370, 0x0350 +}; + +static unsigned short g_drwavMulawTable[256] = { + 0x8284, 0x8684, 0x8A84, 0x8E84, 0x9284, 0x9684, 0x9A84, 0x9E84, 0xA284, 0xA684, 0xAA84, 0xAE84, 0xB284, 0xB684, 0xBA84, 0xBE84, + 0xC184, 0xC384, 0xC584, 0xC784, 0xC984, 0xCB84, 0xCD84, 0xCF84, 0xD184, 0xD384, 0xD584, 0xD784, 0xD984, 0xDB84, 0xDD84, 0xDF84, + 0xE104, 0xE204, 0xE304, 0xE404, 0xE504, 0xE604, 0xE704, 0xE804, 0xE904, 0xEA04, 0xEB04, 0xEC04, 0xED04, 0xEE04, 0xEF04, 0xF004, + 0xF0C4, 0xF144, 0xF1C4, 0xF244, 0xF2C4, 0xF344, 0xF3C4, 0xF444, 0xF4C4, 0xF544, 0xF5C4, 0xF644, 0xF6C4, 0xF744, 0xF7C4, 0xF844, + 0xF8A4, 0xF8E4, 0xF924, 0xF964, 0xF9A4, 0xF9E4, 0xFA24, 0xFA64, 0xFAA4, 0xFAE4, 0xFB24, 0xFB64, 0xFBA4, 0xFBE4, 0xFC24, 0xFC64, + 0xFC94, 0xFCB4, 0xFCD4, 0xFCF4, 0xFD14, 0xFD34, 0xFD54, 0xFD74, 0xFD94, 0xFDB4, 0xFDD4, 0xFDF4, 0xFE14, 0xFE34, 0xFE54, 0xFE74, + 0xFE8C, 0xFE9C, 0xFEAC, 0xFEBC, 0xFECC, 0xFEDC, 0xFEEC, 0xFEFC, 0xFF0C, 0xFF1C, 0xFF2C, 0xFF3C, 0xFF4C, 0xFF5C, 0xFF6C, 0xFF7C, + 0xFF88, 0xFF90, 0xFF98, 0xFFA0, 0xFFA8, 0xFFB0, 0xFFB8, 0xFFC0, 0xFFC8, 0xFFD0, 0xFFD8, 0xFFE0, 0xFFE8, 0xFFF0, 0xFFF8, 0x0000, + 0x7D7C, 0x797C, 0x757C, 0x717C, 0x6D7C, 0x697C, 0x657C, 0x617C, 0x5D7C, 0x597C, 0x557C, 0x517C, 0x4D7C, 0x497C, 0x457C, 0x417C, + 0x3E7C, 0x3C7C, 0x3A7C, 0x387C, 0x367C, 0x347C, 0x327C, 0x307C, 0x2E7C, 0x2C7C, 0x2A7C, 0x287C, 0x267C, 0x247C, 0x227C, 0x207C, + 0x1EFC, 0x1DFC, 0x1CFC, 0x1BFC, 0x1AFC, 0x19FC, 0x18FC, 0x17FC, 0x16FC, 0x15FC, 0x14FC, 0x13FC, 0x12FC, 0x11FC, 0x10FC, 0x0FFC, + 0x0F3C, 0x0EBC, 0x0E3C, 0x0DBC, 0x0D3C, 0x0CBC, 0x0C3C, 0x0BBC, 0x0B3C, 0x0ABC, 0x0A3C, 0x09BC, 0x093C, 0x08BC, 0x083C, 0x07BC, + 0x075C, 0x071C, 0x06DC, 0x069C, 0x065C, 0x061C, 0x05DC, 0x059C, 0x055C, 0x051C, 0x04DC, 0x049C, 0x045C, 0x041C, 0x03DC, 0x039C, + 0x036C, 0x034C, 0x032C, 0x030C, 0x02EC, 0x02CC, 0x02AC, 0x028C, 0x026C, 0x024C, 0x022C, 0x020C, 0x01EC, 0x01CC, 0x01AC, 0x018C, + 0x0174, 0x0164, 0x0154, 0x0144, 0x0134, 0x0124, 0x0114, 0x0104, 0x00F4, 0x00E4, 0x00D4, 0x00C4, 0x00B4, 0x00A4, 0x0094, 0x0084, + 0x0078, 0x0070, 0x0068, 0x0060, 0x0058, 0x0050, 0x0048, 0x0040, 0x0038, 0x0030, 0x0028, 0x0020, 0x0018, 0x0010, 0x0008, 0x0000 +}; + +static DRWAV_INLINE drwav_int16 drwav__alaw_to_s16(drwav_uint8 sampleIn) +{ + return (short)g_drwavAlawTable[sampleIn]; +} + +static DRWAV_INLINE drwav_int16 drwav__mulaw_to_s16(drwav_uint8 sampleIn) +{ + return (short)g_drwavMulawTable[sampleIn]; +} + + + +static void drwav__pcm_to_s16(drwav_int16* pOut, const unsigned char* pIn, size_t totalSampleCount, unsigned int bytesPerSample) +{ + // Special case for 8-bit sample data because it's treated as unsigned. + if (bytesPerSample == 1) { + drwav_u8_to_s16(pOut, pIn, totalSampleCount); + return; + } + + + // Slightly more optimal implementation for common formats. + if (bytesPerSample == 2) { + for (unsigned int i = 0; i < totalSampleCount; ++i) { + *pOut++ = ((const drwav_int16*)pIn)[i]; + } + return; + } + if (bytesPerSample == 3) { + drwav_s24_to_s16(pOut, pIn, totalSampleCount); + return; + } + if (bytesPerSample == 4) { + drwav_s32_to_s16(pOut, (const drwav_int32*)pIn, totalSampleCount); + return; + } + + + // Anything more than 64 bits per sample is not supported. + if (bytesPerSample > 8) { + drwav_zero_memory(pOut, totalSampleCount * sizeof(*pOut)); + return; + } + + + // Generic, slow converter. + for (unsigned int i = 0; i < totalSampleCount; ++i) { + drwav_uint64 sample = 0; + unsigned int shift = (8 - bytesPerSample) * 8; + + unsigned int j; + for (j = 0; j < bytesPerSample && j < 8; j += 1) { + sample |= (drwav_uint64)(pIn[j]) << shift; + shift += 8; + } + + pIn += j; + *pOut++ = (drwav_int16)((drwav_int64)sample >> 48); + } +} + +static void drwav__ieee_to_s16(drwav_int16* pOut, const unsigned char* pIn, size_t totalSampleCount, unsigned int bytesPerSample) +{ + if (bytesPerSample == 4) { + drwav_f32_to_s16(pOut, (const float*)pIn, totalSampleCount); + return; + } else if (bytesPerSample == 8) { + drwav_f64_to_s16(pOut, (const double*)pIn, totalSampleCount); + return; + } else { + // Only supporting 32- and 64-bit float. Output silence in all other cases. Contributions welcome for 16-bit float. + drwav_zero_memory(pOut, totalSampleCount * sizeof(*pOut)); + return; + } +} + +drwav_uint64 drwav_read_s16__pcm(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut) +{ + drwav_uint32 bytesPerSample; + + // Fast path. + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM && pWav->bitsPerSample == 16) { + return drwav_read(pWav, samplesToRead, pBufferOut); + } + + bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav__pcm_to_s16(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s16__ieee(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut) +{ + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav__ieee_to_s16(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s16__alaw(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut) +{ + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav_alaw_to_s16(pBufferOut, sampleData, (size_t)samplesRead); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s16__mulaw(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut) +{ + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav_mulaw_to_s16(pBufferOut, sampleData, (size_t)samplesRead); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s16(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut) +{ + if (pWav == NULL || samplesToRead == 0 || pBufferOut == NULL) { + return 0; + } + + // Don't try to read more samples than can potentially fit in the output buffer. + if (samplesToRead * sizeof(drwav_int16) > DRWAV_SIZE_MAX) { + samplesToRead = DRWAV_SIZE_MAX / sizeof(drwav_int16); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM) { + return drwav_read_s16__pcm(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { + return drwav_read_s16__msadpcm(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_IEEE_FLOAT) { + return drwav_read_s16__ieee(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ALAW) { + return drwav_read_s16__alaw(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_MULAW) { + return drwav_read_s16__mulaw(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { + return drwav_read_s16__ima(pWav, samplesToRead, pBufferOut); + } + + return 0; +} + +drwav_uint64 drwav_read_pcm_frames_s16(drwav* pWav, drwav_uint64 framesToRead, drwav_int16* pBufferOut) +{ + return drwav_read_s16(pWav, framesToRead * pWav->channels, pBufferOut) / pWav->channels; +} + +void drwav_u8_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + int r; + for (size_t i = 0; i < sampleCount; ++i) { + int x = pIn[i]; + r = x - 128; + r = r << 8; + pOut[i] = (short)r; + } +} + +void drwav_s24_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + int r; + for (size_t i = 0; i < sampleCount; ++i) { + int x = ((int)(((unsigned int)(((const unsigned char*)pIn)[i*3+0]) << 8) | ((unsigned int)(((const unsigned char*)pIn)[i*3+1]) << 16) | ((unsigned int)(((const unsigned char*)pIn)[i*3+2])) << 24)) >> 8; + r = x >> 8; + pOut[i] = (short)r; + } +} + +void drwav_s32_to_s16(drwav_int16* pOut, const drwav_int32* pIn, size_t sampleCount) +{ + int r; + for (size_t i = 0; i < sampleCount; ++i) { + int x = pIn[i]; + r = x >> 16; + pOut[i] = (short)r; + } +} + +void drwav_f32_to_s16(drwav_int16* pOut, const float* pIn, size_t sampleCount) +{ + int r; + for (size_t i = 0; i < sampleCount; ++i) { + float x = pIn[i]; + float c; + c = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); + c = c + 1; + r = (int)(c * 32767.5f); + r = r - 32768; + pOut[i] = (short)r; + } +} + +void drwav_f64_to_s16(drwav_int16* pOut, const double* pIn, size_t sampleCount) +{ + int r; + for (size_t i = 0; i < sampleCount; ++i) { + double x = pIn[i]; + double c; + c = ((x < -1) ? -1 : ((x > 1) ? 1 : x)); + c = c + 1; + r = (int)(c * 32767.5); + r = r - 32768; + pOut[i] = (short)r; + } +} + +void drwav_alaw_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + for (size_t i = 0; i < sampleCount; ++i) { + pOut[i] = drwav__alaw_to_s16(pIn[i]); + } +} + +void drwav_mulaw_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + for (size_t i = 0; i < sampleCount; ++i) { + pOut[i] = drwav__mulaw_to_s16(pIn[i]); + } +} + + + +static void drwav__pcm_to_f32(float* pOut, const unsigned char* pIn, size_t sampleCount, unsigned int bytesPerSample) +{ + // Special case for 8-bit sample data because it's treated as unsigned. + if (bytesPerSample == 1) { + drwav_u8_to_f32(pOut, pIn, sampleCount); + return; + } + + // Slightly more optimal implementation for common formats. + if (bytesPerSample == 2) { + drwav_s16_to_f32(pOut, (const drwav_int16*)pIn, sampleCount); + return; + } + if (bytesPerSample == 3) { + drwav_s24_to_f32(pOut, pIn, sampleCount); + return; + } + if (bytesPerSample == 4) { + drwav_s32_to_f32(pOut, (const drwav_int32*)pIn, sampleCount); + return; + } + + + // Anything more than 64 bits per sample is not supported. + if (bytesPerSample > 8) { + drwav_zero_memory(pOut, sampleCount * sizeof(*pOut)); + return; + } + + + // Generic, slow converter. + for (unsigned int i = 0; i < sampleCount; ++i) { + drwav_uint64 sample = 0; + unsigned int shift = (8 - bytesPerSample) * 8; + + unsigned int j; + for (j = 0; j < bytesPerSample && j < 8; j += 1) { + sample |= (drwav_uint64)(pIn[j]) << shift; + shift += 8; + } + + pIn += j; + *pOut++ = (float)((drwav_int64)sample / 9223372036854775807.0); + } +} + +static void drwav__ieee_to_f32(float* pOut, const unsigned char* pIn, size_t sampleCount, unsigned int bytesPerSample) +{ + if (bytesPerSample == 4) { + for (unsigned int i = 0; i < sampleCount; ++i) { + *pOut++ = ((const float*)pIn)[i]; + } + return; + } else if (bytesPerSample == 8) { + drwav_f64_to_f32(pOut, (const double*)pIn, sampleCount); + return; + } else { + // Only supporting 32- and 64-bit float. Output silence in all other cases. Contributions welcome for 16-bit float. + drwav_zero_memory(pOut, sampleCount * sizeof(*pOut)); + return; + } +} + + +drwav_uint64 drwav_read_f32__pcm(drwav* pWav, drwav_uint64 samplesToRead, float* pBufferOut) +{ + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav__pcm_to_f32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); + pBufferOut += samplesRead; + + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_f32__msadpcm(drwav* pWav, drwav_uint64 samplesToRead, float* pBufferOut) +{ + // We're just going to borrow the implementation from the drwav_read_s16() since ADPCM is a little bit more complicated than other formats and I don't + // want to duplicate that code. + drwav_uint64 totalSamplesRead = 0; + drwav_int16 samples16[2048]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read_s16(pWav, drwav_min(samplesToRead, 2048), samples16); + if (samplesRead == 0) { + break; + } + + drwav_s16_to_f32(pBufferOut, samples16, (size_t)samplesRead); // <-- Safe cast because we're clamping to 2048. + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_f32__ima(drwav* pWav, drwav_uint64 samplesToRead, float* pBufferOut) +{ + // We're just going to borrow the implementation from the drwav_read_s16() since IMA-ADPCM is a little bit more complicated than other formats and I don't + // want to duplicate that code. + drwav_uint64 totalSamplesRead = 0; + drwav_int16 samples16[2048]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read_s16(pWav, drwav_min(samplesToRead, 2048), samples16); + if (samplesRead == 0) { + break; + } + + drwav_s16_to_f32(pBufferOut, samples16, (size_t)samplesRead); // <-- Safe cast because we're clamping to 2048. + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_f32__ieee(drwav* pWav, drwav_uint64 samplesToRead, float* pBufferOut) +{ + drwav_uint32 bytesPerSample; + + // Fast path. + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_IEEE_FLOAT && pWav->bitsPerSample == 32) { + return drwav_read(pWav, samplesToRead, pBufferOut); + } + + bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav__ieee_to_f32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_f32__alaw(drwav* pWav, drwav_uint64 samplesToRead, float* pBufferOut) +{ + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav_alaw_to_f32(pBufferOut, sampleData, (size_t)samplesRead); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_f32__mulaw(drwav* pWav, drwav_uint64 samplesToRead, float* pBufferOut) +{ + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav_mulaw_to_f32(pBufferOut, sampleData, (size_t)samplesRead); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_f32(drwav* pWav, drwav_uint64 samplesToRead, float* pBufferOut) +{ + if (pWav == NULL || samplesToRead == 0 || pBufferOut == NULL) { + return 0; + } + + // Don't try to read more samples than can potentially fit in the output buffer. + if (samplesToRead * sizeof(float) > DRWAV_SIZE_MAX) { + samplesToRead = DRWAV_SIZE_MAX / sizeof(float); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM) { + return drwav_read_f32__pcm(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { + return drwav_read_f32__msadpcm(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_IEEE_FLOAT) { + return drwav_read_f32__ieee(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ALAW) { + return drwav_read_f32__alaw(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_MULAW) { + return drwav_read_f32__mulaw(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { + return drwav_read_f32__ima(pWav, samplesToRead, pBufferOut); + } + + return 0; +} + +drwav_uint64 drwav_read_pcm_frames_f32(drwav* pWav, drwav_uint64 framesToRead, float* pBufferOut) +{ + return drwav_read_f32(pWav, framesToRead * pWav->channels, pBufferOut) / pWav->channels; +} + +void drwav_u8_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + +#ifdef DR_WAV_LIBSNDFILE_COMPAT + // It appears libsndfile uses slightly different logic for the u8 -> f32 conversion to dr_wav, which in my opinion is incorrect. It appears + // libsndfile performs the conversion something like "f32 = (u8 / 256) * 2 - 1", however I think it should be "f32 = (u8 / 255) * 2 - 1" (note + // the divisor of 256 vs 255). I use libsndfile as a benchmark for testing, so I'm therefore leaving this block here just for my automated + // correctness testing. This is disabled by default. + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = (pIn[i] / 256.0f) * 2 - 1; + } +#else + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = (pIn[i] / 255.0f) * 2 - 1; + } +#endif +} + +void drwav_s16_to_f32(float* pOut, const drwav_int16* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = pIn[i] / 32768.0f; + } +} + +void drwav_s24_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + unsigned int s0 = pIn[i*3 + 0]; + unsigned int s1 = pIn[i*3 + 1]; + unsigned int s2 = pIn[i*3 + 2]; + + int sample32 = (int)((s0 << 8) | (s1 << 16) | (s2 << 24)); + *pOut++ = (float)(sample32 / 2147483648.0); + } +} + +void drwav_s32_to_f32(float* pOut, const drwav_int32* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = (float)(pIn[i] / 2147483648.0); + } +} + +void drwav_f64_to_f32(float* pOut, const double* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = (float)pIn[i]; + } +} + +void drwav_alaw_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = drwav__alaw_to_s16(pIn[i]) / 32768.0f; + } +} + +void drwav_mulaw_to_f32(float* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = drwav__mulaw_to_s16(pIn[i]) / 32768.0f; + } +} + + + +static void drwav__pcm_to_s32(drwav_int32* pOut, const unsigned char* pIn, size_t totalSampleCount, unsigned int bytesPerSample) +{ + // Special case for 8-bit sample data because it's treated as unsigned. + if (bytesPerSample == 1) { + drwav_u8_to_s32(pOut, pIn, totalSampleCount); + return; + } + + // Slightly more optimal implementation for common formats. + if (bytesPerSample == 2) { + drwav_s16_to_s32(pOut, (const drwav_int16*)pIn, totalSampleCount); + return; + } + if (bytesPerSample == 3) { + drwav_s24_to_s32(pOut, pIn, totalSampleCount); + return; + } + if (bytesPerSample == 4) { + for (unsigned int i = 0; i < totalSampleCount; ++i) { + *pOut++ = ((const drwav_int32*)pIn)[i]; + } + return; + } + + + // Anything more than 64 bits per sample is not supported. + if (bytesPerSample > 8) { + drwav_zero_memory(pOut, totalSampleCount * sizeof(*pOut)); + return; + } + + + // Generic, slow converter. + for (unsigned int i = 0; i < totalSampleCount; ++i) { + drwav_uint64 sample = 0; + unsigned int shift = (8 - bytesPerSample) * 8; + + unsigned int j; + for (j = 0; j < bytesPerSample && j < 8; j += 1) { + sample |= (drwav_uint64)(pIn[j]) << shift; + shift += 8; + } + + pIn += j; + *pOut++ = (drwav_int32)((drwav_int64)sample >> 32); + } +} + +static void drwav__ieee_to_s32(drwav_int32* pOut, const unsigned char* pIn, size_t totalSampleCount, unsigned int bytesPerSample) +{ + if (bytesPerSample == 4) { + drwav_f32_to_s32(pOut, (const float*)pIn, totalSampleCount); + return; + } else if (bytesPerSample == 8) { + drwav_f64_to_s32(pOut, (const double*)pIn, totalSampleCount); + return; + } else { + // Only supporting 32- and 64-bit float. Output silence in all other cases. Contributions welcome for 16-bit float. + drwav_zero_memory(pOut, totalSampleCount * sizeof(*pOut)); + return; + } +} + + +drwav_uint64 drwav_read_s32__pcm(drwav* pWav, drwav_uint64 samplesToRead, drwav_int32* pBufferOut) +{ + drwav_uint32 bytesPerSample; + + // Fast path. + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM && pWav->bitsPerSample == 32) { + return drwav_read(pWav, samplesToRead, pBufferOut); + } + + bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav__pcm_to_s32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s32__msadpcm(drwav* pWav, drwav_uint64 samplesToRead, drwav_int32* pBufferOut) +{ + // We're just going to borrow the implementation from the drwav_read_s16() since ADPCM is a little bit more complicated than other formats and I don't + // want to duplicate that code. + drwav_uint64 totalSamplesRead = 0; + drwav_int16 samples16[2048]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read_s16(pWav, drwav_min(samplesToRead, 2048), samples16); + if (samplesRead == 0) { + break; + } + + drwav_s16_to_s32(pBufferOut, samples16, (size_t)samplesRead); // <-- Safe cast because we're clamping to 2048. + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s32__ima(drwav* pWav, drwav_uint64 samplesToRead, drwav_int32* pBufferOut) +{ + // We're just going to borrow the implementation from the drwav_read_s16() since IMA-ADPCM is a little bit more complicated than other formats and I don't + // want to duplicate that code. + drwav_uint64 totalSamplesRead = 0; + drwav_int16 samples16[2048]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read_s16(pWav, drwav_min(samplesToRead, 2048), samples16); + if (samplesRead == 0) { + break; + } + + drwav_s16_to_s32(pBufferOut, samples16, (size_t)samplesRead); // <-- Safe cast because we're clamping to 2048. + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s32__ieee(drwav* pWav, drwav_uint64 samplesToRead, drwav_int32* pBufferOut) +{ + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav__ieee_to_s32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s32__alaw(drwav* pWav, drwav_uint64 samplesToRead, drwav_int32* pBufferOut) +{ + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav_alaw_to_s32(pBufferOut, sampleData, (size_t)samplesRead); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s32__mulaw(drwav* pWav, drwav_uint64 samplesToRead, drwav_int32* pBufferOut) +{ + drwav_uint32 bytesPerSample = drwav_get_bytes_per_sample(pWav); + if (bytesPerSample == 0) { + return 0; + } + + drwav_uint64 totalSamplesRead = 0; + unsigned char sampleData[4096]; + while (samplesToRead > 0) { + drwav_uint64 samplesRead = drwav_read(pWav, drwav_min(samplesToRead, sizeof(sampleData)/bytesPerSample), sampleData); + if (samplesRead == 0) { + break; + } + + drwav_mulaw_to_s32(pBufferOut, sampleData, (size_t)samplesRead); + + pBufferOut += samplesRead; + samplesToRead -= samplesRead; + totalSamplesRead += samplesRead; + } + + return totalSamplesRead; +} + +drwav_uint64 drwav_read_s32(drwav* pWav, drwav_uint64 samplesToRead, drwav_int32* pBufferOut) +{ + if (pWav == NULL || samplesToRead == 0 || pBufferOut == NULL) { + return 0; + } + + // Don't try to read more samples than can potentially fit in the output buffer. + if (samplesToRead * sizeof(drwav_int32) > DRWAV_SIZE_MAX) { + samplesToRead = DRWAV_SIZE_MAX / sizeof(drwav_int32); + } + + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_PCM) { + return drwav_read_s32__pcm(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ADPCM) { + return drwav_read_s32__msadpcm(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_IEEE_FLOAT) { + return drwav_read_s32__ieee(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_ALAW) { + return drwav_read_s32__alaw(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_MULAW) { + return drwav_read_s32__mulaw(pWav, samplesToRead, pBufferOut); + } + + if (pWav->translatedFormatTag == DR_WAVE_FORMAT_DVI_ADPCM) { + return drwav_read_s32__ima(pWav, samplesToRead, pBufferOut); + } + + return 0; +} + +drwav_uint64 drwav_read_pcm_frames_s32(drwav* pWav, drwav_uint64 framesToRead, drwav_int32* pBufferOut) +{ + return drwav_read_s32(pWav, framesToRead * pWav->channels, pBufferOut) / pWav->channels; +} + +void drwav_u8_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = ((int)pIn[i] - 128) << 24; + } +} + +void drwav_s16_to_s32(drwav_int32* pOut, const drwav_int16* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = pIn[i] << 16; + } +} + +void drwav_s24_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + unsigned int s0 = pIn[i*3 + 0]; + unsigned int s1 = pIn[i*3 + 1]; + unsigned int s2 = pIn[i*3 + 2]; + + drwav_int32 sample32 = (drwav_int32)((s0 << 8) | (s1 << 16) | (s2 << 24)); + *pOut++ = sample32; + } +} + +void drwav_f32_to_s32(drwav_int32* pOut, const float* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = (drwav_int32)(2147483648.0 * pIn[i]); + } +} + +void drwav_f64_to_s32(drwav_int32* pOut, const double* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = (drwav_int32)(2147483648.0 * pIn[i]); + } +} + +void drwav_alaw_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i = 0; i < sampleCount; ++i) { + *pOut++ = ((drwav_int32)drwav__alaw_to_s16(pIn[i])) << 16; + } +} + +void drwav_mulaw_to_s32(drwav_int32* pOut, const drwav_uint8* pIn, size_t sampleCount) +{ + if (pOut == NULL || pIn == NULL) { + return; + } + + for (size_t i= 0; i < sampleCount; ++i) { + *pOut++ = ((drwav_int32)drwav__mulaw_to_s16(pIn[i])) << 16; + } +} + + + +drwav_int16* drwav__read_and_close_s16(drwav* pWav, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + drwav_assert(pWav != NULL); + + drwav_uint64 sampleDataSize = pWav->totalSampleCount * sizeof(drwav_int16); + if (sampleDataSize > DRWAV_SIZE_MAX) { + drwav_uninit(pWav); + return NULL; // File's too big. + } + + drwav_int16* pSampleData = (drwav_int16*)DRWAV_MALLOC((size_t)sampleDataSize); // <-- Safe cast due to the check above. + if (pSampleData == NULL) { + drwav_uninit(pWav); + return NULL; // Failed to allocate memory. + } + + drwav_uint64 samplesRead = drwav_read_s16(pWav, (size_t)pWav->totalSampleCount, pSampleData); + if (samplesRead != pWav->totalSampleCount) { + DRWAV_FREE(pSampleData); + drwav_uninit(pWav); + return NULL; // There was an error reading the samples. + } + + drwav_uninit(pWav); + + if (sampleRate) *sampleRate = pWav->sampleRate; + if (channels) *channels = pWav->channels; + if (totalSampleCount) *totalSampleCount = pWav->totalSampleCount; + return pSampleData; +} + +float* drwav__read_and_close_f32(drwav* pWav, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + drwav_assert(pWav != NULL); + + drwav_uint64 sampleDataSize = pWav->totalSampleCount * sizeof(float); + if (sampleDataSize > DRWAV_SIZE_MAX) { + drwav_uninit(pWav); + return NULL; // File's too big. + } + + float* pSampleData = (float*)DRWAV_MALLOC((size_t)sampleDataSize); // <-- Safe cast due to the check above. + if (pSampleData == NULL) { + drwav_uninit(pWav); + return NULL; // Failed to allocate memory. + } + + drwav_uint64 samplesRead = drwav_read_f32(pWav, (size_t)pWav->totalSampleCount, pSampleData); + if (samplesRead != pWav->totalSampleCount) { + DRWAV_FREE(pSampleData); + drwav_uninit(pWav); + return NULL; // There was an error reading the samples. + } + + drwav_uninit(pWav); + + if (sampleRate) *sampleRate = pWav->sampleRate; + if (channels) *channels = pWav->channels; + if (totalSampleCount) *totalSampleCount = pWav->totalSampleCount; + return pSampleData; +} + +drwav_int32* drwav__read_and_close_s32(drwav* pWav, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + drwav_assert(pWav != NULL); + + drwav_uint64 sampleDataSize = pWav->totalSampleCount * sizeof(drwav_int32); + if (sampleDataSize > DRWAV_SIZE_MAX) { + drwav_uninit(pWav); + return NULL; // File's too big. + } + + drwav_int32* pSampleData = (drwav_int32*)DRWAV_MALLOC((size_t)sampleDataSize); // <-- Safe cast due to the check above. + if (pSampleData == NULL) { + drwav_uninit(pWav); + return NULL; // Failed to allocate memory. + } + + drwav_uint64 samplesRead = drwav_read_s32(pWav, (size_t)pWav->totalSampleCount, pSampleData); + if (samplesRead != pWav->totalSampleCount) { + DRWAV_FREE(pSampleData); + drwav_uninit(pWav); + return NULL; // There was an error reading the samples. + } + + drwav_uninit(pWav); + + if (sampleRate) *sampleRate = pWav->sampleRate; + if (channels) *channels = pWav->channels; + if (totalSampleCount) *totalSampleCount = pWav->totalSampleCount; + return pSampleData; +} + + +drwav_int16* drwav_open_and_read_s16(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + if (channels) *channels = 0; + if (sampleRate) *sampleRate = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drwav wav; + if (!drwav_init(&wav, onRead, onSeek, pUserData)) { + return NULL; + } + + return drwav__read_and_close_s16(&wav, channels, sampleRate, totalSampleCount); +} + +drwav_int16* drwav_open_and_read_pcm_frames_s16(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut) +{ + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalFrameCountOut) *totalFrameCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drwav_uint64 totalSampleCount; + drwav_int16* result = drwav_open_and_read_s16(onRead, onSeek, pUserData, &channels, &sampleRate, &totalSampleCount); + if (result == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalFrameCountOut) *totalFrameCountOut = totalSampleCount / channels; + + return result; +} + +float* drwav_open_and_read_f32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drwav wav; + if (!drwav_init(&wav, onRead, onSeek, pUserData)) { + return NULL; + } + + return drwav__read_and_close_f32(&wav, channels, sampleRate, totalSampleCount); +} + +float* drwav_open_and_read_pcm_frames_f32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut) +{ + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalFrameCountOut) *totalFrameCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drwav_uint64 totalSampleCount; + float* result = drwav_open_and_read_f32(onRead, onSeek, pUserData, &channels, &sampleRate, &totalSampleCount); + if (result == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalFrameCountOut) *totalFrameCountOut = totalSampleCount / channels; + + return result; +} + +drwav_int32* drwav_open_and_read_s32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drwav wav; + if (!drwav_init(&wav, onRead, onSeek, pUserData)) { + return NULL; + } + + return drwav__read_and_close_s32(&wav, channels, sampleRate, totalSampleCount); +} + +drwav_int32* drwav_open_and_read_pcm_frames_s32(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut) +{ + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalFrameCountOut) *totalFrameCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drwav_uint64 totalSampleCount; + drwav_int32* result = drwav_open_and_read_s32(onRead, onSeek, pUserData, &channels, &sampleRate, &totalSampleCount); + if (result == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalFrameCountOut) *totalFrameCountOut = totalSampleCount / channels; + + return result; +} + +#ifndef DR_WAV_NO_STDIO +drwav_int16* drwav_open_file_and_read_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drwav wav; + if (!drwav_init_file(&wav, filename)) { + return NULL; + } + + return drwav__read_and_close_s16(&wav, channels, sampleRate, totalSampleCount); +} + +drwav_int16* drwav_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut) +{ + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalFrameCountOut) *totalFrameCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drwav_uint64 totalSampleCount; + drwav_int16* result = drwav_open_file_and_read_s16(filename, &channels, &sampleRate, &totalSampleCount); + if (result == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalFrameCountOut) *totalFrameCountOut = totalSampleCount / channels; + + return result; +} + +float* drwav_open_file_and_read_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drwav wav; + if (!drwav_init_file(&wav, filename)) { + return NULL; + } + + return drwav__read_and_close_f32(&wav, channels, sampleRate, totalSampleCount); +} + +float* drwav_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut) +{ + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalFrameCountOut) *totalFrameCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drwav_uint64 totalSampleCount; + float* result = drwav_open_file_and_read_f32(filename, &channels, &sampleRate, &totalSampleCount); + if (result == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalFrameCountOut) *totalFrameCountOut = totalSampleCount / channels; + + return result; +} + +drwav_int32* drwav_open_file_and_read_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drwav wav; + if (!drwav_init_file(&wav, filename)) { + return NULL; + } + + return drwav__read_and_close_s32(&wav, channels, sampleRate, totalSampleCount); +} + +drwav_int32* drwav_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut) +{ + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalFrameCountOut) *totalFrameCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drwav_uint64 totalSampleCount; + drwav_int32* result = drwav_open_file_and_read_s32(filename, &channels, &sampleRate, &totalSampleCount); + if (result == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalFrameCountOut) *totalFrameCountOut = totalSampleCount / channels; + + return result; +} +#endif + +drwav_int16* drwav_open_memory_and_read_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drwav wav; + if (!drwav_init_memory(&wav, data, dataSize)) { + return NULL; + } + + return drwav__read_and_close_s16(&wav, channels, sampleRate, totalSampleCount); +} + +drwav_int16* drwav_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut) +{ + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalFrameCountOut) *totalFrameCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drwav_uint64 totalSampleCount; + drwav_int16* result = drwav_open_memory_and_read_s16(data, dataSize, &channels, &sampleRate, &totalSampleCount); + if (result == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalFrameCountOut) *totalFrameCountOut = totalSampleCount / channels; + + return result; +} + +float* drwav_open_memory_and_read_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drwav wav; + if (!drwav_init_memory(&wav, data, dataSize)) { + return NULL; + } + + return drwav__read_and_close_f32(&wav, channels, sampleRate, totalSampleCount); +} + +float* drwav_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut) +{ + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalFrameCountOut) *totalFrameCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drwav_uint64 totalSampleCount; + float* result = drwav_open_memory_and_read_f32(data, dataSize, &channels, &sampleRate, &totalSampleCount); + if (result == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalFrameCountOut) *totalFrameCountOut = totalSampleCount / channels; + + return result; +} + +drwav_int32* drwav_open_memory_and_read_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, drwav_uint64* totalSampleCount) +{ + if (sampleRate) *sampleRate = 0; + if (channels) *channels = 0; + if (totalSampleCount) *totalSampleCount = 0; + + drwav wav; + if (!drwav_init_memory(&wav, data, dataSize)) { + return NULL; + } + + return drwav__read_and_close_s32(&wav, channels, sampleRate, totalSampleCount); +} + +drwav_int32* drwav_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut) +{ + if (channelsOut) *channelsOut = 0; + if (sampleRateOut) *sampleRateOut = 0; + if (totalFrameCountOut) *totalFrameCountOut = 0; + + unsigned int channels; + unsigned int sampleRate; + drwav_uint64 totalSampleCount; + drwav_int32* result = drwav_open_memory_and_read_s32(data, dataSize, &channels, &sampleRate, &totalSampleCount); + if (result == NULL) { + return NULL; + } + + if (channelsOut) *channelsOut = channels; + if (sampleRateOut) *sampleRateOut = sampleRate; + if (totalFrameCountOut) *totalFrameCountOut = totalSampleCount / channels; + + return result; +} +#endif //DR_WAV_NO_CONVERSION_API + + +void drwav_free(void* pDataReturnedByOpenAndRead) +{ + DRWAV_FREE(pDataReturnedByOpenAndRead); +} + +#endif //DR_WAV_IMPLEMENTATION + + +// REVISION HISTORY +// +// v0.9.0 - 2018-12-16 +// - API CHANGE: Add new reading APIs for reading by PCM frames instead of samples. Old APIs have been deprecated and +// will be removed in v0.10.0. Deprecated APIs and their replacements: +// drwav_read() -> drwav_read_pcm_frames() +// drwav_read_s16() -> drwav_read_pcm_frames_s16() +// drwav_read_f32() -> drwav_read_pcm_frames_f32() +// drwav_read_s32() -> drwav_read_pcm_frames_s32() +// drwav_seek_to_sample() -> drwav_seek_to_pcm_frame() +// drwav_write() -> drwav_write_pcm_frames() +// drwav_open_and_read_s16() -> drwav_open_and_read_pcm_frames_s16() +// drwav_open_and_read_f32() -> drwav_open_and_read_pcm_frames_f32() +// drwav_open_and_read_s32() -> drwav_open_and_read_pcm_frames_s32() +// drwav_open_file_and_read_s16() -> drwav_open_file_and_read_pcm_frames_s16() +// drwav_open_file_and_read_f32() -> drwav_open_file_and_read_pcm_frames_f32() +// drwav_open_file_and_read_s32() -> drwav_open_file_and_read_pcm_frames_s32() +// drwav_open_memory_and_read_s16() -> drwav_open_memory_and_read_pcm_frames_s16() +// drwav_open_memory_and_read_f32() -> drwav_open_memory_and_read_pcm_frames_f32() +// drwav_open_memory_and_read_s32() -> drwav_open_memory_and_read_pcm_frames_s32() +// drwav::totalSampleCount -> drwav::totalPCMFrameCount +// - API CHANGE: Rename drwav_open_and_read_file_*() to drwav_open_file_and_read_*(). +// - API CHANGE: Rename drwav_open_and_read_memory_*() to drwav_open_memory_and_read_*(). +// - Add built-in support for smpl chunks. +// - Add support for firing a callback for each chunk in the file at initialization time. +// - This is enabled through the drwav_init_ex(), etc. family of APIs. +// - Handle invalid FMT chunks more robustly. +// +// v0.8.5 - 2018-09-11 +// - Const correctness. +// - Fix a potential stack overflow. +// +// v0.8.4 - 2018-08-07 +// - Improve 64-bit detection. +// +// v0.8.3 - 2018-08-05 +// - Fix C++ build on older versions of GCC. +// +// v0.8.2 - 2018-08-02 +// - Fix some big-endian bugs. +// +// v0.8.1 - 2018-06-29 +// - Add support for sequential writing APIs. +// - Disable seeking in write mode. +// - Fix bugs with Wave64. +// - Fix typos. +// +// v0.8 - 2018-04-27 +// - Bug fix. +// - Start using major.minor.revision versioning. +// +// v0.7f - 2018-02-05 +// - Restrict ADPCM formats to a maximum of 2 channels. +// +// v0.7e - 2018-02-02 +// - Fix a crash. +// +// v0.7d - 2018-02-01 +// - Fix a crash. +// +// v0.7c - 2018-02-01 +// - Set drwav.bytesPerSample to 0 for all compressed formats. +// - Fix a crash when reading 16-bit floating point WAV files. In this case dr_wav will output silence for +// all format conversion reading APIs (*_s16, *_s32, *_f32 APIs). +// - Fix some divide-by-zero errors. +// +// v0.7b - 2018-01-22 +// - Fix errors with seeking of compressed formats. +// - Fix compilation error when DR_WAV_NO_CONVERSION_API +// +// v0.7a - 2017-11-17 +// - Fix some GCC warnings. +// +// v0.7 - 2017-11-04 +// - Add writing APIs. +// +// v0.6 - 2017-08-16 +// - API CHANGE: Rename dr_* types to drwav_*. +// - Add support for custom implementations of malloc(), realloc(), etc. +// - Add support for Microsoft ADPCM. +// - Add support for IMA ADPCM (DVI, format code 0x11). +// - Optimizations to drwav_read_s16(). +// - Bug fixes. +// +// v0.5g - 2017-07-16 +// - Change underlying type for booleans to unsigned. +// +// v0.5f - 2017-04-04 +// - Fix a minor bug with drwav_open_and_read_s16() and family. +// +// v0.5e - 2016-12-29 +// - Added support for reading samples as signed 16-bit integers. Use the _s16() family of APIs for this. +// - Minor fixes to documentation. +// +// v0.5d - 2016-12-28 +// - Use drwav_int*/drwav_uint* sized types to improve compiler support. +// +// v0.5c - 2016-11-11 +// - Properly handle JUNK chunks that come before the FMT chunk. +// +// v0.5b - 2016-10-23 +// - A minor change to drwav_bool8 and drwav_bool32 types. +// +// v0.5a - 2016-10-11 +// - Fixed a bug with drwav_open_and_read() and family due to incorrect argument ordering. +// - Improve A-law and mu-law efficiency. +// +// v0.5 - 2016-09-29 +// - API CHANGE. Swap the order of "channels" and "sampleRate" parameters in drwav_open_and_read*(). Rationale for this is to +// keep it consistent with dr_audio and dr_flac. +// +// v0.4b - 2016-09-18 +// - Fixed a typo in documentation. +// +// v0.4a - 2016-09-18 +// - Fixed a typo. +// - Change date format to ISO 8601 (YYYY-MM-DD) +// +// v0.4 - 2016-07-13 +// - API CHANGE. Make onSeek consistent with dr_flac. +// - API CHANGE. Rename drwav_seek() to drwav_seek_to_sample() for clarity and consistency with dr_flac. +// - Added support for Sony Wave64. +// +// v0.3a - 2016-05-28 +// - API CHANGE. Return drwav_bool32 instead of int in onSeek callback. +// - Fixed a memory leak. +// +// v0.3 - 2016-05-22 +// - Lots of API changes for consistency. +// +// v0.2a - 2016-05-16 +// - Fixed Linux/GCC build. +// +// v0.2 - 2016-05-11 +// - Added support for reading data as signed 32-bit PCM for consistency with dr_flac. +// +// v0.1a - 2016-05-07 +// - Fixed a bug in drwav_open_file() where the file handle would not be closed if the loader failed to initialize. +// +// v0.1 - 2016-05-04 +// - Initial versioned release. + + +/* +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to +*/ diff --git a/include/audio/flac.h b/include/audio/flac.h new file mode 100644 index 0000000..0411b2f --- /dev/null +++ b/include/audio/flac.h @@ -0,0 +1,14 @@ +#ifndef _ELEVENMPV_AUDIO_FLAC_H_ +#define _ELEVENMPV_AUDIO_FLAC_H_ + +#include + +int FLAC_Init(const char *path); +SceUInt32 FLAC_GetSampleRate(void); +SceUInt8 FLAC_GetChannels(void); +void FLAC_Decode(void *buf, unsigned int length, void *userdata); +SceUInt64 FLAC_GetPosition(void); +SceUInt64 FLAC_GetLength(void); +void FLAC_Term(void); + +#endif diff --git a/include/audio/jar_xm.h b/include/audio/jar_xm.h new file mode 100644 index 0000000..6a691f7 --- /dev/null +++ b/include/audio/jar_xm.h @@ -0,0 +1,2667 @@ +// jar_xm.h - v0.01 - public domain - Joshua Reisenauer, MAR 2016 +// +// HISTORY: +// +// v0.01 2016-02-22 Setup +// +// +// USAGE: +// +// In ONE source file, put: +// +// #define JAR_XM_IMPLEMENTATION +// #include "jar_xm.h" +// +// Other source files should just include jar_xm.h +// +// SAMPLE CODE: +// +// jar_xm_context_t *musicptr; +// float musicBuffer[48000 / 60]; +// int intro_load(void) +// { +// jar_xm_create_context_from_file(&musicptr, 48000, "Song.XM"); +// return 1; +// } +// int intro_unload(void) +// { +// jar_xm_free_context(musicptr); +// return 1; +// } +// int intro_tick(long counter) +// { +// jar_xm_generate_samples(musicptr, musicBuffer, (48000 / 60) / 2); +// if(IsKeyDown(KEY_ENTER)) +// return 1; +// return 0; +// } +// +// +// LISCENSE - FOR LIBXM: +// +// Author: Romain "Artefact2" Dalmaso +// Contributor: Dan Spencer +// Repackaged into jar_xm.h By: Joshua Adam Reisenauer +// This program is free software. It comes without any warranty, to the +// extent permitted by applicable law. You can redistribute it and/or +// modify it under the terms of the Do What The Fuck You Want To Public +// License, Version 2, as published by Sam Hocevar. See +// http://sam.zoy.org/wtfpl/COPYING for more details. + +#ifndef INCLUDE_JAR_XM_H +#define INCLUDE_JAR_XM_H + +#define JAR_XM_DEBUG 0 +#define JAR_XM_LINEAR_INTERPOLATION 1 // speed increase with decrease in quality +#define JAR_XM_DEFENSIVE 1 +#define JAR_XM_RAMPING 1 + +#include +#include +#include +#include +#include +#include + + + +//------------------------------------------------------------------------------- +#ifdef __cplusplus +extern "C" { +#endif + +struct jar_xm_context_s; +typedef struct jar_xm_context_s jar_xm_context_t; + +/** Create a XM context. + * + * @param moddata the contents of the module + * @param rate play rate in Hz, recommended value of 48000 + * + * @returns 0 on success + * @returns 1 if module data is not sane + * @returns 2 if memory allocation failed + * @returns 3 unable to open input file + * @returns 4 fseek() failed + * @returns 5 fread() failed + * @returns 6 unkown error + * + * @deprecated This function is unsafe! + * @see jar_xm_create_context_safe() + */ +int jar_xm_create_context_from_file(jar_xm_context_t** ctx, uint32_t rate, const char* filename); + +/** Create a XM context. + * + * @param moddata the contents of the module + * @param rate play rate in Hz, recommended value of 48000 + * + * @returns 0 on success + * @returns 1 if module data is not sane + * @returns 2 if memory allocation failed + * + * @deprecated This function is unsafe! + * @see jar_xm_create_context_safe() + */ +int jar_xm_create_context(jar_xm_context_t** ctx, const char* moddata, uint32_t rate); + +/** Create a XM context. + * + * @param moddata the contents of the module + * @param moddata_length the length of the contents of the module, in bytes + * @param rate play rate in Hz, recommended value of 48000 + * + * @returns 0 on success + * @returns 1 if module data is not sane + * @returns 2 if memory allocation failed + */ +int jar_xm_create_context_safe(jar_xm_context_t** ctx, const char* moddata, size_t moddata_length, uint32_t rate); + +/** Free a XM context created by jar_xm_create_context(). */ +void jar_xm_free_context(jar_xm_context_t* ctx); + +/** Play the module and put the sound samples in an output buffer. + * + * @param output buffer of 2*numsamples elements (A left and right value for each sample) + * @param numsamples number of samples to generate + */ +void jar_xm_generate_samples(jar_xm_context_t* ctx, float* output, size_t numsamples); + +/** Play the module, resample from 32 bit to 16 bit, and put the sound samples in an output buffer. + * + * @param output buffer of 2*numsamples elements (A left and right value for each sample) + * @param numsamples number of samples to generate + */ +void jar_xm_generate_samples_16bit(jar_xm_context_t* ctx, short* output, size_t numsamples) +{ + float* musicBuffer = malloc((2*numsamples)*sizeof(float)); + jar_xm_generate_samples(ctx, musicBuffer, numsamples); + + if(output){ + int x; + for(x=0;x<2*numsamples;x++) + output[x] = musicBuffer[x] * SHRT_MAX; + } + + free(musicBuffer); +} + +/** Play the module, resample from 32 bit to 8 bit, and put the sound samples in an output buffer. + * + * @param output buffer of 2*numsamples elements (A left and right value for each sample) + * @param numsamples number of samples to generate + */ +void jar_xm_generate_samples_8bit(jar_xm_context_t* ctx, char* output, size_t numsamples) +{ + float* musicBuffer = malloc((2*numsamples)*sizeof(float)); + jar_xm_generate_samples(ctx, musicBuffer, numsamples); + + if(output){ + int x; + for(x=0;x<2*numsamples;x++) + output[x] = musicBuffer[x] * CHAR_MAX; + } + + free(musicBuffer); +} + + + +/** Set the maximum number of times a module can loop. After the + * specified number of loops, calls to jar_xm_generate_samples will only + * generate silence. You can control the current number of loops with + * jar_xm_get_loop_count(). + * + * @param loopcnt maximum number of loops. Use 0 to loop + * indefinitely. */ +void jar_xm_set_max_loop_count(jar_xm_context_t* ctx, uint8_t loopcnt); + +/** Get the loop count of the currently playing module. This value is + * 0 when the module is still playing, 1 when the module has looped + * once, etc. */ +uint8_t jar_xm_get_loop_count(jar_xm_context_t* ctx); + + + +/** Mute or unmute a channel. + * + * @note Channel numbers go from 1 to jar_xm_get_number_of_channels(...). + * + * @return whether the channel was muted. + */ +bool jar_xm_mute_channel(jar_xm_context_t* ctx, uint16_t, bool); + +/** Mute or unmute an instrument. + * + * @note Instrument numbers go from 1 to + * jar_xm_get_number_of_instruments(...). + * + * @return whether the instrument was muted. + */ +bool jar_xm_mute_instrument(jar_xm_context_t* ctx, uint16_t, bool); + + + +/** Get the module name as a NUL-terminated string. */ +const char* jar_xm_get_module_name(jar_xm_context_t* ctx); + +/** Get the tracker name as a NUL-terminated string. */ +const char* jar_xm_get_tracker_name(jar_xm_context_t* ctx); + + + +/** Get the number of channels. */ +uint16_t jar_xm_get_number_of_channels(jar_xm_context_t* ctx); + +/** Get the module length (in patterns). */ +uint16_t jar_xm_get_module_length(jar_xm_context_t*); + +/** Get the number of patterns. */ +uint16_t jar_xm_get_number_of_patterns(jar_xm_context_t* ctx); + +/** Get the number of rows of a pattern. + * + * @note Pattern numbers go from 0 to + * jar_xm_get_number_of_patterns(...)-1. + */ +uint16_t jar_xm_get_number_of_rows(jar_xm_context_t* ctx, uint16_t); + +/** Get the number of instruments. */ +uint16_t jar_xm_get_number_of_instruments(jar_xm_context_t* ctx); + +/** Get the number of samples of an instrument. + * + * @note Instrument numbers go from 1 to + * jar_xm_get_number_of_instruments(...). + */ +uint16_t jar_xm_get_number_of_samples(jar_xm_context_t* ctx, uint16_t); + + + +/** Get the current module speed. + * + * @param bpm will receive the current BPM + * @param tempo will receive the current tempo (ticks per line) + */ +void jar_xm_get_playing_speed(jar_xm_context_t* ctx, uint16_t* bpm, uint16_t* tempo); + +/** Get the current position in the module being played. + * + * @param pattern_index if not NULL, will receive the current pattern + * index in the POT (pattern order table) + * + * @param pattern if not NULL, will receive the current pattern number + * + * @param row if not NULL, will receive the current row + * + * @param samples if not NULL, will receive the total number of + * generated samples (divide by sample rate to get seconds of + * generated audio) + */ +void jar_xm_get_position(jar_xm_context_t* ctx, uint8_t* pattern_index, uint8_t* pattern, uint8_t* row, uint64_t* samples); + +/** Get the latest time (in number of generated samples) when a + * particular instrument was triggered in any channel. + * + * @note Instrument numbers go from 1 to + * jar_xm_get_number_of_instruments(...). + */ +uint64_t jar_xm_get_latest_trigger_of_instrument(jar_xm_context_t* ctx, uint16_t); + +/** Get the latest time (in number of generated samples) when a + * particular sample was triggered in any channel. + * + * @note Instrument numbers go from 1 to + * jar_xm_get_number_of_instruments(...). + * + * @note Sample numbers go from 0 to + * jar_xm_get_nubmer_of_samples(...,instr)-1. + */ +uint64_t jar_xm_get_latest_trigger_of_sample(jar_xm_context_t* ctx, uint16_t instr, uint16_t sample); + +/** Get the latest time (in number of generated samples) when any + * instrument was triggered in a given channel. + * + * @note Channel numbers go from 1 to jar_xm_get_number_of_channels(...). + */ +uint64_t jar_xm_get_latest_trigger_of_channel(jar_xm_context_t* ctx, uint16_t); + +/** Get the number of remaining samples. Divide by 2 to get the number of individual LR data samples. + * + * @note This is the remaining number of samples before the loop starts module again, or halts if on last pass. + * @note This function is very slow and should only be run once, if at all. + */ +uint64_t jar_xm_get_remaining_samples(jar_xm_context_t* ctx); + +#ifdef __cplusplus +} +#endif +//------------------------------------------------------------------------------- + + + + + + +//Function Definitions----------------------------------------------------------- +#ifdef JAR_XM_IMPLEMENTATION + +#include +#include + +#if JAR_XM_DEBUG //JAR_XM_DEBUG defined as 0 +#include +#define DEBUG(fmt, ...) do { \ + fprintf(stderr, "%s(): " fmt "\n", __func__, __VA_ARGS__); \ + fflush(stderr); \ + } while(0) +#else +#define DEBUG(...) +#endif + +#if jar_xm_BIG_ENDIAN +#error "Big endian platforms are not yet supported, sorry" +/* Make sure the compiler stops, even if #error is ignored */ +extern int __fail[-1]; +#endif + +/* ----- XM constants ----- */ + +#define SAMPLE_NAME_LENGTH 22 +#define INSTRUMENT_NAME_LENGTH 22 +#define MODULE_NAME_LENGTH 20 +#define TRACKER_NAME_LENGTH 20 +#define PATTERN_ORDER_TABLE_LENGTH 256 +#define NUM_NOTES 96 +#define NUM_ENVELOPE_POINTS 12 +#define MAX_NUM_ROWS 256 + +#if JAR_XM_RAMPING +#define jar_xm_SAMPLE_RAMPING_POINTS 0x20 +#endif + +/* ----- Data types ----- */ + +enum jar_xm_waveform_type_e { + jar_xm_SINE_WAVEFORM = 0, + jar_xm_RAMP_DOWN_WAVEFORM = 1, + jar_xm_SQUARE_WAVEFORM = 2, + jar_xm_RANDOM_WAVEFORM = 3, + jar_xm_RAMP_UP_WAVEFORM = 4, +}; +typedef enum jar_xm_waveform_type_e jar_xm_waveform_type_t; + +enum jar_xm_loop_type_e { + jar_xm_NO_LOOP, + jar_xm_FORWARD_LOOP, + jar_xm_PING_PONG_LOOP, +}; +typedef enum jar_xm_loop_type_e jar_xm_loop_type_t; + +enum jar_xm_frequency_type_e { + jar_xm_LINEAR_FREQUENCIES, + jar_xm_AMIGA_FREQUENCIES, +}; +typedef enum jar_xm_frequency_type_e jar_xm_frequency_type_t; + +struct jar_xm_envelope_point_s { + uint16_t frame; + uint16_t value; +}; +typedef struct jar_xm_envelope_point_s jar_xm_envelope_point_t; + +struct jar_xm_envelope_s { + jar_xm_envelope_point_t points[NUM_ENVELOPE_POINTS]; + uint8_t num_points; + uint8_t sustain_point; + uint8_t loop_start_point; + uint8_t loop_end_point; + bool enabled; + bool sustain_enabled; + bool loop_enabled; +}; +typedef struct jar_xm_envelope_s jar_xm_envelope_t; + +struct jar_xm_sample_s { + char name[SAMPLE_NAME_LENGTH + 1]; + int8_t bits; /* Either 8 or 16 */ + + uint32_t length; + uint32_t loop_start; + uint32_t loop_length; + uint32_t loop_end; + float volume; + int8_t finetune; + jar_xm_loop_type_t loop_type; + float panning; + int8_t relative_note; + uint64_t latest_trigger; + + float* data; + }; + typedef struct jar_xm_sample_s jar_xm_sample_t; + + struct jar_xm_instrument_s { + char name[INSTRUMENT_NAME_LENGTH + 1]; + uint16_t num_samples; + uint8_t sample_of_notes[NUM_NOTES]; + jar_xm_envelope_t volume_envelope; + jar_xm_envelope_t panning_envelope; + jar_xm_waveform_type_t vibrato_type; + uint8_t vibrato_sweep; + uint8_t vibrato_depth; + uint8_t vibrato_rate; + uint16_t volume_fadeout; + uint64_t latest_trigger; + bool muted; + + jar_xm_sample_t* samples; + }; + typedef struct jar_xm_instrument_s jar_xm_instrument_t; + + struct jar_xm_pattern_slot_s { + uint8_t note; /* 1-96, 97 = Key Off note */ + uint8_t instrument; /* 1-128 */ + uint8_t volume_column; + uint8_t effect_type; + uint8_t effect_param; + }; + typedef struct jar_xm_pattern_slot_s jar_xm_pattern_slot_t; + + struct jar_xm_pattern_s { + uint16_t num_rows; + jar_xm_pattern_slot_t* slots; /* Array of size num_rows * num_channels */ + }; + typedef struct jar_xm_pattern_s jar_xm_pattern_t; + + struct jar_xm_module_s { + char name[MODULE_NAME_LENGTH + 1]; + char trackername[TRACKER_NAME_LENGTH + 1]; + uint16_t length; + uint16_t restart_position; + uint16_t num_channels; + uint16_t num_patterns; + uint16_t num_instruments; + jar_xm_frequency_type_t frequency_type; + uint8_t pattern_table[PATTERN_ORDER_TABLE_LENGTH]; + + jar_xm_pattern_t* patterns; + jar_xm_instrument_t* instruments; /* Instrument 1 has index 0, + * instrument 2 has index 1, etc. */ + }; + typedef struct jar_xm_module_s jar_xm_module_t; + + struct jar_xm_channel_context_s { + float note; + float orig_note; /* The original note before effect modifications, as read in the pattern. */ + jar_xm_instrument_t* instrument; /* Could be NULL */ + jar_xm_sample_t* sample; /* Could be NULL */ + jar_xm_pattern_slot_t* current; + + float sample_position; + float period; + float frequency; + float step; + bool ping; /* For ping-pong samples: true is -->, false is <-- */ + + float volume; /* Ideally between 0 (muted) and 1 (loudest) */ + float panning; /* Between 0 (left) and 1 (right); 0.5 is centered */ + + uint16_t autovibrato_ticks; + + bool sustained; + float fadeout_volume; + float volume_envelope_volume; + float panning_envelope_panning; + uint16_t volume_envelope_frame_count; + uint16_t panning_envelope_frame_count; + + float autovibrato_note_offset; + + bool arp_in_progress; + uint8_t arp_note_offset; + uint8_t volume_slide_param; + uint8_t fine_volume_slide_param; + uint8_t global_volume_slide_param; + uint8_t panning_slide_param; + uint8_t portamento_up_param; + uint8_t portamento_down_param; + uint8_t fine_portamento_up_param; + uint8_t fine_portamento_down_param; + uint8_t extra_fine_portamento_up_param; + uint8_t extra_fine_portamento_down_param; + uint8_t tone_portamento_param; + float tone_portamento_target_period; + uint8_t multi_retrig_param; + uint8_t note_delay_param; + uint8_t pattern_loop_origin; /* Where to restart a E6y loop */ + uint8_t pattern_loop_count; /* How many loop passes have been done */ + bool vibrato_in_progress; + jar_xm_waveform_type_t vibrato_waveform; + bool vibrato_waveform_retrigger; /* True if a new note retriggers the waveform */ + uint8_t vibrato_param; + uint16_t vibrato_ticks; /* Position in the waveform */ + float vibrato_note_offset; + jar_xm_waveform_type_t tremolo_waveform; + bool tremolo_waveform_retrigger; + uint8_t tremolo_param; + uint8_t tremolo_ticks; + float tremolo_volume; + uint8_t tremor_param; + bool tremor_on; + + uint64_t latest_trigger; + bool muted; + +#if JAR_XM_RAMPING + /* These values are updated at the end of each tick, to save + * a couple of float operations on every generated sample. */ + float target_panning; + float target_volume; + + unsigned long frame_count; + float end_of_previous_sample[jar_xm_SAMPLE_RAMPING_POINTS]; +#endif + + float actual_panning; + float actual_volume; + }; + typedef struct jar_xm_channel_context_s jar_xm_channel_context_t; + + struct jar_xm_context_s { + void* allocated_memory; + jar_xm_module_t module; + uint32_t rate; + + uint16_t tempo; + uint16_t bpm; + float global_volume; + float amplification; + +#if JAR_XM_RAMPING + /* How much is a channel final volume allowed to change per + * sample; this is used to avoid abrubt volume changes which + * manifest as "clicks" in the generated sound. */ + float volume_ramp; + float panning_ramp; /* Same for panning. */ +#endif + + uint8_t current_table_index; + uint8_t current_row; + uint16_t current_tick; /* Can go below 255, with high tempo and a pattern delay */ + float remaining_samples_in_tick; + uint64_t generated_samples; + + bool position_jump; + bool pattern_break; + uint8_t jump_dest; + uint8_t jump_row; + + /* Extra ticks to be played before going to the next row - + * Used for EEy effect */ + uint16_t extra_ticks; + + uint8_t* row_loop_count; /* Array of size MAX_NUM_ROWS * module_length */ + uint8_t loop_count; + uint8_t max_loop_count; + + jar_xm_channel_context_t* channels; +}; + +/* ----- Internal API ----- */ + +#if JAR_XM_DEFENSIVE + +/** Check the module data for errors/inconsistencies. + * + * @returns 0 if everything looks OK. Module should be safe to load. + */ +int jar_xm_check_sanity_preload(const char*, size_t); + +/** Check a loaded module for errors/inconsistencies. + * + * @returns 0 if everything looks OK. + */ +int jar_xm_check_sanity_postload(jar_xm_context_t*); + +#endif + +/** Get the number of bytes needed to store the module data in a + * dynamically allocated blank context. + * + * Things that are dynamically allocated: + * - sample data + * - sample structures in instruments + * - pattern data + * - row loop count arrays + * - pattern structures in module + * - instrument structures in module + * - channel contexts + * - context structure itself + + * @returns 0 if everything looks OK. + */ +size_t jar_xm_get_memory_needed_for_context(const char*, size_t); + +/** Populate the context from module data. + * + * @returns pointer to the memory pool + */ +char* jar_xm_load_module(jar_xm_context_t*, const char*, size_t, char*); + +int jar_xm_create_context(jar_xm_context_t** ctxp, const char* moddata, uint32_t rate) { + return jar_xm_create_context_safe(ctxp, moddata, SIZE_MAX, rate); +} + +#define ALIGN(x, b) (((x) + ((b) - 1)) & ~((b) - 1)) +#define ALIGN_PTR(x, b) (void*)(((uintptr_t)(x) + ((b) - 1)) & ~((b) - 1)) +int jar_xm_create_context_safe(jar_xm_context_t** ctxp, const char* moddata, size_t moddata_length, uint32_t rate) { +#if JAR_XM_DEFENSIVE + int ret; +#endif + size_t bytes_needed; + char* mempool; + jar_xm_context_t* ctx; + +#if JAR_XM_DEFENSIVE + if((ret = jar_xm_check_sanity_preload(moddata, moddata_length))) { + DEBUG("jar_xm_check_sanity_preload() returned %i, module is not safe to load", ret); + return 1; + } +#endif + + bytes_needed = jar_xm_get_memory_needed_for_context(moddata, moddata_length); + mempool = malloc(bytes_needed); + if(mempool == NULL && bytes_needed > 0) { + /* malloc() failed, trouble ahead */ + DEBUG("call to malloc() failed, returned %p", (void*)mempool); + return 2; + } + + /* Initialize most of the fields to 0, 0.f, NULL or false depending on type */ + memset(mempool, 0, bytes_needed); + + ctx = (*ctxp = (jar_xm_context_t *)mempool); + ctx->allocated_memory = mempool; /* Keep original pointer for free() */ + mempool += sizeof(jar_xm_context_t); + + ctx->rate = rate; + mempool = jar_xm_load_module(ctx, moddata, moddata_length, mempool); + mempool = ALIGN_PTR(mempool, 16); + + ctx->channels = (jar_xm_channel_context_t*)mempool; + mempool += ctx->module.num_channels * sizeof(jar_xm_channel_context_t); + mempool = ALIGN_PTR(mempool, 16); + + ctx->global_volume = 1.f; + ctx->amplification = .25f; /* XXX: some bad modules may still clip. Find out something better. */ + +#if JAR_XM_RAMPING + ctx->volume_ramp = (1.f / 128.f); + ctx->panning_ramp = (1.f / 128.f); +#endif + + for(uint8_t i = 0; i < ctx->module.num_channels; ++i) { + jar_xm_channel_context_t* ch = ctx->channels + i; + + ch->ping = true; + ch->vibrato_waveform = jar_xm_SINE_WAVEFORM; + ch->vibrato_waveform_retrigger = true; + ch->tremolo_waveform = jar_xm_SINE_WAVEFORM; + ch->tremolo_waveform_retrigger = true; + + ch->volume = ch->volume_envelope_volume = ch->fadeout_volume = 1.0f; + ch->panning = ch->panning_envelope_panning = .5f; + ch->actual_volume = .0f; + ch->actual_panning = .5f; + } + + mempool = ALIGN_PTR(mempool, 16); + ctx->row_loop_count = (uint8_t*)mempool; + mempool += MAX_NUM_ROWS * sizeof(uint8_t); + +#if JAR_XM_DEFENSIVE + if((ret = jar_xm_check_sanity_postload(ctx))) { + DEBUG("jar_xm_check_sanity_postload() returned %i, module is not safe to play", ret); + jar_xm_free_context(ctx); + return 1; + } +#endif + + return 0; +} + +void jar_xm_free_context(jar_xm_context_t* ctx) { + free(ctx->allocated_memory); +} + +void jar_xm_set_max_loop_count(jar_xm_context_t* ctx, uint8_t loopcnt) { + ctx->max_loop_count = loopcnt; +} + +uint8_t jar_xm_get_loop_count(jar_xm_context_t* ctx) { + return ctx->loop_count; +} + +bool jar_xm_mute_channel(jar_xm_context_t* ctx, uint16_t channel, bool mute) { + bool old = ctx->channels[channel - 1].muted; + ctx->channels[channel - 1].muted = mute; + return old; +} + +bool jar_xm_mute_instrument(jar_xm_context_t* ctx, uint16_t instr, bool mute) { + bool old = ctx->module.instruments[instr - 1].muted; + ctx->module.instruments[instr - 1].muted = mute; + return old; +} + + + +const char* jar_xm_get_module_name(jar_xm_context_t* ctx) { + return ctx->module.name; +} + +const char* jar_xm_get_tracker_name(jar_xm_context_t* ctx) { + return ctx->module.trackername; +} + + + +uint16_t jar_xm_get_number_of_channels(jar_xm_context_t* ctx) { + return ctx->module.num_channels; +} + +uint16_t jar_xm_get_module_length(jar_xm_context_t* ctx) { + return ctx->module.length; +} + +uint16_t jar_xm_get_number_of_patterns(jar_xm_context_t* ctx) { + return ctx->module.num_patterns; +} + +uint16_t jar_xm_get_number_of_rows(jar_xm_context_t* ctx, uint16_t pattern) { + return ctx->module.patterns[pattern].num_rows; +} + +uint16_t jar_xm_get_number_of_instruments(jar_xm_context_t* ctx) { + return ctx->module.num_instruments; +} + +uint16_t jar_xm_get_number_of_samples(jar_xm_context_t* ctx, uint16_t instrument) { + return ctx->module.instruments[instrument - 1].num_samples; +} + + + +void jar_xm_get_playing_speed(jar_xm_context_t* ctx, uint16_t* bpm, uint16_t* tempo) { + if(bpm) *bpm = ctx->bpm; + if(tempo) *tempo = ctx->tempo; +} + +void jar_xm_get_position(jar_xm_context_t* ctx, uint8_t* pattern_index, uint8_t* pattern, uint8_t* row, uint64_t* samples) { + if(pattern_index) *pattern_index = ctx->current_table_index; + if(pattern) *pattern = ctx->module.pattern_table[ctx->current_table_index]; + if(row) *row = ctx->current_row; + if(samples) *samples = ctx->generated_samples; +} + +uint64_t jar_xm_get_latest_trigger_of_instrument(jar_xm_context_t* ctx, uint16_t instr) { + return ctx->module.instruments[instr - 1].latest_trigger; +} + +uint64_t jar_xm_get_latest_trigger_of_sample(jar_xm_context_t* ctx, uint16_t instr, uint16_t sample) { + return ctx->module.instruments[instr - 1].samples[sample].latest_trigger; +} + +uint64_t jar_xm_get_latest_trigger_of_channel(jar_xm_context_t* ctx, uint16_t chn) { + return ctx->channels[chn - 1].latest_trigger; +} + +/* .xm files are little-endian. (XXX: Are they really?) */ + +/* Bounded reader macros. + * If we attempt to read the buffer out-of-bounds, pretend that the buffer is + * infinitely padded with zeroes. + */ +#define READ_U8(offset) (((offset) < moddata_length) ? (*(uint8_t*)(moddata + (offset))) : 0) +#define READ_U16(offset) ((uint16_t)READ_U8(offset) | ((uint16_t)READ_U8((offset) + 1) << 8)) +#define READ_U32(offset) ((uint32_t)READ_U16(offset) | ((uint32_t)READ_U16((offset) + 2) << 16)) +#define READ_MEMCPY(ptr, offset, length) memcpy_pad(ptr, length, moddata, moddata_length, offset) + +static void memcpy_pad(void* dst, size_t dst_len, const void* src, size_t src_len, size_t offset) { + uint8_t* dst_c = dst; + const uint8_t* src_c = src; + + /* how many bytes can be copied without overrunning `src` */ + size_t copy_bytes = (src_len >= offset) ? (src_len - offset) : 0; + copy_bytes = copy_bytes > dst_len ? dst_len : copy_bytes; + + memcpy(dst_c, src_c + offset, copy_bytes); + /* padded bytes */ + memset(dst_c + copy_bytes, 0, dst_len - copy_bytes); +} + +#if JAR_XM_DEFENSIVE + +int jar_xm_check_sanity_preload(const char* module, size_t module_length) { + if(module_length < 60) { + return 4; + } + + if(memcmp("Extended Module: ", module, 17) != 0) { + return 1; + } + + if(module[37] != 0x1A) { + return 2; + } + + if(module[59] != 0x01 || module[58] != 0x04) { + /* Not XM 1.04 */ + return 3; + } + + return 0; +} + +int jar_xm_check_sanity_postload(jar_xm_context_t* ctx) { + /* @todo: plenty of stuff to do here… */ + + /* Check the POT */ + for(uint8_t i = 0; i < ctx->module.length; ++i) { + if(ctx->module.pattern_table[i] >= ctx->module.num_patterns) { + if(i+1 == ctx->module.length && ctx->module.length > 1) { + /* Cheap fix */ + --ctx->module.length; + DEBUG("trimming invalid POT at pos %X", i); + } else { + DEBUG("module has invalid POT, pos %X references nonexistent pattern %X", + i, + ctx->module.pattern_table[i]); + return 1; + } + } + } + + return 0; +} + +#endif + +size_t jar_xm_get_memory_needed_for_context(const char* moddata, size_t moddata_length) { + size_t memory_needed = 0; + size_t offset = 60; /* Skip the first header */ + uint16_t num_channels; + uint16_t num_patterns; + uint16_t num_instruments; + + /* Read the module header */ + num_channels = READ_U16(offset + 8); + + num_patterns = READ_U16(offset + 10); + memory_needed += num_patterns * sizeof(jar_xm_pattern_t); + memory_needed = ALIGN(memory_needed, 16); + + num_instruments = READ_U16(offset + 12); + memory_needed += num_instruments * sizeof(jar_xm_instrument_t); + memory_needed = ALIGN(memory_needed, 16); + + memory_needed += MAX_NUM_ROWS * READ_U16(offset + 4) * sizeof(uint8_t); /* Module length */ + + /* Header size */ + offset += READ_U32(offset); + + /* Read pattern headers */ + for(uint16_t i = 0; i < num_patterns; ++i) { + uint16_t num_rows; + + num_rows = READ_U16(offset + 5); + memory_needed += num_rows * num_channels * sizeof(jar_xm_pattern_slot_t); + + /* Pattern header length + packed pattern data size */ + offset += READ_U32(offset) + READ_U16(offset + 7); + } + memory_needed = ALIGN(memory_needed, 16); + + /* Read instrument headers */ + for(uint16_t i = 0; i < num_instruments; ++i) { + uint16_t num_samples; + uint32_t sample_header_size = 0; + uint32_t sample_size_aggregate = 0; + + num_samples = READ_U16(offset + 27); + memory_needed += num_samples * sizeof(jar_xm_sample_t); + + if(num_samples > 0) { + sample_header_size = READ_U32(offset + 29); + } + + /* Instrument header size */ + offset += READ_U32(offset); + + for(uint16_t j = 0; j < num_samples; ++j) { + uint32_t sample_size; + uint8_t flags; + + sample_size = READ_U32(offset); + flags = READ_U8(offset + 14); + sample_size_aggregate += sample_size; + + if(flags & (1 << 4)) { + /* 16 bit sample */ + memory_needed += sample_size * (sizeof(float) >> 1); + } else { + /* 8 bit sample */ + memory_needed += sample_size * sizeof(float); + } + + offset += sample_header_size; + } + + offset += sample_size_aggregate; + } + + memory_needed += num_channels * sizeof(jar_xm_channel_context_t); + memory_needed += sizeof(jar_xm_context_t); + + return memory_needed; +} + +char* jar_xm_load_module(jar_xm_context_t* ctx, const char* moddata, size_t moddata_length, char* mempool) { + size_t offset = 0; + jar_xm_module_t* mod = &(ctx->module); + + /* Read XM header */ + READ_MEMCPY(mod->name, offset + 17, MODULE_NAME_LENGTH); + READ_MEMCPY(mod->trackername, offset + 38, TRACKER_NAME_LENGTH); + offset += 60; + + /* Read module header */ + uint32_t header_size = READ_U32(offset); + + mod->length = READ_U16(offset + 4); + mod->restart_position = READ_U16(offset + 6); + mod->num_channels = READ_U16(offset + 8); + mod->num_patterns = READ_U16(offset + 10); + mod->num_instruments = READ_U16(offset + 12); + + mod->patterns = (jar_xm_pattern_t*)mempool; + mempool += mod->num_patterns * sizeof(jar_xm_pattern_t); + mempool = ALIGN_PTR(mempool, 16); + + mod->instruments = (jar_xm_instrument_t*)mempool; + mempool += mod->num_instruments * sizeof(jar_xm_instrument_t); + mempool = ALIGN_PTR(mempool, 16); + + uint16_t flags = READ_U32(offset + 14); + mod->frequency_type = (flags & (1 << 0)) ? jar_xm_LINEAR_FREQUENCIES : jar_xm_AMIGA_FREQUENCIES; + + ctx->tempo = READ_U16(offset + 16); + ctx->bpm = READ_U16(offset + 18); + + READ_MEMCPY(mod->pattern_table, offset + 20, PATTERN_ORDER_TABLE_LENGTH); + offset += header_size; + + /* Read patterns */ + for(uint16_t i = 0; i < mod->num_patterns; ++i) { + uint16_t packed_patterndata_size = READ_U16(offset + 7); + jar_xm_pattern_t* pat = mod->patterns + i; + + pat->num_rows = READ_U16(offset + 5); + + pat->slots = (jar_xm_pattern_slot_t*)mempool; + mempool += mod->num_channels * pat->num_rows * sizeof(jar_xm_pattern_slot_t); + + /* Pattern header length */ + offset += READ_U32(offset); + + if(packed_patterndata_size == 0) { + /* No pattern data is present */ + memset(pat->slots, 0, sizeof(jar_xm_pattern_slot_t) * pat->num_rows * mod->num_channels); + } else { + /* This isn't your typical for loop */ + for(uint16_t j = 0, k = 0; j < packed_patterndata_size; ++k) { + uint8_t note = READ_U8(offset + j); + jar_xm_pattern_slot_t* slot = pat->slots + k; + + if(note & (1 << 7)) { + /* MSB is set, this is a compressed packet */ + ++j; + + if(note & (1 << 0)) { + /* Note follows */ + slot->note = READ_U8(offset + j); + ++j; + } else { + slot->note = 0; + } + + if(note & (1 << 1)) { + /* Instrument follows */ + slot->instrument = READ_U8(offset + j); + ++j; + } else { + slot->instrument = 0; + } + + if(note & (1 << 2)) { + /* Volume column follows */ + slot->volume_column = READ_U8(offset + j); + ++j; + } else { + slot->volume_column = 0; + } + + if(note & (1 << 3)) { + /* Effect follows */ + slot->effect_type = READ_U8(offset + j); + ++j; + } else { + slot->effect_type = 0; + } + + if(note & (1 << 4)) { + /* Effect parameter follows */ + slot->effect_param = READ_U8(offset + j); + ++j; + } else { + slot->effect_param = 0; + } + } else { + /* Uncompressed packet */ + slot->note = note; + slot->instrument = READ_U8(offset + j + 1); + slot->volume_column = READ_U8(offset + j + 2); + slot->effect_type = READ_U8(offset + j + 3); + slot->effect_param = READ_U8(offset + j + 4); + j += 5; + } + } + } + + offset += packed_patterndata_size; + } + mempool = ALIGN_PTR(mempool, 16); + + /* Read instruments */ + for(uint16_t i = 0; i < ctx->module.num_instruments; ++i) { + uint32_t sample_header_size = 0; + jar_xm_instrument_t* instr = mod->instruments + i; + + READ_MEMCPY(instr->name, offset + 4, INSTRUMENT_NAME_LENGTH); + instr->num_samples = READ_U16(offset + 27); + + if(instr->num_samples > 0) { + /* Read extra header properties */ + sample_header_size = READ_U32(offset + 29); + READ_MEMCPY(instr->sample_of_notes, offset + 33, NUM_NOTES); + + instr->volume_envelope.num_points = READ_U8(offset + 225); + instr->panning_envelope.num_points = READ_U8(offset + 226); + + for(uint8_t j = 0; j < instr->volume_envelope.num_points; ++j) { + instr->volume_envelope.points[j].frame = READ_U16(offset + 129 + 4 * j); + instr->volume_envelope.points[j].value = READ_U16(offset + 129 + 4 * j + 2); + } + + for(uint8_t j = 0; j < instr->panning_envelope.num_points; ++j) { + instr->panning_envelope.points[j].frame = READ_U16(offset + 177 + 4 * j); + instr->panning_envelope.points[j].value = READ_U16(offset + 177 + 4 * j + 2); + } + + instr->volume_envelope.sustain_point = READ_U8(offset + 227); + instr->volume_envelope.loop_start_point = READ_U8(offset + 228); + instr->volume_envelope.loop_end_point = READ_U8(offset + 229); + + instr->panning_envelope.sustain_point = READ_U8(offset + 230); + instr->panning_envelope.loop_start_point = READ_U8(offset + 231); + instr->panning_envelope.loop_end_point = READ_U8(offset + 232); + + uint8_t flags = READ_U8(offset + 233); + instr->volume_envelope.enabled = flags & (1 << 0); + instr->volume_envelope.sustain_enabled = flags & (1 << 1); + instr->volume_envelope.loop_enabled = flags & (1 << 2); + + flags = READ_U8(offset + 234); + instr->panning_envelope.enabled = flags & (1 << 0); + instr->panning_envelope.sustain_enabled = flags & (1 << 1); + instr->panning_envelope.loop_enabled = flags & (1 << 2); + + instr->vibrato_type = READ_U8(offset + 235); + if(instr->vibrato_type == 2) { + instr->vibrato_type = 1; + } else if(instr->vibrato_type == 1) { + instr->vibrato_type = 2; + } + instr->vibrato_sweep = READ_U8(offset + 236); + instr->vibrato_depth = READ_U8(offset + 237); + instr->vibrato_rate = READ_U8(offset + 238); + instr->volume_fadeout = READ_U16(offset + 239); + + instr->samples = (jar_xm_sample_t*)mempool; + mempool += instr->num_samples * sizeof(jar_xm_sample_t); + } else { + instr->samples = NULL; + } + + /* Instrument header size */ + offset += READ_U32(offset); + + for(uint16_t j = 0; j < instr->num_samples; ++j) { + /* Read sample header */ + jar_xm_sample_t* sample = instr->samples + j; + + sample->length = READ_U32(offset); + sample->loop_start = READ_U32(offset + 4); + sample->loop_length = READ_U32(offset + 8); + sample->loop_end = sample->loop_start + sample->loop_length; + sample->volume = (float)READ_U8(offset + 12) / (float)0x40; + sample->finetune = (int8_t)READ_U8(offset + 13); + + uint8_t flags = READ_U8(offset + 14); + if((flags & 3) == 0) { + sample->loop_type = jar_xm_NO_LOOP; + } else if((flags & 3) == 1) { + sample->loop_type = jar_xm_FORWARD_LOOP; + } else { + sample->loop_type = jar_xm_PING_PONG_LOOP; + } + + sample->bits = (flags & (1 << 4)) ? 16 : 8; + + sample->panning = (float)READ_U8(offset + 15) / (float)0xFF; + sample->relative_note = (int8_t)READ_U8(offset + 16); + READ_MEMCPY(sample->name, 18, SAMPLE_NAME_LENGTH); + sample->data = (float*)mempool; + + if(sample->bits == 16) { + /* 16 bit sample */ + mempool += sample->length * (sizeof(float) >> 1); + sample->loop_start >>= 1; + sample->loop_length >>= 1; + sample->loop_end >>= 1; + sample->length >>= 1; + } else { + /* 8 bit sample */ + mempool += sample->length * sizeof(float); + } + + offset += sample_header_size; + } + + for(uint16_t j = 0; j < instr->num_samples; ++j) { + /* Read sample data */ + jar_xm_sample_t* sample = instr->samples + j; + uint32_t length = sample->length; + + if(sample->bits == 16) { + int16_t v = 0; + for(uint32_t k = 0; k < length; ++k) { + v = v + (int16_t)READ_U16(offset + (k << 1)); + sample->data[k] = (float)v / (float)(1 << 15); + } + offset += sample->length << 1; + } else { + int8_t v = 0; + for(uint32_t k = 0; k < length; ++k) { + v = v + (int8_t)READ_U8(offset + k); + sample->data[k] = (float)v / (float)(1 << 7); + } + offset += sample->length; + } + } + } + + return mempool; +} + +//------------------------------------------------------------------------------- +//THE FOLLOWING IS FOR PLAYING +//------------------------------------------------------------------------------- + +/* ----- Static functions ----- */ + +static float jar_xm_waveform(jar_xm_waveform_type_t, uint8_t); +static void jar_xm_autovibrato(jar_xm_context_t*, jar_xm_channel_context_t*); +static void jar_xm_vibrato(jar_xm_context_t*, jar_xm_channel_context_t*, uint8_t, uint16_t); +static void jar_xm_tremolo(jar_xm_context_t*, jar_xm_channel_context_t*, uint8_t, uint16_t); +static void jar_xm_arpeggio(jar_xm_context_t*, jar_xm_channel_context_t*, uint8_t, uint16_t); +static void jar_xm_tone_portamento(jar_xm_context_t*, jar_xm_channel_context_t*); +static void jar_xm_pitch_slide(jar_xm_context_t*, jar_xm_channel_context_t*, float); +static void jar_xm_panning_slide(jar_xm_channel_context_t*, uint8_t); +static void jar_xm_volume_slide(jar_xm_channel_context_t*, uint8_t); + +static float jar_xm_envelope_lerp(jar_xm_envelope_point_t*, jar_xm_envelope_point_t*, uint16_t); +static void jar_xm_envelope_tick(jar_xm_channel_context_t*, jar_xm_envelope_t*, uint16_t*, float*); +static void jar_xm_envelopes(jar_xm_channel_context_t*); + +static float jar_xm_linear_period(float); +static float jar_xm_linear_frequency(float); +static float jar_xm_amiga_period(float); +static float jar_xm_amiga_frequency(float); +static float jar_xm_period(jar_xm_context_t*, float); +static float jar_xm_frequency(jar_xm_context_t*, float, float); +static void jar_xm_update_frequency(jar_xm_context_t*, jar_xm_channel_context_t*); + +static void jar_xm_handle_note_and_instrument(jar_xm_context_t*, jar_xm_channel_context_t*, jar_xm_pattern_slot_t*); +static void jar_xm_trigger_note(jar_xm_context_t*, jar_xm_channel_context_t*, unsigned int flags); +static void jar_xm_cut_note(jar_xm_channel_context_t*); +static void jar_xm_key_off(jar_xm_channel_context_t*); + +static void jar_xm_post_pattern_change(jar_xm_context_t*); +static void jar_xm_row(jar_xm_context_t*); +static void jar_xm_tick(jar_xm_context_t*); + +static float jar_xm_next_of_sample(jar_xm_channel_context_t*); +static void jar_xm_sample(jar_xm_context_t*, float*, float*); + +/* ----- Other oddities ----- */ + +#define jar_xm_TRIGGER_KEEP_VOLUME (1 << 0) +#define jar_xm_TRIGGER_KEEP_PERIOD (1 << 1) +#define jar_xm_TRIGGER_KEEP_SAMPLE_POSITION (1 << 2) + +static const uint16_t amiga_frequencies[] = { + 1712, 1616, 1525, 1440, /* C-2, C#2, D-2, D#2 */ + 1357, 1281, 1209, 1141, /* E-2, F-2, F#2, G-2 */ + 1077, 1017, 961, 907, /* G#2, A-2, A#2, B-2 */ + 856, /* C-3 */ +}; + +static const float multi_retrig_add[] = { + 0.f, -1.f, -2.f, -4.f, /* 0, 1, 2, 3 */ + -8.f, -16.f, 0.f, 0.f, /* 4, 5, 6, 7 */ + 0.f, 1.f, 2.f, 4.f, /* 8, 9, A, B */ + 8.f, 16.f, 0.f, 0.f /* C, D, E, F */ +}; + +static const float multi_retrig_multiply[] = { + 1.f, 1.f, 1.f, 1.f, /* 0, 1, 2, 3 */ + 1.f, 1.f, .6666667f, .5f, /* 4, 5, 6, 7 */ + 1.f, 1.f, 1.f, 1.f, /* 8, 9, A, B */ + 1.f, 1.f, 1.5f, 2.f /* C, D, E, F */ +}; + +#define jar_xm_CLAMP_UP1F(vol, limit) do { \ + if((vol) > (limit)) (vol) = (limit); \ + } while(0) +#define jar_xm_CLAMP_UP(vol) jar_xm_CLAMP_UP1F((vol), 1.f) + +#define jar_xm_CLAMP_DOWN1F(vol, limit) do { \ + if((vol) < (limit)) (vol) = (limit); \ + } while(0) +#define jar_xm_CLAMP_DOWN(vol) jar_xm_CLAMP_DOWN1F((vol), .0f) + +#define jar_xm_CLAMP2F(vol, up, down) do { \ + if((vol) > (up)) (vol) = (up); \ + else if((vol) < (down)) (vol) = (down); \ + } while(0) +#define jar_xm_CLAMP(vol) jar_xm_CLAMP2F((vol), 1.f, .0f) + +#define jar_xm_SLIDE_TOWARDS(val, goal, incr) do { \ + if((val) > (goal)) { \ + (val) -= (incr); \ + jar_xm_CLAMP_DOWN1F((val), (goal)); \ + } else if((val) < (goal)) { \ + (val) += (incr); \ + jar_xm_CLAMP_UP1F((val), (goal)); \ + } \ + } while(0) + +#define jar_xm_LERP(u, v, t) ((u) + (t) * ((v) - (u))) +#define jar_xm_INVERSE_LERP(u, v, lerp) (((lerp) - (u)) / ((v) - (u))) + +#define HAS_TONE_PORTAMENTO(s) ((s)->effect_type == 3 \ + || (s)->effect_type == 5 \ + || ((s)->volume_column >> 4) == 0xF) +#define HAS_ARPEGGIO(s) ((s)->effect_type == 0 \ + && (s)->effect_param != 0) +#define HAS_VIBRATO(s) ((s)->effect_type == 4 \ + || (s)->effect_param == 6 \ + || ((s)->volume_column >> 4) == 0xB) +#define NOTE_IS_VALID(n) ((n) > 0 && (n) < 97) + +/* ----- Function definitions ----- */ + +static float jar_xm_waveform(jar_xm_waveform_type_t waveform, uint8_t step) { + static unsigned int next_rand = 24492; + step %= 0x40; + + switch(waveform) { + + case jar_xm_SINE_WAVEFORM: + /* Why not use a table? For saving space, and because there's + * very very little actual performance gain. */ + return -sinf(2.f * 3.141592f * (float)step / (float)0x40); + + case jar_xm_RAMP_DOWN_WAVEFORM: + /* Ramp down: 1.0f when step = 0; -1.0f when step = 0x40 */ + return (float)(0x20 - step) / 0x20; + + case jar_xm_SQUARE_WAVEFORM: + /* Square with a 50% duty */ + return (step >= 0x20) ? 1.f : -1.f; + + case jar_xm_RANDOM_WAVEFORM: + /* Use the POSIX.1-2001 example, just to be deterministic + * across different machines */ + next_rand = next_rand * 1103515245 + 12345; + return (float)((next_rand >> 16) & 0x7FFF) / (float)0x4000 - 1.f; + + case jar_xm_RAMP_UP_WAVEFORM: + /* Ramp up: -1.f when step = 0; 1.f when step = 0x40 */ + return (float)(step - 0x20) / 0x20; + + default: + break; + + } + + return .0f; +} + +static void jar_xm_autovibrato(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch) { + if(ch->instrument == NULL || ch->instrument->vibrato_depth == 0) return; + jar_xm_instrument_t* instr = ch->instrument; + float sweep = 1.f; + + if(ch->autovibrato_ticks < instr->vibrato_sweep) { + /* No idea if this is correct, but it sounds close enough… */ + sweep = jar_xm_LERP(0.f, 1.f, (float)ch->autovibrato_ticks / (float)instr->vibrato_sweep); + } + + unsigned int step = ((ch->autovibrato_ticks++) * instr->vibrato_rate) >> 2; + ch->autovibrato_note_offset = .25f * jar_xm_waveform(instr->vibrato_type, step) + * (float)instr->vibrato_depth / (float)0xF * sweep; + jar_xm_update_frequency(ctx, ch); +} + +static void jar_xm_vibrato(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, uint8_t param, uint16_t pos) { + unsigned int step = pos * (param >> 4); + ch->vibrato_note_offset = + 2.f + * jar_xm_waveform(ch->vibrato_waveform, step) + * (float)(param & 0x0F) / (float)0xF; + jar_xm_update_frequency(ctx, ch); +} + +static void jar_xm_tremolo(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, uint8_t param, uint16_t pos) { + unsigned int step = pos * (param >> 4); + /* Not so sure about this, it sounds correct by ear compared with + * MilkyTracker, but it could come from other bugs */ + ch->tremolo_volume = -1.f * jar_xm_waveform(ch->tremolo_waveform, step) + * (float)(param & 0x0F) / (float)0xF; +} + +static void jar_xm_arpeggio(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, uint8_t param, uint16_t tick) { + switch(tick % 3) { + case 0: + ch->arp_in_progress = false; + ch->arp_note_offset = 0; + break; + case 2: + ch->arp_in_progress = true; + ch->arp_note_offset = param >> 4; + break; + case 1: + ch->arp_in_progress = true; + ch->arp_note_offset = param & 0x0F; + break; + } + + jar_xm_update_frequency(ctx, ch); +} + +static void jar_xm_tone_portamento(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch) { + /* 3xx called without a note, wait until we get an actual + * target note. */ + if(ch->tone_portamento_target_period == 0.f) return; + + if(ch->period != ch->tone_portamento_target_period) { + jar_xm_SLIDE_TOWARDS(ch->period, + ch->tone_portamento_target_period, + (ctx->module.frequency_type == jar_xm_LINEAR_FREQUENCIES ? + 4.f : 1.f) * ch->tone_portamento_param + ); + jar_xm_update_frequency(ctx, ch); + } +} + +static void jar_xm_pitch_slide(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, float period_offset) { + /* Don't ask about the 4.f coefficient. I found mention of it + * nowhere. Found by ear™. */ + if(ctx->module.frequency_type == jar_xm_LINEAR_FREQUENCIES) { + period_offset *= 4.f; + } + + ch->period += period_offset; + jar_xm_CLAMP_DOWN(ch->period); + /* XXX: upper bound of period ? */ + + jar_xm_update_frequency(ctx, ch); +} + +static void jar_xm_panning_slide(jar_xm_channel_context_t* ch, uint8_t rawval) { + float f; + + if((rawval & 0xF0) && (rawval & 0x0F)) { + /* Illegal state */ + return; + } + + if(rawval & 0xF0) { + /* Slide right */ + f = (float)(rawval >> 4) / (float)0xFF; + ch->panning += f; + jar_xm_CLAMP_UP(ch->panning); + } else { + /* Slide left */ + f = (float)(rawval & 0x0F) / (float)0xFF; + ch->panning -= f; + jar_xm_CLAMP_DOWN(ch->panning); + } +} + +static void jar_xm_volume_slide(jar_xm_channel_context_t* ch, uint8_t rawval) { + float f; + + if((rawval & 0xF0) && (rawval & 0x0F)) { + /* Illegal state */ + return; + } + + if(rawval & 0xF0) { + /* Slide up */ + f = (float)(rawval >> 4) / (float)0x40; + ch->volume += f; + jar_xm_CLAMP_UP(ch->volume); + } else { + /* Slide down */ + f = (float)(rawval & 0x0F) / (float)0x40; + ch->volume -= f; + jar_xm_CLAMP_DOWN(ch->volume); + } +} + +static float jar_xm_envelope_lerp(jar_xm_envelope_point_t* a, jar_xm_envelope_point_t* b, uint16_t pos) { + /* Linear interpolation between two envelope points */ + if(pos <= a->frame) return a->value; + else if(pos >= b->frame) return b->value; + else { + float p = (float)(pos - a->frame) / (float)(b->frame - a->frame); + return a->value * (1 - p) + b->value * p; + } +} + +static void jar_xm_post_pattern_change(jar_xm_context_t* ctx) { + /* Loop if necessary */ + if(ctx->current_table_index >= ctx->module.length) { + ctx->current_table_index = ctx->module.restart_position; + } +} + +static float jar_xm_linear_period(float note) { + return 7680.f - note * 64.f; +} + +static float jar_xm_linear_frequency(float period) { + return 8363.f * powf(2.f, (4608.f - period) / 768.f); +} + +static float jar_xm_amiga_period(float note) { + unsigned int intnote = note; + uint8_t a = intnote % 12; + int8_t octave = note / 12.f - 2; + uint16_t p1 = amiga_frequencies[a], p2 = amiga_frequencies[a + 1]; + + if(octave > 0) { + p1 >>= octave; + p2 >>= octave; + } else if(octave < 0) { + p1 <<= (-octave); + p2 <<= (-octave); + } + + return jar_xm_LERP(p1, p2, note - intnote); +} + +static float jar_xm_amiga_frequency(float period) { + if(period == .0f) return .0f; + + /* This is the PAL value. No reason to choose this one over the + * NTSC value. */ + return 7093789.2f / (period * 2.f); +} + +static float jar_xm_period(jar_xm_context_t* ctx, float note) { + switch(ctx->module.frequency_type) { + case jar_xm_LINEAR_FREQUENCIES: + return jar_xm_linear_period(note); + case jar_xm_AMIGA_FREQUENCIES: + return jar_xm_amiga_period(note); + } + return .0f; +} + +static float jar_xm_frequency(jar_xm_context_t* ctx, float period, float note_offset) { + uint8_t a; + int8_t octave; + float note; + uint16_t p1, p2; + + switch(ctx->module.frequency_type) { + + case jar_xm_LINEAR_FREQUENCIES: + return jar_xm_linear_frequency(period - 64.f * note_offset); + + case jar_xm_AMIGA_FREQUENCIES: + if(note_offset == 0) { + /* A chance to escape from insanity */ + return jar_xm_amiga_frequency(period); + } + + /* FIXME: this is very crappy at best */ + a = octave = 0; + + /* Find the octave of the current period */ + if(period > amiga_frequencies[0]) { + --octave; + while(period > (amiga_frequencies[0] << (-octave))) --octave; + } else if(period < amiga_frequencies[12]) { + ++octave; + while(period < (amiga_frequencies[12] >> octave)) ++octave; + } + + /* Find the smallest note closest to the current period */ + for(uint8_t i = 0; i < 12; ++i) { + p1 = amiga_frequencies[i], p2 = amiga_frequencies[i + 1]; + + if(octave > 0) { + p1 >>= octave; + p2 >>= octave; + } else if(octave < 0) { + p1 <<= (-octave); + p2 <<= (-octave); + } + + if(p2 <= period && period <= p1) { + a = i; + break; + } + } + + if(JAR_XM_DEBUG && (p1 < period || p2 > period)) { + DEBUG("%i <= %f <= %i should hold but doesn't, this is a bug", p2, period, p1); + } + + note = 12.f * (octave + 2) + a + jar_xm_INVERSE_LERP(p1, p2, period); + + return jar_xm_amiga_frequency(jar_xm_amiga_period(note + note_offset)); + + } + + return .0f; +} + +static void jar_xm_update_frequency(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch) { + ch->frequency = jar_xm_frequency( + ctx, ch->period, + (ch->arp_note_offset > 0 ? ch->arp_note_offset : ( + ch->vibrato_note_offset + ch->autovibrato_note_offset + )) + ); + ch->step = ch->frequency / ctx->rate; +} + +static void jar_xm_handle_note_and_instrument(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, + jar_xm_pattern_slot_t* s) { + if(s->instrument > 0) { + if(HAS_TONE_PORTAMENTO(ch->current) && ch->instrument != NULL && ch->sample != NULL) { + /* Tone portamento in effect, unclear stuff happens */ + jar_xm_trigger_note(ctx, ch, jar_xm_TRIGGER_KEEP_PERIOD | jar_xm_TRIGGER_KEEP_SAMPLE_POSITION); + } else if(s->instrument > ctx->module.num_instruments) { + /* Invalid instrument, Cut current note */ + jar_xm_cut_note(ch); + ch->instrument = NULL; + ch->sample = NULL; + } else { + ch->instrument = ctx->module.instruments + (s->instrument - 1); + if(s->note == 0 && ch->sample != NULL) { + /* Ghost instrument, trigger note */ + /* Sample position is kept, but envelopes are reset */ + jar_xm_trigger_note(ctx, ch, jar_xm_TRIGGER_KEEP_SAMPLE_POSITION); + } + } + } + + if(NOTE_IS_VALID(s->note)) { + /* Yes, the real note number is s->note -1. Try finding + * THAT in any of the specs! :-) */ + + jar_xm_instrument_t* instr = ch->instrument; + + if(HAS_TONE_PORTAMENTO(ch->current) && instr != NULL && ch->sample != NULL) { + /* Tone portamento in effect */ + ch->note = s->note + ch->sample->relative_note + ch->sample->finetune / 128.f - 1.f; + ch->tone_portamento_target_period = jar_xm_period(ctx, ch->note); + } else if(instr == NULL || ch->instrument->num_samples == 0) { + /* Bad instrument */ + jar_xm_cut_note(ch); + } else { + if(instr->sample_of_notes[s->note - 1] < instr->num_samples) { +#if JAR_XM_RAMPING + for(unsigned int z = 0; z < jar_xm_SAMPLE_RAMPING_POINTS; ++z) { + ch->end_of_previous_sample[z] = jar_xm_next_of_sample(ch); + } + ch->frame_count = 0; +#endif + ch->sample = instr->samples + instr->sample_of_notes[s->note - 1]; + ch->orig_note = ch->note = s->note + ch->sample->relative_note + + ch->sample->finetune / 128.f - 1.f; + if(s->instrument > 0) { + jar_xm_trigger_note(ctx, ch, 0); + } else { + /* Ghost note: keep old volume */ + jar_xm_trigger_note(ctx, ch, jar_xm_TRIGGER_KEEP_VOLUME); + } + } else { + /* Bad sample */ + jar_xm_cut_note(ch); + } + } + } else if(s->note == 97) { + /* Key Off */ + jar_xm_key_off(ch); + } + + switch(s->volume_column >> 4) { + + case 0x5: + if(s->volume_column > 0x50) break; + case 0x1: + case 0x2: + case 0x3: + case 0x4: + /* Set volume */ + ch->volume = (float)(s->volume_column - 0x10) / (float)0x40; + break; + + case 0x8: /* Fine volume slide down */ + jar_xm_volume_slide(ch, s->volume_column & 0x0F); + break; + + case 0x9: /* Fine volume slide up */ + jar_xm_volume_slide(ch, s->volume_column << 4); + break; + + case 0xA: /* Set vibrato speed */ + ch->vibrato_param = (ch->vibrato_param & 0x0F) | ((s->volume_column & 0x0F) << 4); + break; + + case 0xC: /* Set panning */ + ch->panning = (float)( + ((s->volume_column & 0x0F) << 4) | (s->volume_column & 0x0F) + ) / (float)0xFF; + break; + + case 0xF: /* Tone portamento */ + if(s->volume_column & 0x0F) { + ch->tone_portamento_param = ((s->volume_column & 0x0F) << 4) + | (s->volume_column & 0x0F); + } + break; + + default: + break; + + } + + switch(s->effect_type) { + + case 1: /* 1xx: Portamento up */ + if(s->effect_param > 0) { + ch->portamento_up_param = s->effect_param; + } + break; + + case 2: /* 2xx: Portamento down */ + if(s->effect_param > 0) { + ch->portamento_down_param = s->effect_param; + } + break; + + case 3: /* 3xx: Tone portamento */ + if(s->effect_param > 0) { + ch->tone_portamento_param = s->effect_param; + } + break; + + case 4: /* 4xy: Vibrato */ + if(s->effect_param & 0x0F) { + /* Set vibrato depth */ + ch->vibrato_param = (ch->vibrato_param & 0xF0) | (s->effect_param & 0x0F); + } + if(s->effect_param >> 4) { + /* Set vibrato speed */ + ch->vibrato_param = (s->effect_param & 0xF0) | (ch->vibrato_param & 0x0F); + } + break; + + case 5: /* 5xy: Tone portamento + Volume slide */ + if(s->effect_param > 0) { + ch->volume_slide_param = s->effect_param; + } + break; + + case 6: /* 6xy: Vibrato + Volume slide */ + if(s->effect_param > 0) { + ch->volume_slide_param = s->effect_param; + } + break; + + case 7: /* 7xy: Tremolo */ + if(s->effect_param & 0x0F) { + /* Set tremolo depth */ + ch->tremolo_param = (ch->tremolo_param & 0xF0) | (s->effect_param & 0x0F); + } + if(s->effect_param >> 4) { + /* Set tremolo speed */ + ch->tremolo_param = (s->effect_param & 0xF0) | (ch->tremolo_param & 0x0F); + } + break; + + case 8: /* 8xx: Set panning */ + ch->panning = (float)s->effect_param / (float)0xFF; + break; + + case 9: /* 9xx: Sample offset */ + if(ch->sample != NULL && NOTE_IS_VALID(s->note)) { + uint32_t final_offset = s->effect_param << (ch->sample->bits == 16 ? 7 : 8); + if(final_offset >= ch->sample->length) { + /* Pretend the sample dosen't loop and is done playing */ + ch->sample_position = -1; + break; + } + ch->sample_position = final_offset; + } + break; + + case 0xA: /* Axy: Volume slide */ + if(s->effect_param > 0) { + ch->volume_slide_param = s->effect_param; + } + break; + + case 0xB: /* Bxx: Position jump */ + if(s->effect_param < ctx->module.length) { + ctx->position_jump = true; + ctx->jump_dest = s->effect_param; + } + break; + + case 0xC: /* Cxx: Set volume */ + ch->volume = (float)((s->effect_param > 0x40) + ? 0x40 : s->effect_param) / (float)0x40; + break; + + case 0xD: /* Dxx: Pattern break */ + /* Jump after playing this line */ + ctx->pattern_break = true; + ctx->jump_row = (s->effect_param >> 4) * 10 + (s->effect_param & 0x0F); + break; + + case 0xE: /* EXy: Extended command */ + switch(s->effect_param >> 4) { + + case 1: /* E1y: Fine portamento up */ + if(s->effect_param & 0x0F) { + ch->fine_portamento_up_param = s->effect_param & 0x0F; + } + jar_xm_pitch_slide(ctx, ch, -ch->fine_portamento_up_param); + break; + + case 2: /* E2y: Fine portamento down */ + if(s->effect_param & 0x0F) { + ch->fine_portamento_down_param = s->effect_param & 0x0F; + } + jar_xm_pitch_slide(ctx, ch, ch->fine_portamento_down_param); + break; + + case 4: /* E4y: Set vibrato control */ + ch->vibrato_waveform = s->effect_param & 3; + ch->vibrato_waveform_retrigger = !((s->effect_param >> 2) & 1); + break; + + case 5: /* E5y: Set finetune */ + if(NOTE_IS_VALID(ch->current->note) && ch->sample != NULL) { + ch->note = ch->current->note + ch->sample->relative_note + + (float)(((s->effect_param & 0x0F) - 8) << 4) / 128.f - 1.f; + ch->period = jar_xm_period(ctx, ch->note); + jar_xm_update_frequency(ctx, ch); + } + break; + + case 6: /* E6y: Pattern loop */ + if(s->effect_param & 0x0F) { + if((s->effect_param & 0x0F) == ch->pattern_loop_count) { + /* Loop is over */ + ch->pattern_loop_count = 0; + break; + } + + /* Jump to the beginning of the loop */ + ch->pattern_loop_count++; + ctx->position_jump = true; + ctx->jump_row = ch->pattern_loop_origin; + ctx->jump_dest = ctx->current_table_index; + } else { + /* Set loop start point */ + ch->pattern_loop_origin = ctx->current_row; + /* Replicate FT2 E60 bug */ + ctx->jump_row = ch->pattern_loop_origin; + } + break; + + case 7: /* E7y: Set tremolo control */ + ch->tremolo_waveform = s->effect_param & 3; + ch->tremolo_waveform_retrigger = !((s->effect_param >> 2) & 1); + break; + + case 0xA: /* EAy: Fine volume slide up */ + if(s->effect_param & 0x0F) { + ch->fine_volume_slide_param = s->effect_param & 0x0F; + } + jar_xm_volume_slide(ch, ch->fine_volume_slide_param << 4); + break; + + case 0xB: /* EBy: Fine volume slide down */ + if(s->effect_param & 0x0F) { + ch->fine_volume_slide_param = s->effect_param & 0x0F; + } + jar_xm_volume_slide(ch, ch->fine_volume_slide_param); + break; + + case 0xD: /* EDy: Note delay */ + /* XXX: figure this out better. EDx triggers + * the note even when there no note and no + * instrument. But ED0 acts like like a ghost + * note, EDx (x ≠ 0) does not. */ + if(s->note == 0 && s->instrument == 0) { + unsigned int flags = jar_xm_TRIGGER_KEEP_VOLUME; + + if(ch->current->effect_param & 0x0F) { + ch->note = ch->orig_note; + jar_xm_trigger_note(ctx, ch, flags); + } else { + jar_xm_trigger_note( + ctx, ch, + flags + | jar_xm_TRIGGER_KEEP_PERIOD + | jar_xm_TRIGGER_KEEP_SAMPLE_POSITION + ); + } + } + break; + + case 0xE: /* EEy: Pattern delay */ + ctx->extra_ticks = (ch->current->effect_param & 0x0F) * ctx->tempo; + break; + + default: + break; + + } + break; + + case 0xF: /* Fxx: Set tempo/BPM */ + if(s->effect_param > 0) { + if(s->effect_param <= 0x1F) { + ctx->tempo = s->effect_param; + } else { + ctx->bpm = s->effect_param; + } + } + break; + + case 16: /* Gxx: Set global volume */ + ctx->global_volume = (float)((s->effect_param > 0x40) + ? 0x40 : s->effect_param) / (float)0x40; + break; + + case 17: /* Hxy: Global volume slide */ + if(s->effect_param > 0) { + ch->global_volume_slide_param = s->effect_param; + } + break; + + case 21: /* Lxx: Set envelope position */ + ch->volume_envelope_frame_count = s->effect_param; + ch->panning_envelope_frame_count = s->effect_param; + break; + + case 25: /* Pxy: Panning slide */ + if(s->effect_param > 0) { + ch->panning_slide_param = s->effect_param; + } + break; + + case 27: /* Rxy: Multi retrig note */ + if(s->effect_param > 0) { + if((s->effect_param >> 4) == 0) { + /* Keep previous x value */ + ch->multi_retrig_param = (ch->multi_retrig_param & 0xF0) | (s->effect_param & 0x0F); + } else { + ch->multi_retrig_param = s->effect_param; + } + } + break; + + case 29: /* Txy: Tremor */ + if(s->effect_param > 0) { + /* Tremor x and y params do not appear to be separately + * kept in memory, unlike Rxy */ + ch->tremor_param = s->effect_param; + } + break; + + case 33: /* Xxy: Extra stuff */ + switch(s->effect_param >> 4) { + + case 1: /* X1y: Extra fine portamento up */ + if(s->effect_param & 0x0F) { + ch->extra_fine_portamento_up_param = s->effect_param & 0x0F; + } + jar_xm_pitch_slide(ctx, ch, -1.0f * ch->extra_fine_portamento_up_param); + break; + + case 2: /* X2y: Extra fine portamento down */ + if(s->effect_param & 0x0F) { + ch->extra_fine_portamento_down_param = s->effect_param & 0x0F; + } + jar_xm_pitch_slide(ctx, ch, ch->extra_fine_portamento_down_param); + break; + + default: + break; + + } + break; + + default: + break; + + } +} + +static void jar_xm_trigger_note(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, unsigned int flags) { + if(!(flags & jar_xm_TRIGGER_KEEP_SAMPLE_POSITION)) { + ch->sample_position = 0.f; + ch->ping = true; + } + + if(ch->sample != NULL) { + if(!(flags & jar_xm_TRIGGER_KEEP_VOLUME)) { + ch->volume = ch->sample->volume; + } + + ch->panning = ch->sample->panning; + } + + ch->sustained = true; + ch->fadeout_volume = ch->volume_envelope_volume = 1.0f; + ch->panning_envelope_panning = .5f; + ch->volume_envelope_frame_count = ch->panning_envelope_frame_count = 0; + ch->vibrato_note_offset = 0.f; + ch->tremolo_volume = 0.f; + ch->tremor_on = false; + + ch->autovibrato_ticks = 0; + + if(ch->vibrato_waveform_retrigger) { + ch->vibrato_ticks = 0; /* XXX: should the waveform itself also + * be reset to sine? */ + } + if(ch->tremolo_waveform_retrigger) { + ch->tremolo_ticks = 0; + } + + if(!(flags & jar_xm_TRIGGER_KEEP_PERIOD)) { + ch->period = jar_xm_period(ctx, ch->note); + jar_xm_update_frequency(ctx, ch); + } + + ch->latest_trigger = ctx->generated_samples; + if(ch->instrument != NULL) { + ch->instrument->latest_trigger = ctx->generated_samples; + } + if(ch->sample != NULL) { + ch->sample->latest_trigger = ctx->generated_samples; + } +} + +static void jar_xm_cut_note(jar_xm_channel_context_t* ch) { + /* NB: this is not the same as Key Off */ + ch->volume = .0f; +} + +static void jar_xm_key_off(jar_xm_channel_context_t* ch) { + /* Key Off */ + ch->sustained = false; + + /* If no volume envelope is used, also cut the note */ + if(ch->instrument == NULL || !ch->instrument->volume_envelope.enabled) { + jar_xm_cut_note(ch); + } +} + +static void jar_xm_row(jar_xm_context_t* ctx) { + if(ctx->position_jump) { + ctx->current_table_index = ctx->jump_dest; + ctx->current_row = ctx->jump_row; + ctx->position_jump = false; + ctx->pattern_break = false; + ctx->jump_row = 0; + jar_xm_post_pattern_change(ctx); + } else if(ctx->pattern_break) { + ctx->current_table_index++; + ctx->current_row = ctx->jump_row; + ctx->pattern_break = false; + ctx->jump_row = 0; + jar_xm_post_pattern_change(ctx); + } + + jar_xm_pattern_t* cur = ctx->module.patterns + ctx->module.pattern_table[ctx->current_table_index]; + bool in_a_loop = false; + + /* Read notes… */ + for(uint8_t i = 0; i < ctx->module.num_channels; ++i) { + jar_xm_pattern_slot_t* s = cur->slots + ctx->current_row * ctx->module.num_channels + i; + jar_xm_channel_context_t* ch = ctx->channels + i; + + ch->current = s; + + if(s->effect_type != 0xE || s->effect_param >> 4 != 0xD) { + jar_xm_handle_note_and_instrument(ctx, ch, s); + } else { + ch->note_delay_param = s->effect_param & 0x0F; + } + + if(!in_a_loop && ch->pattern_loop_count > 0) { + in_a_loop = true; + } + } + + if(!in_a_loop) { + /* No E6y loop is in effect (or we are in the first pass) */ + ctx->loop_count = (ctx->row_loop_count[MAX_NUM_ROWS * ctx->current_table_index + ctx->current_row]++); + } + + ctx->current_row++; /* Since this is an uint8, this line can + * increment from 255 to 0, in which case it + * is still necessary to go the next + * pattern. */ + if(!ctx->position_jump && !ctx->pattern_break && + (ctx->current_row >= cur->num_rows || ctx->current_row == 0)) { + ctx->current_table_index++; + ctx->current_row = ctx->jump_row; /* This will be 0 most of + * the time, except when E60 + * is used */ + ctx->jump_row = 0; + jar_xm_post_pattern_change(ctx); + } +} + +static void jar_xm_envelope_tick(jar_xm_channel_context_t* ch, + jar_xm_envelope_t* env, + uint16_t* counter, + float* outval) { + if(env->num_points < 2) { + /* Don't really know what to do… */ + if(env->num_points == 1) { + /* XXX I am pulling this out of my ass */ + *outval = (float)env->points[0].value / (float)0x40; + if(*outval > 1) { + *outval = 1; + } + } + + return; + } else { + uint8_t j; + + if(env->loop_enabled) { + uint16_t loop_start = env->points[env->loop_start_point].frame; + uint16_t loop_end = env->points[env->loop_end_point].frame; + uint16_t loop_length = loop_end - loop_start; + + if(*counter >= loop_end) { + *counter -= loop_length; + } + } + + for(j = 0; j < (env->num_points - 2); ++j) { + if(env->points[j].frame <= *counter && + env->points[j+1].frame >= *counter) { + break; + } + } + + *outval = jar_xm_envelope_lerp(env->points + j, env->points + j + 1, *counter) / (float)0x40; + + /* Make sure it is safe to increment frame count */ + if(!ch->sustained || !env->sustain_enabled || + *counter != env->points[env->sustain_point].frame) { + (*counter)++; + } + } +} + +static void jar_xm_envelopes(jar_xm_channel_context_t* ch) { + if(ch->instrument != NULL) { + if(ch->instrument->volume_envelope.enabled) { + if(!ch->sustained) { + ch->fadeout_volume -= (float)ch->instrument->volume_fadeout / 65536.f; + jar_xm_CLAMP_DOWN(ch->fadeout_volume); + } + + jar_xm_envelope_tick(ch, + &(ch->instrument->volume_envelope), + &(ch->volume_envelope_frame_count), + &(ch->volume_envelope_volume)); + } + + if(ch->instrument->panning_envelope.enabled) { + jar_xm_envelope_tick(ch, + &(ch->instrument->panning_envelope), + &(ch->panning_envelope_frame_count), + &(ch->panning_envelope_panning)); + } + } +} + +static void jar_xm_tick(jar_xm_context_t* ctx) { + if(ctx->current_tick == 0) { + jar_xm_row(ctx); + } + + for(uint8_t i = 0; i < ctx->module.num_channels; ++i) { + jar_xm_channel_context_t* ch = ctx->channels + i; + + jar_xm_envelopes(ch); + jar_xm_autovibrato(ctx, ch); + + if(ch->arp_in_progress && !HAS_ARPEGGIO(ch->current)) { + ch->arp_in_progress = false; + ch->arp_note_offset = 0; + jar_xm_update_frequency(ctx, ch); + } + if(ch->vibrato_in_progress && !HAS_VIBRATO(ch->current)) { + ch->vibrato_in_progress = false; + ch->vibrato_note_offset = 0.f; + jar_xm_update_frequency(ctx, ch); + } + + switch(ch->current->volume_column >> 4) { + + case 0x6: /* Volume slide down */ + if(ctx->current_tick == 0) break; + jar_xm_volume_slide(ch, ch->current->volume_column & 0x0F); + break; + + case 0x7: /* Volume slide up */ + if(ctx->current_tick == 0) break; + jar_xm_volume_slide(ch, ch->current->volume_column << 4); + break; + + case 0xB: /* Vibrato */ + if(ctx->current_tick == 0) break; + ch->vibrato_in_progress = false; + jar_xm_vibrato(ctx, ch, ch->vibrato_param, ch->vibrato_ticks++); + break; + + case 0xD: /* Panning slide left */ + if(ctx->current_tick == 0) break; + jar_xm_panning_slide(ch, ch->current->volume_column & 0x0F); + break; + + case 0xE: /* Panning slide right */ + if(ctx->current_tick == 0) break; + jar_xm_panning_slide(ch, ch->current->volume_column << 4); + break; + + case 0xF: /* Tone portamento */ + if(ctx->current_tick == 0) break; + jar_xm_tone_portamento(ctx, ch); + break; + + default: + break; + + } + + switch(ch->current->effect_type) { + + case 0: /* 0xy: Arpeggio */ + if(ch->current->effect_param > 0) { + char arp_offset = ctx->tempo % 3; + switch(arp_offset) { + case 2: /* 0 -> x -> 0 -> y -> x -> … */ + if(ctx->current_tick == 1) { + ch->arp_in_progress = true; + ch->arp_note_offset = ch->current->effect_param >> 4; + jar_xm_update_frequency(ctx, ch); + break; + } + /* No break here, this is intended */ + case 1: /* 0 -> 0 -> y -> x -> … */ + if(ctx->current_tick == 0) { + ch->arp_in_progress = false; + ch->arp_note_offset = 0; + jar_xm_update_frequency(ctx, ch); + break; + } + /* No break here, this is intended */ + case 0: /* 0 -> y -> x -> … */ + jar_xm_arpeggio(ctx, ch, ch->current->effect_param, ctx->current_tick - arp_offset); + default: + break; + } + } + break; + + case 1: /* 1xx: Portamento up */ + if(ctx->current_tick == 0) break; + jar_xm_pitch_slide(ctx, ch, -ch->portamento_up_param); + break; + + case 2: /* 2xx: Portamento down */ + if(ctx->current_tick == 0) break; + jar_xm_pitch_slide(ctx, ch, ch->portamento_down_param); + break; + + case 3: /* 3xx: Tone portamento */ + if(ctx->current_tick == 0) break; + jar_xm_tone_portamento(ctx, ch); + break; + + case 4: /* 4xy: Vibrato */ + if(ctx->current_tick == 0) break; + ch->vibrato_in_progress = true; + jar_xm_vibrato(ctx, ch, ch->vibrato_param, ch->vibrato_ticks++); + break; + + case 5: /* 5xy: Tone portamento + Volume slide */ + if(ctx->current_tick == 0) break; + jar_xm_tone_portamento(ctx, ch); + jar_xm_volume_slide(ch, ch->volume_slide_param); + break; + + case 6: /* 6xy: Vibrato + Volume slide */ + if(ctx->current_tick == 0) break; + ch->vibrato_in_progress = true; + jar_xm_vibrato(ctx, ch, ch->vibrato_param, ch->vibrato_ticks++); + jar_xm_volume_slide(ch, ch->volume_slide_param); + break; + + case 7: /* 7xy: Tremolo */ + if(ctx->current_tick == 0) break; + jar_xm_tremolo(ctx, ch, ch->tremolo_param, ch->tremolo_ticks++); + break; + + case 0xA: /* Axy: Volume slide */ + if(ctx->current_tick == 0) break; + jar_xm_volume_slide(ch, ch->volume_slide_param); + break; + + case 0xE: /* EXy: Extended command */ + switch(ch->current->effect_param >> 4) { + + case 0x9: /* E9y: Retrigger note */ + if(ctx->current_tick != 0 && ch->current->effect_param & 0x0F) { + if(!(ctx->current_tick % (ch->current->effect_param & 0x0F))) { + jar_xm_trigger_note(ctx, ch, 0); + jar_xm_envelopes(ch); + } + } + break; + + case 0xC: /* ECy: Note cut */ + if((ch->current->effect_param & 0x0F) == ctx->current_tick) { + jar_xm_cut_note(ch); + } + break; + + case 0xD: /* EDy: Note delay */ + if(ch->note_delay_param == ctx->current_tick) { + jar_xm_handle_note_and_instrument(ctx, ch, ch->current); + jar_xm_envelopes(ch); + } + break; + + default: + break; + + } + break; + + case 17: /* Hxy: Global volume slide */ + if(ctx->current_tick == 0) break; + if((ch->global_volume_slide_param & 0xF0) && + (ch->global_volume_slide_param & 0x0F)) { + /* Illegal state */ + break; + } + if(ch->global_volume_slide_param & 0xF0) { + /* Global slide up */ + float f = (float)(ch->global_volume_slide_param >> 4) / (float)0x40; + ctx->global_volume += f; + jar_xm_CLAMP_UP(ctx->global_volume); + } else { + /* Global slide down */ + float f = (float)(ch->global_volume_slide_param & 0x0F) / (float)0x40; + ctx->global_volume -= f; + jar_xm_CLAMP_DOWN(ctx->global_volume); + } + break; + + case 20: /* Kxx: Key off */ + /* Most documentations will tell you the parameter has no + * use. Don't be fooled. */ + if(ctx->current_tick == ch->current->effect_param) { + jar_xm_key_off(ch); + } + break; + + case 25: /* Pxy: Panning slide */ + if(ctx->current_tick == 0) break; + jar_xm_panning_slide(ch, ch->panning_slide_param); + break; + + case 27: /* Rxy: Multi retrig note */ + if(ctx->current_tick == 0) break; + if(((ch->multi_retrig_param) & 0x0F) == 0) break; + if((ctx->current_tick % (ch->multi_retrig_param & 0x0F)) == 0) { + float v = ch->volume * multi_retrig_multiply[ch->multi_retrig_param >> 4] + + multi_retrig_add[ch->multi_retrig_param >> 4]; + jar_xm_CLAMP(v); + jar_xm_trigger_note(ctx, ch, 0); + ch->volume = v; + } + break; + + case 29: /* Txy: Tremor */ + if(ctx->current_tick == 0) break; + ch->tremor_on = ( + (ctx->current_tick - 1) % ((ch->tremor_param >> 4) + (ch->tremor_param & 0x0F) + 2) + > + (ch->tremor_param >> 4) + ); + break; + + default: + break; + + } + + float panning, volume; + + panning = ch->panning + + (ch->panning_envelope_panning - .5f) * (.5f - fabs(ch->panning - .5f)) * 2.0f; + + if(ch->tremor_on) { + volume = .0f; + } else { + volume = ch->volume + ch->tremolo_volume; + jar_xm_CLAMP(volume); + volume *= ch->fadeout_volume * ch->volume_envelope_volume; + } + +#if JAR_XM_RAMPING + ch->target_panning = panning; + ch->target_volume = volume; +#else + ch->actual_panning = panning; + ch->actual_volume = volume; +#endif + } + + ctx->current_tick++; + if(ctx->current_tick >= ctx->tempo + ctx->extra_ticks) { + ctx->current_tick = 0; + ctx->extra_ticks = 0; + } + + /* FT2 manual says number of ticks / second = BPM * 0.4 */ + ctx->remaining_samples_in_tick += (float)ctx->rate / ((float)ctx->bpm * 0.4f); +} + +static float jar_xm_next_of_sample(jar_xm_channel_context_t* ch) { + if(ch->instrument == NULL || ch->sample == NULL || ch->sample_position < 0) { +#if JAR_XM_RAMPING + if(ch->frame_count < jar_xm_SAMPLE_RAMPING_POINTS) { + return jar_xm_LERP(ch->end_of_previous_sample[ch->frame_count], .0f, + (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS); + } +#endif + return .0f; + } + if(ch->sample->length == 0) { + return .0f; + } + + float u, v, t; + uint32_t a, b; + a = (uint32_t)ch->sample_position; /* This cast is fine, + * sample_position will not + * go above integer + * ranges */ + if(JAR_XM_LINEAR_INTERPOLATION) { + b = a + 1; + t = ch->sample_position - a; /* Cheaper than fmodf(., 1.f) */ + } + u = ch->sample->data[a]; + + switch(ch->sample->loop_type) { + + case jar_xm_NO_LOOP: + if(JAR_XM_LINEAR_INTERPOLATION) { + v = (b < ch->sample->length) ? ch->sample->data[b] : .0f; + } + ch->sample_position += ch->step; + if(ch->sample_position >= ch->sample->length) { + ch->sample_position = -1; + } + break; + + case jar_xm_FORWARD_LOOP: + if(JAR_XM_LINEAR_INTERPOLATION) { + v = ch->sample->data[ + (b == ch->sample->loop_end) ? ch->sample->loop_start : b + ]; + } + ch->sample_position += ch->step; + while(ch->sample_position >= ch->sample->loop_end) { + ch->sample_position -= ch->sample->loop_length; + } + break; + + case jar_xm_PING_PONG_LOOP: + if(ch->ping) { + ch->sample_position += ch->step; + } else { + ch->sample_position -= ch->step; + } + /* XXX: this may not work for very tight ping-pong loops + * (ie switches direction more than once per sample */ + if(ch->ping) { + if(JAR_XM_LINEAR_INTERPOLATION) { + v = (b >= ch->sample->loop_end) ? ch->sample->data[a] : ch->sample->data[b]; + } + if(ch->sample_position >= ch->sample->loop_end) { + ch->ping = false; + ch->sample_position = (ch->sample->loop_end << 1) - ch->sample_position; + } + /* sanity checking */ + if(ch->sample_position >= ch->sample->length) { + ch->ping = false; + ch->sample_position -= ch->sample->length - 1; + } + } else { + if(JAR_XM_LINEAR_INTERPOLATION) { + v = u; + u = (b == 1 || b - 2 <= ch->sample->loop_start) ? ch->sample->data[a] : ch->sample->data[b - 2]; + } + if(ch->sample_position <= ch->sample->loop_start) { + ch->ping = true; + ch->sample_position = (ch->sample->loop_start << 1) - ch->sample_position; + } + /* sanity checking */ + if(ch->sample_position <= .0f) { + ch->ping = true; + ch->sample_position = .0f; + } + } + break; + + default: + v = .0f; + break; + } + + float endval = JAR_XM_LINEAR_INTERPOLATION ? jar_xm_LERP(u, v, t) : u; + +#if JAR_XM_RAMPING + if(ch->frame_count < jar_xm_SAMPLE_RAMPING_POINTS) { + /* Smoothly transition between old and new sample. */ + return jar_xm_LERP(ch->end_of_previous_sample[ch->frame_count], endval, + (float)ch->frame_count / (float)jar_xm_SAMPLE_RAMPING_POINTS); + } +#endif + + return endval; +} + +static void jar_xm_sample(jar_xm_context_t* ctx, float* left, float* right) { + if(ctx->remaining_samples_in_tick <= 0) { + jar_xm_tick(ctx); + } + ctx->remaining_samples_in_tick--; + + *left = 0.f; + *right = 0.f; + + if(ctx->max_loop_count > 0 && ctx->loop_count >= ctx->max_loop_count) { + return; + } + + for(uint8_t i = 0; i < ctx->module.num_channels; ++i) { + jar_xm_channel_context_t* ch = ctx->channels + i; + + if(ch->instrument == NULL || ch->sample == NULL || ch->sample_position < 0) { + continue; + } + + const float fval = jar_xm_next_of_sample(ch); + + if(!ch->muted && !ch->instrument->muted) { + *left += fval * ch->actual_volume * (1.f - ch->actual_panning); + *right += fval * ch->actual_volume * ch->actual_panning; + } + +#if JAR_XM_RAMPING + ch->frame_count++; + jar_xm_SLIDE_TOWARDS(ch->actual_volume, ch->target_volume, ctx->volume_ramp); + jar_xm_SLIDE_TOWARDS(ch->actual_panning, ch->target_panning, ctx->panning_ramp); +#endif + } + + const float fgvol = ctx->global_volume * ctx->amplification; + *left *= fgvol; + *right *= fgvol; + +#if JAR_XM_DEBUG + if(fabs(*left) > 1 || fabs(*right) > 1) { + DEBUG("clipping frame: %f %f, this is a bad module or a libxm bug", *left, *right); + } +#endif +} + +void jar_xm_generate_samples(jar_xm_context_t* ctx, float* output, size_t numsamples) { + if(ctx && output) { + ctx->generated_samples += numsamples; + for(size_t i = 0; i < numsamples; i++) { + jar_xm_sample(ctx, output + (2 * i), output + (2 * i + 1)); + } + } +} + +uint64_t jar_xm_get_remaining_samples(jar_xm_context_t* ctx) +{ + uint64_t total = 0; + uint8_t currentLoopCount = jar_xm_get_loop_count(ctx); + jar_xm_set_max_loop_count(ctx, 0); + + while(jar_xm_get_loop_count(ctx) == currentLoopCount) + { + total += ctx->remaining_samples_in_tick; + ctx->remaining_samples_in_tick = 0; + jar_xm_tick(ctx); + } + + ctx->loop_count = currentLoopCount; + return total; +} + +//-------------------------------------------- +//FILE LOADER - TODO - NEEDS TO BE CLEANED UP +//-------------------------------------------- + +#undef DEBUG +#define DEBUG(...) do { \ + fprintf(stderr, __VA_ARGS__); \ + fflush(stderr); \ + } while(0) + +#define DEBUG_ERR(...) do { \ + fprintf(stderr, __VA_ARGS__); \ + fflush(stderr); \ + } while(0) + +#define FATAL(...) do { \ + fprintf(stderr, __VA_ARGS__); \ + fflush(stderr); \ + exit(1); \ + } while(0) + +#define FATAL_ERR(...) do { \ + fprintf(stderr, __VA_ARGS__); \ + fflush(stderr); \ + exit(1); \ + } while(0) + + +int jar_xm_create_context_from_file(jar_xm_context_t** ctx, uint32_t rate, const char* filename) { + FILE* xmf; + int size; + int ret; + + xmf = fopen(filename, "rb"); + if(xmf == NULL) { + DEBUG_ERR("Could not open input file"); + *ctx = NULL; + return 3; + } + + fseek(xmf, 0, SEEK_END); + size = ftell(xmf); + rewind(xmf); + if(size == -1) { + fclose(xmf); + DEBUG_ERR("fseek() failed"); + *ctx = NULL; + return 4; + } + + char* data = malloc(size + 1); + if(!data || fread(data, 1, size, xmf) < size) { + fclose(xmf); + DEBUG_ERR(data ? "fread() failed" : "malloc() failed"); + free(data); + *ctx = NULL; + return 5; + } + + fclose(xmf); + + ret = jar_xm_create_context_safe(ctx, data, size, rate); + free(data); + + switch(ret) { + case 0: + break; + + case 1: + DEBUG("could not create context: module is not sane\n"); + *ctx = NULL; + return 1; + break; + + case 2: + FATAL("could not create context: malloc failed\n"); + return 2; + break; + + default: + FATAL("could not create context: unknown error\n"); + return 6; + break; + + } + + return 0; +} + +#endif//end of JAR_XM_IMPLEMENTATION +//------------------------------------------------------------------------------- + +#endif//end of INCLUDE_JAR_XM_H diff --git a/include/audio/mp3.h b/include/audio/mp3.h new file mode 100644 index 0000000..cd6c26b --- /dev/null +++ b/include/audio/mp3.h @@ -0,0 +1,14 @@ +#ifndef _ELEVENMPV_AUDIO_MP3_H_ +#define _ELEVENMPV_AUDIO_MP3_H_ + +#include + +int MP3_Init(const char *path); +SceUInt32 MP3_GetSampleRate(void); +SceUInt8 MP3_GetChannels(void); +void MP3_Decode(void *buf, unsigned int length, void *userdata); +SceUInt64 MP3_GetPosition(void); +SceUInt64 MP3_GetLength(void); +void MP3_Term(void); + +#endif diff --git a/include/audio/ogg.h b/include/audio/ogg.h new file mode 100644 index 0000000..34adacb --- /dev/null +++ b/include/audio/ogg.h @@ -0,0 +1,14 @@ +#ifndef _ELEVENMPV_AUDIO_OGG_H_ +#define _ELEVENMPV_AUDIO_OGG_H_ + +#include + +int OGG_Init(const char *path); +SceUInt32 OGG_GetSampleRate(void); +SceUInt8 OGG_GetChannels(void); +void OGG_Decode(void *buf, unsigned int length, void *userdata); +SceUInt64 OGG_GetPosition(void); +SceUInt64 OGG_GetLength(void); +void OGG_Term(void); + +#endif diff --git a/include/audio/vitaaudiolib.h b/include/audio/vitaaudiolib.h new file mode 100644 index 0000000..172890d --- /dev/null +++ b/include/audio/vitaaudiolib.h @@ -0,0 +1,40 @@ +#ifndef _ELEVENMPV_AUDIO_LIB_H_ +#define _ELEVENMPV_AUDIO_LIB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define VITA_NUM_AUDIO_CHANNELS 1 +#define VITA_NUM_AUDIO_SAMPLES 1024 +#define VITA_VOLUME_MAX 0x8000 + +typedef void (* vitaAudioCallback_t)(void *buf, unsigned int reqn, void *pdata); + +typedef struct { + int threadhandle; + int handle; + int volumeleft; + int volumeright; + vitaAudioCallback_t callback; + void *pdata; +} VITA_audio_channelinfo; + +typedef int (* vitaAudioThreadfunc_t)(int args, void *argp); + +void vitaAudioSetVolume(int channel, int left, int right); +int vitaAudioSetFrequency(int channel, int frequency); +void vitaAudioChannelThreadCallback(int channel, void *buf, unsigned int reqn); +void vitaAudioSetChannelCallback(int channel, vitaAudioCallback_t callback, void *pdata); +int vitaAudioOutBlocking(unsigned int channel, unsigned int vol1, unsigned int vol2, void *buf); +int vitaAudioInit(int frequency, SceAudioOutMode mode); +void vitaAudioEndPre(void); +void vitaAudioEnd(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/audio/wav.h b/include/audio/wav.h new file mode 100644 index 0000000..a1b5696 --- /dev/null +++ b/include/audio/wav.h @@ -0,0 +1,14 @@ +#ifndef _ELEVENMPV_AUDIO_WAV_H_ +#define _ELEVENMPV_AUDIO_WAV_H_ + +#include + +int WAV_Init(const char *path); +SceUInt32 WAV_GetSampleRate(void); +SceUInt8 WAV_GetChannels(void); +void WAV_Decode(void *buf, unsigned int length, void *userdata); +SceUInt64 WAV_GetPosition(void); +SceUInt64 WAV_GetLength(void); +void WAV_Term(void); + +#endif diff --git a/include/audio/xm.h b/include/audio/xm.h new file mode 100644 index 0000000..e17c2f9 --- /dev/null +++ b/include/audio/xm.h @@ -0,0 +1,14 @@ +#ifndef _ELEVENMPV_AUDIO_XM_H_ +#define _ELEVENMPV_AUDIO_XM_H_ + +#include + +int XM_Init(const char *path); +SceUInt32 XM_GetSampleRate(void); +SceUInt8 XM_GetChannels(void); +void XM_Decode(void *buf, unsigned int length, void *userdata); +SceUInt64 XM_GetPosition(void); +SceUInt64 XM_GetLength(void); +void XM_Term(void); + +#endif diff --git a/include/common.h b/include/common.h new file mode 100644 index 0000000..fbd4cec --- /dev/null +++ b/include/common.h @@ -0,0 +1,26 @@ +#ifndef _ELEVENMPV_COMMON_H_ +#define _ELEVENMPV_COMMON_H_ + +#include +#include +#include + +/// Checks whether a result code indicates success. +#define R_SUCCEEDED(res) ((res)>=0) +/// Checks whether a result code indicates failure. +#define R_FAILED(res) ((res)<0) +/// Returns the level of a result code. + +#define MAX_FILES 1024 +#define ROOT_PATH "ux0:/" + +#define FILES_PER_PAGE 6 + +extern vita2d_font *font; +extern enum SceCtrlButtons SCE_CTRL_ENTER, SCE_CTRL_CANCEL; +extern SceUInt32 pressed; +extern int position; +extern int file_count; +extern char cwd[512]; + +#endif diff --git a/include/dirbrowse.h b/include/dirbrowse.h new file mode 100644 index 0000000..a4749a3 --- /dev/null +++ b/include/dirbrowse.h @@ -0,0 +1,21 @@ +#ifndef _ELEVENMPV_DIRBROWSE_H_ +#define _ELEVENMPV_DIRBROWSE_H_ + +#include + +typedef struct File { + struct File *next; // Next item + int is_dir; // Folder flag + char name[256]; // File name + char ext[5]; // File extension +} File; + +extern File *files; + +int Dirbrowse_PopulateFiles(SceBool clear); +void Dirbrowse_DisplayFiles(void); +File *Dirbrowse_GetFileIndex(int index); +void Dirbrowse_OpenFile(void); +int Dirbrowse_Navigate(SceBool parent); + +#endif diff --git a/include/fs.h b/include/fs.h new file mode 100644 index 0000000..c27c9a5 --- /dev/null +++ b/include/fs.h @@ -0,0 +1,13 @@ +#ifndef _ELEVENMPV_FS_H_ +#define _ELEVENMPV_FS_H_ + +#include + +SceBool FS_FileExists(const char *path); +SceBool FS_DirExists(const char *path); +const char *FS_GetFileExt(const char *filename); +int FS_GetFileSize(const char *path, SceOff *size); +int FS_ReadFile(const char *path, void *buf, int size); +int FS_WriteFile(char *path, void *buf, int size); + +#endif diff --git a/include/menus/menu_audioplayer.h b/include/menus/menu_audioplayer.h new file mode 100644 index 0000000..1971724 --- /dev/null +++ b/include/menus/menu_audioplayer.h @@ -0,0 +1,6 @@ +#ifndef _ELEVENMPV_MENU_PLAYAUDIO_H_ +#define _ELEVENMPV_MENU_PLAYAUDIO_H_ + +void Menu_PlayAudio(char *path); + +#endif diff --git a/include/menus/menu_displayfiles.h b/include/menus/menu_displayfiles.h new file mode 100644 index 0000000..36f9fe6 --- /dev/null +++ b/include/menus/menu_displayfiles.h @@ -0,0 +1,6 @@ +#ifndef _ELEVENMPV_MENU_DISPLAYFILES_H_ +#define _ELEVENMPV_MENU_DISPLAYFILES_H_ + +void Menu_DisplayFiles(void); + +#endif diff --git a/include/status_bar.h b/include/status_bar.h new file mode 100644 index 0000000..1862bb8 --- /dev/null +++ b/include/status_bar.h @@ -0,0 +1,6 @@ +#ifndef _ELEVENMPV_STATUS_BAR_H_ +#define _ELEVENMPV_STATUS_BAR_H_ + +void StatusBar_Display(void); + +#endif diff --git a/include/textures.h b/include/textures.h new file mode 100644 index 0000000..1582b4e --- /dev/null +++ b/include/textures.h @@ -0,0 +1,14 @@ +#ifndef _ELEVENMPV_TEXTURES_H_ +#define _ELEVENMPV_TEXTURES_H_ + +#include + +vita2d_texture *icon_dir, *icon_file, *icon_audio, *battery_20, *battery_20_charging, *battery_30, *battery_30_charging, *battery_50, *battery_50_charging, \ + *battery_60, *battery_60_charging, *battery_80, *battery_80_charging, *battery_90, *battery_90_charging, *battery_full, *battery_full_charging, \ + *battery_low, *battery_unknown, *default_artwork, *default_artwork_blur, *btn_play, *btn_pause, *btn_rewind, *btn_forward, *btn_repeat, \ + *btn_shuffle, *btn_repeat_overlay, *btn_shuffle_overlay, *icon_back; + +void Textures_Load(void); +void Textures_Free(void); + +#endif diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..94ca505 --- /dev/null +++ b/include/utils.h @@ -0,0 +1,14 @@ +#ifndef _ELEVENMPV_UTILS_H_ +#define _ELEVENMPV_UTILS_H_ + +void Utils_SetMax(int *set, int value, int max); +void Utils_SetMin(int *set, int value, int min); +int Utils_ReadControls(void); +int Utils_InitAppUtil(void); +int Utils_TermAppUtil(void); +int Utils_GetEnterButton(void); +int Utils_GetCancelButton(void); +int Utils_Alphasort(const void *p1, const void *p2); +char *Utils_Basename(const char *filename); + +#endif diff --git a/res/Roboto-Regular.ttf b/res/Roboto-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cb8ffcf1ad2c163bbf95ce6ff829b537d8bebd18 GIT binary patch literal 170984 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 UeK@{oCO|{#S9GG z!XV7ZFl&wkP|z&EC&U#<|0f-MOg{Dps8gsU$S;^dP}0~(Lf6IG^YH&aKTfIpg?gs0 zY6r@OdAc};RLpsM&YG`5LBu7n;KwSCH}#v7oGVTqIpmSN=k1)NDOKisw|wDk$b6`| zf$xL(hlb58Eg4mY0tqhmKP)0#S#lO>CdhwxIWVzp?%Xp=zj>)8M5)iM=jd>?ZfybD Oz~JfX=d#Wzp$PyVH+)?H literal 0 HcmV?d00001 diff --git a/res/battery_20_charging.png b/res/battery_20_charging.png new file mode 100644 index 0000000000000000000000000000000000000000..a0808974b1cab424487459d15c4698ef9fdd5279 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP_Qn*C&U#<{~tK;eqGxnpbNB0g8YIR1SO4qBy?S@JuTgM^*r>YxE)2< z)P$Y*?d6yh%nxht|9`;Y>d)ifG(&%y=CcBIE%S7745^s2^}K52)ewEG8w7t&s$Dx;XAM1+k z1p-D2U6KmdKI;Vst0GFigM*si- literal 0 HcmV?d00001 diff --git a/res/battery_30.png b/res/battery_30.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7e48a39810b1abd580f95f05b45d4d12b139a1 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|z&EC&U#<|0f-MOg{Dps8gsU$S;^dP}0~(Lf6IG^YH&aKTfIpg?gs0 zY6r@Od%8G=RLpsM-kPsLLBu7n;KwSCH}#v7oGVTqIh5h_F!#C1;w!sfE?t_>;KS|T zSlY0^fqjmug3IOZMh4|y2d^ZE3U26BWBt8DovF{{&6_m6t>H$D^Gli5-{bT-xk~#x P&eK@{oCO|{#S9GG z!XV7ZFl&wkP_Qe&C&U#<{~sLSn|Ver&^3A`L4Lsuf|ABQ61pzdo|bOBdLH^x+>Rn_ zYQj$Z9o3Pc?B@0VRpw-U+^K!Q;p)%h-!#>4Tnz^5T;b{B7*a83>)DrlO$GvP7Y~Y^ z(pt15ByiQEW1s%5SHH$$I_n-CrlHpF+(_hOS({K2Zp~>*PYlHlU zg$LXj{-5A+VsbHL6xz^S=+hwb#=(bULRy)@+?P|^)eO#mjdEez5c6`P>JRatb>^;& z8}3dG@?z1DJ@D^CP49yU!3Rs;Jcto|u;|T$RU8Gz%~5+pl^0~jf8XZlaJ*abp5lZ2 ayNn*5qNkqvOxXi;GlQqApUXO@geCwzs{qje literal 0 HcmV?d00001 diff --git a/res/battery_50.png b/res/battery_50.png new file mode 100644 index 0000000000000000000000000000000000000000..8f20b6174742f44d980bd3229546daa00e10e265 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|z&EC&U#<|0f-MOg{Dps8gsU$S;^dP}0~(Lf6IG^Z%b8rw*(8g-)L? z0CG~0r;B4q#hkaNtoa%gL|g(3=}|;ZRx3da>{Jy~S6yzg)T`o?%H#V1mwr zyax=~93LFB4hk#83imW`&2Dnvu+?5@!|`YGEK6#x6)8Q~uE*8O`P#Ai&@G_p44$rj JF6*2UngEh7dEo#6 literal 0 HcmV?d00001 diff --git a/res/battery_50_charging.png b/res/battery_50_charging.png new file mode 100644 index 0000000000000000000000000000000000000000..0d96bbc7fb7ac22f6896fbf03c9d12ce7681a176 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP_Qe&C&U#<{~sLSn|Ver&^3A`L4Lsuf|ABQ61pzdo|bOBdLH^x+>Rn_ zYQq2T7%9)bnj9MZSaC+$$8Do?Zor^tP978JRY(0CO?~nmc>%%Ea ze8r~(8f;FTa`ofC_3kHJ8BcChW%++~;vY}3N82lzC%ZGO^!XJ1fIaAy`h_4iJElV( zUtJZMuDIt37%O;68i<%kEaf@D!uw?ginnx literal 0 HcmV?d00001 diff --git a/res/battery_60.png b/res/battery_60.png new file mode 100644 index 0000000000000000000000000000000000000000..33d61d71a04e37d1323538c89021485744c77bad GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|z&EC&U#<|0f-MOg{Dps8gsU$S;^dP}0~(Lf6IG^Z%b8rw*(8g-)L? z0CG~0r;B4q#hkaNtoa%gL|g(3XHuUwzYBW(89l)?-ZX znD{odF~~0wwP7^+61#!#Z-UZ|U-FzclE3pa1?jDw!!hF;XQ~X>eK@{oCO|{#S9GG z!XV7ZFl&wkP_Qw;C&U#<{~u5gdtWIS=m_nSAirP+K}lmD30)U!PfIsm9S=S3|5qJE z_cy${W287EIg~BjhFsBMv_i(^Q|oULbW@-;c|v_5oVXA?QP zX~*Lx?$f{R7g&g|IO#K6;_rIDOZu!oa_8AUF=V(ZP{-XQ5NO}%#>33rkz^|7F1Em~ zsJWA2Stmo$!;!m;4ZIJ)#{B6+p6#GzQ$A)+Pm@|)4yxX|I7rue!Y3_ Q3v?}mr>mdKI;Vst01N%@egFUf literal 0 HcmV?d00001 diff --git a/res/battery_80.png b/res/battery_80.png new file mode 100644 index 0000000000000000000000000000000000000000..069b6aa27b2bc80dce27988a8c790345bf9eb9ca GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|z~KC&U#<|0fG@S()YoH4B#n`2{lwN*en}=(<>YcKrYIA8n5To?d z#`KPXZ$le{{1P!6#!FxMBzAMm*j4u-*I>K7(1s(=*0U_xbG1n6!N#(`k~|kHrpaFc P+Q8uH>gTe~DWM4f0akm^ literal 0 HcmV?d00001 diff --git a/res/battery_80_charging.png b/res/battery_80_charging.png new file mode 100644 index 0000000000000000000000000000000000000000..73ee2afa8fcf6d461a2419be0b8acb14624081b6 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP_QMyC&U#<{~u_eaQoRspgVL*g8YIR1SO4qBy?S@JuTgMbvmm4&v_iG za@9d}f5WRgMv60%*@DwPZc{bC^7HsNO|~U1ML>OPJzX3_D&}mxaFegeK)@kzLu&Am z##4{Fy0}mO|35$1bcN^g$r5|@=cf2ASo!#mS-DcNZbPBuZ?Ouy}lweqK={YCI2^PjnOJ$$5&O61$ygJDLs1)PuwQ^IMIe11l8|-2BE@RG7&T5E(D@fQx0v!v(F|qnKa(y1wr{Pr`$w e9)7kD+ux->6`XGO^_~~d;S8RxelF{r5}E+!kpCwD literal 0 HcmV?d00001 diff --git a/res/battery_90.png b/res/battery_90.png new file mode 100644 index 0000000000000000000000000000000000000000..32936c03087bfcae313b605152531af12913995d GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|z~KC&U#<|0fG@S()YoH4B#n`2{lwN*en}=(<>YcKrYIA8sHcl#NX4ADr>yxJ6hvGC3*_uYS-UQ;%Dl^-uUw9j)7;yEl z-eHwV;AOP)(5+xvlFf1^mPIGl{)bh>ZF$ZcNuSG^g6y&^1wTZot2XgY-T%g90nh>l MPgg&ebxsLQ079R2HUIzs literal 0 HcmV?d00001 diff --git a/res/battery_90_charging.png b/res/battery_90_charging.png new file mode 100644 index 0000000000000000000000000000000000000000..1aba8c1171529fdb53e0bd1d7d00e0be15ccf6c7 GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP;hd9Plzj!{y)gTMQhbKptB51g8YIR1SO4qBy?S@JuN$mdH+xStUd2} zxXLYO(fth$ukM*B&bXQ!$`<@M?c+98^D94(f79HR^i%`m*8Qf_ZEVH#W=^k?7S`5VD!!qpL9MW5T`zx_%lPdJ3c0a&EZ! zXwthC{%`oBxC?FO&P;at%)}RC#JyvaIp?Ekkq(FcbMI(owaJ)pIC>|e$kW%AkrEC| hOJ=X)d5~|*IPb2|vhP1Cb^)Eu;OXk;vd$@?2>^ry3-SN} literal 0 HcmV?d00001 diff --git a/res/battery_full.png b/res/battery_full.png new file mode 100644 index 0000000000000000000000000000000000000000..eaff8b46d48b091738cbacd536dc781b3556d8bc GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWND5xIb6XFV_{}Tb$*?L(5mGYJZ`2{mrhOYV_Jmc~4Z$CACO1vks0wr8M zT^vIy<|HR52pMQ;axUO7*u6vIfpCJaS$UzR8FvGBflnbL(|NWX4Bgxk7Cl@ObPuo! qMlgsU;7EDr?B%dvb7P|o1H;0f26H=Z3-1CN$l&Sf=d#Wzp$Pz;n_0>L literal 0 HcmV?d00001 diff --git a/res/battery_full_charging.png b/res/battery_full_charging.png new file mode 100644 index 0000000000000000000000000000000000000000..5147e98ded021bd953d66ce08fe8b808c7ed566b GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP_R0{C&U#<{~sW5w#n@S(0a|1AirP+%g|N-gJ(QG{_Vh9?b)B_Jr7s8 zTTs(_Bv%$B>FSTQA+_Yck+zc(~~uLzj|P zg;*fVz5kp?j|%u+Gc)`Z|Mk)7X*sMvawkf4Ni}Nfuv`f99;~I;@oEIBa_!#~Q z@~Sb-SjIGik^k9B2BQZDmBbykJvo^5cKMNl>Eoz1}@2&5>*~|_xx7LLx*NQXLzh<;M!I39&pfVTePzFy| KKbLh*2~7Y2{qF++ literal 0 HcmV?d00001 diff --git a/res/battery_low.png b/res/battery_low.png new file mode 100644 index 0000000000000000000000000000000000000000..4969e5728fee66de8b016d66e3772c3d9cd2aad6 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWND5x9Y6XFV_{}T-sdaRxe)WBa7O literal 0 HcmV?d00001 diff --git a/res/battery_unknown.png b/res/battery_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..e7ee3a6592d3d6add4ebf1d38545cd9099ca0fce GIT binary patch literal 592 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkQ1EJiPlzj!{y*%%A(J~RfgW=&3GxeOunb-GKX}ID(`3z7vYHf{7Tm6&KEQP>t`n(y>M51^~_mk z8h&aTKF#p~8hOyu#WAE}&eluEg_<0A8XkHq(oncj{eEv!_=bk}|2M&8&Tp(<#hl$w5 zD;u~w)F-VhQJZ~QJjP*T$U1@0?4^siSD4SzT~xOGc5?p3e%>~j32u*1PGQ_!=@)O% z9kniD??bbltT#5UzQ=v&;q2`SMgqKI3o_**3z#f6KS+ucKks~N{qt?iKYnDc-}S*~ ezg5HjQsz`qf#UbB?!c75z~JfX=d#Wzp$PzKo@uuL literal 0 HcmV?d00001 diff --git a/res/btn_playback_forward.png b/res/btn_playback_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..59200de1754f05653cb071e61c9b3357c03c55e0 GIT binary patch literal 1582 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo3?%u_CN}^n#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DX&fq_Xfz$e5NDEVs?jD`S42=oT&9|0zg%_Tv8!3>6efyQi%8Xm4T&j_~_htj%yT7m2dsg4sQK~lcl7lGgGRkzn2ubZsL@uKT~ zIP;#A=ambb#pi}`o#=fnk-*=2EpoNwlVSt;;LGZXA_t39;?AhGvosCm=?OHf-W2c>%XRvW;X=z+Bw>Q(Wh)8B$MkeWKYoGJC zUpG9Jk&&GHLF$nXr=iQ;qgQ#IRj&w?mh=1T%Ovs}9%0Pt*tKOlf7Op!zYab5^GCPy z1D`+yI}6)FudIVSoO~NOd6SQ3c64do5hyKX-ur>$i9t_~(}|thZpV)ZC3jSL#OzU> zbiJQ<6}b^MSw~hLeR(Nty*Gub8A*mfkHUk=PRN`pEoHlNSxHKCcfsGVz+8&lGLKS7q4RiIHt86=VOWx7riZ*%povk%CRR2 z<}R_Zi`VRF>ILeH)mpvkC~II6J6}b1*3pRMP6L%4dJQZ083^0@ELb*WO50I^M2-tH z?zFiDziDIW)yz^lCD8gztX4OsO=7E?@MGEOO3SuI$lRNl_x{BjrJRl}<=f4en-#*G zMIOyMb9zFk}1AMtFJNK23kdTy~(DolinbMZ{Wqu02*C112@WTg4Irj&0U`| z#Zc!JMmgnY-Sk+VPK*(HV~}grXT%v(dC;L~-zlCcYg(VoO)guEs|&A5t>a#j$aPw5QF#1^5~aNvMap`@6ZR z=~W+R9NZuxv*953rJ2eG+A$sCtrgLvs}OL&-Gd$n9o zp7wS|!Y{U|y;pb4N^E- B!<_&C literal 0 HcmV?d00001 diff --git a/res/btn_playback_pause.png b/res/btn_playback_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6627997afb43542cb61bb0bb4a319480b9b039 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXr3?yA^s}+G1V{wqX6XVU3I`u#fXMsm#F#`j) zFbFd;%$g$s6yyo;32_C||6#!5fb|L>pQR+oFPI@z=D*NH3qc@X+tbA{q+(8T!UAIs zUS8jX2P~5cCIa=uCnT^>TC4qww+6uies**xam}SSq7DXi>pp0AE6mWpW4lP8>BrNl z?Gjt>-SG8AuKk)TT?B`k>wuYy!QuEr1goWITT9uw?JQ9=tBO(|g v*!DAGorM6)@~#INljh`4a{jc0`LcMNiP7YiV^3EDgP6h7)z4*}Q$iB}-IP|~ literal 0 HcmV?d00001 diff --git a/res/btn_playback_repeat.png b/res/btn_playback_repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..81fa738b0e7963832a680678401602f5ced49775 GIT binary patch literal 2041 zcmeH{`#aMM9LK*#%v_q>=5}gGYB) zYe~h(eIsQqX(tYcO7$R0x}5b_oL_pL&-?R!KF|BN*YkcpnXUvU8Hg$b000>*2I($z zUT48}Je0Hox9N(3lpzyJW0?&{)+5{6e&(|^q` z0{<5QP)6%9VGH>Q?gS4&RL#Ip72=(H!ySBjVkXZCJ!x)d zwsy8P=v?i%*Ue_#zhmT=@hYsGp=66>abC>_0&>G35pvTe2?L+U`JX*{N6SW_ST z72QcGh_}q~cwE!TQh#gk+M+lqycCX*%U5@M+C&`~7#ztH|F|T7pm35{z;LLABM`Tn z!^5ccg%LD=G+DD7?jNA7T2NeBsCG31>+5)V06sF&c`<-{f@0_ z=Ck6g3FzHNDS2lGbX*veMdd?H6-0ZAkiKNE{dOhdyy~AU5z(_JYo*KD^$RWPA_66M zHmiK-G#D3p&bSYbXTT#Y%VJB`&6w9DHmET#e0b$tYF9Q@E#2z6N+?eJlah1>mb-tUrEdxO3g-HT3=UW7c7rhQquCH0vCc zKv<2ohc#TG5eJ)|by?m(FdA771@qWY?B-tWRx_P`mWcZE6*_X*PhT0tH zt!?WbE#J@z*pX+~AG>M>W3slyf45V)aylu;6hsA=ueq$zi}T$Cv<^X926i7mHOJqh zDqP#K2kry%j+ttZNpe0EzH+LETDq9Kl!tYzc!=tovZsehQ7IH~AdpvGpQ}EQCsS%P z7s&FR1G{_dMOCt*_GC*mPT5TM5=y*mE<6E$7?kUrH_Uyj7|@o>w##g8zWnK(AM2oo z`fOs%53(X^J%Gb%+s*6N9nW*{^_9tKZ8d-nimBdqhSIAWXZzo_Jb=pJmQv-q6O~+E zduu+G9`ETQMg1{CC5f%`v={<(QFrirUb$o(EtSjRMHnvgBq~M#o9xk7#zK;@P_cV-8Xq?-?WS=I#?~c1Gn^=)u0ssm{?7hqraY@48 N2w+hJWV-_?{XZ?>x_-y>B=$S!80dZVq;0GyQs(MF%(v301&_8;^cu9g}cAz7lHqe z04*aECTihioSU;dAfckCkA!$--E;$;8lB3v65Hc6vE6scMACk6cXL?!#LUj$H8xU{ zTk+a}!^n@dj`LrkGGO9IL8+OVv%in`NwS}(N93oMDH^orD|552gztLe#1Afg-{89- zQ0JCEJgYX2`M2IEc76JDcTU8Cvy0ytr)A6Ya`Ou^iV4);RFz3xj_~;~Y|`F^@&2^q zFN$3EN8Jk7#1ANC;ts*y{)66ktm<}I!D*?+XDNaqV*xFSuMM9i|FXl*gCCGkW2bJyFqfTc6%ibXztmIL`~x zN8$G#CuN@&XgRUy^GXNnOUbr$5q)r{?PeMJ9P&@Dn8cYARWilRx_M^R;Q`>S^>S}! zDq1YmDfZ-XkT$jJ6Dh$`y+n${{1*$S&WJDG~!i^ZrV< zW`vqJq8HYotrs$A@5?PNKVDDpZE?0{yq2EThfYUcTwPV*m>=sn9S-oK8cxvkJXTP1u-)MFYD$x);vIjj)-hn=~QY#PWnCGZ<)Kxn0= zyCq7#j)<6;c3ND+a$GhbttedZIi8Fx`9b(s4Am?^hCS3B-1pY(%&WvHeN8_6_NHZr zhEGT-;_&kuPh8Z4@aY>;zuPEZK9!JZEY1LxtT?SO3vyhAsV%~k>x4a%$(ercU4bc zE>!`$>d)skZD+S@4`ti=_`ot78};BllE^!baArl_boaZ4hj18iAz8LPUeW1|m-;iA zp^i36BRpR^-QO)$t2pKUbQ`&2cq1}m=e+X4#rf(pd%?xa%%qhJS$un*cpRoHL z&Jq!+G5Ry#(OtzMqx~r=gUf~$@z+wNbM>s1+_lZhH8LnpD@9xWcPcz~7Ub<_@xs-0cKXPlybXpgzKH@-BZ5CG)!c{^#xV-iHa5g=fl KG0k?AEB^uEkoMvL literal 0 HcmV?d00001 diff --git a/res/btn_playback_rewind.png b/res/btn_playback_rewind.png new file mode 100644 index 0000000000000000000000000000000000000000..35825e532f92618134a049e7bfed6cf160581f8f GIT binary patch literal 1535 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo3?%u_CN}^n#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DX&fq{uDz$e5NDEVs?jE2CkU%9s~PXnfgbtOT5!3-?ouAbUV3>?ORA#%x& zUv#o_nr#31k5Q%T>fg5D&Hn|hmcIP+q*oYl`2+s{cbQ^zcV!#fpo+p7XDLXSe8$(k))!w+|a+tJr4M?f>NctaXxb#HJ6G zJ?D5Lmnf8Z?X6#5E0S3}Kk>J`Zh@rJ?cHH#MZZnF+rd|TA;!aK!A{Hj-QmZRPS4X+ z-j}z{al-rFEj4~~GpmoV1Jm;rPZ!6KiaBqmy^IzL6glQDJmZSPg`FC~_k=E(G;iU_ zzEZ$_{ba)l-pyBh6wkVxHuK$dCQN(nmfHCL$Ju5kOtU^$^Xlc{J@M~<|9Q9b`5eo1 z1D~l{p{xG21_fN z&^fZFIK1&H+nZL6j*S`Rg`6z`e4Cb+tY>z3pyTTBZR*t9xdCEL@9hHwixrhEU#w~= z%x$|MCTr!Bvx6a2wc*98?7kffZCt{m!{2x8ZrJC@U}z>+>QLFSTyym%Ne_ppsN1(1 zbz1DM72cU$z$m}|$iHjCj5DT$bpBPh-tEzM_S{L%yKi49Dulnt`NDSk_YS>JA@xj2 zHnq!+v!yCB-)yeh$1CwFqGMaei#G->n*<*3oWpgXym8`1iz7=ocjh{=F$vk(U(+l3 zySC3#qG*y*n?RDEueOBv?nkoS&*Lt1pKlSkHQBOoqvXS`P#K1iKeleVNgdcVuJ5L4G$y$D{$FGvQKs>8`a8>jgB?|8YxbAEY2-L$ zHe3CNKxnF9%Rv`wInE}=w&NeSUDunw^=l_rZ$m=Kmy^N&9yj*4CRqL7Z0W_>Qu*i9 zl-cYT)!9w$-fq&6VBN@Ft!#YwqzqHMZ2G2)tIvPEqwcA{{^?Tjllq1eg{OTo+Ty0w z_~OIW(&fC8o;fCatIqxmP*v^1?`0}NxHGt`$jqbW% z5eA(fPwZAw-aq$_jry7ooBYzeJFmZJyB986{Zu(|%BRHIv)peEnM#Sz{a6^o$+Fnk zzE*A5rwjI$SL65Xn(8p)pKp2HZ@rJZTTB1X2xpO8@z?T~w(G05V+ZehDXa=v`Ro5z Z_U;|mTlPh2^Z|1wgQu&X%Q~loCIA=K$jATy literal 0 HcmV?d00001 diff --git a/res/btn_playback_shuffle.png b/res/btn_playback_shuffle.png new file mode 100644 index 0000000000000000000000000000000000000000..b271440294eb00973326be39198d8d9e80c7c45e GIT binary patch literal 2669 zcmeHI`8O1bADv-_F+yY+TMre@SO<~xdNUXr%QQqOWX705O13bRea-e{88av;S?1B$ z#ZyMvvNj|n%OGo(ME3Xf{*CW>=X~zxo_p?Z_uS90{YpQ839K+)xwU1fcNDaegJ^riGKkEFmho40M7*8(iU@MhJ{D|H~%H@ zf0+PX&uQ+c;+y_9xT{Au!2^*|MZi^*PpfMP@rps^Ze?fuNlQyih>c9j$xoIyBtI}a zrn$hKoSOMM_GM)J+kA~KNZ9Y?>OW1y6a3)t>HS6#ZQJs>vdd~xvd$%ohqb4?bC=dy z0~L_Bs}Cx*p1w5@lni*GQ@B}o7sL0v%afCjciMbWqUfykW`eo#!%XbJ&wCaEmt2>_ zChp@xO3(URO6a@QSEO#gi-8#x@BVr{Ja|5o)yw>}7Z-hnKKm%%k?}^)`p##ogbVP;6Mt^$99j=p;u?bpIzVR;MlzPk}kqWnQr|S9Mt7m zm7a3{!`3zcz^9BgLE8r9k_a%cF;GhzsiTABW>AP^(j38UdUA4dhC4IE{Wdd2o_>dK z?Q2m{=!hOTu1FNMMq2v_Ady%&9PS}~!+;9b^T%{QGXH=my?tKDTIzHEAZO?!hr{_a z@adDjmaeuQ5@Y8=>7@`o$ahJeZmZ#6k9(P^xOv)6MpELLIgN2os%na8b*Y*G#{2uc zJl0kM&;VmQF))%y3vMRU5Z*PL|0dDN(Th%?6FbD*VQ&u*Hm4|S0yaYFMpVClTt?Iw+#&lW_l$r zFNvUObyw(GqG8REO}bbk{>7~A%Fe4V3r3K4caPx_C~a3|Nn=>|u$wgM9eFGFb>7C0 zv;*x4mk0^lUo9Ad9Xe5`0@l*p&1AVM4rUal?@_0ob!9i)*?|fbOBbqMUx>0ysQbyL zK>8@uG0A}vWV#!S{Wr1R>mW8+!B|_%7YRDQc4sjr_(5$CMV~+35MLOtFzEZ$8~jjdl|W*{ zTN~okAY_+4Xfj7Ezou>ULt$Jdoqegoo2%i@y-{U-IO&6qmr+($ri6~2(bn>p$7L;Z zvZ)A0TE+AHJ|^EHEkBc3)R#R~F47N7EZH031BUWN@IGUk;&r&2649?&WG~0?l6Q8f zWIEcL;hQb2+ak57c3yS>9Vv}Zw=o>(!!&btsUw0LYcW7!9Y?AzpTjALP?8rTV|DYy}x@Lu0-37XX%|5M{Y0M%AgOEK0UCzsC4NtR%dbjEGC@ zfq_Z)dnf;`W2|`BQhh1}9{AgA>1c#f4t0F@q$XWwIGMn`is%lXm0HS7aj-{w z zvYq{JDZU;`3M`P+1v=2|);h{TBah!lcz~YYjF?8)J4uI~`zm7KL2t^c2jB0?X|39d z;36&osy+Z>7k;!xuqyG_dCF>BLkU+ktAD`DfQE=rASJt4-d+QGFKiw+X++bv5TA(Q z@FmmS%zh;v?E6{-RrQvvtDEW(b#s);6UI<%cZu_m`lcv-t?5mUM1@4m0~L#(l8VyY zm}|V1w}PGd1Vxq{Ue}wqGmv0FXtS8vUH`u|0a304xS)Qf@?u{2%p7|I+{f literal 0 HcmV?d00001 diff --git a/res/btn_playback_shuffle_overlay.png b/res/btn_playback_shuffle_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..04ae11df0290bfb4a4238492227e7d56f60086f2 GIT binary patch literal 2669 zcmeHI`#TegAKuuQ36aa(I;d!K9U|#;HjL)7MwFs#W0SPv=UkbwSn7AC-vPL1$GA>?!Mnm+&_eC%HU0gOBt0Khkax3%ZE3?2a!`pz|~YwYHEq_OF$KF=4Ad!OHWFSi%QNdNKrH<-?uoT zJQ4CNEv~i( zDIssw>{sbLd1E9j9r#?YXoGzRBk;TH^8M@b3rft2Ag_)G>{CYJ!cs7jH%lx<-A9IO5`!K&z5+`Ypb- zuSHF%BWB>JGEv+XY3nP5L}KA^xTowjBP!S+0Mq@@@;##L)>#o-nNR(L+@TL#F8AZW z$B%|O`nm>4jDstsmqPR;-ywOquS9$~>TRLs?qxq2MM+@hHpV}$t}Ujq)3gIk_xAYt zY;A;~fu;@;5^~bVL6T_+$q(DS6Rum|&ZC^KQeG26mRL$;1Uzk1D}MfBjf9N(Fs}K# zsbK4=xi~khG*8@-92FGF|*Mg70wKP6NFzl{hxk-#aQ>M;TV0x{>T3%8Z z1tP-i(S{v;ibfnnU*BL#4+QJ%vD3t}>l$imtIrjv6Bg!{-p{qksGgxC*L1$NQFT{r2uj`>03MLqXj2q1e zzK!OWT&>=Gzd{H}n5a{1R8H>pR%yetHFU>_VnSjY`8K0EdV%mQe`D5m(p-6BU(2$h z68>`&N?y*w>+3Rb7wPtL>$P2pviYvRjWKLcG)5}{!sv+ZIw~MoG27Ve?d$!WKReu7 z11zX12IlOk1a3i2bM1`wm}y%0c25YuziT3}-}T!#No4zob!h6Z&d`=UZlR9~NMd+% zU6LA%>~aK6=1LUQwvE0oiqE2RE>!yPv^;p%s%;M@ebEVWs;a7#u(4CRIsuBf>?Ljv z6~Rcad{)rM6j-1YWD$$|a;7T8`hiKMyCVX?Fo8(^ryO&<9&bY`<`s+V?Hp11)&Z45 zNBc1Razyo8WEM2e$`7EUWbqkx#shtrX6_DkM0kBQ7AUIcOx5HOs1wxAR;!cSVCWM2 z$>=1gClxJ6TeJpagDl#!@>Q-rB{r;H$I38eJ1II)+`?#x;sPzWXQ3`*xJ;Z6wYtRt zkK*6_<$EqD_&NgrC!M}!#`lnRo=#`^X&l7Wub!s})M6b(#!dz&+V*_^df>#`bG5&5 z6Cjxv5V-h*d=jQo|Cf!uFr#f~tat7lz?u}Qs?fx!KJkP_$&nS*8lR7ohWC;Y@ku=} z&_K6J$BU6znKh4 z3i&dW!di8_5wLlLmEcxpNQJ3v{S8Mj=$&0yJAsG>jqdUNgE;;*$3kGe%NCVWT?(mM?fHk^gwGnU_Al z9Bsq=^zKcw?TSVteHO&DtYr*Jft5Rx(%9`V#QD(AU7{0$P^MM+G~3TrFFJg;`Z+4c zCE%v=tD)qeLTP=V6U||@qXIPY=v|~I=-KtiX@uhq+3+)8#Ed-YP1*I}dtJG$)tiw# z#05b0dqCX$kJd<575*w;d97O*;j(tk4|qAy7!d}fumucZAwKda#C-qJNqa|5D&u1ZDX7>eT|brw?J6m6(8y}^~Ll#0EtX7y8AS(X=j zg}>@%h>L)**rL;`ddrqZuMP1#{aYF}FTlI1@*a$u#}Aqmyo|FWl_%~#oH37y*D0)5 zk{CLGa38G1H{Bxq{aL##NwNk844vigu0FSNzcQEOyhj+2$c(@Q3FVq-4riXh&9Ad| zTMxdM78VJYr;CiFeSP%pl4>7N%Ghex$HD)#w);k54$%6x2Yl#pEoyUE-b)dTb9RX4 zwPzKbrZ@^dXz^(Op`Jh7U}G*GFJ7?hR8X8=T=~KL1nJTVrT#esX--E(^8NMk9mtec z@4jfCMDD4z?XDNvPfoq=W^5Gg9PA5pA3t&I4W0jSU0RbiOU*bjdR^<=b8H@}nZtY? gpDY(9*{=uy$fM0oeopw>AHGZg7K1aZFd;p=<`Tzg` literal 0 HcmV?d00001 diff --git a/res/default_artwork.png b/res/default_artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..dd8c9777868e38a8b26af6bf663bc9e059c3b746 GIT binary patch literal 4618 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 literal 0 HcmV?d00001 diff --git a/res/default_artwork_blur.png b/res/default_artwork_blur.png new file mode 100644 index 0000000000000000000000000000000000000000..c66de89646c247a5938717f94fce36f9e7122be1 GIT binary patch literal 807490 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

-2)O!8W^QFh0Cur5ECzh#=cyGAp%-m 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%0AhIUEjyC_FHzi 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pUUS8pwBb@;;*}yJi0$Y1f+#?0TC_(?^C5R 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

a3VEDxXIF%ds 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 literal 0 HcmV?d00001 diff --git a/res/icon_back.png b/res/icon_back.png new file mode 100644 index 0000000000000000000000000000000000000000..21f0b1079d05c48eaa443962555f222989337e28 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=3?wxlRx|@C#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWNC>R^y6XFV_|I-WvYW;o+v_QTj$S;_|(jxTn!=V4Bd_QuT8+zFGsQ%$8 zShf4=e9q%J4@?5`G$(EVDxK%);uumf=k1i+d`$)dtg9QiT}39YUhx0_Opy)!Qp-3O za6Yd!x_$Yq*4F3ii!6c;eQp*m`Jv><(Qv}J<;4#hc~7@TMXAA^OSb0N(_cd?b zRrbkd!}HpN=z@ghH+QKkw(;!}SMFiA`j#_SZtX+vf6giE9s*s;;OXk;vd$@?2>{sw B&&dD) literal 0 HcmV?d00001 diff --git a/res/icon_file.png b/res/icon_file.png new file mode 100644 index 0000000000000000000000000000000000000000..b57993d7ddf970806f7e5a7959a8d98850396d4e GIT binary patch literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^b|B2b3?yCTBg%jjV{wqX6XVU3I`u#fXMsm#F#`j) zFbFd;%$g$s6kHVG6XFV_RR%XWq?D`%o>U$83?dmDBPZP=ao?I)m`teef?j5Hb7K#*-THtnv=CBoF7bh!p6k7;iqfROCK@s zzNMd8MT~1Nc3wU;-6L+@f*=mlkYdxW>(UzeyL3&ro&0Le^fdNm+TyRA_g^o*^ZDt6 zhm#8%9(G);w`or*sjK}j#dk^d_w|nnKHuyw7I36IG5wou`D6WW?_;6$zy4|ZeewSk z{y%umd5w3ccm9}X_~`t<-ioWgPb6vb?5wkYzeeZ3aD4Q<8OB?m?teD#>9pC!?}9C( z7v8z~;m0w@pJm4%@76u_on4OqyGHxt&c)}&V^*I(Vfv+`WqZh+ZHA|0ueq8v74hv5 Q1NxuA)78&qol`;+0JRp@00000 literal 0 HcmV?d00001 diff --git a/res/icon_folder.png b/res/icon_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..c15c46b5b1308497a11eea9e9abe9f2a22250dde GIT binary patch literal 476 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 IM6N<$f|D5NjsO4v literal 0 HcmV?d00001 diff --git a/sce_sys/livearea/contents/bg.png b/sce_sys/livearea/contents/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..815da1ba0ce92fbd6fb1a77cfcc199f0c629e593 GIT binary patch literal 328540 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

8UQH>}t6@m+J+6cflD5!=<+j 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�>2aVvh+)r_ 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 + + + + bg.png + + + + startup.png + + diff --git a/source/audio/audio.c b/source/audio/audio.c new file mode 100644 index 0000000..831dbe3 --- /dev/null +++ b/source/audio/audio.c @@ -0,0 +1,289 @@ +#include +#include +#include + +#include "audio.h" +#include "vitaaudiolib.h" +#include "fs.h" + +#include "flac.h" +#include "mp3.h" +#include "ogg.h" +#include "wav.h" +#include "xm.h" + +enum Audio_FileType { + FILE_TYPE_NONE = 0, + FILE_TYPE_FLAC = 1, + FILE_TYPE_MP3 = 2, + FILE_TYPE_OGG = 3, + FILE_TYPE_WAV = 4, + FILE_TYPE_XM = 5 +}; + +static enum Audio_FileType file_type = FILE_TYPE_NONE; +Audio_Metadata metadata; +SceBool playing = SCE_TRUE, paused = SCE_FALSE; + +static SceUInt32 Audio_GetSampleRate(void) { + SceUInt32 sample_rate = 0; + + switch(file_type) { + case FILE_TYPE_FLAC: + sample_rate = FLAC_GetSampleRate(); + break; + + case FILE_TYPE_MP3: + sample_rate = MP3_GetSampleRate(); + break; + + case FILE_TYPE_OGG: + sample_rate = OGG_GetSampleRate(); + break; + + case FILE_TYPE_WAV: + sample_rate = WAV_GetSampleRate(); + break; + + case FILE_TYPE_XM: + sample_rate = XM_GetSampleRate(); + break; + + default: + break; + } + + return sample_rate; +} + +static SceUInt8 Audio_GetChannels(void) { + SceUInt8 channels = 0; + + switch(file_type) { + case FILE_TYPE_FLAC: + channels = FLAC_GetChannels(); + break; + + case FILE_TYPE_MP3: + channels = MP3_GetChannels(); + break; + + case FILE_TYPE_OGG: + channels = OGG_GetChannels(); + break; + + case FILE_TYPE_WAV: + channels = WAV_GetChannels(); + break; + + case FILE_TYPE_XM: + channels = XM_GetChannels(); + break; + + default: + break; + } + + return channels; +} + +static void Audio_Decode(void *buf, unsigned int length, void *userdata) { + if (playing == SCE_FALSE || paused == SCE_TRUE) { + short *buf_short = (short *)buf; + unsigned int count; + for (count = 0; count < length * 2; count++) + *(buf_short + count) = 0; + } + else { + switch(file_type) { + case FILE_TYPE_FLAC: + FLAC_Decode(buf, length, userdata); + break; + + case FILE_TYPE_MP3: + MP3_Decode(buf, length, userdata); + break; + + case FILE_TYPE_OGG: + OGG_Decode(buf, length, userdata); + break; + + case FILE_TYPE_WAV: + WAV_Decode(buf, length, userdata); + break; + + case FILE_TYPE_XM: + XM_Decode(buf, length, userdata); + break; + + default: + break; + } + } +} + +int Audio_Init(const char *path) { + playing = SCE_TRUE; + paused = SCE_FALSE; + + // Clear struct + static const Audio_Metadata empty; + metadata = empty; + + if (!strncasecmp(FS_GetFileExt(path), "flac", 4)) + file_type = FILE_TYPE_FLAC; + else if (!strncasecmp(FS_GetFileExt(path), "mp3", 3)) + file_type = FILE_TYPE_MP3; + else if (!strncasecmp(FS_GetFileExt(path), "ogg", 3)) + file_type = FILE_TYPE_OGG; + else if (!strncasecmp(FS_GetFileExt(path), "wav", 3)) + file_type = FILE_TYPE_WAV; + else if (!strncasecmp(FS_GetFileExt(path), "xm", 2)) + file_type = FILE_TYPE_XM; + + switch(file_type) { + case FILE_TYPE_FLAC: + FLAC_Init(path); + break; + + case FILE_TYPE_MP3: + MP3_Init(path); + break; + + case FILE_TYPE_OGG: + OGG_Init(path); + break; + + case FILE_TYPE_WAV: + WAV_Init(path); + break; + + case FILE_TYPE_XM: + XM_Init(path); + break; + + default: + break; + } + + vitaAudioInit(Audio_GetSampleRate(), Audio_GetChannels() == 2? SCE_AUDIO_OUT_MODE_STEREO : SCE_AUDIO_OUT_MODE_MONO); + vitaAudioSetChannelCallback(0, Audio_Decode, NULL); + return 0; +} + +SceBool Audio_IsPaused(void) { + return paused; +} + +void Audio_Pause(void) { + paused = !paused; +} + +void Audio_Stop(void) { + playing = !playing; +} + +SceUInt64 Audio_GetPosition(void) { + SceUInt64 position = 0; + + switch(file_type) { + case FILE_TYPE_FLAC: + position = FLAC_GetPosition(); + break; + + case FILE_TYPE_MP3: + position = MP3_GetPosition(); + break; + + case FILE_TYPE_OGG: + position = OGG_GetPosition(); + break; + + case FILE_TYPE_WAV: + position = WAV_GetPosition(); + break; + + case FILE_TYPE_XM: + position = XM_GetPosition(); + break; + + default: + break; + } + + return position; +} + +SceUInt64 Audio_GetLength(void) { + SceUInt64 length = 0; + + switch(file_type) { + case FILE_TYPE_FLAC: + length = FLAC_GetLength(); + break; + + case FILE_TYPE_MP3: + length = MP3_GetLength(); + break; + + case FILE_TYPE_WAV: + length = WAV_GetLength(); + break; + + case FILE_TYPE_OGG: + length = OGG_GetLength(); + break; + + case FILE_TYPE_XM: + length = XM_GetLength(); + break; + + default: + break; + } + + return length; +} + +SceUInt64 Audio_GetPositionSeconds(void) { + return (Audio_GetPosition() / Audio_GetSampleRate()); +} + +SceUInt64 Audio_GetLengthSeconds(void) { + return (Audio_GetLength() / Audio_GetSampleRate()); +} + +void Audio_Term(void) { + switch(file_type) { + case FILE_TYPE_FLAC: + FLAC_Term(); + break; + + case FILE_TYPE_MP3: + MP3_Term(); + break; + + case FILE_TYPE_OGG: + OGG_Term(); + break; + + case FILE_TYPE_WAV: + WAV_Term(); + break; + + case FILE_TYPE_XM: + XM_Term(); + break; + + default: + break; + } + + playing = SCE_TRUE; + paused = SCE_FALSE; + + vitaAudioSetChannelCallback(0, NULL, NULL); // Clear channel callback + vitaAudioEndPre(); + sceKernelDelayThread(50 * 1000); + vitaAudioEnd(); +} diff --git a/source/audio/flac.c b/source/audio/flac.c new file mode 100644 index 0000000..f1f8c48 --- /dev/null +++ b/source/audio/flac.c @@ -0,0 +1,42 @@ +#include "audio.h" +#define DR_FLAC_IMPLEMENTATION +#include "dr_flac.h" + +static drflac *flac; +static drflac_uint64 frames_read = 0; + +int FLAC_Init(const char *path) { + flac = drflac_open_file(path); + if (flac == NULL) + return -1; + + return 0; +} + +SceUInt32 FLAC_GetSampleRate(void) { + return flac->sampleRate; +} + +SceUInt8 FLAC_GetChannels(void) { + return flac->channels; +} + +void FLAC_Decode(void *buf, unsigned int length, void *userdata) { + frames_read += drflac_read_pcm_frames_s16(flac, (drflac_uint64)length, (drflac_int16 *)buf); + + if (frames_read == flac->totalPCMFrameCount) + playing = SCE_FALSE; +} + +SceUInt64 FLAC_GetPosition(void) { + return frames_read; +} + +SceUInt64 FLAC_GetLength(void) { + return flac->totalPCMFrameCount; +} + +void FLAC_Term(void) { + frames_read = 0; + drflac_close(flac); +} diff --git a/source/audio/mp3.c b/source/audio/mp3.c new file mode 100644 index 0000000..07e162f --- /dev/null +++ b/source/audio/mp3.c @@ -0,0 +1,204 @@ +#include +#include +#include + +#include "audio.h" + +// For MP3 ID3 tags +struct genre { + int code; + char text[112]; +}; + +// For MP3 ID3 tags +struct genre genreList[] = { + {0 , "Blues"}, {1 , "Classic Rock"}, {2 , "Country"}, {3 , "Dance"}, {4 , "Disco"}, {5 , "Funk"}, {6 , "Grunge"}, {7 , "Hip-Hop"}, {8 , "Jazz"}, {9 , "Metal"}, {10 , "New Age"}, + {11 , "Oldies"}, {12 , "Other"}, {13 , "Pop"}, {14 , "R&B"}, {15 , "Rap"}, {16 , "Reggae"}, {17 , "Rock"}, {18 , "Techno"}, {19 , "Industrial"}, {20 , "Alternative"}, + {21 , "Ska"}, {22 , "Death Metal"}, {23 , "Pranks"}, {24 , "Soundtrack"}, {25 , "Euro-Techno"}, {26 , "Ambient"}, {27 , "Trip-Hop"}, {28 , "Vocal"}, {29 , "Jazz+Funk"}, {30 , "Fusion"}, + {31 , "Trance"}, {32 , "Classical"}, {33 , "Instrumental"}, {34 , "Acid"}, {35 , "House"}, {36 , "Game"}, {37 , "Sound Clip"}, {38 , "Gospel"}, {39 , "Noise"}, {40 , "Alternative Rock"}, + {41 , "Bass"}, {42 , "Soul"}, {43 , "Punk"}, {44 , "Space"}, {45 , "Meditative"}, {46 , "Instrumental Pop"}, {47 , "Instrumental Rock"}, {48 , "Ethnic"}, {49 , "Gothic"}, {50 , "Darkwave"}, + {51 , "Techno-Industrial"}, {52 , "Electronic"}, {53 , "Pop-Folk"}, {54 , "Eurodance"}, {55 , "Dream"}, {56 , "Southern Rock"}, {57 , "Comedy"}, {58 , "Cult"}, {59 , "Gangsta"}, {60 , "Top 40"}, + {61 , "Christian Rap"}, {62 , "Pop/Funk"}, {63 , "Jungle"}, {64 , "Native US"}, {65 , "Cabaret"}, {66 , "New Wave"}, {67 , "Psychadelic"}, {68 , "Rave"}, {69 , "Showtunes"}, {70 , "Trailer"}, + {71 , "Lo-Fi"}, {72 , "Tribal"}, {73 , "Acid Punk"}, {74 , "Acid Jazz"}, {75 , "Polka"}, {76 , "Retro"}, {77 , "Musical"}, {78 , "Rock & Roll"}, {79 , "Hard Rock"}, {80 , "Folk"}, + {81 , "Folk-Rock"}, {82 , "National Folk"}, {83 , "Swing"}, {84 , "Fast Fusion"}, {85 , "Bebob"}, {86 , "Latin"}, {87 , "Revival"}, {88 , "Celtic"}, {89 , "Bluegrass"}, {90 , "Avantgarde"}, + {91 , "Gothic Rock"}, {92 , "Progressive Rock"}, {93 , "Psychedelic Rock"}, {94 , "Symphonic Rock"}, {95 , "Slow Rock"}, {96 , "Big Band"}, {97 , "Chorus"}, {98 , "Easy Listening"}, {99 , "Acoustic"}, + {100 , "Humour"}, {101 , "Speech"}, {102 , "Chanson"}, {103 , "Opera"}, {104 , "Chamber Music"}, {105 , "Sonata"}, {106 , "Symphony"}, {107 , "Booty Bass"}, {108 , "Primus"}, {109 , "Porn Groove"}, + {110 , "Satire"}, {111 , "Slow Jam"}, {112 , "Club"}, {113 , "Tango"}, {114 , "Samba"}, {115 , "Folklore"}, {116 , "Ballad"}, {117 , "Power Ballad"}, {118 , "Rhytmic Soul"}, {119 , "Freestyle"}, {120 , "Duet"}, + {121 , "Punk Rock"}, {122 , "Drum Solo"}, {123 , "A capella"}, {124 , "Euro-House"}, {125 , "Dance Hall"}, {126 , "Goa"}, {127 , "Drum & Bass"}, {128 , "Club-House"}, {129 , "Hardcore"}, {130 , "Terror"}, + {131 , "Indie"}, {132 , "BritPop"}, {133 , "Negerpunk"}, {134 , "Polsk Punk"}, {135 , "Beat"}, {136 , "Christian Gangsta"}, {137 , "Heavy Metal"}, {138 , "Black Metal"}, {139 , "Crossover"}, {140 , "Contemporary C"}, + {141 , "Christian Rock"}, {142 , "Merengue"}, {143 , "Salsa"}, {144 , "Thrash Metal"}, {145 , "Anime"}, {146 , "JPop"}, {147 , "SynthPop"} +}; + +static mpg123_handle *mp3; +static SceUInt64 frames_read = 0, total_samples = 0; +static long sample_rate = 0; +static int channels = 0; + +// For MP3 ID3 tags +// Helper for v1 printing, get these strings their zero byte. +static void safe_print(char *tag, char *name, char *data, size_t size) { + char safe[31]; + if (size > 30) + return; + memcpy(safe, data, size); + safe[size] = 0; + snprintf(tag, 34, "%s: %s\n", name, safe); +} + +// For MP3 ID3 tags +// Print out ID3v1 info. +static void print_v1(Audio_Metadata *ID3tag, mpg123_id3v1 *v1) { + safe_print(ID3tag->title, "", v1->title, sizeof(v1->title)); + safe_print(ID3tag->artist, "", v1->artist, sizeof(v1->artist)); + safe_print(ID3tag->album, "", v1->album, sizeof(v1->album)); + safe_print(ID3tag->year, "", v1->year, sizeof(v1->year)); + safe_print(ID3tag->comment, "", v1->comment, sizeof(v1->comment)); + safe_print(ID3tag->genre, "", genreList[v1->genre].text, sizeof(genreList[v1->genre].text)); +} + +// For MP3 ID3 tags +// Split up a number of lines separated by \n, \r, both or just zero byte +// and print out each line with specified prefix. +static void print_lines(char *data, const char *prefix, mpg123_string *inlines) { + size_t i; + int hadcr = 0, hadlf = 0; + char *lines = NULL; + char *line = NULL; + size_t len = 0; + + if (inlines != NULL && inlines->fill) { + lines = inlines->p; + len = inlines->fill; + } + else + return; + + line = lines; + for (i = 0; i < len; ++i) { + if (lines[i] == '\n' || lines[i] == '\r' || lines[i] == 0) { + char save = lines[i]; /* saving, changing, restoring a byte in the data */ + if (save == '\n') + ++hadlf; + if (save == '\r') + ++hadcr; + if ((hadcr || hadlf) && (hadlf % 2 == 0) && (hadcr % 2 == 0)) + line = ""; + + if (line) { + lines[i] = 0; + if (data == NULL) + printf("%s%s\n", prefix, line); + else + snprintf(data, 0x1F, "%s%s\n", prefix, line); + line = NULL; + lines[i] = save; + } + } + else { + hadlf = hadcr = 0; + if (line == NULL) + line = lines + i; + } + } +} + +// For MP3 ID3 tags +// Print out the named ID3v2 fields. +static void print_v2(Audio_Metadata *ID3tag, mpg123_id3v2 *v2) { + print_lines(ID3tag->title, "", v2->title); + print_lines(ID3tag->artist, "", v2->artist); + print_lines(ID3tag->album, "", v2->album); + print_lines(ID3tag->year, "", v2->year); + print_lines(ID3tag->comment, "", v2->comment); + print_lines(ID3tag->genre, "", v2->genre); +} + +int MP3_Init(const char *path) { + int error = mpg123_init(); + if (error != MPG123_OK) + return error; + + mp3 = mpg123_new(NULL, &error); + if (error != MPG123_OK) + return error; + + error = mpg123_param(mp3, MPG123_ADD_FLAGS, MPG123_PICTURE, 0.0); + if (error != MPG123_OK) + return error; + + error = mpg123_open(mp3, path); + if (error != MPG123_OK) + return error; + + mpg123_seek(mp3, 0, SEEK_SET); + metadata.has_meta = mpg123_meta_check(mp3); + + mpg123_id3v1 *v1; + mpg123_id3v2 *v2; + + if (metadata.has_meta & MPG123_ID3 && mpg123_id3(mp3, &v1, &v2) == MPG123_OK) { + if (v1 != NULL) + print_v1(&metadata, v1); + if (v2 != NULL) { + print_v2(&metadata, v2); + + for (size_t count = 0; count < v2->pictures; count++) { + mpg123_picture *pic = &v2->picture[count]; + char *str = pic->mime_type.p; + + if ((pic->type == 3 ) || (pic->type == 0)) { + if ((!strcasecmp(str, "image/jpg")) || (!strcasecmp(str, "image/jpeg"))) { + metadata.cover_image = vita2d_load_JPEG_buffer(pic->data, pic->size); + break; + } + else if (!strcasecmp(str, "image/png")) { + metadata.cover_image = vita2d_load_PNG_buffer(pic->data); + break; + } + } + } + } + } + + total_samples = mpg123_length(mp3); + mpg123_getformat(mp3, &sample_rate, &channels, NULL); + mpg123_format_none(mp3); + mpg123_format(mp3, sample_rate, channels, MPG123_ENC_SIGNED_16); + return 0; +} + +SceUInt32 MP3_GetSampleRate(void) { + return sample_rate; +} + +SceUInt8 MP3_GetChannels(void) { + return channels; +} + +void MP3_Decode(void *buf, unsigned int length, void *userdata) { + size_t done = 0; + mpg123_read(mp3, buf, length * (sizeof(SceInt16) * 2), &done); + frames_read += done/(sizeof(SceInt16) * 2); + + if (frames_read == total_samples) + playing = SCE_FALSE; +} + +SceUInt64 MP3_GetPosition(void) { + return frames_read; +} + +SceUInt64 MP3_GetLength(void) { + return total_samples; +} + +void MP3_Term(void) { + frames_read = 0; + + if (metadata.has_meta) + metadata.has_meta = SCE_FALSE; + + mpg123_close(mp3); + mpg123_delete(mp3); + mpg123_exit(); +} diff --git a/source/audio/ogg.c b/source/audio/ogg.c new file mode 100644 index 0000000..829328b --- /dev/null +++ b/source/audio/ogg.c @@ -0,0 +1,48 @@ +#include "audio.h" +#define STB_VORBIS_HEADER_ONLY +#define STB_VORBIS_NO_PUSHDATA_API +#include "stb_vorbis.c" + +static stb_vorbis *ogg; +static stb_vorbis_info ogg_info; +static unsigned int samples_read = 0, max_lenth = 0; + +int OGG_Init(const char *path) { + int error = 0; + ogg = stb_vorbis_open_filename(path, &error, NULL); + + if (!ogg) + return -1; + + ogg_info = stb_vorbis_get_info(ogg); + max_lenth = stb_vorbis_stream_length_in_samples(ogg); + return 0; +} + +SceUInt32 OGG_GetSampleRate(void) { + return ogg_info.sample_rate; +} + +SceUInt8 OGG_GetChannels(void) { + return ogg_info.channels; +} + +void OGG_Decode(void *buf, unsigned int length, void *userdata) { + samples_read += stb_vorbis_get_samples_short_interleaved(ogg, ogg_info.channels, (short *)buf, (int)length * ogg_info.channels); + + if (samples_read == max_lenth) + playing = SCE_FALSE; +} + +SceUInt64 OGG_GetPosition(void) { + return samples_read; +} + +SceUInt64 OGG_GetLength(void) { + return max_lenth; +} + +void OGG_Term(void) { + samples_read = 0; + stb_vorbis_close(ogg); +} diff --git a/source/audio/stb_vorbis.c b/source/audio/stb_vorbis.c new file mode 100644 index 0000000..9630d77 --- /dev/null +++ b/source/audio/stb_vorbis.c @@ -0,0 +1,5494 @@ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-value" + +// Ogg Vorbis audio decoder - v1.16 - public domain +// http://nothings.org/stb_vorbis/ +// +// Original version written by Sean Barrett in 2007. +// +// Originally sponsored by RAD Game Tools. Seeking implementation +// sponsored by Phillip Bennefall, Marc Andersen, Aaron Baker, +// Elias Software, Aras Pranckevicius, and Sean Barrett. +// +// LICENSE +// +// See end of file for license information. +// +// Limitations: +// +// - floor 0 not supported (used in old ogg vorbis files pre-2004) +// - lossless sample-truncation at beginning ignored +// - cannot concatenate multiple vorbis streams +// - sample positions are 32-bit, limiting seekable 192Khz +// files to around 6 hours (Ogg supports 64-bit) +// +// Feature contributors: +// Dougall Johnson (sample-exact seeking) +// +// Bugfix/warning contributors: +// Terje Mathisen Niklas Frykholm Andy Hill +// Casey Muratori John Bolton Gargaj +// Laurent Gomila Marc LeBlanc Ronny Chevalier +// Bernhard Wodo Evan Balster alxprd@github +// Tom Beaumont Ingo Leitgeb Nicolas Guillemot +// Phillip Bennefall Rohit Thiago Goulart +// manxorist@github saga musix github:infatum +// Timur Gagiev +// +// Partial history: +// 1.16 - 2019-03-04 - fix warnings +// 1.15 - 2019-02-07 - explicit failure if Ogg Skeleton data is found +// 1.14 - 2018-02-11 - delete bogus dealloca usage +// 1.13 - 2018-01-29 - fix truncation of last frame (hopefully) +// 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files +// 1.11 - 2017-07-23 - fix MinGW compilation +// 1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory +// 1.09 - 2016-04-04 - back out 'truncation of last frame' fix from previous version +// 1.08 - 2016-04-02 - warnings; setup memory leaks; truncation of last frame +// 1.07 - 2015-01-16 - fixes for crashes on invalid files; warning fixes; const +// 1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson) +// some crash fixes when out of memory or with corrupt files +// fix some inappropriately signed shifts +// 1.05 - 2015-04-19 - don't define __forceinline if it's redundant +// 1.04 - 2014-08-27 - fix missing const-correct case in API +// 1.03 - 2014-08-07 - warning fixes +// 1.02 - 2014-07-09 - declare qsort comparison as explicitly _cdecl in Windows +// 1.01 - 2014-06-18 - fix stb_vorbis_get_samples_float (interleaved was correct) +// 1.0 - 2014-05-26 - fix memory leaks; fix warnings; fix bugs in >2-channel; +// (API change) report sample rate for decode-full-file funcs +// +// See end of file for full version history. + + +////////////////////////////////////////////////////////////////////////////// +// +// HEADER BEGINS HERE +// + +#ifndef STB_VORBIS_INCLUDE_STB_VORBIS_H +#define STB_VORBIS_INCLUDE_STB_VORBIS_H + +#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) +#define STB_VORBIS_NO_STDIO 1 +#endif + +#ifndef STB_VORBIS_NO_STDIO +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/////////// THREAD SAFETY + +// Individual stb_vorbis* handles are not thread-safe; you cannot decode from +// them from multiple threads at the same time. However, you can have multiple +// stb_vorbis* handles and decode from them independently in multiple thrads. + + +/////////// MEMORY ALLOCATION + +// normally stb_vorbis uses malloc() to allocate memory at startup, +// and alloca() to allocate temporary memory during a frame on the +// stack. (Memory consumption will depend on the amount of setup +// data in the file and how you set the compile flags for speed +// vs. size. In my test files the maximal-size usage is ~150KB.) +// +// You can modify the wrapper functions in the source (setup_malloc, +// setup_temp_malloc, temp_malloc) to change this behavior, or you +// can use a simpler allocation model: you pass in a buffer from +// which stb_vorbis will allocate _all_ its memory (including the +// temp memory). "open" may fail with a VORBIS_outofmem if you +// do not pass in enough data; there is no way to determine how +// much you do need except to succeed (at which point you can +// query get_info to find the exact amount required. yes I know +// this is lame). +// +// If you pass in a non-NULL buffer of the type below, allocation +// will occur from it as described above. Otherwise just pass NULL +// to use malloc()/alloca() + +typedef struct +{ + char *alloc_buffer; + int alloc_buffer_length_in_bytes; +} stb_vorbis_alloc; + + +/////////// FUNCTIONS USEABLE WITH ALL INPUT MODES + +typedef struct stb_vorbis stb_vorbis; + +typedef struct +{ + unsigned int sample_rate; + int channels; + + unsigned int setup_memory_required; + unsigned int setup_temp_memory_required; + unsigned int temp_memory_required; + + int max_frame_size; +} stb_vorbis_info; + +// get general information about the file +extern stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f); + +// get the last error detected (clears it, too) +extern int stb_vorbis_get_error(stb_vorbis *f); + +// close an ogg vorbis file and free all memory in use +extern void stb_vorbis_close(stb_vorbis *f); + +// this function returns the offset (in samples) from the beginning of the +// file that will be returned by the next decode, if it is known, or -1 +// otherwise. after a flush_pushdata() call, this may take a while before +// it becomes valid again. +// NOT WORKING YET after a seek with PULLDATA API +extern int stb_vorbis_get_sample_offset(stb_vorbis *f); + +// returns the current seek point within the file, or offset from the beginning +// of the memory buffer. In pushdata mode it returns 0. +extern unsigned int stb_vorbis_get_file_offset(stb_vorbis *f); + +/////////// PUSHDATA API + +#ifndef STB_VORBIS_NO_PUSHDATA_API + +// this API allows you to get blocks of data from any source and hand +// them to stb_vorbis. you have to buffer them; stb_vorbis will tell +// you how much it used, and you have to give it the rest next time; +// and stb_vorbis may not have enough data to work with and you will +// need to give it the same data again PLUS more. Note that the Vorbis +// specification does not bound the size of an individual frame. + +extern stb_vorbis *stb_vorbis_open_pushdata( + const unsigned char * datablock, int datablock_length_in_bytes, + int *datablock_memory_consumed_in_bytes, + int *error, + const stb_vorbis_alloc *alloc_buffer); +// create a vorbis decoder by passing in the initial data block containing +// the ogg&vorbis headers (you don't need to do parse them, just provide +// the first N bytes of the file--you're told if it's not enough, see below) +// on success, returns an stb_vorbis *, does not set error, returns the amount of +// data parsed/consumed on this call in *datablock_memory_consumed_in_bytes; +// on failure, returns NULL on error and sets *error, does not change *datablock_memory_consumed +// if returns NULL and *error is VORBIS_need_more_data, then the input block was +// incomplete and you need to pass in a larger block from the start of the file + +extern int stb_vorbis_decode_frame_pushdata( + stb_vorbis *f, + const unsigned char *datablock, int datablock_length_in_bytes, + int *channels, // place to write number of float * buffers + float ***output, // place to write float ** array of float * buffers + int *samples // place to write number of output samples + ); +// decode a frame of audio sample data if possible from the passed-in data block +// +// return value: number of bytes we used from datablock +// +// possible cases: +// 0 bytes used, 0 samples output (need more data) +// N bytes used, 0 samples output (resynching the stream, keep going) +// N bytes used, M samples output (one frame of data) +// note that after opening a file, you will ALWAYS get one N-bytes,0-sample +// frame, because Vorbis always "discards" the first frame. +// +// Note that on resynch, stb_vorbis will rarely consume all of the buffer, +// instead only datablock_length_in_bytes-3 or less. This is because it wants +// to avoid missing parts of a page header if they cross a datablock boundary, +// without writing state-machiney code to record a partial detection. +// +// The number of channels returned are stored in *channels (which can be +// NULL--it is always the same as the number of channels reported by +// get_info). *output will contain an array of float* buffers, one per +// channel. In other words, (*output)[0][0] contains the first sample from +// the first channel, and (*output)[1][0] contains the first sample from +// the second channel. + +extern void stb_vorbis_flush_pushdata(stb_vorbis *f); +// inform stb_vorbis that your next datablock will not be contiguous with +// previous ones (e.g. you've seeked in the data); future attempts to decode +// frames will cause stb_vorbis to resynchronize (as noted above), and +// once it sees a valid Ogg page (typically 4-8KB, as large as 64KB), it +// will begin decoding the _next_ frame. +// +// if you want to seek using pushdata, you need to seek in your file, then +// call stb_vorbis_flush_pushdata(), then start calling decoding, then once +// decoding is returning you data, call stb_vorbis_get_sample_offset, and +// if you don't like the result, seek your file again and repeat. +#endif + + +////////// PULLING INPUT API + +#ifndef STB_VORBIS_NO_PULLDATA_API +// This API assumes stb_vorbis is allowed to pull data from a source-- +// either a block of memory containing the _entire_ vorbis stream, or a +// FILE * that you or it create, or possibly some other reading mechanism +// if you go modify the source to replace the FILE * case with some kind +// of callback to your code. (But if you don't support seeking, you may +// just want to go ahead and use pushdata.) + +#if !defined(STB_VORBIS_NO_STDIO) && !defined(STB_VORBIS_NO_INTEGER_CONVERSION) +extern int stb_vorbis_decode_filename(const char *filename, int *channels, int *sample_rate, short **output); +#endif +#if !defined(STB_VORBIS_NO_INTEGER_CONVERSION) +extern int stb_vorbis_decode_memory(const unsigned char *mem, int len, int *channels, int *sample_rate, short **output); +#endif +// decode an entire file and output the data interleaved into a malloc()ed +// buffer stored in *output. The return value is the number of samples +// decoded, or -1 if the file could not be opened or was not an ogg vorbis file. +// When you're done with it, just free() the pointer returned in *output. + +extern stb_vorbis * stb_vorbis_open_memory(const unsigned char *data, int len, + int *error, const stb_vorbis_alloc *alloc_buffer); +// create an ogg vorbis decoder from an ogg vorbis stream in memory (note +// this must be the entire stream!). on failure, returns NULL and sets *error + +#ifndef STB_VORBIS_NO_STDIO +extern stb_vorbis * stb_vorbis_open_filename(const char *filename, + int *error, const stb_vorbis_alloc *alloc_buffer); +// create an ogg vorbis decoder from a filename via fopen(). on failure, +// returns NULL and sets *error (possibly to VORBIS_file_open_failure). + +extern stb_vorbis * stb_vorbis_open_file(FILE *f, int close_handle_on_close, + int *error, const stb_vorbis_alloc *alloc_buffer); +// create an ogg vorbis decoder from an open FILE *, looking for a stream at +// the _current_ seek point (ftell). on failure, returns NULL and sets *error. +// note that stb_vorbis must "own" this stream; if you seek it in between +// calls to stb_vorbis, it will become confused. Moreover, if you attempt to +// perform stb_vorbis_seek_*() operations on this file, it will assume it +// owns the _entire_ rest of the file after the start point. Use the next +// function, stb_vorbis_open_file_section(), to limit it. + +extern stb_vorbis * stb_vorbis_open_file_section(FILE *f, int close_handle_on_close, + int *error, const stb_vorbis_alloc *alloc_buffer, unsigned int len); +// create an ogg vorbis decoder from an open FILE *, looking for a stream at +// the _current_ seek point (ftell); the stream will be of length 'len' bytes. +// on failure, returns NULL and sets *error. note that stb_vorbis must "own" +// this stream; if you seek it in between calls to stb_vorbis, it will become +// confused. +#endif + +extern int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number); +extern int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number); +// these functions seek in the Vorbis file to (approximately) 'sample_number'. +// after calling seek_frame(), the next call to get_frame_*() will include +// the specified sample. after calling stb_vorbis_seek(), the next call to +// stb_vorbis_get_samples_* will start with the specified sample. If you +// do not need to seek to EXACTLY the target sample when using get_samples_*, +// you can also use seek_frame(). + +extern int stb_vorbis_seek_start(stb_vorbis *f); +// this function is equivalent to stb_vorbis_seek(f,0) + +extern unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f); +extern float stb_vorbis_stream_length_in_seconds(stb_vorbis *f); +// these functions return the total length of the vorbis stream + +extern int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output); +// decode the next frame and return the number of samples. the number of +// channels returned are stored in *channels (which can be NULL--it is always +// the same as the number of channels reported by get_info). *output will +// contain an array of float* buffers, one per channel. These outputs will +// be overwritten on the next call to stb_vorbis_get_frame_*. +// +// You generally should not intermix calls to stb_vorbis_get_frame_*() +// and stb_vorbis_get_samples_*(), since the latter calls the former. + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +extern int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts); +extern int stb_vorbis_get_frame_short (stb_vorbis *f, int num_c, short **buffer, int num_samples); +#endif +// decode the next frame and return the number of *samples* per channel. +// Note that for interleaved data, you pass in the number of shorts (the +// size of your array), but the return value is the number of samples per +// channel, not the total number of samples. +// +// The data is coerced to the number of channels you request according to the +// channel coercion rules (see below). You must pass in the size of your +// buffer(s) so that stb_vorbis will not overwrite the end of the buffer. +// The maximum buffer size needed can be gotten from get_info(); however, +// the Vorbis I specification implies an absolute maximum of 4096 samples +// per channel. + +// Channel coercion rules: +// Let M be the number of channels requested, and N the number of channels present, +// and Cn be the nth channel; let stereo L be the sum of all L and center channels, +// and stereo R be the sum of all R and center channels (channel assignment from the +// vorbis spec). +// M N output +// 1 k sum(Ck) for all k +// 2 * stereo L, stereo R +// k l k > l, the first l channels, then 0s +// k l k <= l, the first k channels +// Note that this is not _good_ surround etc. mixing at all! It's just so +// you get something useful. + +extern int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats); +extern int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples); +// gets num_samples samples, not necessarily on a frame boundary--this requires +// buffering so you have to supply the buffers. DOES NOT APPLY THE COERCION RULES. +// Returns the number of samples stored per channel; it may be less than requested +// at the end of the file. If there are no more samples in the file, returns 0. + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +extern int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts); +extern int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int num_samples); +#endif +// gets num_samples samples, not necessarily on a frame boundary--this requires +// buffering so you have to supply the buffers. Applies the coercion rules above +// to produce 'channels' channels. Returns the number of samples stored per channel; +// it may be less than requested at the end of the file. If there are no more +// samples in the file, returns 0. + +#endif + +//////// ERROR CODES + +enum STBVorbisError +{ + VORBIS__no_error, + + VORBIS_need_more_data=1, // not a real error + + VORBIS_invalid_api_mixing, // can't mix API modes + VORBIS_outofmem, // not enough memory + VORBIS_feature_not_supported, // uses floor 0 + VORBIS_too_many_channels, // STB_VORBIS_MAX_CHANNELS is too small + VORBIS_file_open_failure, // fopen() failed + VORBIS_seek_without_length, // can't seek in unknown-length file + + VORBIS_unexpected_eof=10, // file is truncated? + VORBIS_seek_invalid, // seek past EOF + + // decoding errors (corrupt/invalid stream) -- you probably + // don't care about the exact details of these + + // vorbis errors: + VORBIS_invalid_setup=20, + VORBIS_invalid_stream, + + // ogg errors: + VORBIS_missing_capture_pattern=30, + VORBIS_invalid_stream_structure_version, + VORBIS_continued_packet_flag_invalid, + VORBIS_incorrect_stream_serial_number, + VORBIS_invalid_first_page, + VORBIS_bad_packet_type, + VORBIS_cant_find_last_page, + VORBIS_seek_failed, + VORBIS_ogg_skeleton_not_supported +}; + + +#ifdef __cplusplus +} +#endif + +#endif // STB_VORBIS_INCLUDE_STB_VORBIS_H +// +// HEADER ENDS HERE +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef STB_VORBIS_HEADER_ONLY + +// global configuration settings (e.g. set these in the project/makefile), +// or just set them in this file at the top (although ideally the first few +// should be visible when the header file is compiled too, although it's not +// crucial) + +// STB_VORBIS_NO_PUSHDATA_API +// does not compile the code for the various stb_vorbis_*_pushdata() +// functions +// #define STB_VORBIS_NO_PUSHDATA_API + +// STB_VORBIS_NO_PULLDATA_API +// does not compile the code for the non-pushdata APIs +// #define STB_VORBIS_NO_PULLDATA_API + +// STB_VORBIS_NO_STDIO +// does not compile the code for the APIs that use FILE *s internally +// or externally (implied by STB_VORBIS_NO_PULLDATA_API) +// #define STB_VORBIS_NO_STDIO + +// STB_VORBIS_NO_INTEGER_CONVERSION +// does not compile the code for converting audio sample data from +// float to integer (implied by STB_VORBIS_NO_PULLDATA_API) +// #define STB_VORBIS_NO_INTEGER_CONVERSION + +// STB_VORBIS_NO_FAST_SCALED_FLOAT +// does not use a fast float-to-int trick to accelerate float-to-int on +// most platforms which requires endianness be defined correctly. +//#define STB_VORBIS_NO_FAST_SCALED_FLOAT + + +// STB_VORBIS_MAX_CHANNELS [number] +// globally define this to the maximum number of channels you need. +// The spec does not put a restriction on channels except that +// the count is stored in a byte, so 255 is the hard limit. +// Reducing this saves about 16 bytes per value, so using 16 saves +// (255-16)*16 or around 4KB. Plus anything other memory usage +// I forgot to account for. Can probably go as low as 8 (7.1 audio), +// 6 (5.1 audio), or 2 (stereo only). +#ifndef STB_VORBIS_MAX_CHANNELS +#define STB_VORBIS_MAX_CHANNELS 16 // enough for anyone? +#endif + +// STB_VORBIS_PUSHDATA_CRC_COUNT [number] +// after a flush_pushdata(), stb_vorbis begins scanning for the +// next valid page, without backtracking. when it finds something +// that looks like a page, it streams through it and verifies its +// CRC32. Should that validation fail, it keeps scanning. But it's +// possible that _while_ streaming through to check the CRC32 of +// one candidate page, it sees another candidate page. This #define +// determines how many "overlapping" candidate pages it can search +// at once. Note that "real" pages are typically ~4KB to ~8KB, whereas +// garbage pages could be as big as 64KB, but probably average ~16KB. +// So don't hose ourselves by scanning an apparent 64KB page and +// missing a ton of real ones in the interim; so minimum of 2 +#ifndef STB_VORBIS_PUSHDATA_CRC_COUNT +#define STB_VORBIS_PUSHDATA_CRC_COUNT 4 +#endif + +// STB_VORBIS_FAST_HUFFMAN_LENGTH [number] +// sets the log size of the huffman-acceleration table. Maximum +// supported value is 24. with larger numbers, more decodings are O(1), +// but the table size is larger so worse cache missing, so you'll have +// to probe (and try multiple ogg vorbis files) to find the sweet spot. +#ifndef STB_VORBIS_FAST_HUFFMAN_LENGTH +#define STB_VORBIS_FAST_HUFFMAN_LENGTH 10 +#endif + +// STB_VORBIS_FAST_BINARY_LENGTH [number] +// sets the log size of the binary-search acceleration table. this +// is used in similar fashion to the fast-huffman size to set initial +// parameters for the binary search + +// STB_VORBIS_FAST_HUFFMAN_INT +// The fast huffman tables are much more efficient if they can be +// stored as 16-bit results instead of 32-bit results. This restricts +// the codebooks to having only 65535 possible outcomes, though. +// (At least, accelerated by the huffman table.) +#ifndef STB_VORBIS_FAST_HUFFMAN_INT +#define STB_VORBIS_FAST_HUFFMAN_SHORT +#endif + +// STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH +// If the 'fast huffman' search doesn't succeed, then stb_vorbis falls +// back on binary searching for the correct one. This requires storing +// extra tables with the huffman codes in sorted order. Defining this +// symbol trades off space for speed by forcing a linear search in the +// non-fast case, except for "sparse" codebooks. +// #define STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH + +// STB_VORBIS_DIVIDES_IN_RESIDUE +// stb_vorbis precomputes the result of the scalar residue decoding +// that would otherwise require a divide per chunk. you can trade off +// space for time by defining this symbol. +// #define STB_VORBIS_DIVIDES_IN_RESIDUE + +// STB_VORBIS_DIVIDES_IN_CODEBOOK +// vorbis VQ codebooks can be encoded two ways: with every case explicitly +// stored, or with all elements being chosen from a small range of values, +// and all values possible in all elements. By default, stb_vorbis expands +// this latter kind out to look like the former kind for ease of decoding, +// because otherwise an integer divide-per-vector-element is required to +// unpack the index. If you define STB_VORBIS_DIVIDES_IN_CODEBOOK, you can +// trade off storage for speed. +//#define STB_VORBIS_DIVIDES_IN_CODEBOOK + +#ifdef STB_VORBIS_CODEBOOK_SHORTS +#error "STB_VORBIS_CODEBOOK_SHORTS is no longer supported as it produced incorrect results for some input formats" +#endif + +// STB_VORBIS_DIVIDE_TABLE +// this replaces small integer divides in the floor decode loop with +// table lookups. made less than 1% difference, so disabled by default. + +// STB_VORBIS_NO_INLINE_DECODE +// disables the inlining of the scalar codebook fast-huffman decode. +// might save a little codespace; useful for debugging +// #define STB_VORBIS_NO_INLINE_DECODE + +// STB_VORBIS_NO_DEFER_FLOOR +// Normally we only decode the floor without synthesizing the actual +// full curve. We can instead synthesize the curve immediately. This +// requires more memory and is very likely slower, so I don't think +// you'd ever want to do it except for debugging. +// #define STB_VORBIS_NO_DEFER_FLOOR + + + + +////////////////////////////////////////////////////////////////////////////// + +#ifdef STB_VORBIS_NO_PULLDATA_API + #define STB_VORBIS_NO_INTEGER_CONVERSION + #define STB_VORBIS_NO_STDIO +#endif + +#if defined(STB_VORBIS_NO_CRT) && !defined(STB_VORBIS_NO_STDIO) + #define STB_VORBIS_NO_STDIO 1 +#endif + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT + + // only need endianness for fast-float-to-int, which we don't + // use for pushdata + + #ifndef STB_VORBIS_BIG_ENDIAN + #define STB_VORBIS_ENDIAN 0 + #else + #define STB_VORBIS_ENDIAN 1 + #endif + +#endif +#endif + + +#ifndef STB_VORBIS_NO_STDIO +#include +#endif + +#ifndef STB_VORBIS_NO_CRT + #include + #include + #include + #include + + // find definition of alloca if it's not in stdlib.h: + #if defined(_MSC_VER) || defined(__MINGW32__) + #include + #endif + #if defined(__linux__) || defined(__linux) || defined(__EMSCRIPTEN__) + #include + #endif +#else // STB_VORBIS_NO_CRT + #define NULL 0 + #define malloc(s) 0 + #define free(s) ((void) 0) + #define realloc(s) 0 +#endif // STB_VORBIS_NO_CRT + +#include + +#ifdef __MINGW32__ + // eff you mingw: + // "fixed": + // http://sourceforge.net/p/mingw-w64/mailman/message/32882927/ + // "no that broke the build, reverted, who cares about C": + // http://sourceforge.net/p/mingw-w64/mailman/message/32890381/ + #ifdef __forceinline + #undef __forceinline + #endif + #define __forceinline + #define alloca __builtin_alloca +#elif !defined(_MSC_VER) + #if __GNUC__ + #define __forceinline inline + #else + #define __forceinline + #endif +#endif + +#if STB_VORBIS_MAX_CHANNELS > 256 +#error "Value of STB_VORBIS_MAX_CHANNELS outside of allowed range" +#endif + +#if STB_VORBIS_FAST_HUFFMAN_LENGTH > 24 +#error "Value of STB_VORBIS_FAST_HUFFMAN_LENGTH outside of allowed range" +#endif + + +#if 0 +#include +#define CHECK(f) _CrtIsValidHeapPointer(f->channel_buffers[1]) +#else +#define CHECK(f) ((void) 0) +#endif + +#define MAX_BLOCKSIZE_LOG 13 // from specification +#define MAX_BLOCKSIZE (1 << MAX_BLOCKSIZE_LOG) + + +typedef unsigned char uint8; +typedef signed char int8; +typedef unsigned short uint16; +typedef signed short int16; +typedef unsigned int uint32; +typedef signed int int32; + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +typedef float codetype; + +// @NOTE +// +// Some arrays below are tagged "//varies", which means it's actually +// a variable-sized piece of data, but rather than malloc I assume it's +// small enough it's better to just allocate it all together with the +// main thing +// +// Most of the variables are specified with the smallest size I could pack +// them into. It might give better performance to make them all full-sized +// integers. It should be safe to freely rearrange the structures or change +// the sizes larger--nothing relies on silently truncating etc., nor the +// order of variables. + +#define FAST_HUFFMAN_TABLE_SIZE (1 << STB_VORBIS_FAST_HUFFMAN_LENGTH) +#define FAST_HUFFMAN_TABLE_MASK (FAST_HUFFMAN_TABLE_SIZE - 1) + +typedef struct +{ + int dimensions, entries; + uint8 *codeword_lengths; + float minimum_value; + float delta_value; + uint8 value_bits; + uint8 lookup_type; + uint8 sequence_p; + uint8 sparse; + uint32 lookup_values; + codetype *multiplicands; + uint32 *codewords; + #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT + int16 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; + #else + int32 fast_huffman[FAST_HUFFMAN_TABLE_SIZE]; + #endif + uint32 *sorted_codewords; + int *sorted_values; + int sorted_entries; +} Codebook; + +typedef struct +{ + uint8 order; + uint16 rate; + uint16 bark_map_size; + uint8 amplitude_bits; + uint8 amplitude_offset; + uint8 number_of_books; + uint8 book_list[16]; // varies +} Floor0; + +typedef struct +{ + uint8 partitions; + uint8 partition_class_list[32]; // varies + uint8 class_dimensions[16]; // varies + uint8 class_subclasses[16]; // varies + uint8 class_masterbooks[16]; // varies + int16 subclass_books[16][8]; // varies + uint16 Xlist[31*8+2]; // varies + uint8 sorted_order[31*8+2]; + uint8 neighbors[31*8+2][2]; + uint8 floor1_multiplier; + uint8 rangebits; + int values; +} Floor1; + +typedef union +{ + Floor0 floor0; + Floor1 floor1; +} Floor; + +typedef struct +{ + uint32 begin, end; + uint32 part_size; + uint8 classifications; + uint8 classbook; + uint8 **classdata; + int16 (*residue_books)[8]; +} Residue; + +typedef struct +{ + uint8 magnitude; + uint8 angle; + uint8 mux; +} MappingChannel; + +typedef struct +{ + uint16 coupling_steps; + MappingChannel *chan; + uint8 submaps; + uint8 submap_floor[15]; // varies + uint8 submap_residue[15]; // varies +} Mapping; + +typedef struct +{ + uint8 blockflag; + uint8 mapping; + uint16 windowtype; + uint16 transformtype; +} Mode; + +typedef struct +{ + uint32 goal_crc; // expected crc if match + int bytes_left; // bytes left in packet + uint32 crc_so_far; // running crc + int bytes_done; // bytes processed in _current_ chunk + uint32 sample_loc; // granule pos encoded in page +} CRCscan; + +typedef struct +{ + uint32 page_start, page_end; + uint32 last_decoded_sample; +} ProbedPage; + +struct stb_vorbis +{ + // user-accessible info + unsigned int sample_rate; + int channels; + + unsigned int setup_memory_required; + unsigned int temp_memory_required; + unsigned int setup_temp_memory_required; + + // input config +#ifndef STB_VORBIS_NO_STDIO + FILE *f; + uint32 f_start; + int close_on_free; +#endif + + uint8 *stream; + uint8 *stream_start; + uint8 *stream_end; + + uint32 stream_len; + + uint8 push_mode; + + uint32 first_audio_page_offset; + + ProbedPage p_first, p_last; + + // memory management + stb_vorbis_alloc alloc; + int setup_offset; + int temp_offset; + + // run-time results + int eof; + enum STBVorbisError error; + + // user-useful data + + // header info + int blocksize[2]; + int blocksize_0, blocksize_1; + int codebook_count; + Codebook *codebooks; + int floor_count; + uint16 floor_types[64]; // varies + Floor *floor_config; + int residue_count; + uint16 residue_types[64]; // varies + Residue *residue_config; + int mapping_count; + Mapping *mapping; + int mode_count; + Mode mode_config[64]; // varies + + uint32 total_samples; + + // decode buffer + float *channel_buffers[STB_VORBIS_MAX_CHANNELS]; + float *outputs [STB_VORBIS_MAX_CHANNELS]; + + float *previous_window[STB_VORBIS_MAX_CHANNELS]; + int previous_length; + + #ifndef STB_VORBIS_NO_DEFER_FLOOR + int16 *finalY[STB_VORBIS_MAX_CHANNELS]; + #else + float *floor_buffers[STB_VORBIS_MAX_CHANNELS]; + #endif + + uint32 current_loc; // sample location of next frame to decode + int current_loc_valid; + + // per-blocksize precomputed data + + // twiddle factors + float *A[2],*B[2],*C[2]; + float *window[2]; + uint16 *bit_reverse[2]; + + // current page/packet/segment streaming info + uint32 serial; // stream serial number for verification + int last_page; + int segment_count; + uint8 segments[255]; + uint8 page_flag; + uint8 bytes_in_seg; + uint8 first_decode; + int next_seg; + int last_seg; // flag that we're on the last segment + int last_seg_which; // what was the segment number of the last seg? + uint32 acc; + int valid_bits; + int packet_bytes; + int end_seg_with_known_loc; + uint32 known_loc_for_packet; + int discard_samples_deferred; + uint32 samples_output; + + // push mode scanning + int page_crc_tests; // only in push_mode: number of tests active; -1 if not searching +#ifndef STB_VORBIS_NO_PUSHDATA_API + CRCscan scan[STB_VORBIS_PUSHDATA_CRC_COUNT]; +#endif + + // sample-access + int channel_buffer_start; + int channel_buffer_end; +}; + +#if defined(STB_VORBIS_NO_PUSHDATA_API) + #define IS_PUSH_MODE(f) FALSE +#elif defined(STB_VORBIS_NO_PULLDATA_API) + #define IS_PUSH_MODE(f) TRUE +#else + #define IS_PUSH_MODE(f) ((f)->push_mode) +#endif + +typedef struct stb_vorbis vorb; + +static int error(vorb *f, enum STBVorbisError e) +{ + f->error = e; + if (!f->eof && e != VORBIS_need_more_data) { + f->error=e; // breakpoint for debugging + } + return 0; +} + + +// these functions are used for allocating temporary memory +// while decoding. if you can afford the stack space, use +// alloca(); otherwise, provide a temp buffer and it will +// allocate out of those. + +#define array_size_required(count,size) (count*(sizeof(void *)+(size))) + +#define temp_alloc(f,size) (f->alloc.alloc_buffer ? setup_temp_malloc(f,size) : alloca(size)) +#define temp_free(f,p) 0 +#define temp_alloc_save(f) ((f)->temp_offset) +#define temp_alloc_restore(f,p) ((f)->temp_offset = (p)) + +#define temp_block_array(f,count,size) make_block_array(temp_alloc(f,array_size_required(count,size)), count, size) + +// given a sufficiently large block of memory, make an array of pointers to subblocks of it +static void *make_block_array(void *mem, int count, int size) +{ + int i; + void ** p = (void **) mem; + char *q = (char *) (p + count); + for (i=0; i < count; ++i) { + p[i] = q; + q += size; + } + return p; +} + +static void *setup_malloc(vorb *f, int sz) +{ + sz = (sz+3) & ~3; + f->setup_memory_required += sz; + if (f->alloc.alloc_buffer) { + void *p = (char *) f->alloc.alloc_buffer + f->setup_offset; + if (f->setup_offset + sz > f->temp_offset) return NULL; + f->setup_offset += sz; + return p; + } + return sz ? malloc(sz) : NULL; +} + +static void setup_free(vorb *f, void *p) +{ + if (f->alloc.alloc_buffer) return; // do nothing; setup mem is a stack + free(p); +} + +static void *setup_temp_malloc(vorb *f, int sz) +{ + sz = (sz+3) & ~3; + if (f->alloc.alloc_buffer) { + if (f->temp_offset - sz < f->setup_offset) return NULL; + f->temp_offset -= sz; + return (char *) f->alloc.alloc_buffer + f->temp_offset; + } + return malloc(sz); +} + +static void setup_temp_free(vorb *f, void *p, int sz) +{ + if (f->alloc.alloc_buffer) { + f->temp_offset += (sz+3)&~3; + return; + } + free(p); +} + +#define CRC32_POLY 0x04c11db7 // from spec + +static uint32 crc_table[256]; +static void crc32_init(void) +{ + int i,j; + uint32 s; + for(i=0; i < 256; i++) { + for (s=(uint32) i << 24, j=0; j < 8; ++j) + s = (s << 1) ^ (s >= (1U<<31) ? CRC32_POLY : 0); + crc_table[i] = s; + } +} + +static __forceinline uint32 crc32_update(uint32 crc, uint8 byte) +{ + return (crc << 8) ^ crc_table[byte ^ (crc >> 24)]; +} + + +// used in setup, and for huffman that doesn't go fast path +static unsigned int bit_reverse(unsigned int n) +{ + n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1); + n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2); + n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4); + n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8); + return (n >> 16) | (n << 16); +} + +static float square(float x) +{ + return x*x; +} + +// this is a weird definition of log2() for which log2(1) = 1, log2(2) = 2, log2(4) = 3 +// as required by the specification. fast(?) implementation from stb.h +// @OPTIMIZE: called multiple times per-packet with "constants"; move to setup +static int ilog(int32 n) +{ + static signed char log2_4[16] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4 }; + + if (n < 0) return 0; // signed n returns 0 + + // 2 compares if n < 16, 3 compares otherwise (4 if signed or n > 1<<29) + if (n < (1 << 14)) + if (n < (1 << 4)) return 0 + log2_4[n ]; + else if (n < (1 << 9)) return 5 + log2_4[n >> 5]; + else return 10 + log2_4[n >> 10]; + else if (n < (1 << 24)) + if (n < (1 << 19)) return 15 + log2_4[n >> 15]; + else return 20 + log2_4[n >> 20]; + else if (n < (1 << 29)) return 25 + log2_4[n >> 25]; + else return 30 + log2_4[n >> 30]; +} + +#ifndef M_PI + #define M_PI 3.14159265358979323846264f // from CRC +#endif + +// code length assigned to a value with no huffman encoding +#define NO_CODE 255 + +/////////////////////// LEAF SETUP FUNCTIONS ////////////////////////// +// +// these functions are only called at setup, and only a few times +// per file + +static float float32_unpack(uint32 x) +{ + // from the specification + uint32 mantissa = x & 0x1fffff; + uint32 sign = x & 0x80000000; + uint32 exp = (x & 0x7fe00000) >> 21; + double res = sign ? -(double)mantissa : (double)mantissa; + return (float) ldexp((float)res, exp-788); +} + + +// zlib & jpeg huffman tables assume that the output symbols +// can either be arbitrarily arranged, or have monotonically +// increasing frequencies--they rely on the lengths being sorted; +// this makes for a very simple generation algorithm. +// vorbis allows a huffman table with non-sorted lengths. This +// requires a more sophisticated construction, since symbols in +// order do not map to huffman codes "in order". +static void add_entry(Codebook *c, uint32 huff_code, int symbol, int count, int len, uint32 *values) +{ + if (!c->sparse) { + c->codewords [symbol] = huff_code; + } else { + c->codewords [count] = huff_code; + c->codeword_lengths[count] = len; + values [count] = symbol; + } +} + +static int compute_codewords(Codebook *c, uint8 *len, int n, uint32 *values) +{ + int i,k,m=0; + uint32 available[32]; + + memset(available, 0, sizeof(available)); + // find the first entry + for (k=0; k < n; ++k) if (len[k] < NO_CODE) break; + if (k == n) { assert(c->sorted_entries == 0); return TRUE; } + // add to the list + add_entry(c, 0, k, m++, len[k], values); + // add all available leaves + for (i=1; i <= len[k]; ++i) + available[i] = 1U << (32-i); + // note that the above code treats the first case specially, + // but it's really the same as the following code, so they + // could probably be combined (except the initial code is 0, + // and I use 0 in available[] to mean 'empty') + for (i=k+1; i < n; ++i) { + uint32 res; + int z = len[i], y; + if (z == NO_CODE) continue; + // find lowest available leaf (should always be earliest, + // which is what the specification calls for) + // note that this property, and the fact we can never have + // more than one free leaf at a given level, isn't totally + // trivial to prove, but it seems true and the assert never + // fires, so! + while (z > 0 && !available[z]) --z; + if (z == 0) { return FALSE; } + res = available[z]; + assert(z >= 0 && z < 32); + available[z] = 0; + add_entry(c, bit_reverse(res), i, m++, len[i], values); + // propagate availability up the tree + if (z != len[i]) { + assert(len[i] >= 0 && len[i] < 32); + for (y=len[i]; y > z; --y) { + assert(available[y] == 0); + available[y] = res + (1 << (32-y)); + } + } + } + return TRUE; +} + +// accelerated huffman table allows fast O(1) match of all symbols +// of length <= STB_VORBIS_FAST_HUFFMAN_LENGTH +static void compute_accelerated_huffman(Codebook *c) +{ + int i, len; + for (i=0; i < FAST_HUFFMAN_TABLE_SIZE; ++i) + c->fast_huffman[i] = -1; + + len = c->sparse ? c->sorted_entries : c->entries; + #ifdef STB_VORBIS_FAST_HUFFMAN_SHORT + if (len > 32767) len = 32767; // largest possible value we can encode! + #endif + for (i=0; i < len; ++i) { + if (c->codeword_lengths[i] <= STB_VORBIS_FAST_HUFFMAN_LENGTH) { + uint32 z = c->sparse ? bit_reverse(c->sorted_codewords[i]) : c->codewords[i]; + // set table entries for all bit combinations in the higher bits + while (z < FAST_HUFFMAN_TABLE_SIZE) { + c->fast_huffman[z] = i; + z += 1 << c->codeword_lengths[i]; + } + } + } +} + +#ifdef _MSC_VER +#define STBV_CDECL __cdecl +#else +#define STBV_CDECL +#endif + +static int STBV_CDECL uint32_compare(const void *p, const void *q) +{ + uint32 x = * (uint32 *) p; + uint32 y = * (uint32 *) q; + return x < y ? -1 : x > y; +} + +static int include_in_sort(Codebook *c, uint8 len) +{ + if (c->sparse) { assert(len != NO_CODE); return TRUE; } + if (len == NO_CODE) return FALSE; + if (len > STB_VORBIS_FAST_HUFFMAN_LENGTH) return TRUE; + return FALSE; +} + +// if the fast table above doesn't work, we want to binary +// search them... need to reverse the bits +static void compute_sorted_huffman(Codebook *c, uint8 *lengths, uint32 *values) +{ + int i, len; + // build a list of all the entries + // OPTIMIZATION: don't include the short ones, since they'll be caught by FAST_HUFFMAN. + // this is kind of a frivolous optimization--I don't see any performance improvement, + // but it's like 4 extra lines of code, so. + if (!c->sparse) { + int k = 0; + for (i=0; i < c->entries; ++i) + if (include_in_sort(c, lengths[i])) + c->sorted_codewords[k++] = bit_reverse(c->codewords[i]); + assert(k == c->sorted_entries); + } else { + for (i=0; i < c->sorted_entries; ++i) + c->sorted_codewords[i] = bit_reverse(c->codewords[i]); + } + + qsort(c->sorted_codewords, c->sorted_entries, sizeof(c->sorted_codewords[0]), uint32_compare); + c->sorted_codewords[c->sorted_entries] = 0xffffffff; + + len = c->sparse ? c->sorted_entries : c->entries; + // now we need to indicate how they correspond; we could either + // #1: sort a different data structure that says who they correspond to + // #2: for each sorted entry, search the original list to find who corresponds + // #3: for each original entry, find the sorted entry + // #1 requires extra storage, #2 is slow, #3 can use binary search! + for (i=0; i < len; ++i) { + int huff_len = c->sparse ? lengths[values[i]] : lengths[i]; + if (include_in_sort(c,huff_len)) { + uint32 code = bit_reverse(c->codewords[i]); + int x=0, n=c->sorted_entries; + while (n > 1) { + // invariant: sc[x] <= code < sc[x+n] + int m = x + (n >> 1); + if (c->sorted_codewords[m] <= code) { + x = m; + n -= (n>>1); + } else { + n >>= 1; + } + } + assert(c->sorted_codewords[x] == code); + if (c->sparse) { + c->sorted_values[x] = values[i]; + c->codeword_lengths[x] = huff_len; + } else { + c->sorted_values[x] = i; + } + } + } +} + +// only run while parsing the header (3 times) +static int vorbis_validate(uint8 *data) +{ + static uint8 vorbis[6] = { 'v', 'o', 'r', 'b', 'i', 's' }; + return memcmp(data, vorbis, 6) == 0; +} + +// called from setup only, once per code book +// (formula implied by specification) +static int lookup1_values(int entries, int dim) +{ + int r = (int) floor(exp((float) log((float) entries) / dim)); + if ((int) floor(pow((float) r+1, dim)) <= entries) // (int) cast for MinGW warning; + ++r; // floor() to avoid _ftol() when non-CRT + assert(pow((float) r+1, dim) > entries); + assert((int) floor(pow((float) r, dim)) <= entries); // (int),floor() as above + return r; +} + +// called twice per file +static void compute_twiddle_factors(int n, float *A, float *B, float *C) +{ + int n4 = n >> 2, n8 = n >> 3; + int k,k2; + + for (k=k2=0; k < n4; ++k,k2+=2) { + A[k2 ] = (float) cos(4*k*M_PI/n); + A[k2+1] = (float) -sin(4*k*M_PI/n); + B[k2 ] = (float) cos((k2+1)*M_PI/n/2) * 0.5f; + B[k2+1] = (float) sin((k2+1)*M_PI/n/2) * 0.5f; + } + for (k=k2=0; k < n8; ++k,k2+=2) { + C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); + C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); + } +} + +static void compute_window(int n, float *window) +{ + int n2 = n >> 1, i; + for (i=0; i < n2; ++i) + window[i] = (float) sin(0.5 * M_PI * square((float) sin((i - 0 + 0.5) / n2 * 0.5 * M_PI))); +} + +static void compute_bitreverse(int n, uint16 *rev) +{ + int ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + int i, n8 = n >> 3; + for (i=0; i < n8; ++i) + rev[i] = (bit_reverse(i) >> (32-ld+3)) << 2; +} + +static int init_blocksize(vorb *f, int b, int n) +{ + int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3; + f->A[b] = (float *) setup_malloc(f, sizeof(float) * n2); + f->B[b] = (float *) setup_malloc(f, sizeof(float) * n2); + f->C[b] = (float *) setup_malloc(f, sizeof(float) * n4); + if (!f->A[b] || !f->B[b] || !f->C[b]) return error(f, VORBIS_outofmem); + compute_twiddle_factors(n, f->A[b], f->B[b], f->C[b]); + f->window[b] = (float *) setup_malloc(f, sizeof(float) * n2); + if (!f->window[b]) return error(f, VORBIS_outofmem); + compute_window(n, f->window[b]); + f->bit_reverse[b] = (uint16 *) setup_malloc(f, sizeof(uint16) * n8); + if (!f->bit_reverse[b]) return error(f, VORBIS_outofmem); + compute_bitreverse(n, f->bit_reverse[b]); + return TRUE; +} + +static void neighbors(uint16 *x, int n, int *plow, int *phigh) +{ + int low = -1; + int high = 65536; + int i; + for (i=0; i < n; ++i) { + if (x[i] > low && x[i] < x[n]) { *plow = i; low = x[i]; } + if (x[i] < high && x[i] > x[n]) { *phigh = i; high = x[i]; } + } +} + +// this has been repurposed so y is now the original index instead of y +typedef struct +{ + uint16 x,id; +} stbv__floor_ordering; + +static int STBV_CDECL point_compare(const void *p, const void *q) +{ + stbv__floor_ordering *a = (stbv__floor_ordering *) p; + stbv__floor_ordering *b = (stbv__floor_ordering *) q; + return a->x < b->x ? -1 : a->x > b->x; +} + +// +/////////////////////// END LEAF SETUP FUNCTIONS ////////////////////////// + + +#if defined(STB_VORBIS_NO_STDIO) + #define USE_MEMORY(z) TRUE +#else + #define USE_MEMORY(z) ((z)->stream) +#endif + +static uint8 get8(vorb *z) +{ + if (USE_MEMORY(z)) { + if (z->stream >= z->stream_end) { z->eof = TRUE; return 0; } + return *z->stream++; + } + + #ifndef STB_VORBIS_NO_STDIO + { + int c = fgetc(z->f); + if (c == EOF) { z->eof = TRUE; return 0; } + return c; + } + #endif +} + +static uint32 get32(vorb *f) +{ + uint32 x; + x = get8(f); + x += get8(f) << 8; + x += get8(f) << 16; + x += (uint32) get8(f) << 24; + return x; +} + +static int getn(vorb *z, uint8 *data, int n) +{ + if (USE_MEMORY(z)) { + if (z->stream+n > z->stream_end) { z->eof = 1; return 0; } + memcpy(data, z->stream, n); + z->stream += n; + return 1; + } + + #ifndef STB_VORBIS_NO_STDIO + if (fread(data, n, 1, z->f) == 1) + return 1; + else { + z->eof = 1; + return 0; + } + #endif +} + +static void skip(vorb *z, int n) +{ + if (USE_MEMORY(z)) { + z->stream += n; + if (z->stream >= z->stream_end) z->eof = 1; + return; + } + #ifndef STB_VORBIS_NO_STDIO + { + long x = ftell(z->f); + fseek(z->f, x+n, SEEK_SET); + } + #endif +} + +static int set_file_offset(stb_vorbis *f, unsigned int loc) +{ + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (f->push_mode) return 0; + #endif + f->eof = 0; + if (USE_MEMORY(f)) { + if (f->stream_start + loc >= f->stream_end || f->stream_start + loc < f->stream_start) { + f->stream = f->stream_end; + f->eof = 1; + return 0; + } else { + f->stream = f->stream_start + loc; + return 1; + } + } + #ifndef STB_VORBIS_NO_STDIO + if (loc + f->f_start < loc || loc >= 0x80000000) { + loc = 0x7fffffff; + f->eof = 1; + } else { + loc += f->f_start; + } + if (!fseek(f->f, loc, SEEK_SET)) + return 1; + f->eof = 1; + fseek(f->f, f->f_start, SEEK_END); + return 0; + #endif +} + + +static uint8 ogg_page_header[4] = { 0x4f, 0x67, 0x67, 0x53 }; + +static int capture_pattern(vorb *f) +{ + if (0x4f != get8(f)) return FALSE; + if (0x67 != get8(f)) return FALSE; + if (0x67 != get8(f)) return FALSE; + if (0x53 != get8(f)) return FALSE; + return TRUE; +} + +#define PAGEFLAG_continued_packet 1 +#define PAGEFLAG_first_page 2 +#define PAGEFLAG_last_page 4 + +static int start_page_no_capturepattern(vorb *f) +{ + uint32 loc0,loc1,n; + // stream structure version + if (0 != get8(f)) return error(f, VORBIS_invalid_stream_structure_version); + // header flag + f->page_flag = get8(f); + // absolute granule position + loc0 = get32(f); + loc1 = get32(f); + // @TODO: validate loc0,loc1 as valid positions? + // stream serial number -- vorbis doesn't interleave, so discard + get32(f); + //if (f->serial != get32(f)) return error(f, VORBIS_incorrect_stream_serial_number); + // page sequence number + n = get32(f); + f->last_page = n; + // CRC32 + get32(f); + // page_segments + f->segment_count = get8(f); + if (!getn(f, f->segments, f->segment_count)) + return error(f, VORBIS_unexpected_eof); + // assume we _don't_ know any the sample position of any segments + f->end_seg_with_known_loc = -2; + if (loc0 != ~0U || loc1 != ~0U) { + int i; + // determine which packet is the last one that will complete + for (i=f->segment_count-1; i >= 0; --i) + if (f->segments[i] < 255) + break; + // 'i' is now the index of the _last_ segment of a packet that ends + if (i >= 0) { + f->end_seg_with_known_loc = i; + f->known_loc_for_packet = loc0; + } + } + if (f->first_decode) { + int i,len; + ProbedPage p; + len = 0; + for (i=0; i < f->segment_count; ++i) + len += f->segments[i]; + len += 27 + f->segment_count; + p.page_start = f->first_audio_page_offset; + p.page_end = p.page_start + len; + p.last_decoded_sample = loc0; + f->p_first = p; + } + f->next_seg = 0; + return TRUE; +} + +static int start_page(vorb *f) +{ + if (!capture_pattern(f)) return error(f, VORBIS_missing_capture_pattern); + return start_page_no_capturepattern(f); +} + +static int start_packet(vorb *f) +{ + while (f->next_seg == -1) { + if (!start_page(f)) return FALSE; + if (f->page_flag & PAGEFLAG_continued_packet) + return error(f, VORBIS_continued_packet_flag_invalid); + } + f->last_seg = FALSE; + f->valid_bits = 0; + f->packet_bytes = 0; + f->bytes_in_seg = 0; + // f->next_seg is now valid + return TRUE; +} + +static int maybe_start_packet(vorb *f) +{ + if (f->next_seg == -1) { + int x = get8(f); + if (f->eof) return FALSE; // EOF at page boundary is not an error! + if (0x4f != x ) return error(f, VORBIS_missing_capture_pattern); + if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (0x67 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (0x53 != get8(f)) return error(f, VORBIS_missing_capture_pattern); + if (!start_page_no_capturepattern(f)) return FALSE; + if (f->page_flag & PAGEFLAG_continued_packet) { + // set up enough state that we can read this packet if we want, + // e.g. during recovery + f->last_seg = FALSE; + f->bytes_in_seg = 0; + return error(f, VORBIS_continued_packet_flag_invalid); + } + } + return start_packet(f); +} + +static int next_segment(vorb *f) +{ + int len; + if (f->last_seg) return 0; + if (f->next_seg == -1) { + f->last_seg_which = f->segment_count-1; // in case start_page fails + if (!start_page(f)) { f->last_seg = 1; return 0; } + if (!(f->page_flag & PAGEFLAG_continued_packet)) return error(f, VORBIS_continued_packet_flag_invalid); + } + len = f->segments[f->next_seg++]; + if (len < 255) { + f->last_seg = TRUE; + f->last_seg_which = f->next_seg-1; + } + if (f->next_seg >= f->segment_count) + f->next_seg = -1; + assert(f->bytes_in_seg == 0); + f->bytes_in_seg = len; + return len; +} + +#define EOP (-1) +#define INVALID_BITS (-1) + +static int get8_packet_raw(vorb *f) +{ + if (!f->bytes_in_seg) { // CLANG! + if (f->last_seg) return EOP; + else if (!next_segment(f)) return EOP; + } + assert(f->bytes_in_seg > 0); + --f->bytes_in_seg; + ++f->packet_bytes; + return get8(f); +} + +static int get8_packet(vorb *f) +{ + int x = get8_packet_raw(f); + f->valid_bits = 0; + return x; +} + +static void flush_packet(vorb *f) +{ + while (get8_packet_raw(f) != EOP); +} + +// @OPTIMIZE: this is the secondary bit decoder, so it's probably not as important +// as the huffman decoder? +static uint32 get_bits(vorb *f, int n) +{ + uint32 z; + + if (f->valid_bits < 0) return 0; + if (f->valid_bits < n) { + if (n > 24) { + // the accumulator technique below would not work correctly in this case + z = get_bits(f, 24); + z += get_bits(f, n-24) << 24; + return z; + } + if (f->valid_bits == 0) f->acc = 0; + while (f->valid_bits < n) { + int z = get8_packet_raw(f); + if (z == EOP) { + f->valid_bits = INVALID_BITS; + return 0; + } + f->acc += z << f->valid_bits; + f->valid_bits += 8; + } + } + if (f->valid_bits < 0) return 0; + z = f->acc & ((1 << n)-1); + f->acc >>= n; + f->valid_bits -= n; + return z; +} + +// @OPTIMIZE: primary accumulator for huffman +// expand the buffer to as many bits as possible without reading off end of packet +// it might be nice to allow f->valid_bits and f->acc to be stored in registers, +// e.g. cache them locally and decode locally +static __forceinline void prep_huffman(vorb *f) +{ + if (f->valid_bits <= 24) { + if (f->valid_bits == 0) f->acc = 0; + do { + int z; + if (f->last_seg && !f->bytes_in_seg) return; + z = get8_packet_raw(f); + if (z == EOP) return; + f->acc += (unsigned) z << f->valid_bits; + f->valid_bits += 8; + } while (f->valid_bits <= 24); + } +} + +enum +{ + VORBIS_packet_id = 1, + VORBIS_packet_comment = 3, + VORBIS_packet_setup = 5 +}; + +static int codebook_decode_scalar_raw(vorb *f, Codebook *c) +{ + int i; + prep_huffman(f); + + if (c->codewords == NULL && c->sorted_codewords == NULL) + return -1; + + // cases to use binary search: sorted_codewords && !c->codewords + // sorted_codewords && c->entries > 8 + if (c->entries > 8 ? c->sorted_codewords!=NULL : !c->codewords) { + // binary search + uint32 code = bit_reverse(f->acc); + int x=0, n=c->sorted_entries, len; + + while (n > 1) { + // invariant: sc[x] <= code < sc[x+n] + int m = x + (n >> 1); + if (c->sorted_codewords[m] <= code) { + x = m; + n -= (n>>1); + } else { + n >>= 1; + } + } + // x is now the sorted index + if (!c->sparse) x = c->sorted_values[x]; + // x is now sorted index if sparse, or symbol otherwise + len = c->codeword_lengths[x]; + if (f->valid_bits >= len) { + f->acc >>= len; + f->valid_bits -= len; + return x; + } + + f->valid_bits = 0; + return -1; + } + + // if small, linear search + assert(!c->sparse); + for (i=0; i < c->entries; ++i) { + if (c->codeword_lengths[i] == NO_CODE) continue; + if (c->codewords[i] == (f->acc & ((1 << c->codeword_lengths[i])-1))) { + if (f->valid_bits >= c->codeword_lengths[i]) { + f->acc >>= c->codeword_lengths[i]; + f->valid_bits -= c->codeword_lengths[i]; + return i; + } + f->valid_bits = 0; + return -1; + } + } + + error(f, VORBIS_invalid_stream); + f->valid_bits = 0; + return -1; +} + +#ifndef STB_VORBIS_NO_INLINE_DECODE + +#define DECODE_RAW(var, f,c) \ + if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) \ + prep_huffman(f); \ + var = f->acc & FAST_HUFFMAN_TABLE_MASK; \ + var = c->fast_huffman[var]; \ + if (var >= 0) { \ + int n = c->codeword_lengths[var]; \ + f->acc >>= n; \ + f->valid_bits -= n; \ + if (f->valid_bits < 0) { f->valid_bits = 0; var = -1; } \ + } else { \ + var = codebook_decode_scalar_raw(f,c); \ + } + +#else + +static int codebook_decode_scalar(vorb *f, Codebook *c) +{ + int i; + if (f->valid_bits < STB_VORBIS_FAST_HUFFMAN_LENGTH) + prep_huffman(f); + // fast huffman table lookup + i = f->acc & FAST_HUFFMAN_TABLE_MASK; + i = c->fast_huffman[i]; + if (i >= 0) { + f->acc >>= c->codeword_lengths[i]; + f->valid_bits -= c->codeword_lengths[i]; + if (f->valid_bits < 0) { f->valid_bits = 0; return -1; } + return i; + } + return codebook_decode_scalar_raw(f,c); +} + +#define DECODE_RAW(var,f,c) var = codebook_decode_scalar(f,c); + +#endif + +#define DECODE(var,f,c) \ + DECODE_RAW(var,f,c) \ + if (c->sparse) var = c->sorted_values[var]; + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + #define DECODE_VQ(var,f,c) DECODE_RAW(var,f,c) +#else + #define DECODE_VQ(var,f,c) DECODE(var,f,c) +#endif + + + + + + +// CODEBOOK_ELEMENT_FAST is an optimization for the CODEBOOK_FLOATS case +// where we avoid one addition +#define CODEBOOK_ELEMENT(c,off) (c->multiplicands[off]) +#define CODEBOOK_ELEMENT_FAST(c,off) (c->multiplicands[off]) +#define CODEBOOK_ELEMENT_BASE(c) (0) + +static int codebook_decode_start(vorb *f, Codebook *c) +{ + int z = -1; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) + error(f, VORBIS_invalid_stream); + else { + DECODE_VQ(z,f,c); + if (c->sparse) assert(z < c->sorted_entries); + if (z < 0) { // check for EOP + if (!f->bytes_in_seg) + if (f->last_seg) + return z; + error(f, VORBIS_invalid_stream); + } + } + return z; +} + +static int codebook_decode(vorb *f, Codebook *c, float *output, int len) +{ + int i,z = codebook_decode_start(f,c); + if (z < 0) return FALSE; + if (len > c->dimensions) len = c->dimensions; + +#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + float last = CODEBOOK_ELEMENT_BASE(c); + int div = 1; + for (i=0; i < len; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + output[i] += val; + if (c->sequence_p) last = val + c->minimum_value; + div *= c->lookup_values; + } + return TRUE; + } +#endif + + z *= c->dimensions; + if (c->sequence_p) { + float last = CODEBOOK_ELEMENT_BASE(c); + for (i=0; i < len; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + output[i] += val; + last = val + c->minimum_value; + } + } else { + float last = CODEBOOK_ELEMENT_BASE(c); + for (i=0; i < len; ++i) { + output[i] += CODEBOOK_ELEMENT_FAST(c,z+i) + last; + } + } + + return TRUE; +} + +static int codebook_decode_step(vorb *f, Codebook *c, float *output, int len, int step) +{ + int i,z = codebook_decode_start(f,c); + float last = CODEBOOK_ELEMENT_BASE(c); + if (z < 0) return FALSE; + if (len > c->dimensions) len = c->dimensions; + +#ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int div = 1; + for (i=0; i < len; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + output[i*step] += val; + if (c->sequence_p) last = val; + div *= c->lookup_values; + } + return TRUE; + } +#endif + + z *= c->dimensions; + for (i=0; i < len; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + output[i*step] += val; + if (c->sequence_p) last = val; + } + + return TRUE; +} + +static int codebook_decode_deinterleave_repeat(vorb *f, Codebook *c, float **outputs, int ch, int *c_inter_p, int *p_inter_p, int len, int total_decode) +{ + int c_inter = *c_inter_p; + int p_inter = *p_inter_p; + int i,z, effective = c->dimensions; + + // type 0 is only legal in a scalar context + if (c->lookup_type == 0) return error(f, VORBIS_invalid_stream); + + while (total_decode > 0) { + float last = CODEBOOK_ELEMENT_BASE(c); + DECODE_VQ(z,f,c); + #ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + assert(!c->sparse || z < c->sorted_entries); + #endif + if (z < 0) { + if (!f->bytes_in_seg) + if (f->last_seg) return FALSE; + return error(f, VORBIS_invalid_stream); + } + + // if this will take us off the end of the buffers, stop short! + // we check by computing the length of the virtual interleaved + // buffer (len*ch), our current offset within it (p_inter*ch)+(c_inter), + // and the length we'll be using (effective) + if (c_inter + p_inter*ch + effective > len * ch) { + effective = len*ch - (p_inter*ch - c_inter); + } + + #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int div = 1; + for (i=0; i < effective; ++i) { + int off = (z / div) % c->lookup_values; + float val = CODEBOOK_ELEMENT_FAST(c,off) + last; + if (outputs[c_inter]) + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + if (c->sequence_p) last = val; + div *= c->lookup_values; + } + } else + #endif + { + z *= c->dimensions; + if (c->sequence_p) { + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + if (outputs[c_inter]) + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + last = val; + } + } else { + for (i=0; i < effective; ++i) { + float val = CODEBOOK_ELEMENT_FAST(c,z+i) + last; + if (outputs[c_inter]) + outputs[c_inter][p_inter] += val; + if (++c_inter == ch) { c_inter = 0; ++p_inter; } + } + } + } + + total_decode -= effective; + } + *c_inter_p = c_inter; + *p_inter_p = p_inter; + return TRUE; +} + +static int predict_point(int x, int x0, int x1, int y0, int y1) +{ + int dy = y1 - y0; + int adx = x1 - x0; + // @OPTIMIZE: force int division to round in the right direction... is this necessary on x86? + int err = abs(dy) * (x - x0); + int off = err / adx; + return dy < 0 ? y0 - off : y0 + off; +} + +// the following table is block-copied from the specification +static float inverse_db_table[256] = +{ + 1.0649863e-07f, 1.1341951e-07f, 1.2079015e-07f, 1.2863978e-07f, + 1.3699951e-07f, 1.4590251e-07f, 1.5538408e-07f, 1.6548181e-07f, + 1.7623575e-07f, 1.8768855e-07f, 1.9988561e-07f, 2.1287530e-07f, + 2.2670913e-07f, 2.4144197e-07f, 2.5713223e-07f, 2.7384213e-07f, + 2.9163793e-07f, 3.1059021e-07f, 3.3077411e-07f, 3.5226968e-07f, + 3.7516214e-07f, 3.9954229e-07f, 4.2550680e-07f, 4.5315863e-07f, + 4.8260743e-07f, 5.1396998e-07f, 5.4737065e-07f, 5.8294187e-07f, + 6.2082472e-07f, 6.6116941e-07f, 7.0413592e-07f, 7.4989464e-07f, + 7.9862701e-07f, 8.5052630e-07f, 9.0579828e-07f, 9.6466216e-07f, + 1.0273513e-06f, 1.0941144e-06f, 1.1652161e-06f, 1.2409384e-06f, + 1.3215816e-06f, 1.4074654e-06f, 1.4989305e-06f, 1.5963394e-06f, + 1.7000785e-06f, 1.8105592e-06f, 1.9282195e-06f, 2.0535261e-06f, + 2.1869758e-06f, 2.3290978e-06f, 2.4804557e-06f, 2.6416497e-06f, + 2.8133190e-06f, 2.9961443e-06f, 3.1908506e-06f, 3.3982101e-06f, + 3.6190449e-06f, 3.8542308e-06f, 4.1047004e-06f, 4.3714470e-06f, + 4.6555282e-06f, 4.9580707e-06f, 5.2802740e-06f, 5.6234160e-06f, + 5.9888572e-06f, 6.3780469e-06f, 6.7925283e-06f, 7.2339451e-06f, + 7.7040476e-06f, 8.2047000e-06f, 8.7378876e-06f, 9.3057248e-06f, + 9.9104632e-06f, 1.0554501e-05f, 1.1240392e-05f, 1.1970856e-05f, + 1.2748789e-05f, 1.3577278e-05f, 1.4459606e-05f, 1.5399272e-05f, + 1.6400004e-05f, 1.7465768e-05f, 1.8600792e-05f, 1.9809576e-05f, + 2.1096914e-05f, 2.2467911e-05f, 2.3928002e-05f, 2.5482978e-05f, + 2.7139006e-05f, 2.8902651e-05f, 3.0780908e-05f, 3.2781225e-05f, + 3.4911534e-05f, 3.7180282e-05f, 3.9596466e-05f, 4.2169667e-05f, + 4.4910090e-05f, 4.7828601e-05f, 5.0936773e-05f, 5.4246931e-05f, + 5.7772202e-05f, 6.1526565e-05f, 6.5524908e-05f, 6.9783085e-05f, + 7.4317983e-05f, 7.9147585e-05f, 8.4291040e-05f, 8.9768747e-05f, + 9.5602426e-05f, 0.00010181521f, 0.00010843174f, 0.00011547824f, + 0.00012298267f, 0.00013097477f, 0.00013948625f, 0.00014855085f, + 0.00015820453f, 0.00016848555f, 0.00017943469f, 0.00019109536f, + 0.00020351382f, 0.00021673929f, 0.00023082423f, 0.00024582449f, + 0.00026179955f, 0.00027881276f, 0.00029693158f, 0.00031622787f, + 0.00033677814f, 0.00035866388f, 0.00038197188f, 0.00040679456f, + 0.00043323036f, 0.00046138411f, 0.00049136745f, 0.00052329927f, + 0.00055730621f, 0.00059352311f, 0.00063209358f, 0.00067317058f, + 0.00071691700f, 0.00076350630f, 0.00081312324f, 0.00086596457f, + 0.00092223983f, 0.00098217216f, 0.0010459992f, 0.0011139742f, + 0.0011863665f, 0.0012634633f, 0.0013455702f, 0.0014330129f, + 0.0015261382f, 0.0016253153f, 0.0017309374f, 0.0018434235f, + 0.0019632195f, 0.0020908006f, 0.0022266726f, 0.0023713743f, + 0.0025254795f, 0.0026895994f, 0.0028643847f, 0.0030505286f, + 0.0032487691f, 0.0034598925f, 0.0036847358f, 0.0039241906f, + 0.0041792066f, 0.0044507950f, 0.0047400328f, 0.0050480668f, + 0.0053761186f, 0.0057254891f, 0.0060975636f, 0.0064938176f, + 0.0069158225f, 0.0073652516f, 0.0078438871f, 0.0083536271f, + 0.0088964928f, 0.009474637f, 0.010090352f, 0.010746080f, + 0.011444421f, 0.012188144f, 0.012980198f, 0.013823725f, + 0.014722068f, 0.015678791f, 0.016697687f, 0.017782797f, + 0.018938423f, 0.020169149f, 0.021479854f, 0.022875735f, + 0.024362330f, 0.025945531f, 0.027631618f, 0.029427276f, + 0.031339626f, 0.033376252f, 0.035545228f, 0.037855157f, + 0.040315199f, 0.042935108f, 0.045725273f, 0.048696758f, + 0.051861348f, 0.055231591f, 0.058820850f, 0.062643361f, + 0.066714279f, 0.071049749f, 0.075666962f, 0.080584227f, + 0.085821044f, 0.091398179f, 0.097337747f, 0.10366330f, + 0.11039993f, 0.11757434f, 0.12521498f, 0.13335215f, + 0.14201813f, 0.15124727f, 0.16107617f, 0.17154380f, + 0.18269168f, 0.19456402f, 0.20720788f, 0.22067342f, + 0.23501402f, 0.25028656f, 0.26655159f, 0.28387361f, + 0.30232132f, 0.32196786f, 0.34289114f, 0.36517414f, + 0.38890521f, 0.41417847f, 0.44109412f, 0.46975890f, + 0.50028648f, 0.53279791f, 0.56742212f, 0.60429640f, + 0.64356699f, 0.68538959f, 0.72993007f, 0.77736504f, + 0.82788260f, 0.88168307f, 0.9389798f, 1.0f +}; + + +// @OPTIMIZE: if you want to replace this bresenham line-drawing routine, +// note that you must produce bit-identical output to decode correctly; +// this specific sequence of operations is specified in the spec (it's +// drawing integer-quantized frequency-space lines that the encoder +// expects to be exactly the same) +// ... also, isn't the whole point of Bresenham's algorithm to NOT +// have to divide in the setup? sigh. +#ifndef STB_VORBIS_NO_DEFER_FLOOR +#define LINE_OP(a,b) a *= b +#else +#define LINE_OP(a,b) a = b +#endif + +#ifdef STB_VORBIS_DIVIDE_TABLE +#define DIVTAB_NUMER 32 +#define DIVTAB_DENOM 64 +int8 integer_divide_table[DIVTAB_NUMER][DIVTAB_DENOM]; // 2KB +#endif + +static __forceinline void draw_line(float *output, int x0, int y0, int x1, int y1, int n) +{ + int dy = y1 - y0; + int adx = x1 - x0; + int ady = abs(dy); + int base; + int x=x0,y=y0; + int err = 0; + int sy; + +#ifdef STB_VORBIS_DIVIDE_TABLE + if (adx < DIVTAB_DENOM && ady < DIVTAB_NUMER) { + if (dy < 0) { + base = -integer_divide_table[ady][adx]; + sy = base-1; + } else { + base = integer_divide_table[ady][adx]; + sy = base+1; + } + } else { + base = dy / adx; + if (dy < 0) + sy = base - 1; + else + sy = base+1; + } +#else + base = dy / adx; + if (dy < 0) + sy = base - 1; + else + sy = base+1; +#endif + ady -= abs(base) * adx; + if (x1 > n) x1 = n; + if (x < x1) { + LINE_OP(output[x], inverse_db_table[y]); + for (++x; x < x1; ++x) { + err += ady; + if (err >= adx) { + err -= adx; + y += sy; + } else + y += base; + LINE_OP(output[x], inverse_db_table[y]); + } + } +} + +static int residue_decode(vorb *f, Codebook *book, float *target, int offset, int n, int rtype) +{ + int k; + if (rtype == 0) { + int step = n / book->dimensions; + for (k=0; k < step; ++k) + if (!codebook_decode_step(f, book, target+offset+k, n-offset-k, step)) + return FALSE; + } else { + for (k=0; k < n; ) { + if (!codebook_decode(f, book, target+offset, n-k)) + return FALSE; + k += book->dimensions; + offset += book->dimensions; + } + } + return TRUE; +} + +// n is 1/2 of the blocksize -- +// specification: "Correct per-vector decode length is [n]/2" +static void decode_residue(vorb *f, float *residue_buffers[], int ch, int n, int rn, uint8 *do_not_decode) +{ + int i,j,pass; + Residue *r = f->residue_config + rn; + int rtype = f->residue_types[rn]; + int c = r->classbook; + int classwords = f->codebooks[c].dimensions; + unsigned int actual_size = rtype == 2 ? n*2 : n; + unsigned int limit_r_begin = (r->begin < actual_size ? r->begin : actual_size); + unsigned int limit_r_end = (r->end < actual_size ? r->end : actual_size); + int n_read = limit_r_end - limit_r_begin; + int part_read = n_read / r->part_size; + int temp_alloc_point = temp_alloc_save(f); + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + uint8 ***part_classdata = (uint8 ***) temp_block_array(f,f->channels, part_read * sizeof(**part_classdata)); + #else + int **classifications = (int **) temp_block_array(f,f->channels, part_read * sizeof(**classifications)); + #endif + + CHECK(f); + + for (i=0; i < ch; ++i) + if (!do_not_decode[i]) + memset(residue_buffers[i], 0, sizeof(float) * n); + + if (rtype == 2 && ch != 1) { + for (j=0; j < ch; ++j) + if (!do_not_decode[j]) + break; + if (j == ch) + goto done; + + for (pass=0; pass < 8; ++pass) { + int pcount = 0, class_set = 0; + if (ch == 2) { + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = (z & 1), p_inter = z>>1; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + #ifdef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + #else + // saves 1% + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + #endif + } else { + z += r->part_size; + c_inter = z & 1; + p_inter = z >> 1; + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } else if (ch == 1) { + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = 0, p_inter = z; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + } else { + z += r->part_size; + c_inter = 0; + p_inter = z; + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } else { + while (pcount < part_read) { + int z = r->begin + pcount*r->part_size; + int c_inter = z % ch, p_inter = z/ch; + if (pass == 0) { + Codebook *c = f->codebooks+r->classbook; + int q; + DECODE(q,f,c); + if (q == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[0][class_set] = r->classdata[q]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[0][i+pcount] = q % r->classifications; + q /= r->classifications; + } + #endif + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + int z = r->begin + pcount*r->part_size; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[0][class_set][i]; + #else + int c = classifications[0][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + Codebook *book = f->codebooks + b; + if (!codebook_decode_deinterleave_repeat(f, book, residue_buffers, ch, &c_inter, &p_inter, n, r->part_size)) + goto done; + } else { + z += r->part_size; + c_inter = z % ch; + p_inter = z / ch; + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } + } + goto done; + } + CHECK(f); + + for (pass=0; pass < 8; ++pass) { + int pcount = 0, class_set=0; + while (pcount < part_read) { + if (pass == 0) { + for (j=0; j < ch; ++j) { + if (!do_not_decode[j]) { + Codebook *c = f->codebooks+r->classbook; + int temp; + DECODE(temp,f,c); + if (temp == EOP) goto done; + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + part_classdata[j][class_set] = r->classdata[temp]; + #else + for (i=classwords-1; i >= 0; --i) { + classifications[j][i+pcount] = temp % r->classifications; + temp /= r->classifications; + } + #endif + } + } + } + for (i=0; i < classwords && pcount < part_read; ++i, ++pcount) { + for (j=0; j < ch; ++j) { + if (!do_not_decode[j]) { + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + int c = part_classdata[j][class_set][i]; + #else + int c = classifications[j][pcount]; + #endif + int b = r->residue_books[c][pass]; + if (b >= 0) { + float *target = residue_buffers[j]; + int offset = r->begin + pcount * r->part_size; + int n = r->part_size; + Codebook *book = f->codebooks + b; + if (!residue_decode(f, book, target, offset, n, rtype)) + goto done; + } + } + } + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + ++class_set; + #endif + } + } + done: + CHECK(f); + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + temp_free(f,part_classdata); + #else + temp_free(f,classifications); + #endif + temp_alloc_restore(f,temp_alloc_point); +} + + +#if 0 +// slow way for debugging +void inverse_mdct_slow(float *buffer, int n) +{ + int i,j; + int n2 = n >> 1; + float *x = (float *) malloc(sizeof(*x) * n2); + memcpy(x, buffer, sizeof(*x) * n2); + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n2; ++j) + // formula from paper: + //acc += n/4.0f * x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); + // formula from wikipedia + //acc += 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); + // these are equivalent, except the formula from the paper inverts the multiplier! + // however, what actually works is NO MULTIPLIER!?! + //acc += 64 * 2.0f / n2 * x[j] * (float) cos(M_PI/n2 * (i + 0.5 + n2/2)*(j + 0.5)); + acc += x[j] * (float) cos(M_PI / 2 / n * (2 * i + 1 + n/2.0)*(2*j+1)); + buffer[i] = acc; + } + free(x); +} +#elif 0 +// same as above, but just barely able to run in real time on modern machines +void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) +{ + float mcos[16384]; + int i,j; + int n2 = n >> 1, nmask = (n << 2) -1; + float *x = (float *) malloc(sizeof(*x) * n2); + memcpy(x, buffer, sizeof(*x) * n2); + for (i=0; i < 4*n; ++i) + mcos[i] = (float) cos(M_PI / 2 * i / n); + + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n2; ++j) + acc += x[j] * mcos[(2 * i + 1 + n2)*(2*j+1) & nmask]; + buffer[i] = acc; + } + free(x); +} +#elif 0 +// transform to use a slow dct-iv; this is STILL basically trivial, +// but only requires half as many ops +void dct_iv_slow(float *buffer, int n) +{ + float mcos[16384]; + float x[2048]; + int i,j; + int n2 = n >> 1, nmask = (n << 3) - 1; + memcpy(x, buffer, sizeof(*x) * n); + for (i=0; i < 8*n; ++i) + mcos[i] = (float) cos(M_PI / 4 * i / n); + for (i=0; i < n; ++i) { + float acc = 0; + for (j=0; j < n; ++j) + acc += x[j] * mcos[((2 * i + 1)*(2*j+1)) & nmask]; + buffer[i] = acc; + } +} + +void inverse_mdct_slow(float *buffer, int n, vorb *f, int blocktype) +{ + int i, n4 = n >> 2, n2 = n >> 1, n3_4 = n - n4; + float temp[4096]; + + memcpy(temp, buffer, n2 * sizeof(float)); + dct_iv_slow(temp, n2); // returns -c'-d, a-b' + + for (i=0; i < n4 ; ++i) buffer[i] = temp[i+n4]; // a-b' + for ( ; i < n3_4; ++i) buffer[i] = -temp[n3_4 - i - 1]; // b-a', c+d' + for ( ; i < n ; ++i) buffer[i] = -temp[i - n3_4]; // c'+d +} +#endif + +#ifndef LIBVORBIS_MDCT +#define LIBVORBIS_MDCT 0 +#endif + +#if LIBVORBIS_MDCT +// directly call the vorbis MDCT using an interface documented +// by Jeff Roberts... useful for performance comparison +typedef struct +{ + int n; + int log2n; + + float *trig; + int *bitrev; + + float scale; +} mdct_lookup; + +extern void mdct_init(mdct_lookup *lookup, int n); +extern void mdct_clear(mdct_lookup *l); +extern void mdct_backward(mdct_lookup *init, float *in, float *out); + +mdct_lookup M1,M2; + +void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) +{ + mdct_lookup *M; + if (M1.n == n) M = &M1; + else if (M2.n == n) M = &M2; + else if (M1.n == 0) { mdct_init(&M1, n); M = &M1; } + else { + if (M2.n) __asm int 3; + mdct_init(&M2, n); + M = &M2; + } + + mdct_backward(M, buffer, buffer); +} +#endif + + +// the following were split out into separate functions while optimizing; +// they could be pushed back up but eh. __forceinline showed no change; +// they're probably already being inlined. +static void imdct_step3_iter0_loop(int n, float *e, int i_off, int k_off, float *A) +{ + float *ee0 = e + i_off; + float *ee2 = ee0 + k_off; + int i; + + assert((n & 3) == 0); + for (i=(n>>2); i > 0; --i) { + float k00_20, k01_21; + k00_20 = ee0[ 0] - ee2[ 0]; + k01_21 = ee0[-1] - ee2[-1]; + ee0[ 0] += ee2[ 0];//ee0[ 0] = ee0[ 0] + ee2[ 0]; + ee0[-1] += ee2[-1];//ee0[-1] = ee0[-1] + ee2[-1]; + ee2[ 0] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-1] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-2] - ee2[-2]; + k01_21 = ee0[-3] - ee2[-3]; + ee0[-2] += ee2[-2];//ee0[-2] = ee0[-2] + ee2[-2]; + ee0[-3] += ee2[-3];//ee0[-3] = ee0[-3] + ee2[-3]; + ee2[-2] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-3] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-4] - ee2[-4]; + k01_21 = ee0[-5] - ee2[-5]; + ee0[-4] += ee2[-4];//ee0[-4] = ee0[-4] + ee2[-4]; + ee0[-5] += ee2[-5];//ee0[-5] = ee0[-5] + ee2[-5]; + ee2[-4] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-5] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + + k00_20 = ee0[-6] - ee2[-6]; + k01_21 = ee0[-7] - ee2[-7]; + ee0[-6] += ee2[-6];//ee0[-6] = ee0[-6] + ee2[-6]; + ee0[-7] += ee2[-7];//ee0[-7] = ee0[-7] + ee2[-7]; + ee2[-6] = k00_20 * A[0] - k01_21 * A[1]; + ee2[-7] = k01_21 * A[0] + k00_20 * A[1]; + A += 8; + ee0 -= 8; + ee2 -= 8; + } +} + +static void imdct_step3_inner_r_loop(int lim, float *e, int d0, int k_off, float *A, int k1) +{ + int i; + float k00_20, k01_21; + + float *e0 = e + d0; + float *e2 = e0 + k_off; + + for (i=lim >> 2; i > 0; --i) { + k00_20 = e0[-0] - e2[-0]; + k01_21 = e0[-1] - e2[-1]; + e0[-0] += e2[-0];//e0[-0] = e0[-0] + e2[-0]; + e0[-1] += e2[-1];//e0[-1] = e0[-1] + e2[-1]; + e2[-0] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-1] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-2] - e2[-2]; + k01_21 = e0[-3] - e2[-3]; + e0[-2] += e2[-2];//e0[-2] = e0[-2] + e2[-2]; + e0[-3] += e2[-3];//e0[-3] = e0[-3] + e2[-3]; + e2[-2] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-3] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-4] - e2[-4]; + k01_21 = e0[-5] - e2[-5]; + e0[-4] += e2[-4];//e0[-4] = e0[-4] + e2[-4]; + e0[-5] += e2[-5];//e0[-5] = e0[-5] + e2[-5]; + e2[-4] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-5] = (k01_21)*A[0] + (k00_20) * A[1]; + + A += k1; + + k00_20 = e0[-6] - e2[-6]; + k01_21 = e0[-7] - e2[-7]; + e0[-6] += e2[-6];//e0[-6] = e0[-6] + e2[-6]; + e0[-7] += e2[-7];//e0[-7] = e0[-7] + e2[-7]; + e2[-6] = (k00_20)*A[0] - (k01_21) * A[1]; + e2[-7] = (k01_21)*A[0] + (k00_20) * A[1]; + + e0 -= 8; + e2 -= 8; + + A += k1; + } +} + +static void imdct_step3_inner_s_loop(int n, float *e, int i_off, int k_off, float *A, int a_off, int k0) +{ + int i; + float A0 = A[0]; + float A1 = A[0+1]; + float A2 = A[0+a_off]; + float A3 = A[0+a_off+1]; + float A4 = A[0+a_off*2+0]; + float A5 = A[0+a_off*2+1]; + float A6 = A[0+a_off*3+0]; + float A7 = A[0+a_off*3+1]; + + float k00,k11; + + float *ee0 = e +i_off; + float *ee2 = ee0+k_off; + + for (i=n; i > 0; --i) { + k00 = ee0[ 0] - ee2[ 0]; + k11 = ee0[-1] - ee2[-1]; + ee0[ 0] = ee0[ 0] + ee2[ 0]; + ee0[-1] = ee0[-1] + ee2[-1]; + ee2[ 0] = (k00) * A0 - (k11) * A1; + ee2[-1] = (k11) * A0 + (k00) * A1; + + k00 = ee0[-2] - ee2[-2]; + k11 = ee0[-3] - ee2[-3]; + ee0[-2] = ee0[-2] + ee2[-2]; + ee0[-3] = ee0[-3] + ee2[-3]; + ee2[-2] = (k00) * A2 - (k11) * A3; + ee2[-3] = (k11) * A2 + (k00) * A3; + + k00 = ee0[-4] - ee2[-4]; + k11 = ee0[-5] - ee2[-5]; + ee0[-4] = ee0[-4] + ee2[-4]; + ee0[-5] = ee0[-5] + ee2[-5]; + ee2[-4] = (k00) * A4 - (k11) * A5; + ee2[-5] = (k11) * A4 + (k00) * A5; + + k00 = ee0[-6] - ee2[-6]; + k11 = ee0[-7] - ee2[-7]; + ee0[-6] = ee0[-6] + ee2[-6]; + ee0[-7] = ee0[-7] + ee2[-7]; + ee2[-6] = (k00) * A6 - (k11) * A7; + ee2[-7] = (k11) * A6 + (k00) * A7; + + ee0 -= k0; + ee2 -= k0; + } +} + +static __forceinline void iter_54(float *z) +{ + float k00,k11,k22,k33; + float y0,y1,y2,y3; + + k00 = z[ 0] - z[-4]; + y0 = z[ 0] + z[-4]; + y2 = z[-2] + z[-6]; + k22 = z[-2] - z[-6]; + + z[-0] = y0 + y2; // z0 + z4 + z2 + z6 + z[-2] = y0 - y2; // z0 + z4 - z2 - z6 + + // done with y0,y2 + + k33 = z[-3] - z[-7]; + + z[-4] = k00 + k33; // z0 - z4 + z3 - z7 + z[-6] = k00 - k33; // z0 - z4 - z3 + z7 + + // done with k33 + + k11 = z[-1] - z[-5]; + y1 = z[-1] + z[-5]; + y3 = z[-3] + z[-7]; + + z[-1] = y1 + y3; // z1 + z5 + z3 + z7 + z[-3] = y1 - y3; // z1 + z5 - z3 - z7 + z[-5] = k11 - k22; // z1 - z5 + z2 - z6 + z[-7] = k11 + k22; // z1 - z5 - z2 + z6 +} + +static void imdct_step3_inner_s_loop_ld654(int n, float *e, int i_off, float *A, int base_n) +{ + int a_off = base_n >> 3; + float A2 = A[0+a_off]; + float *z = e + i_off; + float *base = z - 16 * n; + + while (z > base) { + float k00,k11; + + k00 = z[-0] - z[-8]; + k11 = z[-1] - z[-9]; + z[-0] = z[-0] + z[-8]; + z[-1] = z[-1] + z[-9]; + z[-8] = k00; + z[-9] = k11 ; + + k00 = z[ -2] - z[-10]; + k11 = z[ -3] - z[-11]; + z[ -2] = z[ -2] + z[-10]; + z[ -3] = z[ -3] + z[-11]; + z[-10] = (k00+k11) * A2; + z[-11] = (k11-k00) * A2; + + k00 = z[-12] - z[ -4]; // reverse to avoid a unary negation + k11 = z[ -5] - z[-13]; + z[ -4] = z[ -4] + z[-12]; + z[ -5] = z[ -5] + z[-13]; + z[-12] = k11; + z[-13] = k00; + + k00 = z[-14] - z[ -6]; // reverse to avoid a unary negation + k11 = z[ -7] - z[-15]; + z[ -6] = z[ -6] + z[-14]; + z[ -7] = z[ -7] + z[-15]; + z[-14] = (k00+k11) * A2; + z[-15] = (k00-k11) * A2; + + iter_54(z); + iter_54(z-8); + z -= 16; + } +} + +static void inverse_mdct(float *buffer, int n, vorb *f, int blocktype) +{ + int n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; + int ld; + // @OPTIMIZE: reduce register pressure by using fewer variables? + int save_point = temp_alloc_save(f); + float *buf2 = (float *) temp_alloc(f, n2 * sizeof(*buf2)); + float *u=NULL,*v=NULL; + // twiddle factors + float *A = f->A[blocktype]; + + // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" + // See notes about bugs in that paper in less-optimal implementation 'inverse_mdct_old' after this function. + + // kernel from paper + + + // merged: + // copy and reflect spectral data + // step 0 + + // note that it turns out that the items added together during + // this step are, in fact, being added to themselves (as reflected + // by step 0). inexplicable inefficiency! this became obvious + // once I combined the passes. + + // so there's a missing 'times 2' here (for adding X to itself). + // this propagates through linearly to the end, where the numbers + // are 1/2 too small, and need to be compensated for. + + { + float *d,*e, *AA, *e_stop; + d = &buf2[n2-2]; + AA = A; + e = &buffer[0]; + e_stop = &buffer[n2]; + while (e != e_stop) { + d[1] = (e[0] * AA[0] - e[2]*AA[1]); + d[0] = (e[0] * AA[1] + e[2]*AA[0]); + d -= 2; + AA += 2; + e += 4; + } + + e = &buffer[n2-3]; + while (d >= buf2) { + d[1] = (-e[2] * AA[0] - -e[0]*AA[1]); + d[0] = (-e[2] * AA[1] + -e[0]*AA[0]); + d -= 2; + AA += 2; + e -= 4; + } + } + + // now we use symbolic names for these, so that we can + // possibly swap their meaning as we change which operations + // are in place + + u = buffer; + v = buf2; + + // step 2 (paper output is w, now u) + // this could be in place, but the data ends up in the wrong + // place... _somebody_'s got to swap it, so this is nominated + { + float *AA = &A[n2-8]; + float *d0,*d1, *e0, *e1; + + e0 = &v[n4]; + e1 = &v[0]; + + d0 = &u[n4]; + d1 = &u[0]; + + while (AA >= A) { + float v40_20, v41_21; + + v41_21 = e0[1] - e1[1]; + v40_20 = e0[0] - e1[0]; + d0[1] = e0[1] + e1[1]; + d0[0] = e0[0] + e1[0]; + d1[1] = v41_21*AA[4] - v40_20*AA[5]; + d1[0] = v40_20*AA[4] + v41_21*AA[5]; + + v41_21 = e0[3] - e1[3]; + v40_20 = e0[2] - e1[2]; + d0[3] = e0[3] + e1[3]; + d0[2] = e0[2] + e1[2]; + d1[3] = v41_21*AA[0] - v40_20*AA[1]; + d1[2] = v40_20*AA[0] + v41_21*AA[1]; + + AA -= 8; + + d0 += 4; + d1 += 4; + e0 += 4; + e1 += 4; + } + } + + // step 3 + ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + + // optimized step 3: + + // the original step3 loop can be nested r inside s or s inside r; + // it's written originally as s inside r, but this is dumb when r + // iterates many times, and s few. So I have two copies of it and + // switch between them halfway. + + // this is iteration 0 of step 3 + imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*0, -(n >> 3), A); + imdct_step3_iter0_loop(n >> 4, u, n2-1-n4*1, -(n >> 3), A); + + // this is iteration 1 of step 3 + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*0, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*1, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*2, -(n >> 4), A, 16); + imdct_step3_inner_r_loop(n >> 5, u, n2-1 - n8*3, -(n >> 4), A, 16); + + l=2; + for (; l < (ld-3)>>1; ++l) { + int k0 = n >> (l+2), k0_2 = k0>>1; + int lim = 1 << (l+1); + int i; + for (i=0; i < lim; ++i) + imdct_step3_inner_r_loop(n >> (l+4), u, n2-1 - k0*i, -k0_2, A, 1 << (l+3)); + } + + for (; l < ld-6; ++l) { + int k0 = n >> (l+2), k1 = 1 << (l+3), k0_2 = k0>>1; + int rlim = n >> (l+6), r; + int lim = 1 << (l+1); + int i_off; + float *A0 = A; + i_off = n2-1; + for (r=rlim; r > 0; --r) { + imdct_step3_inner_s_loop(lim, u, i_off, -k0_2, A0, k1, k0); + A0 += k1*4; + i_off -= 8; + } + } + + // iterations with count: + // ld-6,-5,-4 all interleaved together + // the big win comes from getting rid of needless flops + // due to the constants on pass 5 & 4 being all 1 and 0; + // combining them to be simultaneous to improve cache made little difference + imdct_step3_inner_s_loop_ld654(n >> 5, u, n2-1, A, n); + + // output is u + + // step 4, 5, and 6 + // cannot be in-place because of step 5 + { + uint16 *bitrev = f->bit_reverse[blocktype]; + // weirdly, I'd have thought reading sequentially and writing + // erratically would have been better than vice-versa, but in + // fact that's not what my testing showed. (That is, with + // j = bitreverse(i), do you read i and write j, or read j and write i.) + + float *d0 = &v[n4-4]; + float *d1 = &v[n2-4]; + while (d0 >= v) { + int k4; + + k4 = bitrev[0]; + d1[3] = u[k4+0]; + d1[2] = u[k4+1]; + d0[3] = u[k4+2]; + d0[2] = u[k4+3]; + + k4 = bitrev[1]; + d1[1] = u[k4+0]; + d1[0] = u[k4+1]; + d0[1] = u[k4+2]; + d0[0] = u[k4+3]; + + d0 -= 4; + d1 -= 4; + bitrev += 2; + } + } + // (paper output is u, now v) + + + // data must be in buf2 + assert(v == buf2); + + // step 7 (paper output is v, now v) + // this is now in place + { + float *C = f->C[blocktype]; + float *d, *e; + + d = v; + e = v + n2 - 4; + + while (d < e) { + float a02,a11,b0,b1,b2,b3; + + a02 = d[0] - e[2]; + a11 = d[1] + e[3]; + + b0 = C[1]*a02 + C[0]*a11; + b1 = C[1]*a11 - C[0]*a02; + + b2 = d[0] + e[ 2]; + b3 = d[1] - e[ 3]; + + d[0] = b2 + b0; + d[1] = b3 + b1; + e[2] = b2 - b0; + e[3] = b1 - b3; + + a02 = d[2] - e[0]; + a11 = d[3] + e[1]; + + b0 = C[3]*a02 + C[2]*a11; + b1 = C[3]*a11 - C[2]*a02; + + b2 = d[2] + e[ 0]; + b3 = d[3] - e[ 1]; + + d[2] = b2 + b0; + d[3] = b3 + b1; + e[0] = b2 - b0; + e[1] = b1 - b3; + + C += 4; + d += 4; + e -= 4; + } + } + + // data must be in buf2 + + + // step 8+decode (paper output is X, now buffer) + // this generates pairs of data a la 8 and pushes them directly through + // the decode kernel (pushing rather than pulling) to avoid having + // to make another pass later + + // this cannot POSSIBLY be in place, so we refer to the buffers directly + + { + float *d0,*d1,*d2,*d3; + + float *B = f->B[blocktype] + n2 - 8; + float *e = buf2 + n2 - 8; + d0 = &buffer[0]; + d1 = &buffer[n2-4]; + d2 = &buffer[n2]; + d3 = &buffer[n-4]; + while (e >= v) { + float p0,p1,p2,p3; + + p3 = e[6]*B[7] - e[7]*B[6]; + p2 = -e[6]*B[6] - e[7]*B[7]; + + d0[0] = p3; + d1[3] = - p3; + d2[0] = p2; + d3[3] = p2; + + p1 = e[4]*B[5] - e[5]*B[4]; + p0 = -e[4]*B[4] - e[5]*B[5]; + + d0[1] = p1; + d1[2] = - p1; + d2[1] = p0; + d3[2] = p0; + + p3 = e[2]*B[3] - e[3]*B[2]; + p2 = -e[2]*B[2] - e[3]*B[3]; + + d0[2] = p3; + d1[1] = - p3; + d2[2] = p2; + d3[1] = p2; + + p1 = e[0]*B[1] - e[1]*B[0]; + p0 = -e[0]*B[0] - e[1]*B[1]; + + d0[3] = p1; + d1[0] = - p1; + d2[3] = p0; + d3[0] = p0; + + B -= 8; + e -= 8; + d0 += 4; + d2 += 4; + d1 -= 4; + d3 -= 4; + } + } + + temp_free(f,buf2); + temp_alloc_restore(f,save_point); +} + +#if 0 +// this is the original version of the above code, if you want to optimize it from scratch +void inverse_mdct_naive(float *buffer, int n) +{ + float s; + float A[1 << 12], B[1 << 12], C[1 << 11]; + int i,k,k2,k4, n2 = n >> 1, n4 = n >> 2, n8 = n >> 3, l; + int n3_4 = n - n4, ld; + // how can they claim this only uses N words?! + // oh, because they're only used sparsely, whoops + float u[1 << 13], X[1 << 13], v[1 << 13], w[1 << 13]; + // set up twiddle factors + + for (k=k2=0; k < n4; ++k,k2+=2) { + A[k2 ] = (float) cos(4*k*M_PI/n); + A[k2+1] = (float) -sin(4*k*M_PI/n); + B[k2 ] = (float) cos((k2+1)*M_PI/n/2); + B[k2+1] = (float) sin((k2+1)*M_PI/n/2); + } + for (k=k2=0; k < n8; ++k,k2+=2) { + C[k2 ] = (float) cos(2*(k2+1)*M_PI/n); + C[k2+1] = (float) -sin(2*(k2+1)*M_PI/n); + } + + // IMDCT algorithm from "The use of multirate filter banks for coding of high quality digital audio" + // Note there are bugs in that pseudocode, presumably due to them attempting + // to rename the arrays nicely rather than representing the way their actual + // implementation bounces buffers back and forth. As a result, even in the + // "some formulars corrected" version, a direct implementation fails. These + // are noted below as "paper bug". + + // copy and reflect spectral data + for (k=0; k < n2; ++k) u[k] = buffer[k]; + for ( ; k < n ; ++k) u[k] = -buffer[n - k - 1]; + // kernel from paper + // step 1 + for (k=k2=k4=0; k < n4; k+=1, k2+=2, k4+=4) { + v[n-k4-1] = (u[k4] - u[n-k4-1]) * A[k2] - (u[k4+2] - u[n-k4-3])*A[k2+1]; + v[n-k4-3] = (u[k4] - u[n-k4-1]) * A[k2+1] + (u[k4+2] - u[n-k4-3])*A[k2]; + } + // step 2 + for (k=k4=0; k < n8; k+=1, k4+=4) { + w[n2+3+k4] = v[n2+3+k4] + v[k4+3]; + w[n2+1+k4] = v[n2+1+k4] + v[k4+1]; + w[k4+3] = (v[n2+3+k4] - v[k4+3])*A[n2-4-k4] - (v[n2+1+k4]-v[k4+1])*A[n2-3-k4]; + w[k4+1] = (v[n2+1+k4] - v[k4+1])*A[n2-4-k4] + (v[n2+3+k4]-v[k4+3])*A[n2-3-k4]; + } + // step 3 + ld = ilog(n) - 1; // ilog is off-by-one from normal definitions + for (l=0; l < ld-3; ++l) { + int k0 = n >> (l+2), k1 = 1 << (l+3); + int rlim = n >> (l+4), r4, r; + int s2lim = 1 << (l+2), s2; + for (r=r4=0; r < rlim; r4+=4,++r) { + for (s2=0; s2 < s2lim; s2+=2) { + u[n-1-k0*s2-r4] = w[n-1-k0*s2-r4] + w[n-1-k0*(s2+1)-r4]; + u[n-3-k0*s2-r4] = w[n-3-k0*s2-r4] + w[n-3-k0*(s2+1)-r4]; + u[n-1-k0*(s2+1)-r4] = (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1] + - (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1+1]; + u[n-3-k0*(s2+1)-r4] = (w[n-3-k0*s2-r4] - w[n-3-k0*(s2+1)-r4]) * A[r*k1] + + (w[n-1-k0*s2-r4] - w[n-1-k0*(s2+1)-r4]) * A[r*k1+1]; + } + } + if (l+1 < ld-3) { + // paper bug: ping-ponging of u&w here is omitted + memcpy(w, u, sizeof(u)); + } + } + + // step 4 + for (i=0; i < n8; ++i) { + int j = bit_reverse(i) >> (32-ld+3); + assert(j < n8); + if (i == j) { + // paper bug: original code probably swapped in place; if copying, + // need to directly copy in this case + int i8 = i << 3; + v[i8+1] = u[i8+1]; + v[i8+3] = u[i8+3]; + v[i8+5] = u[i8+5]; + v[i8+7] = u[i8+7]; + } else if (i < j) { + int i8 = i << 3, j8 = j << 3; + v[j8+1] = u[i8+1], v[i8+1] = u[j8 + 1]; + v[j8+3] = u[i8+3], v[i8+3] = u[j8 + 3]; + v[j8+5] = u[i8+5], v[i8+5] = u[j8 + 5]; + v[j8+7] = u[i8+7], v[i8+7] = u[j8 + 7]; + } + } + // step 5 + for (k=0; k < n2; ++k) { + w[k] = v[k*2+1]; + } + // step 6 + for (k=k2=k4=0; k < n8; ++k, k2 += 2, k4 += 4) { + u[n-1-k2] = w[k4]; + u[n-2-k2] = w[k4+1]; + u[n3_4 - 1 - k2] = w[k4+2]; + u[n3_4 - 2 - k2] = w[k4+3]; + } + // step 7 + for (k=k2=0; k < n8; ++k, k2 += 2) { + v[n2 + k2 ] = ( u[n2 + k2] + u[n-2-k2] + C[k2+1]*(u[n2+k2]-u[n-2-k2]) + C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; + v[n-2 - k2] = ( u[n2 + k2] + u[n-2-k2] - C[k2+1]*(u[n2+k2]-u[n-2-k2]) - C[k2]*(u[n2+k2+1]+u[n-2-k2+1]))/2; + v[n2+1+ k2] = ( u[n2+1+k2] - u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; + v[n-1 - k2] = (-u[n2+1+k2] + u[n-1-k2] + C[k2+1]*(u[n2+1+k2]+u[n-1-k2]) - C[k2]*(u[n2+k2]-u[n-2-k2]))/2; + } + // step 8 + for (k=k2=0; k < n4; ++k,k2 += 2) { + X[k] = v[k2+n2]*B[k2 ] + v[k2+1+n2]*B[k2+1]; + X[n2-1-k] = v[k2+n2]*B[k2+1] - v[k2+1+n2]*B[k2 ]; + } + + // decode kernel to output + // determined the following value experimentally + // (by first figuring out what made inverse_mdct_slow work); then matching that here + // (probably vorbis encoder premultiplies by n or n/2, to save it on the decoder?) + s = 0.5; // theoretically would be n4 + + // [[[ note! the s value of 0.5 is compensated for by the B[] in the current code, + // so it needs to use the "old" B values to behave correctly, or else + // set s to 1.0 ]]] + for (i=0; i < n4 ; ++i) buffer[i] = s * X[i+n4]; + for ( ; i < n3_4; ++i) buffer[i] = -s * X[n3_4 - i - 1]; + for ( ; i < n ; ++i) buffer[i] = -s * X[i - n3_4]; +} +#endif + +static float *get_window(vorb *f, int len) +{ + len <<= 1; + if (len == f->blocksize_0) return f->window[0]; + if (len == f->blocksize_1) return f->window[1]; + assert(0); + return NULL; +} + +#ifndef STB_VORBIS_NO_DEFER_FLOOR +typedef int16 YTYPE; +#else +typedef int YTYPE; +#endif +static int do_floor(vorb *f, Mapping *map, int i, int n, float *target, YTYPE *finalY, uint8 *step2_flag) +{ + int n2 = n >> 1; + int s = map->chan[i].mux, floor; + floor = map->submap_floor[s]; + if (f->floor_types[floor] == 0) { + return error(f, VORBIS_invalid_stream); + } else { + Floor1 *g = &f->floor_config[floor].floor1; + int j,q; + int lx = 0, ly = finalY[0] * g->floor1_multiplier; + for (q=1; q < g->values; ++q) { + j = g->sorted_order[q]; + #ifndef STB_VORBIS_NO_DEFER_FLOOR + if (finalY[j] >= 0) + #else + if (step2_flag[j]) + #endif + { + int hy = finalY[j] * g->floor1_multiplier; + int hx = g->Xlist[j]; + if (lx != hx) + draw_line(target, lx,ly, hx,hy, n2); + CHECK(f); + lx = hx, ly = hy; + } + } + if (lx < n2) { + // optimization of: draw_line(target, lx,ly, n,ly, n2); + for (j=lx; j < n2; ++j) + LINE_OP(target[j], inverse_db_table[ly]); + CHECK(f); + } + } + return TRUE; +} + +// The meaning of "left" and "right" +// +// For a given frame: +// we compute samples from 0..n +// window_center is n/2 +// we'll window and mix the samples from left_start to left_end with data from the previous frame +// all of the samples from left_end to right_start can be output without mixing; however, +// this interval is 0-length except when transitioning between short and long frames +// all of the samples from right_start to right_end need to be mixed with the next frame, +// which we don't have, so those get saved in a buffer +// frame N's right_end-right_start, the number of samples to mix with the next frame, +// has to be the same as frame N+1's left_end-left_start (which they are by +// construction) + +static int vorbis_decode_initial(vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode) +{ + Mode *m; + int i, n, prev, next, window_center; + f->channel_buffer_start = f->channel_buffer_end = 0; + + retry: + if (f->eof) return FALSE; + if (!maybe_start_packet(f)) + return FALSE; + // check packet type + if (get_bits(f,1) != 0) { + if (IS_PUSH_MODE(f)) + return error(f,VORBIS_bad_packet_type); + while (EOP != get8_packet(f)); + goto retry; + } + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + + i = get_bits(f, ilog(f->mode_count-1)); + if (i == EOP) return FALSE; + if (i >= f->mode_count) return FALSE; + *mode = i; + m = f->mode_config + i; + if (m->blockflag) { + n = f->blocksize_1; + prev = get_bits(f,1); + next = get_bits(f,1); + } else { + prev = next = 0; + n = f->blocksize_0; + } + +// WINDOWING + + window_center = n >> 1; + if (m->blockflag && !prev) { + *p_left_start = (n - f->blocksize_0) >> 2; + *p_left_end = (n + f->blocksize_0) >> 2; + } else { + *p_left_start = 0; + *p_left_end = window_center; + } + if (m->blockflag && !next) { + *p_right_start = (n*3 - f->blocksize_0) >> 2; + *p_right_end = (n*3 + f->blocksize_0) >> 2; + } else { + *p_right_start = window_center; + *p_right_end = n; + } + + return TRUE; +} + +static int vorbis_decode_packet_rest(vorb *f, int *len, Mode *m, int left_start, int left_end, int right_start, int right_end, int *p_left) +{ + Mapping *map; + int i,j,k,n,n2; + int zero_channel[256]; + int really_zero_channel[256]; + +// WINDOWING + + n = f->blocksize[m->blockflag]; + map = &f->mapping[m->mapping]; + +// FLOORS + n2 = n >> 1; + + CHECK(f); + + for (i=0; i < f->channels; ++i) { + int s = map->chan[i].mux, floor; + zero_channel[i] = FALSE; + floor = map->submap_floor[s]; + if (f->floor_types[floor] == 0) { + return error(f, VORBIS_invalid_stream); + } else { + Floor1 *g = &f->floor_config[floor].floor1; + if (get_bits(f, 1)) { + short *finalY; + uint8 step2_flag[256]; + static int range_list[4] = { 256, 128, 86, 64 }; + int range = range_list[g->floor1_multiplier-1]; + int offset = 2; + finalY = f->finalY[i]; + finalY[0] = get_bits(f, ilog(range)-1); + finalY[1] = get_bits(f, ilog(range)-1); + for (j=0; j < g->partitions; ++j) { + int pclass = g->partition_class_list[j]; + int cdim = g->class_dimensions[pclass]; + int cbits = g->class_subclasses[pclass]; + int csub = (1 << cbits)-1; + int cval = 0; + if (cbits) { + Codebook *c = f->codebooks + g->class_masterbooks[pclass]; + DECODE(cval,f,c); + } + for (k=0; k < cdim; ++k) { + int book = g->subclass_books[pclass][cval & csub]; + cval = cval >> cbits; + if (book >= 0) { + int temp; + Codebook *c = f->codebooks + book; + DECODE(temp,f,c); + finalY[offset++] = temp; + } else + finalY[offset++] = 0; + } + } + if (f->valid_bits == INVALID_BITS) goto error; // behavior according to spec + step2_flag[0] = step2_flag[1] = 1; + for (j=2; j < g->values; ++j) { + int low, high, pred, highroom, lowroom, room, val; + low = g->neighbors[j][0]; + high = g->neighbors[j][1]; + //neighbors(g->Xlist, j, &low, &high); + pred = predict_point(g->Xlist[j], g->Xlist[low], g->Xlist[high], finalY[low], finalY[high]); + val = finalY[j]; + highroom = range - pred; + lowroom = pred; + if (highroom < lowroom) + room = highroom * 2; + else + room = lowroom * 2; + if (val) { + step2_flag[low] = step2_flag[high] = 1; + step2_flag[j] = 1; + if (val >= room) + if (highroom > lowroom) + finalY[j] = val - lowroom + pred; + else + finalY[j] = pred - val + highroom - 1; + else + if (val & 1) + finalY[j] = pred - ((val+1)>>1); + else + finalY[j] = pred + (val>>1); + } else { + step2_flag[j] = 0; + finalY[j] = pred; + } + } + +#ifdef STB_VORBIS_NO_DEFER_FLOOR + do_floor(f, map, i, n, f->floor_buffers[i], finalY, step2_flag); +#else + // defer final floor computation until _after_ residue + for (j=0; j < g->values; ++j) { + if (!step2_flag[j]) + finalY[j] = -1; + } +#endif + } else { + error: + zero_channel[i] = TRUE; + } + // So we just defer everything else to later + + // at this point we've decoded the floor into buffer + } + } + CHECK(f); + // at this point we've decoded all floors + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + + // re-enable coupled channels if necessary + memcpy(really_zero_channel, zero_channel, sizeof(really_zero_channel[0]) * f->channels); + for (i=0; i < map->coupling_steps; ++i) + if (!zero_channel[map->chan[i].magnitude] || !zero_channel[map->chan[i].angle]) { + zero_channel[map->chan[i].magnitude] = zero_channel[map->chan[i].angle] = FALSE; + } + + CHECK(f); +// RESIDUE DECODE + for (i=0; i < map->submaps; ++i) { + float *residue_buffers[STB_VORBIS_MAX_CHANNELS]; + int r; + uint8 do_not_decode[256]; + int ch = 0; + for (j=0; j < f->channels; ++j) { + if (map->chan[j].mux == i) { + if (zero_channel[j]) { + do_not_decode[ch] = TRUE; + residue_buffers[ch] = NULL; + } else { + do_not_decode[ch] = FALSE; + residue_buffers[ch] = f->channel_buffers[j]; + } + ++ch; + } + } + r = map->submap_residue[i]; + decode_residue(f, residue_buffers, ch, n2, r, do_not_decode); + } + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + CHECK(f); + +// INVERSE COUPLING + for (i = map->coupling_steps-1; i >= 0; --i) { + int n2 = n >> 1; + float *m = f->channel_buffers[map->chan[i].magnitude]; + float *a = f->channel_buffers[map->chan[i].angle ]; + for (j=0; j < n2; ++j) { + float a2,m2; + if (m[j] > 0) + if (a[j] > 0) + m2 = m[j], a2 = m[j] - a[j]; + else + a2 = m[j], m2 = m[j] + a[j]; + else + if (a[j] > 0) + m2 = m[j], a2 = m[j] + a[j]; + else + a2 = m[j], m2 = m[j] - a[j]; + m[j] = m2; + a[j] = a2; + } + } + CHECK(f); + + // finish decoding the floors +#ifndef STB_VORBIS_NO_DEFER_FLOOR + for (i=0; i < f->channels; ++i) { + if (really_zero_channel[i]) { + memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); + } else { + do_floor(f, map, i, n, f->channel_buffers[i], f->finalY[i], NULL); + } + } +#else + for (i=0; i < f->channels; ++i) { + if (really_zero_channel[i]) { + memset(f->channel_buffers[i], 0, sizeof(*f->channel_buffers[i]) * n2); + } else { + for (j=0; j < n2; ++j) + f->channel_buffers[i][j] *= f->floor_buffers[i][j]; + } + } +#endif + +// INVERSE MDCT + CHECK(f); + for (i=0; i < f->channels; ++i) + inverse_mdct(f->channel_buffers[i], n, f, m->blockflag); + CHECK(f); + + // this shouldn't be necessary, unless we exited on an error + // and want to flush to get to the next packet + flush_packet(f); + + if (f->first_decode) { + // assume we start so first non-discarded sample is sample 0 + // this isn't to spec, but spec would require us to read ahead + // and decode the size of all current frames--could be done, + // but presumably it's not a commonly used feature + f->current_loc = -n2; // start of first frame is positioned for discard + // we might have to discard samples "from" the next frame too, + // if we're lapping a large block then a small at the start? + f->discard_samples_deferred = n - right_end; + f->current_loc_valid = TRUE; + f->first_decode = FALSE; + } else if (f->discard_samples_deferred) { + if (f->discard_samples_deferred >= right_start - left_start) { + f->discard_samples_deferred -= (right_start - left_start); + left_start = right_start; + *p_left = left_start; + } else { + left_start += f->discard_samples_deferred; + *p_left = left_start; + f->discard_samples_deferred = 0; + } + } else if (f->previous_length == 0 && f->current_loc_valid) { + // we're recovering from a seek... that means we're going to discard + // the samples from this packet even though we know our position from + // the last page header, so we need to update the position based on + // the discarded samples here + // but wait, the code below is going to add this in itself even + // on a discard, so we don't need to do it here... + } + + // check if we have ogg information about the sample # for this packet + if (f->last_seg_which == f->end_seg_with_known_loc) { + // if we have a valid current loc, and this is final: + if (f->current_loc_valid && (f->page_flag & PAGEFLAG_last_page)) { + uint32 current_end = f->known_loc_for_packet; + // then let's infer the size of the (probably) short final frame + if (current_end < f->current_loc + (right_end-left_start)) { + if (current_end < f->current_loc) { + // negative truncation, that's impossible! + *len = 0; + } else { + *len = current_end - f->current_loc; + } + *len += left_start; // this doesn't seem right, but has no ill effect on my test files + if (*len > right_end) *len = right_end; // this should never happen + f->current_loc += *len; + return TRUE; + } + } + // otherwise, just set our sample loc + // guess that the ogg granule pos refers to the _middle_ of the + // last frame? + // set f->current_loc to the position of left_start + f->current_loc = f->known_loc_for_packet - (n2-left_start); + f->current_loc_valid = TRUE; + } + if (f->current_loc_valid) + f->current_loc += (right_start - left_start); + + if (f->alloc.alloc_buffer) + assert(f->alloc.alloc_buffer_length_in_bytes == f->temp_offset); + *len = right_end; // ignore samples after the window goes to 0 + CHECK(f); + + return TRUE; +} + +static int vorbis_decode_packet(vorb *f, int *len, int *p_left, int *p_right) +{ + int mode, left_end, right_end; + if (!vorbis_decode_initial(f, p_left, &left_end, p_right, &right_end, &mode)) return 0; + return vorbis_decode_packet_rest(f, len, f->mode_config + mode, *p_left, left_end, *p_right, right_end, p_left); +} + +static int vorbis_finish_frame(stb_vorbis *f, int len, int left, int right) +{ + int prev,i,j; + // we use right&left (the start of the right- and left-window sin()-regions) + // to determine how much to return, rather than inferring from the rules + // (same result, clearer code); 'left' indicates where our sin() window + // starts, therefore where the previous window's right edge starts, and + // therefore where to start mixing from the previous buffer. 'right' + // indicates where our sin() ending-window starts, therefore that's where + // we start saving, and where our returned-data ends. + + // mixin from previous window + if (f->previous_length) { + int i,j, n = f->previous_length; + float *w = get_window(f, n); + for (i=0; i < f->channels; ++i) { + for (j=0; j < n; ++j) + f->channel_buffers[i][left+j] = + f->channel_buffers[i][left+j]*w[ j] + + f->previous_window[i][ j]*w[n-1-j]; + } + } + + prev = f->previous_length; + + // last half of this data becomes previous window + f->previous_length = len - right; + + // @OPTIMIZE: could avoid this copy by double-buffering the + // output (flipping previous_window with channel_buffers), but + // then previous_window would have to be 2x as large, and + // channel_buffers couldn't be temp mem (although they're NOT + // currently temp mem, they could be (unless we want to level + // performance by spreading out the computation)) + for (i=0; i < f->channels; ++i) + for (j=0; right+j < len; ++j) + f->previous_window[i][j] = f->channel_buffers[i][right+j]; + + if (!prev) + // there was no previous packet, so this data isn't valid... + // this isn't entirely true, only the would-have-overlapped data + // isn't valid, but this seems to be what the spec requires + return 0; + + // truncate a short frame + if (len < right) right = len; + + f->samples_output += right-left; + + return right - left; +} + +static int vorbis_pump_first_frame(stb_vorbis *f) +{ + int len, right, left, res; + res = vorbis_decode_packet(f, &len, &left, &right); + if (res) + vorbis_finish_frame(f, len, left, right); + return res; +} + +#ifndef STB_VORBIS_NO_PUSHDATA_API +static int is_whole_packet_present(stb_vorbis *f, int end_page) +{ + // make sure that we have the packet available before continuing... + // this requires a full ogg parse, but we know we can fetch from f->stream + + // instead of coding this out explicitly, we could save the current read state, + // read the next packet with get8() until end-of-packet, check f->eof, then + // reset the state? but that would be slower, esp. since we'd have over 256 bytes + // of state to restore (primarily the page segment table) + + int s = f->next_seg, first = TRUE; + uint8 *p = f->stream; + + if (s != -1) { // if we're not starting the packet with a 'continue on next page' flag + for (; s < f->segment_count; ++s) { + p += f->segments[s]; + if (f->segments[s] < 255) // stop at first short segment + break; + } + // either this continues, or it ends it... + if (end_page) + if (s < f->segment_count-1) return error(f, VORBIS_invalid_stream); + if (s == f->segment_count) + s = -1; // set 'crosses page' flag + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + first = FALSE; + } + for (; s == -1;) { + uint8 *q; + int n; + + // check that we have the page header ready + if (p + 26 >= f->stream_end) return error(f, VORBIS_need_more_data); + // validate the page + if (memcmp(p, ogg_page_header, 4)) return error(f, VORBIS_invalid_stream); + if (p[4] != 0) return error(f, VORBIS_invalid_stream); + if (first) { // the first segment must NOT have 'continued_packet', later ones MUST + if (f->previous_length) + if ((p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); + // if no previous length, we're resynching, so we can come in on a continued-packet, + // which we'll just drop + } else { + if (!(p[5] & PAGEFLAG_continued_packet)) return error(f, VORBIS_invalid_stream); + } + n = p[26]; // segment counts + q = p+27; // q points to segment table + p = q + n; // advance past header + // make sure we've read the segment table + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + for (s=0; s < n; ++s) { + p += q[s]; + if (q[s] < 255) + break; + } + if (end_page) + if (s < n-1) return error(f, VORBIS_invalid_stream); + if (s == n) + s = -1; // set 'crosses page' flag + if (p > f->stream_end) return error(f, VORBIS_need_more_data); + first = FALSE; + } + return TRUE; +} +#endif // !STB_VORBIS_NO_PUSHDATA_API + +static int start_decoder(vorb *f) +{ + uint8 header[6], x,y; + int len,i,j,k, max_submaps = 0; + int longest_floorlist=0; + + // first page, first packet + + if (!start_page(f)) return FALSE; + // validate page flag + if (!(f->page_flag & PAGEFLAG_first_page)) return error(f, VORBIS_invalid_first_page); + if (f->page_flag & PAGEFLAG_last_page) return error(f, VORBIS_invalid_first_page); + if (f->page_flag & PAGEFLAG_continued_packet) return error(f, VORBIS_invalid_first_page); + // check for expected packet length + if (f->segment_count != 1) return error(f, VORBIS_invalid_first_page); + if (f->segments[0] != 30) { + // check for the Ogg skeleton fishead identifying header to refine our error + if (f->segments[0] == 64 && + getn(f, header, 6) && + header[0] == 'f' && + header[1] == 'i' && + header[2] == 's' && + header[3] == 'h' && + header[4] == 'e' && + header[5] == 'a' && + get8(f) == 'd' && + get8(f) == '\0') return error(f, VORBIS_ogg_skeleton_not_supported); + else + return error(f, VORBIS_invalid_first_page); + } + + // read packet + // check packet header + if (get8(f) != VORBIS_packet_id) return error(f, VORBIS_invalid_first_page); + if (!getn(f, header, 6)) return error(f, VORBIS_unexpected_eof); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_first_page); + // vorbis_version + if (get32(f) != 0) return error(f, VORBIS_invalid_first_page); + f->channels = get8(f); if (!f->channels) return error(f, VORBIS_invalid_first_page); + if (f->channels > STB_VORBIS_MAX_CHANNELS) return error(f, VORBIS_too_many_channels); + f->sample_rate = get32(f); if (!f->sample_rate) return error(f, VORBIS_invalid_first_page); + get32(f); // bitrate_maximum + get32(f); // bitrate_nominal + get32(f); // bitrate_minimum + x = get8(f); + { + int log0,log1; + log0 = x & 15; + log1 = x >> 4; + f->blocksize_0 = 1 << log0; + f->blocksize_1 = 1 << log1; + if (log0 < 6 || log0 > 13) return error(f, VORBIS_invalid_setup); + if (log1 < 6 || log1 > 13) return error(f, VORBIS_invalid_setup); + if (log0 > log1) return error(f, VORBIS_invalid_setup); + } + + // framing_flag + x = get8(f); + if (!(x & 1)) return error(f, VORBIS_invalid_first_page); + + // second packet! + if (!start_page(f)) return FALSE; + + if (!start_packet(f)) return FALSE; + do { + len = next_segment(f); + skip(f, len); + f->bytes_in_seg = 0; + } while (len); + + // third packet! + if (!start_packet(f)) return FALSE; + + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (IS_PUSH_MODE(f)) { + if (!is_whole_packet_present(f, TRUE)) { + // convert error in ogg header to write type + if (f->error == VORBIS_invalid_stream) + f->error = VORBIS_invalid_setup; + return FALSE; + } + } + #endif + + crc32_init(); // always init it, to avoid multithread race conditions + + if (get8_packet(f) != VORBIS_packet_setup) return error(f, VORBIS_invalid_setup); + for (i=0; i < 6; ++i) header[i] = get8_packet(f); + if (!vorbis_validate(header)) return error(f, VORBIS_invalid_setup); + + // codebooks + + f->codebook_count = get_bits(f,8) + 1; + f->codebooks = (Codebook *) setup_malloc(f, sizeof(*f->codebooks) * f->codebook_count); + if (f->codebooks == NULL) return error(f, VORBIS_outofmem); + memset(f->codebooks, 0, sizeof(*f->codebooks) * f->codebook_count); + for (i=0; i < f->codebook_count; ++i) { + uint32 *values; + int ordered, sorted_count; + int total=0; + uint8 *lengths; + Codebook *c = f->codebooks+i; + CHECK(f); + x = get_bits(f, 8); if (x != 0x42) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); if (x != 0x43) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); if (x != 0x56) return error(f, VORBIS_invalid_setup); + x = get_bits(f, 8); + c->dimensions = (get_bits(f, 8)<<8) + x; + x = get_bits(f, 8); + y = get_bits(f, 8); + c->entries = (get_bits(f, 8)<<16) + (y<<8) + x; + ordered = get_bits(f,1); + c->sparse = ordered ? 0 : get_bits(f,1); + + if (c->dimensions == 0 && c->entries != 0) return error(f, VORBIS_invalid_setup); + + if (c->sparse) + lengths = (uint8 *) setup_temp_malloc(f, c->entries); + else + lengths = c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); + + if (!lengths) return error(f, VORBIS_outofmem); + + if (ordered) { + int current_entry = 0; + int current_length = get_bits(f,5) + 1; + while (current_entry < c->entries) { + int limit = c->entries - current_entry; + int n = get_bits(f, ilog(limit)); + if (current_entry + n > (int) c->entries) { return error(f, VORBIS_invalid_setup); } + memset(lengths + current_entry, current_length, n); + current_entry += n; + ++current_length; + } + } else { + for (j=0; j < c->entries; ++j) { + int present = c->sparse ? get_bits(f,1) : 1; + if (present) { + lengths[j] = get_bits(f, 5) + 1; + ++total; + if (lengths[j] == 32) + return error(f, VORBIS_invalid_setup); + } else { + lengths[j] = NO_CODE; + } + } + } + + if (c->sparse && total >= c->entries >> 2) { + // convert sparse items to non-sparse! + if (c->entries > (int) f->setup_temp_memory_required) + f->setup_temp_memory_required = c->entries; + + c->codeword_lengths = (uint8 *) setup_malloc(f, c->entries); + if (c->codeword_lengths == NULL) return error(f, VORBIS_outofmem); + memcpy(c->codeword_lengths, lengths, c->entries); + setup_temp_free(f, lengths, c->entries); // note this is only safe if there have been no intervening temp mallocs! + lengths = c->codeword_lengths; + c->sparse = 0; + } + + // compute the size of the sorted tables + if (c->sparse) { + sorted_count = total; + } else { + sorted_count = 0; + #ifndef STB_VORBIS_NO_HUFFMAN_BINARY_SEARCH + for (j=0; j < c->entries; ++j) + if (lengths[j] > STB_VORBIS_FAST_HUFFMAN_LENGTH && lengths[j] != NO_CODE) + ++sorted_count; + #endif + } + + c->sorted_entries = sorted_count; + values = NULL; + + CHECK(f); + if (!c->sparse) { + c->codewords = (uint32 *) setup_malloc(f, sizeof(c->codewords[0]) * c->entries); + if (!c->codewords) return error(f, VORBIS_outofmem); + } else { + unsigned int size; + if (c->sorted_entries) { + c->codeword_lengths = (uint8 *) setup_malloc(f, c->sorted_entries); + if (!c->codeword_lengths) return error(f, VORBIS_outofmem); + c->codewords = (uint32 *) setup_temp_malloc(f, sizeof(*c->codewords) * c->sorted_entries); + if (!c->codewords) return error(f, VORBIS_outofmem); + values = (uint32 *) setup_temp_malloc(f, sizeof(*values) * c->sorted_entries); + if (!values) return error(f, VORBIS_outofmem); + } + size = c->entries + (sizeof(*c->codewords) + sizeof(*values)) * c->sorted_entries; + if (size > f->setup_temp_memory_required) + f->setup_temp_memory_required = size; + } + + if (!compute_codewords(c, lengths, c->entries, values)) { + if (c->sparse) setup_temp_free(f, values, 0); + return error(f, VORBIS_invalid_setup); + } + + if (c->sorted_entries) { + // allocate an extra slot for sentinels + c->sorted_codewords = (uint32 *) setup_malloc(f, sizeof(*c->sorted_codewords) * (c->sorted_entries+1)); + if (c->sorted_codewords == NULL) return error(f, VORBIS_outofmem); + // allocate an extra slot at the front so that c->sorted_values[-1] is defined + // so that we can catch that case without an extra if + c->sorted_values = ( int *) setup_malloc(f, sizeof(*c->sorted_values ) * (c->sorted_entries+1)); + if (c->sorted_values == NULL) return error(f, VORBIS_outofmem); + ++c->sorted_values; + c->sorted_values[-1] = -1; + compute_sorted_huffman(c, lengths, values); + } + + if (c->sparse) { + setup_temp_free(f, values, sizeof(*values)*c->sorted_entries); + setup_temp_free(f, c->codewords, sizeof(*c->codewords)*c->sorted_entries); + setup_temp_free(f, lengths, c->entries); + c->codewords = NULL; + } + + compute_accelerated_huffman(c); + + CHECK(f); + c->lookup_type = get_bits(f, 4); + if (c->lookup_type > 2) return error(f, VORBIS_invalid_setup); + if (c->lookup_type > 0) { + uint16 *mults; + c->minimum_value = float32_unpack(get_bits(f, 32)); + c->delta_value = float32_unpack(get_bits(f, 32)); + c->value_bits = get_bits(f, 4)+1; + c->sequence_p = get_bits(f,1); + if (c->lookup_type == 1) { + c->lookup_values = lookup1_values(c->entries, c->dimensions); + } else { + c->lookup_values = c->entries * c->dimensions; + } + if (c->lookup_values == 0) return error(f, VORBIS_invalid_setup); + mults = (uint16 *) setup_temp_malloc(f, sizeof(mults[0]) * c->lookup_values); + if (mults == NULL) return error(f, VORBIS_outofmem); + for (j=0; j < (int) c->lookup_values; ++j) { + int q = get_bits(f, c->value_bits); + if (q == EOP) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_invalid_setup); } + mults[j] = q; + } + +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + if (c->lookup_type == 1) { + int len, sparse = c->sparse; + float last=0; + // pre-expand the lookup1-style multiplicands, to avoid a divide in the inner loop + if (sparse) { + if (c->sorted_entries == 0) goto skip; + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->sorted_entries * c->dimensions); + } else + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->entries * c->dimensions); + if (c->multiplicands == NULL) { setup_temp_free(f,mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_outofmem); } + len = sparse ? c->sorted_entries : c->entries; + for (j=0; j < len; ++j) { + unsigned int z = sparse ? c->sorted_values[j] : j; + unsigned int div=1; + for (k=0; k < c->dimensions; ++k) { + int off = (z / div) % c->lookup_values; + float val = mults[off]; + val = mults[off]*c->delta_value + c->minimum_value + last; + c->multiplicands[j*c->dimensions + k] = val; + if (c->sequence_p) + last = val; + if (k+1 < c->dimensions) { + if (div > UINT_MAX / (unsigned int) c->lookup_values) { + setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); + return error(f, VORBIS_invalid_setup); + } + div *= c->lookup_values; + } + } + } + c->lookup_type = 2; + } + else +#endif + { + float last=0; + CHECK(f); + c->multiplicands = (codetype *) setup_malloc(f, sizeof(c->multiplicands[0]) * c->lookup_values); + if (c->multiplicands == NULL) { setup_temp_free(f, mults,sizeof(mults[0])*c->lookup_values); return error(f, VORBIS_outofmem); } + for (j=0; j < (int) c->lookup_values; ++j) { + float val = mults[j] * c->delta_value + c->minimum_value + last; + c->multiplicands[j] = val; + if (c->sequence_p) + last = val; + } + } +#ifndef STB_VORBIS_DIVIDES_IN_CODEBOOK + skip:; +#endif + setup_temp_free(f, mults, sizeof(mults[0])*c->lookup_values); + + CHECK(f); + } + CHECK(f); + } + + // time domain transfers (notused) + + x = get_bits(f, 6) + 1; + for (i=0; i < x; ++i) { + uint32 z = get_bits(f, 16); + if (z != 0) return error(f, VORBIS_invalid_setup); + } + + // Floors + f->floor_count = get_bits(f, 6)+1; + f->floor_config = (Floor *) setup_malloc(f, f->floor_count * sizeof(*f->floor_config)); + if (f->floor_config == NULL) return error(f, VORBIS_outofmem); + for (i=0; i < f->floor_count; ++i) { + f->floor_types[i] = get_bits(f, 16); + if (f->floor_types[i] > 1) return error(f, VORBIS_invalid_setup); + if (f->floor_types[i] == 0) { + Floor0 *g = &f->floor_config[i].floor0; + g->order = get_bits(f,8); + g->rate = get_bits(f,16); + g->bark_map_size = get_bits(f,16); + g->amplitude_bits = get_bits(f,6); + g->amplitude_offset = get_bits(f,8); + g->number_of_books = get_bits(f,4) + 1; + for (j=0; j < g->number_of_books; ++j) + g->book_list[j] = get_bits(f,8); + return error(f, VORBIS_feature_not_supported); + } else { + stbv__floor_ordering p[31*8+2]; + Floor1 *g = &f->floor_config[i].floor1; + int max_class = -1; + g->partitions = get_bits(f, 5); + for (j=0; j < g->partitions; ++j) { + g->partition_class_list[j] = get_bits(f, 4); + if (g->partition_class_list[j] > max_class) + max_class = g->partition_class_list[j]; + } + for (j=0; j <= max_class; ++j) { + g->class_dimensions[j] = get_bits(f, 3)+1; + g->class_subclasses[j] = get_bits(f, 2); + if (g->class_subclasses[j]) { + g->class_masterbooks[j] = get_bits(f, 8); + if (g->class_masterbooks[j] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } + for (k=0; k < 1 << g->class_subclasses[j]; ++k) { + g->subclass_books[j][k] = get_bits(f,8)-1; + if (g->subclass_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } + } + g->floor1_multiplier = get_bits(f,2)+1; + g->rangebits = get_bits(f,4); + g->Xlist[0] = 0; + g->Xlist[1] = 1 << g->rangebits; + g->values = 2; + for (j=0; j < g->partitions; ++j) { + int c = g->partition_class_list[j]; + for (k=0; k < g->class_dimensions[c]; ++k) { + g->Xlist[g->values] = get_bits(f, g->rangebits); + ++g->values; + } + } + // precompute the sorting + for (j=0; j < g->values; ++j) { + p[j].x = g->Xlist[j]; + p[j].id = j; + } + qsort(p, g->values, sizeof(p[0]), point_compare); + for (j=0; j < g->values; ++j) + g->sorted_order[j] = (uint8) p[j].id; + // precompute the neighbors + for (j=2; j < g->values; ++j) { + int low,hi; + neighbors(g->Xlist, j, &low,&hi); + g->neighbors[j][0] = low; + g->neighbors[j][1] = hi; + } + + if (g->values > longest_floorlist) + longest_floorlist = g->values; + } + } + + // Residue + f->residue_count = get_bits(f, 6)+1; + f->residue_config = (Residue *) setup_malloc(f, f->residue_count * sizeof(f->residue_config[0])); + if (f->residue_config == NULL) return error(f, VORBIS_outofmem); + memset(f->residue_config, 0, f->residue_count * sizeof(f->residue_config[0])); + for (i=0; i < f->residue_count; ++i) { + uint8 residue_cascade[64]; + Residue *r = f->residue_config+i; + f->residue_types[i] = get_bits(f, 16); + if (f->residue_types[i] > 2) return error(f, VORBIS_invalid_setup); + r->begin = get_bits(f, 24); + r->end = get_bits(f, 24); + if (r->end < r->begin) return error(f, VORBIS_invalid_setup); + r->part_size = get_bits(f,24)+1; + r->classifications = get_bits(f,6)+1; + r->classbook = get_bits(f,8); + if (r->classbook >= f->codebook_count) return error(f, VORBIS_invalid_setup); + for (j=0; j < r->classifications; ++j) { + uint8 high_bits=0; + uint8 low_bits=get_bits(f,3); + if (get_bits(f,1)) + high_bits = get_bits(f,5); + residue_cascade[j] = high_bits*8 + low_bits; + } + r->residue_books = (short (*)[8]) setup_malloc(f, sizeof(r->residue_books[0]) * r->classifications); + if (r->residue_books == NULL) return error(f, VORBIS_outofmem); + for (j=0; j < r->classifications; ++j) { + for (k=0; k < 8; ++k) { + if (residue_cascade[j] & (1 << k)) { + r->residue_books[j][k] = get_bits(f, 8); + if (r->residue_books[j][k] >= f->codebook_count) return error(f, VORBIS_invalid_setup); + } else { + r->residue_books[j][k] = -1; + } + } + } + // precompute the classifications[] array to avoid inner-loop mod/divide + // call it 'classdata' since we already have r->classifications + r->classdata = (uint8 **) setup_malloc(f, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); + if (!r->classdata) return error(f, VORBIS_outofmem); + memset(r->classdata, 0, sizeof(*r->classdata) * f->codebooks[r->classbook].entries); + for (j=0; j < f->codebooks[r->classbook].entries; ++j) { + int classwords = f->codebooks[r->classbook].dimensions; + int temp = j; + r->classdata[j] = (uint8 *) setup_malloc(f, sizeof(r->classdata[j][0]) * classwords); + if (r->classdata[j] == NULL) return error(f, VORBIS_outofmem); + for (k=classwords-1; k >= 0; --k) { + r->classdata[j][k] = temp % r->classifications; + temp /= r->classifications; + } + } + } + + f->mapping_count = get_bits(f,6)+1; + f->mapping = (Mapping *) setup_malloc(f, f->mapping_count * sizeof(*f->mapping)); + if (f->mapping == NULL) return error(f, VORBIS_outofmem); + memset(f->mapping, 0, f->mapping_count * sizeof(*f->mapping)); + for (i=0; i < f->mapping_count; ++i) { + Mapping *m = f->mapping + i; + int mapping_type = get_bits(f,16); + if (mapping_type != 0) return error(f, VORBIS_invalid_setup); + m->chan = (MappingChannel *) setup_malloc(f, f->channels * sizeof(*m->chan)); + if (m->chan == NULL) return error(f, VORBIS_outofmem); + if (get_bits(f,1)) + m->submaps = get_bits(f,4)+1; + else + m->submaps = 1; + if (m->submaps > max_submaps) + max_submaps = m->submaps; + if (get_bits(f,1)) { + m->coupling_steps = get_bits(f,8)+1; + for (k=0; k < m->coupling_steps; ++k) { + m->chan[k].magnitude = get_bits(f, ilog(f->channels-1)); + m->chan[k].angle = get_bits(f, ilog(f->channels-1)); + if (m->chan[k].magnitude >= f->channels) return error(f, VORBIS_invalid_setup); + if (m->chan[k].angle >= f->channels) return error(f, VORBIS_invalid_setup); + if (m->chan[k].magnitude == m->chan[k].angle) return error(f, VORBIS_invalid_setup); + } + } else + m->coupling_steps = 0; + + // reserved field + if (get_bits(f,2)) return error(f, VORBIS_invalid_setup); + if (m->submaps > 1) { + for (j=0; j < f->channels; ++j) { + m->chan[j].mux = get_bits(f, 4); + if (m->chan[j].mux >= m->submaps) return error(f, VORBIS_invalid_setup); + } + } else + // @SPECIFICATION: this case is missing from the spec + for (j=0; j < f->channels; ++j) + m->chan[j].mux = 0; + + for (j=0; j < m->submaps; ++j) { + get_bits(f,8); // discard + m->submap_floor[j] = get_bits(f,8); + m->submap_residue[j] = get_bits(f,8); + if (m->submap_floor[j] >= f->floor_count) return error(f, VORBIS_invalid_setup); + if (m->submap_residue[j] >= f->residue_count) return error(f, VORBIS_invalid_setup); + } + } + + // Modes + f->mode_count = get_bits(f, 6)+1; + for (i=0; i < f->mode_count; ++i) { + Mode *m = f->mode_config+i; + m->blockflag = get_bits(f,1); + m->windowtype = get_bits(f,16); + m->transformtype = get_bits(f,16); + m->mapping = get_bits(f,8); + if (m->windowtype != 0) return error(f, VORBIS_invalid_setup); + if (m->transformtype != 0) return error(f, VORBIS_invalid_setup); + if (m->mapping >= f->mapping_count) return error(f, VORBIS_invalid_setup); + } + + flush_packet(f); + + f->previous_length = 0; + + for (i=0; i < f->channels; ++i) { + f->channel_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1); + f->previous_window[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); + f->finalY[i] = (int16 *) setup_malloc(f, sizeof(int16) * longest_floorlist); + if (f->channel_buffers[i] == NULL || f->previous_window[i] == NULL || f->finalY[i] == NULL) return error(f, VORBIS_outofmem); + memset(f->channel_buffers[i], 0, sizeof(float) * f->blocksize_1); + #ifdef STB_VORBIS_NO_DEFER_FLOOR + f->floor_buffers[i] = (float *) setup_malloc(f, sizeof(float) * f->blocksize_1/2); + if (f->floor_buffers[i] == NULL) return error(f, VORBIS_outofmem); + #endif + } + + if (!init_blocksize(f, 0, f->blocksize_0)) return FALSE; + if (!init_blocksize(f, 1, f->blocksize_1)) return FALSE; + f->blocksize[0] = f->blocksize_0; + f->blocksize[1] = f->blocksize_1; + +#ifdef STB_VORBIS_DIVIDE_TABLE + if (integer_divide_table[1][1]==0) + for (i=0; i < DIVTAB_NUMER; ++i) + for (j=1; j < DIVTAB_DENOM; ++j) + integer_divide_table[i][j] = i / j; +#endif + + // compute how much temporary memory is needed + + // 1. + { + uint32 imdct_mem = (f->blocksize_1 * sizeof(float) >> 1); + uint32 classify_mem; + int i,max_part_read=0; + for (i=0; i < f->residue_count; ++i) { + Residue *r = f->residue_config + i; + unsigned int actual_size = f->blocksize_1 / 2; + unsigned int limit_r_begin = r->begin < actual_size ? r->begin : actual_size; + unsigned int limit_r_end = r->end < actual_size ? r->end : actual_size; + int n_read = limit_r_end - limit_r_begin; + int part_read = n_read / r->part_size; + if (part_read > max_part_read) + max_part_read = part_read; + } + #ifndef STB_VORBIS_DIVIDES_IN_RESIDUE + classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(uint8 *)); + #else + classify_mem = f->channels * (sizeof(void*) + max_part_read * sizeof(int *)); + #endif + + // maximum reasonable partition size is f->blocksize_1 + + f->temp_memory_required = classify_mem; + if (imdct_mem > f->temp_memory_required) + f->temp_memory_required = imdct_mem; + } + + f->first_decode = TRUE; + + if (f->alloc.alloc_buffer) { + assert(f->temp_offset == f->alloc.alloc_buffer_length_in_bytes); + // check if there's enough temp memory so we don't error later + if (f->setup_offset + sizeof(*f) + f->temp_memory_required > (unsigned) f->temp_offset) + return error(f, VORBIS_outofmem); + } + + f->first_audio_page_offset = stb_vorbis_get_file_offset(f); + + return TRUE; +} + +static void vorbis_deinit(stb_vorbis *p) +{ + int i,j; + if (p->residue_config) { + for (i=0; i < p->residue_count; ++i) { + Residue *r = p->residue_config+i; + if (r->classdata) { + for (j=0; j < p->codebooks[r->classbook].entries; ++j) + setup_free(p, r->classdata[j]); + setup_free(p, r->classdata); + } + setup_free(p, r->residue_books); + } + } + + if (p->codebooks) { + CHECK(p); + for (i=0; i < p->codebook_count; ++i) { + Codebook *c = p->codebooks + i; + setup_free(p, c->codeword_lengths); + setup_free(p, c->multiplicands); + setup_free(p, c->codewords); + setup_free(p, c->sorted_codewords); + // c->sorted_values[-1] is the first entry in the array + setup_free(p, c->sorted_values ? c->sorted_values-1 : NULL); + } + setup_free(p, p->codebooks); + } + setup_free(p, p->floor_config); + setup_free(p, p->residue_config); + if (p->mapping) { + for (i=0; i < p->mapping_count; ++i) + setup_free(p, p->mapping[i].chan); + setup_free(p, p->mapping); + } + CHECK(p); + for (i=0; i < p->channels && i < STB_VORBIS_MAX_CHANNELS; ++i) { + setup_free(p, p->channel_buffers[i]); + setup_free(p, p->previous_window[i]); + #ifdef STB_VORBIS_NO_DEFER_FLOOR + setup_free(p, p->floor_buffers[i]); + #endif + setup_free(p, p->finalY[i]); + } + for (i=0; i < 2; ++i) { + setup_free(p, p->A[i]); + setup_free(p, p->B[i]); + setup_free(p, p->C[i]); + setup_free(p, p->window[i]); + setup_free(p, p->bit_reverse[i]); + } + #ifndef STB_VORBIS_NO_STDIO + if (p->close_on_free) fclose(p->f); + #endif +} + +void stb_vorbis_close(stb_vorbis *p) +{ + if (p == NULL) return; + vorbis_deinit(p); + setup_free(p,p); +} + +static void vorbis_init(stb_vorbis *p, const stb_vorbis_alloc *z) +{ + memset(p, 0, sizeof(*p)); // NULL out all malloc'd pointers to start + if (z) { + p->alloc = *z; + p->alloc.alloc_buffer_length_in_bytes = (p->alloc.alloc_buffer_length_in_bytes+3) & ~3; + p->temp_offset = p->alloc.alloc_buffer_length_in_bytes; + } + p->eof = 0; + p->error = VORBIS__no_error; + p->stream = NULL; + p->codebooks = NULL; + p->page_crc_tests = -1; + #ifndef STB_VORBIS_NO_STDIO + p->close_on_free = FALSE; + p->f = NULL; + #endif +} + +int stb_vorbis_get_sample_offset(stb_vorbis *f) +{ + if (f->current_loc_valid) + return f->current_loc; + else + return -1; +} + +stb_vorbis_info stb_vorbis_get_info(stb_vorbis *f) +{ + stb_vorbis_info d; + d.channels = f->channels; + d.sample_rate = f->sample_rate; + d.setup_memory_required = f->setup_memory_required; + d.setup_temp_memory_required = f->setup_temp_memory_required; + d.temp_memory_required = f->temp_memory_required; + d.max_frame_size = f->blocksize_1 >> 1; + return d; +} + +int stb_vorbis_get_error(stb_vorbis *f) +{ + int e = f->error; + f->error = VORBIS__no_error; + return e; +} + +static stb_vorbis * vorbis_alloc(stb_vorbis *f) +{ + stb_vorbis *p = (stb_vorbis *) setup_malloc(f, sizeof(*p)); + return p; +} + +#ifndef STB_VORBIS_NO_PUSHDATA_API + +void stb_vorbis_flush_pushdata(stb_vorbis *f) +{ + f->previous_length = 0; + f->page_crc_tests = 0; + f->discard_samples_deferred = 0; + f->current_loc_valid = FALSE; + f->first_decode = FALSE; + f->samples_output = 0; + f->channel_buffer_start = 0; + f->channel_buffer_end = 0; +} + +static int vorbis_search_for_page_pushdata(vorb *f, uint8 *data, int data_len) +{ + int i,n; + for (i=0; i < f->page_crc_tests; ++i) + f->scan[i].bytes_done = 0; + + // if we have room for more scans, search for them first, because + // they may cause us to stop early if their header is incomplete + if (f->page_crc_tests < STB_VORBIS_PUSHDATA_CRC_COUNT) { + if (data_len < 4) return 0; + data_len -= 3; // need to look for 4-byte sequence, so don't miss + // one that straddles a boundary + for (i=0; i < data_len; ++i) { + if (data[i] == 0x4f) { + if (0==memcmp(data+i, ogg_page_header, 4)) { + int j,len; + uint32 crc; + // make sure we have the whole page header + if (i+26 >= data_len || i+27+data[i+26] >= data_len) { + // only read up to this page start, so hopefully we'll + // have the whole page header start next time + data_len = i; + break; + } + // ok, we have it all; compute the length of the page + len = 27 + data[i+26]; + for (j=0; j < data[i+26]; ++j) + len += data[i+27+j]; + // scan everything up to the embedded crc (which we must 0) + crc = 0; + for (j=0; j < 22; ++j) + crc = crc32_update(crc, data[i+j]); + // now process 4 0-bytes + for ( ; j < 26; ++j) + crc = crc32_update(crc, 0); + // len is the total number of bytes we need to scan + n = f->page_crc_tests++; + f->scan[n].bytes_left = len-j; + f->scan[n].crc_so_far = crc; + f->scan[n].goal_crc = data[i+22] + (data[i+23] << 8) + (data[i+24]<<16) + (data[i+25]<<24); + // if the last frame on a page is continued to the next, then + // we can't recover the sample_loc immediately + if (data[i+27+data[i+26]-1] == 255) + f->scan[n].sample_loc = ~0; + else + f->scan[n].sample_loc = data[i+6] + (data[i+7] << 8) + (data[i+ 8]<<16) + (data[i+ 9]<<24); + f->scan[n].bytes_done = i+j; + if (f->page_crc_tests == STB_VORBIS_PUSHDATA_CRC_COUNT) + break; + // keep going if we still have room for more + } + } + } + } + + for (i=0; i < f->page_crc_tests;) { + uint32 crc; + int j; + int n = f->scan[i].bytes_done; + int m = f->scan[i].bytes_left; + if (m > data_len - n) m = data_len - n; + // m is the bytes to scan in the current chunk + crc = f->scan[i].crc_so_far; + for (j=0; j < m; ++j) + crc = crc32_update(crc, data[n+j]); + f->scan[i].bytes_left -= m; + f->scan[i].crc_so_far = crc; + if (f->scan[i].bytes_left == 0) { + // does it match? + if (f->scan[i].crc_so_far == f->scan[i].goal_crc) { + // Houston, we have page + data_len = n+m; // consumption amount is wherever that scan ended + f->page_crc_tests = -1; // drop out of page scan mode + f->previous_length = 0; // decode-but-don't-output one frame + f->next_seg = -1; // start a new page + f->current_loc = f->scan[i].sample_loc; // set the current sample location + // to the amount we'd have decoded had we decoded this page + f->current_loc_valid = f->current_loc != ~0U; + return data_len; + } + // delete entry + f->scan[i] = f->scan[--f->page_crc_tests]; + } else { + ++i; + } + } + + return data_len; +} + +// return value: number of bytes we used +int stb_vorbis_decode_frame_pushdata( + stb_vorbis *f, // the file we're decoding + const uint8 *data, int data_len, // the memory available for decoding + int *channels, // place to write number of float * buffers + float ***output, // place to write float ** array of float * buffers + int *samples // place to write number of output samples + ) +{ + int i; + int len,right,left; + + if (!IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + if (f->page_crc_tests >= 0) { + *samples = 0; + return vorbis_search_for_page_pushdata(f, (uint8 *) data, data_len); + } + + f->stream = (uint8 *) data; + f->stream_end = (uint8 *) data + data_len; + f->error = VORBIS__no_error; + + // check that we have the entire packet in memory + if (!is_whole_packet_present(f, FALSE)) { + *samples = 0; + return 0; + } + + if (!vorbis_decode_packet(f, &len, &left, &right)) { + // save the actual error we encountered + enum STBVorbisError error = f->error; + if (error == VORBIS_bad_packet_type) { + // flush and resynch + f->error = VORBIS__no_error; + while (get8_packet(f) != EOP) + if (f->eof) break; + *samples = 0; + return (int) (f->stream - data); + } + if (error == VORBIS_continued_packet_flag_invalid) { + if (f->previous_length == 0) { + // we may be resynching, in which case it's ok to hit one + // of these; just discard the packet + f->error = VORBIS__no_error; + while (get8_packet(f) != EOP) + if (f->eof) break; + *samples = 0; + return (int) (f->stream - data); + } + } + // if we get an error while parsing, what to do? + // well, it DEFINITELY won't work to continue from where we are! + stb_vorbis_flush_pushdata(f); + // restore the error that actually made us bail + f->error = error; + *samples = 0; + return 1; + } + + // success! + len = vorbis_finish_frame(f, len, left, right); + for (i=0; i < f->channels; ++i) + f->outputs[i] = f->channel_buffers[i] + left; + + if (channels) *channels = f->channels; + *samples = len; + *output = f->outputs; + return (int) (f->stream - data); +} + +stb_vorbis *stb_vorbis_open_pushdata( + const unsigned char *data, int data_len, // the memory available for decoding + int *data_used, // only defined if result is not NULL + int *error, const stb_vorbis_alloc *alloc) +{ + stb_vorbis *f, p; + vorbis_init(&p, alloc); + p.stream = (uint8 *) data; + p.stream_end = (uint8 *) data + data_len; + p.push_mode = TRUE; + if (!start_decoder(&p)) { + if (p.eof) + *error = VORBIS_need_more_data; + else + *error = p.error; + return NULL; + } + f = vorbis_alloc(&p); + if (f) { + *f = p; + *data_used = (int) (f->stream - data); + *error = 0; + return f; + } else { + vorbis_deinit(&p); + return NULL; + } +} +#endif // STB_VORBIS_NO_PUSHDATA_API + +unsigned int stb_vorbis_get_file_offset(stb_vorbis *f) +{ + #ifndef STB_VORBIS_NO_PUSHDATA_API + if (f->push_mode) return 0; + #endif + if (USE_MEMORY(f)) return (unsigned int) (f->stream - f->stream_start); + #ifndef STB_VORBIS_NO_STDIO + return (unsigned int) (ftell(f->f) - f->f_start); + #endif +} + +#ifndef STB_VORBIS_NO_PULLDATA_API +// +// DATA-PULLING API +// + +static uint32 vorbis_find_page(stb_vorbis *f, uint32 *end, uint32 *last) +{ + for(;;) { + int n; + if (f->eof) return 0; + n = get8(f); + if (n == 0x4f) { // page header candidate + unsigned int retry_loc = stb_vorbis_get_file_offset(f); + int i; + // check if we're off the end of a file_section stream + if (retry_loc - 25 > f->stream_len) + return 0; + // check the rest of the header + for (i=1; i < 4; ++i) + if (get8(f) != ogg_page_header[i]) + break; + if (f->eof) return 0; + if (i == 4) { + uint8 header[27]; + uint32 i, crc, goal, len; + for (i=0; i < 4; ++i) + header[i] = ogg_page_header[i]; + for (; i < 27; ++i) + header[i] = get8(f); + if (f->eof) return 0; + if (header[4] != 0) goto invalid; + goal = header[22] + (header[23] << 8) + (header[24]<<16) + (header[25]<<24); + for (i=22; i < 26; ++i) + header[i] = 0; + crc = 0; + for (i=0; i < 27; ++i) + crc = crc32_update(crc, header[i]); + len = 0; + for (i=0; i < header[26]; ++i) { + int s = get8(f); + crc = crc32_update(crc, s); + len += s; + } + if (len && f->eof) return 0; + for (i=0; i < len; ++i) + crc = crc32_update(crc, get8(f)); + // finished parsing probable page + if (crc == goal) { + // we could now check that it's either got the last + // page flag set, OR it's followed by the capture + // pattern, but I guess TECHNICALLY you could have + // a file with garbage between each ogg page and recover + // from it automatically? So even though that paranoia + // might decrease the chance of an invalid decode by + // another 2^32, not worth it since it would hose those + // invalid-but-useful files? + if (end) + *end = stb_vorbis_get_file_offset(f); + if (last) { + if (header[5] & 0x04) + *last = 1; + else + *last = 0; + } + set_file_offset(f, retry_loc-1); + return 1; + } + } + invalid: + // not a valid page, so rewind and look for next one + set_file_offset(f, retry_loc); + } + } +} + + +#define SAMPLE_unknown 0xffffffff + +// seeking is implemented with a binary search, which narrows down the range to +// 64K, before using a linear search (because finding the synchronization +// pattern can be expensive, and the chance we'd find the end page again is +// relatively high for small ranges) +// +// two initial interpolation-style probes are used at the start of the search +// to try to bound either side of the binary search sensibly, while still +// working in O(log n) time if they fail. + +static int get_seek_page_info(stb_vorbis *f, ProbedPage *z) +{ + uint8 header[27], lacing[255]; + int i,len; + + // record where the page starts + z->page_start = stb_vorbis_get_file_offset(f); + + // parse the header + getn(f, header, 27); + if (header[0] != 'O' || header[1] != 'g' || header[2] != 'g' || header[3] != 'S') + return 0; + getn(f, lacing, header[26]); + + // determine the length of the payload + len = 0; + for (i=0; i < header[26]; ++i) + len += lacing[i]; + + // this implies where the page ends + z->page_end = z->page_start + 27 + header[26] + len; + + // read the last-decoded sample out of the data + z->last_decoded_sample = header[6] + (header[7] << 8) + (header[8] << 16) + (header[9] << 24); + + // restore file state to where we were + set_file_offset(f, z->page_start); + return 1; +} + +// rarely used function to seek back to the preceding page while finding the +// start of a packet +static int go_to_page_before(stb_vorbis *f, unsigned int limit_offset) +{ + unsigned int previous_safe, end; + + // now we want to seek back 64K from the limit + if (limit_offset >= 65536 && limit_offset-65536 >= f->first_audio_page_offset) + previous_safe = limit_offset - 65536; + else + previous_safe = f->first_audio_page_offset; + + set_file_offset(f, previous_safe); + + while (vorbis_find_page(f, &end, NULL)) { + if (end >= limit_offset && stb_vorbis_get_file_offset(f) < limit_offset) + return 1; + set_file_offset(f, end); + } + + return 0; +} + +// implements the search logic for finding a page and starting decoding. if +// the function succeeds, current_loc_valid will be true and current_loc will +// be less than or equal to the provided sample number (the closer the +// better). +static int seek_to_sample_coarse(stb_vorbis *f, uint32 sample_number) +{ + ProbedPage left, right, mid; + int i, start_seg_with_known_loc, end_pos, page_start; + uint32 delta, stream_length, padding; + double offset, bytes_per_sample; + int probe = 0; + + // find the last page and validate the target sample + stream_length = stb_vorbis_stream_length_in_samples(f); + if (stream_length == 0) return error(f, VORBIS_seek_without_length); + if (sample_number > stream_length) return error(f, VORBIS_seek_invalid); + + // this is the maximum difference between the window-center (which is the + // actual granule position value), and the right-start (which the spec + // indicates should be the granule position (give or take one)). + padding = ((f->blocksize_1 - f->blocksize_0) >> 2); + if (sample_number < padding) + sample_number = 0; + else + sample_number -= padding; + + left = f->p_first; + while (left.last_decoded_sample == ~0U) { + // (untested) the first page does not have a 'last_decoded_sample' + set_file_offset(f, left.page_end); + if (!get_seek_page_info(f, &left)) goto error; + } + + right = f->p_last; + assert(right.last_decoded_sample != ~0U); + + // starting from the start is handled differently + if (sample_number <= left.last_decoded_sample) { + if (stb_vorbis_seek_start(f)) + return 1; + return 0; + } + + while (left.page_end != right.page_start) { + assert(left.page_end < right.page_start); + // search range in bytes + delta = right.page_start - left.page_end; + if (delta <= 65536) { + // there's only 64K left to search - handle it linearly + set_file_offset(f, left.page_end); + } else { + if (probe < 2) { + if (probe == 0) { + // first probe (interpolate) + double data_bytes = right.page_end - left.page_start; + bytes_per_sample = data_bytes / right.last_decoded_sample; + offset = left.page_start + bytes_per_sample * (sample_number - left.last_decoded_sample); + } else { + // second probe (try to bound the other side) + double error = ((double) sample_number - mid.last_decoded_sample) * bytes_per_sample; + if (error >= 0 && error < 8000) error = 8000; + if (error < 0 && error > -8000) error = -8000; + offset += error * 2; + } + + // ensure the offset is valid + if (offset < left.page_end) + offset = left.page_end; + if (offset > right.page_start - 65536) + offset = right.page_start - 65536; + + set_file_offset(f, (unsigned int) offset); + } else { + // binary search for large ranges (offset by 32K to ensure + // we don't hit the right page) + set_file_offset(f, left.page_end + (delta / 2) - 32768); + } + + if (!vorbis_find_page(f, NULL, NULL)) goto error; + } + + for (;;) { + if (!get_seek_page_info(f, &mid)) goto error; + if (mid.last_decoded_sample != ~0U) break; + // (untested) no frames end on this page + set_file_offset(f, mid.page_end); + assert(mid.page_start < right.page_start); + } + + // if we've just found the last page again then we're in a tricky file, + // and we're close enough. + if (mid.page_start == right.page_start) + break; + + if (sample_number < mid.last_decoded_sample) + right = mid; + else + left = mid; + + ++probe; + } + + // seek back to start of the last packet + page_start = left.page_start; + set_file_offset(f, page_start); + if (!start_page(f)) return error(f, VORBIS_seek_failed); + end_pos = f->end_seg_with_known_loc; + assert(end_pos >= 0); + + for (;;) { + for (i = end_pos; i > 0; --i) + if (f->segments[i-1] != 255) + break; + + start_seg_with_known_loc = i; + + if (start_seg_with_known_loc > 0 || !(f->page_flag & PAGEFLAG_continued_packet)) + break; + + // (untested) the final packet begins on an earlier page + if (!go_to_page_before(f, page_start)) + goto error; + + page_start = stb_vorbis_get_file_offset(f); + if (!start_page(f)) goto error; + end_pos = f->segment_count - 1; + } + + // prepare to start decoding + f->current_loc_valid = FALSE; + f->last_seg = FALSE; + f->valid_bits = 0; + f->packet_bytes = 0; + f->bytes_in_seg = 0; + f->previous_length = 0; + f->next_seg = start_seg_with_known_loc; + + for (i = 0; i < start_seg_with_known_loc; i++) + skip(f, f->segments[i]); + + // start decoding (optimizable - this frame is generally discarded) + if (!vorbis_pump_first_frame(f)) + return 0; + if (f->current_loc > sample_number) + return error(f, VORBIS_seek_failed); + return 1; + +error: + // try to restore the file to a valid state + stb_vorbis_seek_start(f); + return error(f, VORBIS_seek_failed); +} + +// the same as vorbis_decode_initial, but without advancing +static int peek_decode_initial(vorb *f, int *p_left_start, int *p_left_end, int *p_right_start, int *p_right_end, int *mode) +{ + int bits_read, bytes_read; + + if (!vorbis_decode_initial(f, p_left_start, p_left_end, p_right_start, p_right_end, mode)) + return 0; + + // either 1 or 2 bytes were read, figure out which so we can rewind + bits_read = 1 + ilog(f->mode_count-1); + if (f->mode_config[*mode].blockflag) + bits_read += 2; + bytes_read = (bits_read + 7) / 8; + + f->bytes_in_seg += bytes_read; + f->packet_bytes -= bytes_read; + skip(f, -bytes_read); + if (f->next_seg == -1) + f->next_seg = f->segment_count - 1; + else + f->next_seg--; + f->valid_bits = 0; + + return 1; +} + +int stb_vorbis_seek_frame(stb_vorbis *f, unsigned int sample_number) +{ + uint32 max_frame_samples; + + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + // fast page-level search + if (!seek_to_sample_coarse(f, sample_number)) + return 0; + + assert(f->current_loc_valid); + assert(f->current_loc <= sample_number); + + // linear search for the relevant packet + max_frame_samples = (f->blocksize_1*3 - f->blocksize_0) >> 2; + while (f->current_loc < sample_number) { + int left_start, left_end, right_start, right_end, mode, frame_samples; + if (!peek_decode_initial(f, &left_start, &left_end, &right_start, &right_end, &mode)) + return error(f, VORBIS_seek_failed); + // calculate the number of samples returned by the next frame + frame_samples = right_start - left_start; + if (f->current_loc + frame_samples > sample_number) { + return 1; // the next frame will contain the sample + } else if (f->current_loc + frame_samples + max_frame_samples > sample_number) { + // there's a chance the frame after this could contain the sample + vorbis_pump_first_frame(f); + } else { + // this frame is too early to be relevant + f->current_loc += frame_samples; + f->previous_length = 0; + maybe_start_packet(f); + flush_packet(f); + } + } + // the next frame will start with the sample + assert(f->current_loc == sample_number); + return 1; +} + +int stb_vorbis_seek(stb_vorbis *f, unsigned int sample_number) +{ + if (!stb_vorbis_seek_frame(f, sample_number)) + return 0; + + if (sample_number != f->current_loc) { + int n; + uint32 frame_start = f->current_loc; + stb_vorbis_get_frame_float(f, &n, NULL); + assert(sample_number > frame_start); + assert(f->channel_buffer_start + (int) (sample_number-frame_start) <= f->channel_buffer_end); + f->channel_buffer_start += (sample_number - frame_start); + } + + return 1; +} + +int stb_vorbis_seek_start(stb_vorbis *f) +{ + if (IS_PUSH_MODE(f)) { return error(f, VORBIS_invalid_api_mixing); } + set_file_offset(f, f->first_audio_page_offset); + f->previous_length = 0; + f->first_decode = TRUE; + f->next_seg = -1; + return vorbis_pump_first_frame(f); +} + +unsigned int stb_vorbis_stream_length_in_samples(stb_vorbis *f) +{ + unsigned int restore_offset, previous_safe; + unsigned int end, last_page_loc; + + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + if (!f->total_samples) { + unsigned int last; + uint32 lo,hi; + char header[6]; + + // first, store the current decode position so we can restore it + restore_offset = stb_vorbis_get_file_offset(f); + + // now we want to seek back 64K from the end (the last page must + // be at most a little less than 64K, but let's allow a little slop) + if (f->stream_len >= 65536 && f->stream_len-65536 >= f->first_audio_page_offset) + previous_safe = f->stream_len - 65536; + else + previous_safe = f->first_audio_page_offset; + + set_file_offset(f, previous_safe); + // previous_safe is now our candidate 'earliest known place that seeking + // to will lead to the final page' + + if (!vorbis_find_page(f, &end, &last)) { + // if we can't find a page, we're hosed! + f->error = VORBIS_cant_find_last_page; + f->total_samples = 0xffffffff; + goto done; + } + + // check if there are more pages + last_page_loc = stb_vorbis_get_file_offset(f); + + // stop when the last_page flag is set, not when we reach eof; + // this allows us to stop short of a 'file_section' end without + // explicitly checking the length of the section + while (!last) { + set_file_offset(f, end); + if (!vorbis_find_page(f, &end, &last)) { + // the last page we found didn't have the 'last page' flag + // set. whoops! + break; + } + previous_safe = last_page_loc+1; + last_page_loc = stb_vorbis_get_file_offset(f); + } + + set_file_offset(f, last_page_loc); + + // parse the header + getn(f, (unsigned char *)header, 6); + // extract the absolute granule position + lo = get32(f); + hi = get32(f); + if (lo == 0xffffffff && hi == 0xffffffff) { + f->error = VORBIS_cant_find_last_page; + f->total_samples = SAMPLE_unknown; + goto done; + } + if (hi) + lo = 0xfffffffe; // saturate + f->total_samples = lo; + + f->p_last.page_start = last_page_loc; + f->p_last.page_end = end; + f->p_last.last_decoded_sample = lo; + + done: + set_file_offset(f, restore_offset); + } + return f->total_samples == SAMPLE_unknown ? 0 : f->total_samples; +} + +float stb_vorbis_stream_length_in_seconds(stb_vorbis *f) +{ + return stb_vorbis_stream_length_in_samples(f) / (float) f->sample_rate; +} + + + +int stb_vorbis_get_frame_float(stb_vorbis *f, int *channels, float ***output) +{ + int len, right,left,i; + if (IS_PUSH_MODE(f)) return error(f, VORBIS_invalid_api_mixing); + + if (!vorbis_decode_packet(f, &len, &left, &right)) { + f->channel_buffer_start = f->channel_buffer_end = 0; + return 0; + } + + len = vorbis_finish_frame(f, len, left, right); + for (i=0; i < f->channels; ++i) + f->outputs[i] = f->channel_buffers[i] + left; + + f->channel_buffer_start = left; + f->channel_buffer_end = left+len; + + if (channels) *channels = f->channels; + if (output) *output = f->outputs; + return len; +} + +#ifndef STB_VORBIS_NO_STDIO + +stb_vorbis * stb_vorbis_open_file_section(FILE *file, int close_on_free, int *error, const stb_vorbis_alloc *alloc, unsigned int length) +{ + stb_vorbis *f, p; + vorbis_init(&p, alloc); + p.f = file; + p.f_start = (uint32) ftell(file); + p.stream_len = length; + p.close_on_free = close_on_free; + if (start_decoder(&p)) { + f = vorbis_alloc(&p); + if (f) { + *f = p; + vorbis_pump_first_frame(f); + return f; + } + } + if (error) *error = p.error; + vorbis_deinit(&p); + return NULL; +} + +stb_vorbis * stb_vorbis_open_file(FILE *file, int close_on_free, int *error, const stb_vorbis_alloc *alloc) +{ + unsigned int len, start; + start = (unsigned int) ftell(file); + fseek(file, 0, SEEK_END); + len = (unsigned int) (ftell(file) - start); + fseek(file, start, SEEK_SET); + return stb_vorbis_open_file_section(file, close_on_free, error, alloc, len); +} + +stb_vorbis * stb_vorbis_open_filename(const char *filename, int *error, const stb_vorbis_alloc *alloc) +{ + FILE *f; +#if defined(_WIN32) && defined(__STDC_WANT_SECURE_LIB__) + if (0 != fopen_s(&f, filename, "rb")) + f = NULL; +#else + f = fopen(filename, "rb"); +#endif + if (f) + return stb_vorbis_open_file(f, TRUE, error, alloc); + if (error) *error = VORBIS_file_open_failure; + return NULL; +} +#endif // STB_VORBIS_NO_STDIO + +stb_vorbis * stb_vorbis_open_memory(const unsigned char *data, int len, int *error, const stb_vorbis_alloc *alloc) +{ + stb_vorbis *f, p; + if (data == NULL) return NULL; + vorbis_init(&p, alloc); + p.stream = (uint8 *) data; + p.stream_end = (uint8 *) data + len; + p.stream_start = (uint8 *) p.stream; + p.stream_len = len; + p.push_mode = FALSE; + if (start_decoder(&p)) { + f = vorbis_alloc(&p); + if (f) { + *f = p; + vorbis_pump_first_frame(f); + if (error) *error = VORBIS__no_error; + return f; + } + } + if (error) *error = p.error; + vorbis_deinit(&p); + return NULL; +} + +#ifndef STB_VORBIS_NO_INTEGER_CONVERSION +#define PLAYBACK_MONO 1 +#define PLAYBACK_LEFT 2 +#define PLAYBACK_RIGHT 4 + +#define L (PLAYBACK_LEFT | PLAYBACK_MONO) +#define C (PLAYBACK_LEFT | PLAYBACK_RIGHT | PLAYBACK_MONO) +#define R (PLAYBACK_RIGHT | PLAYBACK_MONO) + +static int8 channel_position[7][6] = +{ + { 0 }, + { C }, + { L, R }, + { L, C, R }, + { L, R, L, R }, + { L, C, R, L, R }, + { L, C, R, L, R, C }, +}; + + +#ifndef STB_VORBIS_NO_FAST_SCALED_FLOAT + typedef union { + float f; + int i; + } float_conv; + typedef char stb_vorbis_float_size_test[sizeof(float)==4 && sizeof(int) == 4]; + #define FASTDEF(x) float_conv x + // add (1<<23) to convert to int, then divide by 2^SHIFT, then add 0.5/2^SHIFT to round + #define MAGIC(SHIFT) (1.5f * (1 << (23-SHIFT)) + 0.5f/(1 << SHIFT)) + #define ADDEND(SHIFT) (((150-SHIFT) << 23) + (1 << 22)) + #define FAST_SCALED_FLOAT_TO_INT(temp,x,s) (temp.f = (x) + MAGIC(s), temp.i - ADDEND(s)) + #define check_endianness() +#else + #define FAST_SCALED_FLOAT_TO_INT(temp,x,s) ((int) ((x) * (1 << (s)))) + #define check_endianness() + #define FASTDEF(x) +#endif + +static void copy_samples(short *dest, float *src, int len) +{ + int i; + check_endianness(); + for (i=0; i < len; ++i) { + FASTDEF(temp); + int v = FAST_SCALED_FLOAT_TO_INT(temp, src[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + dest[i] = v; + } +} + +static void compute_samples(int mask, short *output, int num_c, float **data, int d_offset, int len) +{ + #define BUFFER_SIZE 32 + float buffer[BUFFER_SIZE]; + int i,j,o,n = BUFFER_SIZE; + check_endianness(); + for (o = 0; o < len; o += BUFFER_SIZE) { + memset(buffer, 0, sizeof(buffer)); + if (o + n > len) n = len - o; + for (j=0; j < num_c; ++j) { + if (channel_position[num_c][j] & mask) { + for (i=0; i < n; ++i) + buffer[i] += data[j][d_offset+o+i]; + } + } + for (i=0; i < n; ++i) { + FASTDEF(temp); + int v = FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + output[o+i] = v; + } + } +} + +static void compute_stereo_samples(short *output, int num_c, float **data, int d_offset, int len) +{ + #define BUFFER_SIZE 32 + float buffer[BUFFER_SIZE]; + int i,j,o,n = BUFFER_SIZE >> 1; + // o is the offset in the source data + check_endianness(); + for (o = 0; o < len; o += BUFFER_SIZE >> 1) { + // o2 is the offset in the output data + int o2 = o << 1; + memset(buffer, 0, sizeof(buffer)); + if (o + n > len) n = len - o; + for (j=0; j < num_c; ++j) { + int m = channel_position[num_c][j] & (PLAYBACK_LEFT | PLAYBACK_RIGHT); + if (m == (PLAYBACK_LEFT | PLAYBACK_RIGHT)) { + for (i=0; i < n; ++i) { + buffer[i*2+0] += data[j][d_offset+o+i]; + buffer[i*2+1] += data[j][d_offset+o+i]; + } + } else if (m == PLAYBACK_LEFT) { + for (i=0; i < n; ++i) { + buffer[i*2+0] += data[j][d_offset+o+i]; + } + } else if (m == PLAYBACK_RIGHT) { + for (i=0; i < n; ++i) { + buffer[i*2+1] += data[j][d_offset+o+i]; + } + } + } + for (i=0; i < (n<<1); ++i) { + FASTDEF(temp); + int v = FAST_SCALED_FLOAT_TO_INT(temp,buffer[i],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + output[o2+i] = v; + } + } +} + +static void convert_samples_short(int buf_c, short **buffer, int b_offset, int data_c, float **data, int d_offset, int samples) +{ + int i; + if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { + static int channel_selector[3][2] = { {0}, {PLAYBACK_MONO}, {PLAYBACK_LEFT, PLAYBACK_RIGHT} }; + for (i=0; i < buf_c; ++i) + compute_samples(channel_selector[buf_c][i], buffer[i]+b_offset, data_c, data, d_offset, samples); + } else { + int limit = buf_c < data_c ? buf_c : data_c; + for (i=0; i < limit; ++i) + copy_samples(buffer[i]+b_offset, data[i]+d_offset, samples); + for ( ; i < buf_c; ++i) + memset(buffer[i]+b_offset, 0, sizeof(short) * samples); + } +} + +int stb_vorbis_get_frame_short(stb_vorbis *f, int num_c, short **buffer, int num_samples) +{ + float **output; + int len = stb_vorbis_get_frame_float(f, NULL, &output); + if (len > num_samples) len = num_samples; + if (len) + convert_samples_short(num_c, buffer, 0, f->channels, output, 0, len); + return len; +} + +static void convert_channels_short_interleaved(int buf_c, short *buffer, int data_c, float **data, int d_offset, int len) +{ + int i; + check_endianness(); + if (buf_c != data_c && buf_c <= 2 && data_c <= 6) { + assert(buf_c == 2); + for (i=0; i < buf_c; ++i) + compute_stereo_samples(buffer, data_c, data, d_offset, len); + } else { + int limit = buf_c < data_c ? buf_c : data_c; + int j; + for (j=0; j < len; ++j) { + for (i=0; i < limit; ++i) { + FASTDEF(temp); + float f = data[i][d_offset+j]; + int v = FAST_SCALED_FLOAT_TO_INT(temp, f,15);//data[i][d_offset+j],15); + if ((unsigned int) (v + 32768) > 65535) + v = v < 0 ? -32768 : 32767; + *buffer++ = v; + } + for ( ; i < buf_c; ++i) + *buffer++ = 0; + } + } +} + +int stb_vorbis_get_frame_short_interleaved(stb_vorbis *f, int num_c, short *buffer, int num_shorts) +{ + float **output; + int len; + if (num_c == 1) return stb_vorbis_get_frame_short(f,num_c,&buffer, num_shorts); + len = stb_vorbis_get_frame_float(f, NULL, &output); + if (len) { + if (len*num_c > num_shorts) len = num_shorts / num_c; + convert_channels_short_interleaved(num_c, buffer, f->channels, output, 0, len); + } + return len; +} + +int stb_vorbis_get_samples_short_interleaved(stb_vorbis *f, int channels, short *buffer, int num_shorts) +{ + float **outputs; + int len = num_shorts / channels; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + if (k) + convert_channels_short_interleaved(channels, buffer, f->channels, f->channel_buffers, f->channel_buffer_start, k); + buffer += k*channels; + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +int stb_vorbis_get_samples_short(stb_vorbis *f, int channels, short **buffer, int len) +{ + float **outputs; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + if (k) + convert_samples_short(channels, buffer, n, f->channels, f->channel_buffers, f->channel_buffer_start, k); + n += k; + f->channel_buffer_start += k; + if (n == len) break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) break; + } + return n; +} + +#ifndef STB_VORBIS_NO_STDIO +int stb_vorbis_decode_filename(const char *filename, int *channels, int *sample_rate, short **output) +{ + int data_len, offset, total, limit, error; + short *data; + stb_vorbis *v = stb_vorbis_open_filename(filename, &error, NULL); + if (v == NULL) return -1; + limit = v->channels * 4096; + *channels = v->channels; + if (sample_rate) + *sample_rate = v->sample_rate; + offset = data_len = 0; + total = limit; + data = (short *) malloc(total * sizeof(*data)); + if (data == NULL) { + stb_vorbis_close(v); + return -2; + } + for (;;) { + int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); + if (n == 0) break; + data_len += n; + offset += n * v->channels; + if (offset + limit > total) { + short *data2; + total *= 2; + data2 = (short *) realloc(data, total * sizeof(*data)); + if (data2 == NULL) { + free(data); + stb_vorbis_close(v); + return -2; + } + data = data2; + } + } + *output = data; + stb_vorbis_close(v); + return data_len; +} +#endif // NO_STDIO + +int stb_vorbis_decode_memory(const uint8 *mem, int len, int *channels, int *sample_rate, short **output) +{ + int data_len, offset, total, limit, error; + short *data; + stb_vorbis *v = stb_vorbis_open_memory(mem, len, &error, NULL); + if (v == NULL) return -1; + limit = v->channels * 4096; + *channels = v->channels; + if (sample_rate) + *sample_rate = v->sample_rate; + offset = data_len = 0; + total = limit; + data = (short *) malloc(total * sizeof(*data)); + if (data == NULL) { + stb_vorbis_close(v); + return -2; + } + for (;;) { + int n = stb_vorbis_get_frame_short_interleaved(v, v->channels, data+offset, total-offset); + if (n == 0) break; + data_len += n; + offset += n * v->channels; + if (offset + limit > total) { + short *data2; + total *= 2; + data2 = (short *) realloc(data, total * sizeof(*data)); + if (data2 == NULL) { + free(data); + stb_vorbis_close(v); + return -2; + } + data = data2; + } + } + *output = data; + stb_vorbis_close(v); + return data_len; +} +#endif // STB_VORBIS_NO_INTEGER_CONVERSION + +int stb_vorbis_get_samples_float_interleaved(stb_vorbis *f, int channels, float *buffer, int num_floats) +{ + float **outputs; + int len = num_floats / channels; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < len) { + int i,j; + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= len) k = len - n; + for (j=0; j < k; ++j) { + for (i=0; i < z; ++i) + *buffer++ = f->channel_buffers[i][f->channel_buffer_start+j]; + for ( ; i < channels; ++i) + *buffer++ = 0; + } + n += k; + f->channel_buffer_start += k; + if (n == len) + break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) + break; + } + return n; +} + +int stb_vorbis_get_samples_float(stb_vorbis *f, int channels, float **buffer, int num_samples) +{ + float **outputs; + int n=0; + int z = f->channels; + if (z > channels) z = channels; + while (n < num_samples) { + int i; + int k = f->channel_buffer_end - f->channel_buffer_start; + if (n+k >= num_samples) k = num_samples - n; + if (k) { + for (i=0; i < z; ++i) + memcpy(buffer[i]+n, f->channel_buffers[i]+f->channel_buffer_start, sizeof(float)*k); + for ( ; i < channels; ++i) + memset(buffer[i]+n, 0, sizeof(float) * k); + } + n += k; + f->channel_buffer_start += k; + if (n == num_samples) + break; + if (!stb_vorbis_get_frame_float(f, NULL, &outputs)) + break; + } + return n; +} +#endif // STB_VORBIS_NO_PULLDATA_API + +/* Version history + 1.12 - 2017-11-21 - limit residue begin/end to blocksize/2 to avoid large temp allocs in bad/corrupt files + 1.11 - 2017-07-23 - fix MinGW compilation + 1.10 - 2017-03-03 - more robust seeking; fix negative ilog(); clear error in open_memory + 1.09 - 2016-04-04 - back out 'avoid discarding last frame' fix from previous version + 1.08 - 2016-04-02 - fixed multiple warnings; fix setup memory leaks; + avoid discarding last frame of audio data + 1.07 - 2015-01-16 - fixed some warnings, fix mingw, const-correct API + some more crash fixes when out of memory or with corrupt files + 1.06 - 2015-08-31 - full, correct support for seeking API (Dougall Johnson) + some crash fixes when out of memory or with corrupt files + 1.05 - 2015-04-19 - don't define __forceinline if it's redundant + 1.04 - 2014-08-27 - fix missing const-correct case in API + 1.03 - 2014-08-07 - Warning fixes + 1.02 - 2014-07-09 - Declare qsort compare function _cdecl on windows + 1.01 - 2014-06-18 - fix stb_vorbis_get_samples_float + 1.0 - 2014-05-26 - fix memory leaks; fix warnings; fix bugs in multichannel + (API change) report sample rate for decode-full-file funcs + 0.99996 - bracket #include for macintosh compilation by Laurent Gomila + 0.99995 - use union instead of pointer-cast for fast-float-to-int to avoid alias-optimization problem + 0.99994 - change fast-float-to-int to work in single-precision FPU mode, remove endian-dependence + 0.99993 - remove assert that fired on legal files with empty tables + 0.99992 - rewind-to-start + 0.99991 - bugfix to stb_vorbis_get_samples_short by Bernhard Wodo + 0.9999 - (should have been 0.99990) fix no-CRT support, compiling as C++ + 0.9998 - add a full-decode function with a memory source + 0.9997 - fix a bug in the read-from-FILE case in 0.9996 addition + 0.9996 - query length of vorbis stream in samples/seconds + 0.9995 - bugfix to another optimization that only happened in certain files + 0.9994 - bugfix to one of the optimizations that caused significant (but inaudible?) errors + 0.9993 - performance improvements; runs in 99% to 104% of time of reference implementation + 0.9992 - performance improvement of IMDCT; now performs close to reference implementation + 0.9991 - performance improvement of IMDCT + 0.999 - (should have been 0.9990) performance improvement of IMDCT + 0.998 - no-CRT support from Casey Muratori + 0.997 - bugfixes for bugs found by Terje Mathisen + 0.996 - bugfix: fast-huffman decode initialized incorrectly for sparse codebooks; fixing gives 10% speedup - found by Terje Mathisen + 0.995 - bugfix: fix to 'effective' overrun detection - found by Terje Mathisen + 0.994 - bugfix: garbage decode on final VQ symbol of a non-multiple - found by Terje Mathisen + 0.993 - bugfix: pushdata API required 1 extra byte for empty page (failed to consume final page if empty) - found by Terje Mathisen + 0.992 - fixes for MinGW warning + 0.991 - turn fast-float-conversion on by default + 0.990 - fix push-mode seek recovery if you seek into the headers + 0.98b - fix to bad release of 0.98 + 0.98 - fix push-mode seek recovery; robustify float-to-int and support non-fast mode + 0.97 - builds under c++ (typecasting, don't use 'class' keyword) + 0.96 - somehow MY 0.95 was right, but the web one was wrong, so here's my 0.95 rereleased as 0.96, fixes a typo in the clamping code + 0.95 - clamping code for 16-bit functions + 0.94 - not publically released + 0.93 - fixed all-zero-floor case (was decoding garbage) + 0.92 - fixed a memory leak + 0.91 - conditional compiles to omit parts of the API and the infrastructure to support them: STB_VORBIS_NO_PULLDATA_API, STB_VORBIS_NO_PUSHDATA_API, STB_VORBIS_NO_STDIO, STB_VORBIS_NO_INTEGER_CONVERSION + 0.90 - first public release +*/ + +#endif // STB_VORBIS_HEADER_ONLY + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ + +#pragma GCC diagnostic pop +#pragma GCC diagnostic pop diff --git a/source/audio/vitaaudiolib.c b/source/audio/vitaaudiolib.c new file mode 100644 index 0000000..4d422f3 --- /dev/null +++ b/source/audio/vitaaudiolib.c @@ -0,0 +1,169 @@ +#include +#include + +#include "vitaaudiolib.h" + +static int audio_ready = 0; +static short vitaAudioSoundBuffer[VITA_NUM_AUDIO_CHANNELS][2][VITA_NUM_AUDIO_SAMPLES][2]; +static VITA_audio_channelinfo vitaAudioStatus[VITA_NUM_AUDIO_CHANNELS]; +static volatile int audio_terminate = 0; + +void vitaAudioSetVolume(int channel, int left, int right) { + vitaAudioStatus[channel].volumeleft = left; + vitaAudioStatus[channel].volumeright = right; +} + +int vitaAudioSetFrequency(int channel, int frequency) { + return sceAudioOutSetConfig(vitaAudioStatus[channel].handle, VITA_NUM_AUDIO_SAMPLES, frequency, SCE_AUDIO_OUT_MODE_STEREO); +} + +void vitaAudioSetChannelCallback(int channel, vitaAudioCallback_t callback, void *data) { + volatile VITA_audio_channelinfo *pci = &vitaAudioStatus[channel]; + + if (callback == 0) + pci->callback = 0; + else + pci->callback = callback; +} + +int vitaAudioOutBlocking(unsigned int channel, unsigned int vol1, unsigned int vol2, void *buf) { + if (!audio_ready) + return(-1); + + if (channel >= VITA_NUM_AUDIO_CHANNELS) + return(-1); + + if (vol1 > VITA_VOLUME_MAX) + vol1 = VITA_VOLUME_MAX; + + if (vol2 > VITA_VOLUME_MAX) + vol2 = VITA_VOLUME_MAX; + + int vols2[2] = { vol1, vol2 }; + sceAudioOutSetVolume(vitaAudioStatus[channel].handle, SCE_AUDIO_VOLUME_FLAG_L_CH | SCE_AUDIO_VOLUME_FLAG_R_CH, vols2); + return sceAudioOutOutput(vitaAudioStatus[channel].handle, buf); +} + +static int vitaAudioChannelThread(int args, void *argp) { + volatile int bufidx = 0; + + int channel = *(int *) argp; + + while (audio_terminate == 0) { + void *bufptr = &vitaAudioSoundBuffer[channel][bufidx]; + vitaAudioCallback_t callback; + callback = vitaAudioStatus[channel].callback; + + if (callback) + callback(bufptr, VITA_NUM_AUDIO_SAMPLES, vitaAudioStatus[channel].pdata); + else { + unsigned int *ptr = bufptr; + int i; + for (i = 0; i < VITA_NUM_AUDIO_SAMPLES; ++i) + *(ptr++) = 0; + } + + vitaAudioOutBlocking(channel, vitaAudioStatus[channel].volumeleft, vitaAudioStatus[channel].volumeright, bufptr); + bufidx = (bufidx ? 0:1); + } + + sceKernelExitThread(0); + return(0); +} + +int vitaAudioInit(int frequency, SceAudioOutMode mode) { + int i, ret; + int failed = 0; + char str[32]; + + audio_terminate = 0; + audio_ready = 0; + + for (i = 0; i < VITA_NUM_AUDIO_CHANNELS; i++) { + vitaAudioStatus[i].handle = -1; + vitaAudioStatus[i].threadhandle = -1; + vitaAudioStatus[i].volumeright = VITA_VOLUME_MAX; + vitaAudioStatus[i].volumeleft = VITA_VOLUME_MAX; + vitaAudioStatus[i].callback = 0; + vitaAudioStatus[i].pdata = 0; + } + + for (i = 0; i < VITA_NUM_AUDIO_CHANNELS; i++) { + if ((vitaAudioStatus[i].handle = sceAudioOutOpenPort(SCE_AUDIO_OUT_PORT_TYPE_BGM, VITA_NUM_AUDIO_SAMPLES, frequency, mode)) < 0) + failed = 1; + } + + if (failed) { + for (i = 0; i < VITA_NUM_AUDIO_CHANNELS; i++) { + if (vitaAudioStatus[i].handle != -1) + sceAudioOutReleasePort(vitaAudioStatus[i].handle); + + vitaAudioStatus[i].handle = -1; + } + + return 0; + } + + audio_ready = 1; + + strcpy(str, "audiot0"); + + for (i = 0; i < VITA_NUM_AUDIO_CHANNELS; i++) { + str[6]= '0' + i; + vitaAudioStatus[i].threadhandle = sceKernelCreateThread(str, (void*)&vitaAudioChannelThread, 0x40, 0x10000, 0, 0, NULL); + + if (vitaAudioStatus[i].threadhandle < 0) { + vitaAudioStatus[i].threadhandle = -1; + failed = 1; + break; + } + + ret = sceKernelStartThread(vitaAudioStatus[i].threadhandle, sizeof(i), &i); + + if (ret != 0) { + failed = 1; + break; + } + } + + if (failed) { + audio_terminate = 1; + + for (i = 0; i < VITA_NUM_AUDIO_CHANNELS; i++) { + if (vitaAudioStatus[i].threadhandle != -1) + sceKernelDeleteThread(vitaAudioStatus[i].threadhandle); + + vitaAudioStatus[i].threadhandle = -1; + } + + audio_ready = 0; + return 0; + } + + return 1; +} + +void vitaAudioEndPre(void) { + audio_ready = 0; + audio_terminate = 1; +} + +void vitaAudioEnd(void) { + int i = 0; + audio_ready = 0; + audio_terminate = 1; + + for (i = 0; i < VITA_NUM_AUDIO_CHANNELS; i++) { + if (vitaAudioStatus[i].threadhandle != -1) + sceKernelDeleteThread(vitaAudioStatus[i].threadhandle); + + vitaAudioStatus[i].threadhandle = -1; + } + + for (i = 0; i < VITA_NUM_AUDIO_CHANNELS; i++) { + if (vitaAudioStatus[i].handle != -1) { + sceAudioOutReleasePort(vitaAudioStatus[i].handle); + vitaAudioStatus[i].handle = -1; + } + } +} diff --git a/source/audio/wav.c b/source/audio/wav.c new file mode 100644 index 0000000..f359bc7 --- /dev/null +++ b/source/audio/wav.c @@ -0,0 +1,41 @@ +#include "audio.h" +#define DR_WAV_IMPLEMENTATION +#include "dr_wav.h" + +static drwav wav; +static drwav_uint64 frames_read = 0; + +int WAV_Init(const char *path) { + if (!drwav_init_file(&wav, path)) + return -1; + + return 0; +} + +SceUInt32 WAV_GetSampleRate(void) { + return wav.sampleRate; +} + +SceUInt8 WAV_GetChannels(void) { + return wav.channels; +} + +void WAV_Decode(void *buf, unsigned int length, void *userdata) { + frames_read += drwav_read_pcm_frames_s16(&wav, (drwav_uint64)length, (drwav_int16 *)buf); + + if (frames_read == wav.totalPCMFrameCount) + playing = SCE_FALSE; +} + +SceUInt64 WAV_GetPosition(void) { + return frames_read; +} + +SceUInt64 WAV_GetLength(void) { + return wav.totalPCMFrameCount; +} + +void WAV_Term(void) { + frames_read = 0; + drwav_uninit(&wav); +} diff --git a/source/audio/xm.c b/source/audio/xm.c new file mode 100644 index 0000000..cc4dee3 --- /dev/null +++ b/source/audio/xm.c @@ -0,0 +1,57 @@ +#include "audio.h" +#include "common.h" +#include "fs.h" +#define JAR_XM_IMPLEMENTATION +#include "jar_xm.h" + +static jar_xm_context_t *xm; +static SceUInt64 samples_read = 0, total_samples = 0; +static char *data = NULL; + +int XM_Init(const char *path) { + int ret = 0; + char *xm_data = NULL; + SceUInt64 xm_size_bytes = 0; + + if (R_FAILED(ret = FS_GetFileSize(path, (SceOff *)&xm_size_bytes))) + return ret; + + xm_data = malloc(xm_size_bytes); + if (R_FAILED(ret = FS_ReadFile(path, xm_data, xm_size_bytes))) + return ret; + + jar_xm_create_context_safe(&xm, xm_data, (size_t)xm_size_bytes, (SceUInt32)48000); + total_samples = jar_xm_get_remaining_samples(xm); + + return 0; +} + +SceUInt32 XM_GetSampleRate(void) { + return 48000; +} + +SceUInt8 XM_GetChannels(void) { + return 2; +} + +void XM_Decode(void *buf, unsigned int length, void *userdata) { + jar_xm_generate_samples_16bit(xm, (short *)buf, (size_t)length); + jar_xm_get_position(xm, NULL, NULL, NULL, &samples_read); + + if (samples_read == total_samples) + playing = SCE_FALSE; +} + +SceUInt64 XM_GetPosition(void) { + return samples_read; +} + +SceUInt64 XM_GetLength(void) { + return total_samples; +} + +void XM_Term(void) { + samples_read = 0; + jar_xm_free_context(xm); + free(data); +} diff --git a/source/common.c b/source/common.c new file mode 100644 index 0000000..085bc79 --- /dev/null +++ b/source/common.c @@ -0,0 +1,8 @@ +#include "common.h" + +vita2d_font *font; +enum SceCtrlButtons SCE_CTRL_ENTER, SCE_CTRL_CANCEL; +SceUInt32 pressed = 0; +int position = 0; +int file_count = 0; +char cwd[512]; diff --git a/source/dirbrowse.c b/source/dirbrowse.c new file mode 100644 index 0000000..e51f66a --- /dev/null +++ b/source/dirbrowse.c @@ -0,0 +1,205 @@ +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "dirbrowse.h" +#include "fs.h" +#include "menu_audioplayer.h" +#include "textures.h" +#include "utils.h" + +File *files = NULL; + +static void Dirbrowse_RecursiveFree(File *node) { + if (node == NULL) // End of list + return; + + Dirbrowse_RecursiveFree(node->next); // Nest further + free(node); // Free memory +} + +static void Dirbrowse_SaveLastDirectory(void) { + char *buf = malloc(256); + int len = snprintf(buf, 256, "%s\n", cwd); + FS_WriteFile("ux0:data/elevenmpv/lastdir.txt", buf, len); + free(buf); +} + +int Dirbrowse_PopulateFiles(SceBool refresh) { + SceUID dir = 0; + Dirbrowse_RecursiveFree(files); + files = NULL; + file_count = 0; + + if (R_SUCCEEDED(dir = sceIoDopen(cwd))) { + int entryCount = 0, i = 0; + SceIoDirent *entries = (SceIoDirent *)calloc(MAX_FILES, sizeof(SceIoDirent)); + + while (sceIoDread(dir, &entries[entryCount]) > 0) + entryCount++; + + sceIoDclose(dir); + qsort(entries, entryCount, sizeof(SceIoDirent), Utils_Alphasort); + + for (i = 0; i < entryCount; i++) { + // Ingore null filename + if (entries[i].d_name[0] == '\0') + continue; + + // Ignore "." in all directories + if (!strcmp(entries[i].d_name, ".")) + continue; + + // Ignore ".." in Root Directory + if ((!strcmp(cwd, ROOT_PATH)) && (!strncmp(entries[i].d_name, "..", 2))) // Ignore ".." in Root Directory + continue; + + // Allocate Memory + File *item = (File *)malloc(sizeof(File)); + memset(item, 0, sizeof(File)); + + item->is_dir = SCE_S_ISDIR(entries[i].d_stat.st_mode); + + // Copy File Name + strcpy(item->name, entries[i].d_name); + strcpy(item->ext, FS_GetFileExt(item->name)); + + // New List + if (files == NULL) + files = item; + + // Existing List + else { + File *list = files; + + while(list->next != NULL) + list = list->next; + + list->next = item; + } + + file_count++; + } + + free(entries); + } + else + return dir; + + if (!refresh) { + if (position >= file_count) + position = file_count - 1; // Keep index + } + else + position = 0; // Refresh position + + return 0; +} + +void Dirbrowse_DisplayFiles(void) { + vita2d_font_draw_text(font, 102, 40 + ((72 - vita2d_font_text_height(font, 25, cwd)) / 2) + 20, RGBA8(255, 255, 255, 255), 25, cwd); + + int i = 0, printed = 0; + File *file = files; // Draw file list + + for(; file != NULL; file = file->next) { + if (printed == FILES_PER_PAGE) // Limit the files per page + break; + + if (position < FILES_PER_PAGE || i > (position - FILES_PER_PAGE)) { + if (i == position) + vita2d_draw_rectangle(0, 112 + (72 * printed), 960, 72, RGBA8(230, 230, 230, 255)); + + if (file->is_dir) + vita2d_draw_texture(icon_dir, 15, 117 + (72 * printed)); + else if ((!strncasecmp(file->ext, "flac", 4)) || (!strncasecmp(file->ext, "mp3", 3)) || (!strncasecmp(file->ext, "ogg", 3)) + || (!strncasecmp(file->ext, "wav", 3)) || (!strncasecmp(file->ext, "xm", 2))) + vita2d_draw_texture(icon_audio, 15, 117 + (72 * printed)); + else + vita2d_draw_texture(icon_file, 15, 117 + (72 * printed)); + + if (strncmp(file->name, "..", 2) == 0) + vita2d_font_draw_text(font, 102, 120 + (72 / 2) + (72 * printed), RGBA8(51, 51, 51, 255), 25, "Parent folder"); + else + vita2d_font_draw_text(font, 102, 120 + (72 / 2) + (72 * printed), RGBA8(51, 51, 51, 255), 25, file->name); + + printed++; // Increase printed counter + } + + i++; // Increase counter + } +} + +File *Dirbrowse_GetFileIndex(int index) { + int i = 0; + File *file = files; // Find file Item + + for(; file != NULL && i != index; file = file->next) + i++; + + return file; // Return file +} + +void Dirbrowse_OpenFile(void) { + char path[512]; + File *file = Dirbrowse_GetFileIndex(position); + + if (file == NULL) + return; + + strcpy(path, cwd); + strcpy(path + strlen(path), file->name); + + if (file->is_dir) { + // Attempt to navigate to target + if (R_SUCCEEDED(Dirbrowse_Navigate(SCE_FALSE))) { + Dirbrowse_SaveLastDirectory(); + Dirbrowse_PopulateFiles(SCE_TRUE); + } + } + else if ((!strncasecmp(file->ext, "flac", 4)) || (!strncasecmp(file->ext, "mp3", 3)) || (!strncasecmp(file->ext, "ogg", 3)) + || (!strncasecmp(file->ext, "wav", 3)) || (!strncasecmp(file->ext, "xm", 2))) + Menu_PlayAudio(path); +} + +// Navigate to Folder +int Dirbrowse_Navigate(SceBool parent) { + File *file = Dirbrowse_GetFileIndex(position); // Get index + + if (file == NULL) + return -1; + + // Special case ".." + if ((parent) || (!strncmp(file->name, "..", 2))) { + char *slash = NULL; + + // Find last '/' in working directory + int i = strlen(cwd) - 2; for(; i >= 0; i--) { + // Slash discovered + if (cwd[i] == '/') { + slash = cwd + i + 1; // Save pointer + break; // Stop search + } + } + + slash[0] = 0; // Terminate working directory + } + + // Normal folder + else { + if (file->is_dir) { + // Append folder to working directory + strcpy(cwd + strlen(cwd), file->name); + cwd[strlen(cwd) + 1] = 0; + cwd[strlen(cwd)] = '/'; + } + } + + Dirbrowse_SaveLastDirectory(); + + return 0; // Return success +} diff --git a/source/fs.c b/source/fs.c new file mode 100644 index 0000000..76ac136 --- /dev/null +++ b/source/fs.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include + +#include "common.h" +#include "fs.h" + +SceBool FS_FileExists(const char *path) { + SceUID file = 0; + + if (R_SUCCEEDED(file = sceIoOpen(path, SCE_O_RDONLY, 0777))) { + sceIoClose(file); + return SCE_TRUE; + } + + return SCE_FALSE; +} + +SceBool FS_DirExists(const char *path) { + SceUID dir = 0; + + if (R_SUCCEEDED(dir = sceIoDopen(path))) { + sceIoDclose(dir); + return SCE_TRUE; + } + + return SCE_FALSE; +} + +const char *FS_GetFileExt(const char *filename) { + const char *dot = strrchr(filename, '.'); + + if (!dot || dot == filename) + return ""; + + return dot + 1; +} + +int FS_GetFileSize(const char *path, SceOff *size) { + SceIoStat stat; + int ret = 0; + + if (R_FAILED(ret = sceIoGetstat(path, &stat))) + return ret; + + *size = stat.st_size; + + return 0; +} + +int FS_ReadFile(const char *path, void *buf, int size) { + SceUID file = 0; + + if (R_SUCCEEDED(file = sceIoOpen(path, SCE_O_RDONLY, 0))) { + int bytes_read = sceIoRead(file, buf, size); + sceIoClose(file); + return bytes_read; + } + + return file; +} + +int FS_WriteFile(char *path, void *buf, int size) { + SceUID file = 0; + + if (R_SUCCEEDED(file = sceIoOpen(path, SCE_O_WRONLY | SCE_O_CREAT | SCE_O_TRUNC, 0777))) { + int bytes_written = sceIoWrite(file, buf, size); + sceIoClose(file); + return bytes_written; + } + + return file; +} diff --git a/source/main.c b/source/main.c new file mode 100644 index 0000000..9932009 --- /dev/null +++ b/source/main.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include + +#include "common.h" +#include "fs.h" +#include "menu_displayfiles.h" +#include "textures.h" +#include "utils.h" + +static int GetLastDirectory(void) { + int ret = 0; + + if (!FS_DirExists("ux0:data/elevenmpv")) + sceIoMkdir("ux0:data/elevenmpv", 0777); + + if (!FS_FileExists("ux0:data/elevenmpv/lastdir.txt")) { + char *buf = malloc(8); + int length = snprintf(buf, 8, ROOT_PATH); + + if (R_FAILED(ret = FS_WriteFile("ux0:data/elevenmpv/lastdir.txt", buf, length))) { + free(buf); + return ret; + } + + strcpy(cwd, ROOT_PATH); // Set Start Path to "sdmc:/" if lastDir.txt hasn't been created. + } + else { + SceOff size = 0; + + FS_GetFileSize("ux0:data/elevenmpv/lastdir.txt", &size); + char *buf = malloc(size + 1); + + if (R_FAILED(ret = FS_ReadFile("ux0:data/elevenmpv/lastdir.txt", buf, size))) { + free(buf); + return ret; + } + + buf[size] = '\0'; + char path[513]; + sscanf(buf, "%[^\n]s", path); + + if (FS_DirExists(path)) // Incase a directory previously visited had been deleted, set start path to sdmc:/ to avoid errors. + strcpy(cwd, path); + else + strcpy(cwd, ROOT_PATH); + + free(buf); + } + + return 0; +} + +int main(int argc, char *argv[]) { + vita2d_init(); + font = vita2d_load_font_file("app0:Roboto-Regular.ttf"); + Textures_Load(); + + Utils_InitAppUtil(); + SCE_CTRL_ENTER = Utils_GetEnterButton(); + SCE_CTRL_CANCEL = Utils_GetCancelButton(); + + GetLastDirectory(); + + Menu_DisplayFiles(); + + Utils_TermAppUtil(); + + Textures_Free(); + vita2d_free_font(font); + vita2d_fini(); + + sceKernelExitProcess(0); + return 0; +} diff --git a/source/menus/menu_audioplayer.c b/source/menus/menu_audioplayer.c new file mode 100644 index 0000000..bcf85dc --- /dev/null +++ b/source/menus/menu_audioplayer.c @@ -0,0 +1,238 @@ +#include +#include +#include +#include +#include + +#include "audio.h" +#include "common.h" +#include "fs.h" +#include "menu_displayfiles.h" +#include "status_bar.h" +#include "textures.h" +#include "utils.h" + +#define BUTTON_WIDTH 68 +#define BUTTON_HEIGHT 68 + +typedef enum { + MUSIC_STATE_NONE, // 0 + MUSIC_STATE_REPEAT, // 1 + MUSIC_STATE_SHUFFLE // 2 +} Music_State; + +static char playlist[1024][512]; +static int count = 0, selection = 0, state = 0; +static int length_time_width = 0; +char *position_time = NULL, *length_time = NULL, *filename = NULL; + +static int Menu_GetMusicList(void) { + SceUID dir = 0; + + if (R_SUCCEEDED(dir = sceIoDopen(cwd))) { + int entryCount = 0, i = 0; + SceIoDirent *entries = (SceIoDirent *)calloc(MAX_FILES, sizeof(SceIoDirent)); + + while (sceIoDread(dir, &entries[entryCount]) > 0) + entryCount++; + + sceIoDclose(dir); + qsort(entries, entryCount, sizeof(SceIoDirent), Utils_Alphasort); + + for (i = 0; i < entryCount; i++) { + if ((!strncasecmp(FS_GetFileExt(entries[i].d_name), "flac", 4)) || (!strncasecmp(FS_GetFileExt(entries[i].d_name), "mp3", 3)) || (!strncasecmp(FS_GetFileExt(entries[i].d_name), "ogg", 3)) + || (!strncasecmp(FS_GetFileExt(entries[i].d_name), "wav", 3)) || (!strncasecmp(FS_GetFileExt(entries[i].d_name), "xm", 2))) { + strcpy(playlist[count], cwd); + strcpy(playlist[count] + strlen(playlist[count]), entries[i].d_name); + count++; + } + } + + free(entries); + } + else { + sceIoDclose(dir); + return dir; + } + + return 0; +} + +static int Music_GetCurrentIndex(char *path) { + for(int i = 0; i < count; ++i) { + if (!strcmp(playlist[i], path)) + return i; + } + + return 0; +} + +static void Menu_ConvertSecondsToString(char *string, SceUInt64 seconds) { + int h = 0, m = 0, s = 0; + h = (seconds / 3600); + m = (seconds - (3600 * h)) / 60; + s = (seconds - (3600 * h) - (m * 60)); + + if (h > 0) + snprintf(string, 35, "%02d:%02d:%02d", h, m, s); + else + snprintf(string, 35, "%02d:%02d", m, s); +} + +static void Menu_InitMusic(char *path) { + Audio_Init(path); + + filename = malloc(128); + snprintf(filename, 128, Utils_Basename(path)); + position_time = malloc(35); + length_time = malloc(35); + length_time_width = 0; + + Menu_ConvertSecondsToString(length_time, Audio_GetLengthSeconds()); + length_time_width = vita2d_font_text_width(font, 25, length_time); + selection = Music_GetCurrentIndex(path); +} + +static void Music_HandleNext(SceBool forward, int state) { + if (state == MUSIC_STATE_NONE) { + if (forward) + selection++; + else + selection--; + } + else if (state == MUSIC_STATE_SHUFFLE) { + int old_selection = selection; + time_t t; + srand((unsigned) time(&t)); + selection = rand() % (count - 1); + + if (selection == old_selection) + selection--; + } + + Utils_SetMax(&selection, 0, (count - 1)); + Utils_SetMin(&selection, (count - 1), 0); + + Audio_Stop(); + + free(filename); + free(length_time); + free(position_time); + + if ((metadata.has_meta) && (metadata.cover_image)) { + vita2d_wait_rendering_done(); + vita2d_free_texture(metadata.cover_image); + } + + Audio_Term(); + Menu_InitMusic(playlist[selection]); +} + +void Menu_PlayAudio(char *path) { + Menu_GetMusicList(); + Menu_InitMusic(path); + + while(SCE_TRUE) { + vita2d_start_drawing(); + vita2d_clear_screen(); + + vita2d_draw_texture(default_artwork_blur, 0, 0); + vita2d_draw_rectangle(0, 0, 960, 40, RGBA8(97, 97, 97, 255)); + vita2d_draw_texture(icon_back, 10, 57); + StatusBar_Display(); + + if ((metadata.has_meta) && (strlen(metadata.title) != 0) && (strlen(metadata.artist) != 0)) { + vita2d_font_draw_text(font, 80, 22 + (80 - vita2d_font_text_height(font, 25, strupr(metadata.title))) + 20, RGBA8(255, 255, 255, 255), 25, strupr(metadata.title)); + vita2d_font_draw_text(font, 80, 22 + (80 - vita2d_font_text_height(font, 25, strupr(metadata.artist))) + 55, RGBA8(255, 255, 255, 255), 25, strupr(metadata.artist)); + } + else if ((metadata.has_meta) && (strlen(metadata.title) != 0)) + vita2d_font_draw_text(font, 80, 22 + (80 - vita2d_font_text_height(font, 25, strupr(metadata.title))) + 15, RGBA8(255, 255, 255, 255), 25, strupr(metadata.title)); + else if (!metadata.has_meta) + vita2d_font_draw_text(font, 80, 22 + (80 - vita2d_font_text_height(font, 25, strupr(filename))) + 15, RGBA8(255, 255, 255, 255), 25, filename); + + vita2d_draw_rectangle(0, 124, 400, 400, RGBA8(97, 97, 97, 255)); + + if ((metadata.has_meta) && (metadata.cover_image)) + vita2d_draw_texture_scale(metadata.cover_image, 0, 124, 400.0f/vita2d_texture_get_width(metadata.cover_image), 400.0f/vita2d_texture_get_height(metadata.cover_image)); + else + vita2d_draw_texture(default_artwork, 0, 124); // Default album art + + vita2d_draw_rectangle(410, 124, 550, 400, RGBA8(45, 48, 50, 255)); // Draw info box (outer) + vita2d_draw_rectangle(420, 134, 530, 380, RGBA8(46, 49, 51, 255)); // Draw info box (inner) + + if (!Audio_IsPaused()) + vita2d_draw_texture(btn_pause, 410 + ((550 - BUTTON_WIDTH) / 2), 124 + ((400 - BUTTON_HEIGHT) / 2)); // Playing + else + vita2d_draw_texture(btn_play, 410 + ((550 - BUTTON_WIDTH) / 2), 124 + ((400 - BUTTON_HEIGHT) / 2)); // Paused + + vita2d_draw_texture(btn_rewind, 410 + ((550 - BUTTON_WIDTH) / 2) - 136, 124 + ((400 - BUTTON_HEIGHT) / 2)); + vita2d_draw_texture(btn_forward, 410 + ((550 - BUTTON_WIDTH) / 2) + 136, 124 + ((400 - BUTTON_HEIGHT) / 2)); + + vita2d_draw_texture(state == MUSIC_STATE_SHUFFLE? btn_shuffle_overlay : btn_shuffle, 410 + ((550 - BUTTON_WIDTH) / 2) - 90, 124 + ((400 - BUTTON_HEIGHT) / 2) + 100); + vita2d_draw_texture(state == MUSIC_STATE_REPEAT? btn_repeat_overlay : btn_repeat, 410 + ((550 - BUTTON_WIDTH) / 2) + 90, 124 + ((400 - BUTTON_HEIGHT) / 2) + 100); + + Menu_ConvertSecondsToString(position_time, Audio_GetPositionSeconds()); + vita2d_font_draw_text(font, 460, 480, RGBA8(255, 255, 255, 255), 25, position_time); + vita2d_font_draw_text(font, 910 - length_time_width, 480, RGBA8(255, 255, 255, 255), 25, length_time); + vita2d_draw_rectangle(460, 490, 450, 4, RGBA8(97, 97, 97, 255)); + vita2d_draw_rectangle(460, 490, (((double)Audio_GetPosition()/(double)Audio_GetLength()) * 450.0), 4, RGBA8(255, 255, 255, 255)); + + vita2d_end_drawing(); + vita2d_swap_buffers(); + + if (!playing) { + if (state == MUSIC_STATE_NONE) + break; + else if (state == MUSIC_STATE_REPEAT) + Music_HandleNext(SCE_FALSE, MUSIC_STATE_REPEAT); + else if (state == MUSIC_STATE_SHUFFLE) { + if (count != 0) + Music_HandleNext(SCE_FALSE, MUSIC_STATE_SHUFFLE); + } + } + + Utils_ReadControls(); + + if (pressed & SCE_CTRL_ENTER) + Audio_Pause(); + + if (pressed & SCE_CTRL_TRIANGLE) { + if (state == MUSIC_STATE_SHUFFLE) + state = MUSIC_STATE_NONE; + else + state = MUSIC_STATE_SHUFFLE; + } + else if (pressed & SCE_CTRL_SQUARE) { + if (state == MUSIC_STATE_REPEAT) + state = MUSIC_STATE_NONE; + else + state = MUSIC_STATE_REPEAT; + } + + if (pressed & SCE_CTRL_LTRIGGER) { + if (count != 0) + Music_HandleNext(SCE_FALSE, MUSIC_STATE_NONE); + } + else if (pressed & SCE_CTRL_RTRIGGER) { + if (count != 0) + Music_HandleNext(SCE_TRUE, MUSIC_STATE_NONE); + } + + if (pressed & SCE_CTRL_CANCEL) + break; + } + + free(filename); + free(length_time); + free(position_time); + + if ((metadata.has_meta) && (metadata.cover_image)) { + vita2d_wait_rendering_done(); + vita2d_free_texture(metadata.cover_image); + } + + Audio_Stop(); + Audio_Term(); + count = 0; + Menu_DisplayFiles(); +} diff --git a/source/menus/menu_displayfiles.c b/source/menus/menu_displayfiles.c new file mode 100644 index 0000000..96d5c94 --- /dev/null +++ b/source/menus/menu_displayfiles.c @@ -0,0 +1,56 @@ +#include + +#include "common.h" +#include "dirbrowse.h" +#include "status_bar.h" +#include "textures.h" +#include "utils.h" + +static void Menu_HandleControls(void) { + if (file_count > 0) { + if (pressed & SCE_CTRL_UP) + position--; + else if (pressed & SCE_CTRL_DOWN) + position++; + + Utils_SetMax(&position, 0, file_count - 1); + Utils_SetMin(&position, file_count - 1, 0); + + if (pressed & SCE_CTRL_LEFT) + position = 0; + else if (pressed & SCE_CTRL_RIGHT) + position = file_count - 1; + + if (pressed & SCE_CTRL_ENTER) + Dirbrowse_OpenFile(); + + if ((strcmp(cwd, ROOT_PATH) != 0) && (pressed & SCE_CTRL_CANCEL)) { + Dirbrowse_Navigate(SCE_TRUE); + Dirbrowse_PopulateFiles(SCE_TRUE); + } + } +} + +void Menu_DisplayFiles(void) { + Dirbrowse_PopulateFiles(SCE_FALSE); + vita2d_set_clear_color(RGBA8(250, 250, 250, 255)); + + while (SCE_TRUE) { + vita2d_start_drawing(); + vita2d_clear_screen(); + + vita2d_draw_rectangle(0, 0, 960, 40, RGBA8(40, 40, 40, 255)); + vita2d_draw_rectangle(0, 40, 960, 72, RGBA8(51, 51, 51, 255)); + StatusBar_Display(); + Dirbrowse_DisplayFiles(); + + vita2d_end_drawing(); + vita2d_swap_buffers(); + + Utils_ReadControls(); + Menu_HandleControls(); + + if (pressed & SCE_CTRL_START) + break; + } +} diff --git a/source/status_bar.c b/source/status_bar.c new file mode 100644 index 0000000..3259904 --- /dev/null +++ b/source/status_bar.c @@ -0,0 +1,105 @@ +#include +#include +#include + +#include "common.h" +#include "textures.h" + +static int percent_width = 0; + +static char *StatusBar_GetCurrentTime(void) { + static char buffer[27]; + + SceDateTime time; + sceRtcGetCurrentClockLocalTime(&time); + int hours = sceRtcGetHour(&time); + int am_or_pm = 0; + + if (hours < 12) + am_or_pm = 1; + if (hours == 0) + hours = 12; + else if (hours > 12) + hours = hours - 12; + + if ((hours >= 1) && (hours < 10)) + snprintf(buffer, 27, "%2i:%02i %s", hours, sceRtcGetMinute(&time), am_or_pm ? "AM" : "PM"); + else + snprintf(buffer, 27, "%2i:%02i %s", hours, sceRtcGetMinute(&time), am_or_pm ? "AM" : "PM"); + + return buffer; +} + +static void StatusBar_GetBatteryStatus(int x, int y) { + int percent = 0; + SceBool state = SCE_FALSE; + char buf[13]; + + if (R_FAILED(state = scePowerIsBatteryCharging())) + state = SCE_FALSE; + + if (R_SUCCEEDED(percent = scePowerGetBatteryLifePercent())) { + if (percent < 20) + vita2d_draw_texture(battery_low, x, 4); + else if ((percent >= 20) && (percent < 30)) { + if (state) + vita2d_draw_texture(battery_20_charging, x, 4); + else + vita2d_draw_texture(battery_20, x, 4); + } + else if ((percent >= 30) && (percent < 50)) { + if (state) + vita2d_draw_texture(battery_50_charging, x, 4); + else + vita2d_draw_texture(battery_50, x, 4); + } + else if ((percent >= 50) && (percent < 60)) { + if (state) + vita2d_draw_texture(battery_50_charging, x, 4); + else + vita2d_draw_texture(battery_50, x, 4); + } + else if ((percent >= 60) && (percent < 80)) { + if (state) + vita2d_draw_texture(battery_60_charging, x, 4); + else + vita2d_draw_texture(battery_60, x, 4); + } + else if ((percent >= 80) && (percent < 90)) { + if (state) + vita2d_draw_texture(battery_80_charging, x, 4); + else + vita2d_draw_texture(battery_80, x, 4); + } + else if ((percent >= 90) && (percent < 100)) { + if (state) + vita2d_draw_texture(battery_90_charging, x, 4); + else + vita2d_draw_texture(battery_90, x, 4); + } + else if (percent == 100) { + if (state) + vita2d_draw_texture(battery_full_charging, x, 4); + else + vita2d_draw_texture(battery_full, x, 4); + } + + snprintf(buf, 13, "%d%%", percent); + percent_width = vita2d_font_text_width(font, 25, buf); + vita2d_font_draw_text(font, (x - percent_width - 5), y, RGBA8(255, 255, 255, 255), 25, buf); + } + else { + snprintf(buf, 13, "%d%%", percent); + percent_width = vita2d_font_text_width(font, 25, buf); + vita2d_font_draw_text(font, (x - percent_width - 5), y, RGBA8(255, 255, 255, 255), 25, buf); + vita2d_draw_texture(battery_unknown, x, 4); + } +} + +void StatusBar_Display(void) { + int width = 0, height = 0; + vita2d_font_text_dimensions(font, 25, StatusBar_GetCurrentTime(), &width, &height); + + StatusBar_GetBatteryStatus(((950 - width) - (32 + 10)), ((40 - height) / 2) + 25); + vita2d_font_draw_text(font, (950 - width), ((40 - height) / 2) + 25, RGBA8(255, 255, 255, 255), 25, StatusBar_GetCurrentTime()); +} diff --git a/source/textures.c b/source/textures.c new file mode 100644 index 0000000..1d40356 --- /dev/null +++ b/source/textures.c @@ -0,0 +1,118 @@ +#include + +#include "textures.h" + +extern SceUChar8 _binary_res_battery_20_png_start; +extern SceUChar8 _binary_res_battery_30_png_start; +extern SceUChar8 _binary_res_battery_50_png_start; +extern SceUChar8 _binary_res_battery_60_png_start; +extern SceUChar8 _binary_res_battery_80_png_start; +extern SceUChar8 _binary_res_battery_90_png_start; +extern SceUChar8 _binary_res_battery_full_png_start; + +extern SceUChar8 _binary_res_battery_20_charging_png_start; +extern SceUChar8 _binary_res_battery_30_charging_png_start; +extern SceUChar8 _binary_res_battery_50_charging_png_start; +extern SceUChar8 _binary_res_battery_60_charging_png_start; +extern SceUChar8 _binary_res_battery_80_charging_png_start; +extern SceUChar8 _binary_res_battery_90_charging_png_start; +extern SceUChar8 _binary_res_battery_full_charging_png_start; + +extern SceUChar8 _binary_res_battery_low_png_start; +extern SceUChar8 _binary_res_battery_unknown_png_start; + +extern SceUChar8 _binary_res_icon_audio_png_start; +extern SceUChar8 _binary_res_icon_file_png_start; +extern SceUChar8 _binary_res_icon_folder_png_start; +extern SceUChar8 _binary_res_icon_back_png_start; + +extern SceUChar8 _binary_res_btn_playback_forward_png_start; +extern SceUChar8 _binary_res_btn_playback_pause_png_start; +extern SceUChar8 _binary_res_btn_playback_play_png_start; +extern SceUChar8 _binary_res_btn_playback_repeat_png_start; +extern SceUChar8 _binary_res_btn_playback_repeat_overlay_png_start; +extern SceUChar8 _binary_res_btn_playback_rewind_png_start; +extern SceUChar8 _binary_res_btn_playback_shuffle_png_start; +extern SceUChar8 _binary_res_btn_playback_shuffle_overlay_png_start; +extern SceUChar8 _binary_res_default_artwork_png_start; +extern SceUChar8 _binary_res_default_artwork_blur_png_start; + +static vita2d_texture *Texture_LoadImageBilinear(SceUChar8 *buffer) { + vita2d_texture *texture = vita2d_load_PNG_buffer(buffer); + vita2d_texture_set_filters(texture, SCE_GXM_TEXTURE_FILTER_LINEAR, SCE_GXM_TEXTURE_FILTER_LINEAR); + return texture; +} + +void Textures_Load(void) { + battery_20 = Texture_LoadImageBilinear(&_binary_res_battery_20_png_start); + battery_30 = Texture_LoadImageBilinear(&_binary_res_battery_30_png_start); + battery_50 = Texture_LoadImageBilinear(&_binary_res_battery_50_png_start); + battery_60 = Texture_LoadImageBilinear(&_binary_res_battery_60_png_start); + battery_80 = Texture_LoadImageBilinear(&_binary_res_battery_80_png_start); + battery_90 = Texture_LoadImageBilinear(&_binary_res_battery_90_png_start); + battery_full = Texture_LoadImageBilinear(&_binary_res_battery_full_png_start); + + battery_20_charging = Texture_LoadImageBilinear(&_binary_res_battery_20_charging_png_start); + battery_30_charging = Texture_LoadImageBilinear(&_binary_res_battery_30_charging_png_start); + battery_50_charging = Texture_LoadImageBilinear(&_binary_res_battery_50_charging_png_start); + battery_60_charging = Texture_LoadImageBilinear(&_binary_res_battery_60_charging_png_start); + battery_80_charging = Texture_LoadImageBilinear(&_binary_res_battery_80_charging_png_start); + battery_90_charging = Texture_LoadImageBilinear(&_binary_res_battery_90_charging_png_start); + battery_full_charging = Texture_LoadImageBilinear(&_binary_res_battery_full_charging_png_start); + + battery_low = Texture_LoadImageBilinear(&_binary_res_battery_low_png_start); + battery_unknown = Texture_LoadImageBilinear(&_binary_res_battery_unknown_png_start); + + icon_audio = Texture_LoadImageBilinear(&_binary_res_icon_audio_png_start); + icon_file = Texture_LoadImageBilinear(&_binary_res_icon_file_png_start); + icon_dir = Texture_LoadImageBilinear(&_binary_res_icon_folder_png_start); + icon_back = Texture_LoadImageBilinear(&_binary_res_icon_back_png_start); + + btn_forward = Texture_LoadImageBilinear(&_binary_res_btn_playback_forward_png_start); + btn_pause = Texture_LoadImageBilinear(&_binary_res_btn_playback_pause_png_start); + btn_play = Texture_LoadImageBilinear(&_binary_res_btn_playback_play_png_start); + btn_repeat = Texture_LoadImageBilinear(&_binary_res_btn_playback_repeat_png_start); + btn_repeat_overlay = Texture_LoadImageBilinear(&_binary_res_btn_playback_repeat_overlay_png_start); + btn_rewind = Texture_LoadImageBilinear(&_binary_res_btn_playback_rewind_png_start); + btn_shuffle = Texture_LoadImageBilinear(&_binary_res_btn_playback_shuffle_png_start); + btn_shuffle_overlay = Texture_LoadImageBilinear(&_binary_res_btn_playback_shuffle_overlay_png_start); + default_artwork = Texture_LoadImageBilinear(&_binary_res_default_artwork_png_start); + default_artwork_blur = Texture_LoadImageBilinear(&_binary_res_default_artwork_blur_png_start); +} + +void Textures_Free(void) { + vita2d_free_texture(default_artwork_blur); + vita2d_free_texture(default_artwork); + vita2d_free_texture(btn_shuffle_overlay); + vita2d_free_texture(btn_shuffle); + vita2d_free_texture(btn_rewind); + vita2d_free_texture(btn_repeat_overlay); + vita2d_free_texture(btn_repeat); + vita2d_free_texture(btn_play); + vita2d_free_texture(btn_pause); + vita2d_free_texture(btn_forward); + + vita2d_free_texture(icon_back); + vita2d_free_texture(icon_dir); + vita2d_free_texture(icon_file); + vita2d_free_texture(icon_audio); + + vita2d_free_texture(battery_unknown); + vita2d_free_texture(battery_low); + + vita2d_free_texture(battery_full_charging); + vita2d_free_texture(battery_90_charging); + vita2d_free_texture(battery_80_charging); + vita2d_free_texture(battery_60_charging); + vita2d_free_texture(battery_50_charging); + vita2d_free_texture(battery_30_charging); + vita2d_free_texture(battery_20_charging); + + vita2d_free_texture(battery_full); + vita2d_free_texture(battery_90); + vita2d_free_texture(battery_80); + vita2d_free_texture(battery_60); + vita2d_free_texture(battery_50); + vita2d_free_texture(battery_30); + vita2d_free_texture(battery_20); +} diff --git a/source/utils.c b/source/utils.c new file mode 100644 index 0000000..0100eba --- /dev/null +++ b/source/utils.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include + +#include "common.h" + +static SceCtrlData pad, old_pad; + +void Utils_SetMax(int *set, int value, int max) { + if (*set > max) + *set = value; +} + +void Utils_SetMin(int *set, int value, int min) { + if (*set < min) + *set = value; +} + +int Utils_ReadControls(void) { + memset(&pad, 0, sizeof(SceCtrlData)); + sceCtrlPeekBufferPositive(0, &pad, 1); + + pressed = pad.buttons & ~old_pad.buttons; + + old_pad = pad; + return 0; +} + +int Utils_InitAppUtil(void) { + SceAppUtilInitParam init; + SceAppUtilBootParam boot; + memset(&init, 0, sizeof(SceAppUtilInitParam)); + memset(&boot, 0, sizeof(SceAppUtilBootParam)); + + int ret = 0; + + if (R_FAILED(ret = sceAppUtilInit(&init, &boot))) + return ret; + + return 0; +} + +int Utils_TermAppUtil(void) { + int ret = 0; + + if (R_FAILED(ret = sceAppUtilShutdown())) + return ret; + + return 0; +} + +int Utils_GetEnterButton(void) { + int button = 0; + sceAppUtilSystemParamGetInt(SCE_SYSTEM_PARAM_ID_ENTER_BUTTON, &button); + + if (button == SCE_SYSTEM_PARAM_ENTER_BUTTON_CIRCLE) + return SCE_CTRL_CIRCLE; + else + return SCE_CTRL_CROSS; + + return 0; +} + +int Utils_GetCancelButton(void) { + int button = 0; + sceAppUtilSystemParamGetInt(SCE_SYSTEM_PARAM_ID_ENTER_BUTTON, &button); + + if (button == SCE_SYSTEM_PARAM_ENTER_BUTTON_CIRCLE) + return SCE_CTRL_CROSS; + else + return SCE_CTRL_CIRCLE; + + return 0; +} + +int Utils_Alphasort(const void *p1, const void *p2) { + SceIoDirent *entryA = (SceIoDirent *) p1; + SceIoDirent *entryB = (SceIoDirent *) p2; + + if ((SCE_S_ISDIR(entryA->d_stat.st_mode)) && !(SCE_S_ISDIR(entryB->d_stat.st_mode))) + return -1; + else if (!(SCE_S_ISDIR(entryA->d_stat.st_mode)) && (SCE_S_ISDIR(entryB->d_stat.st_mode))) + return 1; + + return strcasecmp(entryA->d_name, entryB->d_name); +} + +char *Utils_Basename(const char *filename) { + char *p = strrchr (filename, '/'); + return p ? p + 1 : (char *) filename; +}

tB@aaXDm2}!{ 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%0A8$8g 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

0ah_D+YbGvodMY91wb(EG~LxAN&(A z(Bt2)Lavd4F?g?Z78jjG6CCtBf5e>y4$jqq(ewhs-8&obsI}Y3up|u;W1#vC(usw> z=nNTZZU3`VG|GfU=-(VU`FK8V-l!p#~|NdQ(iNP|tdJ?}xD0-9yA zJ6VwDNRGPU39}os%xG}9Vls^0L4~Z(O`==>Bod#dZ{>a^(L@F7+G%wcs`6prDtaQF zpW>4z(_dcD$V&RuEKQpNZPK)sgznhEn%eONNw6ZVP(#P}Q7M;eyB2nAwO?ny`Z{%z z@fU_$`^2GB1`)54kXke^(L@1+t1sf&Dl9JB7gb95f}8z{$x}tm$2~Ft?MYD3%p`7N zS#-8W)R-{Yz*s?Tm-#8!3fL}{SeZxYnnn3J)z9c>u+VLH6*8!T*Kf^0?H=3Ga=;N? zTS@OUFzC1%7Q8s1V z>>st9l)2TB$|#(3++fnNjxFpn&)VU|nb!EZ!bN{``zy7M;!aS-!+7bVeD8v~h&aa{ zs$c@GK;#9J0JYXtB0XeNW5Z92L35ES-=zY%&6>Ybxf%rH&*5GCETfiGEQ51qcnC4) zZa#UX`HJ}S`V_mves39#^Y*r@t(F#QV$NrNPXlVZoqKKw8u0b!1Stq<4wPgmUDp;L ze_7G6(|vu_G(g}7GJS#Hrx(FyuSl|_PGKVQrXpz=y8NT1UCb{Gv+a?V?oR6CVAtU_ zjnj|uJ$EfPS;wf$^|^V=lm7zsmK2P^OHQ!ygjA>IeSX2~eR1L9Diy7mA6>(-N;doE zv@B+j)gOzLO!x=a<RktzOP6)f^&J&@KIdr0j;HZ-)J(mt5f{H5K}8vH{eFCrIY z=jL3GO=xw(y`^|N57`%$vmU7sCy9*SjK%&iiB12-^bAa`4rQjgbzrea#ul@0x+D-wB zS8M+MrC5#j3{K{w{)~sMG)Qt&X63n~&75?5#174lWT!Usd*+~M_ z^s`~^F|tW*O`CS=h*Y9Mc!K?{?y35|`CJVUZ|5)cG57Jkk}^g%KM4F%QF>@(U%IU{ z0OspWRX|PT%M z&B(6r0ck8^UFuf)^URqD;}8BEXdXr5*D7ueImi7$EIMc>3cml7#kcVo&FmKVGO~t0 zB2m3-=g(`0yoGlMh2Tq+_4s2(SuHL`74BB}$G1is{<%4yQ$^}JM1SUn)|htM&Q4T| z@sQqa$21voIs{vK0taTk%{2Qh7B{O%mVk5yx@JYqu@zpYjn4FpLO6XHZ>|B$nmP%8 z=UnIr=+)++R8t2je*NK;iBz;mj)1wXDl?Uya&FD{UXomjJ3;>WHHa8K7A{sk$U6&0 zQ?aw}K0#1;8ySN29X71i-beUVi&gaH($kf-^pUlyR=v`$c&H*;lB@KBcMLgUQmrP~ zEaJ=m!*8Rr(-$ZnL)rvpPuF{eXj?bKQ?M+o{#hZGyTFl*+CCiE49~LH=Mxu>#B`LE zT==19?d=5K9$#*-*mlIZ`&FwvBX=g-I8)Z#wOe+eaQq6tt#?z*BwnRh?Fx@aknkmd zc~KwIJn%jyW6mUQQ3mrr{bsm<{}O~P#N}Hc{BWbC7pR3UD?}^ zl?jEZW0X$yAQLmpaEJm+FPq*l!C7ny2|e{j*p2~6ew@#bU&v**&zyKeak0u`L}`7m zd<;9QZAW(n@bTkA^+fELBQd?At@-?_5t4rkjK?hmw2p}mo>sSN7KD7caSWkFZ8=f< zy!BBL2SL}+LahINgZpfsQ1}P8TA@R4Z2w}|nkMOR&ix%_M%(Yt(Et!w0k6sIO5&x5 z&_(ZkSQ%Mz`@M@wLyWzpp~)|jK+GpZPHNp`kRVGXmjdGTQc*dYxR8O_e5DVnpTO=+j3M?5oS>IQxdGkgQ zMlHeP@RP##jjkNxl3ns#Ak3f(siKrGpv4C3)Mxi4=ci6 zRgMX%js~7RZ}*u283Qkb*vojOp2tHGX2m+d(1?w1Th(ir~PswLJuY|=Oxo+Lf6Tq zDz-myq^>Cfg^TG^^vwYv^q?WhHkZ<$Rv4N@w&D2xWsoeTw2$yB2WlHaJoaWK;i4Z> zb0l;5+uS;TLog!~H%%(zJNizq&ycOEm*A2BxrGjyJ46Fa7Mhe)0A6aFIa`~C+vGno zE3JjwevYatg@1^?UCrM$?5UD(#&=)X@=Vey5lfc!?e`x)sCHTN)ZnR|lYs1>*XLCl z18X-AZnk&t-=%*FZf_NA^z6fHbl&}oTeY1#r2@|R#hUs=i+*?-4WJTlI-k3yy8jKK zVyB9Gr*M5CTcy7`%@?A2P^MWi>`_F+p#@W(hDyxBl6g@8RP|pcQ1ydNzp>1 zoCf_pPj(-6xY~H&h{NdLgq%nk5TgtrUb6(H-6eVANyc`4{pBN>A*UU)_Rg)9rG7td zl%@JY-ifX7M4A7)HnCWq9qqWBxh@w@VJ)GFWjx1E{u@J z%4Cnsc@A6|vfueBRN){0xW7o!EEmdYqNK6 z2H+>Q$$6NyJ&X@7?0OK6+-U{c-aVqm=#pFwABY=B&Wco^kRWSv8E-oi*hjmH8|H7v zr55@Vg0I`HcYSD0eq!&ak2KP|jukU;!>4XfKyJlp93w;d7?Pn?a;e+NHCe zVZxGe-a}a%>x6LBRaj<&zk>17AGJ%Dm2)MbI|EL2pCJ(3^HY5BQ;6h>zl+Ju&5G{8 ztSqjjB9%X1Ht;3R&|Y8b)^C-^_aq+ueW?J{;zGGPUlj|wIj&dM+WdLspx^N+ILe6g*K=1+5vj`R^)vYX z^Zk6Op>fa{kNREj`&wWF--ed4PG3ep5<5yCyeqJ%P1~AbcT=RYDrlC?2N&VQ7eGEM zXg#I}Erm9@Y9{3zDm;ec#Lv8*n9%pAC&_>zHyj_fNz2qJ8RO2Fc!Pyh{n_|Y#13)Y zw?kRXpp%MFza>a*mcfBcH@#_OKj@az8UADAEUT56uo5|3Kj_HE_3=a&w!Vzwtw(Shq7UV`=>cJC1s*LXRWg&qH{ zm#(+HT_<>LdN0@Y>X^%ydX2Bhj7%19AuzFSleIM~@4nH^n@_J&#ik}gcYH6PLU2X& z5brcrb9W((=u9<4M3Dr)Y(FE{f1V>FpRq)95i#M-?Xxc^H*7{4U38*#MPu~9lsriO z@8u1tUIZsm(ry)q`f7f~%!i;GoUfSlWlRcTIG}{SxW|P|v}!7<{YY-Mb{$T7jK~Go zjY0`a?j?s|**kFFcL+p?X@2V9VKJvQbQyygjZ2ZF@grnO?fqS}xI?!}o0r1TOEmz< zyXlLcVOjGsvKIE4lBMKiCL3JhmF3cUv(q{WK##@hp z&Yi;n!c{~Q(9Jf&1aeB@vR)sBk8Lzs-^|?m+~%fs+CQLaV*X4Au}`S3p|2rO=Go{}my9_>X!qELk}QBUfMz_lvd zIGs5JfbK^}xRLBDd_UylX(?7QZ|oCdcxw9jcKvULWc`bU^XHWovtd}ekYd*-xI&!t zDd3XvyZtP;S`4+rQshcz4JwlYpO_gfb;~R_}hmYth{OtTxq zn-}iJJ@!6FjNXh?l)rvPq$jH#mh5DxBRf`k=HPf9I(D>i1=7eL7mBBe zaeJZ^eofa^tW`|!ah6p(1O1`ESW7>-O>2GURHW`vZ5KCwkn+U0ATVs(U(Ycz#l=|ad>;%KrL#lzWt26f z;C`%%WX@`@cFs~;H>I|wEbL)0b}vrv8FQ{RT}&@GmMrc)zP7OXVkSt0JiPk2b!KnI zp_nBC)frM&66T?!hx+9vr~#Z_jatVr)@%d*eLAt>aQ)GI#$ z*WkuTa#;>F05F`Vs3;aR!^>&Zt(^%|G2=*5&6P|imyK4io%gI>Jtrhv-4cEt(3-Zq z_2;N47R-4F6IRv$&)S;7YPUeJK`AZ+4fp^##UA57gOGq8`_|nwM znowI2RNRnVE57n&UCd-`UT3$E8@%3<=jD@7o<8^&P6NLcS{^tB=Qig}kI!pC?`#FT zJ1z$c)uXiaM(;93bKVJ_AaZsP{5&{n9YFet7>J#k(MOlVFD*Si6i^3lysZzZ>r#>| zrw>w*W91>I-MoT$LkKaL=mKu{Yexl03Uj&bP*$GDlKRR7Peiyu#C{37t8!*56t zl3!qC!wpzH?UYtMNKBK}UR6VL+y~D|A0%`v#AJhbOtLb!m@ zMQE9;#4f(Bjw-YMZJ`ZMiNpQSSPbaU&P-Prd@#N1b=O-6zRGZvGzC~{rg(&Yq9!Q? z0zFb8S%ePTdokN`hVKC!31BPidY!2K{*Gn+FKP~xN!sAoL-ZgYBM4rZO(KafZw?ZT2^9!;=UsE>hYY$u4>zWC3Q zDr4#vBf_jVLex#;kZOl2%wfbr!fGd{8XVrZXRpfIg?~~J0h?INGk;qyV!o?Idk2&{ zvK&0QJHQsh$(* zBF5U-%+pb1%ItHh+mSqfYC8Ur!g=bqNW;kfNUA@=&xPW;#xj6#+Djg~jkLKGz)9>V534Yaq*J7sCE z8D(qzY+im#=+uZ+1%%yESqT_(tNIf{3H$3Egbboa$n_v&XmwNwnP zeCzsP|Kr|p)A=w{uPe?rl)S~~M3WKPCUjws+(-eka6b96rTv52)xKKvm+Ue--W*io zwvMtsciU>$j7#j=!yVu1Pkg&@S!^!j> zU2@Ilq@{a?^z64Ge_KT+SV6F?#m}^FBlY+{;|Xr_zMnYNxyo^30K9Ion?-D^OnPuG z!|73+y6ck%OR}u?RHcL8ZC%+=YSD3Teb-vRepXYcP+nUbuzzhq2lsT*+a&AJfq|Jj z)7@Q`_r$_7==#f^{08pe#gFUdL+Ox~3aj&U=FYTD;h>9b_Fq#C4_A61;W)?P_e><= zY^(zockb}CJ8iR(2M-zNfqBJv%=xD$@eu6LoVEsIHB69V%$Y0!@v-f%gKKFWf`c?f ziqkM-goW$j7)-ygs9wYPn&69{ zLSW79_^LDv2ji!vf6C3IsKnE`T$&-zj|*-1gGs5N;1n!y7%V-yz5lPtekozg_Lo}>tP0gl8xj?^u zN@1Vs0kewGZdsM|-9)K$5Kt+d`uWFI(?%tk1aoKw4#H5d?VvF~&bHsIPJlvdU(}ga~trA?X6g2U= z{VRXZl?}UG0@?hbNw0R~3p-&cQD&Ahoyaa_LH*CruM>#=V#few{2-Scu1bZTzjU_#@M zr2URxIA?+~UY|brTH`ZVZ!J|5axBz#x5Tq0Z2b?}If{P=pgMU7YkYPZcK$M?MJw4vr6>gj|B^+~9JXLNH(CxU%i~hM+izSeVCMQPpa!v1 z_46}(iT)K4p?#ujr~i5Ak}8>ey48wy>bWMjWd7`JVCKMs!XR_U?VZwL8Ci#78xj&a zZ$p->`(uvh1{v3i4m%ijU2$RX0w(x3Ql5c-WI;- zFp8;DT?EsQq_uHpRU6XpFJ;{7t^*}>f0$h9A&cjDO;EICsi2jf_j!5HSN>Re1GD4P z&IVEC1gJ4!hCJYy=X5;x=O#W>Pt=ly|$~Kn`iHUK5lU!ebUhj`-Z~u4>XFM8I9zi6Y;F3db7978+8x< zBsk%HBs{Rse;v$^=KV-5-S)PBW!_lbpZ$Cl8xdWl%rwj4rH9zfa)4m^Y3rWUaACE1 z^`<>e3V+LX;G`qO(d@rYdQ2Q<47Bgo6;TEjXiteRD(diG(*&=aFdxn)D;b9j-oZ-* zz8?oC>|Fd|JJv_AJ!@%X$}R{3UFxQ-1t~dDPk=$2Df=VZVj$ zkV#JBD6~!|bviwU3BxEgor0tl#GSj1^HGF=LclLxh1{hJ_7RD9QT0N>b>?px$-o_autRawtdtj_jH_gL0g2#Z1A_1S2)A89QE3nvs5 zGpBJ1k9rv6KHg@Pdl0plXAE_$Y>DQzX1$o9d3U_xJpt5jkWkzqv=Q6d zd&hUoSyj*YAFWOhEwu@oRK2~>0Q*sst#@$OgGUm~gY%3U&kSSs1u;c*a8q){N_G&@t{1MX74KVB zLmU`)%uvXRZva@d`Z&U4AqfM1_7c$kBzto@^?*KWbGoK)x9#@dG_j*HxYth(5{`?C zmWxKb+%h~}9814>B4T_0K90W~uZk|ZuQYaW4N%;VwJr7BtN;=x0REBWd=ZBke#{C& z_K0piBW$_E1`fZNnP0KEV3@e)zChLefv7_Eji4>~)zkF~T|29P=o&jK^^2M@3)C}B z2f9Je&y&Es5~tU`q6HA8pLi`w&#h;MgAknoqACX(;TWt4DKY#edjIBA==Y~G;!6x! zj5+%sL$hl6f+j?5N{)7J6!74!>sh0n`Hfrk_=o-^C=U(0ni)*6xeiQGdY$2I=hRkJ z4ez7my!^>+%Gi|$aB@{n*@VEmNjDZJ{{%Jy-S)#YO>?cL@Kx$mO%SUZPcSD+Yo@Gu zQkwhi`cFdG=dXRAM)L<3ISiM5>0{RB_4A9L`h<=W-W8j%WrOi|@u}+ly#7^$s}1pH z=uvFlW<0UM-UZO4J)HiAQL{~ZU{M@7<)oQc=BZw`yO?)3YCCWqS)CAJ#&CH4?n-S< zW0P#prLe418tZ)314~Ao(|0UW@erXs{TTjxyS$FzK1pcyktBoKLy#+4e{^@7MKu%X zeR*985hkadT;n4ZM+)u^wsnOGmeQ9G9d$oD^srjFUwNtQA!SIs7*v^{f<}ogH>F`y z1i{y0ii?W8(mMrjmX2tRhk)&0Q}};hJoY{#%B(Ys-QyP7_%37T;+njIRq0^cpGbQ9 znF~j)(Z^4zLaxn=40-IV#GrqDab}+eX94F_PQN3^Ug@b8Iu) z&+mWuJU)-l=k*FS{K6ZaJy$58yT ze6+3sWz_`*w1gD|Xwhx+^6M0Tw{zw6Sa03B zrUw!XlI@&y&Wm%Twvgn!tkTCvBMrwjOt(p_FN_Rx^xlP1YiNivgY{<8+=Bwl$u)@wb1*;?c(U zih4w)<4i^GJMqNzmUCnixQ{%;*JoBJ~_v>j2^S#YahUi=+fcb%Hap254r!cxl2C5?)7mP zTN*(ByxmwWvp1$^SHnhyLr?^Hhb)Dk0%0CbA$*z)^7Gp~)4D*g5+~dBt}utsp=@KL zFKFJjz|Na`;Qo4-_B3zx+QuJE@@Wb6D&&D{#6$!t@sScZK$ z=2J8T~Z@$+a0-#L^FP< zK&M)|P#mHV80Pn8Cqej-Yx2D~(7Ghud@V5O&!@Y9J-^hBdxI`uF6xx_K5xNELQaK; zF07kp_;t_cF#0D>-+p;0Nn^zCVxcBS-$Js!b)h>lhPjorKt}$MOlOnEtRX@gZEsf{$;eEhZH@}`}<;c0=_Q2!|7Sbxuj z(g79Kw_@J>6;O5m0hh_?Er(id9Sf&TCHW9li3up`pRp0ETFid=K;}}-xmzWM1gWM) zQvm$&Rnf{$i*IY>X|w%p83KPji9$_DBS(#a6MH8AjlRqB`rSrp|L9&p1@RP5)2&Zn zSXN$PM@^%Wi$gWb#nVa+$)e&2UZ~x0Rv>Fv8RIA-Gz%b0#r@NdN#aym<_t~1o z;P%GNovNzTufvy}^pj_k%9rew+-z0ZK zMz2n@=Vi%GXn-n212qQjax#}Sa%|C?+JWP;jLID(u-D2tlhG$@v;I+Ij)73HzeJA7)0Z4Q4^#tPO=f2(yG zc3-x+f$~Y|F&D>qtiAP#J7(T!9GvIArwabmD^BA`*RB>V$Y7%I9q;DNVd1p3QwA+i zOX1g6LsP(&mN|(mM9?Iv1%j1wXiSAR;u}=&5PleqaLubYyLIW}KVdkkGv~A}>+d@V z0I%))nPevh<1-wLCVh6Q5-)ss^aO@*16b6|cu&5i$>~21G>Es|RG%@QlUkw<4MTX^h^~9yB`VgO zmQXQ>0 zmh5rh`x|c&B)0zf532#>?*y6rdqMT=m{)zL=!I3CpoxJ4WRH_DBa4 z8XO_tV;jWIC}bdtLdqOk48p?Iw!bI-)crGfmub;eb8W>~=Wd;kA>cf%xF%SNpg=wF zM0$XANukVUWTif&I^U0b?SRA-R5_`~8;bnuiqby;uqc@|Ti+Q<tw_1{h48I248uog`oE;Ry+xColOs_6$eMzFtC|e$Ujel%KEJ->yC*uE=s1V8| z0CTnC7InfBHFfAmaIE-t-yZ6osfqPjHt12MDU(jgVs6PltaSITd?K(0?seolBzL#s z8@NEyqqR{r!4y>W&*YOm8mQGv7ZZ%jAI&PFz}!F@tK6#TQn%Y*<*;aviu|Nf71Yk; z7cC1|%F14W+X#J6)l*}?zF4vDSf9dchRikLe(B-3Cj&d){(zEg{xqW|MD|)Q8tSt8 zsfDamFC`U|Q=yhZmv0{TQ<~gk@i7|;pWO{}JdyH5-_8|pcW2^)HaUWNXEtT5o7?&u zhO4OLCS4i0lpGNcTD8pMKlj_>mS$r0O6OIU+FdvSKHY&TBD|wQ)~tQ|%t%&!TwHZL-<4!LzF(<98oTww}BLeg00l z&^JmTmI6Dgj(6{hmy*8innFQISL|vH-c?kayZhb)>)V*f$T?nu<`V>Ra5;1c}7n{|k!@1F157LK*~$-VON4!=&y`d@x$HjIhip%%o&H zhFSb@IcdSqnY4PpudEk#f7-)|AT9I{m3Im0@NI!V7xVn&V-55PH&hlK%$CwJk@t9h zU`hYNhfS4fY$1&!1fe~GR=Xg}k=H@o_nA@hM(`h{QPvd1ujqfe{Y+8dt#(;*3JTFoIN zvDc4|tZ0EyTb=(e^uz#H%>7QvuwAwjV+05pevOUdTk7WK-Jv>(klh2pJcB+dv zHu0m4i=&7y52!A|u3d{*jXTM4=k89dFggAa^ju~yVE(J^<-RNjDr$Ackkd@{eax&1 zxs?U9_quPMD+pt4lZCSibu8Bl_kwhi$WEi;J?W5<=M^{Hx1(5D!=nvG5kOX>QMk~p zpXHljk_>6FU{J=U-n3sTW1Gyr%g71K7n`gbnTWXx?<0wx=IUxU-zuE`kN@X6YE*wB5eWaep~10M0(NJ4g`7&s`Ma2Nj3?pbO4OI2(u zf!y~=_(czte~Inauba0g_j31b!Hz3gpG2~ZvN6pN&;LV0klrMKrx5y8g|;>v(IH(}1+2V1qRR6vn$6G)6jd^&DxoIp_?U z3UP|^*rS!b+Kw+qG?sUSlh*z5z1$LPsaz&snanIA*FgBSh;|SV#-w!}Zm+@!sVLPT z+9s{$nK+=7PiRe+VFt1#pW@NvX0XbC@Zz#m^JG?K+Yx2DUZbw<=Hs)%pUD_X@P=#t z{&va?TZ|@HvL(Y&fWzRB1B_bu*_!AKh+v#6XGanrNCJUm=W7Iq*W1-uCZ|yfo%*AG znNzKwvvb4Vv~iub9qo2336&2UNspsjSyn`sFLDTBR*h8$2yZ8nemE(F0lsXDSPU?8k*O9 zU6HZ-#TqZhqBrNqs401t2=*`NhT$zr1(rQ)rgQr_y1(< zR3LyzJ7CBg@~A=R2b-zoN);{uRK6eE z(pUBO=T!y!1sT!R&}{b1x)lQi(hobBC^K8dH8n=^xPXLLtQxL@P*!)jq$Hj0UR?~q zd{%+e{cK2|vt)_GL{v?=BcRT?DwUD`An{V}=rh!YtNt~J4dA5^oG0CARGYcXM^INa zKO(M$sD3^JI#yD)iH!bVX_u*taNd2dv6ANn_}bgMmWWBNf=alr zhPWjqC)+fN_E^p;=$Ghud#S&w(mf=7=(cls;@J<$?@t(C+}Cu6wscUI-=mxTh1jog z@dKdnN6ry!MT7{dvA4YZy*BjYj$DKXbgXtF!>@!}L3R!Re7@4*_^$VYsbv>btD&4S zyGF(RY6#L>oh-HAn#+t*Z_qyKjx&_@@6rdpdT>`Bb?&Aic-iYePP=ns-+kZSAv)Ul zH+Y)`&=3hn3UynmkE+P21y+&CXS9{%51ltI>k;(knUpRXUzDG=y1WpI+dQcf*0<%J z!EX6BQR3Yg;nPQ1OP`dPRG>?>^XR6yoRy>5x`MNrbZ+2PA}W@kaouxwt^-&Mf`h{& z({mLy1C*0o`xjVWAjZ3MbKadQUKj=la~3zX6W@zCK;mbgb#OZ%4R7~C5ya@@9h9$f z_4c?}!YTT*zPI-k&cO$zfU{9`L7dH73fQ8l;mF_lPtqwsqkQp|VT|xf2>pkyPD4gs z&cY)aBRfq_yJ82?9AAEFPX2v$bS21J{q6utu+gFO7L9e-BrkYq!2gR{$|?)Qk{;F4 z&vTcJWOYZ$4LfgOtx5Kb_U37mB zK4i!spd<_J={?rI-1O&&kf@NUE?V0f%M566B2v(q}jzgJGNTw3=O+2xKz_4u6J z;S9y8Tr5)o=$#vD#_pFP)#E`{fk~5FaRXBwkLqsyX)7_wQJ<4Yr>Z5K%>g=&2CXIh zM4Sk3v8pk&Jxm&{@SABdq$Pw^X2ENYU8YYb$$}w~n(~u#iX)wGg&z=S#?9gctT}#3 zP0vfKisHvj_O|o)7k= zrAAt|Ie@=p-R7jt{-iEEWNRY2<4WlHQZc!e;_1?uQ8%0e)T1*vNbv>mcp_&BT?$sD z5-P2J8h?GDf<$hw7q(DL9UY|09(sFw^uHcn;0V2241>v<=MTQuj+C%vw?9(>2(;(l zvC~1}HfUe!rRO<}zEk^odkyTfwz}mK?FuClUS3dPBr&GXAiO$Jg>b*neV;(77}}`a=8tgHY1;ps2t> z$Xk8F2Kne>&;UG1voo68qj+>k_2%D#xmSAa7hgX~3W zvN1`UX8*zaPGrbz^`rufAhj#wS8$DrZ7mp?zZezi>Ho0yTib(~1ohO6OOu%(byRMw z8&+q&tw>76M(E^Q-&=^DLbSlXgND8>R4O)}G8D|ugz{tj$}J#>N21+|k(<_g4ZfA# zze;0-=?)DNx{O(z?c5Up)FzcMb)5ycY$LJD5vkwwuVBxdR5Cc)m7R6-_>H2wm|Oa);u##eJs=`p zQ7Vk@nG$~K<0Yj-zc9V?Gz~p-L!|GGWWDTnth-sC2E58IIJ0ZUHn$Ss@bvM>Vu6a1 zPTw&Oq=e!htN(h6z8s5sZ3PMkHvh97-P9LQy*q0qUx?XEh2d5?$mgj)UWH_BS5gQk zW^odQMS`W*3Wv%MXNNf|%8eq}7_iKVPGhWO+>>BRa-Y8PW$mP6lM>rczOSN zpY1^y?38dr!sc`BKs19*vnm+C^T|QYOlx6(y`VF$eL^0#7EnE8{@J<828Z0UHQ=DR zr*2&Z7q-SesD!*?cO$lhd3}R^1}lA>-POixI{|-TqdEnGgeY#zK)QOIrm z%+4%zbB2PX$48d#)xR=1DLFFzx#*KoGM6hn?;R3sCA}yI5G$d28Gft>q?OY>xoaA< z>A|b!4A9jT>*y1~pbrs+?&z5QD`8(EDE1|??^bz>3Nc{~ftwMyZpe4MynaoPs%><7ZM)hyG+(pXA8Rvd5)=rMD!+2MHT8!+mRBs33 z7Q&sK|FpkAkU3R5&HVX=bva(;6A&h{QFg)O*^3H#xb@5QUK_S2wCg1cJN-<0B}+_Rbx7eh<&VSgVfyAQm~KpD?R@W$%{{J z`yvS*Uxj*d?gYB(Pj*Xb)5y~dg##Q$BN}3N9qs=D|2HNV;Zb=GW)#>2VcGo1TX zHM?rEuL4#A)#WNpya{$Zo6>W3NFAsdGYB#hum*;ih zDXlGNZSMXwP&rZP&8gwu30FYd2^nuxWarKVomeUcA_a7)CYkbwu^=Jrx&FP) z6@HjHO*(1?EWQO$pdbU&Rnt~hy=ZLW)P{>=$gDj4B)%9$Xg9n#9HPP*JsQFv;#6_B zP7t$Pi3Kzj@1?I19?>L}5F-p?_0cHau-)(bj$b?)*M3!2WqNsa?WZ7;o8qjnN}OHb z7scxTd#0Cj9WRp!+95UXzvNV#)_+mM5>ihe^g8|T?w^BZaDA4-zbn>d-nTTva4ivR61G zJE$?6dVi_a_se+sJ^BGD!^hdL)jvM#OQ>c(x+2j=5XUfmBUvl*&>cymRc;^IB3m!W zpY^hZ8Vd04NS2UX8eV4h>Qhe2J;}Qc5KjT!?2L`2z`e1ZM@V8;{Ju^8ci)S--2};sQLvb>hm^;2TBT@V(VS zS_A7AD(lV*qQTr^r>(JL<3zLjEOgR5Ke|?IpDOFv^PY_sy+$}*Lto@=5;~{oH&wFp-J5LH=c|jouJJ5o_RE?Hh#9|5fkgt%i?#~dHfjX^Ha`&O{iCQ1L;&K@I)ImlI#flK z0iLE5?n&yrzQ|mA9y?pb`{=C(gPqYB(A*UiR8yS+$ugXWKiKjJ5a_Es(p~|g&y~Wg zA*IN3Yo(C&C(js~r>NVy(m}2({jZKg0_$(}H;MVX736P!C^$R+9DAQ+buT*`+wW^k zD#EO+9=kk9D7=_kP#Qb@U=6Dm#jqS+Kb!%IPyfHb-RI(8ThFXJ?_kxRelB|`CA(QE zguRK6TT!uM`5OJ~YDFw3fvW7u(J`owPOWeA?3P#eJ&}?yB_r8nB3Fw1gFz|vs$MX- zIqVC)*>EE}IZ+Coo3^YgWqIQ=1IItk&2`snPBT@8jNPtPG}YZ>lxmjY8;wx60n=lp z{f(k)_sWfjD^Hl-Z=rITvwOF>>*`c>ht>N(RZHbw#hc<>p-1B6e>F@-BKZ#r@{@6# zgNdkS5|=em$Guu!emw+${(?3XWP;m7K2m*pv#qRln{wM@BCjXB9^D(WE~lx49lD|< zZ{Q8*Rbb};=_~!Ig(34b*7#+cMi$0u>KrF?iTAZK=`%}@&w6$L%hg1MEfsRqrRpg; z%k7#o4}@Be<}V34*auGB-)6<-R&Ww!KeVU~)2sLm+*8Jlt39a5n~IEV6Abr}UVUb1 zB1ENjHa0(ubv1VUtx6+gAb@RqVI^fHexE^GW!(!-^{&y8^+g*9MHh?F+?`vVd)|BA zR3L|9gfdj;*#hvx?SUP|+(iGfA9#PSTgvm*1we`Ijrw{qQPP9-o`T}Rw&ICHa+R=Q zp8@ah#~w@6asw3)hc!<521;${$`a)=U^C;!kqKZ9yGaFLzgP?)xe|C!p2ZYYU%zS; z_nEDk@I-1qt*}@Vna)}bs$~N?BR57#{GxLnA_f@9Z`H(_iLMs!rh0flA?e!rzP38K zFiXY#Vo^iy(mQ{t@_N}nPF+UKDQh~Po@%GTQ7q~!l|x7E2{hU|F$v|xT$U`Y-vOf_ z4h}w62Z|H=M=$4nk+}p+pY!~fl0b02-%3?CynTGDqmx83Fu)H#`$~Mv z{pY#LKJ6ke;{UtSej_Nw(qHty*g|xXp9(`TkRFs`*I- zxW-n%&5U(Y$-RrWp7{@4e-m5deayns6`dw>>NmpGa1#aKFl>YjHj`BY|YdA02YJNY&9}IW^a0k)T$&;A46m&OlEbi)Nrwt`N zl<9jsv*XshLqQbjy41@Crkqg-mIa1>bmW@)vSwiers>By9i4Cgt+nIMpnofX;%gr> zt<+b=j7J=37M0IwT}?UE=ick%P6o%@--PDPYE<&_meqD;U2PL8oF1Kbb8I9NRn;*^ zNAN1ayUz$iSW~k#<5oc1^iEBO^Up%Sip;BXdOt11`cQ94I$m7$cF#%gB&uzz8R6Mo5|xvvuoFfO~2)1-fs zC3%NIi?z+2vk_BEt8#)>(K|Ckt^s=d@L~pd& zqwZVpaqiGu5kR87RS-`;+G|Fs)*4w`5W#|oZ2+J|#zHI@OCW8off3a+-e5{OWhPGrB$L${$vHdrdit(W}RKs}s5$FXEpz zFyQ8*1WNzP&m;mjn08x^BJZ&4&#A*8%Db8i6C0P)|d>B(_Zp}nlU>480@&i*fM z9uBeCH?;L>#%%SE-IA!+MlcvEC>6*F2QeaZmk-HU2w`{JQmT$B*IY_z_-`{bTqkiL z=$h_xJ&TNV{7#b*@FzRHqouQcets&v!_0o|NKW(O_x6<16 zQz}ew29j*=TvMCe*jQ0|vFN=mL2{14pSWBXcswPWlCAV>u^!U%uTA62v*K*(X1`aB z=$eo7wV^K?l-I0{pixJzKA$?ZcCxMs=x~R*x4+?N063p?3vRR#!1tRI`_HQMl1KQf zU1hhTMK|=iqWHX1i!PLG*7K=`ldH|1HO%?`bHNQyp|N7*$@AlNuaBxTYd$TIOND$o zUh>pi60)v(<$6cZT8{6jrzl+UJ;THlQSH15(zI4Kc_ zVXvfP9oUk~t~H^Q>(~@yOF@mFO?8WAF>cm%mv*7$Oy!l#HlGU%OzGy`*DXIMpbYX9 z`G2(<*P?Ruc7{fpTy2jqQ(f}Ph>NbK0qKq0Ouig6*8HS9i90RrUr&X3U==&34z5u2 z9O?G}^nKYzBV8<)^TCK% z{^UpR8@=E$8-df4AK0=5!nrN8Vr?=Iz$Vb=E5izxpI_=#= z=-)58d1af3*5Ghg@_?LZ!e_{=-%f>gncc*?p{cmz8WAJE#ZUdivLcZ&sFeek3gs2~ z!!XX<(Jb8Mh*k(r!9ruca&rdMvb7#xUP<%Z_;g2kr-hzA``S0L{Agl7gpAc`e;k6W zw?8Q8B(3u=I83W};YM>HW?9GylUWsCZ6%wNiR8z97+^Vz^V9emoi-g1eCe@{L16z3 zkzzHTV`oH$f0YK~GLsen9PgE6aM*iV-*w@7YSOEBZ2AJWx$ubdNV;O$i@^Bmx;6#- zmLtH8jx*VVhFzYFi%(o{y~HK$<^{@l)%3U917% z>-^wFtY#Oy1IV<42qX#Sh-69D6E=LPru+)F$^mJ(WhLN+xc(k(Fv!Yrp=J$^-{fG$ zbSA)EitsRS`Z;**j4wfDF>`ic=6R{rf}xPB83cc*32m%U&URVLnn==NS!aX>+xNJn zB>c6nnjXF8;?MHf!*0Kk6$3#S1`p=ZRQU3<1@0QA<8zcw8i;85~4;|OXT+jtI$^m-t?7D}HIzGZhTF~c)K&@_p}O^=IuF=%InbwbhDp1be6{`Y z{AhVUeu9?Kvcf`3zpbL(J4S z!PGb1yU{HBz12_R@v`El7SulQ+~M1qro8jd6)tn95AhIx|ES)%dKXN{^a12ERg$m1 z$_HhGirR^h^fP0pL#2LrXMbWHK0TuER0s=Cvbr(*cBbPo8NTTFT1Og-Bv)Mhi6b4A z@9^0J2^O{fQGL6T?KX0kYM@nmrhW<3_ z--MR!c9$LE2BL0{M7~L$f~E`;WA{X$6m`??7T8zpbJ=5gFR5mroLAfs&9=_fexf&F z)dt9jAdr)?a~dYqLeYs2XuL=TwvEt#9a|R=l+NqEJ20yu)*|rIv6|zWs%c)z&Au%{ zuR7@;k**c?JBe|s$m44JaL^jcXQzNXjdmPz%o5X&81V(JE8+U33$#1Gp^$z04%*@8 zq?*^N$v-yBw|GTu%#|++Dr;qiaMrE2T5GJ)D`EH3Bq({px4L zlqc^KXq}F4apX^nH?Vt7?j!q|A3wT*RJ8TLyV75!Z?giVimU>UE-#ETWcvDPm_bk9 zj9%%XLbB%bd)C*_KRx;JftLDTN?iz|-!yC_HR&*%yC-y-_Ri{}pJ%G2rqT`|Y{)&* zi`4`)1S)-D7UTKURNGw=bG&Jx?>~*TcPg1+s<8G%#Hj!W8=- zE)5m%@Q#_K$HC!sB(e;d(QIhEEq+P(547dDl!D*gV*%DCd}FV*c^=Bi9)CM}RZ&QE zajGVu0O@&IB2U6Ei@YUs*iOGH5DI`2lFZgZ18ifC+Fxpoup)2QNPd@edktYPHn^Ki zr?;Fa6KqI0e6F*U5Lqwz{N3!imZ z_2MQUeuNnDzU)ZHU(0W|DL{(UP%gEIkm^=^k7ByZ@wNf~SyeP;zg+)idn=OcoNE1F&@%^6G$E9jQf`Ga7!r9mfszM{SQHoacwJn*Y9sXQ`)!)PE2b0ITh! z&s+O<5l}pui_XxUDxc#IqOLP~FdUc6>yJfrbL6!H{|@q-BW3qG=3|U!Z*AB$Oe7UD znO8WiyBh}fpfuhzB##x);Hgnl;{`XUYIP-@u$Mi=`5n>{s|_7E#@qGV29<*{9PQK1 z4SDm0+gs#xfq~I`@V+Jz1@dp4`YUtrwWE+Pf$HfqNt6_1Rs$p&&wOv9aC zAmvFmNnbsha~Uxd{*}zxJXpF|2$M(nX!TsmxN0(Z_LuO*`FVuT(E4KOT8v;REfIcv z+?TNyrvJ>}pPoM0j#j;<;3KVo^r_PCi?!B9N22Iun^}IPeVzt;WBCa~9%K-AFkc4g z-vH**OlyA=v~B=bVo%gp29dK)#Nc<|Tq%UE^U12gez+O`j`$#?z`OB8)VcDbu^0sZ zjdh?yrHm!*D60(Xko}Xw?ZW7^^+lPs5D}ovZPDUO5;>mg>m614t(>MkGL7mzc8lE# zooBq-mK-lzf)>1XlFJy)ZJg9vPr{Y2RJv9%0DHoSU7b*ari7o0sH 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%0Dx{3Vz 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