1/* 2 * Copyright (C) 2010, Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 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. 12 * 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. 23 */ 24 25#include "config.h" 26 27#if ENABLE(WEB_AUDIO) 28 29#include "AudioDestinationNode.h" 30 31#include "AudioContext.h" 32#include "AudioNodeInput.h" 33#include "AudioNodeOutput.h" 34#include "AudioUtilities.h" 35#include "DenormalDisabler.h" 36 37namespace WebCore { 38 39AudioDestinationNode::AudioDestinationNode(AudioContext* context, float sampleRate) 40 : AudioNode(context, sampleRate) 41 , m_currentSampleFrame(0) 42{ 43 addInput(std::make_unique<AudioNodeInput>(this)); 44 45 setNodeType(NodeTypeDestination); 46} 47 48AudioDestinationNode::~AudioDestinationNode() 49{ 50 uninitialize(); 51} 52 53void AudioDestinationNode::render(AudioBus* sourceBus, AudioBus* destinationBus, size_t numberOfFrames) 54{ 55 // We don't want denormals slowing down any of the audio processing 56 // since they can very seriously hurt performance. 57 // This will take care of all AudioNodes because they all process within this scope. 58 DenormalDisabler denormalDisabler; 59 60 context()->setAudioThread(currentThread()); 61 62 if (!context()->isRunnable()) { 63 destinationBus->zero(); 64 return; 65 } 66 67 if (context()->userGestureRequiredForAudioStart()) { 68 destinationBus->zero(); 69 return; 70 } 71 72 if (context()->pageConsentRequiredForAudioStart()) { 73 destinationBus->zero(); 74 return; 75 } 76 77 // Let the context take care of any business at the start of each render quantum. 78 context()->handlePreRenderTasks(); 79 80 // Prepare the local audio input provider for this render quantum. 81 if (sourceBus) 82 m_localAudioInputProvider.set(sourceBus); 83 84 // This will cause the node(s) connected to us to process, which in turn will pull on their input(s), 85 // all the way backwards through the rendering graph. 86 AudioBus* renderedBus = input(0)->pull(destinationBus, numberOfFrames); 87 88 if (!renderedBus) 89 destinationBus->zero(); 90 else if (renderedBus != destinationBus) { 91 // in-place processing was not possible - so copy 92 destinationBus->copyFrom(*renderedBus); 93 } 94 95 // Process nodes which need a little extra help because they are not connected to anything, but still need to process. 96 context()->processAutomaticPullNodes(numberOfFrames); 97 98 // Let the context take care of any business at the end of each render quantum. 99 context()->handlePostRenderTasks(); 100 101 // Advance current sample-frame. 102 m_currentSampleFrame += numberOfFrames; 103} 104 105} // namespace WebCore 106 107#endif // ENABLE(WEB_AUDIO) 108