From 84906b5777d6748c09dd5ca56169aa3366d13c71 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 2 Jan 2007 02:51:41 +0000 Subject: Initial work on dynamic (Jack) buffer resizing (still unworking). git-svn-id: http://svn.drobilla.net/lad/ingen@229 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/engine/Buffer.cpp | 193 ++++++++++++++++++++++++--------------------- 1 file changed, 102 insertions(+), 91 deletions(-) (limited to 'src/libs/engine/Buffer.cpp') diff --git a/src/libs/engine/Buffer.cpp b/src/libs/engine/Buffer.cpp index af655a19..4cca362e 100644 --- a/src/libs/engine/Buffer.cpp +++ b/src/libs/engine/Buffer.cpp @@ -29,44 +29,76 @@ namespace Ingen { template Buffer::Buffer(size_t size) -: m_size(size), - m_filled_size(0), - m_is_joined(false), - m_state(OK), - m_set_value(0), - m_data(NULL), - m_local_data(NULL) +: _data(NULL), + _local_data(NULL), + _joined_buf(NULL), + _size(size), + _filled_size(0), + _state(OK), + _set_value(0) { - assert(m_size > 0); + assert(_size > 0); allocate(); - assert(m_data); + assert(data()); } template Buffer::Buffer(size_t size); template Buffer::Buffer(size_t size); +template +void +Buffer::resize(size_t size) +{ + _size = size; + + T* const old_data = _data; + + const bool using_local_data = (_data == _local_data); + + deallocate(); + + const int ret = posix_memalign((void**)&_local_data, 16, _size * sizeof(T)); + if (ret != 0) { + cerr << "[Buffer] Failed to allocate buffer. Aborting." << endl; + exit(EXIT_FAILURE); + } + + assert(ret == 0); + assert(_local_data); + + if (using_local_data) + _data = _local_data; + else + _data = old_data; + + set(0, 0, _size-1); +} +template void Buffer::resize(size_t size); +template void Buffer::resize(size_t size); + + /** Allocate and use a locally managed buffer (data). */ template void Buffer::allocate() { - assert(!m_is_joined); - assert(m_data == NULL); - assert(m_local_data == NULL); - assert(m_size > 0); + assert(!_joined_buf); + assert(_local_data == NULL); + assert(_size > 0); - const int ret = posix_memalign((void**)&m_local_data, 16, m_size * sizeof(T)); + const int ret = posix_memalign((void**)&_local_data, 16, _size * sizeof(T)); if (ret != 0) { cerr << "[Buffer] Failed to allocate buffer. Aborting." << endl; exit(EXIT_FAILURE); } assert(ret == 0); - assert(m_local_data != NULL); - m_data = m_local_data; + assert(_local_data); - set(0, 0, m_size-1); + _data = _local_data; + + set(0, 0, _size-1); } template void Buffer::allocate(); template void Buffer::allocate(); @@ -78,11 +110,10 @@ template void Buffer::deallocate() { - assert(!m_is_joined); - free(m_local_data); - if (m_data == m_local_data) - m_data = NULL; - m_local_data = NULL; + assert(!_joined_buf); + free(_local_data); + _local_data = NULL; + _data = NULL; } template void Buffer::deallocate(); template void Buffer::deallocate(); @@ -94,9 +125,9 @@ template void Buffer::clear() { - set(0, 0, m_size-1); - m_state = OK; - m_filled_size = 0; + set(0, 0, _size-1); + _state = OK; + _filled_size = 0; } template void Buffer::clear(); template void Buffer::clear(); @@ -112,14 +143,14 @@ template void Buffer::set(T val, size_t start_sample) { - assert(start_sample < m_size); + assert(start_sample < _size); - set(val, start_sample, m_size-1); + set(val, start_sample, _size-1); if (start_sample > 0) - m_state = HALF_SET_CYCLE_1; + _state = HALF_SET_CYCLE_1; - m_set_value = val; + _set_value = val; } template void Buffer::set(Sample val, size_t start_sample); template void Buffer::set(MidiMessage val, size_t start_sample); @@ -134,11 +165,13 @@ void Buffer::set(T val, size_t start_sample, size_t end_sample) { assert(end_sample >= start_sample); - assert(end_sample < m_size); - assert(m_data != NULL); + assert(end_sample < _size); + + T* const buf = data(); + assert(buf); for (size_t i=start_sample; i <= end_sample; ++i) - m_data[i] = val; + buf[i] = val; } template void Buffer::set(Sample val, size_t start_sample, size_t end_sample); template void Buffer::set(MidiMessage val, size_t start_sample, size_t end_sample); @@ -153,11 +186,13 @@ void Buffer::scale(T val, size_t start_sample, size_t end_sample) { assert(end_sample >= start_sample); - assert(end_sample < m_size); - assert(m_data != NULL); + assert(end_sample < _size); + + T* const buf = data(); + assert(buf); for (size_t i=start_sample; i <= end_sample; ++i) - m_data[i] *= val; + buf[i] *= val; } template void Buffer::scale(Sample val, size_t start_sample, size_t end_sample); @@ -172,15 +207,17 @@ void Buffer::copy(const Buffer* src, size_t start_sample, size_t end_sample) { assert(end_sample >= start_sample); - assert(end_sample < m_size); - assert(src != NULL); - assert(src->data() != NULL); - assert(m_data != NULL); + assert(end_sample < _size); + assert(src); + + T* const buf = data(); + assert(buf); - register const T* const src_data = src->data(); + const T* const src_buf = src->data(); + assert(src_buf); for (size_t i=start_sample; i <= end_sample; ++i) - m_data[i] = src_data[i]; + buf[i] = src_buf[i]; } template void Buffer::copy(const Buffer* const src, size_t start_sample, size_t end_sample); template void Buffer::copy(const Buffer* const src, size_t start_sample, size_t end_sample); @@ -196,15 +233,17 @@ void Buffer::accumulate(const Buffer* const src, size_t start_sample, size_t end_sample) { assert(end_sample >= start_sample); - assert(end_sample < m_size); - assert(src != NULL); - assert(src->data() != NULL); - assert(m_data != NULL); - - register const T* const src_data = src->data(); + assert(end_sample < _size); + assert(src); + T* const buf = data(); + assert(buf); + + const T* const src_buf = src->data(); + assert(src_buf); + for (size_t i=start_sample; i <= end_sample; ++i) - m_data[i] += src_data[i]; + buf[i] += src_buf[i]; } template void Buffer::accumulate(const Buffer* const src, size_t start_sample, size_t end_sample); @@ -218,13 +257,12 @@ template void Buffer::join(Buffer* buf) { - assert(buf->size() == m_size); + assert(buf->size() == _size); - m_data = buf->m_data; - m_filled_size = buf->filled_size(); - m_is_joined = true; + _joined_buf = buf; + _filled_size = buf->filled_size(); - assert(m_filled_size <= m_size); + assert(_filled_size <= _size); } template void Buffer::join(Buffer* buf); template void Buffer::join(Buffer* buf); @@ -234,8 +272,8 @@ template void Buffer::unjoin() { - m_is_joined = false; - m_data = m_local_data; + _joined_buf = NULL; + _data = _local_data; } template void Buffer::unjoin(); template void Buffer::unjoin(); @@ -247,15 +285,15 @@ Buffer::prepare(SampleCount nframes) { // FIXME: nframes parameter doesn't actually work, // writing starts from 0 every time - assert(m_size == 1 || nframes == m_size); + assert(_size == 1 || nframes == _size); - switch (m_state) { + switch (_state) { case HALF_SET_CYCLE_1: - m_state = HALF_SET_CYCLE_2; + _state = HALF_SET_CYCLE_2; break; case HALF_SET_CYCLE_2: - set(m_set_value, 0, m_size-1); - m_state = OK; + set(_set_value, 0, _size-1); + _state = OK; break; default: break; @@ -276,41 +314,14 @@ Buffer::prepare(SampleCount nframes) */ template void -Buffer::set_data(T* data) +Buffer::set_data(T* buf) { - assert(!m_is_joined); - m_data = data; + assert(buf); + assert(!_joined_buf); + _data = buf; } template void Buffer::set_data(Sample* data); template void Buffer::set_data(MidiMessage* data); -////// DriverBuffer //////// -#if 0 -template -DriverBuffer::DriverBuffer(size_t size) -: Buffer(size) -{ - Buffer::deallocate(); // FIXME: allocate then immediately deallocate, dirty - Buffer::m_data = NULL; -} -template DriverBuffer::DriverBuffer(size_t size); -template DriverBuffer::DriverBuffer(size_t size); - - -/** Set the buffer (data) used. - * - * This is only to be used by Drivers (to provide zero-copy processing). - */ -template -void -DriverBuffer::set_data(T* data) -{ - assert(!m_is_joined); - m_data = data; -} -template void DriverBuffer::set_data(sample* data); -template void DriverBuffer::set_data(MidiMessage* data); -#endif - } // namespace Ingen -- cgit v1.2.1