| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| WAV audio loader and writer. Choice of public domain or MIT-0. See license statements at the end of this file. | WAV audio loader and writer. Choice of public domain or MIT-0. See license statements at the end of this file. | ||||
| dr_wav - v0.13.2 - 2021-10-02 | |||||
| dr_wav - v0.13.17 - TBD | |||||
| David Reid - mackron@gmail.com | David Reid - mackron@gmail.com | ||||
| @@ -79,7 +79,9 @@ dr_wav can also be used to output WAV files. This does not currently support com | |||||
| drwav_uint64 framesWritten = drwav_write_pcm_frames(pWav, frameCount, pSamples); | drwav_uint64 framesWritten = 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. | |||||
| Note that writing to AIFF or RIFX is not supported. | |||||
| dr_wav has support for decoding from a number of different encapsulation formats. See below for details. | |||||
| Build Options | Build Options | ||||
| @@ -92,24 +94,44 @@ Build Options | |||||
| #define DR_WAV_NO_STDIO | #define DR_WAV_NO_STDIO | ||||
| Disables APIs that initialize a decoder from a file such as `drwav_init_file()`, `drwav_init_file_write()`, etc. | Disables APIs that initialize a decoder from a file such as `drwav_init_file()`, `drwav_init_file_write()`, etc. | ||||
| #define DR_WAV_NO_WCHAR | |||||
| Disables all functions ending with `_w`. Use this if your compiler does not provide wchar.h. Not required if DR_WAV_NO_STDIO is also defined. | |||||
| Supported Encapsulations | |||||
| ======================== | |||||
| - RIFF (Regular WAV) | |||||
| - RIFX (Big-Endian) | |||||
| - AIFF (Does not currently support ADPCM) | |||||
| - RF64 | |||||
| - W64 | |||||
| Note that AIFF and RIFX do not support write mode, nor do they support reading of metadata. | |||||
| Supported Encodings | |||||
| =================== | |||||
| - 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) | |||||
| 8-bit PCM encodings are always assumed to be unsigned. Signed 8-bit encoding can only be read with `drwav_read_raw()`. | |||||
| Note that ADPCM is not currently supported with AIFF. Contributions welcome. | |||||
| Notes | Notes | ||||
| ===== | ===== | ||||
| - Samples are always interleaved. | - 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()` | - 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) | |||||
| to read and convert audio data to 32-bit floating point, signed 32-bit integer and signed 16-bit integer samples respectively. | |||||
| - dr_wav will try to read the WAV file as best it can, even if it's not strictly conformant to the WAV format. | - dr_wav will try to read the WAV file as best it can, even if it's not strictly conformant to the WAV format. | ||||
| */ | */ | ||||
| @@ -125,12 +147,12 @@ extern "C" { | |||||
| #define DRWAV_VERSION_MAJOR 0 | #define DRWAV_VERSION_MAJOR 0 | ||||
| #define DRWAV_VERSION_MINOR 13 | #define DRWAV_VERSION_MINOR 13 | ||||
| #define DRWAV_VERSION_REVISION 2 | |||||
| #define DRWAV_VERSION_REVISION 17 | |||||
| #define DRWAV_VERSION_STRING DRWAV_XSTRINGIFY(DRWAV_VERSION_MAJOR) "." DRWAV_XSTRINGIFY(DRWAV_VERSION_MINOR) "." DRWAV_XSTRINGIFY(DRWAV_VERSION_REVISION) | #define DRWAV_VERSION_STRING DRWAV_XSTRINGIFY(DRWAV_VERSION_MAJOR) "." DRWAV_XSTRINGIFY(DRWAV_VERSION_MINOR) "." DRWAV_XSTRINGIFY(DRWAV_VERSION_REVISION) | ||||
| #include <stddef.h> /* For size_t. */ | #include <stddef.h> /* For size_t. */ | ||||
| /* Sized types. */ | |||||
| /* Sized Types */ | |||||
| typedef signed char drwav_int8; | typedef signed char drwav_int8; | ||||
| typedef unsigned char drwav_uint8; | typedef unsigned char drwav_uint8; | ||||
| typedef signed short drwav_int16; | typedef signed short drwav_int16; | ||||
| @@ -163,7 +185,9 @@ typedef drwav_uint8 drwav_bool8; | |||||
| typedef drwav_uint32 drwav_bool32; | typedef drwav_uint32 drwav_bool32; | ||||
| #define DRWAV_TRUE 1 | #define DRWAV_TRUE 1 | ||||
| #define DRWAV_FALSE 0 | #define DRWAV_FALSE 0 | ||||
| /* End Sized Types */ | |||||
| /* Decorations */ | |||||
| #if !defined(DRWAV_API) | #if !defined(DRWAV_API) | ||||
| #if defined(DRWAV_DLL) | #if defined(DRWAV_DLL) | ||||
| #if defined(_WIN32) | #if defined(_WIN32) | ||||
| @@ -193,7 +217,9 @@ typedef drwav_uint32 drwav_bool32; | |||||
| #define DRWAV_PRIVATE static | #define DRWAV_PRIVATE static | ||||
| #endif | #endif | ||||
| #endif | #endif | ||||
| /* End Decorations */ | |||||
| /* Result Codes */ | |||||
| typedef drwav_int32 drwav_result; | typedef drwav_int32 drwav_result; | ||||
| #define DRWAV_SUCCESS 0 | #define DRWAV_SUCCESS 0 | ||||
| #define DRWAV_ERROR -1 /* A generic error. */ | #define DRWAV_ERROR -1 /* A generic error. */ | ||||
| @@ -249,6 +275,7 @@ typedef drwav_int32 drwav_result; | |||||
| #define DRWAV_CANCELLED -51 | #define DRWAV_CANCELLED -51 | ||||
| #define DRWAV_MEMORY_ALREADY_MAPPED -52 | #define DRWAV_MEMORY_ALREADY_MAPPED -52 | ||||
| #define DRWAV_AT_END -53 | #define DRWAV_AT_END -53 | ||||
| /* End Result Codes */ | |||||
| /* Common data formats. */ | /* Common data formats. */ | ||||
| #define DR_WAVE_FORMAT_PCM 0x1 | #define DR_WAVE_FORMAT_PCM 0x1 | ||||
| @@ -261,10 +288,21 @@ typedef drwav_int32 drwav_result; | |||||
| /* Flags to pass into drwav_init_ex(), etc. */ | /* Flags to pass into drwav_init_ex(), etc. */ | ||||
| #define DRWAV_SEQUENTIAL 0x00000001 | #define DRWAV_SEQUENTIAL 0x00000001 | ||||
| #define DRWAV_WITH_METADATA 0x00000002 | |||||
| DRWAV_API void drwav_version(drwav_uint32* pMajor, drwav_uint32* pMinor, drwav_uint32* pRevision); | DRWAV_API void drwav_version(drwav_uint32* pMajor, drwav_uint32* pMinor, drwav_uint32* pRevision); | ||||
| DRWAV_API const char* drwav_version_string(void); | DRWAV_API const char* drwav_version_string(void); | ||||
| /* Allocation Callbacks */ | |||||
| typedef struct | |||||
| { | |||||
| void* pUserData; | |||||
| void* (* onMalloc)(size_t sz, void* pUserData); | |||||
| void* (* onRealloc)(void* p, size_t sz, void* pUserData); | |||||
| void (* onFree)(void* p, void* pUserData); | |||||
| } drwav_allocation_callbacks; | |||||
| /* End Allocation Callbacks */ | |||||
| typedef enum | typedef enum | ||||
| { | { | ||||
| drwav_seek_origin_start, | drwav_seek_origin_start, | ||||
| @@ -274,8 +312,10 @@ typedef enum | |||||
| typedef enum | typedef enum | ||||
| { | { | ||||
| drwav_container_riff, | drwav_container_riff, | ||||
| drwav_container_rifx, | |||||
| drwav_container_w64, | drwav_container_w64, | ||||
| drwav_container_rf64 | |||||
| drwav_container_rf64, | |||||
| drwav_container_aiff | |||||
| } drwav_container; | } drwav_container; | ||||
| typedef struct | typedef struct | ||||
| @@ -406,13 +446,6 @@ The read pointer will be sitting on the first byte after the chunk's header. You | |||||
| */ | */ | ||||
| typedef drwav_uint64 (* drwav_chunk_proc)(void* pChunkUserData, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pReadSeekUserData, const drwav_chunk_header* pChunkHeader, drwav_container container, const drwav_fmt* pFMT); | typedef drwav_uint64 (* drwav_chunk_proc)(void* pChunkUserData, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pReadSeekUserData, const drwav_chunk_header* pChunkHeader, drwav_container container, const drwav_fmt* pFMT); | ||||
| typedef struct | |||||
| { | |||||
| void* pUserData; | |||||
| void* (* onMalloc)(size_t sz, void* pUserData); | |||||
| void* (* onRealloc)(void* p, size_t sz, void* pUserData); | |||||
| void (* onFree)(void* p, void* pUserData); | |||||
| } drwav_allocation_callbacks; | |||||
| /* Structure for internal use. Only used for loaders opened with drwav_init_memory(). */ | /* Structure for internal use. Only used for loaders opened with drwav_init_memory(). */ | ||||
| typedef struct | typedef struct | ||||
| @@ -866,9 +899,6 @@ typedef struct | |||||
| drwav_bool32 isSequentialWrite; | drwav_bool32 isSequentialWrite; | ||||
| /* A bit-field of drwav_metadata_type values, only bits set in this variable are parsed and saved */ | |||||
| drwav_metadata_type allowedMetadataTypes; | |||||
| /* A array of metadata. This is valid after the *init_with_metadata call returns. It will be valid until drwav_uninit() is called. You can take ownership of this data with drwav_take_ownership_of_metadata(). */ | /* A array of metadata. This is valid after the *init_with_metadata call returns. It will be valid until drwav_uninit() is called. You can take ownership of this data with drwav_take_ownership_of_metadata(). */ | ||||
| drwav_metadata* pMetadata; | drwav_metadata* pMetadata; | ||||
| drwav_uint32 metadataCount; | drwav_uint32 metadataCount; | ||||
| @@ -899,6 +929,13 @@ typedef struct | |||||
| drwav_int32 cachedFrames[16]; /* Samples are stored in this cache during decoding. */ | drwav_int32 cachedFrames[16]; /* Samples are stored in this cache during decoding. */ | ||||
| drwav_uint32 cachedFrameCount; | drwav_uint32 cachedFrameCount; | ||||
| } ima; | } ima; | ||||
| /* AIFF specific data. */ | |||||
| struct | |||||
| { | |||||
| drwav_bool8 isLE; /* Will be set to true if the audio data is little-endian encoded. */ | |||||
| drwav_bool8 isUnsigned; /* Only used for 8-bit samples. When set to true, will be treated as unsigned. */ | |||||
| } aiff; | |||||
| } drwav; | } drwav; | ||||
| @@ -1284,3 +1321,4 @@ DRWAV_API drwav_bool32 drwav_fourcc_equal(const drwav_uint8* a, const char* b); | |||||
| } | } | ||||
| #endif | #endif | ||||
| #endif /* dr_wav_h */ | #endif /* dr_wav_h */ | ||||