From f223d3e315d04e4b48547201a4d80b2e95846cbd Mon Sep 17 00:00:00 2001 From: David Reid Date: Wed, 29 Apr 2026 10:46:38 +1000 Subject: [PATCH] Add some new data source APIs. ma_data_source_get_vtable() ma_data_source_init_copy() --- miniaudio.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/miniaudio.h b/miniaudio.h index bd67596c..08b879dd 100644 --- a/miniaudio.h +++ b/miniaudio.h @@ -6260,6 +6260,8 @@ typedef struct MA_API ma_result ma_data_source_base_init(const ma_data_source_config* pConfig, ma_data_source* pDataSource); MA_API void ma_data_source_base_uninit(ma_data_source* pDataSource); +MA_API const ma_data_source_vtable* ma_data_source_get_vtable(ma_data_source* pDataSource); +MA_API ma_result ma_data_source_init_copy(ma_data_source* pDataSource, ma_data_source* pNewDataSource); MA_API ma_result ma_data_source_read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); /* Must support pFramesOut = NULL in which case a forward seek should be performed. */ MA_API ma_result ma_data_source_seek_pcm_frames(ma_data_source* pDataSource, ma_uint64 frameCount, ma_uint64* pFramesSeeked); /* Can only seek forward. Equivalent to ma_data_source_read_pcm_frames(pDataSource, NULL, frameCount, &framesRead); */ MA_API ma_result ma_data_source_seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 frameIndex); @@ -68951,6 +68953,36 @@ MA_API void ma_data_source_base_uninit(ma_data_source* pDataSource) */ } +MA_API const ma_data_source_vtable* ma_data_source_get_vtable(ma_data_source* pDataSource) +{ + if (pDataSource == NULL) { + return NULL; + } + + return ((ma_data_source_base*)pDataSource)->pVTable; +} + +MA_API ma_result ma_data_source_init_copy(ma_data_source* pDataSource, ma_data_source* pNewDataSource) +{ + ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource; + + if (pNewDataSource == NULL) { + return MA_INVALID_ARGS; + } + + if (pDataSource == NULL) { + return MA_INVALID_ARGS; + } + + MA_ASSERT(pDataSourceBase->pVTable != NULL); + + if (pDataSourceBase->pVTable->onCopy == NULL) { + return MA_INVALID_OPERATION; /* Not copyable. */ + } + + return pDataSourceBase->pVTable->onCopy(pDataSource, pNewDataSource); +} + static ma_result ma_data_source_resolve_current(ma_data_source* pDataSource, ma_data_source** ppCurrentDataSource) { ma_data_source_base* pCurrentDataSource = (ma_data_source_base*)pDataSource;