- From: Ehsan Akhgari <ehsan.akhgari@gmail.com>
- Date: Wed, 17 Jul 2013 13:06:19 -0400
- To: s p <sebpiq@gmail.com>
- Cc: "public-audio@w3.org" <public-audio@w3.org>
- Message-ID: <CANTur_6c87CFMHsZtTuzHSKFJqoKaTBsvBmV4Ske41XYZcrMAw@mail.gmail.com>
On Wed, Jul 17, 2013 at 11:55 AM, s p <sebpiq@gmail.com> wrote: > Yes ... this makes sense I think! But then the spec lacks info about that. > Can you suggest how we can reword the current prose to make this more evident? > 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). > Hmm out of curiosity, how can you do this lazily? I don't think you can avoid processing nodes which are either directly or indirectly connected to the destination node, except for perhaps non-source nodes which do not have any inputs (I believe most if not all of them should just produce silence in that case...) > Thanks for the explanation :) > Happy to help! -- Ehsan <http://ehsanakhgari.org/> > 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 17:07:27 UTC