Index: third_party/WebKit/LayoutTests/webaudio/osc-negative-freq.html |
diff --git a/third_party/WebKit/LayoutTests/webaudio/osc-negative-freq.html b/third_party/WebKit/LayoutTests/webaudio/osc-negative-freq.html |
deleted file mode 100644 |
index 092dea75d25f9b4be3d9a69fd50b3ee2f3494e49..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/LayoutTests/webaudio/osc-negative-freq.html |
+++ /dev/null |
@@ -1,200 +0,0 @@ |
-<!doctype html> |
-<html> |
- <head> |
- <script src="../resources/js-test.js"></script> |
- <script src="resources/compatibility.js"></script> |
- <script src="resources/audit-util.js"></script> |
- <script src="resources/audio-testing.js"></script> |
- <title>Test OscillatorNode with Negative Frequency</title> |
- </head> |
- |
- <body> |
- <script> |
- description("Test OscillatorNode with Negative Frequency."); |
- window.jsTestIsAsync = true; |
- |
- // Some arbitrary sample rate for the offline context. |
- var sampleRate = 48000; |
- var renderDuration = 1; |
- var renderFrames = renderDuration * sampleRate; |
- |
- var audit = Audit.createTaskRunner(); |
- |
- audit.defineTask("sine", function (done) { |
- runTest({ |
- message: "Sum of positive and negative frequency sine oscillators", |
- type: "sine", |
- threshold: 4.7684e-7 |
- }).then(done); |
- }); |
- |
- audit.defineTask("square", function (done) { |
- runTest({ |
- message: "Sum of positive and negative frequency square oscillators", |
- type: "square", |
- threshold: 4.4108e-6 |
- }).then(done); |
- }); |
- |
- audit.defineTask("sawtooth", function (done) { |
- runTest({ |
- message: "Sum of positive and negative frequency sawtooth oscillators", |
- type: "sawtooth", |
- threshold: 4.3735e-6 |
- }).then(done); |
- }); |
- |
- audit.defineTask("triangle", function (done) { |
- runTest({ |
- message: "Sum of positive and negative frequency triangle oscillators", |
- type: "triangle", |
- threshold: 3.5763e-7 |
- }).then(done); |
- }); |
- |
- audit.defineTask("auto-sawtooth", function (done) { |
- runTest({ |
- message: "Sum of positive and negative frequency-ramped sawtooth oscillators", |
- type: "sawtooth", |
- automation: { |
- type: "linearRampToValueAtTime", |
- startTime: 0, |
- endTime: renderDuration / 2, |
- startFrequency: 440, |
- endFrequency: sampleRate / 4 |
- }, |
- threshold: 4.1202e-6 |
- }).then(done); |
- }); |
- |
- audit.defineTask("periodic-wave", function (done) { |
- // Test negative frequencies for a custom oscillator. Two channels are |
- // needed for the context; one for the expected result, and one for the |
- // actual, as explained below. |
- var context = new OfflineAudioContext(2, renderFrames, sampleRate); |
- |
- var oscPositive = context.createOscillator(); |
- var oscNegative = context.createOscillator(); |
- |
- // The Fourier coefficients for our custom oscillator. The actual values |
- // not important. The waveform for our custom oscillator is |
- // |
- // x(t) = sum(real[k]*cos(2*%pi*f*k/Fs), k, 1) |
- // + sum(imag[k]*sin(2*%pi*f*k/Fs), k, 0) |
- // |
- // With a negative frequency we have |
- // |
- // x(t) = sum(real[k]*cos(2*%pi*(-f)*k/Fs), k, 1) |
- // + sum(imag[k]*sin(2*%pi*(-f)*k/Fs), k, 0) |
- // |
- // = sum(real[k]*cos(2*%pi*f*k/Fs), k, 1) |
- // + sum((-imag[k])*sin(2*%pi*f*k/Fs), k, 0) |
- // |
- // That is, when the frequency is inverted, it behaves as if the |
- // coefficients of the imaginary part are inverted. |
- // |
- // Thus, the test is to create two custom oscillators. The second |
- // osillator uses the same PeriodicWave as the first except the |
- // imaginary coefficients are inverted. This second oscillator also |
- // gets a negative frequency. The combination of the two results in an |
- // oscillator that is the same as the first with gain of 2. |
- var real = [0, 1, 1]; |
- var imag = [0, 1, 1]; |
- |
- var wavePositive = context.createPeriodicWave( |
- Float32Array.from(real), |
- Float32Array.from(imag)); |
- var waveNegative = context.createPeriodicWave( |
- Float32Array.from(real), |
- Float32Array.from(imag.map(x => -x))); |
- |
- oscPositive.setPeriodicWave(wavePositive); |
- oscNegative.setPeriodicWave(waveNegative); |
- |
- oscPositive.frequency.value = 440; |
- oscNegative.frequency.value = -oscPositive.frequency.value; |
- |
- var merger = context.createChannelMerger(2); |
- var gain = context.createGain(); |
- |
- // As explained above, the expected result should be positive frequency |
- // oscillator but with a gain of 2. |
- gain.gain.value = 2; |
- oscPositive.connect(gain); |
- gain.connect(merger, 0, 0); |
- |
- // Sum the positive and negative frequency oscillators by using the same |
- // input to the merger. |
- oscPositive.connect(merger, 0, 1); |
- oscNegative.connect(merger, 0, 1); |
- |
- merger.connect(context.destination); |
- |
- oscPositive.start(); |
- oscNegative.start(); |
- |
- context.startRendering().then(function (buffer) { |
- var expected = buffer.getChannelData(0); |
- var actual = buffer.getChannelData(1); |
- |
- Should("Sum of positive and negative frequency custom oscillators", |
- actual, { |
- precision: 6 |
- }) |
- .beCloseToArray(expected, 4.7684e-7); |
- }).then(done); |
- }); |
- |
- |
- // All done! |
- audit.defineTask("finish", function (done) { |
- finishJSTest(); |
- done(); |
- }); |
- |
- audit.runTasks(); |
- |
- function runTest(options) { |
- // To test if negative frequencies work, create two oscillators. One |
- // has a positive frequency and the other has a negative frequency. |
- // Sum the oscillator outputs; the output should be zero because all of |
- // the builtin oscillator types are odd functions of frequency. |
- var context = new OfflineAudioContext(1, renderFrames, sampleRate); |
- |
- var oscPositive = context.createOscillator(); |
- var oscNegative = context.createOscillator(); |
- |
- oscPositive.type = options.type; |
- oscNegative.type = oscPositive.type; |
- |
- if (options.automation) { |
- var {type, startTime, endTime, startFrequency, endFrequency} = options.automation; |
- oscPositive.frequency.setValueAtTime(startFrequency, startTime); |
- oscPositive.frequency[type](endFrequency, endTime) |
- |
- oscNegative.frequency.setValueAtTime(-startFrequency, startTime); |
- oscNegative.frequency[type](-endFrequency, endTime) |
- } else { |
- oscPositive.frequency.value = 440; |
- oscNegative.frequency.value = -oscPositive.frequency.value; |
- } |
- |
- oscPositive.connect(context.destination); |
- oscNegative.connect(context.destination); |
- |
- oscPositive.start(); |
- oscNegative.start(); |
- |
- return context.startRendering().then(function (buffer) { |
- var result = buffer.getChannelData(0); |
- |
- var zero = new Float32Array(result.length); |
- zero.fill(0); |
- Should(options.message, result, { |
- verbose: true |
- }).beCloseToArray(zero, options.threshold || 0); |
- }); |
- } |
- </script> |
- </body> |
-</html> |