15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011, Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(WEB_AUDIO) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webaudio/DynamicsCompressorNode.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/audio/DynamicsCompressor.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webaudio/AudioContext.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webaudio/AudioNodeInput.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webaudio/AudioNodeOutput.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Set output to stereo by default. 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned defaultNumberOfOutputChannels = 2; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DynamicsCompressorNode::DynamicsCompressorNode(AudioContext* context, float sampleRate) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : AudioNode(context, sampleRate) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch addInput(); 45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch addOutput(AudioNodeOutput::create(this, defaultNumberOfOutputChannels)); 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setNodeType(NodeTypeDynamicsCompressor); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_threshold = AudioParam::create(context, -24); 50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_knee = AudioParam::create(context, 30); 51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_ratio = AudioParam::create(context, 12); 52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_reduction = AudioParam::create(context, 0); 53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_attack = AudioParam::create(context, 0.003); 54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_release = AudioParam::create(context, 0.250); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) initialize(); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DynamicsCompressorNode::~DynamicsCompressorNode() 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(!isInitialized()); 62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void DynamicsCompressorNode::dispose() 65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uninitialize(); 67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) AudioNode::dispose(); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DynamicsCompressorNode::process(size_t framesToProcess) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AudioBus* outputBus = output(0)->bus(); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(outputBus); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float threshold = m_threshold->value(); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float knee = m_knee->value(); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float ratio = m_ratio->value(); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float attack = m_attack->value(); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float release = m_release->value(); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamThreshold, threshold); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamKnee, knee); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamRatio, ratio); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamAttack, attack); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dynamicsCompressor->setParameterValue(DynamicsCompressor::ParamRelease, release); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dynamicsCompressor->process(input(0)->bus(), outputBus, framesToProcess); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float reduction = m_dynamicsCompressor->parameterValue(DynamicsCompressor::ParamReduction); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_reduction->setValue(reduction); 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DynamicsCompressorNode::initialize() 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isInitialized()) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch AudioNode::initialize(); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dynamicsCompressor = adoptPtr(new DynamicsCompressor(sampleRate(), defaultNumberOfOutputChannels)); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DynamicsCompressorNode::uninitialize() 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isInitialized()) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dynamicsCompressor.clear(); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AudioNode::uninitialize(); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double DynamicsCompressorNode::tailTime() const 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_dynamicsCompressor->tailTime(); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double DynamicsCompressorNode::latencyTime() const 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_dynamicsCompressor->latencyTime(); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 121323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void DynamicsCompressorNode::trace(Visitor* visitor) 122323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 123323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_threshold); 124323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_knee); 125323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_ratio); 126323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_reduction); 127323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_attack); 128323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_release); 129323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) AudioNode::trace(visitor); 130323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 131323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // ENABLE(WEB_AUDIO) 135