1a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch/*
228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * Copyright (C) 2010, Google Inc. All rights reserved.
3a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch *
4a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch * Redistribution and use in source and binary forms, with or without
5a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch * modification, are permitted provided that the following conditions
6a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch * are met:
7a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch * 1.  Redistributions of source code must retain the above copyright
828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *    notice, this list of conditions and the following disclaimer.
9a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch * 2.  Redistributions in binary form must reproduce the above copyright
1028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *    notice, this list of conditions and the following disclaimer in the
1128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *    documentation and/or other materials provided with the distribution.
12a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch *
1328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
1928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch */
24a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
25a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "config.h"
26a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
27a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if ENABLE(WEB_AUDIO)
28a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
29a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "AudioChannelSplitter.h"
30a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
31a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "AudioNodeInput.h"
32a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "AudioNodeOutput.h"
33a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
34a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochnamespace WebCore {
35a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
36a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch// This is considering that 5.1 (6 channels) is the largest we'll ever deal with.
37a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch// It can easily be increased to support more if the web audio specification is updated.
38a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochconst unsigned NumberOfOutputs = 6;
39a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
40a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochAudioChannelSplitter::AudioChannelSplitter(AudioContext* context, double sampleRate)
41a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    : AudioNode(context, sampleRate)
42a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
43a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    addInput(adoptPtr(new AudioNodeInput(this)));
44a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
45a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // Create a fixed number of outputs (able to handle the maximum number of channels fed to an input).
46a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    for (unsigned i = 0; i < NumberOfOutputs; ++i)
47a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        addOutput(adoptPtr(new AudioNodeOutput(this, 1)));
48a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
49a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    setType(NodeTypeChannelSplitter);
50a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
51a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    initialize();
52a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
53a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
54a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid AudioChannelSplitter::process(size_t framesToProcess)
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    AudioBus* source = input(0)->bus();
57a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(source);
58a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT_UNUSED(framesToProcess, framesToProcess == source->length());
59a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
60a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    unsigned numberOfSourceChannels = source->numberOfChannels();
61a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
62a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(numberOfOutputs() == NumberOfOutputs);
63a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    for (unsigned i = 0; i < NumberOfOutputs; ++i) {
64a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        AudioBus* destination = output(i)->bus();
65a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(destination);
66a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
67a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (i < numberOfSourceChannels) {
68a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // Split the channel out if it exists in the source.
69a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // It would be nice to avoid the copy and simply pass along pointers, but this becomes extremely difficult with fanout and fanin.
70a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            destination->channel(0)->copyFrom(source->channel(i));
7128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        } else if (output(i)->renderingFanOutCount() > 0) {
72a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            // Only bother zeroing out the destination if it's connected to anything
73a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            destination->zero();
74a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
75a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
76a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
78a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid AudioChannelSplitter::reset()
79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
81a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
82a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} // namespace WebCore
83a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
84a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#endif // ENABLE(WEB_AUDIO)
85