3
window.onload = init;

var list = new Array(); //array containing list of music sources
var playListBuffer = new Array(); //array to put in all decoded audio
var playList = new Array();
var context = new webkitAudioContext();

function init(){
    list = ["../media/cello_suit.mp3","../media/morning.mp3"]; //list of files to play at once
    load(list);
}

function load(url){
    for (var i=0; i<list.length; i++){ //load in every url
        var request = new XMLHttpRequest();
        request.open('GET', list[i], true);
        request.responseType = 'arraybuffer';

        request.onload = function () { //Async method
                console.log(request.response);
                context.decodeAudioData(request.response, function(buffer) {    //Async method
                    if (!buffer) {
                        alert('error decoding file data: ');
                        return;
                    }

                    playListBuffer.push(buffer);                                //Decode audio and put inside playListBuffer
                    if (list.length==playListBuffer.length){
                        console.log(playListBuffer);                            //When All files have been decoded show an Array in console
                        prepare();
                    }
                                                                        },  function(e) { console.log('Error decoding audio file', e)});

        };

        request.onerror = function() {
            alert('BufferLoader: XHR error');
        }

        request.send();
    }

}

function prepare(){
    for (var i=0; i<playListBuffer.length; i++){ 
        var source = context.createBufferSource();              // creates a sound source
        console.log(playListBuffer[i]);
        source.buffer = playListBuffer[i];                      // tell the source which sound to play
        source.connect(context.destination);                    // connect the source to the context's destination (the speakers)
        playList.push(source);
    }
    playAll();
}

function playAll(){
    for (var i=0; i<playList.length; i++){ 
        playList[i].noteOn(0); 
    }
}

你好; 我对这个使用新的 webaudio api 的基本脚本有一些奇怪的行为。此脚本在 chrome 中引发错误:未捕获错误:SYNTAX_ERR:DOM Exception 12 audio.js:27 request.onload;但是,如果我删除列表中的第二个元素,它会起作用。为什么?

背景信息:此脚本读取一系列歌曲位置并同时播放它们。

4

1 回答 1

1

您需要使用“this”,因为变量“request”将在 for 循环的第二次迭代中被覆盖。

context.decodeAudioData(request.response,
  // ---->
context.decodeAudioData(this.response,
于 2012-11-09T14:02:52.380 回答