Commit 29ef420e authored by David Reid's avatar David Reid

API CHANGE: Update ma_decoder_read_pcm_frames().

This makes ma_decoder_read_pcm_frames() consistent with other data
sources. It now returns a result code and outputs the number of frames
read via an output parameter.
parent 23993590
...@@ -37,7 +37,7 @@ int main(int argc, char** argv) ...@@ -37,7 +37,7 @@ int main(int argc, char** argv)
return -1; return -1;
} }
encoderConfig = ma_encoder_config_init(ma_resource_format_wav, ma_format_f32, 2, 44100); encoderConfig = ma_encoder_config_init(ma_encoding_format_wav, ma_format_f32, 2, 44100);
if (ma_encoder_init_file(argv[1], &encoderConfig, &encoder) != MA_SUCCESS) { if (ma_encoder_init_file(argv[1], &encoderConfig, &encoder) != MA_SUCCESS) {
printf("Failed to initialize output file.\n"); printf("Failed to initialize output file.\n");
......
...@@ -44,7 +44,7 @@ int main(int argc, char** argv) ...@@ -44,7 +44,7 @@ int main(int argc, char** argv)
return -1; return -1;
} }
encoderConfig = ma_encoder_config_init(ma_resource_format_wav, ma_format_f32, 2, 44100); encoderConfig = ma_encoder_config_init(ma_encoding_format_wav, ma_format_f32, 2, 44100);
if (ma_encoder_init_file(argv[1], &encoderConfig, &encoder) != MA_SUCCESS) { if (ma_encoder_init_file(argv[1], &encoderConfig, &encoder) != MA_SUCCESS) {
printf("Failed to initialize output file.\n"); printf("Failed to initialize output file.\n");
......
...@@ -61,7 +61,7 @@ ma_uint32 read_and_mix_pcm_frames_f32(ma_decoder* pDecoder, float* pOutputF32, m ...@@ -61,7 +61,7 @@ ma_uint32 read_and_mix_pcm_frames_f32(ma_decoder* pDecoder, float* pOutputF32, m
framesToReadThisIteration = totalFramesRemaining; framesToReadThisIteration = totalFramesRemaining;
} }
framesReadThisIteration = (ma_uint32)ma_decoder_read_pcm_frames(pDecoder, temp, framesToReadThisIteration); framesReadThisIteration = (ma_uint32)ma_decoder_read_pcm_frames(pDecoder, temp, framesToReadThisIteration, NULL);
if (framesReadThisIteration == 0) { if (framesReadThisIteration == 0) {
break; break;
} }
......
...@@ -22,7 +22,7 @@ void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uin ...@@ -22,7 +22,7 @@ void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uin
return; return;
} }
ma_decoder_read_pcm_frames(pDecoder, pOutput, frameCount); ma_decoder_read_pcm_frames(pDecoder, pOutput, frameCount, NULL);
(void)pInput; (void)pInput;
} }
......
...@@ -6256,7 +6256,7 @@ Reads PCM frames from the given decoder. ...@@ -6256,7 +6256,7 @@ Reads PCM frames from the given decoder.
This is not thread safe without your own synchronization. This is not thread safe without your own synchronization.
*/ */
MA_API ma_uint64 ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount); MA_API ma_result ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);
/* /*
Seeks to a PCM frame based on it's absolute index. Seeks to a PCM frame based on it's absolute index.
...@@ -49583,17 +49583,7 @@ static ma_result ma_decoder__init_allocation_callbacks(const ma_decoder_config* ...@@ -49583,17 +49583,7 @@ static ma_result ma_decoder__init_allocation_callbacks(const ma_decoder_config*
static ma_result ma_decoder__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead) static ma_result ma_decoder__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
{ {
ma_uint64 framesRead = ma_decoder_read_pcm_frames((ma_decoder*)pDataSource, pFramesOut, frameCount); return ma_decoder_read_pcm_frames((ma_decoder*)pDataSource, pFramesOut, frameCount, pFramesRead);
if (pFramesRead != NULL) {
*pFramesRead = framesRead;
}
if (framesRead == 0) {
return MA_AT_END;
}
return MA_SUCCESS;
} }
static ma_result ma_decoder__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex) static ma_result ma_decoder__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)
...@@ -49614,16 +49604,12 @@ static ma_result ma_decoder__data_source_on_get_data_format(ma_data_source* pDat ...@@ -49614,16 +49604,12 @@ static ma_result ma_decoder__data_source_on_get_data_format(ma_data_source* pDat
static ma_result ma_decoder__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor) static ma_result ma_decoder__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)
{ {
ma_decoder* pDecoder = (ma_decoder*)pDataSource; return ma_decoder_get_cursor_in_pcm_frames((ma_decoder*)pDataSource, pCursor);
return ma_decoder_get_cursor_in_pcm_frames(pDecoder, pCursor);
} }
static ma_result ma_decoder__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength) static ma_result ma_decoder__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength)
{ {
ma_decoder* pDecoder = (ma_decoder*)pDataSource; return ma_decoder_get_length_in_pcm_frames((ma_decoder*)pDataSource, pLength);
return ma_decoder_get_length_in_pcm_frames(pDecoder, pLength);
} }
static ma_data_source_vtable g_ma_decoder_data_source_vtable = static ma_data_source_vtable g_ma_decoder_data_source_vtable =
...@@ -50447,19 +50433,23 @@ MA_API ma_result ma_decoder_get_length_in_pcm_frames(ma_decoder* pDecoder, ma_ui ...@@ -50447,19 +50433,23 @@ MA_API ma_result ma_decoder_get_length_in_pcm_frames(ma_decoder* pDecoder, ma_ui
} }
} }
MA_API ma_uint64 ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount) MA_API ma_result ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)
{ {
ma_result result; ma_result result = MA_SUCCESS;
ma_uint64 totalFramesReadOut; ma_uint64 totalFramesReadOut;
ma_uint64 totalFramesReadIn; ma_uint64 totalFramesReadIn;
void* pRunningFramesOut; void* pRunningFramesOut;
if (pFramesRead != NULL) {
*pFramesRead = 0; /* Safety. */
}
if (pDecoder == NULL) { if (pDecoder == NULL) {
return 0; return MA_INVALID_ARGS;
} }
if (pDecoder->pBackend == NULL) { if (pDecoder->pBackend == NULL) {
return 0; return MA_INVALID_OPERATION;
} }
/* Fast path. */ /* Fast path. */
...@@ -50483,7 +50473,7 @@ MA_API ma_uint64 ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesO ...@@ -50483,7 +50473,7 @@ MA_API ma_uint64 ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesO
result = ma_data_source_get_data_format(pDecoder->pBackend, &internalFormat, &internalChannels, NULL); result = ma_data_source_get_data_format(pDecoder->pBackend, &internalFormat, &internalChannels, NULL);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
return 0; /* Failed to retrieve the internal format and channel count. */ return result; /* Failed to retrieve the internal format and channel count. */
} }
while (totalFramesReadOut < frameCount) { while (totalFramesReadOut < frameCount) {
...@@ -50538,7 +50528,11 @@ MA_API ma_uint64 ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesO ...@@ -50538,7 +50528,11 @@ MA_API ma_uint64 ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesO
pDecoder->readPointerInPCMFrames += totalFramesReadOut; pDecoder->readPointerInPCMFrames += totalFramesReadOut;
return totalFramesReadOut; if (pFramesRead != NULL) {
*pFramesRead = totalFramesReadOut;
}
return result;
} }
MA_API ma_result ma_decoder_seek_to_pcm_frame(ma_decoder* pDecoder, ma_uint64 frameIndex) MA_API ma_result ma_decoder_seek_to_pcm_frame(ma_decoder* pDecoder, ma_uint64 frameIndex)
...@@ -50607,6 +50601,7 @@ MA_API ma_result ma_decoder_get_available_frames(ma_decoder* pDecoder, ma_uint64 ...@@ -50607,6 +50601,7 @@ MA_API ma_result ma_decoder_get_available_frames(ma_decoder* pDecoder, ma_uint64
static ma_result ma_decoder__full_decode_and_uninit(ma_decoder* pDecoder, ma_decoder_config* pConfigOut, ma_uint64* pFrameCountOut, void** ppPCMFramesOut) static ma_result ma_decoder__full_decode_and_uninit(ma_decoder* pDecoder, ma_decoder_config* pConfigOut, ma_uint64* pFrameCountOut, void** ppPCMFramesOut)
{ {
ma_result result;
ma_uint64 totalFrameCount; ma_uint64 totalFrameCount;
ma_uint64 bpf; ma_uint64 bpf;
ma_uint64 dataCapInFrames; ma_uint64 dataCapInFrames;
...@@ -50652,9 +50647,13 @@ static ma_result ma_decoder__full_decode_and_uninit(ma_decoder* pDecoder, ma_dec ...@@ -50652,9 +50647,13 @@ static ma_result ma_decoder__full_decode_and_uninit(ma_decoder* pDecoder, ma_dec
frameCountToTryReading = dataCapInFrames - totalFrameCount; frameCountToTryReading = dataCapInFrames - totalFrameCount;
MA_ASSERT(frameCountToTryReading > 0); MA_ASSERT(frameCountToTryReading > 0);
framesJustRead = ma_decoder_read_pcm_frames(pDecoder, (ma_uint8*)pPCMFramesOut + (totalFrameCount * bpf), frameCountToTryReading); result = ma_decoder_read_pcm_frames(pDecoder, (ma_uint8*)pPCMFramesOut + (totalFrameCount * bpf), frameCountToTryReading, &framesJustRead);
totalFrameCount += framesJustRead; totalFrameCount += framesJustRead;
if (result != MA_SUCCESS) {
break;
}
if (framesJustRead < frameCountToTryReading) { if (framesJustRead < frameCountToTryReading) {
break; break;
} }
...@@ -79,18 +79,18 @@ int main(int argc, char** argv) ...@@ -79,18 +79,18 @@ int main(int argc, char** argv)
loadNotification.cb.onSignal = on_sound_loaded; loadNotification.cb.onSignal = on_sound_loaded;
loadNotification.pSound = &sound; loadNotification.pSound = &sound;
result = ma_sound_init_from_file(&engine, argv[1], MA_DATA_SOURCE_FLAG_DECODE | MA_DATA_SOURCE_FLAG_ASYNC /*| MA_DATA_SOURCE_FLAG_STREAM*/, &group, NULL, &baseSound); result = ma_sound_init_from_file(&engine, argv[1], MA_DATA_SOURCE_FLAG_DECODE | MA_DATA_SOURCE_FLAG_ASYNC | MA_DATA_SOURCE_FLAG_STREAM, &group, NULL, &sound);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
printf("Failed to load sound: %s\n", argv[1]); printf("Failed to load sound: %s\n", argv[1]);
ma_engine_uninit(&engine); ma_engine_uninit(&engine);
return -1; return -1;
} }
result = ma_sound_init_copy(&engine, &baseSound, 0, &group, &sound); /*result = ma_sound_init_copy(&engine, &baseSound, 0, &group, &sound);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
printf("Failed to copy sound.\n"); printf("Failed to copy sound.\n");
return -1; return -1;
} }*/
#if 0 #if 0
result = ma_sound_init_from_file(&engine, argv[1], MA_DATA_SOURCE_FLAG_DECODE /*| MA_DATA_SOURCE_FLAG_ASYNC | MA_DATA_SOURCE_FLAG_STREAM*/, NULL, &sound2); result = ma_sound_init_from_file(&engine, argv[1], MA_DATA_SOURCE_FLAG_DECODE /*| MA_DATA_SOURCE_FLAG_ASYNC | MA_DATA_SOURCE_FLAG_STREAM*/, NULL, &sound2);
......
...@@ -7832,7 +7832,7 @@ static ma_result ma_resource_manager_data_buffer_node_decode_next_page(ma_resour ...@@ -7832,7 +7832,7 @@ static ma_result ma_resource_manager_data_buffer_node_decode_next_page(ma_resour
); );
MA_ASSERT(pDst != NULL); MA_ASSERT(pDst != NULL);
framesRead = ma_decoder_read_pcm_frames(pDecoder, pDst, framesToTryReading); result = ma_decoder_read_pcm_frames(pDecoder, pDst, framesToTryReading, &framesRead);
if (framesRead > 0) { if (framesRead > 0) {
pDataBufferNode->data.decoded.decodedFrameCount += framesRead; pDataBufferNode->data.decoded.decodedFrameCount += framesRead;
} }
...@@ -7848,7 +7848,7 @@ static ma_result ma_resource_manager_data_buffer_node_decode_next_page(ma_resour ...@@ -7848,7 +7848,7 @@ static ma_result ma_resource_manager_data_buffer_node_decode_next_page(ma_resour
return result; return result;
} }
framesRead = ma_decoder_read_pcm_frames(pDecoder, pPage->pAudioData, framesToTryReading); result = ma_decoder_read_pcm_frames(pDecoder, pPage->pAudioData, framesToTryReading, &framesRead);
if (framesRead > 0) { if (framesRead > 0) {
pPage->sizeInFrames = framesRead; pPage->sizeInFrames = framesRead;
...@@ -9113,6 +9113,7 @@ static void* ma_resource_manager_data_stream_get_page_data_pointer(ma_resource_m ...@@ -9113,6 +9113,7 @@ static void* ma_resource_manager_data_stream_get_page_data_pointer(ma_resource_m
static void ma_resource_manager_data_stream_fill_page(ma_resource_manager_data_stream* pDataStream, ma_uint32 pageIndex) static void ma_resource_manager_data_stream_fill_page(ma_resource_manager_data_stream* pDataStream, ma_uint32 pageIndex)
{ {
ma_result result = MA_SUCCESS;
ma_bool32 isLooping; ma_bool32 isLooping;
ma_uint64 pageSizeInFrames; ma_uint64 pageSizeInFrames;
ma_uint64 totalFramesReadForThisPage = 0; ma_uint64 totalFramesReadForThisPage = 0;
...@@ -9128,23 +9129,28 @@ static void ma_resource_manager_data_stream_fill_page(ma_resource_manager_data_s ...@@ -9128,23 +9129,28 @@ static void ma_resource_manager_data_stream_fill_page(ma_resource_manager_data_s
ma_uint64 framesRead; ma_uint64 framesRead;
framesRemaining = pageSizeInFrames - totalFramesReadForThisPage; framesRemaining = pageSizeInFrames - totalFramesReadForThisPage;
framesRead = ma_decoder_read_pcm_frames(&pDataStream->decoder, ma_offset_pcm_frames_ptr(pPageData, totalFramesReadForThisPage, pDataStream->decoder.outputFormat, pDataStream->decoder.outputChannels), framesRemaining); result = ma_decoder_read_pcm_frames(&pDataStream->decoder, ma_offset_pcm_frames_ptr(pPageData, totalFramesReadForThisPage, pDataStream->decoder.outputFormat, pDataStream->decoder.outputChannels), framesRemaining, &framesRead);
totalFramesReadForThisPage += framesRead; totalFramesReadForThisPage += framesRead;
/* Loop back to the start if we reached the end. We'll also have a known length at this point as well. */ /* Loop back to the start if we reached the end. We'll also have a known length at this point as well. */
if (framesRead < framesRemaining) { if (result == MA_AT_END || framesRead < framesRemaining) {
if (pDataStream->totalLengthInPCMFrames == 0) { if (pDataStream->totalLengthInPCMFrames == 0) {
ma_decoder_get_cursor_in_pcm_frames(&pDataStream->decoder, &pDataStream->totalLengthInPCMFrames); ma_decoder_get_cursor_in_pcm_frames(&pDataStream->decoder, &pDataStream->totalLengthInPCMFrames);
} }
ma_decoder_seek_to_pcm_frame(&pDataStream->decoder, 0); ma_decoder_seek_to_pcm_frame(&pDataStream->decoder, 0);
result = MA_SUCCESS; /* Clear the AT_END result so we don't incorrectly mark this looping stream as at the end and then have it stopped. */
}
if (result != MA_SUCCESS && result != MA_AT_END) {
break;
} }
} }
} else { } else {
totalFramesReadForThisPage = ma_decoder_read_pcm_frames(&pDataStream->decoder, pPageData, pageSizeInFrames); result = ma_decoder_read_pcm_frames(&pDataStream->decoder, pPageData, pageSizeInFrames, &totalFramesReadForThisPage);
} }
if (totalFramesReadForThisPage < pageSizeInFrames) { if (result == MA_AT_END || totalFramesReadForThisPage < pageSizeInFrames) {
c89atomic_exchange_32(&pDataStream->isDecoderAtEnd, MA_TRUE); c89atomic_exchange_32(&pDataStream->isDecoderAtEnd, MA_TRUE);
} }
......
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