diff options
author | David Robillard <d@drobilla.net> | 2006-08-11 03:24:57 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2006-08-11 03:24:57 +0000 |
commit | 30c08ba655330232767554c48bda1975bfb5628c (patch) | |
tree | c6bf6b62de69afdd6b2a42ef3a7d9f80e0f65f7c /libs/ardour/buffer.cc | |
parent | ab6f1ed9bafa869648b6e94ee5186ff317b32c3e (diff) |
- Changed IO's vector<Port*>'s to PortList
- Added new Port classes, code to drive them
- Added PortList, which is a filthy mess ATM (nevermind that, it's the interface that's important at this stage)
- Added ChanCount, though it isn't very thoroughly used yet. That's the next step....
- Fixed a few bugs relating to loading sessions saved with trunk
- Fixed a few random other bugs
Slowly working towards type agnosticism while keeping all the former code/logic intact is the name of the game here
Warning: Removing ports is currently (intentionally) broken due solely to laziness.
git-svn-id: svn://localhost/ardour2/branches/midi@786 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/buffer.cc')
-rw-r--r-- | libs/ardour/buffer.cc | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/libs/ardour/buffer.cc b/libs/ardour/buffer.cc new file mode 100644 index 0000000000..d3791eaed1 --- /dev/null +++ b/libs/ardour/buffer.cc @@ -0,0 +1,107 @@ +/* + 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 <ardour/buffer.h> +#include <iostream> + +namespace ARDOUR { + + +Buffer* +Buffer::create(DataType type, size_t capacity) +{ + if (type == DataType::AUDIO) + return new AudioBuffer(capacity); + else if (type == DataType::MIDI) + return new MidiBuffer(capacity); + else + return NULL; +} + + +AudioBuffer::AudioBuffer(size_t capacity) + : Buffer(DataType::AUDIO, capacity) + , _data(NULL) +{ + _size = capacity; // For audio buffers, size = capacity (always) + if (capacity > 0) { +#ifdef NO_POSIX_MEMALIGN + _data = (Sample *) malloc(sizeof(Sample) * capacity); +#else + posix_memalign((void**)&_data, 16, sizeof(Sample) * capacity); +#endif + assert(_data); + clear(); + _owns_data = true; + } else { + _owns_data = false; + } +} + +AudioBuffer::~AudioBuffer() +{ + if (_owns_data) + free(_data); +} + +// FIXME: mirroring for MIDI buffers? +MidiBuffer::MidiBuffer(size_t capacity) + : Buffer(DataType::MIDI, capacity) + , _owns_data(true) + , _data(NULL) +{ + assert(capacity > 0); + + _size = capacity; // For audio buffers, size = capacity (always) +#ifdef NO_POSIX_MEMALIGN + _data = (RawMidi *) malloc(sizeof(RawMidi) * capacity); +#else + posix_memalign((void**)&_data, 16, sizeof(RawMidi) * capacity); +#endif + assert(_data); + memset(_data, 0, sizeof(RawMidi) * capacity); +} + +MidiBuffer::~MidiBuffer() +{ + if (_owns_data) + free(_data); +} + +/** Note that offset and nframes refer to sample time, not actual buffer locations */ +void +MidiBuffer::write(const Buffer& src, jack_nframes_t offset, jack_nframes_t nframes) +{ + assert(src.type() == DataType::MIDI); + assert(offset == 0); + MidiBuffer& msrc = (MidiBuffer&)src; + _size = 0; + for (size_t i=0; i < msrc.size() && msrc.data()[i].time < nframes; ++i) { + assert(i < _capacity); + _data[i] = msrc.data()[i]; + ++_size; + } + assert(_size == msrc.size()); + + if (_size > 0) + std::cerr << "MidiBuffer wrote " << _size << " events.\n"; +} + + +} // namespace ARDOUR + |