#javascript #web-audio-api
#javascript #web-audio-api
Вопрос:
У меня есть AudioWorkletNode, который является членом экземпляра класса. Когда я удаляю / уничтожаю / удаляю этот экземпляр, происходит утечка AudioWorkletNode и MessagePort.
Перед удалением экземпляра я удостоверяюсь, что соответствующий метод обработки AudioWorkletProcessor не запущен. Я также пытался вызвать метод закрытия порта () и даже установить для AudioWorkletNode значение null. Также, похоже, не имеет значения, подключен или отключен узел в данный момент. В любом случае происходит утечка.
Для установки модуля AudioWorklet:
AG_Recorder = class AG_Recorder {
constructor(outNode) {
AG_AudioManager.audioCtx.audioWorklet.addModule( '/audioWorkers/recorder.js').then(() => {
this.recorderNode = new AudioWorkletNode(AG_AudioManager.audioCtx, 'recorder');
this.recorderNode.connect(outNode);
this.recorderNode.port.onmessage = (event) => {
this.handleMessage(event.data);
};
}).catch(function (err) {
console.log('recorder audioworklet error: ', err.name, err.message);
});
}
}
И процессор, сильно сокращенный для релевантности:
class RecorderWorkletNode extends AudioWorkletProcessor {
constructor (options) {
super(options);
this._running = true;
this.port.onmessage = event => {
if (event.data.release) {
this._running = false;
}
}
this.port.start();
}
process (inputs, outputs, parameters) {
return this._running;
}
}
И прежде чем узел будет отключен, а экземпляр AG_Recorder будет удален, я попытался сделать это:
release() {
this.recorderNode.port.postMessage({release: true});
this.recorderNode.port.onmessage = null;
this.recorderNode.port.close();
this.recorderNode = null;
}
Комментарии:
1. Вы когда-нибудь находили ответ на это?
2. @SteveM к сожалению, нет
Ответ №1:
Похоже, это подтвержденная ошибка для Chromium:
https://bugs.chromium.org/p/chromium/issues/detail?id=1298955
Обновление: не очень уверен в Firefox и т. Д