2
* Copyright (C) 2010, Google Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
13
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16
* DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
#include "ChannelSplitterNode.h"
31
#include "AudioContext.h"
32
#include "AudioNodeInput.h"
33
#include "AudioNodeOutput.h"
37
PassRefPtr<ChannelSplitterNode> ChannelSplitterNode::create(AudioContext* context, float sampleRate, unsigned numberOfOutputs)
39
if (!numberOfOutputs || numberOfOutputs > AudioContext::maxNumberOfChannels())
42
return adoptRef(new ChannelSplitterNode(context, sampleRate, numberOfOutputs));
45
ChannelSplitterNode::ChannelSplitterNode(AudioContext* context, float sampleRate, unsigned numberOfOutputs)
46
: AudioNode(context, sampleRate)
48
addInput(adoptPtr(new AudioNodeInput(this)));
50
// Create a fixed number of outputs (able to handle the maximum number of channels fed to an input).
51
for (unsigned i = 0; i < numberOfOutputs; ++i)
52
addOutput(adoptPtr(new AudioNodeOutput(this, 1)));
54
setNodeType(NodeTypeChannelSplitter);
59
void ChannelSplitterNode::process(size_t framesToProcess)
61
AudioBus* source = input(0)->bus();
63
ASSERT_UNUSED(framesToProcess, framesToProcess == source->length());
65
unsigned numberOfSourceChannels = source->numberOfChannels();
67
for (unsigned i = 0; i < numberOfOutputs(); ++i) {
68
AudioBus* destination = output(i)->bus();
71
if (i < numberOfSourceChannels) {
72
// Split the channel out if it exists in the source.
73
// It would be nice to avoid the copy and simply pass along pointers, but this becomes extremely difficult with fanout and fanin.
74
destination->channel(0)->copyFrom(source->channel(i));
75
} else if (output(i)->renderingFanOutCount() > 0) {
76
// Only bother zeroing out the destination if it's connected to anything
82
void ChannelSplitterNode::reset()
86
} // namespace WebCore
88
#endif // ENABLE(WEB_AUDIO)