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) 32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/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/text/WTFString.h" 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AudioNodeOutput; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)class AudioParam FINAL : public AudioSummingJunction, public ScriptWrappable { 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci DEFINE_WRAPPERTYPEINFO(); 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static const double DefaultSmoothingConstant; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static const double SnapThreshold; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 519e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) static AudioParam* create(AudioContext* context, double defaultValue) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) return new AudioParam(context, defaultValue); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // AudioSummingJunction 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void didUpdate() OVERRIDE { } 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Intrinsic value. 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float value(); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setValue(float); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Final value for k-rate parameters, otherwise use calculateSampleAccurateValues() for a-rate. 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Must be called in the audio thread. 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float finalValue(); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float defaultValue() const { return static_cast<float>(m_defaultValue); } 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Value smoothing: 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // When a new value is set with setValue(), in our internal use of the parameter we don't immediately jump to it. 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Instead we smoothly approach this value to avoid glitching. 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float smoothedValue(); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Smoothly exponentially approaches to (de-zippers) the desired value. 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Returns true if smoothed value has already snapped exactly to value. 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool smooth(); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void resetSmoothedValue() { m_smoothedValue = m_value; } 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // Parameter automation. 827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void setValueAtTime(float value, double time, ExceptionState& exceptionState) 837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_timeline.setValueAtTime(value, time, exceptionState); 857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void linearRampToValueAtTime(float value, double time, ExceptionState& exceptionState) 877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_timeline.linearRampToValueAtTime(value, time, exceptionState); 897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void exponentialRampToValueAtTime(float value, double time, ExceptionState& es) 917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_timeline.exponentialRampToValueAtTime(value, time, es); 937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void setTargetAtTime(float target, double time, double timeConstant, ExceptionState& exceptionState) 957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_timeline.setTargetAtTime(target, time, timeConstant, exceptionState); 977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void setValueCurveAtTime(Float32Array* curve, double time, double duration, ExceptionState& exceptionState) 997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_timeline.setValueCurveAtTime(curve, time, duration, exceptionState); 1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void cancelScheduledValues(double startTime, ExceptionState& exceptionState) 1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_timeline.cancelScheduledValues(startTime, exceptionState); 1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasSampleAccurateValues() { return m_timeline.hasValues() || numberOfRenderingConnections(); } 10802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calculates numberOfValues parameter values starting at the context's current time. 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Must be called in the context's render thread. 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void calculateSampleAccurateValues(float* values, unsigned numberOfValues); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Connect an audio-rate signal to control this parameter. 114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch void connect(AudioNodeOutput&); 115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch void disconnect(AudioNodeOutput&); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 117197021e6b966cfb06891637935ef33fff06433d1Ben Murdochprivate: 118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) AudioParam(AudioContext* context, double defaultValue) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : AudioSummingJunction(context) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_value(defaultValue) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_defaultValue(defaultValue) 1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_smoothedValue(defaultValue) { } 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // sampleAccurate corresponds to a-rate (audio rate) vs. k-rate in the Web Audio specification. 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void calculateFinalValues(float* values, unsigned numberOfValues, bool sampleAccurate); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void calculateTimelineValues(float* values, unsigned numberOfValues); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_value; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_defaultValue; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Smoothing (de-zippering) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_smoothedValue; 13302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AudioParamTimeline m_timeline; 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // AudioParam_h 140