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 eeb0909954e19cb45652a7acab693e322930b75f..78997457467743bf5e140e7364b21e023d766324 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,27 +106,50 @@ class AudioParamTimeline { |
ExponentialRampToValue, |
SetTarget, |
SetValueCurve, |
+ // For cancelValuesAndHold |
+ 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 bool eventPreceeds(const ParamEvent& a, const ParamEvent& b) { |
- return a.time() < b.time(); |
+ 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); |
+ // Needed for creating a saved event where we want to supply all |
+ // the possible parameters because we're mostly copying an |
+ // existing event. |
+ 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); |
+ |
+ static bool eventPreceeds(const std::unique_ptr<ParamEvent>& a, |
+ const std::unique_ptr<ParamEvent>& b) { |
+ return a->time() < b->time(); |
} |
Type getType() const { return m_type; } |
@@ -140,34 +164,104 @@ 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. |
+ // |
+ // The duration of the curve. |
+ double m_duration; |
+ // The array of curve points. |
+ Vector<float> m_curve; |
+ // The number of curve points per second. it is used to compute |
+ // the curve index step when running the automation. |
+ double m_curvePointsPerSecond; |
+ // 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. |
+ 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, |
@@ -178,7 +272,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; |