if (typeof(window) == "undefined") { benchmarks = [] registerTestFile = function() {} registerTestCase = function(o) { return benchmarks.push(o.name); } } registerTestFile({ sampleRate: 48000, url: "think-mono-48000.wav" }); registerTestFile({ sampleRate: 44100, url: "think-mono-44100.wav" }); registerTestFile({ sampleRate: 38000, url: "think-mono-38000.wav" }); registerTestFile({ sampleRate: 48000, url: "think-stereo-48000.wav" }); registerTestFile({ sampleRate: 44100, url: "think-stereo-44100.wav" }); registerTestFile({ sampleRate: 38000, url: "think-stereo-38000.wav" }); registerTestCase({ func: function () { var oac = new OfflineAudioContext(1, DURATION * sampleRate, sampleRate); return oac; }, name: "Empty testcase" }); registerTestCase({ func: function () { var oac = new OfflineAudioContext(1, DURATION * sampleRate, sampleRate); var source0 = oac.createBufferSource(); source0.buffer = getSpecificFile({ sampleRate: oac.sampleRate, numberOfChannels: 1 }); source0.loop = true; source0.connect(oac.destination); source0.start(0); return oac; }, name: "Simple source test without resampling" }); registerTestCase({ func: function() { var oac = new OfflineAudioContext(2, DURATION * sampleRate, sampleRate); var source0 = oac.createBufferSource(); source0.buffer = getSpecificFile({ sampleRate: oac.sampleRate, numberOfChannels: 2 }); source0.loop = true; source0.connect(oac.destination); source0.start(0); return oac; }, name: "Simple source test without resampling (Stereo)" }); registerTestCase({ func: function () { var oac = new OfflineAudioContext(2, DURATION * sampleRate, sampleRate); var source0 = oac.createBufferSource(); var panner = oac.createPanner(); source0.buffer = getSpecificFile({ sampleRate: oac.sampleRate, numberOfChannels: 2 }); source0.loop = true; panner.setPosition(1, 2, 3); panner.setOrientation(10, 10, 10); source0.connect(panner); panner.connect(oac.destination); source0.start(0); return oac; }, name: "Simple source test without resampling (Stereo and positional)" }); registerTestCase({ func: function() { var oac = new OfflineAudioContext(1, DURATION * sampleRate, sampleRate); var source0 = oac.createBufferSource(); source0.buffer = getSpecificFile({ sampleRate: 38000, numberOfChannels: 1 }); source0.loop = true; source0.connect(oac.destination); source0.start(0); return oac; }, name: "Simple source test with resampling (Mono)" }); registerTestCase({ func: function() { var oac = new OfflineAudioContext(2, DURATION * sampleRate, sampleRate); var source0 = oac.createBufferSource(); source0.buffer = getSpecificFile({ sampleRate: 38000, numberOfChannels: 2 }); source0.loop = true; source0.connect(oac.destination); source0.start(0); return oac; }, name: "Simple source test with resampling (Stereo)" }); registerTestCase({ func: function() { var oac = new OfflineAudioContext(2, DURATION * sampleRate, sampleRate); var source0 = oac.createBufferSource(); var panner = oac.createPanner(); source0.buffer = getSpecificFile({ sampleRate: 38000, numberOfChannels: 2 }); source0.loop = true; panner.setPosition(1, 2, 3); panner.setOrientation(10, 10, 10); source0.connect(panner); panner.connect(oac.destination); source0.start(0); return oac; }, name: "Simple source test with resampling (Stereo and positional)" }); registerTestCase({ func: function() { var oac = new OfflineAudioContext(2, DURATION * sampleRate, sampleRate); var source0 = oac.createBufferSource(); source0.buffer = getSpecificFile({ sampleRate: oac.sampleRate, numberOfChannels: 1 }); source0.loop = true; source0.connect(oac.destination); source0.start(0); return oac; }, name: "Upmix without resampling (Mono -> Stereo)" }); registerTestCase({ func: function() { var oac = new OfflineAudioContext(1, DURATION * sampleRate, sampleRate); var source0 = oac.createBufferSource(); source0.buffer = getSpecificFile({ sampleRate: oac.sampleRate, numberOfChannels: 2 }); source0.loop = true; source0.connect(oac.destination); source0.start(0); return oac; }, name: "Downmix without resampling (Stereo -> Mono)" }); registerTestCase({ func: function() { var duration_adjusted = DURATION / 4; var oac = new OfflineAudioContext(2, duration_adjusted * sampleRate, sampleRate); for (var i = 0; i < 100; i++) { var source0 = oac.createBufferSource(); source0.buffer = getSpecificFile({ sampleRate: 38000, numberOfChannels: 1 }); source0.loop = true; source0.connect(oac.destination); source0.start(0); } return oac; }, name: "Simple mixing (100x same buffer)" }); registerTestCase({ func: function() { var duration_adjusted = DURATION / 4; var oac = new OfflineAudioContext(2, duration_adjusted * sampleRate, sampleRate); var reference = getSpecificFile({ sampleRate: 38000, numberOfChannels: 1 }).getChannelData(0); for (var i = 0; i < 100; i++) { var source0 = oac.createBufferSource(); // copy the buffer into the a new one, so we know the implementation is not // sharing them. var b = oac.createBuffer(1, reference.length, 38000); var data = b.getChannelData(0); for (var j = 0; j < b.length; j++) { data[i] = reference[i]; } source0.buffer = b; source0.loop = true; source0.connect(oac.destination); source0.start(0); } return oac; }, name: "Simple mixing (100 different buffers)" }); registerTestCase({ func: function() { var oac = new OfflineAudioContext(2, DURATION * sampleRate, sampleRate); var gain = oac.createGain(); gain.gain.value = -1; gain.connect(oac.destination); var gainsi = []; for (var i = 0; i < 4; i++) { var gaini = oac.createGain(); gaini.gain.value = 0.25; gaini.connect(gain); gainsi[i] = gaini } for (var j = 0; j < 2; j++) { var sourcej = oac.createBufferSource(); sourcej.buffer = getSpecificFile({ sampleRate: 38000, numberOfChannels: 1 }); sourcej.loop = true; sourcej.start(0); for (var i = 0; i < 4; i++) { var gainij = oac.createGain(); gainij.gain.value = 0.5; gainij.connect(gainsi[i]); sourcej.connect(gainij); } } return oac; }, name: "Simple mixing with gains" }); registerTestCase({ func: function() { var duration_adjusted = DURATION / 8; var oac = new OfflineAudioContext(1, duration_adjusted * sampleRate, sampleRate); var i,l; var decay = 10; var duration = 4; var len = sampleRate * duration; var buffer = ac.createBuffer(2, len, oac.sampleRate) var iL = buffer.getChannelData(0) var iR = buffer.getChannelData(1) // Simple exp decay loop for(i=0,l=buffer.length;i