後で再生するために、decodeAudioData で作成されたバッファを soundBuffer に割り当てるにはどうすればよいですか?
decodeAudioData 関数呼び出し内の playSound() の呼び出しはバッファを正常に再生しますが、[再生] ボタンからの呼び出しは「ArrayBuffer 型ではない値」を返し、テストすると、soundBuffer はまだ定義されていないことに注意してください。
深くネストされた関数が最も外側の関数で 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を認識する chrome でのみ動作する可能性があります。