From b59584b387c4b77d09ba4c791eb711597f67c8c8 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 8 Apr 2007 08:11:59 +0000 Subject: MIDI patching fixes (clean disconnecting). git-svn-id: http://svn.drobilla.net/lad/ingen@416 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/engine/AudioBuffer.cpp | 2 +- src/libs/engine/AudioBuffer.h | 9 +++--- src/libs/engine/Buffer.h | 9 ++++-- src/libs/engine/DSSINode.cpp | 4 ++- src/libs/engine/DuplexPort.cpp | 26 +++++++++++++++++ src/libs/engine/DuplexPort.h | 7 +++-- src/libs/engine/Engine.cpp | 5 ++-- src/libs/engine/InputPort.cpp | 11 ++++---- src/libs/engine/InputPort.h | 2 +- src/libs/engine/InternalNode.h | 3 -- src/libs/engine/JackMidiDriver.cpp | 3 +- src/libs/engine/LADSPANode.cpp | 5 +++- src/libs/engine/LV2Node.cpp | 5 +++- src/libs/engine/Makefile.am | 1 + src/libs/engine/MidiBuffer.cpp | 26 +++++++++++++---- src/libs/engine/MidiBuffer.h | 17 ++++++------ src/libs/engine/MidiControlNode.cpp | 4 ++- src/libs/engine/MidiNoteNode.cpp | 4 ++- src/libs/engine/MidiTriggerNode.cpp | 4 ++- src/libs/engine/NodeBase.cpp | 19 +++++++++++-- src/libs/engine/NodeBase.h | 4 ++- src/libs/engine/OutputPort.cpp | 40 +++++++++++++++++++++++++++ src/libs/engine/OutputPort.h | 3 ++ src/libs/engine/Patch.cpp | 9 ++---- src/libs/engine/Patch.h | 20 +++++++------- src/libs/engine/Port.cpp | 8 ------ src/libs/engine/Port.h | 4 ++- src/libs/engine/TransportNode.cpp | 4 ++- src/libs/engine/events/DisconnectionEvent.cpp | 6 ---- 29 files changed, 182 insertions(+), 82 deletions(-) create mode 100644 src/libs/engine/OutputPort.cpp (limited to 'src/libs') diff --git a/src/libs/engine/AudioBuffer.cpp b/src/libs/engine/AudioBuffer.cpp index 525f0b41..35987942 100644 --- a/src/libs/engine/AudioBuffer.cpp +++ b/src/libs/engine/AudioBuffer.cpp @@ -264,7 +264,7 @@ AudioBuffer::is_joined_to(Buffer* buf) const void -AudioBuffer::prepare(SampleCount nframes) +AudioBuffer::prepare_read(SampleCount nframes) { // FIXME: nframes parameter doesn't actually work, // writing starts from 0 every time diff --git a/src/libs/engine/AudioBuffer.h b/src/libs/engine/AudioBuffer.h index fa946108..eba25c83 100644 --- a/src/libs/engine/AudioBuffer.h +++ b/src/libs/engine/AudioBuffer.h @@ -52,14 +52,15 @@ public: inline Sample& value_at(size_t offset) const { assert(offset < _size); return data()[offset]; } - void prepare(SampleCount nframes); + void prepare_read(SampleCount nframes); + void prepare_write(SampleCount nframes) {} + + void reset(SampleCount nframes) {} + void resize(size_t size); void filled_size(size_t size) { _filled_size = size; } size_t filled_size() const { return _filled_size; } - bool is_joined() const { return (_joined_buf == NULL); } size_t size() const { return _size; } - - void resize(size_t size); private: enum State { OK, HALF_SET_CYCLE_1, HALF_SET_CYCLE_2 }; diff --git a/src/libs/engine/Buffer.h b/src/libs/engine/Buffer.h index ee94b786..b27c3a86 100644 --- a/src/libs/engine/Buffer.h +++ b/src/libs/engine/Buffer.h @@ -37,10 +37,15 @@ public: virtual ~Buffer() {} + /** Clear contents and reset state */ virtual void clear() = 0; - virtual void prepare(SampleCount nframes) = 0; + + /** Reset state (ie reset read ptr), but leave contents */ + virtual void reset(SampleCount nframes) = 0; + + virtual void prepare_read(SampleCount nframes) = 0; + virtual void prepare_write(SampleCount nframes) = 0; - virtual bool is_joined() const = 0; virtual bool is_joined_to(Buffer* buf) const = 0; virtual bool join(Buffer* buf) = 0; virtual void unjoin() = 0; diff --git a/src/libs/engine/DSSINode.cpp b/src/libs/engine/DSSINode.cpp index 5a23baba..58ff050d 100644 --- a/src/libs/engine/DSSINode.cpp +++ b/src/libs/engine/DSSINode.cpp @@ -165,7 +165,7 @@ DSSINode::has_midi_input() const void DSSINode::process(SampleCount nframes, FrameTime start, FrameTime end) { - NodeBase::process(nframes, start, end); + NodeBase::pre_process(nframes, start, end); if (_dssi_descriptor->run_synth) { convert_events(); @@ -181,6 +181,8 @@ DSSINode::process(SampleCount nframes, FrameTime start, FrameTime end) } else { LADSPANode::process(nframes, start, end); } + + NodeBase::post_process(nframes, start, end); } diff --git a/src/libs/engine/DuplexPort.cpp b/src/libs/engine/DuplexPort.cpp index f4a71aae..c498c774 100644 --- a/src/libs/engine/DuplexPort.cpp +++ b/src/libs/engine/DuplexPort.cpp @@ -40,5 +40,31 @@ DuplexPort::DuplexPort(Node* parent, const string& name, size_t index, size_t po } +void +DuplexPort::pre_process(SampleCount nframes, FrameTime start, FrameTime end) +{ + if (_is_output) { + for (size_t i=0; i < _poly; ++i) + _buffers.at(i)->prepare_write(nframes); + } else { + for (size_t i=0; i < _poly; ++i) + _buffers.at(i)->prepare_read(nframes); + } +} + + +void +DuplexPort::post_process(SampleCount nframes, FrameTime start, FrameTime end) +{ + if (_is_output) { + for (size_t i=0; i < _poly; ++i) + _buffers.at(i)->prepare_read(nframes); + } else { + for (size_t i=0; i < _poly; ++i) + _buffers.at(i)->prepare_write(nframes); + } +} + + } // namespace Ingen diff --git a/src/libs/engine/DuplexPort.h b/src/libs/engine/DuplexPort.h index 10c305b4..986c1862 100644 --- a/src/libs/engine/DuplexPort.h +++ b/src/libs/engine/DuplexPort.h @@ -45,10 +45,11 @@ public: DuplexPort(Node* parent, const string& name, size_t index, size_t poly, DataType type, size_t buffer_size, bool is_output); virtual ~DuplexPort() {} - virtual void prepare_buffers(size_t nframes) {} + void pre_process(SampleCount nframes, FrameTime start, FrameTime end); + void post_process(SampleCount nframes, FrameTime start, FrameTime end); - virtual bool is_input() const { return !_is_output; } - virtual bool is_output() const { return _is_output; } + bool is_input() const { return !_is_output; } + bool is_output() const { return _is_output; } protected: bool _is_output; diff --git a/src/libs/engine/Engine.cpp b/src/libs/engine/Engine.cpp index 053528ff..ddb9ea81 100644 --- a/src/libs/engine/Engine.cpp +++ b/src/libs/engine/Engine.cpp @@ -190,9 +190,6 @@ Engine::deactivate() { if (!_activated) return; - - _audio_driver->root_patch()->disable(); - _audio_driver->root_patch()->deactivate(); /*for (Tree::iterator i = _object_store->objects().begin(); i != _object_store->objects().end(); ++i) @@ -204,6 +201,8 @@ Engine::deactivate() _audio_driver->deactivate(); + _audio_driver->root_patch()->deactivate(); + // Finalize any lingering events (unlikely) _post_processor->whip(); _post_processor->stop(); diff --git a/src/libs/engine/InputPort.cpp b/src/libs/engine/InputPort.cpp index 9326afd6..0e149abe 100644 --- a/src/libs/engine/InputPort.cpp +++ b/src/libs/engine/InputPort.cpp @@ -102,7 +102,7 @@ InputPort::remove_connection(const OutputPort* src_port) if (_connections.size() == 0) { for (size_t i=0; i < _poly; ++i) { // Use a local buffer - if (modify_buffers && _buffers.at(i)->is_joined()) + if (modify_buffers) _buffers.at(i)->unjoin(); _buffers.at(i)->clear(); // Write silence //if (_is_tied) @@ -145,10 +145,8 @@ InputPort::is_connected_to(const OutputPort* port) const * FIXME: nframes parameter not used, */ void -InputPort::process(SampleCount nframes, FrameTime start, FrameTime end) +InputPort::pre_process(SampleCount nframes, FrameTime start, FrameTime end) { - Port::process(nframes, start, end); - //assert(!_is_tied || _tied_port != NULL); bool do_mixdown = true; @@ -167,7 +165,6 @@ InputPort::process(SampleCount nframes, FrameTime start, FrameTime end) do_mixdown = true; } else { // zero-copy - //assert(_buffers.at(0)->is_joined()); _buffers.at(0)->join((*_connections.begin())->buffer(0)); do_mixdown = false; } @@ -179,6 +176,9 @@ InputPort::process(SampleCount nframes, FrameTime start, FrameTime end) //cerr << path() << " mixing: " << do_mixdown << endl; + for (size_t i=0; i < _poly; ++i) + _buffers.at(i)->prepare_read(nframes); + if (!do_mixdown) { assert(_buffers.at(0)->is_joined_to((*_connections.begin())->buffer(0))); return; @@ -188,6 +188,7 @@ InputPort::process(SampleCount nframes, FrameTime start, FrameTime end) assert(!_is_tied || _buffers.at(0)->data() == _tied_port->buffer(0)->data());*/ for (size_t voice=0; voice < _poly; ++voice) { + assert(_type == DataType::FLOAT); // Copy first connection ((AudioBuffer*)_buffers.at(voice))->copy( ((AudioBuffer*)(*_connections.begin())->buffer(voice)), 0, _buffer_size-1); diff --git a/src/libs/engine/InputPort.h b/src/libs/engine/InputPort.h index 284f976f..25777ecf 100644 --- a/src/libs/engine/InputPort.h +++ b/src/libs/engine/InputPort.h @@ -56,7 +56,7 @@ public: typedef Raul::List Connections; const Connections& connections() { return _connections; } - void process(SampleCount nframes, FrameTime start, FrameTime end); + void pre_process(SampleCount nframes, FrameTime start, FrameTime end); bool is_connected() const { return (_connections.size() > 0); } bool is_connected_to(const OutputPort* port) const; diff --git a/src/libs/engine/InternalNode.h b/src/libs/engine/InternalNode.h index b3ad00a3..7f7d54fe 100644 --- a/src/libs/engine/InternalNode.h +++ b/src/libs/engine/InternalNode.h @@ -42,9 +42,6 @@ public: virtual ~InternalNode() {} - virtual void process(SampleCount nframes, FrameTime start, FrameTime end) - { NodeBase::process(nframes, start, end); } - protected: Plugin* plugin() const { return const_cast(_plugin); } }; diff --git a/src/libs/engine/JackMidiDriver.cpp b/src/libs/engine/JackMidiDriver.cpp index ada9a439..44c44725 100644 --- a/src/libs/engine/JackMidiDriver.cpp +++ b/src/libs/engine/JackMidiDriver.cpp @@ -80,8 +80,7 @@ JackMidiPort::prepare_block(const SampleCount block_start, const SampleCount blo MidiBuffer* patch_buf = dynamic_cast(_patch_port->buffer(0)); assert(patch_buf); - patch_buf->clear(); - patch_buf->reset_state(nframes); + patch_buf->prepare_write(nframes); // Copy events from Jack port buffer into patch port buffer for (jack_nframes_t i=0; i < event_count; ++i) { diff --git a/src/libs/engine/LADSPANode.cpp b/src/libs/engine/LADSPANode.cpp index 3ad197a4..b347afa6 100644 --- a/src/libs/engine/LADSPANode.cpp +++ b/src/libs/engine/LADSPANode.cpp @@ -176,9 +176,12 @@ LADSPANode::deactivate() void LADSPANode::process(SampleCount nframes, FrameTime start, FrameTime end) { - NodeBase::process(nframes, start, end); // mixes down input ports + NodeBase::pre_process(nframes, start, end); + for (size_t i=0; i < _poly; ++i) _descriptor->run(_instances[i], nframes); + + NodeBase::post_process(nframes, start, end); } diff --git a/src/libs/engine/LV2Node.cpp b/src/libs/engine/LV2Node.cpp index 0baf41ef..f05a477b 100644 --- a/src/libs/engine/LV2Node.cpp +++ b/src/libs/engine/LV2Node.cpp @@ -170,9 +170,12 @@ LV2Node::deactivate() void LV2Node::process(SampleCount nframes, FrameTime start, FrameTime end) { - NodeBase::process(nframes, start, end); // mixes down input ports + NodeBase::pre_process(nframes, start, end); + for (size_t i=0; i < _poly; ++i) slv2_instance_run(_instances[i], nframes); + + NodeBase::post_process(nframes, start, end); } diff --git a/src/libs/engine/Makefile.am b/src/libs/engine/Makefile.am index 29b601a9..2516b24a 100644 --- a/src/libs/engine/Makefile.am +++ b/src/libs/engine/Makefile.am @@ -48,6 +48,7 @@ libingen_la_SOURCES = \ InputPort.h \ InputPort.cpp \ OutputPort.h \ + OutputPort.cpp \ DuplexPort.h \ DuplexPort.cpp \ MidiMessage.h \ diff --git a/src/libs/engine/MidiBuffer.cpp b/src/libs/engine/MidiBuffer.cpp index 7dfe72e6..35bda0a0 100644 --- a/src/libs/engine/MidiBuffer.cpp +++ b/src/libs/engine/MidiBuffer.cpp @@ -15,8 +15,11 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +//#include #include "MidiBuffer.h" +using namespace std; + namespace Ingen { @@ -48,6 +51,8 @@ MidiBuffer::unjoin() _joined_buf = NULL; _buf = _local_buf; _state = &_local_state; + clear(); + reset(_this_nframes); } @@ -63,14 +68,23 @@ MidiBuffer::is_joined_to(Buffer* buf) const void -MidiBuffer::prepare(SampleCount nframes) +MidiBuffer::prepare_read(SampleCount nframes) +{ + assert(!_joined_buf || data() == _joined_buf->data()); + assert(!_joined_buf || state() == _joined_buf->state()); + + reset(nframes); +} + + +void +MidiBuffer::prepare_write(SampleCount nframes) { - if (_joined_buf) - _local_state = *_joined_buf->state(); - else - reset_state(nframes); + clear(); + reset(nframes); - _this_nframes = nframes; + assert(!_joined_buf || data() == _joined_buf->data()); + assert(!_joined_buf || state() == _joined_buf->state()); } diff --git a/src/libs/engine/MidiBuffer.h b/src/libs/engine/MidiBuffer.h index 459c1209..5a810bc3 100644 --- a/src/libs/engine/MidiBuffer.h +++ b/src/libs/engine/MidiBuffer.h @@ -31,20 +31,19 @@ public: MidiBuffer(size_t capacity) : Buffer(DataType(DataType::MIDI), capacity) , _state(&_local_state) - , _buf(lv2midi_new((uint32_t)capacity)) - , _local_buf(NULL) + , _local_buf(lv2midi_new((uint32_t)capacity)) + , _buf(_local_buf) , _joined_buf(NULL) { clear(); - reset_state(0); } ~MidiBuffer() { lv2midi_free(_buf); } - void prepare(SampleCount nframes); + void prepare_read(SampleCount nframes); + void prepare_write(SampleCount nframes); bool is_joined_to(Buffer* buf) const; - bool is_joined() const { return (_joined_buf == NULL); } bool join(Buffer* buf); void unjoin(); @@ -57,9 +56,9 @@ public: { return ((_joined_buf != NULL) ? _joined_buf->state() : _state); } inline void clear() - { lv2midi_reset_buffer(_buf); } + { lv2midi_reset_buffer(_buf); _state->position = 0; } - inline void reset_state(uint32_t nframes) + inline void reset(SampleCount nframes) { lv2midi_reset_state(_state, _buf, nframes); _this_nframes = nframes; } inline double increment() @@ -72,10 +71,10 @@ public: { return lv2midi_put_event(_state, timestamp, size, data); } private: - LV2_MIDIState* _state; LV2_MIDIState _local_state; - LV2_MIDI* _buf; + LV2_MIDIState* _state; LV2_MIDI* _local_buf; + LV2_MIDI* _buf; MidiBuffer* _joined_buf; ///< Buffer to mirror, if joined diff --git a/src/libs/engine/MidiControlNode.cpp b/src/libs/engine/MidiControlNode.cpp index 81df8e6c..abe930c8 100644 --- a/src/libs/engine/MidiControlNode.cpp +++ b/src/libs/engine/MidiControlNode.cpp @@ -65,7 +65,7 @@ MidiControlNode::MidiControlNode(const string& path, size_t poly, Patch* parent, void MidiControlNode::process(SampleCount nframes, FrameTime start, FrameTime end) { - InternalNode::process(nframes, start, end); + NodeBase::pre_process(nframes, start, end); double timestamp = 0; uint32_t size = 0; @@ -81,6 +81,8 @@ MidiControlNode::process(SampleCount nframes, FrameTime start, FrameTime end) if (size >= 3 && (buffer[0] & 0xF0) == MIDI_CMD_CONTROL) control(buffer[1], buffer[2], time); } + + NodeBase::post_process(nframes, start, end); } diff --git a/src/libs/engine/MidiNoteNode.cpp b/src/libs/engine/MidiNoteNode.cpp index 6a6b698c..aac195ef 100644 --- a/src/libs/engine/MidiNoteNode.cpp +++ b/src/libs/engine/MidiNoteNode.cpp @@ -75,7 +75,7 @@ MidiNoteNode::~MidiNoteNode() void MidiNoteNode::process(SampleCount nframes, FrameTime start, FrameTime end) { - InternalNode::process(nframes, start, end); + NodeBase::pre_process(nframes, start, end); double timestamp = 0; uint32_t size = 0; @@ -122,6 +122,8 @@ MidiNoteNode::process(SampleCount nframes, FrameTime start, FrameTime end) midi_in->increment(); } + + NodeBase::post_process(nframes, start, end); } diff --git a/src/libs/engine/MidiTriggerNode.cpp b/src/libs/engine/MidiTriggerNode.cpp index 9d78f7b8..d45cfe85 100644 --- a/src/libs/engine/MidiTriggerNode.cpp +++ b/src/libs/engine/MidiTriggerNode.cpp @@ -60,7 +60,7 @@ MidiTriggerNode::MidiTriggerNode(const string& path, size_t poly, Patch* parent, void MidiTriggerNode::process(SampleCount nframes, FrameTime start, FrameTime end) { - InternalNode::process(nframes, start, end); + NodeBase::pre_process(nframes, start, end); double timestamp = 0; uint32_t size = 0; @@ -93,6 +93,8 @@ MidiTriggerNode::process(SampleCount nframes, FrameTime start, FrameTime end) } } } + + NodeBase::post_process(nframes, start, end); } diff --git a/src/libs/engine/NodeBase.cpp b/src/libs/engine/NodeBase.cpp index 7f9fe23b..ffd509c4 100644 --- a/src/libs/engine/NodeBase.cpp +++ b/src/libs/engine/NodeBase.cpp @@ -123,18 +123,31 @@ NodeBase::set_buffer_size(size_t size) } -/** Runs the Node for the specified number of frames (block size) +/** Prepare to run a cycle (in the audio thread) */ void -NodeBase::process(SampleCount nframes, FrameTime start, FrameTime end) +NodeBase::pre_process(SampleCount nframes, FrameTime start, FrameTime end) { assert(_activated); // Mix down any ports with multiple inputs for (size_t i=0; i < _ports->size(); ++i) - _ports->at(i)->process(nframes, start, end); + _ports->at(i)->pre_process(nframes, start, end); } +/** Prepare to run a cycle (in the audio thread) + */ +void +NodeBase::post_process(SampleCount nframes, FrameTime start, FrameTime end) +{ + assert(_activated); + // Prepare any output ports for reading (MIDI) + for (size_t i=0; i < _ports->size(); ++i) + _ports->at(i)->post_process(nframes, start, end); +} + + + /** Rename this Node. * * This is responsible for updating the ObjectStore so the Node can be diff --git a/src/libs/engine/NodeBase.h b/src/libs/engine/NodeBase.h index 8fed6196..6ae890f3 100644 --- a/src/libs/engine/NodeBase.h +++ b/src/libs/engine/NodeBase.h @@ -53,7 +53,9 @@ public: virtual void deactivate(); bool activated() { return _activated; } - virtual void process(SampleCount nframes, FrameTime start, FrameTime end); + virtual void post_process(SampleCount nframes, FrameTime start, FrameTime end); + virtual void process(SampleCount nframes, FrameTime start, FrameTime end) = 0; + virtual void pre_process(SampleCount nframes, FrameTime start, FrameTime end); virtual void set_port_buffer(size_t voice, size_t port_num, Buffer* buf) {} diff --git a/src/libs/engine/OutputPort.cpp b/src/libs/engine/OutputPort.cpp new file mode 100644 index 00000000..ea723963 --- /dev/null +++ b/src/libs/engine/OutputPort.cpp @@ -0,0 +1,40 @@ +/* This file is part of Ingen. + * Copyright (C) 2007 Dave Robillard + * + * Ingen is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) 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 General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "OutputPort.h" +#include "Buffer.h" + +namespace Ingen { + + +void +OutputPort::pre_process(SampleCount nframes, FrameTime start, FrameTime end) +{ + for (size_t i=0; i < _poly; ++i) + _buffers.at(i)->prepare_write(nframes); +} + + +void +OutputPort::post_process(SampleCount nframes, FrameTime start, FrameTime end) +{ + for (size_t i=0; i < _poly; ++i) + _buffers.at(i)->prepare_read(nframes); +} + + +} // namespace Ingen diff --git a/src/libs/engine/OutputPort.h b/src/libs/engine/OutputPort.h index 10118076..0e94be9f 100644 --- a/src/libs/engine/OutputPort.h +++ b/src/libs/engine/OutputPort.h @@ -49,6 +49,9 @@ public: : Port(parent, name, index, poly, type, buffer_size) {} + void pre_process(SampleCount nframes, FrameTime start, FrameTime end); + void post_process(SampleCount nframes, FrameTime start, FrameTime end); + virtual ~OutputPort() {} bool is_input() const { return false; } diff --git a/src/libs/engine/Patch.cpp b/src/libs/engine/Patch.cpp index a2b5a85f..ad414642 100644 --- a/src/libs/engine/Patch.cpp +++ b/src/libs/engine/Patch.cpp @@ -98,15 +98,10 @@ Patch::deactivate() void Patch::disable() { - // Write output buffers to 0 - /*for (Raul::List::iterator i = _bridge_nodes.begin(); i != _bridge_nodes.end(); ++i) { - assert((*i)->as_port() != NULL); - if ((*i)->as_port()->port_info()->is_output()) - (*i)->as_port()->clear_buffers();*/ + _process = false; + for (Raul::List::iterator i = _output_ports.begin(); i != _output_ports.end(); ++i) (*i)->clear_buffers(); - - _process = false; } diff --git a/src/libs/engine/Patch.h b/src/libs/engine/Patch.h index 55a2be83..76290c8f 100644 --- a/src/libs/engine/Patch.h +++ b/src/libs/engine/Patch.h @@ -98,21 +98,21 @@ public: /** Whether to run this patch's DSP bits in the audio thread */ bool enabled() const { return _process; } - void enable() { _process = true; } + void enable() { _process = true; } void disable(); size_t internal_poly() const { return _internal_poly; } private: - inline void build_process_order_recursive(Node* n, Raul::Array* order) const; - - size_t _internal_poly; - Raul::Array* _process_order; ///< Accessed in audio thread only - Raul::List _connections; ///< Accessed in audio thread only - Raul::List _input_ports; ///< Accessed in preprocessing thread only - Raul::List _output_ports; ///< Accessed in preprocessing thread only - Raul::List _nodes; ///< Accessed in preprocessing thread only - bool _process; + inline void build_process_order_recursive(Node* n, Raul::Array* order) const; + + size_t _internal_poly; + Raul::Array* _process_order; ///< Accessed in audio thread only + Raul::List _connections; ///< Accessed in audio thread only + Raul::List _input_ports; ///< Accessed in preprocessing thread only + Raul::List _output_ports; ///< Accessed in preprocessing thread only + Raul::List _nodes; ///< Accessed in preprocessing thread only + bool _process; }; diff --git a/src/libs/engine/Port.cpp b/src/libs/engine/Port.cpp index 4b9a014b..bfb09a35 100644 --- a/src/libs/engine/Port.cpp +++ b/src/libs/engine/Port.cpp @@ -91,12 +91,4 @@ Port::clear_buffers() } -void -Port::process(SampleCount nframes, FrameTime start, FrameTime end) -{ - for (size_t i=0; i < _poly; ++i) - _buffers.at(i)->prepare(nframes); -} - - } // namespace Ingen diff --git a/src/libs/engine/Port.h b/src/libs/engine/Port.h index b42231fe..6b3c20e8 100644 --- a/src/libs/engine/Port.h +++ b/src/libs/engine/Port.h @@ -52,7 +52,9 @@ public: Buffer* buffer(size_t voice) const { return _buffers.at(voice); } /** Called once per process cycle */ - virtual void process(SampleCount nframes, FrameTime start, FrameTime end); + virtual void pre_process(SampleCount nframes, FrameTime start, FrameTime end) = 0; + virtual void process(SampleCount nframes, FrameTime start, FrameTime end) {} + virtual void post_process(SampleCount nframes, FrameTime start, FrameTime end) {}; /** Empty buffer contents completely (ie silence) */ virtual void clear_buffers(); diff --git a/src/libs/engine/TransportNode.cpp b/src/libs/engine/TransportNode.cpp index 028fd45e..d8895d72 100644 --- a/src/libs/engine/TransportNode.cpp +++ b/src/libs/engine/TransportNode.cpp @@ -83,7 +83,7 @@ TransportNode::TransportNode(const string& path, size_t poly, Patch* parent, Sam void TransportNode::process(SampleCount nframes, FrameTime start, FrameTime end) { - NodeBase::process(nframes, start, end); + NodeBase::pre_process(nframes, start, end); #if 0 // FIXME: this will die horribly with any driver other than jack (in theory) @@ -147,6 +147,8 @@ TransportNode::process(SampleCount nframes, FrameTime start, FrameTime end) } } #endif + + NodeBase::post_process(nframes, start, end); } diff --git a/src/libs/engine/events/DisconnectionEvent.cpp b/src/libs/engine/events/DisconnectionEvent.cpp index aef271f4..7ac7e236 100644 --- a/src/libs/engine/events/DisconnectionEvent.cpp +++ b/src/libs/engine/events/DisconnectionEvent.cpp @@ -92,12 +92,6 @@ DisconnectionEvent::pre_process() return; } - if (_src_port->type() != _dst_port->type() || _src_port->buffer_size() != _dst_port->buffer_size()) { - _error = TYPE_MISMATCH; - QueuedEvent::pre_process(); - return; - } - _dst_input_port = dynamic_cast(_dst_port); _src_output_port = dynamic_cast(_src_port); assert(_src_output_port); -- cgit v1.2.1