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