Утечка памяти в 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>
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости