diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-06-02 21:41:35 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-06-02 21:41:35 +0000 |
commit | 449aab3c465bbbf66d221fac3d7ea559f1720357 (patch) | |
tree | 6843cc40c88250a132acac701271f1504cd2df04 /libs/ardour/midi_port.cc | |
parent | 9c0d7d72d70082a54f823cd44c0ccda5da64bb6f (diff) |
rollback to 3428, before the mysterious removal of libs/* at 3431/3432
git-svn-id: svn://localhost/ardour2/branches/3.0@3435 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/midi_port.cc')
-rw-r--r-- | libs/ardour/midi_port.cc | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/libs/ardour/midi_port.cc b/libs/ardour/midi_port.cc new file mode 100644 index 0000000000..14f88f2ad5 --- /dev/null +++ b/libs/ardour/midi_port.cc @@ -0,0 +1,112 @@ +/* + Copyright (C) 2006 Paul Davis + + This program 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. + + This program 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 more 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include <cassert> +#include <iostream> + +#include <ardour/midi_port.h> +#include <ardour/jack_midi_port.h> +#include <ardour/data_type.h> + +using namespace ARDOUR; +using namespace std; + +MidiPort::MidiPort (const std::string& name, Flags flags, bool external, nframes_t capacity) + : Port (name, flags) + , BaseMidiPort (name, flags) + , PortFacade (name, flags) +{ + // FIXME: size kludge (see BufferSet::ensure_buffers) + // Jack needs to tell us this + _buffer = new MidiBuffer (capacity * 8); + + if (external) { + /* external ports use the same buffer for the jack port (_ext_port) + * and internal ports (this) */ + _ext_port = new JackMidiPort (name, flags, _buffer); + Port::set_name (_ext_port->name()); + } else { + /* internal ports just have a single buffer, no jack port */ + _ext_port = 0; + set_name (name); + } + + reset (); +} + +MidiPort::~MidiPort() +{ + if (_ext_port) { + delete _ext_port; + _ext_port = 0; + } +} + +void +MidiPort::reset() +{ + BaseMidiPort::reset(); + + if (_ext_port) { + _ext_port->reset (); + } +} + +void +MidiPort::cycle_start (nframes_t nframes, nframes_t offset) +{ + if (_ext_port) { + _ext_port->cycle_start (nframes, offset); + } + + if (_flags & IsInput) { + + if (_ext_port) { + + BaseMidiPort* mprt = dynamic_cast<BaseMidiPort*>(_ext_port); + assert(mprt); + assert(&mprt->get_midi_buffer() == _buffer); + + if (!_connections.empty()) { + (*_mixdown) (_connections, _buffer, nframes, offset, false); + } + + } else { + + if (_connections.empty()) { + _buffer->silence (nframes, offset); + } else { + (*_mixdown) (_connections, _buffer, nframes, offset, true); + } + } + + } else { + + _buffer->silence (nframes, offset); + } +} + + +void +MidiPort::cycle_end (nframes_t nframes, nframes_t offset) +{ + if (_ext_port) { + _ext_port->cycle_end (nframes, offset); + } +} + |