OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
time_process.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <ossia/detail/config.hpp>
4
5#include <ossia/dataflow/token_request.hpp>
6#include <ossia/dataflow/transport.hpp>
8
9#include <memory>
10#include <string>
11
15namespace ossia
16{
17class graph_node;
18class time_interval;
24class OSSIA_EXPORT time_process
25{
26public:
27#if defined(OSSIA_SCENARIO_DATAFLOW)
28 std::shared_ptr<ossia::graph_node> node;
29#endif
31 virtual ~time_process();
32
38 void offset(ossia::time_value date);
39
43 void transport(ossia::time_value date);
44 void transport(
45 ossia::time_value date, const ossia::tick_transport_info& transport_info);
46
51 virtual void state(const ossia::token_request&) = 0;
52
59 virtual void start();
60
67 virtual void stop();
68
75 virtual void pause();
76
83 virtual void resume();
84
91 void mute(bool m);
92
96 [[nodiscard]] bool unmuted() const;
97
103 void enable(bool m);
104
108 [[nodiscard]] bool enabled() const;
109
113 void set_loops(bool b);
114
118 void set_start_offset(time_value v);
119
125 void set_loop_duration(time_value v);
126
127protected:
129 virtual void mute_impl(bool);
130 virtual void offset_impl(ossia::time_value date) = 0;
131
132 virtual void transport_impl(ossia::time_value date) = 0;
133
134 // Tempo-aware overload; sound_process reimplements this.
135 virtual void transport_impl(
136 ossia::time_value date, const ossia::tick_transport_info& transport_info)
137 {
138 (void)transport_info;
139 transport_impl(date);
140 }
141
142 time_value m_loop_duration{};
143 time_value m_start_offset{};
144 bool m_loops = false; // TODO bitfields ?
145 bool m_unmuted = true;
146 bool m_enabled = true;
147};
148
149template <typename T>
150class looping_process : public time_process
151{
152public:
153 using time_process::time_process;
154 void state(const ossia::token_request& tok) override
155 {
156 if(!this->m_loops)
157 {
158 if(this->m_start_offset == 0_tv)
159 static_cast<T*>(this)->state_impl(tok);
160 else
161 static_cast<T*>(this)->state_impl(tok.add_offset(this->m_start_offset));
162 }
163 else
164 {
165 tok.loop(
166 this->m_start_offset, this->m_loop_duration,
167 [this](const token_request& tr) { static_cast<T*>(this)->state_impl(tr); },
168 [this](const time_value& t) { static_cast<T*>(this)->transport_impl(t); });
169 }
170 }
171};
172
173enum class sync_status
174{
175 NOT_READY,
176 RETRY,
177 DONE
178};
179
180}
The time_process class.
Definition time_process.hpp:25
virtual void state(const ossia::token_request &)=0
get a #StateElement from the process depending on its parent #time_interval date
virtual ~time_process()
destructor
Definition git_info.h:7
The time_value class.
Definition ossia/editor/scenario/time_value.hpp:30