fix rwebaudio time drift

fixes audio getting stuck in an always fast state
This commit is contained in:
Toad King 2018-01-15 03:08:30 -06:00
parent 19facdb066
commit 0256156a6b
2 changed files with 18 additions and 8 deletions

View File

@ -41,8 +41,8 @@ var LibraryRWebAudio = {
fillBuffer: function(buf, samples) { fillBuffer: function(buf, samples) {
var count = 0; var count = 0;
var leftBuffer = RA.buffers[RA.bufIndex].getChannelData(0); const leftBuffer = RA.buffers[RA.bufIndex].getChannelData(0);
var rightBuffer = RA.buffers[RA.bufIndex].getChannelData(1); const rightBuffer = RA.buffers[RA.bufIndex].getChannelData(1);
while (samples && RA.bufOffset !== RA.BUFFER_SIZE) { while (samples && RA.bufOffset !== RA.BUFFER_SIZE) {
leftBuffer[RA.bufOffset] = {{{ makeGetValue('buf', 'count * 8', 'float') }}}; leftBuffer[RA.bufOffset] = {{{ makeGetValue('buf', 'count * 8', 'float') }}};
rightBuffer[RA.bufOffset] = {{{ makeGetValue('buf', 'count * 8 + 4', 'float') }}}; rightBuffer[RA.bufOffset] = {{{ makeGetValue('buf', 'count * 8 + 4', 'float') }}};
@ -74,7 +74,7 @@ var LibraryRWebAudio = {
block: function() { block: function() {
do { do {
RA.process(); RA.process();
} while (RA.bufIndex === RA.numBuffers - 1); } while (RA.bufIndex === RA.numBuffers);
} }
}, },
@ -112,16 +112,17 @@ var LibraryRWebAudio = {
var count = 0; var count = 0;
while (samples) { while (samples) {
if (RA.bufIndex === RA.numBuffers) {
if (RA.nonblock) break;
else RA.block();
}
var fill = RA.fillBuffer(buf, samples); var fill = RA.fillBuffer(buf, samples);
samples -= fill; samples -= fill;
count += fill; count += fill;
buf += fill * 8; buf += fill * 8;
if (RA.bufOffset === RA.BUFFER_SIZE) { if (RA.bufOffset === RA.BUFFER_SIZE) {
if (RA.bufIndex === RA.numBuffers - 1) {
if (RA.nonblock) break;
else RA.block();
}
RA.queueAudio(); RA.queueAudio();
} }
} }
@ -146,7 +147,6 @@ var LibraryRWebAudio = {
RWebAudioFree: function() { RWebAudioFree: function() {
RA.bufIndex = 0; RA.bufIndex = 0;
RA.bufOffset = 0; RA.bufOffset = 0;
return;
}, },
RWebAudioBufferSize: function() { RWebAudioBufferSize: function() {
@ -156,6 +156,12 @@ var LibraryRWebAudio = {
RWebAudioWriteAvail: function() { RWebAudioWriteAvail: function() {
RA.process(); RA.process();
return ((RA.numBuffers - RA.bufIndex) * RA.BUFFER_SIZE - RA.bufOffset) * 8; 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;
}
} }
}; };

View File

@ -44,6 +44,8 @@
#include "../../tasks/tasks_internal.h" #include "../../tasks/tasks_internal.h"
#include "../../file_path_special.h" #include "../../file_path_special.h"
void RWebAudioRecalibrateTime(void);
static unsigned emscripten_fullscreen_reinit; static unsigned emscripten_fullscreen_reinit;
static EM_BOOL emscripten_fullscreenchange_cb(int event_type, static EM_BOOL emscripten_fullscreenchange_cb(int event_type,
@ -64,6 +66,8 @@ static void emscripten_mainloop(void)
unsigned sleep_ms = 0; unsigned sleep_ms = 0;
int ret; int ret;
RWebAudioRecalibrateTime();
if (emscripten_fullscreen_reinit != 0) if (emscripten_fullscreen_reinit != 0)
{ {
if (--emscripten_fullscreen_reinit == 0) if (--emscripten_fullscreen_reinit == 0)