Commit e5433699 authored by David Reid's avatar David Reid

Update dr_libs.

parent 1c7967fc
...@@ -61704,8 +61704,9 @@ MA_API void ma_dr_wav_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* p ...@@ -61704,8 +61704,9 @@ MA_API void ma_dr_wav_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* p
MA_API const char* ma_dr_wav_version_string(void); MA_API const char* ma_dr_wav_version_string(void);
typedef enum typedef enum
{ {
ma_dr_wav_seek_origin_start, MA_DR_WAV_SEEK_SET,
ma_dr_wav_seek_origin_current MA_DR_WAV_SEEK_CUR,
MA_DR_WAV_SEEK_END
} ma_dr_wav_seek_origin; } ma_dr_wav_seek_origin;
typedef enum typedef enum
{ {
...@@ -61742,6 +61743,7 @@ MA_API ma_uint16 ma_dr_wav_fmt_get_format(const ma_dr_wav_fmt* pFMT); ...@@ -61742,6 +61743,7 @@ MA_API ma_uint16 ma_dr_wav_fmt_get_format(const ma_dr_wav_fmt* pFMT);
typedef size_t (* ma_dr_wav_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); typedef size_t (* ma_dr_wav_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);
typedef size_t (* ma_dr_wav_write_proc)(void* pUserData, const void* pData, size_t bytesToWrite); typedef size_t (* ma_dr_wav_write_proc)(void* pUserData, const void* pData, size_t bytesToWrite);
typedef ma_bool32 (* ma_dr_wav_seek_proc)(void* pUserData, int offset, ma_dr_wav_seek_origin origin); typedef ma_bool32 (* ma_dr_wav_seek_proc)(void* pUserData, int offset, ma_dr_wav_seek_origin origin);
typedef ma_bool32 (* ma_dr_wav_tell_proc)(void* pUserData, ma_int64* pCursor);
typedef ma_uint64 (* ma_dr_wav_chunk_proc)(void* pChunkUserData, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pReadSeekUserData, const ma_dr_wav_chunk_header* pChunkHeader, ma_dr_wav_container container, const ma_dr_wav_fmt* pFMT); typedef ma_uint64 (* ma_dr_wav_chunk_proc)(void* pChunkUserData, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pReadSeekUserData, const ma_dr_wav_chunk_header* pChunkHeader, ma_dr_wav_container container, const ma_dr_wav_fmt* pFMT);
typedef struct typedef struct
{ {
...@@ -61786,6 +61788,11 @@ typedef enum ...@@ -61786,6 +61788,11 @@ typedef enum
ma_dr_wav_metadata_type_list_info_genre = 1 << 15, ma_dr_wav_metadata_type_list_info_genre = 1 << 15,
ma_dr_wav_metadata_type_list_info_album = 1 << 16, ma_dr_wav_metadata_type_list_info_album = 1 << 16,
ma_dr_wav_metadata_type_list_info_tracknumber = 1 << 17, ma_dr_wav_metadata_type_list_info_tracknumber = 1 << 17,
ma_dr_wav_metadata_type_list_info_location = 1 << 18,
ma_dr_wav_metadata_type_list_info_organization = 1 << 19,
ma_dr_wav_metadata_type_list_info_keywords = 1 << 20,
ma_dr_wav_metadata_type_list_info_medium = 1 << 21,
ma_dr_wav_metadata_type_list_info_description = 1 << 22,
ma_dr_wav_metadata_type_list_all_info_strings = ma_dr_wav_metadata_type_list_info_software ma_dr_wav_metadata_type_list_all_info_strings = ma_dr_wav_metadata_type_list_info_software
| ma_dr_wav_metadata_type_list_info_copyright | ma_dr_wav_metadata_type_list_info_copyright
| ma_dr_wav_metadata_type_list_info_title | ma_dr_wav_metadata_type_list_info_title
...@@ -61794,7 +61801,12 @@ typedef enum ...@@ -61794,7 +61801,12 @@ typedef enum
| ma_dr_wav_metadata_type_list_info_date | ma_dr_wav_metadata_type_list_info_date
| ma_dr_wav_metadata_type_list_info_genre | ma_dr_wav_metadata_type_list_info_genre
| ma_dr_wav_metadata_type_list_info_album | ma_dr_wav_metadata_type_list_info_album
| ma_dr_wav_metadata_type_list_info_tracknumber, | ma_dr_wav_metadata_type_list_info_tracknumber
| ma_dr_wav_metadata_type_list_info_location
| ma_dr_wav_metadata_type_list_info_organization
| ma_dr_wav_metadata_type_list_info_keywords
| ma_dr_wav_metadata_type_list_info_medium
| ma_dr_wav_metadata_type_list_info_description,
ma_dr_wav_metadata_type_list_all_adtl = ma_dr_wav_metadata_type_list_label ma_dr_wav_metadata_type_list_all_adtl = ma_dr_wav_metadata_type_list_label
| ma_dr_wav_metadata_type_list_note | ma_dr_wav_metadata_type_list_note
| ma_dr_wav_metadata_type_list_labelled_cue_region, | ma_dr_wav_metadata_type_list_labelled_cue_region,
...@@ -61949,6 +61961,7 @@ typedef struct ...@@ -61949,6 +61961,7 @@ typedef struct
ma_dr_wav_read_proc onRead; ma_dr_wav_read_proc onRead;
ma_dr_wav_write_proc onWrite; ma_dr_wav_write_proc onWrite;
ma_dr_wav_seek_proc onSeek; ma_dr_wav_seek_proc onSeek;
ma_dr_wav_tell_proc onTell;
void* pUserData; void* pUserData;
ma_allocation_callbacks allocationCallbacks; ma_allocation_callbacks allocationCallbacks;
ma_dr_wav_container container; ma_dr_wav_container container;
...@@ -61991,9 +62004,9 @@ typedef struct ...@@ -61991,9 +62004,9 @@ typedef struct
ma_bool8 isUnsigned; ma_bool8 isUnsigned;
} aiff; } aiff;
} ma_dr_wav; } ma_dr_wav;
MA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, ma_dr_wav_chunk_proc onChunk, void* pReadSeekTellUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_bool32 ma_dr_wav_init_write(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_dr_wav_write_proc onWrite, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_write(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_dr_wav_write_proc onWrite, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_bool32 ma_dr_wav_init_write_sequential(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_write_sequential(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_bool32 ma_dr_wav_init_write_sequential_pcm_frames(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_write_sequential_pcm_frames(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);
...@@ -62065,9 +62078,9 @@ MA_API ma_bool32 ma_dr_wav_init_memory_write(ma_dr_wav* pWav, void** ppData, siz ...@@ -62065,9 +62078,9 @@ MA_API ma_bool32 ma_dr_wav_init_memory_write(ma_dr_wav* pWav, void** ppData, siz
MA_API ma_bool32 ma_dr_wav_init_memory_write_sequential(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_memory_write_sequential(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_bool32 ma_dr_wav_init_memory_write_sequential_pcm_frames(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_bool32 ma_dr_wav_init_memory_write_sequential_pcm_frames(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);
#ifndef MA_DR_WAV_NO_CONVERSION_API #ifndef MA_DR_WAV_NO_CONVERSION_API
MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);
#ifndef MA_DR_WAV_NO_STDIO #ifndef MA_DR_WAV_NO_STDIO
MA_API ma_int16* ma_dr_wav_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_int16* ma_dr_wav_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API float* ma_dr_wav_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks); MA_API float* ma_dr_wav_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);
...@@ -62107,8 +62120,8 @@ extern "C" { ...@@ -62107,8 +62120,8 @@ extern "C" {
#define MA_DR_FLAC_STRINGIFY(x) #x #define MA_DR_FLAC_STRINGIFY(x) #x
#define MA_DR_FLAC_XSTRINGIFY(x) MA_DR_FLAC_STRINGIFY(x) #define MA_DR_FLAC_XSTRINGIFY(x) MA_DR_FLAC_STRINGIFY(x)
#define MA_DR_FLAC_VERSION_MAJOR 0 #define MA_DR_FLAC_VERSION_MAJOR 0
#define MA_DR_FLAC_VERSION_MINOR 12 #define MA_DR_FLAC_VERSION_MINOR 13
#define MA_DR_FLAC_VERSION_REVISION 44 #define MA_DR_FLAC_VERSION_REVISION 0
#define MA_DR_FLAC_VERSION_STRING MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_MAJOR) "." MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_MINOR) "." MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_REVISION) #define MA_DR_FLAC_VERSION_STRING MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_MAJOR) "." MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_MINOR) "." MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_REVISION)
#include <stddef.h> #include <stddef.h>
#if defined(_MSC_VER) && _MSC_VER >= 1700 #if defined(_MSC_VER) && _MSC_VER >= 1700
...@@ -62171,8 +62184,9 @@ typedef enum ...@@ -62171,8 +62184,9 @@ typedef enum
} ma_dr_flac_container; } ma_dr_flac_container;
typedef enum typedef enum
{ {
ma_dr_flac_seek_origin_start, MA_DR_FLAC_SEEK_SET,
ma_dr_flac_seek_origin_current MA_DR_FLAC_SEEK_CUR,
MA_DR_FLAC_SEEK_END
} ma_dr_flac_seek_origin; } ma_dr_flac_seek_origin;
typedef struct typedef struct
{ {
...@@ -62248,6 +62262,7 @@ typedef struct ...@@ -62248,6 +62262,7 @@ typedef struct
} ma_dr_flac_metadata; } ma_dr_flac_metadata;
typedef size_t (* ma_dr_flac_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); typedef size_t (* ma_dr_flac_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);
typedef ma_bool32 (* ma_dr_flac_seek_proc)(void* pUserData, int offset, ma_dr_flac_seek_origin origin); typedef ma_bool32 (* ma_dr_flac_seek_proc)(void* pUserData, int offset, ma_dr_flac_seek_origin origin);
typedef ma_bool32 (* ma_dr_flac_tell_proc)(void* pUserData, ma_int64* pCursor);
typedef void (* ma_dr_flac_meta_proc)(void* pUserData, ma_dr_flac_metadata* pMetadata); typedef void (* ma_dr_flac_meta_proc)(void* pUserData, ma_dr_flac_metadata* pMetadata);
typedef struct typedef struct
{ {
...@@ -62259,6 +62274,7 @@ typedef struct ...@@ -62259,6 +62274,7 @@ typedef struct
{ {
ma_dr_flac_read_proc onRead; ma_dr_flac_read_proc onRead;
ma_dr_flac_seek_proc onSeek; ma_dr_flac_seek_proc onSeek;
ma_dr_flac_tell_proc onTell;
void* pUserData; void* pUserData;
size_t unalignedByteCount; size_t unalignedByteCount;
ma_dr_flac_cache_t unalignedCache; ma_dr_flac_cache_t unalignedCache;
...@@ -62318,10 +62334,10 @@ typedef struct ...@@ -62318,10 +62334,10 @@ typedef struct
ma_dr_flac_bs bs; ma_dr_flac_bs bs;
ma_uint8 pExtraData[1]; ma_uint8 pExtraData[1];
} ma_dr_flac; } ma_dr_flac;
MA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API void ma_dr_flac_close(ma_dr_flac* pFlac); MA_API void ma_dr_flac_close(ma_dr_flac* pFlac);
MA_API ma_uint64 ma_dr_flac_read_pcm_frames_s32(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int32* pBufferOut); MA_API ma_uint64 ma_dr_flac_read_pcm_frames_s32(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int32* pBufferOut);
MA_API ma_uint64 ma_dr_flac_read_pcm_frames_s16(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int16* pBufferOut); MA_API ma_uint64 ma_dr_flac_read_pcm_frames_s16(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int16* pBufferOut);
...@@ -62335,9 +62351,9 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata_w(const wchar_t* pFileName ...@@ -62335,9 +62351,9 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata_w(const wchar_t* pFileName
#endif #endif
MA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_t dataSize, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_t dataSize, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);
#ifndef MA_DR_FLAC_NO_STDIO #ifndef MA_DR_FLAC_NO_STDIO
MA_API ma_int32* ma_dr_flac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_int32* ma_dr_flac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);
MA_API ma_int16* ma_dr_flac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks); MA_API ma_int16* ma_dr_flac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);
...@@ -62423,9 +62439,9 @@ MA_API int ma_dr_mp3dec_decode_frame(ma_dr_mp3dec *dec, const ma_uint8 *mp3, int ...@@ -62423,9 +62439,9 @@ MA_API int ma_dr_mp3dec_decode_frame(ma_dr_mp3dec *dec, const ma_uint8 *mp3, int
MA_API void ma_dr_mp3dec_f32_to_s16(const float *in, ma_int16 *out, size_t num_samples); MA_API void ma_dr_mp3dec_f32_to_s16(const float *in, ma_int16 *out, size_t num_samples);
typedef enum typedef enum
{ {
ma_dr_mp3_seek_origin_start, MA_DR_MP3_SEEK_SET,
ma_dr_mp3_seek_origin_current, MA_DR_MP3_SEEK_CUR,
ma_dr_mp3_seek_origin_end MA_DR_MP3_SEEK_END
} ma_dr_mp3_seek_origin; } ma_dr_mp3_seek_origin;
typedef struct typedef struct
{ {
...@@ -63068,8 +63084,10 @@ static ma_bool32 ma_wav_dr_callback__seek(void* pUserData, int offset, ma_dr_wav ...@@ -63068,8 +63084,10 @@ static ma_bool32 ma_wav_dr_callback__seek(void* pUserData, int offset, ma_dr_wav
MA_ASSERT(pWav != NULL); MA_ASSERT(pWav != NULL);
maSeekOrigin = ma_seek_origin_start; maSeekOrigin = ma_seek_origin_start;
if (origin == ma_dr_wav_seek_origin_current) { if (origin == MA_DR_WAV_SEEK_CUR) {
maSeekOrigin = ma_seek_origin_current; maSeekOrigin = ma_seek_origin_current;
} else if (origin == MA_DR_WAV_SEEK_END) {
maSeekOrigin = ma_seek_origin_end;
} }
result = pWav->onSeek(pWav->pReadSeekTellUserData, offset, maSeekOrigin); result = pWav->onSeek(pWav->pReadSeekTellUserData, offset, maSeekOrigin);
...@@ -63079,6 +63097,26 @@ static ma_bool32 ma_wav_dr_callback__seek(void* pUserData, int offset, ma_dr_wav ...@@ -63079,6 +63097,26 @@ static ma_bool32 ma_wav_dr_callback__seek(void* pUserData, int offset, ma_dr_wav
return MA_TRUE; return MA_TRUE;
} }
static ma_bool32 ma_wav_dr_callback__tell(void* pUserData, ma_int64* pCursor)
{
ma_wav* pWav = (ma_wav*)pUserData;
ma_result result;
MA_ASSERT(pWav != NULL);
MA_ASSERT(pCursor != NULL);
if (pWav->onTell == NULL) {
return MA_FALSE; /* Not implemented. */
}
result = pWav->onTell(pWav->pReadSeekTellUserData, pCursor);
if (result != MA_SUCCESS) {
return MA_FALSE; /* Failed to tell. */
}
return MA_TRUE;
}
#endif #endif
static ma_result ma_wav_init_internal(const ma_decoding_backend_config* pConfig, ma_wav* pWav) static ma_result ma_wav_init_internal(const ma_decoding_backend_config* pConfig, ma_wav* pWav)
...@@ -63173,7 +63211,7 @@ MA_API ma_result ma_wav_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_p ...@@ -63173,7 +63211,7 @@ MA_API ma_result ma_wav_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_p
{ {
ma_bool32 wavResult; ma_bool32 wavResult;
wavResult = ma_dr_wav_init(&pWav->dr, ma_wav_dr_callback__read, ma_wav_dr_callback__seek, pWav, pAllocationCallbacks); wavResult = ma_dr_wav_init(&pWav->dr, ma_wav_dr_callback__read, ma_wav_dr_callback__seek, ma_wav_dr_callback__tell, pWav, pAllocationCallbacks);
if (wavResult != MA_TRUE) { if (wavResult != MA_TRUE) {
return MA_INVALID_FILE; return MA_INVALID_FILE;
} }
...@@ -63752,8 +63790,10 @@ static ma_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, ma_dr_fl ...@@ -63752,8 +63790,10 @@ static ma_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, ma_dr_fl
MA_ASSERT(pFlac != NULL); MA_ASSERT(pFlac != NULL);
maSeekOrigin = ma_seek_origin_start; maSeekOrigin = ma_seek_origin_start;
if (origin == ma_dr_flac_seek_origin_current) { if (origin == MA_DR_FLAC_SEEK_CUR) {
maSeekOrigin = ma_seek_origin_current; maSeekOrigin = ma_seek_origin_current;
} else if (origin == MA_DR_FLAC_SEEK_END) {
maSeekOrigin = ma_seek_origin_end;
} }
result = pFlac->onSeek(pFlac->pReadSeekTellUserData, offset, maSeekOrigin); result = pFlac->onSeek(pFlac->pReadSeekTellUserData, offset, maSeekOrigin);
...@@ -63763,6 +63803,26 @@ static ma_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, ma_dr_fl ...@@ -63763,6 +63803,26 @@ static ma_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, ma_dr_fl
return MA_TRUE; return MA_TRUE;
} }
static ma_bool32 ma_flac_dr_callback__tell(void* pUserData, ma_int64* pCursor)
{
ma_flac* pFlac = (ma_flac*)pUserData;
ma_result result;
MA_ASSERT(pFlac != NULL);
MA_ASSERT(pCursor != NULL);
if (pFlac->onTell == NULL) {
return MA_FALSE; /* Not implemented. */
}
result = pFlac->onTell(pFlac->pReadSeekTellUserData, pCursor);
if (result != MA_SUCCESS) {
return MA_FALSE; /* Failed to tell. */
}
return MA_TRUE;
}
#endif #endif
static ma_result ma_flac_init_internal(const ma_decoding_backend_config* pConfig, ma_flac* pFlac) static ma_result ma_flac_init_internal(const ma_decoding_backend_config* pConfig, ma_flac* pFlac)
...@@ -63814,7 +63874,7 @@ MA_API ma_result ma_flac_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_ ...@@ -63814,7 +63874,7 @@ MA_API ma_result ma_flac_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_
#if !defined(MA_NO_FLAC) #if !defined(MA_NO_FLAC)
{ {
pFlac->dr = ma_dr_flac_open(ma_flac_dr_callback__read, ma_flac_dr_callback__seek, pFlac, pAllocationCallbacks); pFlac->dr = ma_dr_flac_open(ma_flac_dr_callback__read, ma_flac_dr_callback__seek, ma_flac_dr_callback__tell, pFlac, pAllocationCallbacks);
if (pFlac->dr == NULL) { if (pFlac->dr == NULL) {
return MA_INVALID_FILE; return MA_INVALID_FILE;
} }
...@@ -64375,9 +64435,9 @@ static ma_bool32 ma_mp3_dr_callback__seek(void* pUserData, int offset, ma_dr_mp3 ...@@ -64375,9 +64435,9 @@ static ma_bool32 ma_mp3_dr_callback__seek(void* pUserData, int offset, ma_dr_mp3
MA_ASSERT(pMP3 != NULL); MA_ASSERT(pMP3 != NULL);
if (origin == ma_dr_mp3_seek_origin_start) { if (origin == MA_DR_MP3_SEEK_SET) {
maSeekOrigin = ma_seek_origin_start; maSeekOrigin = ma_seek_origin_start;
} else if (origin == ma_dr_mp3_seek_origin_end) { } else if (origin == MA_DR_MP3_SEEK_END) {
maSeekOrigin = ma_seek_origin_end; maSeekOrigin = ma_seek_origin_end;
} else { } else {
maSeekOrigin = ma_seek_origin_current; maSeekOrigin = ma_seek_origin_current;
...@@ -67526,10 +67586,18 @@ static ma_bool32 ma_encoder__internal_on_seek_wav(void* pUserData, int offset, m ...@@ -67526,10 +67586,18 @@ static ma_bool32 ma_encoder__internal_on_seek_wav(void* pUserData, int offset, m
{ {
ma_encoder* pEncoder = (ma_encoder*)pUserData; ma_encoder* pEncoder = (ma_encoder*)pUserData;
ma_result result; ma_result result;
ma_seek_origin maSeekOrigin;
MA_ASSERT(pEncoder != NULL); MA_ASSERT(pEncoder != NULL);
result = pEncoder->onSeek(pEncoder, offset, (origin == ma_dr_wav_seek_origin_start) ? ma_seek_origin_start : ma_seek_origin_current); maSeekOrigin = ma_seek_origin_start;
if (origin == MA_DR_WAV_SEEK_CUR) {
maSeekOrigin = ma_seek_origin_current;
} else if (origin == MA_DR_WAV_SEEK_END) {
maSeekOrigin = ma_seek_origin_end;
}
result = pEncoder->onSeek(pEncoder, offset, maSeekOrigin);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
return MA_FALSE; return MA_FALSE;
} else { } else {
...@@ -79952,12 +80020,12 @@ MA_PRIVATE ma_bool32 ma_dr_wav__seek_forward(ma_dr_wav_seek_proc onSeek, ma_uint ...@@ -79952,12 +80020,12 @@ MA_PRIVATE ma_bool32 ma_dr_wav__seek_forward(ma_dr_wav_seek_proc onSeek, ma_uint
ma_uint64 bytesRemainingToSeek = offset; ma_uint64 bytesRemainingToSeek = offset;
while (bytesRemainingToSeek > 0) { while (bytesRemainingToSeek > 0) {
if (bytesRemainingToSeek > 0x7FFFFFFF) { if (bytesRemainingToSeek > 0x7FFFFFFF) {
if (!onSeek(pUserData, 0x7FFFFFFF, ma_dr_wav_seek_origin_current)) { if (!onSeek(pUserData, 0x7FFFFFFF, MA_DR_WAV_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
bytesRemainingToSeek -= 0x7FFFFFFF; bytesRemainingToSeek -= 0x7FFFFFFF;
} else { } else {
if (!onSeek(pUserData, (int)bytesRemainingToSeek, ma_dr_wav_seek_origin_current)) { if (!onSeek(pUserData, (int)bytesRemainingToSeek, MA_DR_WAV_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
bytesRemainingToSeek = 0; bytesRemainingToSeek = 0;
...@@ -79968,17 +80036,17 @@ MA_PRIVATE ma_bool32 ma_dr_wav__seek_forward(ma_dr_wav_seek_proc onSeek, ma_uint ...@@ -79968,17 +80036,17 @@ MA_PRIVATE ma_bool32 ma_dr_wav__seek_forward(ma_dr_wav_seek_proc onSeek, ma_uint
MA_PRIVATE ma_bool32 ma_dr_wav__seek_from_start(ma_dr_wav_seek_proc onSeek, ma_uint64 offset, void* pUserData) MA_PRIVATE ma_bool32 ma_dr_wav__seek_from_start(ma_dr_wav_seek_proc onSeek, ma_uint64 offset, void* pUserData)
{ {
if (offset <= 0x7FFFFFFF) { if (offset <= 0x7FFFFFFF) {
return onSeek(pUserData, (int)offset, ma_dr_wav_seek_origin_start); return onSeek(pUserData, (int)offset, MA_DR_WAV_SEEK_SET);
} }
if (!onSeek(pUserData, 0x7FFFFFFF, ma_dr_wav_seek_origin_start)) { if (!onSeek(pUserData, 0x7FFFFFFF, MA_DR_WAV_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
offset -= 0x7FFFFFFF; offset -= 0x7FFFFFFF;
for (;;) { for (;;) {
if (offset <= 0x7FFFFFFF) { if (offset <= 0x7FFFFFFF) {
return onSeek(pUserData, (int)offset, ma_dr_wav_seek_origin_current); return onSeek(pUserData, (int)offset, MA_DR_WAV_SEEK_CUR);
} }
if (!onSeek(pUserData, 0x7FFFFFFF, ma_dr_wav_seek_origin_current)) { if (!onSeek(pUserData, 0x7FFFFFFF, MA_DR_WAV_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
offset -= 0x7FFFFFFF; offset -= 0x7FFFFFFF;
...@@ -80001,7 +80069,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav__on_seek(ma_dr_wav_seek_proc onSeek, void* pUserD ...@@ -80001,7 +80069,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav__on_seek(ma_dr_wav_seek_proc onSeek, void* pUserD
if (!onSeek(pUserData, offset, origin)) { if (!onSeek(pUserData, offset, origin)) {
return MA_FALSE; return MA_FALSE;
} }
if (origin == ma_dr_wav_seek_origin_start) { if (origin == MA_DR_WAV_SEEK_SET) {
*pCursor = offset; *pCursor = offset;
} else { } else {
*pCursor += offset; *pCursor += offset;
...@@ -80509,7 +80577,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse ...@@ -80509,7 +80577,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse
if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) { if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {
ma_uint8 buffer[4]; ma_uint8 buffer[4];
size_t bytesJustRead; size_t bytesJustRead;
if (!pParser->onSeek(pParser->pReadSeekUserData, 28, ma_dr_wav_seek_origin_current)) { if (!pParser->onSeek(pParser->pReadSeekUserData, 28, MA_DR_WAV_SEEK_CUR)) {
return bytesRead; return bytesRead;
} }
bytesRead += 28; bytesRead += 28;
...@@ -80604,7 +80672,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse ...@@ -80604,7 +80672,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse
return bytesRead; return bytesRead;
} }
allocSizeNeeded += ma_dr_wav__strlen(buffer) + 1; allocSizeNeeded += ma_dr_wav__strlen(buffer) + 1;
allocSizeNeeded += (size_t)pChunkHeader->sizeInBytes - MA_DR_WAV_BEXT_BYTES; allocSizeNeeded += (size_t)pChunkHeader->sizeInBytes - MA_DR_WAV_BEXT_BYTES + 1;
ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, allocSizeNeeded, 1); ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, allocSizeNeeded, 1);
pParser->metadataCount += 1; pParser->metadataCount += 1;
} else { } else {
...@@ -80687,6 +80755,16 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse ...@@ -80687,6 +80755,16 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse
subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_album); subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_album);
} else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_tracknumber, "ITRK")) { } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_tracknumber, "ITRK")) {
subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_tracknumber); subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_tracknumber);
} else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_location, "IARL")) {
subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_location);
} else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_organization, "ICMS")) {
subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_organization);
} else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_keywords, "IKEY")) {
subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_keywords);
} else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_medium, "IMED")) {
subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_medium);
} else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_description, "ISBJ")) {
subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize, ma_dr_wav_metadata_type_list_info_description);
} else if ((allowedMetadataTypes & ma_dr_wav_metadata_type_unknown) != 0) { } else if ((allowedMetadataTypes & ma_dr_wav_metadata_type_unknown) != 0) {
subchunkBytesRead = ma_dr_wav__metadata_process_unknown_chunk(pParser, subchunkId, subchunkDataSize, listType); subchunkBytesRead = ma_dr_wav__metadata_process_unknown_chunk(pParser, subchunkId, subchunkDataSize, listType);
} }
...@@ -80694,13 +80772,13 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse ...@@ -80694,13 +80772,13 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse
MA_DR_WAV_ASSERT(subchunkBytesRead <= subchunkDataSize); MA_DR_WAV_ASSERT(subchunkBytesRead <= subchunkDataSize);
if (subchunkBytesRead < subchunkDataSize) { if (subchunkBytesRead < subchunkDataSize) {
ma_uint64 bytesToSeek = subchunkDataSize - subchunkBytesRead; ma_uint64 bytesToSeek = subchunkDataSize - subchunkBytesRead;
if (!pParser->onSeek(pParser->pReadSeekUserData, (int)bytesToSeek, ma_dr_wav_seek_origin_current)) { if (!pParser->onSeek(pParser->pReadSeekUserData, (int)bytesToSeek, MA_DR_WAV_SEEK_CUR)) {
break; break;
} }
bytesRead += bytesToSeek; bytesRead += bytesToSeek;
} }
if ((subchunkDataSize % 2) == 1) { if ((subchunkDataSize % 2) == 1) {
if (!pParser->onSeek(pParser->pReadSeekUserData, 1, ma_dr_wav_seek_origin_current)) { if (!pParser->onSeek(pParser->pReadSeekUserData, 1, MA_DR_WAV_SEEK_CUR)) {
break; break;
} }
bytesRead += 1; bytesRead += 1;
...@@ -80737,7 +80815,7 @@ MA_API ma_uint16 ma_dr_wav_fmt_get_format(const ma_dr_wav_fmt* pFMT) ...@@ -80737,7 +80815,7 @@ MA_API ma_uint16 ma_dr_wav_fmt_get_format(const ma_dr_wav_fmt* pFMT)
return ma_dr_wav_bytes_to_u16(pFMT->subFormat); return ma_dr_wav_bytes_to_u16(pFMT->subFormat);
} }
} }
MA_PRIVATE ma_bool32 ma_dr_wav_preinit(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pReadSeekUserData, const ma_allocation_callbacks* pAllocationCallbacks) MA_PRIVATE ma_bool32 ma_dr_wav_preinit(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pReadSeekTellUserData, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
if (pWav == NULL || onRead == NULL || onSeek == NULL) { if (pWav == NULL || onRead == NULL || onSeek == NULL) {
return MA_FALSE; return MA_FALSE;
...@@ -80745,7 +80823,8 @@ MA_PRIVATE ma_bool32 ma_dr_wav_preinit(ma_dr_wav* pWav, ma_dr_wav_read_proc onRe ...@@ -80745,7 +80823,8 @@ MA_PRIVATE ma_bool32 ma_dr_wav_preinit(ma_dr_wav* pWav, ma_dr_wav_read_proc onRe
MA_DR_WAV_ZERO_MEMORY(pWav, sizeof(*pWav)); MA_DR_WAV_ZERO_MEMORY(pWav, sizeof(*pWav));
pWav->onRead = onRead; pWav->onRead = onRead;
pWav->onSeek = onSeek; pWav->onSeek = onSeek;
pWav->pUserData = pReadSeekUserData; pWav->onTell = onTell;
pWav->pUserData = pReadSeekTellUserData;
pWav->allocationCallbacks = ma_dr_wav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks); pWav->allocationCallbacks = ma_dr_wav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);
if (pWav->allocationCallbacks.onFree == NULL || (pWav->allocationCallbacks.onMalloc == NULL && pWav->allocationCallbacks.onRealloc == NULL)) { if (pWav->allocationCallbacks.onFree == NULL || (pWav->allocationCallbacks.onMalloc == NULL && pWav->allocationCallbacks.onRealloc == NULL)) {
return MA_FALSE; return MA_FALSE;
...@@ -80959,14 +81038,14 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p ...@@ -80959,14 +81038,14 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p
fmt.channelMask = ma_dr_wav_bytes_to_u32_ex(fmtext + 2, pWav->container); fmt.channelMask = ma_dr_wav_bytes_to_u32_ex(fmtext + 2, pWav->container);
ma_dr_wav_bytes_to_guid(fmtext + 6, fmt.subFormat); ma_dr_wav_bytes_to_guid(fmtext + 6, fmt.subFormat);
} else { } else {
if (pWav->onSeek(pWav->pUserData, fmt.extendedSize, ma_dr_wav_seek_origin_current) == MA_FALSE) { if (pWav->onSeek(pWav->pUserData, fmt.extendedSize, MA_DR_WAV_SEEK_CUR) == MA_FALSE) {
return MA_FALSE; return MA_FALSE;
} }
} }
cursor += fmt.extendedSize; cursor += fmt.extendedSize;
bytesReadSoFar += fmt.extendedSize; bytesReadSoFar += fmt.extendedSize;
} }
if (pWav->onSeek(pWav->pUserData, (int)(header.sizeInBytes - bytesReadSoFar), ma_dr_wav_seek_origin_current) == MA_FALSE) { if (pWav->onSeek(pWav->pUserData, (int)(header.sizeInBytes - bytesReadSoFar), MA_DR_WAV_SEEK_CUR) == MA_FALSE) {
return MA_FALSE; return MA_FALSE;
} }
cursor += (header.sizeInBytes - bytesReadSoFar); cursor += (header.sizeInBytes - bytesReadSoFar);
...@@ -81200,9 +81279,16 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p ...@@ -81200,9 +81279,16 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p
pWav->pMetadata = metadataParser.pMetadata; pWav->pMetadata = metadataParser.pMetadata;
pWav->metadataCount = metadataParser.metadataCount; pWav->metadataCount = metadataParser.metadataCount;
} }
if (ma_dr_wav__seek_from_start(pWav->onSeek, pWav->dataChunkDataPos, pWav->pUserData) == MA_FALSE) { if (pWav->onTell != NULL && pWav->onSeek != NULL) {
ma_dr_wav_free(pWav->pMetadata, &pWav->allocationCallbacks); if (pWav->onSeek(pWav->pUserData, 0, MA_DR_WAV_SEEK_END) == MA_TRUE) {
return MA_FALSE; ma_int64 fileSize;
if (pWav->onTell(pWav->pUserData, &fileSize)) {
if (dataChunkSize + pWav->dataChunkDataPos > (ma_uint64)fileSize) {
dataChunkSize = (ma_uint64)fileSize - pWav->dataChunkDataPos;
}
}
} else {
}
} }
if (dataChunkSize == 0xFFFFFFFF && (pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx) && pWav->isSequentialWrite == MA_FALSE) { if (dataChunkSize == 0xFFFFFFFF && (pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx) && pWav->isSequentialWrite == MA_FALSE) {
dataChunkSize = 0; dataChunkSize = 0;
...@@ -81215,6 +81301,10 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p ...@@ -81215,6 +81301,10 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p
} }
} }
} }
if (ma_dr_wav__seek_from_start(pWav->onSeek, pWav->dataChunkDataPos, pWav->pUserData) == MA_FALSE) {
ma_dr_wav_free(pWav->pMetadata, &pWav->allocationCallbacks);
return MA_FALSE;
}
pWav->fmt = fmt; pWav->fmt = fmt;
pWav->sampleRate = fmt.sampleRate; pWav->sampleRate = fmt.sampleRate;
pWav->channels = fmt.channels; pWav->channels = fmt.channels;
...@@ -81281,20 +81371,20 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p ...@@ -81281,20 +81371,20 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_p
#endif #endif
return MA_TRUE; return MA_TRUE;
} }
MA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
return ma_dr_wav_init_ex(pWav, onRead, onSeek, NULL, pUserData, NULL, 0, pAllocationCallbacks); return ma_dr_wav_init_ex(pWav, onRead, onSeek, onTell, NULL, pUserData, NULL, 0, pAllocationCallbacks);
} }
MA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, ma_dr_wav_chunk_proc onChunk, void* pReadSeekTellUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
if (!ma_dr_wav_preinit(pWav, onRead, onSeek, pReadSeekUserData, pAllocationCallbacks)) { if (!ma_dr_wav_preinit(pWav, onRead, onSeek, onTell, pReadSeekTellUserData, pAllocationCallbacks)) {
return MA_FALSE; return MA_FALSE;
} }
return ma_dr_wav_init__internal(pWav, onChunk, pChunkUserData, flags); return ma_dr_wav_init__internal(pWav, onChunk, pChunkUserData, flags);
} }
MA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
if (!ma_dr_wav_preinit(pWav, onRead, onSeek, pUserData, pAllocationCallbacks)) { if (!ma_dr_wav_preinit(pWav, onRead, onSeek, onTell, pUserData, pAllocationCallbacks)) {
return MA_FALSE; return MA_FALSE;
} }
return ma_dr_wav_init__internal(pWav, NULL, NULL, flags | MA_DR_WAV_WITH_METADATA); return ma_dr_wav_init__internal(pWav, NULL, NULL, flags | MA_DR_WAV_WITH_METADATA);
...@@ -81586,6 +81676,11 @@ MA_PRIVATE size_t ma_dr_wav__write_or_count_metadata(ma_dr_wav* pWav, ma_dr_wav_ ...@@ -81586,6 +81676,11 @@ MA_PRIVATE size_t ma_dr_wav__write_or_count_metadata(ma_dr_wav* pWav, ma_dr_wav_
case ma_dr_wav_metadata_type_list_info_genre: pID = "IGNR"; break; case ma_dr_wav_metadata_type_list_info_genre: pID = "IGNR"; break;
case ma_dr_wav_metadata_type_list_info_album: pID = "IPRD"; break; case ma_dr_wav_metadata_type_list_info_album: pID = "IPRD"; break;
case ma_dr_wav_metadata_type_list_info_tracknumber: pID = "ITRK"; break; case ma_dr_wav_metadata_type_list_info_tracknumber: pID = "ITRK"; break;
case ma_dr_wav_metadata_type_list_info_location: pID = "IARL"; break;
case ma_dr_wav_metadata_type_list_info_organization: pID = "ICMS"; break;
case ma_dr_wav_metadata_type_list_info_keywords: pID = "IKEY"; break;
case ma_dr_wav_metadata_type_list_info_medium: pID = "IMED"; break;
case ma_dr_wav_metadata_type_list_info_description: pID = "ISBJ"; break;
default: break; default: break;
} }
MA_DR_WAV_ASSERT(pID != NULL); MA_DR_WAV_ASSERT(pID != NULL);
...@@ -81800,7 +81895,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init_write__internal(ma_dr_wav* pWav, const ma_dr ...@@ -81800,7 +81895,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav_init_write__internal(ma_dr_wav* pWav, const ma_dr
} }
pWav->dataChunkDataSizeTargetWrite = initialDataChunkSize; pWav->dataChunkDataSizeTargetWrite = initialDataChunkSize;
if (pFormat->container == ma_dr_wav_container_riff) { if (pFormat->container == ma_dr_wav_container_riff) {
ma_uint32 chunkSizeRIFF = 28 + (ma_uint32)initialDataChunkSize; ma_uint32 chunkSizeRIFF = 36 + (ma_uint32)initialDataChunkSize;
runningPos += ma_dr_wav__write(pWav, "RIFF", 4); runningPos += ma_dr_wav__write(pWav, "RIFF", 4);
runningPos += ma_dr_wav__write_u32ne_to_le(pWav, chunkSizeRIFF); runningPos += ma_dr_wav__write_u32ne_to_le(pWav, chunkSizeRIFF);
runningPos += ma_dr_wav__write(pWav, "WAVE", 4); runningPos += ma_dr_wav__write(pWav, "WAVE", 4);
...@@ -81923,7 +82018,31 @@ MA_PRIVATE size_t ma_dr_wav__on_write_stdio(void* pUserData, const void* pData, ...@@ -81923,7 +82018,31 @@ MA_PRIVATE size_t ma_dr_wav__on_write_stdio(void* pUserData, const void* pData,
} }
MA_PRIVATE ma_bool32 ma_dr_wav__on_seek_stdio(void* pUserData, int offset, ma_dr_wav_seek_origin origin) MA_PRIVATE ma_bool32 ma_dr_wav__on_seek_stdio(void* pUserData, int offset, ma_dr_wav_seek_origin origin)
{ {
return fseek((FILE*)pUserData, offset, (origin == ma_dr_wav_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; int whence = SEEK_SET;
if (origin == MA_DR_WAV_SEEK_CUR) {
whence = SEEK_CUR;
} else if (origin == MA_DR_WAV_SEEK_END) {
whence = SEEK_END;
}
return fseek((FILE*)pUserData, offset, whence) == 0;
}
MA_PRIVATE ma_bool32 ma_dr_wav__on_tell_stdio(void* pUserData, ma_int64* pCursor)
{
FILE* pFileStdio = (FILE*)pUserData;
ma_int64 result;
MA_DR_WAV_ASSERT(pFileStdio != NULL);
MA_DR_WAV_ASSERT(pCursor != NULL);
#if defined(_WIN32)
#if defined(_MSC_VER) && _MSC_VER > 1200
result = _ftelli64(pFileStdio);
#else
result = ftell(pFileStdio);
#endif
#else
result = ftell(pFileStdio);
#endif
*pCursor = result;
return MA_TRUE;
} }
MA_API ma_bool32 ma_dr_wav_init_file(ma_dr_wav* pWav, const char* filename, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_bool32 ma_dr_wav_init_file(ma_dr_wav* pWav, const char* filename, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
...@@ -81932,7 +82051,7 @@ MA_API ma_bool32 ma_dr_wav_init_file(ma_dr_wav* pWav, const char* filename, cons ...@@ -81932,7 +82051,7 @@ MA_API ma_bool32 ma_dr_wav_init_file(ma_dr_wav* pWav, const char* filename, cons
MA_PRIVATE ma_bool32 ma_dr_wav_init_file__internal_FILE(ma_dr_wav* pWav, FILE* pFile, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks) MA_PRIVATE ma_bool32 ma_dr_wav_init_file__internal_FILE(ma_dr_wav* pWav, FILE* pFile, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
ma_bool32 result; ma_bool32 result;
result = ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_stdio, ma_dr_wav__on_seek_stdio, (void*)pFile, pAllocationCallbacks); result = ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_stdio, ma_dr_wav__on_seek_stdio, ma_dr_wav__on_tell_stdio, (void*)pFile, pAllocationCallbacks);
if (result != MA_TRUE) { if (result != MA_TRUE) {
fclose(pFile); fclose(pFile);
return result; return result;
...@@ -82069,25 +82188,27 @@ MA_PRIVATE size_t ma_dr_wav__on_read_memory(void* pUserData, void* pBufferOut, s ...@@ -82069,25 +82188,27 @@ MA_PRIVATE size_t ma_dr_wav__on_read_memory(void* pUserData, void* pBufferOut, s
MA_PRIVATE ma_bool32 ma_dr_wav__on_seek_memory(void* pUserData, int offset, ma_dr_wav_seek_origin origin) MA_PRIVATE ma_bool32 ma_dr_wav__on_seek_memory(void* pUserData, int offset, ma_dr_wav_seek_origin origin)
{ {
ma_dr_wav* pWav = (ma_dr_wav*)pUserData; ma_dr_wav* pWav = (ma_dr_wav*)pUserData;
ma_int64 newCursor;
MA_DR_WAV_ASSERT(pWav != NULL); MA_DR_WAV_ASSERT(pWav != NULL);
if (origin == ma_dr_wav_seek_origin_current) { newCursor = pWav->memoryStream.currentReadPos;
if (offset > 0) { if (origin == MA_DR_WAV_SEEK_SET) {
if (pWav->memoryStream.currentReadPos + offset > pWav->memoryStream.dataSize) { newCursor = 0;
} else if (origin == MA_DR_WAV_SEEK_CUR) {
newCursor = (ma_int64)pWav->memoryStream.currentReadPos;
} else if (origin == MA_DR_WAV_SEEK_END) {
newCursor = (ma_int64)pWav->memoryStream.dataSize;
} else {
MA_DR_WAV_ASSERT(!"Invalid seek origin");
return MA_FALSE; return MA_FALSE;
} }
} else { newCursor += offset;
if (pWav->memoryStream.currentReadPos < (size_t)-offset) { if (newCursor < 0) {
return MA_FALSE; return MA_FALSE;
} }
} if ((size_t)newCursor > pWav->memoryStream.dataSize) {
pWav->memoryStream.currentReadPos += offset;
} else {
if ((ma_uint32)offset <= pWav->memoryStream.dataSize) {
pWav->memoryStream.currentReadPos = offset;
} else {
return MA_FALSE; return MA_FALSE;
} }
} pWav->memoryStream.currentReadPos = (size_t)newCursor;
return MA_TRUE; return MA_TRUE;
} }
MA_PRIVATE size_t ma_dr_wav__on_write_memory(void* pUserData, const void* pDataIn, size_t bytesToWrite) MA_PRIVATE size_t ma_dr_wav__on_write_memory(void* pUserData, const void* pDataIn, size_t bytesToWrite)
...@@ -82121,25 +82242,35 @@ MA_PRIVATE size_t ma_dr_wav__on_write_memory(void* pUserData, const void* pDataI ...@@ -82121,25 +82242,35 @@ MA_PRIVATE size_t ma_dr_wav__on_write_memory(void* pUserData, const void* pDataI
MA_PRIVATE ma_bool32 ma_dr_wav__on_seek_memory_write(void* pUserData, int offset, ma_dr_wav_seek_origin origin) MA_PRIVATE ma_bool32 ma_dr_wav__on_seek_memory_write(void* pUserData, int offset, ma_dr_wav_seek_origin origin)
{ {
ma_dr_wav* pWav = (ma_dr_wav*)pUserData; ma_dr_wav* pWav = (ma_dr_wav*)pUserData;
ma_int64 newCursor;
MA_DR_WAV_ASSERT(pWav != NULL); MA_DR_WAV_ASSERT(pWav != NULL);
if (origin == ma_dr_wav_seek_origin_current) { newCursor = pWav->memoryStreamWrite.currentWritePos;
if (offset > 0) { if (origin == MA_DR_WAV_SEEK_SET) {
if (pWav->memoryStreamWrite.currentWritePos + offset > pWav->memoryStreamWrite.dataSize) { newCursor = 0;
offset = (int)(pWav->memoryStreamWrite.dataSize - pWav->memoryStreamWrite.currentWritePos); } else if (origin == MA_DR_WAV_SEEK_CUR) {
} newCursor = (ma_int64)pWav->memoryStreamWrite.currentWritePos;
} else if (origin == MA_DR_WAV_SEEK_END) {
newCursor = (ma_int64)pWav->memoryStreamWrite.dataSize;
} else { } else {
if (pWav->memoryStreamWrite.currentWritePos < (size_t)-offset) { MA_DR_WAV_ASSERT(!"Invalid seek origin");
offset = -(int)pWav->memoryStreamWrite.currentWritePos; return MA_INVALID_ARGS;
}
} }
pWav->memoryStreamWrite.currentWritePos += offset; newCursor += offset;
} else { if (newCursor < 0) {
if ((ma_uint32)offset <= pWav->memoryStreamWrite.dataSize) { return MA_FALSE;
pWav->memoryStreamWrite.currentWritePos = offset;
} else {
pWav->memoryStreamWrite.currentWritePos = pWav->memoryStreamWrite.dataSize;
} }
if ((size_t)newCursor > pWav->memoryStreamWrite.dataSize) {
return MA_FALSE;
} }
pWav->memoryStreamWrite.currentWritePos = (size_t)newCursor;
return MA_TRUE;
}
MA_PRIVATE ma_bool32 ma_dr_wav__on_tell_memory(void* pUserData, ma_int64* pCursor)
{
ma_dr_wav* pWav = (ma_dr_wav*)pUserData;
MA_DR_WAV_ASSERT(pWav != NULL);
MA_DR_WAV_ASSERT(pCursor != NULL);
*pCursor = (ma_int64)pWav->memoryStream.currentReadPos;
return MA_TRUE; return MA_TRUE;
} }
MA_API ma_bool32 ma_dr_wav_init_memory(ma_dr_wav* pWav, const void* data, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_bool32 ma_dr_wav_init_memory(ma_dr_wav* pWav, const void* data, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks)
...@@ -82151,7 +82282,7 @@ MA_API ma_bool32 ma_dr_wav_init_memory_ex(ma_dr_wav* pWav, const void* data, siz ...@@ -82151,7 +82282,7 @@ MA_API ma_bool32 ma_dr_wav_init_memory_ex(ma_dr_wav* pWav, const void* data, siz
if (data == NULL || dataSize == 0) { if (data == NULL || dataSize == 0) {
return MA_FALSE; return MA_FALSE;
} }
if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, pWav, pAllocationCallbacks)) { if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, ma_dr_wav__on_tell_memory, pWav, pAllocationCallbacks)) {
return MA_FALSE; return MA_FALSE;
} }
pWav->memoryStream.data = (const ma_uint8*)data; pWav->memoryStream.data = (const ma_uint8*)data;
...@@ -82164,7 +82295,7 @@ MA_API ma_bool32 ma_dr_wav_init_memory_with_metadata(ma_dr_wav* pWav, const void ...@@ -82164,7 +82295,7 @@ MA_API ma_bool32 ma_dr_wav_init_memory_with_metadata(ma_dr_wav* pWav, const void
if (data == NULL || dataSize == 0) { if (data == NULL || dataSize == 0) {
return MA_FALSE; return MA_FALSE;
} }
if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, pWav, pAllocationCallbacks)) { if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, ma_dr_wav__on_tell_memory, pWav, pAllocationCallbacks)) {
return MA_FALSE; return MA_FALSE;
} }
pWav->memoryStream.data = (const ma_uint8*)data; pWav->memoryStream.data = (const ma_uint8*)data;
...@@ -82223,30 +82354,30 @@ MA_API ma_result ma_dr_wav_uninit(ma_dr_wav* pWav) ...@@ -82223,30 +82354,30 @@ MA_API ma_result ma_dr_wav_uninit(ma_dr_wav* pWav)
} }
if (pWav->onSeek && !pWav->isSequentialWrite) { if (pWav->onSeek && !pWav->isSequentialWrite) {
if (pWav->container == ma_dr_wav_container_riff) { if (pWav->container == ma_dr_wav_container_riff) {
if (pWav->onSeek(pWav->pUserData, 4, ma_dr_wav_seek_origin_start)) { if (pWav->onSeek(pWav->pUserData, 4, MA_DR_WAV_SEEK_SET)) {
ma_uint32 riffChunkSize = ma_dr_wav__riff_chunk_size_riff(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount); ma_uint32 riffChunkSize = ma_dr_wav__riff_chunk_size_riff(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount);
ma_dr_wav__write_u32ne_to_le(pWav, riffChunkSize); ma_dr_wav__write_u32ne_to_le(pWav, riffChunkSize);
} }
if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 4, ma_dr_wav_seek_origin_start)) { if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 4, MA_DR_WAV_SEEK_SET)) {
ma_uint32 dataChunkSize = ma_dr_wav__data_chunk_size_riff(pWav->dataChunkDataSize); ma_uint32 dataChunkSize = ma_dr_wav__data_chunk_size_riff(pWav->dataChunkDataSize);
ma_dr_wav__write_u32ne_to_le(pWav, dataChunkSize); ma_dr_wav__write_u32ne_to_le(pWav, dataChunkSize);
} }
} else if (pWav->container == ma_dr_wav_container_w64) { } else if (pWav->container == ma_dr_wav_container_w64) {
if (pWav->onSeek(pWav->pUserData, 16, ma_dr_wav_seek_origin_start)) { if (pWav->onSeek(pWav->pUserData, 16, MA_DR_WAV_SEEK_SET)) {
ma_uint64 riffChunkSize = ma_dr_wav__riff_chunk_size_w64(pWav->dataChunkDataSize); ma_uint64 riffChunkSize = ma_dr_wav__riff_chunk_size_w64(pWav->dataChunkDataSize);
ma_dr_wav__write_u64ne_to_le(pWav, riffChunkSize); ma_dr_wav__write_u64ne_to_le(pWav, riffChunkSize);
} }
if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 8, ma_dr_wav_seek_origin_start)) { if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 8, MA_DR_WAV_SEEK_SET)) {
ma_uint64 dataChunkSize = ma_dr_wav__data_chunk_size_w64(pWav->dataChunkDataSize); ma_uint64 dataChunkSize = ma_dr_wav__data_chunk_size_w64(pWav->dataChunkDataSize);
ma_dr_wav__write_u64ne_to_le(pWav, dataChunkSize); ma_dr_wav__write_u64ne_to_le(pWav, dataChunkSize);
} }
} else if (pWav->container == ma_dr_wav_container_rf64) { } else if (pWav->container == ma_dr_wav_container_rf64) {
int ds64BodyPos = 12 + 8; int ds64BodyPos = 12 + 8;
if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 0, ma_dr_wav_seek_origin_start)) { if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 0, MA_DR_WAV_SEEK_SET)) {
ma_uint64 riffChunkSize = ma_dr_wav__riff_chunk_size_rf64(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount); ma_uint64 riffChunkSize = ma_dr_wav__riff_chunk_size_rf64(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount);
ma_dr_wav__write_u64ne_to_le(pWav, riffChunkSize); ma_dr_wav__write_u64ne_to_le(pWav, riffChunkSize);
} }
if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 8, ma_dr_wav_seek_origin_start)) { if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 8, MA_DR_WAV_SEEK_SET)) {
ma_uint64 dataChunkSize = ma_dr_wav__data_chunk_size_rf64(pWav->dataChunkDataSize); ma_uint64 dataChunkSize = ma_dr_wav__data_chunk_size_rf64(pWav->dataChunkDataSize);
ma_dr_wav__write_u64ne_to_le(pWav, dataChunkSize); ma_dr_wav__write_u64ne_to_le(pWav, dataChunkSize);
} }
...@@ -82293,7 +82424,7 @@ MA_API size_t ma_dr_wav_read_raw(ma_dr_wav* pWav, size_t bytesToRead, void* pBuf ...@@ -82293,7 +82424,7 @@ MA_API size_t ma_dr_wav_read_raw(ma_dr_wav* pWav, size_t bytesToRead, void* pBuf
if (bytesToSeek > 0x7FFFFFFF) { if (bytesToSeek > 0x7FFFFFFF) {
bytesToSeek = 0x7FFFFFFF; bytesToSeek = 0x7FFFFFFF;
} }
if (pWav->onSeek(pWav->pUserData, (int)bytesToSeek, ma_dr_wav_seek_origin_current) == MA_FALSE) { if (pWav->onSeek(pWav->pUserData, (int)bytesToSeek, MA_DR_WAV_SEEK_CUR) == MA_FALSE) {
break; break;
} }
bytesRead += bytesToSeek; bytesRead += bytesToSeek;
...@@ -82392,7 +82523,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav_seek_to_first_pcm_frame(ma_dr_wav* pWav) ...@@ -82392,7 +82523,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav_seek_to_first_pcm_frame(ma_dr_wav* pWav)
if (pWav->onWrite != NULL) { if (pWav->onWrite != NULL) {
return MA_FALSE; return MA_FALSE;
} }
if (!pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos, ma_dr_wav_seek_origin_start)) { if (!pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos, MA_DR_WAV_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
if (ma_dr_wav__is_compressed_format_tag(pWav->translatedFormatTag)) { if (ma_dr_wav__is_compressed_format_tag(pWav->translatedFormatTag)) {
...@@ -82473,7 +82604,7 @@ MA_API ma_bool32 ma_dr_wav_seek_to_pcm_frame(ma_dr_wav* pWav, ma_uint64 targetFr ...@@ -82473,7 +82604,7 @@ MA_API ma_bool32 ma_dr_wav_seek_to_pcm_frame(ma_dr_wav* pWav, ma_uint64 targetFr
} }
while (offset > 0) { while (offset > 0) {
int offset32 = ((offset > INT_MAX) ? INT_MAX : (int)offset); int offset32 = ((offset > INT_MAX) ? INT_MAX : (int)offset);
if (!pWav->onSeek(pWav->pUserData, offset32, ma_dr_wav_seek_origin_current)) { if (!pWav->onSeek(pWav->pUserData, offset32, MA_DR_WAV_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
pWav->readCursorInPCMFrames += offset32 / bytesPerFrame; pWav->readCursorInPCMFrames += offset32 / bytesPerFrame;
...@@ -82764,7 +82895,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint ...@@ -82764,7 +82895,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint
} }
pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header);
if (header[2] >= ma_dr_wav_countof(stepTable)) { if (header[2] >= ma_dr_wav_countof(stepTable)) {
pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, ma_dr_wav_seek_origin_current); pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, MA_DR_WAV_SEEK_CUR);
pWav->ima.bytesRemainingInBlock = 0; pWav->ima.bytesRemainingInBlock = 0;
return totalFramesRead; return totalFramesRead;
} }
...@@ -82779,7 +82910,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint ...@@ -82779,7 +82910,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint
} }
pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header); pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header);
if (header[2] >= ma_dr_wav_countof(stepTable) || header[6] >= ma_dr_wav_countof(stepTable)) { if (header[2] >= ma_dr_wav_countof(stepTable) || header[6] >= ma_dr_wav_countof(stepTable)) {
pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, ma_dr_wav_seek_origin_current); pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, MA_DR_WAV_SEEK_CUR);
pWav->ima.bytesRemainingInBlock = 0; pWav->ima.bytesRemainingInBlock = 0;
return totalFramesRead; return totalFramesRead;
} }
...@@ -84055,7 +84186,7 @@ MA_PRIVATE ma_int32* ma_dr_wav__read_pcm_frames_and_close_s32(ma_dr_wav* pWav, u ...@@ -84055,7 +84186,7 @@ MA_PRIVATE ma_int32* ma_dr_wav__read_pcm_frames_and_close_s32(ma_dr_wav* pWav, u
} }
return pSampleData; return pSampleData;
} }
MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
ma_dr_wav wav; ma_dr_wav wav;
if (channelsOut) { if (channelsOut) {
...@@ -84067,12 +84198,12 @@ MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRe ...@@ -84067,12 +84198,12 @@ MA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRe
if (totalFrameCountOut) { if (totalFrameCountOut) {
*totalFrameCountOut = 0; *totalFrameCountOut = 0;
} }
if (!ma_dr_wav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) { if (!ma_dr_wav_init(&wav, onRead, onSeek, onTell, pUserData, pAllocationCallbacks)) {
return NULL; return NULL;
} }
return ma_dr_wav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut); return ma_dr_wav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
} }
MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
ma_dr_wav wav; ma_dr_wav wav;
if (channelsOut) { if (channelsOut) {
...@@ -84084,12 +84215,12 @@ MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ...@@ -84084,12 +84215,12 @@ MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead,
if (totalFrameCountOut) { if (totalFrameCountOut) {
*totalFrameCountOut = 0; *totalFrameCountOut = 0;
} }
if (!ma_dr_wav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) { if (!ma_dr_wav_init(&wav, onRead, onSeek, onTell, pUserData, pAllocationCallbacks)) {
return NULL; return NULL;
} }
return ma_dr_wav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); return ma_dr_wav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
} }
MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
ma_dr_wav wav; ma_dr_wav wav;
if (channelsOut) { if (channelsOut) {
...@@ -84101,7 +84232,7 @@ MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRe ...@@ -84101,7 +84232,7 @@ MA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRe
if (totalFrameCountOut) { if (totalFrameCountOut) {
*totalFrameCountOut = 0; *totalFrameCountOut = 0;
} }
if (!ma_dr_wav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) { if (!ma_dr_wav_init(&wav, onRead, onSeek, onTell, pUserData, pAllocationCallbacks)) {
return NULL; return NULL;
} }
return ma_dr_wav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut); return ma_dr_wav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);
...@@ -85536,23 +85667,23 @@ static ma_bool32 ma_dr_flac__seek_to_byte(ma_dr_flac_bs* bs, ma_uint64 offsetFro ...@@ -85536,23 +85667,23 @@ static ma_bool32 ma_dr_flac__seek_to_byte(ma_dr_flac_bs* bs, ma_uint64 offsetFro
MA_DR_FLAC_ASSERT(offsetFromStart > 0); MA_DR_FLAC_ASSERT(offsetFromStart > 0);
if (offsetFromStart > 0x7FFFFFFF) { if (offsetFromStart > 0x7FFFFFFF) {
ma_uint64 bytesRemaining = offsetFromStart; ma_uint64 bytesRemaining = offsetFromStart;
if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_start)) { if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, MA_DR_FLAC_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
bytesRemaining -= 0x7FFFFFFF; bytesRemaining -= 0x7FFFFFFF;
while (bytesRemaining > 0x7FFFFFFF) { while (bytesRemaining > 0x7FFFFFFF) {
if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_current)) { if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
bytesRemaining -= 0x7FFFFFFF; bytesRemaining -= 0x7FFFFFFF;
} }
if (bytesRemaining > 0) { if (bytesRemaining > 0) {
if (!bs->onSeek(bs->pUserData, (int)bytesRemaining, ma_dr_flac_seek_origin_current)) { if (!bs->onSeek(bs->pUserData, (int)bytesRemaining, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
} }
} else { } else {
if (!bs->onSeek(bs->pUserData, (int)offsetFromStart, ma_dr_flac_seek_origin_start)) { if (!bs->onSeek(bs->pUserData, (int)offsetFromStart, MA_DR_FLAC_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
} }
...@@ -88030,6 +88161,7 @@ typedef struct ...@@ -88030,6 +88161,7 @@ typedef struct
{ {
ma_dr_flac_read_proc onRead; ma_dr_flac_read_proc onRead;
ma_dr_flac_seek_proc onSeek; ma_dr_flac_seek_proc onSeek;
ma_dr_flac_tell_proc onTell;
ma_dr_flac_meta_proc onMeta; ma_dr_flac_meta_proc onMeta;
ma_dr_flac_container container; ma_dr_flac_container container;
void* pUserData; void* pUserData;
...@@ -88158,11 +88290,12 @@ static void ma_dr_flac__free_from_callbacks(void* p, const ma_allocation_callbac ...@@ -88158,11 +88290,12 @@ static void ma_dr_flac__free_from_callbacks(void* p, const ma_allocation_callbac
pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData); pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);
} }
} }
static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, void* pUserDataMD, ma_uint64* pFirstFramePos, ma_uint64* pSeektablePos, ma_uint32* pSeekpointCount, ma_allocation_callbacks* pAllocationCallbacks) static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, void* pUserData, void* pUserDataMD, ma_uint64* pFirstFramePos, ma_uint64* pSeektablePos, ma_uint32* pSeekpointCount, ma_allocation_callbacks* pAllocationCallbacks)
{ {
ma_uint64 runningFilePos = 42; ma_uint64 runningFilePos = 42;
ma_uint64 seektablePos = 0; ma_uint64 seektablePos = 0;
ma_uint32 seektableSize = 0; ma_uint32 seektableSize = 0;
(void)onTell;
for (;;) { for (;;) {
ma_dr_flac_metadata metadata; ma_dr_flac_metadata metadata;
ma_uint8 isLastBlock = 0; ma_uint8 isLastBlock = 0;
...@@ -88420,7 +88553,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea ...@@ -88420,7 +88553,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea
{ {
if (onMeta) { if (onMeta) {
metadata.data.padding.unused = 0; metadata.data.padding.unused = 0;
if (!onSeek(pUserData, blockSize, ma_dr_flac_seek_origin_current)) { if (!onSeek(pUserData, blockSize, MA_DR_FLAC_SEEK_CUR)) {
isLastBlock = MA_TRUE; isLastBlock = MA_TRUE;
} else { } else {
onMeta(pUserDataMD, &metadata); onMeta(pUserDataMD, &metadata);
...@@ -88430,7 +88563,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea ...@@ -88430,7 +88563,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea
case MA_DR_FLAC_METADATA_BLOCK_TYPE_INVALID: case MA_DR_FLAC_METADATA_BLOCK_TYPE_INVALID:
{ {
if (onMeta) { if (onMeta) {
if (!onSeek(pUserData, blockSize, ma_dr_flac_seek_origin_current)) { if (!onSeek(pUserData, blockSize, MA_DR_FLAC_SEEK_CUR)) {
isLastBlock = MA_TRUE; isLastBlock = MA_TRUE;
} }
} }
...@@ -88454,7 +88587,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea ...@@ -88454,7 +88587,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea
} break; } break;
} }
if (onMeta == NULL && blockSize > 0) { if (onMeta == NULL && blockSize > 0) {
if (!onSeek(pUserData, blockSize, ma_dr_flac_seek_origin_current)) { if (!onSeek(pUserData, blockSize, MA_DR_FLAC_SEEK_CUR)) {
isLastBlock = MA_TRUE; isLastBlock = MA_TRUE;
} }
} }
...@@ -88718,6 +88851,7 @@ typedef struct ...@@ -88718,6 +88851,7 @@ typedef struct
{ {
ma_dr_flac_read_proc onRead; ma_dr_flac_read_proc onRead;
ma_dr_flac_seek_proc onSeek; ma_dr_flac_seek_proc onSeek;
ma_dr_flac_tell_proc onTell;
void* pUserData; void* pUserData;
ma_uint64 currentBytePos; ma_uint64 currentBytePos;
ma_uint64 firstBytePos; ma_uint64 firstBytePos;
...@@ -88736,29 +88870,29 @@ static size_t ma_dr_flac_oggbs__read_physical(ma_dr_flac_oggbs* oggbs, void* buf ...@@ -88736,29 +88870,29 @@ static size_t ma_dr_flac_oggbs__read_physical(ma_dr_flac_oggbs* oggbs, void* buf
} }
static ma_bool32 ma_dr_flac_oggbs__seek_physical(ma_dr_flac_oggbs* oggbs, ma_uint64 offset, ma_dr_flac_seek_origin origin) static ma_bool32 ma_dr_flac_oggbs__seek_physical(ma_dr_flac_oggbs* oggbs, ma_uint64 offset, ma_dr_flac_seek_origin origin)
{ {
if (origin == ma_dr_flac_seek_origin_start) { if (origin == MA_DR_FLAC_SEEK_SET) {
if (offset <= 0x7FFFFFFF) { if (offset <= 0x7FFFFFFF) {
if (!oggbs->onSeek(oggbs->pUserData, (int)offset, ma_dr_flac_seek_origin_start)) { if (!oggbs->onSeek(oggbs->pUserData, (int)offset, MA_DR_FLAC_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
oggbs->currentBytePos = offset; oggbs->currentBytePos = offset;
return MA_TRUE; return MA_TRUE;
} else { } else {
if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_start)) { if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, MA_DR_FLAC_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
oggbs->currentBytePos = offset; oggbs->currentBytePos = offset;
return ma_dr_flac_oggbs__seek_physical(oggbs, offset - 0x7FFFFFFF, ma_dr_flac_seek_origin_current); return ma_dr_flac_oggbs__seek_physical(oggbs, offset - 0x7FFFFFFF, MA_DR_FLAC_SEEK_CUR);
} }
} else { } else {
while (offset > 0x7FFFFFFF) { while (offset > 0x7FFFFFFF) {
if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_current)) { if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
oggbs->currentBytePos += 0x7FFFFFFF; oggbs->currentBytePos += 0x7FFFFFFF;
offset -= 0x7FFFFFFF; offset -= 0x7FFFFFFF;
} }
if (!oggbs->onSeek(oggbs->pUserData, (int)offset, ma_dr_flac_seek_origin_current)) { if (!oggbs->onSeek(oggbs->pUserData, (int)offset, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
oggbs->currentBytePos += offset; oggbs->currentBytePos += offset;
...@@ -88784,7 +88918,7 @@ static ma_bool32 ma_dr_flac_oggbs__goto_next_page(ma_dr_flac_oggbs* oggbs, ma_dr ...@@ -88784,7 +88918,7 @@ static ma_bool32 ma_dr_flac_oggbs__goto_next_page(ma_dr_flac_oggbs* oggbs, ma_dr
continue; continue;
} }
if (header.serialNumber != oggbs->serialNumber) { if (header.serialNumber != oggbs->serialNumber) {
if (pageBodySize > 0 && !ma_dr_flac_oggbs__seek_physical(oggbs, pageBodySize, ma_dr_flac_seek_origin_current)) { if (pageBodySize > 0 && !ma_dr_flac_oggbs__seek_physical(oggbs, pageBodySize, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
continue; continue;
...@@ -88846,7 +88980,7 @@ static ma_bool32 ma_dr_flac_oggbs__seek_to_next_packet(ma_dr_flac_oggbs* oggbs) ...@@ -88846,7 +88980,7 @@ static ma_bool32 ma_dr_flac_oggbs__seek_to_next_packet(ma_dr_flac_oggbs* oggbs)
} }
bytesToEndOfPacketOrPage += segmentSize; bytesToEndOfPacketOrPage += segmentSize;
} }
ma_dr_flac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, ma_dr_flac_seek_origin_current); ma_dr_flac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, MA_DR_FLAC_SEEK_CUR);
oggbs->bytesRemainingInPage -= bytesToEndOfPacketOrPage; oggbs->bytesRemainingInPage -= bytesToEndOfPacketOrPage;
if (atEndOfPage) { if (atEndOfPage) {
if (!ma_dr_flac_oggbs__goto_next_page(oggbs)) { if (!ma_dr_flac_oggbs__goto_next_page(oggbs)) {
...@@ -88899,16 +89033,15 @@ static ma_bool32 ma_dr_flac__on_seek_ogg(void* pUserData, int offset, ma_dr_flac ...@@ -88899,16 +89033,15 @@ static ma_bool32 ma_dr_flac__on_seek_ogg(void* pUserData, int offset, ma_dr_flac
int bytesSeeked = 0; int bytesSeeked = 0;
MA_DR_FLAC_ASSERT(oggbs != NULL); MA_DR_FLAC_ASSERT(oggbs != NULL);
MA_DR_FLAC_ASSERT(offset >= 0); MA_DR_FLAC_ASSERT(offset >= 0);
if (origin == ma_dr_flac_seek_origin_start) { if (origin == MA_DR_FLAC_SEEK_SET) {
if (!ma_dr_flac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos, ma_dr_flac_seek_origin_start)) { if (!ma_dr_flac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos, MA_DR_FLAC_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) { if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) {
return MA_FALSE; return MA_FALSE;
} }
return ma_dr_flac__on_seek_ogg(pUserData, offset, ma_dr_flac_seek_origin_current); return ma_dr_flac__on_seek_ogg(pUserData, offset, MA_DR_FLAC_SEEK_CUR);
} } else if (origin == MA_DR_FLAC_SEEK_CUR) {
MA_DR_FLAC_ASSERT(origin == ma_dr_flac_seek_origin_current);
while (bytesSeeked < offset) { while (bytesSeeked < offset) {
int bytesRemainingToSeek = offset - bytesSeeked; int bytesRemainingToSeek = offset - bytesSeeked;
MA_DR_FLAC_ASSERT(bytesRemainingToSeek >= 0); MA_DR_FLAC_ASSERT(bytesRemainingToSeek >= 0);
...@@ -88927,8 +89060,17 @@ static ma_bool32 ma_dr_flac__on_seek_ogg(void* pUserData, int offset, ma_dr_flac ...@@ -88927,8 +89060,17 @@ static ma_bool32 ma_dr_flac__on_seek_ogg(void* pUserData, int offset, ma_dr_flac
return MA_FALSE; return MA_FALSE;
} }
} }
} else if (origin == MA_DR_FLAC_SEEK_END) {
return MA_FALSE;
}
return MA_TRUE; return MA_TRUE;
} }
static ma_bool32 ma_dr_flac__on_tell_ogg(void* pUserData, ma_int64* pCursor)
{
(void)pUserData;
(void)pCursor;
return MA_FALSE;
}
static ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex) static ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex)
{ {
ma_dr_flac_oggbs* oggbs = (ma_dr_flac_oggbs*)pFlac->_oggbs; ma_dr_flac_oggbs* oggbs = (ma_dr_flac_oggbs*)pFlac->_oggbs;
...@@ -88945,7 +89087,7 @@ static ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 ...@@ -88945,7 +89087,7 @@ static ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64
runningGranulePosition = 0; runningGranulePosition = 0;
for (;;) { for (;;) {
if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch)) { if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch)) {
ma_dr_flac_oggbs__seek_physical(oggbs, originalBytePos, ma_dr_flac_seek_origin_start); ma_dr_flac_oggbs__seek_physical(oggbs, originalBytePos, MA_DR_FLAC_SEEK_SET);
return MA_FALSE; return MA_FALSE;
} }
runningFrameBytePos = oggbs->currentBytePos - ma_dr_flac_ogg__get_page_header_size(&oggbs->currentPageHeader) - oggbs->pageDataSize; runningFrameBytePos = oggbs->currentBytePos - ma_dr_flac_ogg__get_page_header_size(&oggbs->currentPageHeader) - oggbs->pageDataSize;
...@@ -88964,7 +89106,7 @@ static ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 ...@@ -88964,7 +89106,7 @@ static ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64
} }
} }
} }
if (!ma_dr_flac_oggbs__seek_physical(oggbs, runningFrameBytePos, ma_dr_flac_seek_origin_start)) { if (!ma_dr_flac_oggbs__seek_physical(oggbs, runningFrameBytePos, MA_DR_FLAC_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch)) { if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch)) {
...@@ -89059,7 +89201,7 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d ...@@ -89059,7 +89201,7 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d
if (mappingVersion[0] != 1) { if (mappingVersion[0] != 1) {
return MA_FALSE; return MA_FALSE;
} }
if (!onSeek(pUserData, 2, ma_dr_flac_seek_origin_current)) { if (!onSeek(pUserData, 2, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
if (onRead(pUserData, sig, 4) != 4) { if (onRead(pUserData, sig, 4) != 4) {
...@@ -89104,17 +89246,17 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d ...@@ -89104,17 +89246,17 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d
return MA_FALSE; return MA_FALSE;
} }
} else { } else {
if (!onSeek(pUserData, bytesRemainingInPage, ma_dr_flac_seek_origin_current)) { if (!onSeek(pUserData, bytesRemainingInPage, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
} }
} else { } else {
if (!onSeek(pUserData, bytesRemainingInPage, ma_dr_flac_seek_origin_current)) { if (!onSeek(pUserData, bytesRemainingInPage, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
} }
} else { } else {
if (!onSeek(pUserData, pageBodySize, ma_dr_flac_seek_origin_current)) { if (!onSeek(pUserData, pageBodySize, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
} }
...@@ -89128,7 +89270,7 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d ...@@ -89128,7 +89270,7 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d
return MA_TRUE; return MA_TRUE;
} }
#endif #endif
static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD) static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD)
{ {
ma_bool32 relaxed; ma_bool32 relaxed;
ma_uint8 id[4]; ma_uint8 id[4];
...@@ -89138,12 +89280,14 @@ static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_fla ...@@ -89138,12 +89280,14 @@ static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_fla
MA_DR_FLAC_ZERO_MEMORY(pInit, sizeof(*pInit)); MA_DR_FLAC_ZERO_MEMORY(pInit, sizeof(*pInit));
pInit->onRead = onRead; pInit->onRead = onRead;
pInit->onSeek = onSeek; pInit->onSeek = onSeek;
pInit->onTell = onTell;
pInit->onMeta = onMeta; pInit->onMeta = onMeta;
pInit->container = container; pInit->container = container;
pInit->pUserData = pUserData; pInit->pUserData = pUserData;
pInit->pUserDataMD = pUserDataMD; pInit->pUserDataMD = pUserDataMD;
pInit->bs.onRead = onRead; pInit->bs.onRead = onRead;
pInit->bs.onSeek = onSeek; pInit->bs.onSeek = onSeek;
pInit->bs.onTell = onTell;
pInit->bs.pUserData = pUserData; pInit->bs.pUserData = pUserData;
ma_dr_flac__reset_cache(&pInit->bs); ma_dr_flac__reset_cache(&pInit->bs);
relaxed = container != ma_dr_flac_container_unknown; relaxed = container != ma_dr_flac_container_unknown;
...@@ -89166,7 +89310,7 @@ static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_fla ...@@ -89166,7 +89310,7 @@ static ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_fla
if (flags & 0x10) { if (flags & 0x10) {
headerSize += 10; headerSize += 10;
} }
if (!onSeek(pUserData, headerSize, ma_dr_flac_seek_origin_current)) { if (!onSeek(pUserData, headerSize, MA_DR_FLAC_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
pInit->runningFilePos += headerSize; pInit->runningFilePos += headerSize;
...@@ -89209,7 +89353,7 @@ static void ma_dr_flac__init_from_info(ma_dr_flac* pFlac, const ma_dr_flac_init_ ...@@ -89209,7 +89353,7 @@ static void ma_dr_flac__init_from_info(ma_dr_flac* pFlac, const ma_dr_flac_init_
pFlac->totalPCMFrameCount = pInit->totalPCMFrameCount; pFlac->totalPCMFrameCount = pInit->totalPCMFrameCount;
pFlac->container = pInit->container; pFlac->container = pInit->container;
} }
static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD, const ma_allocation_callbacks* pAllocationCallbacks) static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
ma_dr_flac_init_info init; ma_dr_flac_init_info init;
ma_uint32 allocationSize; ma_uint32 allocationSize;
...@@ -89224,7 +89368,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on ...@@ -89224,7 +89368,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on
ma_allocation_callbacks allocationCallbacks; ma_allocation_callbacks allocationCallbacks;
ma_dr_flac* pFlac; ma_dr_flac* pFlac;
ma_dr_flac__init_cpu_caps(); ma_dr_flac__init_cpu_caps();
if (!ma_dr_flac__init_private(&init, onRead, onSeek, onMeta, container, pUserData, pUserDataMD)) { if (!ma_dr_flac__init_private(&init, onRead, onSeek, onTell, onMeta, container, pUserData, pUserDataMD)) {
return NULL; return NULL;
} }
if (pAllocationCallbacks != NULL) { if (pAllocationCallbacks != NULL) {
...@@ -89257,6 +89401,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on ...@@ -89257,6 +89401,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on
MA_DR_FLAC_ZERO_MEMORY(pOggbs, sizeof(*pOggbs)); MA_DR_FLAC_ZERO_MEMORY(pOggbs, sizeof(*pOggbs));
pOggbs->onRead = onRead; pOggbs->onRead = onRead;
pOggbs->onSeek = onSeek; pOggbs->onSeek = onSeek;
pOggbs->onTell = onTell;
pOggbs->pUserData = pUserData; pOggbs->pUserData = pUserData;
pOggbs->currentBytePos = init.oggFirstBytePos; pOggbs->currentBytePos = init.oggFirstBytePos;
pOggbs->firstBytePos = init.oggFirstBytePos; pOggbs->firstBytePos = init.oggFirstBytePos;
...@@ -89271,15 +89416,17 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on ...@@ -89271,15 +89416,17 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on
if (init.hasMetadataBlocks) { if (init.hasMetadataBlocks) {
ma_dr_flac_read_proc onReadOverride = onRead; ma_dr_flac_read_proc onReadOverride = onRead;
ma_dr_flac_seek_proc onSeekOverride = onSeek; ma_dr_flac_seek_proc onSeekOverride = onSeek;
ma_dr_flac_tell_proc onTellOverride = onTell;
void* pUserDataOverride = pUserData; void* pUserDataOverride = pUserData;
#ifndef MA_DR_FLAC_NO_OGG #ifndef MA_DR_FLAC_NO_OGG
if (init.container == ma_dr_flac_container_ogg) { if (init.container == ma_dr_flac_container_ogg) {
onReadOverride = ma_dr_flac__on_read_ogg; onReadOverride = ma_dr_flac__on_read_ogg;
onSeekOverride = ma_dr_flac__on_seek_ogg; onSeekOverride = ma_dr_flac__on_seek_ogg;
onTellOverride = ma_dr_flac__on_tell_ogg;
pUserDataOverride = (void*)pOggbs; pUserDataOverride = (void*)pOggbs;
} }
#endif #endif
if (!ma_dr_flac__read_and_decode_metadata(onReadOverride, onSeekOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seekpointCount, &allocationCallbacks)) { if (!ma_dr_flac__read_and_decode_metadata(onReadOverride, onSeekOverride, onTellOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seekpointCount, &allocationCallbacks)) {
#ifndef MA_DR_FLAC_NO_OGG #ifndef MA_DR_FLAC_NO_OGG
ma_dr_flac__free_from_callbacks(pOggbs, &allocationCallbacks); ma_dr_flac__free_from_callbacks(pOggbs, &allocationCallbacks);
#endif #endif
...@@ -89305,6 +89452,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on ...@@ -89305,6 +89452,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on
pOggbs = NULL; pOggbs = NULL;
pFlac->bs.onRead = ma_dr_flac__on_read_ogg; pFlac->bs.onRead = ma_dr_flac__on_read_ogg;
pFlac->bs.onSeek = ma_dr_flac__on_seek_ogg; pFlac->bs.onSeek = ma_dr_flac__on_seek_ogg;
pFlac->bs.onTell = ma_dr_flac__on_tell_ogg;
pFlac->bs.pUserData = (void*)pInternalOggbs; pFlac->bs.pUserData = (void*)pInternalOggbs;
pFlac->_oggbs = (void*)pInternalOggbs; pFlac->_oggbs = (void*)pInternalOggbs;
} }
...@@ -89324,7 +89472,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on ...@@ -89324,7 +89472,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on
pFlac->pSeekpoints = (ma_dr_flac_seekpoint*)((ma_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize); pFlac->pSeekpoints = (ma_dr_flac_seekpoint*)((ma_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize);
MA_DR_FLAC_ASSERT(pFlac->bs.onSeek != NULL); MA_DR_FLAC_ASSERT(pFlac->bs.onSeek != NULL);
MA_DR_FLAC_ASSERT(pFlac->bs.onRead != NULL); MA_DR_FLAC_ASSERT(pFlac->bs.onRead != NULL);
if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, ma_dr_flac_seek_origin_start)) { if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, MA_DR_FLAC_SEEK_SET)) {
ma_uint32 iSeekpoint; ma_uint32 iSeekpoint;
for (iSeekpoint = 0; iSeekpoint < seekpointCount; iSeekpoint += 1) { for (iSeekpoint = 0; iSeekpoint < seekpointCount; iSeekpoint += 1) {
if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints + iSeekpoint, MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) == MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) { if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints + iSeekpoint, MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) == MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) {
...@@ -89337,7 +89485,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on ...@@ -89337,7 +89485,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on
break; break;
} }
} }
if (!pFlac->bs.onSeek(pFlac->bs.pUserData, (int)pFlac->firstFLACFramePosInBytes, ma_dr_flac_seek_origin_start)) { if (!pFlac->bs.onSeek(pFlac->bs.pUserData, (int)pFlac->firstFLACFramePosInBytes, MA_DR_FLAC_SEEK_SET)) {
ma_dr_flac__free_from_callbacks(pFlac, &allocationCallbacks); ma_dr_flac__free_from_callbacks(pFlac, &allocationCallbacks);
return NULL; return NULL;
} }
...@@ -89380,8 +89528,31 @@ static size_t ma_dr_flac__on_read_stdio(void* pUserData, void* bufferOut, size_t ...@@ -89380,8 +89528,31 @@ static size_t ma_dr_flac__on_read_stdio(void* pUserData, void* bufferOut, size_t
} }
static ma_bool32 ma_dr_flac__on_seek_stdio(void* pUserData, int offset, ma_dr_flac_seek_origin origin) static ma_bool32 ma_dr_flac__on_seek_stdio(void* pUserData, int offset, ma_dr_flac_seek_origin origin)
{ {
MA_DR_FLAC_ASSERT(offset >= 0); int whence = SEEK_SET;
return fseek((FILE*)pUserData, offset, (origin == ma_dr_flac_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; if (origin == MA_DR_FLAC_SEEK_CUR) {
whence = SEEK_CUR;
} else if (origin == MA_DR_FLAC_SEEK_END) {
whence = SEEK_END;
}
return fseek((FILE*)pUserData, offset, whence) == 0;
}
static ma_bool32 ma_dr_flac__on_tell_stdio(void* pUserData, ma_int64* pCursor)
{
FILE* pFileStdio = (FILE*)pUserData;
ma_int64 result;
MA_DR_FLAC_ASSERT(pFileStdio != NULL);
MA_DR_FLAC_ASSERT(pCursor != NULL);
#if defined(_WIN32)
#if defined(_MSC_VER) && _MSC_VER > 1200
result = _ftelli64(pFileStdio);
#else
result = ftell(pFileStdio);
#endif
#else
result = ftell(pFileStdio);
#endif
*pCursor = result;
return MA_TRUE;
} }
MA_API ma_dr_flac* ma_dr_flac_open_file(const char* pFileName, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_dr_flac* ma_dr_flac_open_file(const char* pFileName, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
...@@ -89390,7 +89561,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file(const char* pFileName, const ma_allocati ...@@ -89390,7 +89561,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file(const char* pFileName, const ma_allocati
if (ma_fopen(&pFile, pFileName, "rb") != MA_SUCCESS) { if (ma_fopen(&pFile, pFileName, "rb") != MA_SUCCESS) {
return NULL; return NULL;
} }
pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, (void*)pFile, pAllocationCallbacks); pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, ma_dr_flac__on_tell_stdio, (void*)pFile, pAllocationCallbacks);
if (pFlac == NULL) { if (pFlac == NULL) {
fclose(pFile); fclose(pFile);
return NULL; return NULL;
...@@ -89405,7 +89576,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_w(const wchar_t* pFileName, const ma_all ...@@ -89405,7 +89576,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_w(const wchar_t* pFileName, const ma_all
if (ma_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != MA_SUCCESS) { if (ma_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != MA_SUCCESS) {
return NULL; return NULL;
} }
pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, (void*)pFile, pAllocationCallbacks); pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, ma_dr_flac__on_tell_stdio, (void*)pFile, pAllocationCallbacks);
if (pFlac == NULL) { if (pFlac == NULL) {
fclose(pFile); fclose(pFile);
return NULL; return NULL;
...@@ -89420,7 +89591,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata(const char* pFileName, ma_ ...@@ -89420,7 +89591,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata(const char* pFileName, ma_
if (ma_fopen(&pFile, pFileName, "rb") != MA_SUCCESS) { if (ma_fopen(&pFile, pFileName, "rb") != MA_SUCCESS) {
return NULL; return NULL;
} }
pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, ma_dr_flac__on_tell_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks);
if (pFlac == NULL) { if (pFlac == NULL) {
fclose(pFile); fclose(pFile);
return pFlac; return pFlac;
...@@ -89435,7 +89606,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata_w(const wchar_t* pFileName ...@@ -89435,7 +89606,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata_w(const wchar_t* pFileName
if (ma_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != MA_SUCCESS) { if (ma_wfopen(&pFile, pFileName, L"rb", pAllocationCallbacks) != MA_SUCCESS) {
return NULL; return NULL;
} }
pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, ma_dr_flac__on_tell_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks);
if (pFlac == NULL) { if (pFlac == NULL) {
fclose(pFile); fclose(pFile);
return pFlac; return pFlac;
...@@ -89463,24 +89634,35 @@ static size_t ma_dr_flac__on_read_memory(void* pUserData, void* bufferOut, size_ ...@@ -89463,24 +89634,35 @@ static size_t ma_dr_flac__on_read_memory(void* pUserData, void* bufferOut, size_
static ma_bool32 ma_dr_flac__on_seek_memory(void* pUserData, int offset, ma_dr_flac_seek_origin origin) static ma_bool32 ma_dr_flac__on_seek_memory(void* pUserData, int offset, ma_dr_flac_seek_origin origin)
{ {
ma_dr_flac__memory_stream* memoryStream = (ma_dr_flac__memory_stream*)pUserData; ma_dr_flac__memory_stream* memoryStream = (ma_dr_flac__memory_stream*)pUserData;
ma_int64 newCursor;
MA_DR_FLAC_ASSERT(memoryStream != NULL); MA_DR_FLAC_ASSERT(memoryStream != NULL);
MA_DR_FLAC_ASSERT(offset >= 0); newCursor = memoryStream->currentReadPos;
if (offset > (ma_int64)memoryStream->dataSize) { if (origin == MA_DR_FLAC_SEEK_SET) {
newCursor = 0;
} else if (origin == MA_DR_FLAC_SEEK_CUR) {
newCursor = (ma_int64)memoryStream->currentReadPos;
} else if (origin == MA_DR_FLAC_SEEK_END) {
newCursor = (ma_int64)memoryStream->dataSize;
} else {
MA_DR_FLAC_ASSERT(!"Invalid seek origin");
return MA_FALSE; return MA_FALSE;
} }
if (origin == ma_dr_flac_seek_origin_current) { newCursor += offset;
if (memoryStream->currentReadPos + offset <= memoryStream->dataSize) { if (newCursor < 0) {
memoryStream->currentReadPos += offset;
} else {
return MA_FALSE; return MA_FALSE;
} }
} else { if ((size_t)newCursor > memoryStream->dataSize) {
if ((ma_uint32)offset <= memoryStream->dataSize) {
memoryStream->currentReadPos = offset;
} else {
return MA_FALSE; return MA_FALSE;
} }
} memoryStream->currentReadPos = (size_t)newCursor;
return MA_TRUE;
}
static ma_bool32 ma_dr_flac__on_tell_memory(void* pUserData, ma_int64* pCursor)
{
ma_dr_flac__memory_stream* memoryStream = (ma_dr_flac__memory_stream*)pUserData;
MA_DR_FLAC_ASSERT(memoryStream != NULL);
MA_DR_FLAC_ASSERT(pCursor != NULL);
*pCursor = (ma_int64)memoryStream->currentReadPos;
return MA_TRUE; return MA_TRUE;
} }
MA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks)
...@@ -89490,7 +89672,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, co ...@@ -89490,7 +89672,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, co
memoryStream.data = (const ma_uint8*)pData; memoryStream.data = (const ma_uint8*)pData;
memoryStream.dataSize = dataSize; memoryStream.dataSize = dataSize;
memoryStream.currentReadPos = 0; memoryStream.currentReadPos = 0;
pFlac = ma_dr_flac_open(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, &memoryStream, pAllocationCallbacks); pFlac = ma_dr_flac_open(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, ma_dr_flac__on_tell_memory, &memoryStream, pAllocationCallbacks);
if (pFlac == NULL) { if (pFlac == NULL) {
return NULL; return NULL;
} }
...@@ -89515,7 +89697,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_ ...@@ -89515,7 +89697,7 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_
memoryStream.data = (const ma_uint8*)pData; memoryStream.data = (const ma_uint8*)pData;
memoryStream.dataSize = dataSize; memoryStream.dataSize = dataSize;
memoryStream.currentReadPos = 0; memoryStream.currentReadPos = 0;
pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, onMeta, ma_dr_flac_container_unknown, &memoryStream, pUserData, pAllocationCallbacks); pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, ma_dr_flac__on_tell_memory, onMeta, ma_dr_flac_container_unknown, &memoryStream, pUserData, pAllocationCallbacks);
if (pFlac == NULL) { if (pFlac == NULL) {
return NULL; return NULL;
} }
...@@ -89533,21 +89715,21 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_ ...@@ -89533,21 +89715,21 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_
} }
return pFlac; return pFlac;
} }
MA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
return ma_dr_flac_open_with_metadata_private(onRead, onSeek, NULL, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks); return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onTell, NULL, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks);
} }
MA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
return ma_dr_flac_open_with_metadata_private(onRead, onSeek, NULL, container, pUserData, pUserData, pAllocationCallbacks); return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onTell, NULL, container, pUserData, pUserData, pAllocationCallbacks);
} }
MA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onMeta, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks); return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onTell, onMeta, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks);
} }
MA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onMeta, container, pUserData, pUserData, pAllocationCallbacks); return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onTell, onMeta, container, pUserData, pUserData, pAllocationCallbacks);
} }
MA_API void ma_dr_flac_close(ma_dr_flac* pFlac) MA_API void ma_dr_flac_close(ma_dr_flac* pFlac)
{ {
...@@ -91840,7 +92022,7 @@ on_error: ...@@ -91840,7 +92022,7 @@ on_error:
MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(s32, ma_int32) MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(s32, ma_int32)
MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(s16, ma_int16) MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(s16, ma_int16)
MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(f32, float) MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(f32, float)
MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
ma_dr_flac* pFlac; ma_dr_flac* pFlac;
if (channelsOut) { if (channelsOut) {
...@@ -91852,13 +92034,13 @@ MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc on ...@@ -91852,13 +92034,13 @@ MA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc on
if (totalPCMFrameCountOut) { if (totalPCMFrameCountOut) {
*totalPCMFrameCountOut = 0; *totalPCMFrameCountOut = 0;
} }
pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks); pFlac = ma_dr_flac_open(onRead, onSeek, onTell, pUserData, pAllocationCallbacks);
if (pFlac == NULL) { if (pFlac == NULL) {
return NULL; return NULL;
} }
return ma_dr_flac__full_read_and_close_s32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); return ma_dr_flac__full_read_and_close_s32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut);
} }
MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
ma_dr_flac* pFlac; ma_dr_flac* pFlac;
if (channelsOut) { if (channelsOut) {
...@@ -91870,13 +92052,13 @@ MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc on ...@@ -91870,13 +92052,13 @@ MA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc on
if (totalPCMFrameCountOut) { if (totalPCMFrameCountOut) {
*totalPCMFrameCountOut = 0; *totalPCMFrameCountOut = 0;
} }
pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks); pFlac = ma_dr_flac_open(onRead, onSeek, onTell, pUserData, pAllocationCallbacks);
if (pFlac == NULL) { if (pFlac == NULL) {
return NULL; return NULL;
} }
return ma_dr_flac__full_read_and_close_s16(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut); return ma_dr_flac__full_read_and_close_s16(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut);
} }
MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks) MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_tell_proc onTell, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)
{ {
ma_dr_flac* pFlac; ma_dr_flac* pFlac;
if (channelsOut) { if (channelsOut) {
...@@ -91888,7 +92070,7 @@ MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRea ...@@ -91888,7 +92070,7 @@ MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRea
if (totalPCMFrameCountOut) { if (totalPCMFrameCountOut) {
*totalPCMFrameCountOut = 0; *totalPCMFrameCountOut = 0;
} }
pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks); pFlac = ma_dr_flac_open(onRead, onSeek, onTell, pUserData, pAllocationCallbacks);
if (pFlac == NULL) { if (pFlac == NULL) {
return NULL; return NULL;
} }
...@@ -93949,11 +94131,11 @@ static size_t ma_dr_mp3__on_read_clamped(ma_dr_mp3* pMP3, void* pBufferOut, size ...@@ -93949,11 +94131,11 @@ static size_t ma_dr_mp3__on_read_clamped(ma_dr_mp3* pMP3, void* pBufferOut, size
static ma_bool32 ma_dr_mp3__on_seek(ma_dr_mp3* pMP3, int offset, ma_dr_mp3_seek_origin origin) static ma_bool32 ma_dr_mp3__on_seek(ma_dr_mp3* pMP3, int offset, ma_dr_mp3_seek_origin origin)
{ {
MA_DR_MP3_ASSERT(offset >= 0); MA_DR_MP3_ASSERT(offset >= 0);
MA_DR_MP3_ASSERT(origin == ma_dr_mp3_seek_origin_start || origin == ma_dr_mp3_seek_origin_current); MA_DR_MP3_ASSERT(origin == MA_DR_MP3_SEEK_SET || origin == MA_DR_MP3_SEEK_CUR);
if (!pMP3->onSeek(pMP3->pUserData, offset, origin)) { if (!pMP3->onSeek(pMP3->pUserData, offset, origin)) {
return MA_FALSE; return MA_FALSE;
} }
if (origin == ma_dr_mp3_seek_origin_start) { if (origin == MA_DR_MP3_SEEK_SET) {
pMP3->streamCursor = (ma_uint64)offset; pMP3->streamCursor = (ma_uint64)offset;
} else{ } else{
pMP3->streamCursor += offset; pMP3->streamCursor += offset;
...@@ -93965,18 +94147,18 @@ static ma_bool32 ma_dr_mp3__on_seek_64(ma_dr_mp3* pMP3, ma_uint64 offset, ma_dr_ ...@@ -93965,18 +94147,18 @@ static ma_bool32 ma_dr_mp3__on_seek_64(ma_dr_mp3* pMP3, ma_uint64 offset, ma_dr_
if (offset <= 0x7FFFFFFF) { if (offset <= 0x7FFFFFFF) {
return ma_dr_mp3__on_seek(pMP3, (int)offset, origin); return ma_dr_mp3__on_seek(pMP3, (int)offset, origin);
} }
if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, ma_dr_mp3_seek_origin_start)) { if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, MA_DR_MP3_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
offset -= 0x7FFFFFFF; offset -= 0x7FFFFFFF;
while (offset > 0) { while (offset > 0) {
if (offset <= 0x7FFFFFFF) { if (offset <= 0x7FFFFFFF) {
if (!ma_dr_mp3__on_seek(pMP3, (int)offset, ma_dr_mp3_seek_origin_current)) { if (!ma_dr_mp3__on_seek(pMP3, (int)offset, MA_DR_MP3_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
offset = 0; offset = 0;
} else { } else {
if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, ma_dr_mp3_seek_origin_current)) { if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, MA_DR_MP3_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
offset -= 0x7FFFFFFF; offset -= 0x7FFFFFFF;
...@@ -94170,13 +94352,13 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on ...@@ -94170,13 +94352,13 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on
pMP3->totalPCMFrameCount = MA_UINT64_MAX; pMP3->totalPCMFrameCount = MA_UINT64_MAX;
#if 1 #if 1
if (onSeek != NULL && onTell != NULL) { if (onSeek != NULL && onTell != NULL) {
if (onSeek(pUserData, 0, ma_dr_mp3_seek_origin_end)) { if (onSeek(pUserData, 0, MA_DR_MP3_SEEK_END)) {
ma_int64 streamLen; ma_int64 streamLen;
int streamEndOffset = 0; int streamEndOffset = 0;
if (onTell(pUserData, &streamLen)) { if (onTell(pUserData, &streamLen)) {
if (streamLen > 128) { if (streamLen > 128) {
char id3[3]; char id3[3];
if (onSeek(pUserData, streamEndOffset - 128, ma_dr_mp3_seek_origin_end)) { if (onSeek(pUserData, streamEndOffset - 128, MA_DR_MP3_SEEK_END)) {
if (onRead(pUserData, id3, 3) == 3 && id3[0] == 'T' && id3[1] == 'A' && id3[2] == 'G') { if (onRead(pUserData, id3, 3) == 3 && id3[0] == 'T' && id3[1] == 'A' && id3[2] == 'G') {
streamEndOffset -= 128; streamEndOffset -= 128;
streamLen -= 128; streamLen -= 128;
...@@ -94195,7 +94377,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on ...@@ -94195,7 +94377,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on
} }
if (streamLen > 32) { if (streamLen > 32) {
char ape[32]; char ape[32];
if (onSeek(pUserData, streamEndOffset - 32, ma_dr_mp3_seek_origin_end)) { if (onSeek(pUserData, streamEndOffset - 32, MA_DR_MP3_SEEK_END)) {
if (onRead(pUserData, ape, 32) == 32 && ape[0] == 'A' && ape[1] == 'P' && ape[2] == 'E' && ape[3] == 'T' && ape[4] == 'A' && ape[5] == 'G' && ape[6] == 'E' && ape[7] == 'X') { if (onRead(pUserData, ape, 32) == 32 && ape[0] == 'A' && ape[1] == 'P' && ape[2] == 'E' && ape[3] == 'T' && ape[4] == 'A' && ape[5] == 'G' && ape[6] == 'E' && ape[7] == 'X') {
ma_uint32 tagSize = ma_uint32 tagSize =
((ma_uint32)ape[24] << 0) | ((ma_uint32)ape[24] << 0) |
...@@ -94205,7 +94387,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on ...@@ -94205,7 +94387,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on
streamEndOffset -= 32 + tagSize; streamEndOffset -= 32 + tagSize;
streamLen -= 32 + tagSize; streamLen -= 32 + tagSize;
if (onMeta != NULL) { if (onMeta != NULL) {
if (onSeek(pUserData, streamEndOffset, ma_dr_mp3_seek_origin_end)) { if (onSeek(pUserData, streamEndOffset, MA_DR_MP3_SEEK_END)) {
size_t apeTagSize = (size_t)tagSize + 32; size_t apeTagSize = (size_t)tagSize + 32;
ma_uint8* pTagData = (ma_uint8*)ma_dr_mp3_malloc(apeTagSize, pAllocationCallbacks); ma_uint8* pTagData = (ma_uint8*)ma_dr_mp3_malloc(apeTagSize, pAllocationCallbacks);
if (pTagData != NULL) { if (pTagData != NULL) {
...@@ -94220,7 +94402,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on ...@@ -94220,7 +94402,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on
} }
} else { } else {
} }
if (!onSeek(pUserData, 0, ma_dr_mp3_seek_origin_start)) { if (!onSeek(pUserData, 0, MA_DR_MP3_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
pMP3->streamLength = (ma_uint64)streamLen; pMP3->streamLength = (ma_uint64)streamLen;
...@@ -94228,7 +94410,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on ...@@ -94228,7 +94410,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on
pMP3->memory.dataSize = (size_t)pMP3->streamLength; pMP3->memory.dataSize = (size_t)pMP3->streamLength;
} }
} else { } else {
if (!onSeek(pUserData, 0, ma_dr_mp3_seek_origin_start)) { if (!onSeek(pUserData, 0, MA_DR_MP3_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
} }
...@@ -94262,7 +94444,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on ...@@ -94262,7 +94444,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on
} }
} else { } else {
if (onSeek != NULL) { if (onSeek != NULL) {
if (!onSeek(pUserData, tagSize, ma_dr_mp3_seek_origin_current)) { if (!onSeek(pUserData, tagSize, MA_DR_MP3_SEEK_CUR)) {
return MA_FALSE; return MA_FALSE;
} }
} else { } else {
...@@ -94283,7 +94465,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on ...@@ -94283,7 +94465,7 @@ static ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc on
pMP3->streamCursor = pMP3->streamStartOffset; pMP3->streamCursor = pMP3->streamStartOffset;
} else { } else {
if (onSeek != NULL) { if (onSeek != NULL) {
if (!onSeek(pUserData, 0, ma_dr_mp3_seek_origin_start)) { if (!onSeek(pUserData, 0, MA_DR_MP3_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
} else { } else {
...@@ -94406,33 +94588,27 @@ static size_t ma_dr_mp3__on_read_memory(void* pUserData, void* pBufferOut, size_ ...@@ -94406,33 +94588,27 @@ static size_t ma_dr_mp3__on_read_memory(void* pUserData, void* pBufferOut, size_
static ma_bool32 ma_dr_mp3__on_seek_memory(void* pUserData, int byteOffset, ma_dr_mp3_seek_origin origin) static ma_bool32 ma_dr_mp3__on_seek_memory(void* pUserData, int byteOffset, ma_dr_mp3_seek_origin origin)
{ {
ma_dr_mp3* pMP3 = (ma_dr_mp3*)pUserData; ma_dr_mp3* pMP3 = (ma_dr_mp3*)pUserData;
ma_int64 newCursor;
MA_DR_MP3_ASSERT(pMP3 != NULL); MA_DR_MP3_ASSERT(pMP3 != NULL);
if (origin == ma_dr_mp3_seek_origin_current) { newCursor = pMP3->memory.currentReadPos;
if (byteOffset > 0) { if (origin == MA_DR_MP3_SEEK_SET) {
if (pMP3->memory.currentReadPos + byteOffset > pMP3->memory.dataSize) { newCursor = 0;
} else if (origin == MA_DR_MP3_SEEK_CUR) {
newCursor = (ma_int64)pMP3->memory.currentReadPos;
} else if (origin == MA_DR_MP3_SEEK_END) {
newCursor = (ma_int64)pMP3->memory.dataSize;
} else {
MA_DR_MP3_ASSERT(!"Invalid seek origin");
return MA_FALSE; return MA_FALSE;
} }
} else { newCursor += byteOffset;
if (pMP3->memory.currentReadPos < (size_t)-byteOffset) { if (newCursor < 0) {
return MA_FALSE; return MA_FALSE;
} }
} if ((size_t)newCursor > pMP3->memory.dataSize) {
pMP3->memory.currentReadPos += byteOffset;
} else if (origin == ma_dr_mp3_seek_origin_start) {
if ((ma_uint32)byteOffset <= pMP3->memory.dataSize) {
pMP3->memory.currentReadPos = byteOffset;
} else {
return MA_FALSE;
}
} else if (origin == ma_dr_mp3_seek_origin_end) {
if (byteOffset > 0) {
return MA_FALSE;
}
if ((size_t)(-byteOffset) > pMP3->memory.dataSize) {
return MA_FALSE; return MA_FALSE;
} }
pMP3->memory.currentReadPos = pMP3->memory.dataSize - (size_t)(-byteOffset); pMP3->memory.currentReadPos = (size_t)newCursor;
}
return MA_TRUE; return MA_TRUE;
} }
static ma_bool32 ma_dr_mp3__on_tell_memory(void* pUserData, ma_int64* pCursor) static ma_bool32 ma_dr_mp3__on_tell_memory(void* pUserData, ma_int64* pCursor)
...@@ -94482,9 +94658,9 @@ static size_t ma_dr_mp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t ...@@ -94482,9 +94658,9 @@ static size_t ma_dr_mp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t
static ma_bool32 ma_dr_mp3__on_seek_stdio(void* pUserData, int offset, ma_dr_mp3_seek_origin origin) static ma_bool32 ma_dr_mp3__on_seek_stdio(void* pUserData, int offset, ma_dr_mp3_seek_origin origin)
{ {
int whence = SEEK_SET; int whence = SEEK_SET;
if (origin == ma_dr_mp3_seek_origin_current) { if (origin == MA_DR_MP3_SEEK_CUR) {
whence = SEEK_CUR; whence = SEEK_CUR;
} else if (origin == ma_dr_mp3_seek_origin_end) { } else if (origin == MA_DR_MP3_SEEK_END) {
whence = SEEK_END; whence = SEEK_END;
} }
return fseek((FILE*)pUserData, offset, whence) == 0; return fseek((FILE*)pUserData, offset, whence) == 0;
...@@ -94743,7 +94919,7 @@ static ma_bool32 ma_dr_mp3_seek_to_start_of_stream(ma_dr_mp3* pMP3) ...@@ -94743,7 +94919,7 @@ static ma_bool32 ma_dr_mp3_seek_to_start_of_stream(ma_dr_mp3* pMP3)
{ {
MA_DR_MP3_ASSERT(pMP3 != NULL); MA_DR_MP3_ASSERT(pMP3 != NULL);
MA_DR_MP3_ASSERT(pMP3->onSeek != NULL); MA_DR_MP3_ASSERT(pMP3->onSeek != NULL);
if (!ma_dr_mp3__on_seek_64(pMP3, pMP3->streamStartOffset, ma_dr_mp3_seek_origin_start)) { if (!ma_dr_mp3__on_seek_64(pMP3, pMP3->streamStartOffset, MA_DR_MP3_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
ma_dr_mp3_reset(pMP3); ma_dr_mp3_reset(pMP3);
...@@ -94809,7 +94985,7 @@ static ma_bool32 ma_dr_mp3_seek_to_pcm_frame__seek_table(ma_dr_mp3* pMP3, ma_uin ...@@ -94809,7 +94985,7 @@ static ma_bool32 ma_dr_mp3_seek_to_pcm_frame__seek_table(ma_dr_mp3* pMP3, ma_uin
seekPoint.mp3FramesToDiscard = 0; seekPoint.mp3FramesToDiscard = 0;
seekPoint.pcmFramesToDiscard = 0; seekPoint.pcmFramesToDiscard = 0;
} }
if (!ma_dr_mp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, ma_dr_mp3_seek_origin_start)) { if (!ma_dr_mp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, MA_DR_MP3_SEEK_SET)) {
return MA_FALSE; return MA_FALSE;
} }
ma_dr_mp3_reset(pMP3); ma_dr_mp3_reset(pMP3);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment