Утечка памяти в OfflineAudioContext
.
Запускаем Task Manager. Смотрим на объем ОЗУ, занимаемый вкладкой. Видим, что он растет. После того, как вкладка займет больше 4ГБ, она сломается.
Как избежать утечки памяти?
Пример на jsfiddle.
var audioCtx = new(window.AudioContext || window.webkitAudioContext)();
// define variables
var play = document.querySelector('.play');
var stop = document.querySelector('.stop');
var progress = document.querySelector('#progress');
var buffer = document.querySelector('.buffer');
var myBuffer = null;
var rendering = false;
// use XHR to load an audio track, and
// decodeAudioData to decode it and stick it in a buffer.
// Then we put the buffer into the source
function getData() {
request = new XMLHttpRequest();
request.open('GET', 'https://s3-ap-northeast-1.amazonaws.com/storage.cowrite.decodeapps.io/Materials/Media/Audio/5a0aca5f35965-20171114-105007.mp3', true);
request.responseType = 'arraybuffer';
request.onload = function() {
progress.innerText = 'loaded';
var audioData = request.response;
audioCtx.decodeAudioData(audioData, function(buffer) {
myBuffer = buffer;
createBuffer();
}).catch(function(err) {
console.log('Rendering failed: ' + err);
// Note: The promise should reject when startRendering is called a second time on an OfflineAudioContext
});
}
request.send();
}
buffer.setAttribute('disabled', 'disabled');
progress.innerText = 'loading...';
var cntRenfered = 0;
function createBuffer() {
var offlineCtx = new OfflineAudioContext(2, myBuffer.length, myBuffer.sampleRate);
var source = offlineCtx.createBufferSource();
source.buffer = myBuffer;
source.connect(offlineCtx.destination);
source.start();
//source.loop = true;
offlineCtx.oncomplete = function(e) {
progress.innerText = 'completed';
buffer.removeAttribute('disabled');
source.disconnect(offlineCtx.destination);
cntRenfered++;
buffer.innerText = 'reCreateBuffer ' + cntRenfered;
}
offlineCtx.startRendering();
}
buffer.onclick = function() {
progress.innerText = 'rendering...';
buffer.setAttribute('disabled', 'disabled');
createBuffer();
}
getData();
<div id="progress">
loading
</div>
<button class="buffer">
reCreateBuffer
</button>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно создать поле для ввода текста которое будет автоматически увеличиваться вместе с набранным текстом (по высоте)Использовать textarea нельзя,...
Пытаюсь через dispatchEvent послать событие так, чтобы React его обработал, но по какой-то причине обработчик onChange в реакте не вызывается, хотя все...
Как изменить js код так, чтобы по истечении 59 секунд счетчик не замирал на 0 секунде, а начинал заново?