15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 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) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * its contributors may be used to endorse or promote products derived 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * from this software without specific prior written permission. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef AudioParam_h 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define AudioParam_h 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "bindings/v8/ScriptWrappable.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webaudio/AudioContext.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webaudio/AudioParamTimeline.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webaudio/AudioSummingJunction.h" 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <sys/types.h> 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/Float32Array.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/PassRefPtr.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/RefCounted.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/WTFString.h" 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AudioNodeOutput; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)class AudioParam : public RefCounted<AudioParam>, public ScriptWrappable, public AudioSummingJunction { 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static const double DefaultSmoothingConstant; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static const double SnapThreshold; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassRefPtr<AudioParam> create(AudioContext* context, const String& name, double defaultValue, double minValue, double maxValue, unsigned units = 0) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new AudioParam(context, name, defaultValue, minValue, maxValue, units)); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // AudioSummingJunction 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool canUpdateState() OVERRIDE { return true; } 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void didUpdate() OVERRIDE { } 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Intrinsic value. 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float value(); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setValue(float); 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Final value for k-rate parameters, otherwise use calculateSampleAccurateValues() for a-rate. 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Must be called in the audio thread. 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float finalValue(); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String name() const { return m_name; } 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float minValue() const { return static_cast<float>(m_minValue); } 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float maxValue() const { return static_cast<float>(m_maxValue); } 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float defaultValue() const { return static_cast<float>(m_defaultValue); } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned units() const { return m_units; } 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Value smoothing: 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When a new value is set with setValue(), in our internal use of the parameter we don't immediately jump to it. 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Instead we smoothly approach this value to avoid glitching. 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float smoothedValue(); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Smoothly exponentially approaches to (de-zippers) the desired value. 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns true if smoothed value has already snapped exactly to value. 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool smooth(); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetSmoothedValue() { m_smoothedValue = m_value; } 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setSmoothingConstant(double k) { m_smoothingConstant = k; } 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // Parameter automation. 89e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void setValueAtTime(float value, double time) { m_timeline.setValueAtTime(value, time); } 90e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void linearRampToValueAtTime(float value, double time) { m_timeline.linearRampToValueAtTime(value, time); } 91e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void exponentialRampToValueAtTime(float value, double time) { m_timeline.exponentialRampToValueAtTime(value, time); } 92e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void setTargetAtTime(float target, double time, double timeConstant) { m_timeline.setTargetAtTime(target, time, timeConstant); } 93e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void setValueCurveAtTime(Float32Array* curve, double time, double duration) { m_timeline.setValueCurveAtTime(curve, time, duration); } 94e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void cancelScheduledValues(double startTime) { m_timeline.cancelScheduledValues(startTime); } 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasSampleAccurateValues() { return m_timeline.hasValues() || numberOfRenderingConnections(); } 9702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calculates numberOfValues parameter values starting at the context's current time. 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Must be called in the context's render thread. 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void calculateSampleAccurateValues(float* values, unsigned numberOfValues); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Connect an audio-rate signal to control this parameter. 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void connect(AudioNodeOutput*); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void disconnect(AudioNodeOutput*); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AudioParam(AudioContext* context, const String& name, double defaultValue, double minValue, double maxValue, unsigned units = 0) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : AudioSummingJunction(context) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_name(name) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_value(defaultValue) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_defaultValue(defaultValue) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_minValue(minValue) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_maxValue(maxValue) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_units(units) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_smoothedValue(defaultValue) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_smoothingConstant(DefaultSmoothingConstant) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 11893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) ScriptWrappable::init(this); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sampleAccurate corresponds to a-rate (audio rate) vs. k-rate in the Web Audio specification. 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void calculateFinalValues(float* values, unsigned numberOfValues, bool sampleAccurate); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void calculateTimelineValues(float* values, unsigned numberOfValues); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_name; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_value; 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_defaultValue; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_minValue; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_maxValue; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned m_units; 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Smoothing (de-zippering) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_smoothedValue; 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_smoothingConstant; 13602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AudioParamTimeline m_timeline; 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // AudioParam_h 143