Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
miniaudio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
miniaudio
Commits
e5433699
Commit
e5433699
authored
Jul 04, 2025
by
David Reid
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update dr_libs.
parent
1c7967fc
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
424 additions
and
248 deletions
+424
-248
miniaudio.h
miniaudio.h
+424
-248
No files found.
miniaudio.h
View file @
e5433699
...
...
@@ -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);
typedef enum
{
ma_dr_wav_seek_origin_start,
ma_dr_wav_seek_origin_current
MA_DR_WAV_SEEK_SET,
MA_DR_WAV_SEEK_CUR,
MA_DR_WAV_SEEK_END
} ma_dr_wav_seek_origin;
typedef enum
{
...
...
@@ -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_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_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 struct
{
...
...
@@ -61786,6 +61788,11 @@ typedef enum
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_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_info_copyright
| ma_dr_wav_metadata_type_list_info_title
...
...
@@ -61794,7 +61801,12 @@ typedef enum
| ma_dr_wav_metadata_type_list_info_date
| ma_dr_wav_metadata_type_list_info_genre
| 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_note
| ma_dr_wav_metadata_type_list_labelled_cue_region,
...
...
@@ -61949,6 +61961,7 @@ typedef struct
ma_dr_wav_read_proc onRead;
ma_dr_wav_write_proc onWrite;
ma_dr_wav_seek_proc onSeek;
ma_dr_wav_tell_proc onTell;
void* pUserData;
ma_allocation_callbacks allocationCallbacks;
ma_dr_wav_container container;
...
...
@@ -61991,9 +62004,9 @@ typedef struct
ma_bool8 isUnsigned;
} aiff;
} 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_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_
chunk_proc onChunk, void* pReadSeek
UserData, 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(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_
tell_proc onTell, ma_dr_wav_chunk_proc onChunk, void* pReadSeekTell
UserData, 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,
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_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);
...
...
@@ -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_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
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 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 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_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,
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,
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
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);
...
...
@@ -62107,8 +62120,8 @@ extern "C" {
#define MA_DR_FLAC_STRINGIFY(x) #x
#define MA_DR_FLAC_XSTRINGIFY(x) MA_DR_FLAC_STRINGIFY(x)
#define MA_DR_FLAC_VERSION_MAJOR 0
#define MA_DR_FLAC_VERSION_MINOR 1
2
#define MA_DR_FLAC_VERSION_REVISION
44
#define MA_DR_FLAC_VERSION_MINOR 1
3
#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)
#include <stddef.h>
#if defined(_MSC_VER) && _MSC_VER >= 1700
...
...
@@ -62171,8 +62184,9 @@ typedef enum
} ma_dr_flac_container;
typedef enum
{
ma_dr_flac_seek_origin_start,
ma_dr_flac_seek_origin_current
MA_DR_FLAC_SEEK_SET,
MA_DR_FLAC_SEEK_CUR,
MA_DR_FLAC_SEEK_END
} ma_dr_flac_seek_origin;
typedef struct
{
...
...
@@ -62248,6 +62262,7 @@ typedef struct
} ma_dr_flac_metadata;
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_tell_proc)(void* pUserData, ma_int64* pCursor);
typedef void (* ma_dr_flac_meta_proc)(void* pUserData, ma_dr_flac_metadata* pMetadata);
typedef struct
{
...
...
@@ -62259,6 +62274,7 @@ typedef struct
{
ma_dr_flac_read_proc onRead;
ma_dr_flac_seek_proc onSeek;
ma_dr_flac_tell_proc onTell;
void* pUserData;
size_t unalignedByteCount;
ma_dr_flac_cache_t unalignedCache;
...
...
@@ -62318,10 +62334,10 @@ typedef struct
ma_dr_flac_bs bs;
ma_uint8 pExtraData[1];
} 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_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_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_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(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_
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_
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_
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 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);
...
...
@@ -62335,9 +62351,9 @@ MA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata_w(const wchar_t* pFileName
#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_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_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 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 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,
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,
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
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);
...
...
@@ -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);
typedef enum
{
ma_dr_mp3_seek_origin_start
,
ma_dr_mp3_seek_origin_current
,
ma_dr_mp3_seek_origin_end
MA_DR_MP3_SEEK_SET
,
MA_DR_MP3_SEEK_CUR
,
MA_DR_MP3_SEEK_END
} ma_dr_mp3_seek_origin;
typedef struct
{
...
...
@@ -63068,8 +63084,10 @@ static ma_bool32 ma_wav_dr_callback__seek(void* pUserData, int offset, ma_dr_wav
MA_ASSERT(pWav != NULL);
maSeekOrigin = ma_seek_origin_start;
if (origin == ma_dr_wav_seek_origin_current) {
maSeekOrigin = ma_seek_origin_current;
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 = 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
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
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
{
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) {
return MA_INVALID_FILE;
}
...
...
@@ -63752,8 +63790,10 @@ static ma_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, ma_dr_fl
MA_ASSERT(pFlac != NULL);
maSeekOrigin = ma_seek_origin_start;
if (origin == ma_dr_flac_seek_origin_current) {
maSeekOrigin = ma_seek_origin_current;
if (origin == MA_DR_FLAC_SEEK_CUR) {
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);
...
...
@@ -63763,6 +63803,26 @@ static ma_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, ma_dr_fl
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
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_
#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) {
return MA_INVALID_FILE;
}
...
...
@@ -64375,9 +64435,9 @@ static ma_bool32 ma_mp3_dr_callback__seek(void* pUserData, int offset, ma_dr_mp3
MA_ASSERT(pMP3 != NULL);
if (origin ==
ma_dr_mp3_seek_origin_start
) {
maSeekOrigin =
ma_seek_origin_start;
} else if (origin ==
ma_dr_mp3_seek_origin_end
) {
if (origin ==
MA_DR_MP3_SEEK_SET
) {
maSeekOrigin = ma_seek_origin_start;
} else if (origin ==
MA_DR_MP3_SEEK_END
) {
maSeekOrigin = ma_seek_origin_end;
} else {
maSeekOrigin = ma_seek_origin_current;
...
...
@@ -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_result result;
ma_seek_origin maSeekOrigin;
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) {
return MA_FALSE;
} else {
...
...
@@ -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;
while (bytesRemainingToSeek > 0) {
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;
}
bytesRemainingToSeek -= 0x7FFFFFFF;
} 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;
}
bytesRemainingToSeek = 0;
...
...
@@ -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)
{
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;
}
offset -= 0x7FFFFFFF;
for (;;) {
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;
}
offset -= 0x7FFFFFFF;
...
...
@@ -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)) {
return MA_FALSE;
}
if (origin ==
ma_dr_wav_seek_origin_start
) {
if (origin ==
MA_DR_WAV_SEEK_SET
) {
*pCursor = offset;
} else {
*pCursor += offset;
...
...
@@ -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) {
ma_uint8 buffer[4];
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;
}
bytesRead += 28;
...
...
@@ -80604,7 +80672,7 @@ MA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parse
return bytesRead;
}
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);
pParser->metadataCount += 1;
} else {
...
...
@@ -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);
} 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);
} 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) {
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
MA_DR_WAV_ASSERT(subchunkBytesRead <= subchunkDataSize);
if (subchunkBytesRead < subchunkDataSize) {
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;
}
bytesRead += bytesToSeek;
}
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;
}
bytesRead += 1;
...
...
@@ -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);
}
}
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* pReadSeek
UserData, 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* pReadSeekTell
UserData, const ma_allocation_callbacks* pAllocationCallbacks)
{
if (pWav == NULL || onRead == NULL || onSeek == NULL) {
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
MA_DR_WAV_ZERO_MEMORY(pWav, sizeof(*pWav));
pWav->onRead = onRead;
pWav->onSeek = onSeek;
pWav->pUserData = pReadSeekUserData;
pWav->onTell = onTell;
pWav->pUserData = pReadSeekTellUserData;
pWav->allocationCallbacks = ma_dr_wav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);
if (pWav->allocationCallbacks.onFree == NULL || (pWav->allocationCallbacks.onMalloc == NULL && pWav->allocationCallbacks.onRealloc == NULL)) {
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
fmt.channelMask = ma_dr_wav_bytes_to_u32_ex(fmtext + 2, pWav->container);
ma_dr_wav_bytes_to_guid(fmtext + 6, fmt.subFormat);
} 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;
}
}
cursor += 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;
}
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
pWav->pMetadata = metadataParser.pMetadata;
pWav->metadataCount = metadataParser.metadataCount;
}
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;
if (pWav->onTell != NULL && pWav->onSeek != NULL) {
if (pWav->onSeek(pWav->pUserData, 0, MA_DR_WAV_SEEK_END) == MA_TRUE) {
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) {
dataChunkSize = 0;
...
...
@@ -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->sampleRate = fmt.sampleRate;
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
#endif
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* pReadSeek
UserData, 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* pReadSeekTell
UserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)
{
if (!ma_dr_wav_preinit(pWav, onRead, onSeek,
pReadSeek
UserData, pAllocationCallbacks)) {
if (!ma_dr_wav_preinit(pWav, onRead, onSeek,
onTell, pReadSeekTell
UserData, pAllocationCallbacks)) {
return MA_FALSE;
}
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_dr_wav_init__internal(pWav, NULL, NULL, flags | MA_DR_WAV_WITH_METADATA);
...
...
@@ -81577,15 +81667,20 @@ MA_PRIVATE size_t ma_dr_wav__write_or_count_metadata(ma_dr_wav* pWav, ma_dr_wav_
if (pMetadata->type & ma_dr_wav_metadata_type_list_all_info_strings) {
const char* pID = NULL;
switch (pMetadata->type) {
case ma_dr_wav_metadata_type_list_info_software: pID = "ISFT"; break;
case ma_dr_wav_metadata_type_list_info_copyright: pID = "ICOP"; break;
case ma_dr_wav_metadata_type_list_info_title: pID = "INAM"; break;
case ma_dr_wav_metadata_type_list_info_artist: pID = "IART"; break;
case ma_dr_wav_metadata_type_list_info_comment: pID = "ICMT"; break;
case ma_dr_wav_metadata_type_list_info_date: pID = "ICRD"; 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_tracknumber: pID = "ITRK"; break;
case ma_dr_wav_metadata_type_list_info_software: pID = "ISFT"; break;
case ma_dr_wav_metadata_type_list_info_copyright: pID = "ICOP"; break;
case ma_dr_wav_metadata_type_list_info_title: pID = "INAM"; break;
case ma_dr_wav_metadata_type_list_info_artist: pID = "IART"; break;
case ma_dr_wav_metadata_type_list_info_comment: pID = "ICMT"; break;
case ma_dr_wav_metadata_type_list_info_date: pID = "ICRD"; 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_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;
}
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
}
pWav->dataChunkDataSizeTargetWrite = initialDataChunkSize;
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_u32ne_to_le(pWav, chunkSizeRIFF);
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,
}
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)
{
...
...
@@ -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_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) {
fclose(pFile);
return result;
...
...
@@ -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_dr_wav* pWav = (ma_dr_wav*)pUserData;
ma_int64 newCursor;
MA_DR_WAV_ASSERT(pWav != NULL);
if (origin == ma_dr_wav_seek_origin_current) {
if (offset > 0) {
if (pWav->memoryStream.currentReadPos + offset > pWav->memoryStream.dataSize) {
return MA_FALSE;
}
} else {
if (pWav->memoryStream.currentReadPos < (size_t)-offset) {
return MA_FALSE;
}
}
pWav->memoryStream.currentReadPos += offset;
newCursor = pWav->memoryStream.currentReadPos;
if (origin == MA_DR_WAV_SEEK_SET) {
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 {
if ((ma_uint32)offset <= pWav->memoryStream.dataSize) {
pWav->memoryStream.currentReadPos = offset;
} else {
return MA_FALSE;
}
MA_DR_WAV_ASSERT(!"Invalid seek origin");
return MA_FALSE;
}
newCursor += offset;
if (newCursor < 0) {
return MA_FALSE;
}
if ((size_t)newCursor > pWav->memoryStream.dataSize) {
return MA_FALSE;
}
pWav->memoryStream.currentReadPos = (size_t)newCursor;
return MA_TRUE;
}
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
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_int64 newCursor;
MA_DR_WAV_ASSERT(pWav != NULL);
if (origin == ma_dr_wav_seek_origin_current) {
if (offset > 0) {
if (pWav->memoryStreamWrite.currentWritePos + offset > pWav->memoryStreamWrite.dataSize) {
offset = (int)(pWav->memoryStreamWrite.dataSize - pWav->memoryStreamWrite.currentWritePos);
}
} else {
if (pWav->memoryStreamWrite.currentWritePos < (size_t)-offset) {
offset = -(int)pWav->memoryStreamWrite.currentWritePos;
}
}
pWav->memoryStreamWrite.currentWritePos += offset;
newCursor = pWav->memoryStreamWrite.currentWritePos;
if (origin == MA_DR_WAV_SEEK_SET) {
newCursor = 0;
} 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 {
if ((ma_uint32)offset <= pWav->memoryStreamWrite.dataSize) {
pWav->memoryStreamWrite.currentWritePos = offset;
} else {
pWav->memoryStreamWrite.currentWritePos = pWav->memoryStreamWrite.dataSize;
}
MA_DR_WAV_ASSERT(!"Invalid seek origin");
return MA_INVALID_ARGS;
}
newCursor += offset;
if (newCursor < 0) {
return MA_FALSE;
}
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;
}
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
if (data == NULL || dataSize == 0) {
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;
}
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
if (data == NULL || dataSize == 0) {
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;
}
pWav->memoryStream.data = (const ma_uint8*)data;
...
...
@@ -82223,30 +82354,30 @@ MA_API ma_result ma_dr_wav_uninit(ma_dr_wav* pWav)
}
if (pWav->onSeek && !pWav->isSequentialWrite) {
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_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_dr_wav__write_u32ne_to_le(pWav, dataChunkSize);
}
} 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_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_dr_wav__write_u64ne_to_le(pWav, dataChunkSize);
}
} else if (pWav->container == ma_dr_wav_container_rf64) {
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_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_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
if (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;
}
bytesRead += bytesToSeek;
...
...
@@ -82392,7 +82523,7 @@ MA_PRIVATE ma_bool32 ma_dr_wav_seek_to_first_pcm_frame(ma_dr_wav* pWav)
if (pWav->onWrite != NULL) {
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;
}
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
}
while (offset > 0) {
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;
}
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
}
pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header);
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;
return totalFramesRead;
}
...
...
@@ -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);
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;
return totalFramesRead;
}
...
...
@@ -84055,7 +84186,7 @@ MA_PRIVATE ma_int32* ma_dr_wav__read_pcm_frames_and_close_s32(ma_dr_wav* pWav, u
}
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;
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
if (totalFrameCountOut) {
*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 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;
if (channelsOut) {
...
...
@@ -84084,12 +84215,12 @@ MA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead,
if (totalFrameCountOut) {
*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 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;
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
if (totalFrameCountOut) {
*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 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
MA_DR_FLAC_ASSERT(offsetFromStart > 0);
if (offsetFromStart > 0x7FFFFFFF) {
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;
}
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;
}
bytesRemaining -= 0x7FFFFFFF;
}
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;
}
}
} 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;
}
}
...
...
@@ -88030,6 +88161,7 @@ typedef struct
{
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;
...
...
@@ -88158,11 +88290,12 @@ static void ma_dr_flac__free_from_callbacks(void* p, const ma_allocation_callbac
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 seektablePos = 0;
ma_uint32 seektableSize = 0;
(void)onTell;
for (;;) {
ma_dr_flac_metadata metadata;
ma_uint8 isLastBlock = 0;
...
...
@@ -88420,7 +88553,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea
{
if (onMeta) {
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;
} else {
onMeta(pUserDataMD, &metadata);
...
...
@@ -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:
{
if (onMeta) {
if (!onSeek(pUserData, blockSize,
ma_dr_flac_seek_origin_current
)) {
if (!onSeek(pUserData, blockSize,
MA_DR_FLAC_SEEK_CUR
)) {
isLastBlock = MA_TRUE;
}
}
...
...
@@ -88454,7 +88587,7 @@ static ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRea
} break;
}
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;
}
}
...
...
@@ -88718,6 +88851,7 @@ typedef struct
{
ma_dr_flac_read_proc onRead;
ma_dr_flac_seek_proc onSeek;
ma_dr_flac_tell_proc onTell;
void* pUserData;
ma_uint64 currentBytePos;
ma_uint64 firstBytePos;
...
...
@@ -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)
{
if (origin ==
ma_dr_flac_seek_origin_start
) {
if (origin ==
MA_DR_FLAC_SEEK_SET
) {
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;
}
oggbs->currentBytePos = offset;
return MA_TRUE;
} 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;
}
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 {
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;
}
oggbs->currentBytePos += 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;
}
oggbs->currentBytePos += offset;
...
...
@@ -88784,7 +88918,7 @@ static ma_bool32 ma_dr_flac_oggbs__goto_next_page(ma_dr_flac_oggbs* oggbs, ma_dr
continue;
}
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;
}
continue;
...
...
@@ -88846,7 +88980,7 @@ static ma_bool32 ma_dr_flac_oggbs__seek_to_next_packet(ma_dr_flac_oggbs* oggbs)
}
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;
if (atEndOfPage) {
if (!ma_dr_flac_oggbs__goto_next_page(oggbs)) {
...
...
@@ -88899,36 +89033,44 @@ static ma_bool32 ma_dr_flac__on_seek_ogg(void* pUserData, int offset, ma_dr_flac
int bytesSeeked = 0;
MA_DR_FLAC_ASSERT(oggbs != NULL);
MA_DR_FLAC_ASSERT(offset >= 0);
if (origin ==
ma_dr_flac_seek_origin_start
) {
if (!ma_dr_flac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos,
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_SET
)) {
return MA_FALSE;
}
if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) {
return MA_FALSE;
}
return ma_dr_flac__on_seek_ogg(pUserData, offset,
ma_dr_flac_seek_origin_current
);
}
MA_DR_FLAC_ASSERT(origin == ma_dr_flac_seek_origin_current);
while (bytesSeeked < offset) {
int bytesRemainingToSeek = offset - bytesSeeked
;
MA_DR_FLAC_ASSERT(bytesRemainingToSeek >= 0);
if (oggbs->bytesRemainingInPage >= (size_t)bytesRemainingToSeek) {
bytesSeeked += bytesRemainingToSeek
;
(void)bytesSeeked
;
oggbs->bytesRemainingInPage -= bytesRemainingToSee
k;
break;
}
if (oggbs->bytesRemainingInPage > 0) {
bytesSeeked += (int)oggbs->bytesRemainingInPage
;
oggbs->bytesRemainingInPage = 0;
}
MA_DR_FLAC_ASSERT(bytesRemainingToSeek > 0);
if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) {
return MA_FALSE;
return ma_dr_flac__on_seek_ogg(pUserData, offset,
MA_DR_FLAC_SEEK_CUR
);
}
else if (origin == MA_DR_FLAC_SEEK_CUR) {
while (bytesSeeked < offset) {
int bytesRemainingToSeek = offset - bytesSeeked;
MA_DR_FLAC_ASSERT(bytesRemainingToSeek >= 0)
;
if (oggbs->bytesRemainingInPage >= (size_t)bytesRemainingToSeek) {
bytesSeeked += bytesRemainingToSeek;
(void)bytesSeeked
;
oggbs->bytesRemainingInPage -= bytesRemainingToSeek
;
brea
k;
}
if (oggbs->bytesRemainingInPage > 0) {
bytesSeeked += (int)oggbs->bytesRemainingInPage;
oggbs->bytesRemainingInPage = 0
;
}
MA_DR_FLAC_ASSERT(bytesRemainingToSeek > 0);
if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) {
return MA_FALSE;
}
}
} else if (origin == MA_DR_FLAC_SEEK_END) {
return MA_FALSE;
}
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)
{
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
runningGranulePosition = 0;
for (;;) {
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;
}
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
}
}
}
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;
}
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
if (mappingVersion[0] != 1) {
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;
}
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
return MA_FALSE;
}
} else {
if (!onSeek(pUserData, bytesRemainingInPage,
ma_dr_flac_seek_origin_current
)) {
if (!onSeek(pUserData, bytesRemainingInPage,
MA_DR_FLAC_SEEK_CUR
)) {
return MA_FALSE;
}
}
} else {
if (!onSeek(pUserData, bytesRemainingInPage,
ma_dr_flac_seek_origin_current
)) {
if (!onSeek(pUserData, bytesRemainingInPage,
MA_DR_FLAC_SEEK_CUR
)) {
return MA_FALSE;
}
}
} else {
if (!onSeek(pUserData, pageBodySize,
ma_dr_flac_seek_origin_current
)) {
if (!onSeek(pUserData, pageBodySize,
MA_DR_FLAC_SEEK_CUR
)) {
return MA_FALSE;
}
}
...
...
@@ -89128,7 +89270,7 @@ static ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_d
return MA_TRUE;
}
#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_uint8 id[4];
...
...
@@ -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));
pInit->onRead = onRead;
pInit->onSeek = onSeek;
pInit->onTell = onTell;
pInit->onMeta = onMeta;
pInit->container = container;
pInit->pUserData = pUserData;
pInit->pUserDataMD = pUserDataMD;
pInit->bs.onRead = onRead;
pInit->bs.onSeek = onSeek;
pInit->bs.onTell = onTell;
pInit->bs.pUserData = pUserData;
ma_dr_flac__reset_cache(&pInit->bs);
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
if (flags & 0x10) {
headerSize += 10;
}
if (!onSeek(pUserData, headerSize,
ma_dr_flac_seek_origin_current
)) {
if (!onSeek(pUserData, headerSize,
MA_DR_FLAC_SEEK_CUR
)) {
return MA_FALSE;
}
pInit->runningFilePos += headerSize;
...
...
@@ -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->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_uint32 allocationSize;
...
...
@@ -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_dr_flac* pFlac;
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, on
Tell, on
Meta, container, pUserData, pUserDataMD)) {
return 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
MA_DR_FLAC_ZERO_MEMORY(pOggbs, sizeof(*pOggbs));
pOggbs->onRead = onRead;
pOggbs->onSeek = onSeek;
pOggbs->onTell = onTell;
pOggbs->pUserData = pUserData;
pOggbs->currentBytePos = 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
if (init.hasMetadataBlocks) {
ma_dr_flac_read_proc onReadOverride = onRead;
ma_dr_flac_seek_proc onSeekOverride = onSeek;
ma_dr_flac_tell_proc onTellOverride = onTell;
void* pUserDataOverride = pUserData;
#ifndef MA_DR_FLAC_NO_OGG
if (init.container == ma_dr_flac_container_ogg) {
onReadOverride = ma_dr_flac__on_read_ogg;
onSeekOverride = ma_dr_flac__on_seek_ogg;
onTellOverride = ma_dr_flac__on_tell_ogg;
pUserDataOverride = (void*)pOggbs;
}
#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, on
TellOverride, on
Meta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seekpointCount, &allocationCallbacks)) {
#ifndef MA_DR_FLAC_NO_OGG
ma_dr_flac__free_from_callbacks(pOggbs, &allocationCallbacks);
#endif
...
...
@@ -89305,6 +89452,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on
pOggbs = NULL;
pFlac->bs.onRead = ma_dr_flac__on_read_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->_oggbs = (void*)pInternalOggbs;
}
...
...
@@ -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);
MA_DR_FLAC_ASSERT(pFlac->bs.onSeek != 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;
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) {
...
...
@@ -89337,7 +89485,7 @@ static ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc on
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);
return NULL;
}
...
...
@@ -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)
{
MA_DR_FLAC_ASSERT(offset >= 0);
return fseek((FILE*)pUserData, offset, (origin == ma_dr_flac_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;
int whence = SEEK_SET;
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)
{
...
...
@@ -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) {
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) {
fclose(pFile);
return NULL;
...
...
@@ -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) {
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) {
fclose(pFile);
return NULL;
...
...
@@ -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) {
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) {
fclose(pFile);
return pFlac;
...
...
@@ -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) {
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) {
fclose(pFile);
return pFlac;
...
...
@@ -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)
{
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(offset >= 0);
if (offset > (ma_int64)memoryStream->dataSize) {
newCursor = memoryStream->currentReadPos;
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;
}
if (origin == ma_dr_flac_seek_origin_current) {
if (memoryStream->currentReadPos + offset <= memoryStream->dataSize) {
memoryStream->currentReadPos += offset;
} else {
return MA_FALSE;
}
} else {
if ((ma_uint32)offset <= memoryStream->dataSize) {
memoryStream->currentReadPos = offset;
} else {
return MA_FALSE;
}
newCursor += offset;
if (newCursor < 0) {
return MA_FALSE;
}
if ((size_t)newCursor > memoryStream->dataSize) {
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;
}
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
memoryStream.data = (const ma_uint8*)pData;
memoryStream.dataSize = dataSize;
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) {
return NULL;
}
...
...
@@ -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.dataSize = dataSize;
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) {
return NULL;
}
...
...
@@ -89533,21 +89715,21 @@ MA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_
}
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, on
Tell, on
Meta, 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, on
Tell, on
Meta, container, pUserData, pUserData, pAllocationCallbacks);
}
MA_API void ma_dr_flac_close(ma_dr_flac* pFlac)
{
...
...
@@ -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(s16, ma_int16)
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;
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
if (totalPCMFrameCountOut) {
*totalPCMFrameCountOut = 0;
}
pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks);
pFlac = ma_dr_flac_open(onRead, onSeek,
onTell,
pUserData, pAllocationCallbacks);
if (pFlac == NULL) {
return NULL;
}
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;
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
if (totalPCMFrameCountOut) {
*totalPCMFrameCountOut = 0;
}
pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks);
pFlac = ma_dr_flac_open(onRead, onSeek,
onTell,
pUserData, pAllocationCallbacks);
if (pFlac == NULL) {
return NULL;
}
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;
if (channelsOut) {
...
...
@@ -91888,7 +92070,7 @@ MA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRea
if (totalPCMFrameCountOut) {
*totalPCMFrameCountOut = 0;
}
pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks);
pFlac = ma_dr_flac_open(onRead, onSeek,
onTell,
pUserData, pAllocationCallbacks);
if (pFlac == NULL) {
return NULL;
}
...
...
@@ -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)
{
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)) {
return MA_FALSE;
}
if (origin ==
ma_dr_mp3_seek_origin_start
) {
if (origin ==
MA_DR_MP3_SEEK_SET
) {
pMP3->streamCursor = (ma_uint64)offset;
} else{
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_
if (offset <= 0x7FFFFFFF) {
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;
}
offset -= 0x7FFFFFFF;
while (offset > 0) {
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;
}
offset = 0;
} 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;
}
offset -= 0x7FFFFFFF;
...
...
@@ -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;
#if 1
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;
int streamEndOffset = 0;
if (onTell(pUserData, &streamLen)) {
if (streamLen > 128) {
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') {
streamEndOffset -= 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
}
if (streamLen > 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') {
ma_uint32 tagSize =
((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
streamEndOffset -= 32 + tagSize;
streamLen -= 32 + tagSize;
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;
ma_uint8* pTagData = (ma_uint8*)ma_dr_mp3_malloc(apeTagSize, pAllocationCallbacks);
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
}
} else {
}
if (!onSeek(pUserData, 0,
ma_dr_mp3_seek_origin_start
)) {
if (!onSeek(pUserData, 0,
MA_DR_MP3_SEEK_SET
)) {
return MA_FALSE;
}
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
pMP3->memory.dataSize = (size_t)pMP3->streamLength;
}
} else {
if (!onSeek(pUserData, 0,
ma_dr_mp3_seek_origin_start
)) {
if (!onSeek(pUserData, 0,
MA_DR_MP3_SEEK_SET
)) {
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
}
} else {
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;
}
} else {
...
...
@@ -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;
} else {
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;
}
} else {
...
...
@@ -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)
{
ma_dr_mp3* pMP3 = (ma_dr_mp3*)pUserData;
ma_int64 newCursor;
MA_DR_MP3_ASSERT(pMP3 != NULL);
if (origin == ma_dr_mp3_seek_origin_current) {
if (byteOffset > 0) {
if (pMP3->memory.currentReadPos + byteOffset > pMP3->memory.dataSize) {
return MA_FALSE;
}
} else {
if (pMP3->memory.currentReadPos < (size_t)-byteOffset) {
return MA_FALSE;
}
}
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;
}
pMP3->memory.currentReadPos = pMP3->memory.dataSize - (size_t)(-byteOffset);
newCursor = pMP3->memory.currentReadPos;
if (origin == MA_DR_MP3_SEEK_SET) {
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;
}
newCursor += byteOffset;
if (newCursor < 0) {
return MA_FALSE;
}
if ((size_t)newCursor > pMP3->memory.dataSize) {
return MA_FALSE;
}
pMP3->memory.currentReadPos = (size_t)newCursor;
return MA_TRUE;
}
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
static ma_bool32 ma_dr_mp3__on_seek_stdio(void* pUserData, int offset, ma_dr_mp3_seek_origin origin)
{
int whence = SEEK_SET;
if (origin ==
ma_dr_mp3_seek_origin_current
) {
if (origin ==
MA_DR_MP3_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;
}
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)
{
MA_DR_MP3_ASSERT(pMP3 != 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;
}
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
seekPoint.mp3FramesToDiscard = 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;
}
ma_dr_mp3_reset(pMP3);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment