Bug 105518 - "PlaybackTime" parameter is not present in AudioProcessingEvent Interface as per W3C spec
Summary: "PlaybackTime" parameter is not present in AudioProcessingEvent Interface as ...
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: Web Audio (show other bugs)
Version: 528+ (Nightly build)
Hardware: PC Linux
: P2 Major
Assignee: Praveen Jadhav
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-12-20 02:28 PST by kdj
Modified: 2014-04-15 13:01 PDT (History)
19 users (show)

See Also:


Attachments
Patch (8.47 KB, patch)
2013-03-04 22:51 PST, Praveen Jadhav
webkit.review.bot: commit-queue-
Details | Formatted Diff | Diff
Patch (8.90 KB, patch)
2013-03-05 02:38 PST, Praveen Jadhav
webkit.review.bot: commit-queue-
Details | Formatted Diff | Diff
Patch (8.92 KB, patch)
2013-03-05 17:32 PST, Praveen Jadhav
haraken: review-
webkit.review.bot: commit-queue-
Details | Formatted Diff | Diff
Patch (9.04 KB, patch)
2013-03-06 02:50 PST, Praveen Jadhav
haraken: review-
webkit.review.bot: commit-queue-
Details | Formatted Diff | Diff
Patch (10.61 KB, patch)
2013-03-11 00:55 PDT, Praveen Jadhav
no flags Details | Formatted Diff | Diff
WIP (15.49 KB, patch)
2013-03-14 23:35 PDT, Praveen Jadhav
webkit.review.bot: commit-queue-
Details | Formatted Diff | Diff
Patch (16.26 KB, patch)
2013-03-15 04:36 PDT, Praveen Jadhav
webkit.review.bot: commit-queue-
Details | Formatted Diff | Diff
Patch (16.19 KB, patch)
2013-03-16 04:18 PDT, Praveen Jadhav
no flags Details | Formatted Diff | Diff
Patch (13.41 KB, patch)
2013-03-24 03:21 PDT, Praveen Jadhav
no flags Details | Formatted Diff | Diff
Patch (33.35 KB, patch)
2013-04-04 00:03 PDT, Praveen Jadhav
buildbot: commit-queue-
Details | Formatted Diff | Diff
Patch (13.14 KB, patch)
2013-04-10 02:30 PDT, Praveen Jadhav
no flags Details | Formatted Diff | Diff
Patch (9.76 KB, patch)
2014-04-10 03:43 PDT, Praveen Jadhav
no flags Details | Formatted Diff | Diff
Patch (9.82 KB, patch)
2014-04-10 20:17 PDT, Praveen Jadhav
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description kdj 2012-12-20 02:28:32 PST
As per W3C WebAudio Spec AudioProcessingEvent Interface should have parameters like below:

interface AudioProcessingEvent : Event {

        JavaScriptAudioNode node;
        readonly attribute float playbackTime;
        readonly attribute AudioBuffer inputBuffer;
        readonly attribute AudioBuffer outputBuffer; 

    }

W3C Spec link: http://www.w3.org/TR/2012/WD-webaudio-20120802/

The parameter "playbackTime" is not present in latest WebKit-137862. Also if required, necessary calculations to update the playbackTime parameter need to be implemented in AudioProcessingEvent.

Current Implementation AudioProcessingEvent.idl:
[
    Conditional=WEB_AUDIO,
    JSGenerateToJSObject
] interface AudioProcessingEvent : Event {
    readonly attribute AudioBuffer inputBuffer;
    readonly attribute AudioBuffer outputBuffer; 
};
Comment 1 Praveen Jadhav 2013-03-03 19:32:43 PST
Hi Chris Rogers,

I am interesting in proposing a patch for this issue. Shall I update?
Comment 2 Chris Rogers 2013-03-03 21:17:59 PST
(In reply to comment #1)
> Hi Chris Rogers,
> 
> I am interesting in proposing a patch for this issue. Shall I update?

You can give it a try, but it's a bit tricky since you have to account for the latency caused by the buffer size.  It's possible with careful work.
Comment 3 Praveen Jadhav 2013-03-03 21:48:49 PST
(In reply to comment #2)
> (In reply to comment #1)
> > Hi Chris Rogers,
> > 
> > I am interesting in proposing a patch for this issue. Shall I update?
> 
> You can give it a try, but it's a bit tricky since you have to account for the latency caused by the buffer size.  It's possible with careful work.

Sorry for the typo. It should have been "interested" and not "interesting" in my previous comment.

About the playbackTime, shouldn't the value be just the context's currentTime plus inputBuffer's duration?
duration for a given ScriptProcessorNode object will remain a constant and accounts for the latency(time taken to play 1 buffer) and currentTime of the context provides the time offset.
Comment 4 Praveen Jadhav 2013-03-04 00:00:36 PST
(In reply to comment #3)
> (In reply to comment #2)
> > (In reply to comment #1)
> > > Hi Chris Rogers,
> > > 
> > > I am interesting in proposing a patch for this issue. Shall I update?
> > 
> > You can give it a try, but it's a bit tricky since you have to account for the latency caused by the buffer size.  It's possible with careful work.
> 
> Sorry for the typo. It should have been "interested" and not "interesting" in my previous comment.
> 
> About the playbackTime, shouldn't the value be just the context's currentTime plus inputBuffer's duration?
> duration for a given ScriptProcessorNode object will remain a constant and accounts for the latency(time taken to play 1 buffer) and currentTime of the context provides the time offset.

I tested with the above mentioned changes which takes care of the input time. But still the latency part is not handled with this as it depends on the nodes that are connected while processing the audio. Its indeed a tricky implementation.:)
Comment 5 Praveen Jadhav 2013-03-04 22:51:48 PST
Created attachment 191405 [details]
Patch

Patch includes the basic implementation for 'playbackTime' attribute in AudioProcessingEvent. Latency because of buffer size is handled by adding buffer duration to playback time(seems like a crude way though). Tested with basic cases and seems like it is working fine(needs more realtime cases to understand how exactly this will affect).
Delay caused by delayNode is not considered.
Comment 6 WebKit Review Bot 2013-03-05 00:59:56 PST
Comment on attachment 191405 [details]
Patch

Attachment 191405 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://webkit-commit-queue.appspot.com/results/17000012

New failing tests:
webaudio/audioprocessingevent-basic.html
webaudio/javascriptaudionode-zero-input-channels.html
Comment 7 Praveen Jadhav 2013-03-05 02:38:53 PST
Created attachment 191443 [details]
Patch

Test case updated.
Comment 8 WebKit Review Bot 2013-03-05 03:34:01 PST
Comment on attachment 191443 [details]
Patch

Attachment 191443 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://webkit-commit-queue.appspot.com/results/17009065

New failing tests:
webaudio/audioprocessingevent-basic.html
webaudio/javascriptaudionode-zero-input-channels.html
Comment 9 Praveen Jadhav 2013-03-05 17:32:35 PST
Created attachment 191618 [details]
Patch

callback function 'process' is changed to 'processAudioData' in audioprocessingevent-basic.html. It seems strange that only chromium-ews fails.

Latency is calculated based on outputBuffer duration rather than inputBuffer's. As a null check is already inplace for outputBuffer for 0 numberOfOutputChannels.
Comment 10 WebKit Review Bot 2013-03-05 18:26:07 PST
Comment on attachment 191618 [details]
Patch

Attachment 191618 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://webkit-commit-queue.appspot.com/results/17081050

New failing tests:
webaudio/audioprocessingevent-basic.html
Comment 11 Praveen Jadhav 2013-03-05 19:14:11 PST
Hi Kentaro Hara,

Can you please review the patch I have included here?
It seems I am missing something in the new layout test case added here. Maybe "context.oncomplete = finishJSTest"(not sure). But the current approach is working for me. Only chromium-ews fails.
Comment 12 Kentaro Hara 2013-03-05 21:11:44 PST
Comment on attachment 191618 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=191618&action=review

> Maybe "context.oncomplete = finishJSTest"(not sure). But the current approach is working for me. Only chromium-ews fails.

What is the failure?

> Source/WebCore/ChangeLog:9
> +        Attribute "playbackTime" in AudioProcessingEvent implemented to pass current audio time
> +        of the context.

Please add the spec link here.

> Source/WebCore/Modules/webaudio/AudioProcessingEvent.idl:29
> +    readonly attribute double playbackTime;

The spec specifies 'float' not 'double'. You need to align the implementation with the spec or propose to change the spec:)

> Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp:252
> -        dispatchEvent(AudioProcessingEvent::create(inputBuffer, outputBuffer));
> +        // FIXME: Delay node is not considered while calculating playbackTime. Latency should be retested with more scenarios.
> +        dispatchEvent(AudioProcessingEvent::create(inputBuffer, outputBuffer, context()->currentTime() + outputBuffer->duration()));

Why is this change needed?
Comment 13 Praveen Jadhav 2013-03-05 21:53:14 PST
(In reply to comment #12)
> (From update of attachment 191618 [details])
> View in context: https://bugs.webkit.org/attachment.cgi?id=191618&action=review
> 
> > Maybe "context.oncomplete = finishJSTest"(not sure). But the current approach is working for me. Only chromium-ews fails.
> 
> What is the failure?

The test case goes for timeout. The error log link is in the path http://webkit-commit-queue.appspot.com/results/17081050. I couldn't makeout the reason behind this failure. Any comments/suggestions will be appreciated.

> 
> > Source/WebCore/ChangeLog:9
> > +        Attribute "playbackTime" in AudioProcessingEvent implemented to pass current audio time
> > +        of the context.
> 
> Please add the spec link here.

I will take care of this in the next patch.

> 
> > Source/WebCore/Modules/webaudio/AudioProcessingEvent.idl:29
> > +    readonly attribute double playbackTime;
> 
> The spec specifies 'float' not 'double'. You need to align the implementation with the spec or propose to change the spec:)

WebAudio specifications https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioProcessingEvent actually says it is of 'double' type:)

> 
> > Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp:252
> > -        dispatchEvent(AudioProcessingEvent::create(inputBuffer, outputBuffer));
> > +        // FIXME: Delay node is not considered while calculating playbackTime. Latency should be retested with more scenarios.
> > +        dispatchEvent(AudioProcessingEvent::create(inputBuffer, outputBuffer, context()->currentTime() + outputBuffer->duration()));
> 
> Why is this change needed?

The value "context()->currentTime() + outputBuffer->duration()" informs the time at which the inputBuffer will be processed by ScriptProcessorNode.

2 inputBuffers and 2 outputBuffers of equal size based on 'bufferSize' param are alloted when ScriptProcessorNode object is created and are indexed 0 and 1. The size of these inputBuffers/outputBuffers remains a constant throughout. Also, inputBuffer[0] and inputBuffer[1] are processed alternatively(same with outputBuffers). dispatchEvent() to create AudioProcessingEvent object is called periodically and immediately after one buffer is completely processed.

Hence the playbackTime of the next inputBuffer is context's currentTime() plus the total duration of outputBuffer(or inputBuffer) which provides the required offset to handle latency.
Comment 14 Kentaro Hara 2013-03-05 22:12:59 PST
(In reply to comment #13)
> > What is the failure?
> 
> The test case goes for timeout. The error log link is in the path http://webkit-commit-queue.appspot.com/results/17081050. I couldn't makeout the reason behind this failure. Any comments/suggestions will be appreciated.
> 

hmm, I have no idea...

> > > Source/WebCore/Modules/webaudio/AudioProcessingEvent.idl:29
> > > +    readonly attribute double playbackTime;
> > 
> > The spec specifies 'float' not 'double'. You need to align the implementation with the spec or propose to change the spec:)
> 
> WebAudio specifications https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AudioProcessingEvent actually says it is of 'double' type:)

Makes sense!
Comment 15 Praveen Jadhav 2013-03-06 02:50:12 PST
Created attachment 191697 [details]
Patch

context.oncomplete = finishJSTest; included in the newly added test case.
Comment 16 Kentaro Hara 2013-03-06 03:13:19 PST
Comment on attachment 191697 [details]
Patch

LGTM if it passes the chromium-bot. Please cq+ it after confirming the bot result.
Comment 17 WebKit Review Bot 2013-03-06 03:36:12 PST
Comment on attachment 191697 [details]
Patch

Attachment 191697 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://webkit-commit-queue.appspot.com/results/17003151

New failing tests:
webaudio/audioprocessingevent-basic.html
Comment 18 Kentaro Hara 2013-03-06 03:36:51 PST
Comment on attachment 191697 [details]
Patch

:(
Comment 19 Praveen Jadhav 2013-03-06 03:40:16 PST
(In reply to comment #18)
> (From update of attachment 191697 [details])
> :(

I am running out of ideas.. :(
Comment 20 Kentaro Hara 2013-03-06 03:48:05 PST
Comment on attachment 191697 [details]
Patch

I tested locally and confirmed that the test times out.

I think it's easy to build chromium (especially if you have Linux or Mac).
Comment 21 Praveen Jadhav 2013-03-07 19:01:14 PST
I tried building chromium on my Linux PC, but for security reasons downloading from http://src.chromium.org is blocked.

I went through all the other working test cases and observed that

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

window.jsTestIsAsync = true;

is missing in the patch I uploaded. Explaination about this doesn't really relate to the timeout issue I face in chromium-bot.

Is this a mandatory requirement for chromium(especially in async test cases)?
Comment 22 Kentaro Hara 2013-03-07 19:17:58 PST
(In reply to comment #21)
> I tried building chromium on my Linux PC, but for security reasons downloading from http://src.chromium.org is blocked.
> 
> I went through all the other working test cases and observed that
> 
> if (window.testRunner) {
>     testRunner.dumpAsText();
>     testRunner.waitUntilDone();
> }
> 
> window.jsTestIsAsync = true;
> 
> is missing in the patch I uploaded. Explaination about this doesn't really relate to the timeout issue I face in chromium-bot.
> 
> Is this a mandatory requirement for chromium(especially in async test cases)?

I don't think the behavior is platform-dependent. jsTestIsAsync=true should be coupled with finishJSTest(). waitUntilDone() should be coupled with notifyDone(). Either of the two is enough.

Maybe in chromium the oncomplete handler is not triggered, is it? How about calling finishJSTest() at the end of processAudioData() ?
Comment 23 Chris Rogers 2013-03-07 19:21:06 PST
Praveen, if we can't get a layout test confirming that the playbackTime is correct, can we create a manual test where the playbackTime is used to play a sin() tone with the phase controlled by the playbackTime.  Then we can use an AudioBufferSourceNode (or an OscillatorNode) playing a sin() tone with the inverse phase to verify that the tones overlay perfectly and cancel each other out (silence).  Does this make sense?  If the playbackTime is not correct, then there will be an audible tone.

I would like to make sure that if we implement the attribute that the value reported is correct.
Comment 24 Kentaro Hara 2013-03-07 19:21:49 PST
Ah, got it.

Layout tests are running on cr-linux and mac only. And all Web Audio tests are disabled on mac. Thus, this would not be a chromium-specific problem. I guess that your test will fail on all platforms.
Comment 25 Praveen Jadhav 2013-03-07 19:38:50 PST
Chris, your suggestion makes sense as manual testing can make sure even the implementation is validated.
And as Kentaro Hara mentioned, the layout test I prepared might have an error.

I will retest the implementation and get back to you guys.
Comment 26 Kentaro Hara 2013-03-07 19:39:55 PST
(In reply to comment #25)
> I will retest the implementation and get back to you guys.

Thanks. Timeout means that finishJSTest() is not called. I'd guess that the oncomplete handler is not called.
Comment 27 Praveen Jadhav 2013-03-11 00:55:16 PDT
Created attachment 192417 [details]
Patch

As discussed, patch has been updated with a manual test case.

Here, SINE wave from  Oscillator node is taken as an input and using playbackTime and buffer duration, inverse sine value is overlapped on the original source. The resultant output is amplified using gain node and then passed to destination. No sound(noise) heard at the output.
Comment 28 Kentaro Hara 2013-03-11 01:00:32 PDT
(In reply to comment #27)
> Created an attachment (id=192417) [details]
> Patch
> 
> As discussed, patch has been updated with a manual test case.

Did you find why you cannot run the test on layout tests? Basically it's not a good idea to put a test into manual tests just because it fails on layout tests for an unknown reason. (I'd like to leave the decision up to crogers@.)
Comment 29 Praveen Jadhav 2013-03-11 01:37:33 PDT
(In reply to comment #28)
> (In reply to comment #27)
> > Created an attachment (id=192417) [details] [details]
> > Patch
> > 
> > As discussed, patch has been updated with a manual test case.
> 
> Did you find why you cannot run the test on layout tests? Basically it's not a good idea to put a test into manual tests just because it fails on layout tests for an unknown reason. (I'd like to leave the decision up to crogers@.)

After making so many trials, I am suspecting shouldBeDefined() which I am usin(In reply to comment #28)
> (In reply to comment #27)
> > Created an attachment (id=192417) [details] [details]
> > Patch
> > 
> > As discussed, patch has been updated with a manual test case.
> 
> Did you find why you cannot run the test on layout tests? Basically it's not a good idea to put a test into manual tests just because it fails on layout tests for an unknown reason. (I'd like to leave the decision up to crogers@.)

I couldn't makeout the reason why LayoutTest failed. I would love to include both manual testcase as well as the layout testcase.

As you suggested in comment 22, I had included finishJSTest() in processAudioData() in my first and second patch. But that failed too. Then I suspected shouldBeDefined(). But that too is working fine in my local test using efl port.

One more possible pitfall was is in using
scriptAudioNode = context.createJavaScriptNode(4096, 1, 1); (learnt while creating manual test case. It went for an infinite loop unexpectedly). Instead of this, if I use scriptAudioNode = context.createJavaScriptNode(4096); with default input and output number of channels, It works fine. However, I can't verify if this is the actual reason for failing in chromium.
Comment 30 Praveen Jadhav 2013-03-11 03:44:01 PDT
(In reply to comment #28)
> (In reply to comment #27)
> > Created an attachment (id=192417) [details] [details]
> > Patch
> > 
> > As discussed, patch has been updated with a manual test case.
> 
> Did you find why you cannot run the test on layout tests? Basically it's not a good idea to put a test into manual tests just because it fails on layout tests for an unknown reason. (I'd like to leave the decision up to crogers@.)

Apparently, I had made a mistake in LayoutTest case uploaded earlier by calling createJavaScriptNode() which is an older implementation. The new JS call, createScriptProcessor() seems to work fine.

Let me know if you want me to add the Layout test case as well. Layout test will check for the existance of all the attributes(basic test) and Manual test will make sure that value playbackTime passed in playback time is proper.
Comment 31 Kentaro Hara 2013-03-11 03:45:20 PDT
(In reply to comment #30)
> Let me know if you want me to add the Layout test case as well. Layout test will check for the existance of all the attributes(basic test) and Manual test will make sure that value playbackTime passed in playback time is proper.

If there is a layout test, it's best:)
Comment 32 Chris Rogers 2013-03-11 12:37:02 PDT
Comment on attachment 192417 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=192417&action=review

Looks like good progress is being made on the test, but it needs to be refined.  I agree with Kentaro that once we have the manual test properly working (which it isn't yet), then we will want to convert it to a proper layout test.  Please see resources/javascriptaudionode-testing.js and the several layout tests that use it to see how to make a working test for the ScriptProcessorNode.  Please note for this type of test the comment:

// For the current implementation of JavaScriptAudioNode, when it works with OfflineAudioContext (which runs much faster
// than real-time) the event.inputBuffer might be overwrite again before onaudioprocess ever get chance to be called.
// We carefully arrange the renderLengthInFrames and bufferSize to have exactly the same value to avoid this issue.

This means that the offline context must render for a duration which is only one or two times the buffer-size used in the ScriptProcessorNode (we only want the processAudioData() function to be called one time)

> ManualTests/webaudio/audioprocessingevent-playback-manual.html:7
> +        var scriptAudioNode = context.createScriptProcessor(4096);

In this case, we might as well create this node with 1 input channel and 1 output channel, since then we don't have to worry about left/right in processAudioData()

> ManualTests/webaudio/audioprocessingevent-playback-manual.html:13
> +        var frequency = 25;

This frequency is a bit low -- I suggest 100

> ManualTests/webaudio/audioprocessingevent-playback-manual.html:14
> +        var duration = 5000;

duration should be a value in seconds (5) and not use setTimeout() as I mention below

> ManualTests/webaudio/audioprocessingevent-playback-manual.html:18
> +            var inputArrayR = event.inputBuffer.getChannelData(1);

If the ScriptProcessorNode has 1 input channel and 1 output channel then we don't need to worry about left/right

> ManualTests/webaudio/audioprocessingevent-playback-manual.html:23
> +            var phase = (2 * Math.PI) * inputArrayL.duration * frequency;

inputArrayL.duration is not defined!  So phase ends up being NaN.  So this test is not really correctly testing silence, but is just rendering NaN
(which happens to kind of sound like silence :)  Once the comments below are fixed, be SUSPICIOUS and run the test with the "offset" purposefully moved to 
incorrect values to validate that a correct and pure sine wave is heard if not completely cancelled by inverse phase.

  The "phase" variable is not really correctly named and it depends on the input buffer length.
We'd like this test to work correctly and render a sine wave for multiple buffers, so we need to keep the "playbackIndex" (what you're currently tracking as "i") as state between calls to processAudioData(). 
Otherwise, as the code currently is, it will not render a continuous sine wave that has continuity between calls to processAudioData().   Instead it currently will render glitches at between buffers -- it's not seamless.

You'll want something like:

for (var i = 0; i < n; ++i, ++renderIndex) {
    outputArray[i] = inputArray[i] - Math.sin(offset + (playbackIndex * phaseIncrement));
}

where the "playbackIndex" variable is initialized to 0 outside the scope of processAudioData()
and "phaseIncrement" is calculated based on sample-rate and the frequency

> ManualTests/webaudio/audioprocessingevent-playback-manual.html:37
> +            oscillator.noteOn(0);

please don't use noteOn() - the newer name is start()

> ManualTests/webaudio/audioprocessingevent-playback-manual.html:38
> +            setTimeout(function(){ oscillator.disconnect(); }, duration);

please don't use setTimeout()!  Instead use stop().  Overall, you can have something like:

            var startTime = context.currentTime;
            oscillator.start(startTime);
            oscillator.stop(startTime + duration);

> ManualTests/webaudio/audioprocessingevent-playback-manual.html:51
> +            setTimeout(function(){ scriptAudioNode.onaudioprocess = null; scriptAudioNode.disconnect(); oscillator.disconnect(); }, duration);

ditto, no setTimeout()
Comment 33 Praveen Jadhav 2013-03-14 23:35:05 PDT
Created attachment 193241 [details]
WIP

Good thing to have pointed out "inputArrayL.duration" not defined. I did some more trials with the test case and have updated the comments.

I couldn't verify the test with OfflineAudioContext because of audio rendering and hence continued with normal AudioContext. However, I have made provision to cyclically increase bufferSize of scriptProcessorNode with each test. i.e., scriptProcessorNode will be created with bufferSize of 256, 512, 1024,..., 16384, 256, 512..etc so that we can verify for all bufferSize values.

Glitch happens with this test at lower bufferSize(256 and 512) values and as the size increases, there is not noticable glitch problem. Also, In the current testcase, audio glitch is noticable when switching from first callback to second in all cases since outputBuffer will be filled with 0s before that.

I have replaced noteOn() with start() but not using stop() as I need a callback function to reset onaudioprocess to null at the end of 'duration'(else, audio continues to play data generated by Math.sin() function).

I have included a layout test case to validate attributes of AudioProcessingEvent as well. In this case, I am using createScriptProcessor() instead of createJavaScriptNode() to correct Timeout error observed in earlier patches. Not sure if we can include the changes implemented in manual test case to layout test as this shouldn't be automated.


Finally, about the logic, m_playbackTime variable is introduced and its value is set before calling callOnMainThread()(to avoid glitch issue between buffers). The output of the overlapping SINE waves is not exactly silent always, but varies with each test from 0 to 2 radians(~116 degrees) for 100Hz frequency and outputBuffer always lagged behind inputBuffer. This works out be to a delay of upto 3ms than the calculated value in m_playbackTime. I tried with below logic to account for the delay:

           m_playbackTime = context()->currentTime() + outputBuffer->duration() - (framesToProcess / context()->sampleRate());

but the phase variation changed for each test. Any inputs for this?
Comment 34 WebKit Review Bot 2013-03-15 00:33:25 PDT
Comment on attachment 193241 [details]
WIP

Attachment 193241 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://webkit-commit-queue.appspot.com/results/17218097

New failing tests:
webaudio/audioprocessingevent-basic.html
Comment 35 Praveen Jadhav 2013-03-15 04:36:44 PDT
Created attachment 193280 [details]
Patch

Patch updated with layout test.
Comment 36 WebKit Review Bot 2013-03-15 05:42:30 PDT
Comment on attachment 193280 [details]
Patch

Attachment 193280 [details] did not pass chromium-ews (chromium-xvfb):
Output: http://webkit-commit-queue.appspot.com/results/17074653

New failing tests:
webaudio/audioprocessingevent-basic.html
fast/js/dfg-inline-resolve.html
Comment 37 Soo-Hyun Choi 2013-03-15 13:18:53 PDT
FYI - changed the assignee to Praveen Jadhav <praveen.j@samsung.com>.
Comment 38 Praveen Jadhav 2013-03-16 04:18:01 PDT
Created attachment 193436 [details]
Patch
Comment 39 Praveen Jadhav 2013-03-24 03:21:04 PDT
Created attachment 194741 [details]
Patch

Manual test case removed and layout test case updated.
Comment 40 Chris Dumez 2013-04-01 06:48:45 PDT
Comment on attachment 194741 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=194741&action=review

> Source/WebCore/ChangeLog:8
> +        Attribute "playbackTime" in AudioProcessingEvent implemented to pass current audio time

According to the spec, playbackTime is not necessarily the current audio time of the context. It is the time when the audio will be played, in the same time coordinate system as AudioContext.currentTime.

> Source/WebCore/Modules/webaudio/AudioProcessingEvent.cpp:41
> +PassRefPtr<AudioProcessingEvent> AudioProcessingEvent::create(PassRefPtr<AudioBuffer> inputBuffer, PassRefPtr<AudioBuffer> outputBuffer, double time)

"playbackTime"?

> Source/WebCore/Modules/webaudio/AudioProcessingEvent.cpp:46
>  AudioProcessingEvent::AudioProcessingEvent()

We should probably initialize m_playbackTime to 0 here to be safe.

> Source/WebCore/Modules/webaudio/AudioProcessingEvent.cpp:50
> +AudioProcessingEvent::AudioProcessingEvent(PassRefPtr<AudioBuffer> inputBuffer, PassRefPtr<AudioBuffer> outputBuffer, double time)

"playbackTime"?

> Source/WebCore/Modules/webaudio/AudioProcessingEvent.h:40
> +    static PassRefPtr<AudioProcessingEvent> create(PassRefPtr<AudioBuffer> inputBuffer, PassRefPtr<AudioBuffer> outputBuffer, double time);

"playbackTime"?

> Source/WebCore/Modules/webaudio/AudioProcessingEvent.h:46
> +    double playbackTime() { return m_playbackTime; }

Getter could be const.

> Source/WebCore/Modules/webaudio/AudioProcessingEvent.h:52
> +    AudioProcessingEvent(PassRefPtr<AudioBuffer> inputBuffer, PassRefPtr<AudioBuffer> outputBuffer, double time);

"playbackTime"?

> Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp:200
> +        m_playbackTime = (m_playbackTime > 0) ? m_playbackTime : 0;

m_playbackTime = std::max(0., context()->currentTime() - outputBuffer->duration()); // might be clearer.

> Source/WebCore/Modules/webaudio/ScriptProcessorNode.h:111
> +    // For AudioProcessingEvent

Not really needed. In any case, should end with a period.

> LayoutTests/webaudio/audioprocessingevent.html:38
> +    for (var i = 0; i < n; ++i) {

Curly brackets can be omitted.

> LayoutTests/webaudio/audioprocessingevent.html:43
> +        if (outputArray[i].toFixed(3) != 0.000)

shouldBeCloseTo() from js-test-pre.js may do what you want and will print out something if the the check passes, not only if it fails.
Comment 41 Praveen Jadhav 2013-04-04 00:03:19 PDT
Created attachment 196446 [details]
Patch

Updated patch attached.
Comment 42 Praveen Jadhav 2013-04-04 00:07:35 PDT
(In reply to comment #40)
> (From update of attachment 194741 [details])
> View in context: https://bugs.webkit.org/attachment.cgi?id=194741&action=review
> 
> > Source/WebCore/ChangeLog:8
> > +        Attribute "playbackTime" in AudioProcessingEvent implemented to pass current audio time
> 
> According to the spec, playbackTime is not necessarily the current audio time of the context. It is the time when the audio will be played, in the same time coordinate system as AudioContext.currentTime.
> 
> > Source/WebCore/Modules/webaudio/AudioProcessingEvent.cpp:41
> > +PassRefPtr<AudioProcessingEvent> AudioProcessingEvent::create(PassRefPtr<AudioBuffer> inputBuffer, PassRefPtr<AudioBuffer> outputBuffer, double time)
> 
> "playbackTime"?
> 
> > Source/WebCore/Modules/webaudio/AudioProcessingEvent.cpp:46
> >  AudioProcessingEvent::AudioProcessingEvent()
> 
> We should probably initialize m_playbackTime to 0 here to be safe.
> 
> > Source/WebCore/Modules/webaudio/AudioProcessingEvent.cpp:50
> > +AudioProcessingEvent::AudioProcessingEvent(PassRefPtr<AudioBuffer> inputBuffer, PassRefPtr<AudioBuffer> outputBuffer, double time)
> 
> "playbackTime"?
> 
> > Source/WebCore/Modules/webaudio/AudioProcessingEvent.h:40
> > +    static PassRefPtr<AudioProcessingEvent> create(PassRefPtr<AudioBuffer> inputBuffer, PassRefPtr<AudioBuffer> outputBuffer, double time);
> 
> "playbackTime"?
> 
> > Source/WebCore/Modules/webaudio/AudioProcessingEvent.h:46
> > +    double playbackTime() { return m_playbackTime; }
> 
> Getter could be const.
> 
> > Source/WebCore/Modules/webaudio/AudioProcessingEvent.h:52
> > +    AudioProcessingEvent(PassRefPtr<AudioBuffer> inputBuffer, PassRefPtr<AudioBuffer> outputBuffer, double time);
> 
> "playbackTime"?
> 
> > Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp:200
> > +        m_playbackTime = (m_playbackTime > 0) ? m_playbackTime : 0;
> 
> m_playbackTime = std::max(0., context()->currentTime() - outputBuffer->duration()); // might be clearer.
> 
> > Source/WebCore/Modules/webaudio/ScriptProcessorNode.h:111
> > +    // For AudioProcessingEvent
> 
> Not really needed. In any case, should end with a period.
> 
> > LayoutTests/webaudio/audioprocessingevent.html:38
> > +    for (var i = 0; i < n; ++i) {
> 
> Curly brackets can be omitted.
> 
> > LayoutTests/webaudio/audioprocessingevent.html:43
> > +        if (outputArray[i].toFixed(3) != 0.000)
> 
> shouldBeCloseTo() from js-test-pre.js may do what you want and will print out something if the the check passes, not only if it fails.

All your comments are included in the latest patch.
Comment 43 Build Bot 2013-04-04 18:59:38 PDT
Comment on attachment 196446 [details]
Patch

Attachment 196446 [details] did not pass win-ews (win):
Output: http://webkit-commit-queue.appspot.com/results/17453269
Comment 44 Praveen Jadhav 2013-04-10 02:30:23 PDT
Created attachment 197229 [details]
Patch

Fourth param of ShouldBeCloseTo() is set to true since a huge test expected file is required if it is not done so.
Comment 45 Andreas Kling 2014-02-05 11:21:16 PST
Comment on attachment 197229 [details]
Patch

Clearing review flag on patches from before 2014. If this patch is still relevant, please reset the r? flag.
Comment 46 Praveen Jadhav 2014-04-10 03:43:42 PDT
Created attachment 229040 [details]
Patch

Patch based on Blink source change https://codereview.chromium.org/210973002
Comment 47 Eric Carlson 2014-04-10 07:11:46 PDT
Comment on attachment 229040 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=229040&action=review

> Source/WebCore/ChangeLog:9
> +        Attribute "playbackTime" in AudioProcessingEvent implemented to pass playback time of
> +        audiobuffer associated with ScriptProcessorNode of the context.

Please reference the Blink bug this is based on.

> Source/WebCore/Modules/webaudio/ScriptProcessorNode.cpp:261
> +        double playbackTime = (context()->currentSampleFrame() + m_bufferSize) /static_cast<double>(context()->sampleRate());

Nit: missing space after "/"
Comment 48 Praveen Jadhav 2014-04-10 20:17:03 PDT
Created attachment 229099 [details]
Patch

Patch updated.
Comment 49 Jer Noble 2014-04-11 09:22:22 PDT
Comment on attachment 229099 [details]
Patch

r=me
Comment 50 WebKit Commit Bot 2014-04-11 09:53:05 PDT
Comment on attachment 229099 [details]
Patch

Clearing flags on attachment: 229099

Committed r167131: <http://trac.webkit.org/changeset/167131>
Comment 51 WebKit Commit Bot 2014-04-11 09:53:14 PDT
All reviewed patches have been landed.  Closing bug.
Comment 52 Alexey Proskuryakov 2014-04-15 13:01:55 PDT
Unfortunately, script processor nodes are somewhat broken currently (see bug 112521), so I had to add a TestExpectation for the test added here, effectively disabling it.