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 を使用するこの基本的なスクリプトには、いくつかの動作があります。このスクリプトは、クロムでエラーをスローします: Uncaught Error: SYNTAX_ERR: DOM Exception 12 audio.js:27 request.onload; ただし、リストの2番目の要素を削除すると機能します。なんで?

背景情報: このスクリプトは曲の場所の配列を読み取り、それらを同時に再生します。

4

1 に答える 1

1

変数 'request' は for ループの 2 回目の繰り返しで上書きされるため、'this' を使用する必要があります。

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