implement backchannel from audio thread

This commit is contained in:
2022-04-22 00:28:19 +02:00
parent df0c169d54
commit e05701300c
4 changed files with 48 additions and 6 deletions

View File

@@ -5,7 +5,14 @@ class APU extends AudioWorkletProcessor {
this.sampleIndex = 0;
this.port.onmessage = (ev) => {
if(this.memory) {
U8(this.memory.buffer, 80, 32).set(U8(ev.data));
if(isNaN(ev.data)) {
let data = U8(ev.data);
U8(this.memory.buffer, 80, 32).set(data);
data.set(U8(this.memory.buffer, 0x12c80, 32));
this.port.postMessage(ev.data);
} else {
this.startTime = ev.data;
}
} else {
this.load(ev.data[0], ev.data[1]);
}
@@ -51,7 +58,9 @@ class APU extends AudioWorkletProcessor {
}
process(inputs, outputs, parameters) {
if(this.snd) {
if(this.snd && this.startTime) {
let u32Mem = new Uint32Array(this.memory.buffer);
u32Mem[16] = Date.now() - this.startTime;
let channels = outputs[0];
let index = this.sampleIndex;
let numSamples = channels[0].length;

View File

@@ -126,7 +126,6 @@ export default function MicroW8(screen, config = {}) {
audioReadyResolve = null;
}
};
audioNode.port.onmessage = (e) => updateAudioReady(e.data);
let audioStateChange = () => {
if(audioContext.state == 'suspended') {
if(config.startButton) {
@@ -211,6 +210,14 @@ export default function MicroW8(screen, config = {}) {
data = loadModuleData(data);
let platform_data = await loadModuleURL(platformUrl);
audioNode.port.onmessage = (e) => {
if(isNaN(e.data)) {
U8(memory.buffer, 0x12c80, 32).set(U8(e.data));
} else {
updateAudioReady(e.data);
}
};
audioNode.port.postMessage([platform_data, data]);
let platform_instance = await instantiate(platform_data);
@@ -240,10 +247,12 @@ export default function MicroW8(screen, config = {}) {
isPaused = false;
audioContext.resume();
startTime += now - pauseTime;
audioNode.port.postMessage(startTime);
} else {
isPaused = true;
audioContext.suspend();
pauseTime = now;
audioNode.port.postMessage(0);
}
};
window.addEventListener('focus', () => updateVisibility(true), { signal: abortController.signal });