- From: lonce wyse <lonce.wyse@zwhome.org>
- Date: Sun, 29 Jul 2012 09:22:29 +0800
- To: public-audio@w3.org
Hello,
What is the algorithm WebAudio uses for scheduling the order in
which different AudioNode.onaudioprocess() methods are called?
Is it the order in which they are created?
I think that in my "event generation" example, the only reason I
could generate events in one node for another *within* the time of the
onaudioprocess() buffer, is because the onaudioprocess() callback of the
node receiving events was luckily being scheduled after the one for the
event generator node.
Thanks,
- lonce
On 28/7/2012 10:12 AM, lonce wyse wrote:
>
> Hello,
>
> Joe, you were right, of course, that generating events in
> onaudioprocess() provides no accuracy advantages over other methods.
> It is just a callback like any other in that respect.
>
> There are a couple reasons, why you might want to use a
> JavaScriptAudioNode onaudioprocess() as a callback for generating events.
> a) the buffer is "the right size" allowing you to generate events
> with the same kind of real-time responsiveness as the audio synthesis,
> b) permits you to intimately coordinate audio generation with
> event generation if you are so inclined.
>
> Anyway, I was curious about whether events generated within the
> onaudioprocess() buffer period would be handled in a timely fashion,
> so I wrote this little test model:
> http://anclab.org/webaudio/timing/noiseTick.html
>
> You can adjust the size of the "compute ahead" window. As you will
> see, you can reduce that time to pretty much exactly the audio buffer
> size (extending perhaps a few ms to cover jitter) with excellent
> timing performance.
>
> Best,
> - lonce
>
>
> On 26/7/2012 9:24 PM, Joseph Berkovitz wrote:
>> Actually, I don't think that this demo illustrates a good technique
>> for a sequencer. The JavaScriptAudioNode doesn't do anything here
>> except generate events, and there is going to be jitter in these
>> events, just as there is jitter in any other callback. It is not
>> reliable to use the timing of onaudioprocess events as an indicator
>> of real time, as this demo appears to do.
>>
>> Using noteOn/noteOff to schedule nodes that produce sound a short
>> time in the future is the way to go. If you are using that technique
>> correctly, you get true sample-accurate timing and very little
>> sensitivity to the callback mechanism.
>>
>>> If you put an audioContext.currentTime in your
>>> JavaScriptAudioNode.onprocessaudio() function you will notice some
>>> slop in the time it reports (that's fine, I suppose, if it is
>>> accurately reflecting the jitter in the callbacks). But what you
>>> would really like, presumably, is to know the exact time in the
>>> sample stream that buffer you are filling corresponds to. To do
>>> that, you just need to keep track of the number of samples you have
>>> processed since starting. This would produce rock solid timing of
>>> audio events even if the buffer size changed on every callback or if
>>> there was jitter in the interval between callbacks.
>> An AudioProcessingEvent exposes the exact time of the audio to be
>> generated in the sample stream as the "playbackTime" attribute. Not
>> that this makes callbacks any more useful as a source of exact
>> timing, but it does mean that there is no need to keep track of time
>> in separate variables.
>>
>> ...Joe
>
>
>
>
Received on Sunday, 29 July 2012 01:23:39 UTC