1 /* 2 * Copyright (C) 2011, 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 "modules/webaudio/DynamicsCompressorNode.h" 30 31 #include "platform/audio/DynamicsCompressor.h" 32 #include "modules/webaudio/AudioContext.h" 33 #include "modules/webaudio/AudioNodeInput.h" 34 #include "modules/webaudio/AudioNodeOutput.h" 35 36 // Set output to stereo by default. 37 static const unsigned defaultNumberOfOutputChannels = 2; 38 39 namespace blink { 40 41 DynamicsCompressorNode::DynamicsCompressorNode(AudioContext* context, float sampleRate) 42 : AudioNode(context, sampleRate) 43 { 44 addInput(); 45 addOutput(AudioNodeOutput::create(this, defaultNumberOfOutputChannels)); 46 47 setNodeType(NodeTypeDynamicsCompressor); 48 49 m_threshold = AudioParam::create(context, -24); 50 m_knee = AudioParam::create(context, 30); 51 m_ratio = AudioParam::create(context, 12); 52 m_reduction = AudioParam::create(context, 0); 53 m_attack = AudioParam::create(context, 0.003); 54 m_release = AudioParam::create(context, 0.250); 55 56 initialize(); 57 } 58 59 DynamicsCompressorNode::~DynamicsCompressorNode() 60 { 61 ASSERT(!isInitialized()); 62 } 63 64 void DynamicsCompressorNode::dispose() 65 { 66 uninitialize(); 67 AudioNode::dispose(); 68 } 69 70 void DynamicsCompressorNode::process(size_t framesToProcess) 71 { 72 AudioBus* outputBus = output(0)->bus(); 73 ASSERT(outputBus); 74 75 float threshold = m_threshold->value(); 76 float knee = m_knee->value(); 77 float ratio = m_ratio->value(); 78 float attack = m_attack->value(); 79 float release = m_release->value(); 80 81 m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamThreshold, threshold); 82 m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamKnee, knee); 83 m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamRatio, ratio); 84 m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamAttack, attack); 85 m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamRelease, release); 86 87 m_dynamicsCompressor->process(input(0)->bus(), outputBus, framesToProcess); 88 89 float reduction = m_dynamicsCompressor->parameterValue(DynamicsCompressor::ParamReduction); 90 m_reduction->setValue(reduction); 91 } 92 93 void DynamicsCompressorNode::initialize() 94 { 95 if (isInitialized()) 96 return; 97 98 AudioNode::initialize(); 99 m_dynamicsCompressor = adoptPtr(new DynamicsCompressor(sampleRate(), defaultNumberOfOutputChannels)); 100 } 101 102 void DynamicsCompressorNode::uninitialize() 103 { 104 if (!isInitialized()) 105 return; 106 107 m_dynamicsCompressor.clear(); 108 AudioNode::uninitialize(); 109 } 110 111 double DynamicsCompressorNode::tailTime() const 112 { 113 return m_dynamicsCompressor->tailTime(); 114 } 115 116 double DynamicsCompressorNode::latencyTime() const 117 { 118 return m_dynamicsCompressor->latencyTime(); 119 } 120 121 void DynamicsCompressorNode::trace(Visitor* visitor) 122 { 123 visitor->trace(m_threshold); 124 visitor->trace(m_knee); 125 visitor->trace(m_ratio); 126 visitor->trace(m_reduction); 127 visitor->trace(m_attack); 128 visitor->trace(m_release); 129 AudioNode::trace(visitor); 130 } 131 132 } // namespace blink 133 134 #endif // ENABLE(WEB_AUDIO) 135