Update external libraries
Switch to official `stb_vorbis.c` instead of using an outdated fork
This commit is contained in:
parent
a151cbd37a
commit
d827a65e59
1 changed files with 2228 additions and 1566 deletions
111
src/external/dr_wav.h
vendored
111
src/external/dr_wav.h
vendored
|
|
@ -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.
|
||||
dr_wav - v0.13.4 - 2021-12-08
|
||||
dr_wav - v0.13.7 - 2022-09-17
|
||||
|
||||
David Reid - mackron@gmail.com
|
||||
|
||||
|
|
@ -92,6 +92,9 @@ Build Options
|
|||
#define DR_WAV_NO_STDIO
|
||||
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.
|
||||
|
||||
|
||||
|
||||
Notes
|
||||
|
|
@ -125,7 +128,7 @@ extern "C" {
|
|||
|
||||
#define DRWAV_VERSION_MAJOR 0
|
||||
#define DRWAV_VERSION_MINOR 13
|
||||
#define DRWAV_VERSION_REVISION 4
|
||||
#define DRWAV_VERSION_REVISION 7
|
||||
#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. */
|
||||
|
|
@ -1297,14 +1300,21 @@ DRWAV_API drwav_bool32 drwav_fourcc_equal(const drwav_uint8* a, const char* b);
|
|||
#ifndef dr_wav_c
|
||||
#define dr_wav_c
|
||||
|
||||
#ifdef __MRC__
|
||||
/* MrC currently doesn't compile dr_wav correctly with any optimizations enabled. */
|
||||
#pragma options opt off
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h> /* For memcpy(), memset() */
|
||||
#include <string.h>
|
||||
#include <limits.h> /* For INT_MAX */
|
||||
|
||||
#ifndef DR_WAV_NO_STDIO
|
||||
#include <stdio.h>
|
||||
#ifndef DR_WAV_NO_WCHAR
|
||||
#include <wchar.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Standard library stuff. */
|
||||
#ifndef DRWAV_ASSERT
|
||||
|
|
@ -1359,9 +1369,15 @@ DRWAV_API drwav_bool32 drwav_fourcc_equal(const drwav_uint8* a, const char* b);
|
|||
I am using "__inline__" only when we're compiling in strict ANSI mode.
|
||||
*/
|
||||
#if defined(__STRICT_ANSI__)
|
||||
#define DRWAV_INLINE __inline__ __attribute__((always_inline))
|
||||
#define DRWAV_GNUC_INLINE_HINT __inline__
|
||||
#else
|
||||
#define DRWAV_INLINE inline __attribute__((always_inline))
|
||||
#define DRWAV_GNUC_INLINE_HINT inline
|
||||
#endif
|
||||
|
||||
#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) || defined(__clang__)
|
||||
#define DRWAV_INLINE DRWAV_GNUC_INLINE_HINT __attribute__((always_inline))
|
||||
#else
|
||||
#define DRWAV_INLINE DRWAV_GNUC_INLINE_HINT
|
||||
#endif
|
||||
#elif defined(__WATCOMC__)
|
||||
#define DRWAV_INLINE __inline
|
||||
|
|
@ -1966,7 +1982,7 @@ DRWAV_PRIVATE drwav_bool32 drwav__read_fmt(drwav_read_proc onRead, drwav_seek_pr
|
|||
fmtOut->extendedSize = 0;
|
||||
fmtOut->validBitsPerSample = 0;
|
||||
fmtOut->channelMask = 0;
|
||||
memset(fmtOut->subFormat, 0, sizeof(fmtOut->subFormat));
|
||||
DRWAV_ZERO_MEMORY(fmtOut->subFormat, sizeof(fmtOut->subFormat));
|
||||
|
||||
if (header.sizeInBytes > 16) {
|
||||
drwav_uint8 fmt_cbSize[2];
|
||||
|
|
@ -2137,7 +2153,7 @@ DRWAV_PRIVATE void drwav__metadata_request_extra_memory_for_stage_2(drwav__metad
|
|||
DRWAV_PRIVATE drwav_result drwav__metadata_alloc(drwav__metadata_parser* pParser, drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
if (pParser->extraCapacity != 0 || pParser->metadataCount != 0) {
|
||||
free(pParser->pData);
|
||||
pAllocationCallbacks->onFree(pParser->pData, pAllocationCallbacks->pUserData);
|
||||
|
||||
pParser->pData = (drwav_uint8*)pAllocationCallbacks->onMalloc(drwav__metadata_memory_capacity(pParser), pAllocationCallbacks->pUserData);
|
||||
pParser->pDataCursor = pParser->pData;
|
||||
|
|
@ -2316,6 +2332,17 @@ DRWAV_PRIVATE drwav_uint64 drwav__read_acid_to_metadata_obj(drwav__metadata_pars
|
|||
return bytesRead;
|
||||
}
|
||||
|
||||
DRWAV_PRIVATE size_t drwav__strlen(const char* str)
|
||||
{
|
||||
size_t result = 0;
|
||||
|
||||
while (*str++) {
|
||||
result += 1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
DRWAV_PRIVATE size_t drwav__strlen_clamped(const char* str, size_t maxToRead)
|
||||
{
|
||||
size_t result = 0;
|
||||
|
|
@ -2335,7 +2362,7 @@ DRWAV_PRIVATE char* drwav__metadata_copy_string(drwav__metadata_parser* pParser,
|
|||
char* result = (char*)drwav__metadata_get_memory(pParser, len + 1, 1);
|
||||
DRWAV_ASSERT(result != NULL);
|
||||
|
||||
memcpy(result, str, len);
|
||||
DRWAV_COPY_MEMORY(result, str, len);
|
||||
result[len] = '\0';
|
||||
|
||||
return result;
|
||||
|
|
@ -2516,7 +2543,7 @@ DRWAV_PRIVATE drwav_uint64 drwav__read_bext_to_metadata_obj(drwav__metadata_pars
|
|||
DRWAV_ASSERT(pMetadata->data.bext.pCodingHistory != NULL);
|
||||
|
||||
bytesRead += drwav__metadata_parser_read(pParser, pMetadata->data.bext.pCodingHistory, extraBytes, NULL);
|
||||
pMetadata->data.bext.codingHistorySize = (drwav_uint32)strlen(pMetadata->data.bext.pCodingHistory);
|
||||
pMetadata->data.bext.codingHistorySize = (drwav_uint32)drwav__strlen(pMetadata->data.bext.pCodingHistory);
|
||||
} else {
|
||||
pMetadata->data.bext.pCodingHistory = NULL;
|
||||
pMetadata->data.bext.codingHistorySize = 0;
|
||||
|
|
@ -2780,21 +2807,21 @@ DRWAV_PRIVATE drwav_uint64 drwav__metadata_process_chunk(drwav__metadata_parser*
|
|||
if (bytesJustRead != DRWAV_BEXT_DESCRIPTION_BYTES) {
|
||||
return bytesRead;
|
||||
}
|
||||
allocSizeNeeded += strlen(buffer) + 1;
|
||||
allocSizeNeeded += drwav__strlen(buffer) + 1;
|
||||
|
||||
buffer[DRWAV_BEXT_ORIGINATOR_NAME_BYTES] = '\0';
|
||||
bytesJustRead = drwav__metadata_parser_read(pParser, buffer, DRWAV_BEXT_ORIGINATOR_NAME_BYTES, &bytesRead);
|
||||
if (bytesJustRead != DRWAV_BEXT_ORIGINATOR_NAME_BYTES) {
|
||||
return bytesRead;
|
||||
}
|
||||
allocSizeNeeded += strlen(buffer) + 1;
|
||||
allocSizeNeeded += drwav__strlen(buffer) + 1;
|
||||
|
||||
buffer[DRWAV_BEXT_ORIGINATOR_REF_BYTES] = '\0';
|
||||
bytesJustRead = drwav__metadata_parser_read(pParser, buffer, DRWAV_BEXT_ORIGINATOR_REF_BYTES, &bytesRead);
|
||||
if (bytesJustRead != DRWAV_BEXT_ORIGINATOR_REF_BYTES) {
|
||||
return bytesRead;
|
||||
}
|
||||
allocSizeNeeded += strlen(buffer) + 1;
|
||||
allocSizeNeeded += drwav__strlen(buffer) + 1;
|
||||
allocSizeNeeded += (size_t)pChunkHeader->sizeInBytes - DRWAV_BEXT_BYTES; /* Coding history. */
|
||||
|
||||
drwav__metadata_request_extra_memory_for_stage_2(pParser, allocSizeNeeded, 1);
|
||||
|
|
@ -3157,7 +3184,7 @@ DRWAV_PRIVATE drwav_bool32 drwav_init__internal(drwav* pWav, drwav_chunk_proc on
|
|||
translatedFormatTag = drwav_bytes_to_u16(fmt.subFormat + 0);
|
||||
}
|
||||
|
||||
memset(&metadataParser, 0, sizeof(metadataParser));
|
||||
DRWAV_ZERO_MEMORY(&metadataParser, sizeof(metadataParser));
|
||||
|
||||
/* Not tested on W64. */
|
||||
if (!sequential && pWav->allowedMetadataTypes != drwav_metadata_type_none && (pWav->container == drwav_container_riff || pWav->container == drwav_container_rf64)) {
|
||||
|
|
@ -3746,7 +3773,7 @@ DRWAV_PRIVATE size_t drwav__write_or_count_metadata(drwav* pWav, drwav_metadata*
|
|||
bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.maxMomentaryLoudness);
|
||||
bytesWritten += drwav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.maxShortTermLoudness);
|
||||
|
||||
memset(reservedBuf, 0, sizeof(reservedBuf));
|
||||
DRWAV_ZERO_MEMORY(reservedBuf, sizeof(reservedBuf));
|
||||
bytesWritten += drwav__write_or_count(pWav, reservedBuf, sizeof(reservedBuf));
|
||||
|
||||
if (pMetadata->data.bext.codingHistorySize > 0) {
|
||||
|
|
@ -4704,6 +4731,7 @@ fallback, so if you notice your compiler not detecting this properly I'm happy t
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef DR_WAV_NO_WCHAR
|
||||
DRWAV_PRIVATE drwav_result drwav_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_t* pOpenMode, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
if (ppFile != NULL) {
|
||||
|
|
@ -4731,11 +4759,24 @@ DRWAV_PRIVATE drwav_result drwav_wfopen(FILE** ppFile, const wchar_t* pFilePath,
|
|||
(void)pAllocationCallbacks;
|
||||
}
|
||||
#else
|
||||
/*
|
||||
Use fopen() on anything other than Windows. Requires a conversion. This is annoying because fopen() is locale specific. The only real way I can
|
||||
think of to do this is with wcsrtombs(). Note that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for
|
||||
maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler error I'll look into improving compatibility.
|
||||
/*
|
||||
Use fopen() on anything other than Windows. Requires a conversion. This is annoying because
|
||||
fopen() is locale specific. The only real way I can think of to do this is with wcsrtombs(). Note
|
||||
that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for
|
||||
maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler
|
||||
error I'll look into improving compatibility.
|
||||
*/
|
||||
|
||||
/*
|
||||
Some compilers don't support wchar_t or wcsrtombs() which we're using below. In this case we just
|
||||
need to abort with an error. If you encounter a compiler lacking such support, add it to this list
|
||||
and submit a bug report and it'll be added to the library upstream.
|
||||
*/
|
||||
#if defined(__DJGPP__)
|
||||
{
|
||||
/* Nothing to do here. This will fall through to the error check below. */
|
||||
}
|
||||
#else
|
||||
{
|
||||
mbstate_t mbs;
|
||||
size_t lenMB;
|
||||
|
|
@ -4777,6 +4818,7 @@ DRWAV_PRIVATE drwav_result drwav_wfopen(FILE** ppFile, const wchar_t* pFilePath,
|
|||
|
||||
drwav__free_from_callbacks(pFilePathMB, pAllocationCallbacks);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (*ppFile == NULL) {
|
||||
return DRWAV_ERROR;
|
||||
|
|
@ -4785,6 +4827,7 @@ DRWAV_PRIVATE drwav_result drwav_wfopen(FILE** ppFile, const wchar_t* pFilePath,
|
|||
|
||||
return DRWAV_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
DRWAV_PRIVATE size_t drwav__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead)
|
||||
|
|
@ -4840,6 +4883,7 @@ DRWAV_API drwav_bool32 drwav_init_file_ex(drwav* pWav, const char* filename, drw
|
|||
return drwav_init_file__internal_FILE(pWav, pFile, onChunk, pChunkUserData, flags, drwav_metadata_type_none, pAllocationCallbacks);
|
||||
}
|
||||
|
||||
#ifndef DR_WAV_NO_WCHAR
|
||||
DRWAV_API drwav_bool32 drwav_init_file_w(drwav* pWav, const wchar_t* filename, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
return drwav_init_file_ex_w(pWav, filename, NULL, NULL, 0, pAllocationCallbacks);
|
||||
|
|
@ -4855,6 +4899,7 @@ DRWAV_API drwav_bool32 drwav_init_file_ex_w(drwav* pWav, const wchar_t* filename
|
|||
/* This takes ownership of the FILE* object. */
|
||||
return drwav_init_file__internal_FILE(pWav, pFile, onChunk, pChunkUserData, flags, drwav_metadata_type_none, pAllocationCallbacks);
|
||||
}
|
||||
#endif
|
||||
|
||||
DRWAV_API drwav_bool32 drwav_init_file_with_metadata(drwav* pWav, const char* filename, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
|
|
@ -4867,6 +4912,7 @@ DRWAV_API drwav_bool32 drwav_init_file_with_metadata(drwav* pWav, const char* fi
|
|||
return drwav_init_file__internal_FILE(pWav, pFile, NULL, NULL, flags, drwav_metadata_type_all_including_unknown, pAllocationCallbacks);
|
||||
}
|
||||
|
||||
#ifndef DR_WAV_NO_WCHAR
|
||||
DRWAV_API drwav_bool32 drwav_init_file_with_metadata_w(drwav* pWav, const wchar_t* filename, drwav_uint32 flags, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
FILE* pFile;
|
||||
|
|
@ -4877,6 +4923,7 @@ DRWAV_API drwav_bool32 drwav_init_file_with_metadata_w(drwav* pWav, const wchar_
|
|||
/* This takes ownership of the FILE* object. */
|
||||
return drwav_init_file__internal_FILE(pWav, pFile, NULL, NULL, flags, drwav_metadata_type_all_including_unknown, pAllocationCallbacks);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
DRWAV_PRIVATE drwav_bool32 drwav_init_file_write__internal_FILE(drwav* pWav, FILE* pFile, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
|
|
@ -4909,6 +4956,7 @@ DRWAV_PRIVATE drwav_bool32 drwav_init_file_write__internal(drwav* pWav, const ch
|
|||
return drwav_init_file_write__internal_FILE(pWav, pFile, pFormat, totalSampleCount, isSequential, pAllocationCallbacks);
|
||||
}
|
||||
|
||||
#ifndef DR_WAV_NO_WCHAR
|
||||
DRWAV_PRIVATE drwav_bool32 drwav_init_file_write_w__internal(drwav* pWav, const wchar_t* filename, const drwav_data_format* pFormat, drwav_uint64 totalSampleCount, drwav_bool32 isSequential, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
FILE* pFile;
|
||||
|
|
@ -4919,6 +4967,7 @@ DRWAV_PRIVATE drwav_bool32 drwav_init_file_write_w__internal(drwav* pWav, const
|
|||
/* This takes ownership of the FILE* object. */
|
||||
return drwav_init_file_write__internal_FILE(pWav, pFile, pFormat, totalSampleCount, isSequential, pAllocationCallbacks);
|
||||
}
|
||||
#endif
|
||||
|
||||
DRWAV_API drwav_bool32 drwav_init_file_write(drwav* pWav, const char* filename, const drwav_data_format* pFormat, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
|
|
@ -4939,6 +4988,7 @@ DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames(drwav* pWav,
|
|||
return drwav_init_file_write_sequential(pWav, filename, pFormat, totalPCMFrameCount*pFormat->channels, pAllocationCallbacks);
|
||||
}
|
||||
|
||||
#ifndef DR_WAV_NO_WCHAR
|
||||
DRWAV_API drwav_bool32 drwav_init_file_write_w(drwav* pWav, const wchar_t* filename, const drwav_data_format* pFormat, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
return drwav_init_file_write_w__internal(pWav, filename, pFormat, 0, DRWAV_FALSE, pAllocationCallbacks);
|
||||
|
|
@ -4957,6 +5007,7 @@ DRWAV_API drwav_bool32 drwav_init_file_write_sequential_pcm_frames_w(drwav* pWav
|
|||
|
||||
return drwav_init_file_write_sequential_w(pWav, filename, pFormat, totalPCMFrameCount*pFormat->channels, pAllocationCallbacks);
|
||||
}
|
||||
#endif
|
||||
#endif /* DR_WAV_NO_STDIO */
|
||||
|
||||
|
||||
|
|
@ -5441,8 +5492,8 @@ DRWAV_API drwav_bool32 drwav_seek_to_pcm_frame(drwav* pWav, drwav_uint64 targetF
|
|||
}
|
||||
|
||||
/* Make sure the sample is clamped. */
|
||||
if (targetFrameIndex >= pWav->totalPCMFrameCount) {
|
||||
targetFrameIndex = pWav->totalPCMFrameCount - 1;
|
||||
if (targetFrameIndex > pWav->totalPCMFrameCount) {
|
||||
targetFrameIndex = pWav->totalPCMFrameCount;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -7650,6 +7701,7 @@ DRWAV_API drwav_int32* drwav_open_file_and_read_pcm_frames_s32(const char* filen
|
|||
}
|
||||
|
||||
|
||||
#ifndef DR_WAV_NO_WCHAR
|
||||
DRWAV_API drwav_int16* drwav_open_file_and_read_pcm_frames_s16_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, drwav_uint64* totalFrameCountOut, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
drwav wav;
|
||||
|
|
@ -7712,7 +7764,8 @@ DRWAV_API drwav_int32* drwav_open_file_and_read_pcm_frames_s32_w(const wchar_t*
|
|||
|
||||
return drwav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
|
||||
}
|
||||
#endif
|
||||
#endif /* DR_WAV_NO_WCHAR */
|
||||
#endif /* DR_WAV_NO_STDIO */
|
||||
|
||||
DRWAV_API 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, const drwav_allocation_callbacks* pAllocationCallbacks)
|
||||
{
|
||||
|
|
@ -7853,12 +7906,28 @@ DRWAV_API drwav_bool32 drwav_fourcc_equal(const drwav_uint8* a, const char* b)
|
|||
a[3] == b[3];
|
||||
}
|
||||
|
||||
#ifdef __MRC__
|
||||
/* Undo the pragma at the beginning of this file. */
|
||||
#pragma options opt reset
|
||||
#endif
|
||||
|
||||
#endif /* dr_wav_c */
|
||||
#endif /* DR_WAV_IMPLEMENTATION */
|
||||
|
||||
/*
|
||||
REVISION HISTORY
|
||||
================
|
||||
v0.13.7 - 2022-09-17
|
||||
- Fix compilation with DJGPP.
|
||||
- Add support for disabling wchar_t with DR_WAV_NO_WCHAR.
|
||||
|
||||
v0.13.6 - 2022-04-10
|
||||
- Fix compilation error on older versions of GCC.
|
||||
- Remove some dependencies on the standard library.
|
||||
|
||||
v0.13.5 - 2022-01-26
|
||||
- Fix an error when seeking to the end of the file.
|
||||
|
||||
v0.13.4 - 2021-12-08
|
||||
- Fix some static analysis warnings.
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue