2015-10-03 7 views
1

Я пытаюсь настроить звуковой сигнал на 3 раза на одну секунду. Однако звук воспроизводится только один раз. Любые мысли о том, почему это может быть? (Он включен в большей JavaScript Funciton, объявляющий контекст и т.д...) Планирование веб-аудио. Воспроизведение Api, многопроцессорное воспроизведение.

var beepBuffer; 
 

 
var loadBeep = function() { \t \t 
 
\t var getSound = new XMLHttpRequest(); // Load the Sound with XMLHttpRequest 
 
\t getSound.open("GET", "/static/music/chime.wav", true); // Path to Audio File 
 
\t getSound.responseType = "arraybuffer"; // Read as Binary Data 
 
\t getSound.onload = function() { 
 
\t \t context.decodeAudioData(getSound.response, function(buffer){ 
 
\t \t \t beepBuffer = buffer; // Decode the Audio Data and Store it in a Variable 
 
\t \t }); 
 
\t } 
 
\t getSound.send(); // Send the Request and Load the File 
 
} 
 

 
var playBeep = function() { 
 
\t for (var j = 0;j<3;j++) { 
 
\t \t var beeper = context.createBufferSource(); // Declare a New Sound 
 
\t \t beeper.buffer = beepBuffer; // Attatch our Audio Data as it's Buffer 
 
\t \t beeper.connect(context.destination); // Link the Sound to the Output 
 
\t \t console.log(j); 
 
\t \t beeper.start(j); // Play the Sound Immediately 
 
} 
 
};

ответ

0

Закрыть - и код другого ответа будет работать - но это не синхронность, это то, что вы не запрашиваете контекстное. Текущее время до начала. Start() не принимает смещение от «сейчас» - это занимает абсолютное время. Добавьте context.currentTime в начальный параметр, и вы должны быть хорошими.

+0

Спасибо за помощь! Это сработало – njz2104

0

Ваш код предполагает, что beeper.start(j) является синхронным способом, т.е. он ждет звук, чтобы завершить игру. Это не так, поэтому ваш цикл, вероятно, играет все 3 экземпляра почти в то же время.

Одним из решений является задержка воспроизведения каждого экземпляра, путем передачи параметра времени методу start():

var numSecondsInBeep = 3; 
for (var j = 0; j < 3; j++) { 
    var beeper = context.createBufferSource(); // Declare a New Sound 
    beeper.buffer = beepBuffer; // Attatch our Audio Data as it's Buffer 
    beeper.connect(context.destination); // Link the Sound to the Output 
    console.log(j); 
    beeper.start(context.currentTime + j * numSecondsInBeep); 
} 

See here для получения дополнительной информации о play() API.

Смежные вопросы