diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/EnginePort.hpp | 12 | ||||
-rw-r--r-- | src/server/JackDriver.cpp | 38 | ||||
-rw-r--r-- | src/server/ingen_lv2.cpp | 5 |
3 files changed, 28 insertions, 27 deletions
diff --git a/src/server/EnginePort.hpp b/src/server/EnginePort.hpp index 39f25d5c..7ba58871 100644 --- a/src/server/EnginePort.hpp +++ b/src/server/EnginePort.hpp @@ -19,9 +19,8 @@ #include <string> -#include <boost/utility.hpp> - #include "raul/Deletable.hpp" +#include "raul/Noncopyable.hpp" #include "DuplexPort.hpp" @@ -33,7 +32,7 @@ namespace Server { class DuplexPort; class ProcessContext; -/** Representation of a "system" (eg outside Ingen) port. +/** Representation of a "system" port (a port outside Ingen). * * This is the class through which the rest of the engine manages everything * related to driver ports. Derived classes are expected to have a pointer to @@ -41,8 +40,9 @@ class ProcessContext; * * \ingroup engine */ -class EnginePort : boost::noncopyable, public Raul::Deletable { +class EnginePort : public Raul::Noncopyable, public Raul::Deletable { public: + EnginePort() : _patch_port(NULL), _buffer(NULL) {} virtual ~EnginePort() {} /** Set the name of the system port according to new path */ @@ -54,6 +54,9 @@ public: /** Destroy system port */ virtual void destroy() = 0; + void* buffer() const { return _buffer; } + void set_buffer(void* buf) { _buffer = buf; } + bool is_input() const { return _patch_port->is_input(); } DuplexPort* patch_port() const { return _patch_port; } @@ -61,6 +64,7 @@ protected: explicit EnginePort(DuplexPort* port) : _patch_port(port) {} DuplexPort* _patch_port; + void* _buffer; }; } // namespace Server diff --git a/src/server/JackDriver.cpp b/src/server/JackDriver.cpp index edebff55..40644a08 100644 --- a/src/server/JackDriver.cpp +++ b/src/server/JackDriver.cpp @@ -110,29 +110,28 @@ JackPort::move(const Raul::Path& path) void JackPort::pre_process(ProcessContext& context) { - if (!is_input()) - return; - const SampleCount nframes = context.nframes(); + _buffer = jack_port_get_buffer(_jack_port, nframes); - if (_patch_port->is_a(PortType::AUDIO)) { - jack_sample_t* jack_buf = (jack_sample_t*)jack_port_get_buffer(_jack_port, nframes); - AudioBuffer* patch_buf = (AudioBuffer*)_patch_port->buffer(0).get(); + if (!is_input()) { + return; + } - patch_buf->copy(jack_buf, 0, nframes - 1); + if (_patch_port->is_a(PortType::AUDIO)) { + AudioBuffer* patch_buf = (AudioBuffer*)_patch_port->buffer(0).get(); + patch_buf->copy((jack_sample_t*)_buffer, 0, nframes - 1); } else if (_patch_port->buffer_type() == _patch_port->bufs().uris().atom_Sequence) { - void* jack_buf = jack_port_get_buffer(_jack_port, nframes); Buffer* patch_buf = (Buffer*)_patch_port->buffer(0).get(); - const jack_nframes_t event_count = jack_midi_get_event_count(jack_buf); + const jack_nframes_t event_count = jack_midi_get_event_count(_buffer); patch_buf->prepare_write(context); // Copy events from Jack port buffer into patch port buffer for (jack_nframes_t i = 0; i < event_count; ++i) { jack_midi_event_t ev; - jack_midi_event_get(&ev, jack_buf, i); + jack_midi_event_get(&ev, _buffer, i); if (!patch_buf->append_event( ev.time, ev.size, _driver->_midi_event_type, ev.buffer)) { @@ -145,29 +144,32 @@ JackPort::pre_process(ProcessContext& context) void JackPort::post_process(ProcessContext& context) { - if (is_input()) + const SampleCount nframes = context.nframes(); + if (is_input()) { return; + } - const SampleCount nframes = context.nframes(); + if (!_buffer) { + // First cycle for a new outputs, so pre_process wasn't called + _buffer = jack_port_get_buffer(_jack_port, nframes); + } if (_patch_port->is_a(PortType::AUDIO)) { - jack_sample_t* jack_buf = (jack_sample_t*)jack_port_get_buffer(_jack_port, nframes); - AudioBuffer* patch_buf = (AudioBuffer*)_patch_port->buffer(0).get(); + AudioBuffer* patch_buf = (AudioBuffer*)_patch_port->buffer(0).get(); - memcpy(jack_buf, patch_buf->data(), nframes * sizeof(Sample)); + memcpy(_buffer, patch_buf->data(), nframes * sizeof(Sample)); } else if (_patch_port->buffer_type() == _patch_port->bufs().uris().atom_Sequence) { - void* jack_buf = jack_port_get_buffer(_jack_port, context.nframes()); Buffer* patch_buf = (Buffer*)_patch_port->buffer(0).get(); patch_buf->prepare_read(context); - jack_midi_clear_buffer(jack_buf); + jack_midi_clear_buffer(_buffer); LV2_Atom_Sequence* seq = (LV2_Atom_Sequence*)patch_buf->atom(); LV2_ATOM_SEQUENCE_FOREACH(seq, ev) { const uint8_t* buf = (const uint8_t*)LV2_ATOM_BODY(&ev->body); if (ev->body.type == _patch_port->bufs().uris().midi_MidiEvent) { - jack_midi_event_write(jack_buf, ev->time.frames, buf, ev->body.size); + jack_midi_event_write(_buffer, ev->time.frames, buf, ev->body.size); } } } diff --git a/src/server/ingen_lv2.cpp b/src/server/ingen_lv2.cpp index 0de22ed3..34d8003f 100644 --- a/src/server/ingen_lv2.cpp +++ b/src/server/ingen_lv2.cpp @@ -87,7 +87,6 @@ public: LV2Port(LV2Driver* driver, DuplexPort* patch_port) : EnginePort(patch_port) , _driver(driver) - , _buffer(NULL) {} // TODO: LV2 dynamic ports @@ -123,12 +122,8 @@ public: } } - void* buffer() const { return _buffer; } - void set_buffer(void* buf) { _buffer = buf; } - private: LV2Driver* _driver; - void* _buffer; }; class LV2Driver : public Ingen::Server::Driver |