summaryrefslogtreecommitdiffstats
path: root/src/server/PortImpl.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/PortImpl.hpp')
-rw-r--r--src/server/PortImpl.hpp312
1 files changed, 0 insertions, 312 deletions
diff --git a/src/server/PortImpl.hpp b/src/server/PortImpl.hpp
deleted file mode 100644
index 70d90d0a..00000000
--- a/src/server/PortImpl.hpp
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2016 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or any later version.
-
- Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef INGEN_ENGINE_PORTIMPL_HPP
-#define INGEN_ENGINE_PORTIMPL_HPP
-
-#include <cstdlib>
-
-#include "ingen/Atom.hpp"
-#include "raul/Array.hpp"
-
-#include "BufferRef.hpp"
-#include "NodeImpl.hpp"
-#include "PortType.hpp"
-#include "RunContext.hpp"
-#include "types.hpp"
-
-namespace Raul { class Maid; }
-
-namespace Ingen {
-namespace Server {
-
-class BlockImpl;
-class BufferFactory;
-class RunContext;
-
-/** A port (input or output) on a Block.
- *
- * The base implementation here is general and/or for output ports (which are
- * simplest), InputPort and DuplexPort override functions to provide
- * specialized behaviour where necessary.
- *
- * \ingroup engine
- */
-class PortImpl : public NodeImpl
-{
-public:
- struct SetState {
- enum class State {
- /// Partially set, first cycle: AAAAA => AAABB.
- HALF_SET_CYCLE_1,
-
- /// Partially set, second cycle: AAABB => BBBBB.
- HALF_SET_CYCLE_2,
-
- /// Fully set, first cycle (clear events if necessary).
- SET_CYCLE_1,
-
- /// Fully set, second cycle and onwards (done).
- SET
- };
-
- SetState() : state(State::SET), value(0), time(0) {}
-
- void set(const RunContext& context, FrameTime t, Sample v) {
- time = t;
- value = v;
- state = (time == context.start()
- ? State::SET
- : State::HALF_SET_CYCLE_1);
- }
-
- State state; ///< State of buffer for setting control value
- Sample value; ///< Value currently being set
- FrameTime time; ///< Time value was set
- };
-
- struct Voice {
- Voice() : buffer(nullptr) {}
-
- SetState set_state;
- BufferRef buffer;
- };
-
- typedef Raul::Array<Voice> Voices;
-
- PortImpl(BufferFactory& bufs,
- BlockImpl* block,
- const Raul::Symbol& name,
- uint32_t index,
- uint32_t poly,
- PortType type,
- LV2_URID buffer_type,
- const Atom& value,
- size_t buffer_size = 0,
- bool is_output = true);
-
- virtual GraphType graph_type() const { return GraphType::PORT; }
-
- /** A port's parent is always a block, so static cast should be safe */
- BlockImpl* parent_block() const { return (BlockImpl*)_parent; }
-
- /** Set the the voices (buffers) for this port in the audio thread. */
- void set_voices(RunContext& context, MPtr<Voices>&& voices);
-
- /** Prepare for a new (external) polyphony value.
- *
- * Preprocessor thread, poly is actually applied by apply_poly.
- */
- virtual bool prepare_poly(BufferFactory& bufs, uint32_t poly);
-
- /** Apply a new polyphony value.
- *
- * Audio thread.
- * \a poly Must be < the most recent value passed to prepare_poly.
- */
- virtual bool apply_poly(RunContext& context, uint32_t poly);
-
- /** Return the number of arcs (pre-process thraed). */
- virtual size_t num_arcs() const { return 0; }
-
- const Atom& value() const { return _value; }
- void set_value(const Atom& v) { _value = v; }
-
- const Atom& minimum() const { return _min; }
- const Atom& maximum() const { return _max; }
-
- /* The following two methods store the range in variables so it can be
- accessed in the process thread, which is required for applying control
- bindings from incoming MIDI data.
- */
- void set_minimum(const Atom& min) { _min.set_rt(min); }
- void set_maximum(const Atom& max) { _max.set_rt(max); }
-
- inline BufferRef buffer(uint32_t voice) const {
- return _voices->at((_poly == 1) ? 0 : voice).buffer;
- }
- inline BufferRef prepared_buffer(uint32_t voice) const {
- return _prepared_voices->at(voice).buffer;
- }
-
- void update_set_state(const RunContext& context, uint32_t v);
-
- void set_voice_value(const RunContext& context,
- uint32_t voice,
- FrameTime time,
- Sample value);
-
- void set_control_value(const RunContext& context,
- FrameTime time,
- Sample value);
-
- /** Prepare this port to use an external driver-provided buffer.
- *
- * This will avoid allocating a buffer for the port, instead the driver
- * buffer is used directly. This only makes sense for ports on the
- * top-level graph, which are monophonic. Non-real-time, must be called
- * before using the port, followed by a call to set_driver_buffer() in the
- * processing thread.
- */
- virtual void set_is_driver_port(BufferFactory& bufs);
-
- bool is_driver_port() const { return _is_driver_port; }
-
- /** Called once per process cycle */
- virtual void pre_process(RunContext& context);
- virtual void pre_run(RunContext& context) {}
- virtual void post_process(RunContext& context);
-
- /** Clear/silence all buffers */
- virtual void clear_buffers(const RunContext& ctx);
-
- /** Claim and apply buffers in the real-time thread. */
- virtual bool setup_buffers(RunContext& ctx, BufferFactory& bufs, uint32_t poly);
-
- void activate(BufferFactory& bufs);
- void deactivate();
-
- /**
- Inherit any properties from a connected neighbour.
-
- This is used for Graph ports, so e.g. a control input has the range of
- all the ports it is connected to.
- */
- virtual void inherit_neighbour(const PortImpl* port,
- Properties& remove,
- Properties& add) {}
-
- virtual void connect_buffers(SampleCount offset=0);
- virtual void recycle_buffers();
-
- uint32_t index() const { return _index; }
- void set_index(RunContext&, uint32_t index) { _index = index; }
-
- inline bool is_a(PortType type) const { return _type == type; }
-
- bool has_value() const;
-
- PortType type() const { return _type; }
- LV2_URID value_type() const { return _value.is_valid() ? _value.type() : 0; }
- LV2_URID buffer_type() const { return _buffer_type; }
-
- bool supports(const URIs::Quark& value_type) const;
-
- size_t buffer_size() const { return _buffer_size; }
-
- uint32_t poly() const {
- return _poly;
- }
- uint32_t prepared_poly() const {
- return (_prepared_voices) ? _prepared_voices->size() : 1;
- }
-
- void set_buffer_size(RunContext& context, BufferFactory& bufs, size_t size);
-
- /** Return true iff this port is explicitly monitored.
- *
- * This is used for plugin UIs which require monitoring for particular
- * ports, even if the Ingen client has not requested broadcasting in
- * general (e.g. for canvas animation).
- */
- bool is_monitored() const { return _monitored; }
-
- /** Explicitly turn on monitoring for this port. */
- void enable_monitoring(bool monitored) { _monitored = monitored; }
-
- /** Monitor port value and broadcast to clients periodically. */
- void monitor(RunContext& context, bool send_now=false);
-
- BufferFactory& bufs() const { return _bufs; }
-
- BufferRef value_buffer(uint32_t voice);
-
- BufferRef user_buffer(RunContext&) const { return _user_buffer; }
- void set_user_buffer(RunContext&, BufferRef b) { _user_buffer = b; }
-
- /** Return offset of the first value change after `offset`. */
- virtual SampleCount next_value_offset(SampleCount offset,
- SampleCount end) const;
-
- /** Update value buffer for `voice` to be current as of `offset`. */
- void update_values(SampleCount offset, uint32_t voice);
-
- void force_monitor_update() { _force_monitor_update = true; }
-
- void set_morphable(bool is_morph, bool is_auto_morph) {
- _is_morph = is_morph;
- _is_auto_morph = is_auto_morph;
- }
-
- void set_type(PortType port_type, LV2_URID buffer_type);
-
- void cache_properties();
-
- bool is_input() const { return !_is_output; }
- bool is_output() const { return _is_output; }
- bool is_morph() const { return _is_morph; }
- bool is_auto_morph() const { return _is_auto_morph; }
- bool is_logarithmic() const { return _is_logarithmic; }
- bool is_sample_rate() const { return _is_sample_rate; }
- bool is_toggled() const { return _is_toggled; }
-
-protected:
- typedef BufferRef (BufferFactory::*GetFn)(LV2_URID, LV2_URID, uint32_t);
-
- /** Set `voices` as the buffers to be used for this port.
- *
- * This is real-time safe only if `get` is as well, use in the real-time
- * thread should pass &BufferFactory::claim_buffer.
- *
- * @return true iff buffers are locally owned by the port
- */
- virtual bool get_buffers(BufferFactory& bufs,
- GetFn get,
- const MPtr<Voices>& voices,
- uint32_t poly,
- size_t num_in_arcs) const;
-
- BufferFactory& _bufs;
- uint32_t _index;
- uint32_t _poly;
- uint32_t _buffer_size;
- uint32_t _frames_since_monitor;
- float _monitor_value;
- float _peak;
- PortType _type;
- LV2_URID _buffer_type;
- Atom _value;
- Atom _min;
- Atom _max;
- MPtr<Voices> _voices;
- MPtr<Voices> _prepared_voices;
- BufferRef _user_buffer;
- std::atomic_flag _connected_flag;
- bool _monitored;
- bool _force_monitor_update;
- bool _is_morph;
- bool _is_auto_morph;
- bool _is_logarithmic;
- bool _is_sample_rate;
- bool _is_toggled;
- bool _is_driver_port;
- bool _is_output;
-};
-
-} // namespace Server
-} // namespace Ingen
-
-#endif // INGEN_ENGINE_PORTIMPL_HPP