From 19c52c98f97a3b00e70eb717ad151c428d736dbc Mon Sep 17 00:00:00 2001 From: David Reid Date: Tue, 25 Aug 2020 20:45:51 +1000 Subject: [PATCH] Resource Manager: Fix a data buffer bug. --- research/ma_engine.c | 16 +++++++++------- research/ma_engine.h | 5 +++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/research/ma_engine.c b/research/ma_engine.c index dfacbe2a..e25f241c 100644 --- a/research/ma_engine.c +++ b/research/ma_engine.c @@ -21,8 +21,8 @@ void on_sound_loaded(ma_async_notification* pNotification) This will be fired when the sound has finished loading. We should be able to retrieve the length of the sound at this point. Here we'll just set the fade out time. */ - ma_sound_get_length_in_pcm_frames(pLoadedNotification->pSound, &lengthInPCMFrames); - ma_sound_set_fade_point_in_frames(pLoadedNotification->pSound, 1, 1, 0, lengthInPCMFrames - 192000, lengthInPCMFrames); + //ma_sound_get_length_in_pcm_frames(pLoadedNotification->pSound, &lengthInPCMFrames); + //ma_sound_set_fade_point_in_frames(pLoadedNotification->pSound, 1, 1, 0, lengthInPCMFrames - 192000, lengthInPCMFrames); } int main(int argc, char** argv) @@ -50,14 +50,14 @@ int main(int argc, char** argv) loadNotification.cb.onSignal = on_sound_loaded; 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*/, &loadNotification, NULL, &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*/, &loadNotification, NULL, &sound); if (result != MA_SUCCESS) { printf("Failed to load sound: %s\n", argv[1]); ma_engine_uninit(&engine); return -1; } - result = ma_sound_init_from_file(&engine, argv[1], MA_DATA_SOURCE_FLAG_DECODE /*| MA_DATA_SOURCE_FLAG_ASYNC | MA_DATA_SOURCE_FLAG_STREAM*/, &loadNotification, 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*/, &loadNotification, NULL, &sound2); if (result != MA_SUCCESS) { printf("Failed to load sound: %s\n", argv[1]); ma_engine_uninit(&engine); @@ -76,13 +76,15 @@ int main(int argc, char** argv) ma_sound_set_looping(&sound, MA_TRUE); //ma_sound_seek_to_pcm_frame(&sound, 6000000); //ma_sound_set_start_delay(&sound, 1110); - ma_sound_set_fade_point_in_milliseconds(&sound, 0, 0, 1, 0, 2000); - ma_sound_set_fade_point_auto_reset(&sound, 0, MA_FALSE); /* Enable fading around loop transitions. */ - ma_sound_set_fade_point_auto_reset(&sound, 1, MA_FALSE); + ma_sound_set_volume(&sound, 0.5f); + //ma_sound_set_fade_point_in_milliseconds(&sound, 0, 0, 1, 0, 2000); + //ma_sound_set_fade_point_auto_reset(&sound, 0, MA_FALSE); /* Enable fading around loop transitions. */ + //ma_sound_set_fade_point_auto_reset(&sound, 1, MA_FALSE); ma_sound_set_stop_delay(&sound, 1000); ma_sound_start(&sound); ma_sleep(1000); + ma_sound_set_volume(&sound2, 0.5f); ma_sound_start(&sound2); //ma_sleep(2000); diff --git a/research/ma_engine.h b/research/ma_engine.h index dbde8c5c..f79c08dd 100644 --- a/research/ma_engine.h +++ b/research/ma_engine.h @@ -2197,6 +2197,11 @@ static ma_result ma_resource_manager_data_buffer_init_nolock(ma_resource_manager return result; /* Should never happen. Failed to increment the reference count. */ } + /* The existing node may be in the middle of loading. We need to wait for the node to finish loading before going any further. */ + while (pDataBuffer->pNode->result == MA_BUSY) { + ma_yield(); + } + result = ma_resource_manager_data_buffer_init_connector(pDataBuffer); if (result != MA_SUCCESS) { ma_resource_manager_data_buffer_node_free(pDataBuffer->pResourceManager, pDataBuffer->pNode);