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