2015-09-30 3 views
3

У меня есть следующий код: яваскриптScriptProcessorNode Skipping

var audio = null; 

try { 
    window.AudioContext = window.AudioContext || window.webkitAudioContext; 
    audio = new AudioContext(); 
} catch (e) { 
    alert("Web Audio API is not supported in this browser"); 
} 

var scriptNode = audio.createScriptProcessor(1024, 0, 1); 

var pos = 0.0; 

scriptNode.onaudioprocess = function(audioProcessingEvent) { 
    var output = audioProcessingEvent.outputBuffer; 

    for (var channel = 0; channel < output.numberOfChannels; channel++) { 
     var data = output.getChannelData(channel); 

     for (var i = 0; i < data.length; i++) { 
      data[i] = Math.sin(pos); 

      pos += 2.0 * 3.14159 * 440.0/audio.sampleRate; 

      while (pos >= 2.0 * 3.14159) { 
       pos -= 2.0 * 3.14159; 
      } 
     } 
    } 
} 

scriptNode.connect(audio.destination); 

Я пытаюсь получить доступ к аудио цикла веба-аудио, много в том, что низкоуровневый потоковом аудио API будет работать в C. Это код должен непрерывно воспроизводить тональный сигнал 440 Гц, пока страница не будет закрыта. Код будет воспроизводить тон, но через секунду или два звук проскакивает несколько раз, предполагая, что у меня закончилось пространство с буфером, и сценарий не называется каждым периодом буфера.

Я уверен, что решение этого простое, но что на самом деле вызывает пропуски? Как я могу заставить этот скрипт работать непрерывно?

EDIT: Пропуск пропускается, если я обновляю страницу. Это ошибка браузера?

ответ

1

Увеличьте размер буфера узла ScriptProcessor с 1024 до более крупного. Или используйте 0, чтобы браузер выбрал для вас значение.

Примечание. ScriptProcessors устарели, но замена еще не доступна. Замена должна вести себя лучше.

+1

Подождите ... они отказались от чего-то, не сделав замену первым? Шутки в сторону? – NmdMystery

+0

Я по-прежнему получаю пропуск, если даю 0, хотя:/ – NmdMystery

+0

Да, это устарело. Не означает, что вы не можете использовать его прямо сейчас, но ожидайте, что он уйдет в конце концов. –

0

Например, интервал 4 сек,

var audio = null; 

try { 
    window.AudioContext = window.AudioContext ||  window.webkitAudioContext; 
    audio = new AudioContext(); 
} catch (e) { 
    alert("Web Audio API is not supported in this browser"); 
} 

var INTERVAL = 4; // 4 [sec] 

var scriptNode = audio.createScriptProcessor(1024, 0, 1); 

var pos = 0.0; 

var elapsedBuffer = 0; 

scriptNode.onaudioprocess = function(audioProcessingEvent) { 
    var output = audioProcessingEvent.outputBuffer; 

    for (var channel = 0; channel < output.numberOfChannels; channel++) { 
     var data = output.getChannelData(channel); 

     for (var i = 0; i < data.length; i++) { 
      elapsedBuffer++; 

      if (elapsedBuffer > audio.sampleRate) { 
       if (elapsedBuffer > (INTERVAL * audio.sampleRate)) { 
        elapsedBuffer = 0; 
       } 

       data[i] = 0; 

       continue; 
      } 

      data[i] = Math.sin(pos); 

      pos += 2.0 * 3.14159 * 440.0/audio.sampleRate; 

      while (pos >= 2.0 * 3.14159) { 
       pos -= 2.0 * 3.14159; 
      } 
     } 
    } 
}; 

scriptNode.connect(audio.destination); 

XSound.js очень полезная библиотека для Web Audio API.