mirror of
https://github.com/exoticorn/microw8.git
synced 2026-01-20 19:26:43 +01:00
implement backchannel from audio thread
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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 });
|
||||
|
||||
Reference in New Issue
Block a user