Index: third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.h |
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.h b/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.h |
index af85e1c7398713b97ab506be16a886ecbb2c432f..75aa304d1c58c531cdc9475c89e21c49b77654ca 100644 |
--- a/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.h |
+++ b/third_party/WebKit/Source/modules/webaudio/AudioParamTimeline.h |
@@ -64,6 +64,7 @@ class AudioParamTimeline { |
double duration, |
ExceptionState&); |
void cancelScheduledValues(double startTime, ExceptionState&); |
+ void cancelValuesAndHoldAtTime(double cancelTime, ExceptionState&); |
// hasValue is set to true if a valid timeline value is returned. |
// otherwise defaultValue is returned. |
@@ -105,24 +106,44 @@ class AudioParamTimeline { |
ExponentialRampToValue, |
SetTarget, |
SetValueCurve, |
+ // This type is not exposed to Javascript. It's meant to handle the |
+ // cancelValuesAndHoldAtTime() API. |
+ CancelValues, |
LastType |
}; |
- static ParamEvent createLinearRampEvent(float value, |
- double time, |
- float initialValue, |
- double callTime); |
- static ParamEvent createExponentialRampEvent(float value, |
- double time, |
- float initialValue, |
- double callTime); |
- static ParamEvent createSetValueEvent(float value, double time); |
- static ParamEvent createSetTargetEvent(float value, |
- double time, |
- double timeConstant); |
- static ParamEvent createSetValueCurveEvent(const DOMFloat32Array* curve, |
- double time, |
- double duration); |
+ static std::unique_ptr<ParamEvent> createLinearRampEvent(float value, |
+ double time, |
+ float initialValue, |
+ double callTime); |
+ static std::unique_ptr<ParamEvent> createExponentialRampEvent( |
+ float value, |
+ double time, |
+ float initialValue, |
+ double callTime); |
+ static std::unique_ptr<ParamEvent> createSetValueEvent(float value, |
+ double time); |
+ static std::unique_ptr<ParamEvent> |
+ createSetTargetEvent(float value, double time, double timeConstant); |
+ static std::unique_ptr<ParamEvent> createSetValueCurveEvent( |
+ const DOMFloat32Array* curve, |
+ double time, |
+ double duration); |
+ static std::unique_ptr<ParamEvent> createCancelValuesEvent( |
+ double time, |
+ std::unique_ptr<ParamEvent> savedEvent); |
+ static std::unique_ptr<ParamEvent> createGeneralEvent( |
+ Type, |
+ float value, |
+ double time, |
+ float initialValue, |
+ double callTime, |
+ double timeConstant, |
+ double duration, |
+ Vector<float>& curve, |
+ double curvePointsPerSecond, |
+ float curveEndValue, |
+ std::unique_ptr<ParamEvent> savedEvent); |
Type getType() const { return m_type; } |
float value() const { return m_value; } |
@@ -136,34 +157,105 @@ class AudioParamTimeline { |
bool needsTimeClampCheck() const { return m_needsTimeClampCheck; } |
void clearTimeClampCheck() { m_needsTimeClampCheck = false; } |
+ double curvePointsPerSecond() const { return m_curvePointsPerSecond; } |
+ float curveEndValue() const { return m_curveEndValue; } |
+ |
+ // For CancelValues events. Not valid for any other event |
+ ParamEvent* savedEvent() const; |
+ bool hasDefaultCancelledValue() const; |
+ void setCancelledValue(float); |
+ |
private: |
+ // General event |
ParamEvent(Type type, |
float value, |
double time, |
+ float initialValue, |
+ double callTime, |
double timeConstant, |
double duration, |
+ Vector<float>& curve, |
+ double curvePointsPerSecond, |
+ float curveEndValue, |
+ std::unique_ptr<ParamEvent> savedEvent); |
+ |
+ // Create simplest event needing just a value and time, like setValueAtTime |
+ ParamEvent(Type, float value, double time); |
+ |
+ // Create a linear or exponential ramp that requires an initial value and |
+ // time in case |
+ // there is no actual event that preceeds this event. |
+ ParamEvent(Type, |
+ float value, |
+ double time, |
+ float initialValue, |
+ double callTime); |
+ |
+ // Create an event needing a time constant (setTargetAtTime) |
+ ParamEvent(Type, float value, double time, double timeConstant); |
+ |
+ // Create a setValueCurve event |
+ ParamEvent(Type, |
+ double time, |
+ double duration, |
const DOMFloat32Array* curve, |
- float initialValue = 0, |
- double callTime = 0); |
+ double curvePointsPerSecond, |
+ float curveEndValue); |
+ |
+ // Create CancelValues event |
+ ParamEvent(Type, double time, std::unique_ptr<ParamEvent> savedEvent); |
Type m_type; |
+ |
+ // The value for the event. The interpretation of this depends on |
+ // the event type. Not used for SetValueCurve. For CancelValues, |
+ // it is the end value to use when cancelling a LinearRampToValue |
+ // or ExponentialRampToValue event. |
float m_value; |
+ |
+ // The time for the event. The interpretation of this depends on |
+ // the event type. |
double m_time; |
- // Only used for SetTarget events |
- double m_timeConstant; |
- // Only used for SetValueCurve events. |
- double m_duration; |
- Vector<float> m_curve; |
+ |
// Initial value and time to use for linear and exponential ramps that don't |
// have a preceding event. |
float m_initialValue; |
double m_callTime; |
+ |
+ // Only used for SetTarget events |
+ double m_timeConstant; |
+ |
+ // The following items are only used for SetValueCurve events |
+ // |
+ // m_duration is the duration of the curve. |
+ // m_curve is the array of curve poitns. |
+ // m_curvePointsPerSecond is the number of curve points per second. it |
+ // is used to compute the curve index step when running the |
+ // automation. |
+ // m_curveEndValue is the default value to use at the end of the |
+ // curve. Normally it's the last entry in m_curve, but cancelling a |
+ // SetValueCurve will set this to a new value. // Only used for |
+ // SetValueCurve events. |
+ double m_duration; |
+ Vector<float> m_curve; |
+ double m_curvePointsPerSecond; |
+ float m_curveEndValue; |
+ |
+ // For CancelValues. If CancelValues is in the middle of an event, this |
+ // holds the event that is being cancelled, so that processing can |
+ // continue as if the event still existed up until we reach the actual |
+ // scheduled cancel time. |
+ std::unique_ptr<ParamEvent> m_savedEvent; |
+ |
// True if the start time needs to be checked against current time |
// to implement clamping. |
bool m_needsTimeClampCheck; |
+ |
+ // True if a default value has been assigned to the CancelValues event. |
+ bool m_hasDefaultCancelledValue; |
}; |
- void insertEvent(const ParamEvent&, ExceptionState&); |
+ void insertEvent(std::unique_ptr<ParamEvent>, ExceptionState&); |
float valuesForFrameRangeImpl(size_t startFrame, |
size_t endFrame, |
float defaultValue, |
@@ -174,7 +266,33 @@ class AudioParamTimeline { |
// Produce a nice string describing the event in human-readable form. |
String eventToString(const ParamEvent&); |
- Vector<ParamEvent> m_events; |
+ |
+ // Automation functions that compute the vlaue of the specified |
+ // automation at the specified time. |
+ float linearRampAtTime(double t, |
+ float value1, |
+ double time1, |
+ float value2, |
+ double time2); |
+ float exponentialRampAtTime(double t, |
+ float value1, |
+ double time1, |
+ float value2, |
+ double time2); |
+ float targetValueAtTime(double t, |
+ float value1, |
+ double time1, |
+ float value2, |
+ float timeConstant); |
+ float valueCurveAtTime(double t, |
+ double time1, |
+ double duration, |
+ const float* curveData, |
+ unsigned curveLength); |
+ |
+ // Vector of all automation events for the AudioParam. Access must |
+ // be locked via m_eventsLock. |
+ Vector<std::unique_ptr<ParamEvent>> m_events; |
mutable Mutex m_eventsLock; |