C++ API Reference RNBO: src/RNBO_ParameterEvent.h Source File

RNBO: src/RNBO_ParameterEvent.h Source File

1 //
2 // RNBO_ParameterEvent.h
3 //
4 // Created by Rob Sussman on 8/4/15.
5 //
6 //
7 
8 #ifndef _RNBO_ParameterEvent_H_
9 #define _RNBO_ParameterEvent_H_
10 
11 #include "RNBO_Types.h"
12 #include "RNBO_Math.h" // isnan
13 
14 namespace RNBO {
15 
16  class PatcherEventTarget;
17 
18  // for now this is restricted to float values (so we might re-name this to be ParameterFloatEvent), but in the
19  // future we might have ParameterStringEvent, ParameterBandEvent etc.
20 
25 
26  public:
27 
29  : _parameterIndex(INVALID_INDEX)
30  , _eventTime(0)
31  , _value(0)
32  , _source(nullptr)
33  , _eventTarget(nullptr)
34  {
35  }
36 
37  ParameterEvent(const ParameterEvent& other) = default;
38  ParameterEvent& operator = (const ParameterEvent& other) = default;
39 
40  ParameterEvent(ParameterIndex parameterIndex, MillisecondTime eventTime, ParameterValue value, ParameterInterfaceId source, PatcherEventTarget* eventTarget = nullptr)
41  : _parameterIndex(parameterIndex)
42  , _eventTime(eventTime)
43  , _value(value)
44  , _source(source)
45  , _eventTarget(eventTarget)
46  {
47  }
48 
49  // we want to treat two parameter events as equal if they both have values which are NaNs
50  // despite the fact that comparing two NaNs will return false
51  // this way we can avoid notification of non-changes in parameters
52  bool valuesAreEqual(ParameterValue lhs, ParameterValue rhs) const
53  {
54  bool equal = lhs == rhs ? true : false;
55  if (!equal) {
56  // treat two NaN values as equal
57  if (RNBO_Math::rnbo_isnan(lhs) && RNBO_Math::rnbo_isnan(rhs)) {
58  equal = true;
59  }
60  }
61  return equal;
62  }
63 
64  bool operator==(const ParameterEvent& rhs) const
65  {
66  return rhs.getIndex() == getIndex()
67  && rhs.getTime() == getTime()
68  && valuesAreEqual(getValue(), rhs.getValue())
69  && rhs.getSource() == getSource()
70  && rhs._eventTarget == _eventTarget;
71  }
72 
73  ParameterIndex getIndex() const { return _parameterIndex; }
74  ParameterValue getValue() const { return _value; }
75  ParameterInterfaceId getSource() const { return _source; }
76 
77  MillisecondTime getTime() const { return _eventTime; }
78  PatcherEventTarget* getEventTarget() const { return _eventTarget; }
79 
80  bool isValid() const { return _parameterIndex != INVALID_INDEX; }
81  void invalidate() { _parameterIndex = INVALID_INDEX; }
82 
83  // debugging
84  void dumpEvent() const {
85  // disabling for now to avoid requiring fprintf support in generated code
86  // fprintf(stdout, "ParameterEvent: parameterIndex=%d time=%.3f value=%.4f source=%p\n", _parameterIndex, _eventTime, _value, _source);
87  }
88 
89  private:
90 
91  ParameterIndex _parameterIndex;
92  MillisecondTime _eventTime;
93  ParameterValue _value;
94  ParameterInterfaceId _source;
95 
96  friend class EventVariant;
97 
98  PatcherEventTarget* _eventTarget;
99 
100  void setTime(MillisecondTime eventTime) { _eventTime = eventTime; }
101 
102  };
103 
105 
106  public:
107 
109  : _parameterIndex(INVALID_INDEX)
110  , _eventTime(0)
111  , _eventTarget(nullptr)
112  {
113  }
114 
115  ParameterBangEvent(const ParameterBangEvent& other) = default;
116  ParameterBangEvent& operator = (const ParameterBangEvent& other) = default;
117 
118  ParameterBangEvent(ParameterIndex parameterIndex, MillisecondTime eventTime, PatcherEventTarget* eventTarget = nullptr)
119  : _parameterIndex(parameterIndex)
120  , _eventTime(eventTime)
121  , _eventTarget(eventTarget)
122  {
123  }
124 
125  bool operator==(const ParameterBangEvent& rhs) const
126  {
127  return rhs.getIndex() == getIndex()
128  && rhs.getTime() == getTime()
129  && rhs._eventTarget == _eventTarget;
130  }
131 
132  ParameterIndex getIndex() const { return _parameterIndex; }
133  MillisecondTime getTime() const { return _eventTime; }
134  PatcherEventTarget* getEventTarget() const { return _eventTarget; }
135 
136  bool isValid() const { return _parameterIndex != INVALID_INDEX; }
137  void invalidate() { _parameterIndex = INVALID_INDEX; }
138 
139  // debugging
140  void dumpEvent() const {
141  // disabling for now to avoid requiring fprintf support in generated code
142  // fprintf(stdout, "ParameterEvent: parameterIndex=%d time=%.3f\n", _parameterIndex, _eventTime);
143  }
144 
145  private:
146 
147  ParameterIndex _parameterIndex;
148  MillisecondTime _eventTime;
149 
150  friend class EventVariant;
151 
152  PatcherEventTarget* _eventTarget;
153 
154  void setTime(MillisecondTime eventTime) { _eventTime = eventTime; }
155  };
156 
157 } // namespace RNBO
158 
159 #endif // #ifndef _RNBO_ParameterEvent_H_