diff --git a/libs/ardour/ardour/base_audio_port.h b/libs/ardour/ardour/base_audio_port.h new file mode 100644 index 0000000000..791928fa03 --- /dev/null +++ b/libs/ardour/ardour/base_audio_port.h @@ -0,0 +1,106 @@ +/* + Copyright (C) 2002 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. + + $Id: port.h 712 2006-07-28 01:08:57Z drobilla $ +*/ + +#ifndef __ardour_base_audio_port_h__ +#define __ardour_base_audio_port_h__ + +#include + +#include + +#include + +#include +#include +#include + +namespace ARDOUR { + +class AudioEngine; + +class BaseAudioPort : public virtual Port { + public: + virtual ~BaseAudioPort(); + + DataType type() const { return DataType::AUDIO; } + + virtual Buffer& get_buffer () { + assert (_buffer); + return *_buffer; + } + + virtual AudioBuffer& get_audio_buffer() { + assert (_buffer); + return *_buffer; + } + + void reset (); + + void reset_overs () { + /* XXX NOT THREAD SAFE */ + _short_overs = 0; + _long_overs = 0; + _overlen = 0; + } + + void reset_peak_meter () { + /* XXX NOT THREAD SAFE */ + _peak = 0; + } + + void reset_meters () { + /* XXX NOT THREAD SAFE */ + reset_peak_meter (); + reset_overs (); + } + + float peak_db() const { return _peak_db; } + Sample peak() const { return _peak; } + + uint32_t short_overs () const { return _short_overs; } + uint32_t long_overs () const { return _long_overs; } + + static void set_short_over_length (nframes_t); + static void set_long_over_length (nframes_t); + + void set_mixdown_function (void (*func)(const std::set&, AudioBuffer*, nframes_t, nframes_t, bool)); + + protected: + BaseAudioPort (const std::string& name, Flags flags); + + AudioBuffer* _buffer; + nframes_t _overlen; + Sample _peak; + float _peak_db; + uint32_t _short_overs; + uint32_t _long_overs; + bool _own_buffer; + + void (*_mixdown)(const std::set&, AudioBuffer*, nframes_t, nframes_t, bool); + + static void default_mixdown (const std::set&, AudioBuffer*, nframes_t, nframes_t, bool); + + static nframes_t _long_over_length; + static nframes_t _short_over_length; +}; + +} // namespace ARDOUR + +#endif /* __ardour_base_audio_port_h__ */ diff --git a/libs/ardour/ardour/base_midi_port.h b/libs/ardour/ardour/base_midi_port.h new file mode 100644 index 0000000000..1c9a69d48d --- /dev/null +++ b/libs/ardour/ardour/base_midi_port.h @@ -0,0 +1,67 @@ +/* + Copyright (C) 2002 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. + + $Id: port.h 712 2006-07-28 01:08:57Z drobilla $ +*/ + +#ifndef __ardour_base_midi_port_h__ +#define __ardour_base_midi_port_h__ + +#include +#include +#include +#include +#include + +namespace ARDOUR { + +class MidiEngine; + +class BaseMidiPort : public virtual Port { + public: + virtual ~BaseMidiPort(); + + DataType type() const { return DataType::MIDI; } + + Buffer& get_buffer() { + assert (_buffer); + return *_buffer; + } + + MidiBuffer& get_midi_buffer() { + assert (_buffer); + return *_buffer; + } + + size_t capacity() { return _buffer->capacity(); } + size_t size() { return _buffer->size(); } + + void set_mixdown_function (void (*func)(const std::set&, MidiBuffer*, nframes_t, nframes_t, bool)); + + protected: + BaseMidiPort (const std::string& name, Flags); + + MidiBuffer* _buffer; + bool _own_buffer; + + void (*_mixdown)(const std::set&, MidiBuffer*, nframes_t, nframes_t, bool); + static void default_mixdown (const std::set&, MidiBuffer*, nframes_t, nframes_t, bool); +}; + +} // namespace ARDOUR + +#endif /* __ardour_base_midi_port_h__ */ diff --git a/libs/ardour/base_audio_port.cc b/libs/ardour/base_audio_port.cc new file mode 100644 index 0000000000..379e69c8e0 --- /dev/null +++ b/libs/ardour/base_audio_port.cc @@ -0,0 +1,85 @@ +/* + 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 +#include +#include +#include + +using namespace ARDOUR; +using namespace std; + +nframes_t BaseAudioPort::_short_over_length = 2; +nframes_t BaseAudioPort::_long_over_length = 10; + +BaseAudioPort::BaseAudioPort (const std::string& name, Flags flgs) + : Port (name, flgs) + , _buffer (0) + , _own_buffer (false) +{ + _type = DataType::AUDIO; + _mixdown = default_mixdown; +} + +BaseAudioPort::~BaseAudioPort () +{ + if (_own_buffer && _buffer) { + delete _buffer; + } +} + +void +BaseAudioPort::reset() +{ + Port::reset(); + + if (_own_buffer && _buffer) { + _buffer->resize (engine->frames_per_cycle()); + _buffer->clear (); + } + + _metering = 0; + reset_meters (); +} + +void +BaseAudioPort::default_mixdown (const set& ports, AudioBuffer* dest, nframes_t cnt, nframes_t offset, bool first_overwrite) +{ + set::const_iterator p = ports.begin(); + + if (first_overwrite) { + dest->read_from ((dynamic_cast(*p))->get_audio_buffer(), cnt, offset); + p++; + } + + for (; p != ports.end(); ++p) { + dest->accumulate_from ((dynamic_cast(*p))->get_audio_buffer(), cnt, offset); + } +} + +void +BaseAudioPort::set_mixdown_function (void (*func)(const set&, AudioBuffer*, nframes_t, nframes_t, bool)) +{ + /* caller should (but not must) hold process lock since this is an atomic operation on most platforms + and even if its not, it doesn't really matter. + */ + + _mixdown = func; +} + + diff --git a/libs/ardour/base_midi_port.cc b/libs/ardour/base_midi_port.cc new file mode 100644 index 0000000000..3757d2221d --- /dev/null +++ b/libs/ardour/base_midi_port.cc @@ -0,0 +1,69 @@ +/* + 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 +#include + +#include +#include + +using namespace ARDOUR; +using namespace std; + +BaseMidiPort::BaseMidiPort (const std::string& name, Flags flags) + : Port (name, flags) + , _buffer (0) + , _own_buffer (false) +{ + _type = DataType::MIDI; + reset(); +} + +BaseMidiPort::~BaseMidiPort() +{ + if (_own_buffer && _buffer) { + delete _buffer; + } +} + +void +BaseMidiPort::default_mixdown (const set& ports, MidiBuffer* dest, nframes_t cnt, nframes_t offset, bool first_overwrite) +{ + set::const_iterator p = ports.begin(); + + if (first_overwrite) { + dest->read_from ((dynamic_cast(*p))->get_midi_buffer(), cnt, offset); + p++; + } + + // XXX DAVE: this is just a guess + + for (; p != ports.end(); ++p) { + dest->merge (*dest, (dynamic_cast(*p))->get_midi_buffer()); + } +} + +void +BaseMidiPort::set_mixdown_function (void (*func)(const set&, MidiBuffer*, nframes_t, nframes_t, bool)) +{ + /* caller should (but not must) hold process lock since this is an atomic operation on most platforms + and even if its not, it doesn't really matter. + */ + + _mixdown = func; +}