API CHANGE: Remove ma_audio_buffer_ref.

Use ma_audio_buffer instead.
This commit is contained in:
David Reid
2026-04-29 16:09:11 +10:00
parent d7cec8ba20
commit 9ab3c55587
+156 -311
View File
@@ -6283,30 +6283,6 @@ MA_API ma_result ma_data_source_set_next_callback(ma_data_source* pDataSource, m
MA_API ma_data_source_get_next_proc ma_data_source_get_next_callback(const ma_data_source* pDataSource);
typedef struct
{
ma_data_source_base ds;
ma_format format;
ma_uint32 channels;
ma_uint32 sampleRate;
ma_uint64 cursor;
ma_uint64 sizeInFrames;
const void* pData;
} ma_audio_buffer_ref;
MA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef);
MA_API void ma_audio_buffer_ref_uninit(ma_audio_buffer_ref* pAudioBufferRef);
MA_API ma_result ma_audio_buffer_ref_set_data(ma_audio_buffer_ref* pAudioBufferRef, const void* pData, ma_uint64 sizeInFrames);
MA_API ma_result ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);
MA_API ma_result ma_audio_buffer_ref_seek_to_pcm_frame(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameIndex);
MA_API ma_result ma_audio_buffer_ref_map(ma_audio_buffer_ref* pAudioBufferRef, void** ppFramesOut, ma_uint64* pFrameCount);
MA_API ma_result ma_audio_buffer_ref_unmap(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameCount); /* Returns MA_AT_END if the end has been reached. This should be considered successful. */
MA_API ma_bool32 ma_audio_buffer_ref_at_end(const ma_audio_buffer_ref* pAudioBufferRef);
MA_API ma_result ma_audio_buffer_ref_get_cursor_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pCursor);
MA_API ma_result ma_audio_buffer_ref_get_length_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pLength);
MA_API ma_result ma_audio_buffer_ref_get_available_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pAvailableFrames);
typedef struct
{
@@ -6322,7 +6298,13 @@ MA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_u
typedef struct
{
ma_audio_buffer_ref ref;
ma_data_source_base ds;
ma_format format;
ma_uint32 channels;
ma_uint32 sampleRate;
ma_uint64 cursor;
ma_uint64 sizeInFrames;
const void* pData;
ma_allocation_callbacks allocationCallbacks;
ma_bool32 ownsData; /* Used to control whether or not miniaudio owns the data buffer. If set to true, pData will be freed in ma_audio_buffer_uninit(). */
ma_uint8 _pExtraData[1]; /* For allocating a buffer with the memory located directly after the other memory of the structure. */
@@ -69817,289 +69799,61 @@ MA_API ma_data_source_get_next_proc ma_data_source_get_next_callback(const ma_da
}
static size_t ma_audio_buffer_ref__data_source_on_sizeof(void)
static size_t ma_audio_buffer__data_source_on_sizeof(void)
{
return sizeof(ma_audio_buffer_ref);
return sizeof(ma_audio_buffer);
}
static void ma_audio_buffer_ref__data_source_on_uninit(ma_data_source* pDataSource)
static void ma_audio_buffer__data_source_on_uninit(ma_data_source* pDataSource)
{
ma_audio_buffer_ref_uninit((ma_audio_buffer_ref*)pDataSource);
ma_audio_buffer_uninit((ma_audio_buffer*)pDataSource);
}
static ma_result ma_audio_buffer_ref__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
static ma_result ma_audio_buffer__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
{
return ma_audio_buffer_ref_read_pcm_frames((ma_audio_buffer_ref*)pDataSource, pFramesOut, frameCount, pFramesRead);
return ma_audio_buffer_read_pcm_frames((ma_audio_buffer*)pDataSource, pFramesOut, frameCount, pFramesRead);
}
static ma_result ma_audio_buffer_ref__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)
static ma_result ma_audio_buffer__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)
{
return ma_audio_buffer_ref_seek_to_pcm_frame((ma_audio_buffer_ref*)pDataSource, frameIndex);
return ma_audio_buffer_seek_to_pcm_frame((ma_audio_buffer*)pDataSource, frameIndex);
}
static ma_result ma_audio_buffer_ref__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)
static ma_result ma_audio_buffer__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)
{
ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource;
ma_audio_buffer* pAudioBuffer = (ma_audio_buffer*)pDataSource;
*pFormat = pAudioBufferRef->format;
*pChannels = pAudioBufferRef->channels;
*pSampleRate = pAudioBufferRef->sampleRate;
ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pAudioBufferRef->channels);
*pFormat = pAudioBuffer->format;
*pChannels = pAudioBuffer->channels;
*pSampleRate = pAudioBuffer->sampleRate;
ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pAudioBuffer->channels);
return MA_SUCCESS;
}
static ma_result ma_audio_buffer_ref__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)
static ma_result ma_audio_buffer__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)
{
ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource;
*pCursor = pAudioBufferRef->cursor;
return MA_SUCCESS;
return ma_audio_buffer_get_cursor_in_pcm_frames((ma_audio_buffer*)pDataSource, pCursor);
}
static ma_result ma_audio_buffer_ref__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength)
static ma_result ma_audio_buffer__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength)
{
ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource;
*pLength = pAudioBufferRef->sizeInFrames;
return MA_SUCCESS;
return ma_audio_buffer_get_length_in_pcm_frames((ma_audio_buffer*)pDataSource, pLength);
}
static ma_data_source_vtable ma_gDataSourceVTable_AudioBufferRef =
static ma_data_source_vtable ma_gDataSourceVTable_AudioBuffer =
{
ma_audio_buffer_ref__data_source_on_sizeof,
ma_audio_buffer_ref__data_source_on_uninit,
ma_audio_buffer__data_source_on_sizeof,
ma_audio_buffer__data_source_on_uninit,
NULL, /* onCopy */
ma_audio_buffer_ref__data_source_on_read,
ma_audio_buffer_ref__data_source_on_seek,
ma_audio_buffer_ref__data_source_on_get_data_format,
ma_audio_buffer_ref__data_source_on_get_cursor,
ma_audio_buffer_ref__data_source_on_get_length,
ma_audio_buffer__data_source_on_read,
ma_audio_buffer__data_source_on_seek,
ma_audio_buffer__data_source_on_get_data_format,
ma_audio_buffer__data_source_on_get_cursor,
ma_audio_buffer__data_source_on_get_length,
NULL /* onSetLooping */
};
MA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef)
{
ma_result result;
ma_data_source_config dataSourceConfig;
if (pAudioBufferRef == NULL) {
return MA_INVALID_ARGS;
}
MA_ZERO_OBJECT(pAudioBufferRef);
dataSourceConfig = ma_data_source_config_init();
dataSourceConfig.pVTable = &ma_gDataSourceVTable_AudioBufferRef;
result = ma_data_source_base_init(&dataSourceConfig, &pAudioBufferRef->ds);
if (result != MA_SUCCESS) {
return result;
}
pAudioBufferRef->format = format;
pAudioBufferRef->channels = channels;
pAudioBufferRef->sampleRate = sampleRate;
pAudioBufferRef->cursor = 0;
pAudioBufferRef->sizeInFrames = sizeInFrames;
pAudioBufferRef->pData = pData;
return MA_SUCCESS;
}
MA_API void ma_audio_buffer_ref_uninit(ma_audio_buffer_ref* pAudioBufferRef)
{
if (pAudioBufferRef == NULL) {
return;
}
ma_data_source_base_uninit(&pAudioBufferRef->ds);
}
MA_API ma_result ma_audio_buffer_ref_set_data(ma_audio_buffer_ref* pAudioBufferRef, const void* pData, ma_uint64 sizeInFrames)
{
if (pAudioBufferRef == NULL) {
return MA_INVALID_ARGS;
}
pAudioBufferRef->cursor = 0;
pAudioBufferRef->sizeInFrames = sizeInFrames;
pAudioBufferRef->pData = pData;
return MA_SUCCESS;
}
MA_API ma_result ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
{
ma_uint64 framesAvailable;
ma_uint64 framesToRead;
if (pFramesRead != NULL) {
*pFramesRead = 0;
}
if (pAudioBufferRef == NULL) {
return MA_INVALID_ARGS;
}
framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor;
framesToRead = frameCount;
if (framesToRead > framesAvailable) {
framesToRead = framesAvailable;
}
if (pFramesOut != NULL && framesToRead > 0) {
ma_copy_pcm_frames(pFramesOut, ma_offset_ptr(pAudioBufferRef->pData, pAudioBufferRef->cursor * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels)), framesToRead, pAudioBufferRef->format, pAudioBufferRef->channels);
}
pAudioBufferRef->cursor += framesToRead;
if (pFramesRead != NULL) {
*pFramesRead = framesToRead;
}
if (framesToRead == 0) {
return MA_AT_END;
} else {
return MA_SUCCESS;
}
}
MA_API ma_result ma_audio_buffer_ref_seek_to_pcm_frame(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameIndex)
{
if (pAudioBufferRef == NULL) {
return MA_INVALID_ARGS;
}
if (frameIndex > pAudioBufferRef->sizeInFrames) {
return MA_INVALID_ARGS;
}
pAudioBufferRef->cursor = (size_t)frameIndex;
return MA_SUCCESS;
}
MA_API ma_result ma_audio_buffer_ref_map(ma_audio_buffer_ref* pAudioBufferRef, void** ppFramesOut, ma_uint64* pFrameCount)
{
ma_uint64 framesAvailable;
ma_uint64 frameCount = 0;
if (ppFramesOut != NULL) {
*ppFramesOut = NULL; /* Safety. */
}
if (pFrameCount != NULL) {
frameCount = *pFrameCount;
*pFrameCount = 0; /* Safety. */
}
if (pAudioBufferRef == NULL || ppFramesOut == NULL || pFrameCount == NULL) {
return MA_INVALID_ARGS;
}
framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor;
if (frameCount > framesAvailable) {
frameCount = framesAvailable;
}
*ppFramesOut = ma_offset_ptr(pAudioBufferRef->pData, pAudioBufferRef->cursor * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels));
*pFrameCount = frameCount;
return MA_SUCCESS;
}
MA_API ma_result ma_audio_buffer_ref_unmap(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameCount)
{
ma_uint64 framesAvailable;
if (pAudioBufferRef == NULL) {
return MA_INVALID_ARGS;
}
framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor;
if (frameCount > framesAvailable) {
return MA_INVALID_ARGS; /* The frame count was too big. This should never happen in an unmapping. Need to make sure the caller is aware of this. */
}
pAudioBufferRef->cursor += frameCount;
if (pAudioBufferRef->cursor == pAudioBufferRef->sizeInFrames) {
return MA_AT_END; /* Successful. Need to tell the caller that the end has been reached so that it can loop if desired. */
} else {
return MA_SUCCESS;
}
}
MA_API ma_bool32 ma_audio_buffer_ref_at_end(const ma_audio_buffer_ref* pAudioBufferRef)
{
if (pAudioBufferRef == NULL) {
return MA_FALSE;
}
return pAudioBufferRef->cursor == pAudioBufferRef->sizeInFrames;
}
MA_API ma_result ma_audio_buffer_ref_get_cursor_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pCursor)
{
if (pCursor == NULL) {
return MA_INVALID_ARGS;
}
*pCursor = 0;
if (pAudioBufferRef == NULL) {
return MA_INVALID_ARGS;
}
*pCursor = pAudioBufferRef->cursor;
return MA_SUCCESS;
}
MA_API ma_result ma_audio_buffer_ref_get_length_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pLength)
{
if (pLength == NULL) {
return MA_INVALID_ARGS;
}
*pLength = 0;
if (pAudioBufferRef == NULL) {
return MA_INVALID_ARGS;
}
*pLength = pAudioBufferRef->sizeInFrames;
return MA_SUCCESS;
}
MA_API ma_result ma_audio_buffer_ref_get_available_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pAvailableFrames)
{
if (pAvailableFrames == NULL) {
return MA_INVALID_ARGS;
}
*pAvailableFrames = 0;
if (pAudioBufferRef == NULL) {
return MA_INVALID_ARGS;
}
if (pAudioBufferRef->sizeInFrames <= pAudioBufferRef->cursor) {
*pAvailableFrames = 0;
} else {
*pAvailableFrames = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor;
}
return MA_SUCCESS;
}
MA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint64 sizeInFrames, const void* pData, const ma_allocation_callbacks* pAllocationCallbacks)
{
@@ -70119,6 +69873,7 @@ MA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_u
static ma_result ma_audio_buffer_init_ex(const ma_audio_buffer_config* pConfig, ma_bool32 doCopy, ma_audio_buffer* pAudioBuffer)
{
ma_result result;
ma_data_source_config dataSourceConfig;
if (pAudioBuffer == NULL) {
return MA_INVALID_ARGS;
@@ -70134,11 +69889,20 @@ static ma_result ma_audio_buffer_init_ex(const ma_audio_buffer_config* pConfig,
return MA_INVALID_ARGS; /* Not allowing buffer sizes of 0 frames. */
}
result = ma_audio_buffer_ref_init(pConfig->format, pConfig->channels, pConfig->sampleRate, NULL, 0, &pAudioBuffer->ref);
dataSourceConfig = ma_data_source_config_init();
dataSourceConfig.pVTable = &ma_gDataSourceVTable_AudioBuffer;
result = ma_data_source_base_init(&dataSourceConfig, &pAudioBuffer->ds);
if (result != MA_SUCCESS) {
return result;
}
pAudioBuffer->format = pConfig->format;
pAudioBuffer->channels = pConfig->channels;
pAudioBuffer->sampleRate = pConfig->sampleRate;
pAudioBuffer->sizeInFrames = pConfig->sizeInFrames;
pAudioBuffer->pData = pConfig->pData;
pAudioBuffer->cursor = 0;
pAudioBuffer->allocationCallbacks = ma_allocation_callbacks_init_copy(pConfig->pAllocationCallbacks);
if (doCopy) {
@@ -70161,33 +69925,16 @@ static ma_result ma_audio_buffer_init_ex(const ma_audio_buffer_config* pConfig,
ma_silence_pcm_frames(pData, pConfig->sizeInFrames, pConfig->format, pConfig->channels);
}
ma_audio_buffer_ref_set_data(&pAudioBuffer->ref, pData, pConfig->sizeInFrames);
pAudioBuffer->pData = pData;
pAudioBuffer->ownsData = MA_TRUE;
} else {
ma_audio_buffer_ref_set_data(&pAudioBuffer->ref, pConfig->pData, pConfig->sizeInFrames);
pAudioBuffer->pData = pConfig->pData;
pAudioBuffer->ownsData = MA_FALSE;
}
return MA_SUCCESS;
}
static void ma_audio_buffer_uninit_ex(ma_audio_buffer* pAudioBuffer, ma_bool32 doFree)
{
if (pAudioBuffer == NULL) {
return;
}
if (pAudioBuffer->ownsData && pAudioBuffer->ref.pData != &pAudioBuffer->_pExtraData[0]) {
ma_free((void*)pAudioBuffer->ref.pData, &pAudioBuffer->allocationCallbacks); /* Naugty const cast, but OK in this case since we've guarded it with the ownsData check. */
}
if (doFree) {
ma_free(pAudioBuffer, &pAudioBuffer->allocationCallbacks);
}
ma_audio_buffer_ref_uninit(&pAudioBuffer->ref);
}
MA_API ma_result ma_audio_buffer_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer* pAudioBuffer)
{
return ma_audio_buffer_init_ex(pConfig, MA_FALSE, pAudioBuffer);
@@ -70247,6 +69994,23 @@ MA_API ma_result ma_audio_buffer_alloc_and_init(const ma_audio_buffer_config* pC
return MA_SUCCESS;
}
static void ma_audio_buffer_uninit_ex(ma_audio_buffer* pAudioBuffer, ma_bool32 doFree)
{
if (pAudioBuffer == NULL) {
return;
}
if (pAudioBuffer->ownsData && pAudioBuffer->pData != &pAudioBuffer->_pExtraData[0]) {
ma_free((void*)pAudioBuffer->pData, &pAudioBuffer->allocationCallbacks); /* Naugty const cast, but OK in this case since we've guarded it with the ownsData check. */
}
if (doFree) {
ma_free(pAudioBuffer, &pAudioBuffer->allocationCallbacks);
}
ma_data_source_base_uninit(&pAudioBuffer->ds);
}
MA_API void ma_audio_buffer_uninit(ma_audio_buffer* pAudioBuffer)
{
ma_audio_buffer_uninit_ex(pAudioBuffer, MA_FALSE);
@@ -70259,11 +70023,39 @@ MA_API void ma_audio_buffer_uninit_and_free(ma_audio_buffer* pAudioBuffer)
MA_API ma_result ma_audio_buffer_read_pcm_frames(ma_audio_buffer* pAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
{
ma_uint64 framesAvailable;
ma_uint64 framesToRead;
if (pFramesRead != NULL) {
*pFramesRead = 0;
}
if (pAudioBuffer == NULL) {
return MA_INVALID_ARGS;
}
return ma_audio_buffer_ref_read_pcm_frames(&pAudioBuffer->ref, pFramesOut, frameCount, pFramesRead);
framesAvailable = pAudioBuffer->sizeInFrames - pAudioBuffer->cursor;
framesToRead = frameCount;
if (framesToRead > framesAvailable) {
framesToRead = framesAvailable;
}
if (pFramesOut != NULL && framesToRead > 0) {
ma_copy_pcm_frames(pFramesOut, ma_offset_ptr(pAudioBuffer->pData, pAudioBuffer->cursor * ma_get_bytes_per_frame(pAudioBuffer->format, pAudioBuffer->channels)), framesToRead, pAudioBuffer->format, pAudioBuffer->channels);
}
pAudioBuffer->cursor += framesToRead;
if (pFramesRead != NULL) {
*pFramesRead = framesToRead;
}
if (framesToRead == 0) {
return MA_AT_END;
} else {
return MA_SUCCESS;
}
}
MA_API ma_result ma_audio_buffer_seek_to_pcm_frame(ma_audio_buffer* pAudioBuffer, ma_uint64 frameIndex)
@@ -70272,33 +70064,64 @@ MA_API ma_result ma_audio_buffer_seek_to_pcm_frame(ma_audio_buffer* pAudioBuffer
return MA_INVALID_ARGS;
}
return ma_audio_buffer_ref_seek_to_pcm_frame(&pAudioBuffer->ref, frameIndex);
if (frameIndex > pAudioBuffer->sizeInFrames) {
return MA_INVALID_ARGS;
}
pAudioBuffer->cursor = (size_t)frameIndex;
return MA_SUCCESS;
}
MA_API ma_result ma_audio_buffer_map(ma_audio_buffer* pAudioBuffer, void** ppFramesOut, ma_uint64* pFrameCount)
{
ma_uint64 framesAvailable;
ma_uint64 frameCount = 0;
if (ppFramesOut != NULL) {
*ppFramesOut = NULL; /* Safety. */
}
if (pAudioBuffer == NULL) {
if (pFrameCount != NULL) {
*pFrameCount = 0;
}
if (pFrameCount != NULL) {
frameCount = *pFrameCount;
*pFrameCount = 0; /* Safety. */
}
if (pAudioBuffer == NULL || ppFramesOut == NULL || pFrameCount == NULL) {
return MA_INVALID_ARGS;
}
return ma_audio_buffer_ref_map(&pAudioBuffer->ref, ppFramesOut, pFrameCount);
framesAvailable = pAudioBuffer->sizeInFrames - pAudioBuffer->cursor;
if (frameCount > framesAvailable) {
frameCount = framesAvailable;
}
*ppFramesOut = ma_offset_ptr(pAudioBuffer->pData, pAudioBuffer->cursor * ma_get_bytes_per_frame(pAudioBuffer->format, pAudioBuffer->channels));
*pFrameCount = frameCount;
return MA_SUCCESS;
}
MA_API ma_result ma_audio_buffer_unmap(ma_audio_buffer* pAudioBuffer, ma_uint64 frameCount)
{
ma_uint64 framesAvailable;
if (pAudioBuffer == NULL) {
return MA_INVALID_ARGS;
}
return ma_audio_buffer_ref_unmap(&pAudioBuffer->ref, frameCount);
framesAvailable = pAudioBuffer->sizeInFrames - pAudioBuffer->cursor;
if (frameCount > framesAvailable) {
return MA_INVALID_ARGS; /* The frame count was too big. This should never happen in an unmapping. Need to make sure the caller is aware of this. */
}
pAudioBuffer->cursor += frameCount;
if (pAudioBuffer->cursor == pAudioBuffer->sizeInFrames) {
return MA_AT_END; /* Successful. Need to tell the caller that the end has been reached so that it can loop if desired. */
} else {
return MA_SUCCESS;
}
}
MA_API ma_bool32 ma_audio_buffer_at_end(const ma_audio_buffer* pAudioBuffer)
@@ -70307,25 +70130,41 @@ MA_API ma_bool32 ma_audio_buffer_at_end(const ma_audio_buffer* pAudioBuffer)
return MA_FALSE;
}
return ma_audio_buffer_ref_at_end(&pAudioBuffer->ref);
return pAudioBuffer->cursor == pAudioBuffer->sizeInFrames;
}
MA_API ma_result ma_audio_buffer_get_cursor_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pCursor)
{
if (pCursor == NULL) {
return MA_INVALID_ARGS;
}
*pCursor = 0;
if (pAudioBuffer == NULL) {
return MA_INVALID_ARGS;
}
return ma_audio_buffer_ref_get_cursor_in_pcm_frames(&pAudioBuffer->ref, pCursor);
*pCursor = pAudioBuffer->cursor;
return MA_SUCCESS;
}
MA_API ma_result ma_audio_buffer_get_length_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pLength)
{
if (pLength == NULL) {
return MA_INVALID_ARGS;
}
*pLength = 0;
if (pAudioBuffer == NULL) {
return MA_INVALID_ARGS;
}
return ma_audio_buffer_ref_get_length_in_pcm_frames(&pAudioBuffer->ref, pLength);
*pLength = pAudioBuffer->sizeInFrames;
return MA_SUCCESS;
}
MA_API ma_result ma_audio_buffer_get_available_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pAvailableFrames)
@@ -70340,7 +70179,13 @@ MA_API ma_result ma_audio_buffer_get_available_frames(const ma_audio_buffer* pAu
return MA_INVALID_ARGS;
}
return ma_audio_buffer_ref_get_available_frames(&pAudioBuffer->ref, pAvailableFrames);
if (pAudioBuffer->sizeInFrames <= pAudioBuffer->cursor) {
*pAvailableFrames = 0;
} else {
*pAvailableFrames = pAudioBuffer->sizeInFrames - pAudioBuffer->cursor;
}
return MA_SUCCESS;
}