diff options
Diffstat (limited to 'src/engine')
-rw-r--r-- | src/engine/Context.hpp | 39 | ||||
-rw-r--r-- | src/engine/JackDriver.cpp | 10 | ||||
-rw-r--r-- | src/engine/ProcessContext.hpp | 23 | ||||
-rw-r--r-- | src/engine/ProcessSlave.hpp | 2 | ||||
-rw-r--r-- | src/engine/ingen.lv2/ingen_lv2.cpp | 2 |
5 files changed, 43 insertions, 33 deletions
diff --git a/src/engine/Context.hpp b/src/engine/Context.hpp index a30706da..2a3bd7ca 100644 --- a/src/engine/Context.hpp +++ b/src/engine/Context.hpp @@ -25,6 +25,19 @@ namespace Ingen { class Engine; + +/** Graph execution context. + * + * This is used to pass whatever information a GraphObject might need to + * process; such as the current time, a sink for generated events, etc. + * + * Note the logical distinction between nframes (jack relative) and start/end + * (timeline relative). If transport speed != 1.0, then end-start != nframes + * (though currently this is never the case, it may be if ingen incorporates + * tempo and varispeed). + * + * \ingroup engine + */ class Context { public: @@ -34,12 +47,12 @@ public: }; Context(Engine& engine, ID id) - : _id(id) - , _engine(engine) + : _engine(engine) + , _id(id) , _event_sink(engine, event_queue_size) , _start(0) - , _nframes(0) , _end(0) + , _nframes(0) , _offset(0) , _realtime(true) {} @@ -48,12 +61,24 @@ public: ID id() const { return _id; } - void locate(FrameTime s, SampleCount o=0) { _start = s; _offset=o; } + void locate(FrameTime s, SampleCount nframes, SampleCount offset) { + _start = s; + _end = s + nframes; + _nframes = nframes; + _offset = offset; + } + + void locate(const Context& other) { + _start = other._start; + _end = other._end; + _nframes = other._nframes; + _offset = other._offset; + } inline Engine& engine() const { return _engine; } inline FrameTime start() const { return _start; } - inline SampleCount nframes() const { return _nframes; } inline FrameTime end() const { return _end; } + inline SampleCount nframes() const { return _nframes; } inline SampleCount offset() const { return _offset; } inline bool realtime() const { return _realtime; } @@ -61,13 +86,13 @@ public: inline EventSink& event_sink() { return _event_sink; } protected: - ID _id; ///< Fast ID for this context Engine& _engine; ///< Engine we're running in + ID _id; ///< Fast ID for this context EventSink _event_sink; ///< Sink for events generated in a realtime context FrameTime _start; ///< Start frame of this cycle, timeline relative - SampleCount _nframes; ///< Length of this cycle in frames FrameTime _end; ///< End frame of this cycle, timeline relative + SampleCount _nframes; ///< Length of this cycle in frames SampleCount _offset; ///< Start offset relative to start of driver buffers bool _realtime; ///< True iff context is hard realtime }; diff --git a/src/engine/JackDriver.cpp b/src/engine/JackDriver.cpp index 78b14121..a604aeae 100644 --- a/src/engine/JackDriver.cpp +++ b/src/engine/JackDriver.cpp @@ -413,15 +413,14 @@ JackDriver::_process_cb(jack_nframes_t nframes) // Note that Jack can not call this function for a cycle, if overloaded const jack_nframes_t start_of_current_cycle = jack_last_frame_time(_client); - const jack_nframes_t end_of_current_cycle = start_of_current_cycle + nframes; _transport_state = jack_transport_query(_client, &_position); - _process_context.set_time_slice(nframes, 0, start_of_current_cycle, end_of_current_cycle); + _process_context.locate(start_of_current_cycle, nframes, 0); for (Engine::ProcessSlaves::iterator i = _engine.process_slaves().begin(); i != _engine.process_slaves().end(); ++i) { - (*i)->context().set_time_slice(nframes, 0, start_of_current_cycle, end_of_current_cycle); + (*i)->context().locate(start_of_current_cycle, nframes, 0); } // Read input @@ -442,15 +441,12 @@ JackDriver::_process_cb(jack_nframes_t nframes) if (_root_patch) { _root_patch->process(_process_context); #if 0 - const FrameTime cycle_start = _process_context.start(); static const SampleCount control_block_size = nframes / 2; for (jack_nframes_t i = 0; i < nframes; i += control_block_size) { const SampleCount block_size = (i + control_block_size < nframes) ? control_block_size : nframes - i; - _process_context.set_time_slice(block_size, i, - cycle_start + i, - cycle_start + i + block_size); + _process_context.locate(start_of_current_cycle + i, block_size, i); _root_patch->process(_process_context); } #endif diff --git a/src/engine/ProcessContext.hpp b/src/engine/ProcessContext.hpp index fa8e3910..663fea78 100644 --- a/src/engine/ProcessContext.hpp +++ b/src/engine/ProcessContext.hpp @@ -25,30 +25,19 @@ namespace Ingen { -/** Context of a process() call. +/** Context of a process() call (the audio context). * - * This is used to pass whatever information a GraphObject might need to - * process in the audio thread, e.g. the available thread pool, sink for - * events (generated in the audio thread, not user initiated events), etc. - * - * Note the distinction between nframes and start/end. If transport speed - * != 1.0, end-start != nframes (though currently that is never the case, it - * may be in the future with sequencerey things). + * This class currently adds no functionality to Context, but the + * separate type is useful for writing functions that must only + * be run in the audio context (the function taking a ProcessContext + * parameter makes this clear, and makes breaking the rules obvious). * * \ingroup engine */ class ProcessContext : public Context { public: - ProcessContext(Engine& engine) - : Context(engine, AUDIO) - {} - - void set_time_slice(SampleCount nframes, SampleCount offset, FrameTime start, FrameTime end) { - locate(start, offset); - _nframes = nframes; - _end = end; - } + ProcessContext(Engine& engine) : Context(engine, AUDIO) {} }; diff --git a/src/engine/ProcessSlave.hpp b/src/engine/ProcessSlave.hpp index f6efcb8e..cd7d5e8d 100644 --- a/src/engine/ProcessSlave.hpp +++ b/src/engine/ProcessSlave.hpp @@ -59,7 +59,7 @@ public: _index = start_index; _state = STATE_RUNNING; _compiled_patch = compiled_patch; - _process_context.set_time_slice(context.nframes(), context.offset(), context.start(), context.end()); + _process_context.locate(context); Raul::Slave::whip(); } diff --git a/src/engine/ingen.lv2/ingen_lv2.cpp b/src/engine/ingen.lv2/ingen_lv2.cpp index fb145c53..424df46c 100644 --- a/src/engine/ingen.lv2/ingen_lv2.cpp +++ b/src/engine/ingen.lv2/ingen_lv2.cpp @@ -48,7 +48,7 @@ struct IngenLV2Driver : public Ingen::Driver { bool is_activated() const { return true; } void run(uint32_t nframes) { - _context.set_time_slice(nframes, _frame_time, _frame_time + nframes); + _context.locate(_frame_time, nframes, 0); if (_root_patch) _root_patch->process(_context); _frame_time += nframes; |