W3C home > Mailing lists > Public > public-audio@w3.org > January to March 2012

Re: oscillators and the Web Audio API

From: Robert O'Callahan <robert@ocallahan.org>
Date: Thu, 9 Feb 2012 13:14:39 +1300
Message-ID: <CAOp6jLby37huGWnRxpKObzoYFsPW28w+o=yXrbxqkZD9et3Lnw@mail.gmail.com>
To: Chris Rogers <crogers@google.com>
Cc: public-audio@w3.org
On Thu, Feb 9, 2012 at 11:40 AM, Chris Rogers <crogers@google.com> wrote:

> Ok, but you said that the ProcessedMediaStream implementation "spreads the
> processing for different streams across all available cores".  For the sake
> of argument, let's say that we have a chain of 6 ProcessedMediaStream
> objects and they're using 6 cores on an 8-core machine (one core/thread
> per ProcessedMediaStream).  That means that the kernel has to schedule 6
> threads one after the other SERIALLY!  This is with
> each ProcessedMediaStream thread getting scheduled (waking up), processing,
> then blocking/sleeping to wait for next available work, with the next
> stream in the chain taking the processed audio from the previous one.
>

My code currently does something even worse than that; another thread has
to run a control loop to hand the data from one ProcessedMediaStream to
another. But that's fixable, and the scenario you describe can be improved
on too. When we finish the onprocessmedia event for one Worker, we can have
that thread dispatch the onprocessmedia event for the next Worker without
yielding.

And, of course, every single Web Worker context could garbage collect at
> any time - in the worst cases two or more could gc serially with the delay
> being cumulative.
>

In practice, GC is totally insignificant in this model, because the heaps
of these Workers are tiny, typically a handful of objects.

In this example, I used 6.  But what if the number is hundreds or
> thousands?  Thousands may sound absurd, but I've created useful Web Audio
> code with this many using thousands of serially connected biquad allpass
> filters to generate interesting impulse responses.
>

That's impressive, especially if you can do it with low latency.

You're absolutely right that hundreds or thousands of independent Workers
won't scale, especially in series. ProcessedMediaStreams offers a couple of
options to get around that:
1) Fuse the thousands of serial filters into a single custom processing
node. Depending on the filters, this may give you the opportunity to do
extra optimizations (loop fusion, folding) as well.
2) Built-in effects. I think that support for JS effects needs to be as
good as it can be, but I've always agreed that some built-in effects will
be needed.


> Latency feels OK in my demos, but I haven't done anything to measure and
>> minimize it yet.
>>
>
> I believe the problems come up when dealing with more complex scenarios
> than your current demos.
>

I'm sure that's true.

Rob
-- 
"If we claim to be without sin, we deceive ourselves and the truth is not
in us. If we confess our sins, he is faithful and just and will forgive us
our sins and purify us from all unrighteousness. If we claim we have not
sinned, we make him out to be a liar and his word is not in us." [1 John
1:8-10]
Received on Thursday, 9 February 2012 00:15:11 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Thursday, 9 February 2012 00:15:14 GMT