From 56b05d7b13c512b47bc2fcce23ac560ea100216e Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Thu, 16 May 2013 19:31:08 -0400 Subject: [PATCH] Bug 836599 - Part 14: Run most of the existing Web Audio tests using OfflineAudioContext as well as AudioContext; r=roc This helps us get a decent amount of test coverage on OfflineAudioContext in both the existing tests and the future tests. --- content/media/webaudio/test/webaudio.js | 126 ++++++++++++++++-------- 1 file changed, 85 insertions(+), 41 deletions(-) diff --git a/content/media/webaudio/test/webaudio.js b/content/media/webaudio/test/webaudio.js index 86713df2b3f0..9cc017b049f6 100644 --- a/content/media/webaudio/test/webaudio.js +++ b/content/media/webaudio/test/webaudio.js @@ -31,8 +31,11 @@ function compareBuffers(buf1, buf2, /*optional*/ offset, /*optional*/ length, /*optional*/ sourceOffset, - /*optional*/ destOffset) { - is(buf1.length, buf2.length, "Buffers must have the same length"); + /*optional*/ destOffset, + /*optional*/ skipLengthCheck) { + if (!skipLengthCheck) { + is(buf1.length, buf2.length, "Buffers must have the same length"); + } if (length == undefined) { length = buf1.length - (offset || 0); } @@ -100,48 +103,89 @@ function runTest() gTest.numberOfChannels = 2; // default } - var context = new AudioContext(); - if (!gTest.createExpectedBuffers) { - // Assume that the output is silence - var expectedBuffers = getEmptyBuffer(context, gTest.length); - } else { - var expectedBuffers = gTest.createExpectedBuffers(context); - } - if (!(expectedBuffers instanceof Array)) { - expectedBuffers = [expectedBuffers]; - } - var expectedFrames = 0; - for (var i = 0; i < expectedBuffers.length; ++i) { - is(expectedBuffers[i].numberOfChannels, gTest.numberOfChannels, - "Correct number of channels for expected buffer " + i); - expectedFrames += expectedBuffers[i].length; - } - is(expectedFrames, gTest.length, "Correct number of expected frames"); + var testLength; - if (gTest.createGraphAsync) { - gTest.createGraphAsync(context, function(nodeToInspect) { - testOutput(nodeToInspect); - }); - } else { - testOutput(gTest.createGraph(context)); + function runTestOnContext(context, callback, testOutput) { + if (!gTest.createExpectedBuffers) { + // Assume that the output is silence + var expectedBuffers = getEmptyBuffer(context, gTest.length); + } else { + var expectedBuffers = gTest.createExpectedBuffers(context); + } + if (!(expectedBuffers instanceof Array)) { + expectedBuffers = [expectedBuffers]; + } + var expectedFrames = 0; + for (var i = 0; i < expectedBuffers.length; ++i) { + is(expectedBuffers[i].numberOfChannels, gTest.numberOfChannels, + "Correct number of channels for expected buffer " + i); + expectedFrames += expectedBuffers[i].length; + } + is(expectedFrames, gTest.length, "Correct number of expected frames"); + + if (gTest.createGraphAsync) { + gTest.createGraphAsync(context, function(nodeToInspect) { + testOutput(nodeToInspect, expectedBuffers, callback); + }); + } else { + testOutput(gTest.createGraph(context), expectedBuffers, callback); + } } - function testOutput(nodeToInspect) { - var sp = context.createScriptProcessor(expectedBuffers[0].length, gTest.numberOfChannels); - nodeToInspect.connect(sp); - sp.connect(context.destination); - sp.onaudioprocess = function(e) { - var expectedBuffer = expectedBuffers.shift(); - is(e.inputBuffer.numberOfChannels, expectedBuffer.numberOfChannels, - "Correct number of input buffer channels"); - for (var i = 0; i < e.inputBuffer.numberOfChannels; ++i) { - compareBuffers(e.inputBuffer.getChannelData(i), expectedBuffer.getChannelData(i)); - } - if (expectedBuffers.length == 0) { - sp.onaudioprocess = null; - done(); - } - }; + function testOnNormalContext(callback) { + function testOutput(nodeToInspect, expectedBuffers, callback) { + testLength = 0; + var sp = context.createScriptProcessor(expectedBuffers[0].length, gTest.numberOfChannels); + nodeToInspect.connect(sp); + sp.connect(context.destination); + sp.onaudioprocess = function(e) { + var expectedBuffer = expectedBuffers.shift(); + testLength += expectedBuffer.length; + is(e.inputBuffer.numberOfChannels, expectedBuffer.numberOfChannels, + "Correct number of input buffer channels"); + for (var i = 0; i < e.inputBuffer.numberOfChannels; ++i) { + compareBuffers(e.inputBuffer.getChannelData(i), expectedBuffer.getChannelData(i)); + } + if (expectedBuffers.length == 0) { + sp.onaudioprocess = null; + callback(); + } + }; + } + var context = new AudioContext(); + runTestOnContext(context, callback, testOutput); } + + function testOnOfflineContext(callback) { + function testOutput(nodeToInspect, expectedBuffers, callback) { + nodeToInspect.connect(context.destination); + context.oncomplete = function(e) { + var samplesSeen = 0; + while (expectedBuffers.length) { + var expectedBuffer = expectedBuffers.shift(); + is(e.renderedBuffer.numberOfChannels, expectedBuffer.numberOfChannels, + "Correct number of input buffer channels"); + for (var i = 0; i < e.renderedBuffer.numberOfChannels; ++i) { + compareBuffers(e.renderedBuffer.getChannelData(i), + expectedBuffer.getChannelData(i), + undefined, + expectedBuffer.length, + samplesSeen, + undefined, + true); + } + samplesSeen += expectedBuffer.length; + } + callback(); + }; + context.startRendering(); + } + var context = new OfflineAudioContext(gTest.numberOfChannels, testLength, 48000); + runTestOnContext(context, callback, testOutput); + } + + testOnNormalContext(function() { + testOnOfflineContext(done); + }); }); }