X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudio_buffer.cc;h=89e210c7728a7c323e8bc3940264a71fcae6c2fd;hb=379ad3357df6cba267b7005aac572d6821487269;hp=1fd0337dd12c3e8bcba9608e12834918ef4d868c;hpb=3b20beb8d80e6b0ac12ef17e4f10e1d5dcc9fe55;p=ardour.git diff --git a/libs/ardour/audio_buffer.cc b/libs/ardour/audio_buffer.cc index 1fd0337dd1..89e210c772 100644 --- a/libs/ardour/audio_buffer.cc +++ b/libs/ardour/audio_buffer.cc @@ -22,58 +22,73 @@ #include "pbd/error.h" #include "pbd/malign.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace PBD; using namespace ARDOUR; AudioBuffer::AudioBuffer(size_t capacity) - : Buffer(DataType::AUDIO, capacity) + : Buffer (DataType::AUDIO) , _owns_data (false) , _data (0) { - if (_capacity > 0) { + if (capacity) { _owns_data = true; // prevent resize() from gagging - resize (_capacity); + resize (capacity); _silent = false; // force silence on the intial buffer state - silence (_capacity); + clear (); } } AudioBuffer::~AudioBuffer() { if (_owns_data) - free(_data); + cache_aligned_free(_data); } void AudioBuffer::resize (size_t size) { if (!_owns_data) { + /* XXX how the hell is this enforced? */ + _capacity = size; return; } - if (size < _capacity) { - _size = size; + if (_data && size < _capacity) { + /* buffer is already large enough */ return; } - free (_data); + cache_aligned_free (_data); + + cache_aligned_malloc ((void**) &_data, sizeof (Sample) * size); _capacity = size; - _size = size; _silent = false; - - cache_aligned_malloc ((void**) &_data, sizeof (Sample) * _capacity); } bool AudioBuffer::check_silence (pframes_t nframes, pframes_t& n) const { - for (n = 0; n < _size && n < nframes; ++n) { + for (n = 0; n < nframes; ++n) { if (_data[n] != Sample (0)) { return false; } } return true; } + +void +AudioBuffer::silence (framecnt_t len, framecnt_t offset) { + + if (!_silent) { + assert(_capacity > 0); + assert(offset + len <= _capacity); + memset(_data + offset, 0, sizeof (Sample) * len); + if (len == _capacity) { + _silent = true; + } + } + _written = true; +}