W3C home > Mailing lists > Public > public-audio@w3.org > July to September 2013

Re: Channel up-mixing / down-mixing, how to compute num channels of connection?

From: s p <sebpiq@gmail.com>
Date: Wed, 17 Jul 2013 19:55:34 +0400
Message-ID: <CAGKuoCUU__OjvMp53hseBt_0RCTWVBcTnvjSuUgOOjPiJPVkKg@mail.gmail.com>
To: Ehsan Akhgari <ehsan.akhgari@gmail.com>
Cc: "public-audio@w3.org" <public-audio@w3.org>
Yes ... this makes sense I think! But then the spec lacks info about that.

My current implementation simply does it lazily. The number of channels is
not computed until a block of audio is pulled. When that happens, the node
simply looks at the audio buffer from each output, and checks how many
channels it has, using this information to finally calculate the
computedNumberOfChannels.
So I guess this is equivalent to what you wrote (or at least it has the
same result).

Thanks for the explanation :)


2013/7/17 Ehsan Akhgari <ehsan.akhgari@gmail.com>

> Let me try to clarify.  Some of the nodes in the graph have pre-determined
> number of channels, such as AudioBufferSourceNode or PannerNode.  Some
> other types follow the mixing rules.  A pseudo-code algorithm like below
> will give you the number of channels that currentNodes sees on its *input*:
>
> function GetInputChannelCount(array<AudioNode> inputNodes, AudioNode
> currentNode) {
>   if (currentNode is AudioBufferSourceNode or PannerNode etc) {
>     skip the computation; // because the number of input channels doesn't
> matter
>   } else {
>     if (currentNode.channelCountMode == "explicit") {
>       return currentNode.channelCount;
>     }
>     var numberOfChannels = 1;
>     for each (node in inputNodes) {
>       numberOfChannels = max(numberOfChannels,
> node.channelsProducedByNode);
>     }
>     if (currentNode.channelCountMode == "clamped-max") {
>       numberOfChannels = min(numberOfChannels, currentNode.channelCount);
>     }
>     return numberOfChannels;
>   }
> }
>
> Once you have the result of GetInputChannelCount, you look at the buffer
> produced by each input node, up/down-mix it to the correct channel count
> according to the mixing rules, and then mix all of the input buffers
> together, and pass that as the input buffer to currentNode.  The same thing
> happens recursively starting from the source nodes in your graph until you
> get to the destination node.
>
> Does this make sense?
>
> --
> Ehsan
> <http://ehsanakhgari.org/>
>
>
> On Tue, Jul 16, 2013 at 6:46 PM, s p <sebpiq@gmail.com> wrote:
>
>> This still isn't clear - at least for me.
>>
>> """
>>
>> An AudioNode input use three basic pieces of information to determine how
>> to mix all the outputs connected to it. As part of this process it computes
>> an internal value computedNumberOfChannels representing the actual
>> number of channels of the input at any given time:
>>
>> """
>>
>> The above explicitely says that the algorithm only applies to inputs and
>> not to outputs.
>>
>> """
>>
>> “max”: computedNumberOfChannels is computed as the maximum of the number
>> of channels of all connections. In this mode channelCount is ignored.
>>
>> """
>>
>> The above says that if "channelCountMode" is "max" you need to take the
>> max number of channels of all connections (i.e., the max number of channels
>> of outputs)  which implies that you should be able to compute outputs'
>> channel count somehow. But how to do that isn't specified anywhere.
>>
>>
>> 2013/7/17 Ehsan Akhgari <ehsan.akhgari@gmail.com>
>>
>>> The number of channels for each node's output are determined by this
>>> algorithm.  There are some nodes which force this value to a certain value
>>> (for example, PannerNode) but most node types follow this algorithm.
>>>
>>> Note that the channelCount for a given node cannot be trusted unless
>>> channelCountMode is "explicit".
>>>
>>> --
>>> Ehsan
>>> <http://ehsanakhgari.org/>
>>>
>>>
>>> On Mon, Jul 15, 2013 at 1:44 PM, s p <sebpiq@gmail.com> wrote:
>>>
>>>> Or is it so that the max number of channels from outputs is inferred by
>>>> the number of channels in the buffers received from upstream?
>>>>
>>>>
>>>> 2013/7/14 s p <sebpiq@gmail.com>
>>>>
>>>>> Hi!
>>>>>
>>>>> Reading the chapter "9 - channel up-mixing / down-mixing", from what I
>>>>> understand the number of channels should be computed for each input.
>>>>> However it says :
>>>>>
>>>>> > “max”: computedNumberOfChannels is computed as *[the maximum of the
>>>>> number of channels of all connections]*.
>>>>>
>>>>> So how I understand it is that you actually need the number of
>>>>> channels of each output for computing "computedNumberOfChannels". But
>>>>> I couldn't quite figure out how to compute the number of channels of an
>>>>> ouput. Is the node's raw channelCount?
>>>>>
>>>>> Or did I get it all wrong?
>>>>>
>>>>> Sebastien Piquemal
>>>>>
>>>>> PS : for info, I am in the process of implementing the Web Audio API
>>>>> spec for Node.js (https://github.com/sebpiq/node-web-audio-api).
>>>>>
>>>>
>>>>
>>>
>>
>
Received on Wednesday, 17 July 2013 15:56:02 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:50:10 UTC