From 0256156a6bf95f6da25db3a4b589a6ca2f270e63 Mon Sep 17 00:00:00 2001 From: Toad King Date: Mon, 15 Jan 2018 03:08:30 -0600 Subject: [PATCH] fix rwebaudio time drift fixes audio getting stuck in an always fast state --- emscripten/library_rwebaudio.js | 22 ++++++++++++++-------- frontend/drivers/platform_emscripten.c | 4 ++++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/emscripten/library_rwebaudio.js b/emscripten/library_rwebaudio.js index 242c599500..03b70a8340 100644 --- a/emscripten/library_rwebaudio.js +++ b/emscripten/library_rwebaudio.js @@ -41,8 +41,8 @@ var LibraryRWebAudio = { fillBuffer: function(buf, samples) { var count = 0; - var leftBuffer = RA.buffers[RA.bufIndex].getChannelData(0); - var rightBuffer = RA.buffers[RA.bufIndex].getChannelData(1); + const leftBuffer = RA.buffers[RA.bufIndex].getChannelData(0); + const rightBuffer = RA.buffers[RA.bufIndex].getChannelData(1); while (samples && RA.bufOffset !== RA.BUFFER_SIZE) { leftBuffer[RA.bufOffset] = {{{ makeGetValue('buf', 'count * 8', 'float') }}}; rightBuffer[RA.bufOffset] = {{{ makeGetValue('buf', 'count * 8 + 4', 'float') }}}; @@ -74,7 +74,7 @@ var LibraryRWebAudio = { block: function() { do { RA.process(); - } while (RA.bufIndex === RA.numBuffers - 1); + } while (RA.bufIndex === RA.numBuffers); } }, @@ -112,16 +112,17 @@ var LibraryRWebAudio = { var count = 0; while (samples) { + if (RA.bufIndex === RA.numBuffers) { + if (RA.nonblock) break; + else RA.block(); + } + var fill = RA.fillBuffer(buf, samples); samples -= fill; count += fill; buf += fill * 8; if (RA.bufOffset === RA.BUFFER_SIZE) { - if (RA.bufIndex === RA.numBuffers - 1) { - if (RA.nonblock) break; - else RA.block(); - } RA.queueAudio(); } } @@ -146,7 +147,6 @@ var LibraryRWebAudio = { RWebAudioFree: function() { RA.bufIndex = 0; RA.bufOffset = 0; - return; }, RWebAudioBufferSize: function() { @@ -156,6 +156,12 @@ var LibraryRWebAudio = { RWebAudioWriteAvail: function() { RA.process(); return ((RA.numBuffers - RA.bufIndex) * RA.BUFFER_SIZE - RA.bufOffset) * 8; + }, + + RWebAudioRecalibrateTime: function() { + if (RA.startTime) { + RA.startTime = window['performance']['now']() - RA.context.currentTime * 1000; + } } }; diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c index 99c17c5a63..4982446275 100644 --- a/frontend/drivers/platform_emscripten.c +++ b/frontend/drivers/platform_emscripten.c @@ -44,6 +44,8 @@ #include "../../tasks/tasks_internal.h" #include "../../file_path_special.h" +void RWebAudioRecalibrateTime(void); + static unsigned emscripten_fullscreen_reinit; static EM_BOOL emscripten_fullscreenchange_cb(int event_type, @@ -64,6 +66,8 @@ static void emscripten_mainloop(void) unsigned sleep_ms = 0; int ret; + RWebAudioRecalibrateTime(); + if (emscripten_fullscreen_reinit != 0) { if (--emscripten_fullscreen_reinit == 0)