Утечка памяти в OfflineAudioContext

247
22 ноября 2017, 01:17

Утечка памяти в 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>

READ ALSO
Нужно создать поле для ввода текста которое будет автоматически увеличиваться вместе с набранным текстом (по высоте)

Нужно создать поле для ввода текста которое будет автоматически увеличиваться вместе с набранным текстом (по высоте)

Нужно создать поле для ввода текста которое будет автоматически увеличиваться вместе с набранным текстом (по высоте)Использовать textarea нельзя,...

184
Послать реакту событие об изменении checkbox&#39;а

Послать реакту событие об изменении checkbox'а

Пытаюсь через dispatchEvent послать событие так, чтобы React его обработал, но по какой-то причине обработчик onChange в реакте не вызывается, хотя все...

199
Последовательность пайпов ( .pipe() )

Последовательность пайпов ( .pipe() )

Начал осваивать сборщики проектов, а именно из Gulp

188
svg/js обратный отсчет

svg/js обратный отсчет

Как изменить js код так, чтобы по истечении 59 секунд счетчик не замирал на 0 секунде, а начинал заново?

226