X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fbuffer_set.h;h=278496ffbc84d741252434c25308e3c5e75480f6;hb=baacf1c7b44773cc46ac2e11839502c5ae23f8ac;hp=1c7791878983be7f3af96398d6c828db3de2ed01;hpb=7884727e78f9e2253b2b6d8ef441fa07272fe950;p=ardour.git diff --git a/libs/ardour/ardour/buffer_set.h b/libs/ardour/ardour/buffer_set.h index 1c77918789..278496ffbc 100644 --- a/libs/ardour/ardour/buffer_set.h +++ b/libs/ardour/ardour/buffer_set.h @@ -1,16 +1,16 @@ /* - Copyright (C) 2006 Paul Davis - + 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. @@ -59,9 +59,14 @@ public: ~BufferSet(); void clear(); - + void attach_buffers(PortSet& ports, nframes_t nframes, nframes_t offset = 0); + /* the capacity here is a size_t and has a different interpretation depending + on the DataType of the buffers. for audio, its a frame count. for MIDI + its a byte count. + */ + void ensure_buffers(DataType type, size_t num_buffers, size_t buffer_capacity); void ensure_buffers(const ChanCount& chns, size_t buffer_capacity); @@ -71,21 +76,21 @@ public: const ChanCount& count() const { return _count; } ChanCount& count() { return _count; } - void is_silent(bool yn) { _is_silent = yn; } - bool is_silent() const { return _is_silent; } + void is_silent(bool yn); void silence (nframes_t nframes, nframes_t offset); - bool is_mirror() const { return _is_mirror; } + bool is_mirror() const { return _is_mirror; } void set_count(const ChanCount& count) { assert(count <= _available); _count = count; } - + size_t buffer_capacity(DataType type) const; - Buffer& get(DataType type, size_t i); + Buffer& get(DataType type, size_t i); + const Buffer& get(DataType type, size_t i) const; AudioBuffer& get_audio(size_t i) { return (AudioBuffer&)get(DataType::AUDIO, i); } - + MidiBuffer& get_midi(size_t i) { return (MidiBuffer&)get(DataType::MIDI, i); } @@ -100,64 +105,54 @@ public: void flush_lv2_midi(bool input, size_t i); #endif - void read_from(BufferSet& in, nframes_t nframes); - void merge_from(BufferSet& in, nframes_t nframes); + void read_from(const BufferSet& in, nframes_t nframes); + void merge_from(const BufferSet& in, nframes_t nframes); - // ITERATORS - // FIXME: possible to combine these? templates? - - class audio_iterator { + template + class iterator_base { public: - AudioBuffer& operator*() { return _set.get_audio(_index); } - AudioBuffer* operator->() { return &_set.get_audio(_index); } - audio_iterator& operator++() { ++_index; return *this; } // yes, prefix only - bool operator==(const audio_iterator& other) { return (_index == other._index); } - bool operator!=(const audio_iterator& other) { return (_index != other._index); } - - private: - friend class BufferSet; - - audio_iterator(BufferSet& list, size_t index) : _set(list), _index(index) {} - - BufferSet& _set; - size_t _index; - }; - - audio_iterator audio_begin() { return audio_iterator(*this, 0); } - audio_iterator audio_end() { return audio_iterator(*this, _count.n_audio()); } - - - class iterator { - public: - Buffer& operator*() { return _set.get(_type, _index); } - Buffer* operator->() { return &_set.get(_type, _index); } - iterator& operator++() { ++_index; return *this; } // yes, prefix only - bool operator==(const iterator& other) { return (_index == other._index); } - bool operator!=(const iterator& other) { return (_index != other._index); } - iterator operator=(const iterator& other) { + B& operator*() { return (B&)_set.get(_type, _index); } + B* operator->() { return &(B&)_set.get(_type, _index); } + iterator_base& operator++() { ++_index; return *this; } // yes, prefix only + bool operator==(const iterator_base& other) { return (_index == other._index); } + bool operator!=(const iterator_base& other) { return (_index != other._index); } + iterator_base operator=(const iterator_base& other) { _set = other._set; _type = other._type; _index = other._index; return *this; } private: friend class BufferSet; - iterator(BufferSet& list, DataType type, size_t index) + iterator_base(BS& list, DataType type, size_t index) : _set(list), _type(type), _index(index) {} - BufferSet& _set; - DataType _type; - size_t _index; + BS& _set; + DataType _type; + size_t _index; }; + typedef iterator_base iterator; iterator begin(DataType type) { return iterator(*this, type, 0); } iterator end(DataType type) { return iterator(*this, type, _count.get(type)); } - + + typedef iterator_base const_iterator; + const_iterator begin(DataType type) const { return const_iterator(*this, type, 0); } + const_iterator end(DataType type) const { return const_iterator(*this, type, _count.get(type)); } + + typedef iterator_base audio_iterator; + audio_iterator audio_begin() { return audio_iterator(*this, DataType::AUDIO, 0); } + audio_iterator audio_end() { return audio_iterator(*this, DataType::AUDIO, _count.n_audio()); } + + typedef iterator_base midi_iterator; + midi_iterator midi_begin() { return midi_iterator(*this, DataType::MIDI, 0); } + midi_iterator midi_end() { return midi_iterator(*this, DataType::MIDI, _count.n_midi()); } + private: typedef std::vector BufferVec; /// Vector of vectors, indexed by DataType std::vector _buffers; - + #ifdef HAVE_SLV2 /// LV2 MIDI buffers (for conversion to/from MIDI buffers) typedef std::vector< std::pair > LV2Buffers; @@ -172,9 +167,6 @@ private: /// False if we 'own' the contained buffers, if true we mirror a PortSet) bool _is_mirror; - - /// Whether the buffer set should be considered silent - bool _is_silent; };