xorg1990
New member
Hi, habe noch ein größeres Problem.
Ich erhalte immer diese Fehlermeldung: multiChannelAnalyser.js:115 Uncaught DOMException: Failed to execute 'postMessage' on 'Worker': An OffscreenCanvas could not be cloned because it was detached.
Ok, ich kann also nur das OffScreencanvas einmal den webworker zuweisen.
Aber wie bekomme ich meine FFT Daten in den worker, es gibt doch nur ein message event oder kann ich eigene events erstellen.
z.B self.addEventListener('meinEigenesEvent', function(e) {}
Aktuell ist der worker code so:
und aufgerufen wird er so
aussehen müsste der worker code in etwa so:
Ein zweites Message event wäre mir lieber geht das?
Ich erhalte immer diese Fehlermeldung: multiChannelAnalyser.js:115 Uncaught DOMException: Failed to execute 'postMessage' on 'Worker': An OffscreenCanvas could not be cloned because it was detached.
Ok, ich kann also nur das OffScreencanvas einmal den webworker zuweisen.
Aber wie bekomme ich meine FFT Daten in den worker, es gibt doch nur ein message event oder kann ich eigene events erstellen.
z.B self.addEventListener('meinEigenesEvent', function(e) {}
Aktuell ist der worker code so:
Code:
var workerID;
self.addEventListener('message', function(e) {
if(e.data.workerID){
workerID = e.data.workerID;
}else{
let canvas = e.data.canvas;
let context = canvas.getContext("2d");
let timeDomainData = e.data.fftTimeData;
let width = canvas.width;
let height = canvas.height;
context.fillStyle = "rgba(51, 51, 51, 0.4)";
context.fillRect(0, 0, width, height);
context.strokeStyle = "#1abc9c";
context.beginPath();
for (let i = 0, imax = timeDomainData.length; i < imax; i++) {
let x = linlin(i, 0, imax, 0, width);
let y = linlin(timeDomainData[i], -1, 1, height, 0);
context.lineTo(x, y);
}
context.stroke();
context.commit();
}
});
function linlin(value, inMin, inMax, outMin, outMax) {
return (value - inMin) / (inMax - inMin) * (outMax - outMin) + outMin;
}
und aufgerufen wird er so
Code:
function draw(){
for(let key in analysers){
let offscreen = spectrums[key];
let analyser = analysers[key];
let worker = renderWorkers[key];
let TimeData = new Float32Array(analyser.frequencyBinCount)
analyser.getFloatTimeDomainData(TimeData);
worker.postMessage({workerID: null, canvas: offscreen, fftTimeData : TimeData}, [offscreen]);
}
}
aussehen müsste der worker code in etwa so:
Code:
let context;
let width;
let height;
self.addEventListener('message', function(e) {
if(e.data.workerID){
workerID = e.data.workerID;
}else if(e.data.workerID){
let canvas = e.data.canvas;
context = canvas.getContext("2d");
width = canvas.width;
height = canvas.height;
}else{
let timeDomainData = e.data.fftTimeData;
context.fillStyle = "rgba(51, 51, 51, 0.4)";
context.fillRect(0, 0, width, height);
context.strokeStyle = "#1abc9c";
context.beginPath();
for (let i = 0, imax = timeDomainData.length; i < imax; i++) {
let x = linlin(i, 0, imax, 0, width);
let y = linlin(timeDomainData[i], -1, 1, height, 0);
context.lineTo(x, y);
}
context.stroke();
context.commit();
}
});
Ein zweites Message event wäre mir lieber geht das?
Zuletzt bearbeitet: