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

RNBO: src/RNBO_PatcherEventSender.h Source File

1 //
2 // RNBO_PatcherEventSender.h
3 //
4 // Created by Rob Sussman on 1/22/19.
5 // Extracted from RNBO_EventVariant.h
6 //
7 
8 #ifndef _RNBO_PatcherEventSender_H_
9 #define _RNBO_PatcherEventSender_H_
10 
11 #include "RNBO_Types.h"
12 #include "RNBO_EventSender.h"
13 #include "RNBO_DataRefEvent.h"
14 #include "RNBO_OutletEvent.h"
15 #include "RNBO_ParameterEvent.h"
16 #include "RNBO_MessageEvent.h"
17 
18 namespace RNBO {
19 
20  // specialization for PatcherEventTargets
21  class PatcherEventSender : public EventSender {
22 
23  public:
24 
25  PatcherEventSender(PatcherEventTarget* fallbackTarget, MillisecondTime currentTime)
26  : EventSender(fallbackTarget)
27  , _fallbackTarget(fallbackTarget)
28  , _currentTime(currentTime)
29  { }
30 
31  PatcherEventSender(const PatcherEventSender& other) = default;
32  PatcherEventSender& operator=(const PatcherEventSender& other) = default;
33 
34  ~PatcherEventSender() override {}
35 
36  void sendEvent(const EventVariant& ev) const override {
37  Event::Type eventType = ev.getType();
38 
39  switch (eventType) {
40  case Event::DataRef: handleDataRefEvent(ev.getDataRefEvent()); break;
41  case Event::Outlet: handleOutletEvent(ev.getOutletEvent()); break;
42  case Event::Parameter: handleParameterEvent(ev.getParameterEvent()); break;
43  case Event::ParameterBang: handleParameterBangEvent(ev.getParameterBangEvent()); break;
44  case Event::Message: handleMessageEvent(ev.getMessageEvent()); break;
45  case Event::Tempo: handleTempoEvent(ev.getTempoEvent()); break;
46  case Event::Transport: handleTransportEvent(ev.getTransportEvent()); break;
47  case Event::BeatTime: handleBeatTimeEvent(ev.getBeatTimeEvent()); break;
48  case Event::TimeSignature: handleTimeSignatureEvent(ev.getTimeSignatureEvent()); break;
49  case Event::BBU: handleBBUEvent(ev.getBBUEvent()); break;
50  case Event::Empty:
51  case Event::Clock:
52  case Event::Startup:
53  case Event::Midi:
54  case Event::Universal:
55  case Event::Preset:
56  default: EventSender::sendEvent(ev); // fallback to base class
57  }
58  }
59 
60  private:
61 
62  MillisecondTime correctTime(MillisecondTime time) const override {
63  return time < _currentTime ? _currentTime : time;
64  }
65 
66  // PatcherEventTarget
67  void handleDataRefEvent(const DataRefEvent& de) const {
68  PatcherEventTarget* eventTarget = de.getEventTarget() ? de.getEventTarget() : _fallbackTarget;
69  // TODO let's make this parallel to the others wrt naming, something like
70  // eventTarget->processDataRefEvent(de.getDataRefIndex(), de.getAction(), de.getTime());
71  if (de.getAction() == DataRefEvent::UpdateDataRef) {
72  eventTarget->processDataViewUpdate(de.getDataRefIndex(), correctTime(de.getTime()));
73  }
74  }
75 
76  void handleOutletEvent(const OutletEvent& oe) const {
77  PatcherEventTarget* eventTarget = oe.getEventTarget() ? oe.getEventTarget() : _fallbackTarget;
78  eventTarget->processOutletEvent(oe.getSender(), oe.getIndex(), oe.getValue(), correctTime(oe.getTime()));
79  }
80 
81  void handleParameterEvent(const ParameterEvent& pe) const {
82  PatcherEventTarget* eventTarget = pe.getEventTarget() ? pe.getEventTarget() : _fallbackTarget;
83  eventTarget->processParameterEvent(pe.getIndex(), pe.getValue(), correctTime(pe.getTime()));
84  }
85 
86  void handleParameterBangEvent(const ParameterBangEvent& pe) const {
87  PatcherEventTarget* eventTarget = pe.getEventTarget() ? pe.getEventTarget() : _fallbackTarget;
88  eventTarget->processParameterBangEvent(pe.getIndex(), correctTime(pe.getTime()));
89  }
90 
91  void handleMessageEvent(const MessageEvent& me) const {
92 #ifndef RNBO_NOMESSAGEEVENT
93  PatcherEventTarget* eventTarget = me.getEventTarget() ? me.getEventTarget() : _fallbackTarget;
94  if (me.getType() == MessageEvent::List) {
95  auto listValue = me.getListValue();
96  eventTarget->processListMessage(me.getTag(), me.getObjectId(), correctTime(me.getTime()), *listValue);
97  }
98  else if (me.getType() == MessageEvent::Number) {
99  eventTarget->processNumMessage(me.getTag(), me.getObjectId(), correctTime(me.getTime()), me.getNumValue());
100  }
101  else if (me.getType() == MessageEvent::Bang) {
102  eventTarget->processBangMessage(me.getTag(), me.getObjectId(), correctTime(me.getTime()));
103  }
104  else {
105  RNBO_ASSERT(false);
106  }
107 #endif
108  }
109 
110  void handleTempoEvent(const TempoEvent& te) const {
111  PatcherEventTarget* eventTarget = te.getEventTarget() ? te.getEventTarget() : _fallbackTarget;
112  eventTarget->processTempoEvent(correctTime(te.getTime()), te.getTempo());
113  }
114 
115  void handleTransportEvent(const TransportEvent& te) const {
116  PatcherEventTarget* eventTarget = te.getEventTarget() ? te.getEventTarget() : _fallbackTarget;
117  eventTarget->processTransportEvent(correctTime(te.getTime()), te.getState());
118  }
119 
120  void handleBeatTimeEvent(const BeatTimeEvent& be) const {
121  PatcherEventTarget* eventTarget = be.getEventTarget() ? be.getEventTarget() : _fallbackTarget;
122  eventTarget->processBeatTimeEvent(correctTime(be.getTime()), be.getBeatTime());
123  }
124 
125  void handleTimeSignatureEvent(const TimeSignatureEvent& te) const {
126  PatcherEventTarget* eventTarget = te.getEventTarget() ? te.getEventTarget() : _fallbackTarget;
127  eventTarget->processTimeSignatureEvent(correctTime(te.getTime()), te.getNumerator(), te.getDenominator());
128  }
129 
130  void handleBBUEvent(const BBUEvent& be) const {
131  PatcherEventTarget* eventTarget = be.getEventTarget() ? be.getEventTarget() : _fallbackTarget;
132  eventTarget->processBBUEvent(correctTime(be.getTime()), be.getBars(), be.getBeats(), be.getUnits());
133  }
134 
135  PatcherEventTarget* _fallbackTarget;
136  MillisecondTime _currentTime;
137 
138  };
139 
140 } // namespace RNBO
141 
142 
143 #endif // #ifndef _RNBO_PatcherEventSender_H_