X-Git-Url: https://main.carlh.net/gitweb/?p=ardour.git;a=blobdiff_plain;f=libs%2Fardour%2Faudio_buffer.cc;h=89e210c7728a7c323e8bc3940264a71fcae6c2fd;hp=506b34eb04d8202378866f85cde01279c6fea1e4;hb=c8c6bca6587450ff64303dbc994a4cd28d6ce7aa;hpb=70b939da4f9d4097160e32f2373a7a5ff8f4957f diff --git a/libs/ardour/audio_buffer.cc b/libs/ardour/audio_buffer.cc index 506b34eb04..89e210c772 100644 --- a/libs/ardour/audio_buffer.cc +++ b/libs/ardour/audio_buffer.cc @@ -1,102 +1,94 @@ /* - Copyright (C) 2006-2007 Paul Davis - + Copyright (C) 2006-2007 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 "i18n.h" +#include "ardour/audio_buffer.h" +#include "pbd/error.h" +#include "pbd/malign.h" -#ifdef __x86_64__ -static const int CPU_CACHE_ALIGN = 64; -#else -static const int CPU_CACHE_ALIGN = 16; /* arguably 32 on most arches, but it matters less */ -#endif +#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); -} - -/* called to replace a pointer to an external buffer (e.g. JACK) with - buffer-owned memory. -*/ - -void -AudioBuffer::replace_data (size_t capacity) -{ - _owns_data = true; - _data = 0; - _capacity = 0; // force reallocation - resize (capacity); + 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; } - if (_data) { - free (_data); - } + cache_aligned_free (_data); + + cache_aligned_malloc ((void**) &_data, sizeof (Sample) * size); _capacity = size; - _size = size; _silent = false; +} -#ifdef NO_POSIX_MEMALIGN - _data = (Sample *) malloc(sizeof(Sample) * _capacity); -#else - if (posix_memalign((void**)&_data, CPU_CACHE_ALIGN, sizeof(Sample) * _capacity)) { - fatal << string_compose (_("Memory allocation error: posix_memalign (%1 * %2) failed (%3)"), - CPU_CACHE_ALIGN, sizeof (Sample) * _capacity, strerror (errno)) << endmsg; +bool +AudioBuffer::check_silence (pframes_t nframes, pframes_t& n) const +{ + for (n = 0; n < nframes; ++n) { + if (_data[n] != Sample (0)) { + return false; + } } -#endif - + return true; } void -AudioBuffer::copy_to_internal (Sample* p, nframes_t cnt, nframes_t offset) -{ - memcpy (_data + offset, p, sizeof(Sample*) * cnt); +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; } -