Title: [94969] trunk
Revision
94969
Author
crog...@google.com
Date
2011-09-12 11:55:07 -0700 (Mon, 12 Sep 2011)

Log Message

DelayNode delay buffer is not correctly wrapping around
https://bugs.webkit.org/show_bug.cgi?id=67872

Reviewed by Kenneth Russell.

Source/WebCore:

Test: webaudio/delaynode.html

* webaudio/DelayDSPKernel.cpp:
(WebCore::DelayDSPKernel::process):

LayoutTests:

* webaudio/delaynode-expected.txt: Added.
* webaudio/delaynode.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (94968 => 94969)


--- trunk/LayoutTests/ChangeLog	2011-09-12 18:12:12 UTC (rev 94968)
+++ trunk/LayoutTests/ChangeLog	2011-09-12 18:55:07 UTC (rev 94969)
@@ -1,3 +1,13 @@
+2011-09-12  Chris Rogers  <crog...@google.com>
+
+        DelayNode delay buffer is not correctly wrapping around
+        https://bugs.webkit.org/show_bug.cgi?id=67872
+
+        Reviewed by Kenneth Russell.
+
+        * webaudio/delaynode-expected.txt: Added.
+        * webaudio/delaynode.html: Added.
+
 2011-09-12  Arko Saha  <a...@motorola.com>
 
         Selectstart is not fired when selection was created by arrow keys.

Added: trunk/LayoutTests/webaudio/delaynode-expected.txt (0 => 94969)


--- trunk/LayoutTests/webaudio/delaynode-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/webaudio/delaynode-expected.txt	2011-09-12 18:55:07 UTC (rev 94969)
@@ -0,0 +1,9 @@
+Tests basic functionality of DelayNode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+PASS Test signal was correctly delayed.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/webaudio/delaynode.html (0 => 94969)


--- trunk/LayoutTests/webaudio/delaynode.html	                        (rev 0)
+++ trunk/LayoutTests/webaudio/delaynode.html	2011-09-12 18:55:07 UTC (rev 94969)
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+<link rel="stylesheet" href=""
+<script src=""
+</head>
+
+<body>
+
+<div id="description"></div>
+<div id="console"></div>
+
+<script>
+description("Tests basic functionality of DelayNode.");
+
+var sampleRate = 44100.0;
+
+var context;
+var toneBuffer;
+
+var renderLengthSeconds = 4;
+var delayTimeSeconds = 0.5;
+var toneLengthSeconds = 2;
+
+function createToneBuffer(frequency, numberOfCycles, sampleRate) {
+    var duration = numberOfCycles / frequency;
+    var sampleFrameLength = duration * sampleRate;
+    
+    var audioBuffer = context.createBuffer(1, sampleFrameLength, sampleRate);
+
+    var n = audioBuffer.length;
+    var data = ""
+
+    for (var i = 0; i < n; ++i)
+        data[i] = Math.sin(frequency * 2.0*Math.PI * i / sampleRate);
+
+    return audioBuffer;
+}
+
+function checkDelayedResult(event) {
+    var renderedBuffer = event.renderedBuffer;
+
+    var sourceData = toneBuffer.getChannelData(0);
+    var renderedData = renderedBuffer.getChannelData(0);
+    
+    var delayTimeFrames = delayTimeSeconds * sampleRate;
+    var toneLengthFrames = toneLengthSeconds * sampleRate;
+
+    var success = true;
+    
+    var n = renderedBuffer.length;
+    
+    for (var i = 0; i < n; ++i) {
+        if (i < delayTimeFrames) {
+            // Check that initial portion is 0 (since signal is delayed).
+            if (renderedData[i] != 0) {
+                success = false;
+                break;
+            }
+        } else if (i >= delayTimeFrames && i < delayTimeFrames + toneLengthFrames) {
+            // Make sure that the tone data is delayed by exactly the expected number of frames.
+            var j = i - delayTimeFrames;
+            if (renderedData[i] != sourceData[j]) {
+                success = false;
+                break;
+            }
+        } else {
+            // Make sure we have silence after the delayed tone.
+            if (renderedData[i] != 0) {
+                success = false;
+                break;
+            }
+        }    
+    }
+
+    if (success) {
+        testPassed("Test signal was correctly delayed.");
+    } else {
+        testFailed("Test signal was not correctly delayed.");
+    }
+
+    finishJSTest();
+}
+
+function runTest() {
+    if (window.layoutTestController) {
+        layoutTestController.dumpAsText();
+        layoutTestController.waitUntilDone();
+    }
+    
+    window.jsTestIsAsync = true;
+        
+    // Create offline audio context.
+    context = new webkitAudioContext(1, sampleRate * renderLengthSeconds, sampleRate);
+    toneBuffer = createToneBuffer(20, 20 * toneLengthSeconds, sampleRate); // 20Hz tone
+    
+    var bufferSource = context.createBufferSource();
+    bufferSource.buffer = toneBuffer;
+
+    var delay = context.createDelayNode();
+    delay.delayTime.value = delayTimeSeconds;
+
+    bufferSource.connect(delay);
+    delay.connect(context.destination);
+    bufferSource.noteOn(0);
+    
+    context._oncomplete_ = checkDelayedResult;
+    context.startRendering();
+}
+
+runTest();
+successfullyParsed = true;
+
+</script>
+
+<script src=""
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (94968 => 94969)


--- trunk/Source/WebCore/ChangeLog	2011-09-12 18:12:12 UTC (rev 94968)
+++ trunk/Source/WebCore/ChangeLog	2011-09-12 18:55:07 UTC (rev 94969)
@@ -1,3 +1,15 @@
+2011-09-12  Chris Rogers  <crog...@google.com>
+
+        DelayNode delay buffer is not correctly wrapping around
+        https://bugs.webkit.org/show_bug.cgi?id=67872
+
+        Reviewed by Kenneth Russell.
+
+        Test: webaudio/delaynode.html
+
+        * webaudio/DelayDSPKernel.cpp:
+        (WebCore::DelayDSPKernel::process):
+
 2011-09-12  Arko Saha  <a...@motorola.com>
 
         Selectstart is not fired when selection was created by arrow keys.

Modified: trunk/Source/WebCore/webaudio/DelayDSPKernel.cpp (94968 => 94969)


--- trunk/Source/WebCore/webaudio/DelayDSPKernel.cpp	2011-09-12 18:12:12 UTC (rev 94968)
+++ trunk/Source/WebCore/webaudio/DelayDSPKernel.cpp	2011-09-12 18:55:07 UTC (rev 94969)
@@ -108,7 +108,7 @@
         double desiredDelayFrames = m_currentDelayTime * sampleRate;
 
         double readPosition = m_writeIndex + bufferLength - desiredDelayFrames;
-        if (readPosition > bufferLength)
+        if (readPosition >= bufferLength)
             readPosition -= bufferLength;
 
         // Linearly interpolate in-between delay times.
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to