Как я могу назначить буфер, созданный в decodeAudioData, для soundBuffer для воспроизведения позже?Я не могу понять, закрытие для этого
Обратите внимание, что вызов функции playSound() в вызове функции decodeAudioData успешно воспроизводит буфер, но вызовы с кнопки воспроизведения возвращают «значение не типа ArrayBuffer», и при тестировании soundBuffer все еще не определен.
Я предполагаю, что глубоко вложенная функция утратила способность к звуковому буфферу в самой внешней функции, но я могу казаться, что обертывание soundBuffer в закрытии так, что оно успешно передается.
$(function() {
var soundBuffer, context;
try {
context = new webkitAudioContext();
}
catch (e) {
console.log("Error setting up webaudiocontext: " + e);
}
loadSound("https://dl.dropboxusercontent.com/u/9780255/counting-coins-3.mp3",soundBuffer);
$("#playSound").click(function() {
playSound(soundBuffer);
});
function loadSound(url, buffer) {
var rq = new XMLHttpRequest();
rq.open("GET", url, true);
rq.responseType = "arraybuffer";
rq.onload = function() {
context.decodeAudioData(rq.response,
function (b) {
buffer = b;
console.log("buffer loaded...");
playSound(buffer);
});
};
rq.onerror = function (e) {
console.log("error loading audio:"+e);
};
rq.send();
}
function playSound(s) {
var sn= context.createBufferSource();
sn.buffer = s;
sn.connect(context.destination);
sn.start(0);
}
});
Этот источник находится на jsfiddle: http://jsfiddle.net/karasutengu/qA5Nb/8/ Это, скорее всего, будет работать только с хромом, который распознает webkitAudioContext.
Я хотел бы не жестко указывать, какой буфер я загружаю, поэтому я пытаюсь назначить его по ссылке, чтобы повторно использовать подпрограмму для других звуковых файлов. – Kenji
, что могло бы ввести в заблуждение, я должен был, вероятно, сделать вызовы playSound (s); – Kenji
Правильно, неправильно понял вопрос. –