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: Ehsan Akhgari <ehsan.akhgari@gmail.com>
Date: Wed, 17 Jul 2013 11:11:18 -0400
Message-ID: <CANTur_5mS654UpWLGTyb7DD-Rd7TLXjntV-dpUGiSWUDnT3T-g@mail.gmail.com>
To: s p <sebpiq@gmail.com>
Cc: "public-audio@w3.org" <public-audio@w3.org>
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:12:30 UTC

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