Commit 5303558a authored by David Reid's avatar David Reid

Add ma_resource_manager_data_source_get_available_frames().

parent 0336896c
...@@ -50,9 +50,10 @@ useful to be told exactly what it being allocated so you can optimize your alloc ...@@ -50,9 +50,10 @@ useful to be told exactly what it being allocated so you can optimize your alloc
#define MA_ALLOCATION_TYPE_AUDIO_BUFFER 0x00000005 /* A ma_audio_buffer allocation. */ #define MA_ALLOCATION_TYPE_AUDIO_BUFFER 0x00000005 /* A ma_audio_buffer allocation. */
#define MA_ALLOCATION_TYPE_ENCODED_BUFFER 0x00000006 /* Allocation for encoded audio data containing the raw file data of a sound file. */ #define MA_ALLOCATION_TYPE_ENCODED_BUFFER 0x00000006 /* Allocation for encoded audio data containing the raw file data of a sound file. */
#define MA_ALLOCATION_TYPE_DECODED_BUFFER 0x00000007 /* Allocation for decoded audio data from a sound file. */ #define MA_ALLOCATION_TYPE_DECODED_BUFFER 0x00000007 /* Allocation for decoded audio data from a sound file. */
#define MA_ALLOCATION_TYPE_RESOURCE_MANAGER_DATA_BUFFER 0x00000010 /* A ma_resource_manager_data_buffer object. */ #define MA_ALLOCATION_TYPE_RESOURCE_MANAGER_DATA_BUFFER_NODE 0x00000010 /* A ma_resource_manager_data_buffer_node object. */
#define MA_ALLOCATION_TYPE_RESOURCE_MANAGER_DATA_STREAM 0x00000011 /* A ma_resource_manager_data_stream object. */ #define MA_ALLOCATION_TYPE_RESOURCE_MANAGER_DATA_BUFFER 0x00000011 /* A ma_resource_manager_data_buffer object. */
#define MA_ALLOCATION_TYPE_RESOURCE_MANAGER_DATA_SOURCE 0x00000012 /* A ma_resource_manager_data_source object. */ #define MA_ALLOCATION_TYPE_RESOURCE_MANAGER_DATA_STREAM 0x00000012 /* A ma_resource_manager_data_stream object. */
#define MA_ALLOCATION_TYPE_RESOURCE_MANAGER_DATA_SOURCE 0x00000013 /* A ma_resource_manager_data_source object. */
/* /*
Resource Management Resource Management
...@@ -639,13 +640,16 @@ struct ma_resource_manager ...@@ -639,13 +640,16 @@ struct ma_resource_manager
MA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pConfig, ma_resource_manager* pResourceManager); MA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pConfig, ma_resource_manager* pResourceManager);
MA_API void ma_resource_manager_uninit(ma_resource_manager* pResourceManager); MA_API void ma_resource_manager_uninit(ma_resource_manager* pResourceManager);
/* Registration. */
MA_API ma_result ma_resource_manager_register_decoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate); /* Does not copy. Increments the reference count if already exists and returns MA_SUCCESS. */
MA_API ma_result ma_resource_manager_register_encoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, size_t sizeInBytes); /* Does not copy. Increments the reference count if already exists and returns MA_SUCCESS. */
MA_API ma_result ma_resource_manager_unregister_data(ma_resource_manager* pResourceManager, const char* pName);
/* Data Buffers. */ /* Data Buffers. */
MA_API ma_result ma_resource_manager_data_buffer_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_resource_manager_data_buffer_encoding type, ma_bool32 async, ma_event* pEvent, ma_resource_manager_data_buffer** ppDataBuffer); MA_API ma_result ma_resource_manager_data_buffer_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_resource_manager_data_buffer_encoding type, ma_bool32 async, ma_event* pEvent, ma_resource_manager_data_buffer** ppDataBuffer);
MA_API ma_result ma_resource_manager_data_buffer_uninit(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer* pDataBuffer); MA_API ma_result ma_resource_manager_data_buffer_uninit(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer* pDataBuffer);
MA_API ma_result ma_resource_manager_data_buffer_result(ma_resource_manager* pResourceManager, const ma_resource_manager_data_buffer* pDataBuffer); MA_API ma_result ma_resource_manager_data_buffer_result(ma_resource_manager* pResourceManager, const ma_resource_manager_data_buffer* pDataBuffer);
MA_API ma_result ma_resource_manager_register_decoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate); /* Does not copy. Increments the reference count if already exists and returns MA_SUCCESS. */ MA_API ma_result ma_resource_manager_data_buffer_get_available_frames(ma_resource_manager* pResourceManager, const ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pAvailableFrames);
MA_API ma_result ma_resource_manager_register_encoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, size_t sizeInBytes); /* Does not copy. Increments the reference count if already exists and returns MA_SUCCESS. */
MA_API ma_result ma_resource_manager_unregister_data(ma_resource_manager* pResourceManager, const char* pName);
/* Data Streams. */ /* Data Streams. */
MA_API ma_result ma_resource_manager_data_stream_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_event* pEvent, ma_resource_manager_data_stream* pDataStream); MA_API ma_result ma_resource_manager_data_stream_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_event* pEvent, ma_resource_manager_data_stream* pDataStream);
...@@ -658,6 +662,7 @@ MA_API ma_result ma_resource_manager_data_stream_seek_to_pcm_frame(ma_resource_m ...@@ -658,6 +662,7 @@ MA_API ma_result ma_resource_manager_data_stream_seek_to_pcm_frame(ma_resource_m
MA_API ma_result ma_resource_manager_data_stream_map_paged_pcm_frames(ma_resource_manager* pResourceManager, ma_resource_manager_data_stream* pDataStream, void** ppFramesOut, ma_uint64* pFrameCount); MA_API ma_result ma_resource_manager_data_stream_map_paged_pcm_frames(ma_resource_manager* pResourceManager, ma_resource_manager_data_stream* pDataStream, void** ppFramesOut, ma_uint64* pFrameCount);
MA_API ma_result ma_resource_manager_data_stream_unmap_paged_pcm_frames(ma_resource_manager* pResourceManager, ma_resource_manager_data_stream* pDataStream, ma_uint64 frameCount); MA_API ma_result ma_resource_manager_data_stream_unmap_paged_pcm_frames(ma_resource_manager* pResourceManager, ma_resource_manager_data_stream* pDataStream, ma_uint64 frameCount);
MA_API ma_result ma_resource_manager_data_stream_get_data_format(ma_resource_manager* pResourceManager, ma_resource_manager_data_stream* pDataStream, ma_format* pFormat, ma_uint32* pChannels); MA_API ma_result ma_resource_manager_data_stream_get_data_format(ma_resource_manager* pResourceManager, ma_resource_manager_data_stream* pDataStream, ma_format* pFormat, ma_uint32* pChannels);
MA_API ma_result ma_resource_manager_data_stream_get_available_frames(ma_resource_manager* pResourceManager, const ma_resource_manager_data_stream* pDataStream, ma_uint64* pAvailableFrames);
/* Data Sources. */ /* Data Sources. */
MA_API ma_result ma_resource_manager_data_source_init(ma_resource_manager* pResourceManager, const char* pName, ma_uint32 flags, ma_resource_manager_data_source* pDataSource); MA_API ma_result ma_resource_manager_data_source_init(ma_resource_manager* pResourceManager, const char* pName, ma_uint32 flags, ma_resource_manager_data_source* pDataSource);
...@@ -667,6 +672,7 @@ MA_API ma_result ma_resource_manager_data_source_set_looping(ma_resource_manager ...@@ -667,6 +672,7 @@ MA_API ma_result ma_resource_manager_data_source_set_looping(ma_resource_manager
MA_API ma_result ma_resource_manager_data_source_get_looping(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source* pDataSource, ma_bool32* pIsLooping); MA_API ma_result ma_resource_manager_data_source_get_looping(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source* pDataSource, ma_bool32* pIsLooping);
MA_API ma_result ma_resource_manager_data_source_read_pcm_frames(ma_resource_manager_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead); MA_API ma_result ma_resource_manager_data_source_read_pcm_frames(ma_resource_manager_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);
MA_API ma_result ma_resource_manager_data_source_seek_to_pcm_frame(ma_resource_manager_data_source* pDataSource, ma_uint64 frameIndex); MA_API ma_result ma_resource_manager_data_source_seek_to_pcm_frame(ma_resource_manager_data_source* pDataSource, ma_uint64 frameIndex);
MA_API ma_result ma_resource_manager_data_source_get_available_frames(const ma_resource_manager_data_source* pDataSource, ma_uint64* pAvailableFrames);
/* Job management. */ /* Job management. */
MA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob); MA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob);
...@@ -2203,6 +2209,35 @@ MA_API ma_result ma_resource_manager_data_buffer_result(ma_resource_manager* pRe ...@@ -2203,6 +2209,35 @@ MA_API ma_result ma_resource_manager_data_buffer_result(ma_resource_manager* pRe
return pDataBuffer->result; return pDataBuffer->result;
} }
MA_API ma_result ma_resource_manager_data_buffer_get_available_frames(ma_resource_manager* pResourceManager, const ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pAvailableFrames)
{
ma_uint64 availableFrames = 0;
if (pAvailableFrames == NULL) {
return MA_INVALID_ARGS;
}
*pAvailableFrames = 0;
if (pResourceManager == NULL || pDataBuffer == NULL) {
return MA_INVALID_ARGS;
}
if (pDataBuffer->data.type == ma_resource_manager_data_buffer_encoding_decoded) {
if (pDataBuffer->data.decoded.decodedFrameCount < pDataBuffer->data.decoded.frameCount) {
/* TODO: Implement me. */
#if 0
if (pDataBuffer->data.decoded.decodedFrameCount > pDataBuffer->cursor) {
availableFrames = pDataBuffer->data.decoded.decodedFrameCount - pDataBuffer->cursor;
}
#endif
}
}
*pAvailableFrames = availableFrames;
return MA_SUCCESS;
}
static ma_result ma_resource_manager_register_data(ma_resource_manager* pResourceManager, const char* pName, ma_resource_manager_data_buffer_encoding type, ma_resource_manager_memory_buffer* pExistingData, ma_event* pEvent, ma_resource_manager_data_buffer** ppDataBuffer) static ma_result ma_resource_manager_register_data(ma_resource_manager* pResourceManager, const char* pName, ma_resource_manager_data_buffer_encoding type, ma_resource_manager_memory_buffer* pExistingData, ma_event* pEvent, ma_resource_manager_data_buffer** ppDataBuffer)
{ {
...@@ -2685,6 +2720,39 @@ MA_API ma_result ma_resource_manager_data_stream_get_data_format(ma_resource_man ...@@ -2685,6 +2720,39 @@ MA_API ma_result ma_resource_manager_data_stream_get_data_format(ma_resource_man
return ma_data_source_get_data_format(&pDataStream->decoder, pFormat, pChannels); return ma_data_source_get_data_format(&pDataStream->decoder, pFormat, pChannels);
} }
MA_API ma_result ma_resource_manager_data_stream_get_available_frames(ma_resource_manager* pResourceManager, const ma_resource_manager_data_stream* pDataStream, ma_uint64* pAvailableFrames)
{
volatile ma_uint32 pageIndex0;
volatile ma_uint32 pageIndex1;
volatile ma_uint32 relativeCursor;
ma_uint64 availableFrames;
if (pAvailableFrames == NULL) {
return MA_INVALID_ARGS;
}
*pAvailableFrames = 0;
if (pResourceManager == NULL || pDataStream == NULL) {
return MA_INVALID_ARGS;
}
pageIndex0 = pDataStream->currentPageIndex;
pageIndex1 = (pDataStream->currentPageIndex + 1) & 0x01;
relativeCursor = pDataStream->relativeCursor;
availableFrames = 0;
if (pDataStream->isPageValid[pageIndex0]) {
availableFrames += pDataStream->pageFrameCount[pageIndex0] - relativeCursor;
if (pDataStream->isPageValid[pageIndex1]) {
availableFrames += pDataStream->pageFrameCount[pageIndex1];
}
}
*pAvailableFrames = availableFrames;
return MA_SUCCESS;
}
static ma_uint32 ma_resource_manager_data_source_next_execution_order(ma_resource_manager_data_source* pDataSource) static ma_uint32 ma_resource_manager_data_source_next_execution_order(ma_resource_manager_data_source* pDataSource)
...@@ -2863,7 +2931,7 @@ static ma_data_source* ma_resource_manager_data_source_get_buffer_connector(ma_r ...@@ -2863,7 +2931,7 @@ static ma_data_source* ma_resource_manager_data_source_get_buffer_connector(ma_r
} }
} }
static ma_result ma_resource_manager_data_source_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) static ma_result ma_resource_manager_data_source_read__buffer(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
{ {
ma_result result; ma_result result;
ma_uint64 framesRead; ma_uint64 framesRead;
...@@ -2908,7 +2976,7 @@ static ma_result ma_resource_manager_data_source_read(ma_data_source* pDataSourc ...@@ -2908,7 +2976,7 @@ static ma_result ma_resource_manager_data_source_read(ma_data_source* pDataSourc
return result; return result;
} }
static ma_result ma_resource_manager_data_source_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) static ma_result ma_resource_manager_data_source_seek__buffer(ma_data_source* pDataSource, ma_uint64 frameIndex)
{ {
ma_result result; ma_result result;
ma_resource_manager_data_source* pRMDataSource = (ma_resource_manager_data_source*)pDataSource; ma_resource_manager_data_source* pRMDataSource = (ma_resource_manager_data_source*)pDataSource;
...@@ -2935,7 +3003,7 @@ static ma_result ma_resource_manager_data_source_seek(ma_data_source* pDataSourc ...@@ -2935,7 +3003,7 @@ static ma_result ma_resource_manager_data_source_seek(ma_data_source* pDataSourc
return MA_SUCCESS; return MA_SUCCESS;
} }
static ma_result ma_resource_manager_data_source_map(ma_data_source* pDataSource, void** ppFramesOut, ma_uint64* pFrameCount) static ma_result ma_resource_manager_data_source_map__buffer(ma_data_source* pDataSource, void** ppFramesOut, ma_uint64* pFrameCount)
{ {
ma_result result; ma_result result;
ma_bool32 skipBusyCheck = MA_FALSE; ma_bool32 skipBusyCheck = MA_FALSE;
...@@ -2970,7 +3038,7 @@ static ma_result ma_resource_manager_data_source_map(ma_data_source* pDataSource ...@@ -2970,7 +3038,7 @@ static ma_result ma_resource_manager_data_source_map(ma_data_source* pDataSource
return ma_data_source_map(ma_resource_manager_data_source_get_buffer_connector(pRMDataSource), ppFramesOut, pFrameCount); return ma_data_source_map(ma_resource_manager_data_source_get_buffer_connector(pRMDataSource), ppFramesOut, pFrameCount);
} }
static ma_result ma_resource_manager_data_source_unmap(ma_data_source* pDataSource, ma_uint64 frameCount) static ma_result ma_resource_manager_data_source_unmap__buffer(ma_data_source* pDataSource, ma_uint64 frameCount)
{ {
ma_result result; ma_result result;
ma_resource_manager_data_source* pRMDataSource = (ma_resource_manager_data_source*)pDataSource; ma_resource_manager_data_source* pRMDataSource = (ma_resource_manager_data_source*)pDataSource;
...@@ -2989,7 +3057,7 @@ static ma_result ma_resource_manager_data_source_unmap(ma_data_source* pDataSour ...@@ -2989,7 +3057,7 @@ static ma_result ma_resource_manager_data_source_unmap(ma_data_source* pDataSour
return result; return result;
} }
static ma_result ma_resource_manager_data_source_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels) static ma_result ma_resource_manager_data_source_get_data_format__buffer(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels)
{ {
ma_resource_manager_data_source* pRMDataSource = (ma_resource_manager_data_source*)pDataSource; ma_resource_manager_data_source* pRMDataSource = (ma_resource_manager_data_source*)pDataSource;
MA_ASSERT(pRMDataSource != NULL); MA_ASSERT(pRMDataSource != NULL);
...@@ -3138,11 +3206,11 @@ static ma_result ma_resource_manager_data_source_init_buffer(ma_resource_manager ...@@ -3138,11 +3206,11 @@ static ma_result ma_resource_manager_data_source_init_buffer(ma_resource_manager
} }
/* At this point we have our data buffer and we can start initializing the data source. */ /* At this point we have our data buffer and we can start initializing the data source. */
pDataSource->ds.onRead = ma_resource_manager_data_source_read; pDataSource->ds.onRead = ma_resource_manager_data_source_read__buffer;
pDataSource->ds.onSeek = ma_resource_manager_data_source_seek; pDataSource->ds.onSeek = ma_resource_manager_data_source_seek__buffer;
pDataSource->ds.onMap = ma_resource_manager_data_source_map; pDataSource->ds.onMap = ma_resource_manager_data_source_map__buffer;
pDataSource->ds.onUnmap = ma_resource_manager_data_source_unmap; pDataSource->ds.onUnmap = ma_resource_manager_data_source_unmap__buffer;
pDataSource->ds.onGetDataFormat = ma_resource_manager_data_source_get_data_format; pDataSource->ds.onGetDataFormat = ma_resource_manager_data_source_get_data_format__buffer;
pDataSource->dataBuffer.pDataBuffer = pDataBuffer; pDataSource->dataBuffer.pDataBuffer = pDataBuffer;
pDataSource->dataBuffer.connectorType = ma_resource_manager_data_buffer_connector_unknown; /* The backend type hasn't been determined yet - that happens when it's initialized properly by the job thread. */ pDataSource->dataBuffer.connectorType = ma_resource_manager_data_buffer_connector_unknown; /* The backend type hasn't been determined yet - that happens when it's initialized properly by the job thread. */
pDataSource->result = MA_BUSY; pDataSource->result = MA_BUSY;
...@@ -3312,6 +3380,25 @@ MA_API ma_result ma_resource_manager_data_source_seek_to_pcm_frame(ma_resource_m ...@@ -3312,6 +3380,25 @@ MA_API ma_result ma_resource_manager_data_source_seek_to_pcm_frame(ma_resource_m
return ma_data_source_seek_to_pcm_frame(pDataSource, frameIndex); return ma_data_source_seek_to_pcm_frame(pDataSource, frameIndex);
} }
MA_API ma_result ma_resource_manager_data_source_get_available_frames(const ma_resource_manager_data_source* pDataSource, ma_uint64* pAvailableFrames)
{
if (pAvailableFrames == NULL) {
return MA_INVALID_ARGS;
}
*pAvailableFrames = 0;
if (pDataSource == NULL) {
return MA_INVALID_ARGS;
}
if ((pDataSource->flags & MA_DATA_SOURCE_FLAG_STREAM) != 0) {
return ma_resource_manager_data_stream_get_available_frames(pDataSource->pResourceManager, &pDataSource->dataStream.stream, pAvailableFrames);
} else {
return ma_resource_manager_data_buffer_get_available_frames(pDataSource->pResourceManager, pDataSource->dataBuffer.pDataBuffer, pAvailableFrames);
}
}
MA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob) MA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment