mirror of
https://github.com/libretro/RetroArch
synced 2025-04-10 15:45:19 +00:00
fix rwebaudio time drift
fixes audio getting stuck in an always fast state
This commit is contained in:
parent
19facdb066
commit
0256156a6b
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user