diff --git a/src/Message.c b/src/Message.c index 9d2c6d3..90ba84f 100644 --- a/src/Message.c +++ b/src/Message.c @@ -2,7 +2,7 @@ // SPDX-License-Identifier: MIT-Modern-Variant #include "_Internal.h" -void DmMessage_copy(DmMessage* slf, DmMessage* cpy, uint32_t time) { +void DmMessage_copy(DmMessage* slf, DmMessage* cpy, int64_t time) { if (slf == NULL || cpy == NULL) { return; } @@ -15,7 +15,9 @@ void DmMessage_copy(DmMessage* slf, DmMessage* cpy, uint32_t time) { cpy->style.style = DmStyle_retain(slf->style.style); } - cpy->time = time; + if (time >= 0) { + cpy->time = time; + } } void DmMessage_free(DmMessage* slf) { diff --git a/src/Performance.c b/src/Performance.c index e7f2a03..b5bc9e0 100644 --- a/src/Performance.c +++ b/src/Performance.c @@ -803,8 +803,10 @@ DmResult DmPerformance_renderPcm(DmPerformance* slf, void* buf, size_t len, DmRe (void) mtx_unlock(&slf->mod_lock); } - DmMessage* msg = ok_ctrl ? &msg_ctrl : &msg_midi; - uint32_t time_offset = (uint32_t) max_s32((int) msg->time - (int) slf->time, 0); + DmMessage msg; + DmMessage_copy(ok_ctrl ? &msg_ctrl : &msg_midi, &msg, -1); + + uint32_t time_offset = (uint32_t) max_s32((int) msg.time - (int) slf->time, 0); uint32_t offset_samples = DmPerformance_getSampleCountFromDuration(slf, time_offset, slf->sample_rate, channels); if (offset_samples > len - sample) { @@ -842,7 +844,8 @@ DmResult DmPerformance_renderPcm(DmPerformance* slf, void* buf, size_t len, DmRe DmMessageQueue_pop(&slf->music_queue); } - DmPerformance_handleMessage(slf, msg); + DmPerformance_handleMessage(slf, &msg); + DmMessage_free(&msg); } // Render the remaining samples diff --git a/src/_Internal.h b/src/_Internal.h index 17feb23..9471cd4 100644 --- a/src/_Internal.h +++ b/src/_Internal.h @@ -20,7 +20,7 @@ typedef enum DmResolveFlags { DmResolve_AFTER_LATENCY_TIME = 1 << 22, DmResolve_GRID = 1 << 11, DmResolve_BEAT = 1 << 12, - DmResolve_MEASURE =1 << 13, + DmResolve_MEASURE = 1 << 13, DmResolve_MARKER = 1 << 24, DmResolve_SEGMENT_END = 1 << 23, } DmResolveFlags; @@ -583,7 +583,7 @@ DMINT DmResult DmLoader_getDownloadableSound(DmLoader* slf, DmReference const* r DMINT DmResult DmSegment_create(DmSegment** slf); DMINT DmResult DmSegment_parse(DmSegment* slf, void* buf, size_t len); -DMINT void DmMessage_copy(DmMessage* slf, DmMessage* cpy, uint32_t time); +DMINT void DmMessage_copy(DmMessage* slf, DmMessage* cpy, int64_t time); DMINT void DmMessage_free(DmMessage* slf); DMINT DmResult DmMessageQueue_init(DmMessageQueue* slf); DMINT void DmMessageQueue_free(DmMessageQueue* slf);