diff options
author | David Robillard <d@drobilla.net> | 2009-11-16 00:30:35 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-11-16 00:30:35 +0000 |
commit | 3d89115a67a9c947a28539ffdd2399808a53279b (patch) | |
tree | 826b900de3979eed9c31aae0d3ac560d39b53460 /src/engine/PortImpl.cpp | |
parent | 597fa9212f27d2448c0cdd20fbf616928c662cc1 (diff) | |
download | ingen-3d89115a67a9c947a28539ffdd2399808a53279b.tar.gz ingen-3d89115a67a9c947a28539ffdd2399808a53279b.tar.bz2 ingen-3d89115a67a9c947a28539ffdd2399808a53279b.zip |
Rework objects extension to have "value ports" and "message ports".
Make audio and control buffers in ingen actually object buffers (towards interop).
Overhaul the hell out of ingen buffer and mixing stuff.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2266 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/PortImpl.cpp')
-rw-r--r-- | src/engine/PortImpl.cpp | 57 |
1 files changed, 25 insertions, 32 deletions
diff --git a/src/engine/PortImpl.cpp b/src/engine/PortImpl.cpp index ecb0d20b..169c7289 100644 --- a/src/engine/PortImpl.cpp +++ b/src/engine/PortImpl.cpp @@ -24,6 +24,7 @@ #include "AudioBuffer.hpp" #include "EventBuffer.hpp" #include "Engine.hpp" +#include "BufferFactory.hpp" #include "LV2Object.hpp" #include "NodeImpl.hpp" #include "ObjectBuffer.hpp" @@ -38,7 +39,8 @@ namespace Ingen { using namespace Shared; -PortImpl::PortImpl(NodeImpl* const node, +PortImpl::PortImpl(BufferFactory& bufs, + NodeImpl* const node, const string& name, uint32_t index, uint32_t poly, @@ -46,23 +48,27 @@ PortImpl::PortImpl(NodeImpl* const node, const Atom& value, size_t buffer_size) : GraphObjectImpl(node, name, (type == DataType::AUDIO || type == DataType::CONTROL)) + , _bufs(bufs) , _index(index) , _poly(poly) , _buffer_size(buffer_size) , _type(type) , _value(value) - , _fixed_buffers(false) , _broadcast(false) , _set_by_user(false) , _last_broadcasted_value(_value.type() == Atom::FLOAT ? _value.get_float() : 0.0f) // default? , _context(Context::AUDIO) - , _buffers(new Array<Buffer*>(poly)) + , _buffers(new Array< SharedPtr<Buffer> >(poly)) , _prepared_buffers(NULL) { assert(node != NULL); assert(_poly > 0); - allocate_buffers(); + _buffers->alloc(_poly); + for (uint32_t v = 0; v < _poly; ++v) + _buffers->at(v) = bufs.get(_type, _buffer_size); + + _prepared_buffers = _buffers; if (node->parent() == NULL) _polyphonic = false; @@ -80,9 +86,8 @@ PortImpl::PortImpl(NodeImpl* const node, PortImpl::~PortImpl() { - if (!_fixed_buffers) - for (uint32_t i=0; i < _poly; ++i) - delete _buffers->at(i); + for (uint32_t v = 0; v < _poly; ++v) + _buffers->at(v).reset(); delete _buffers; } @@ -99,16 +104,16 @@ PortImpl::set_polyphonic(Maid& maid, bool p) bool -PortImpl::prepare_poly(uint32_t poly) +PortImpl::prepare_poly(BufferFactory& bufs, uint32_t poly) { if (!_polyphonic || !_parent->polyphonic()) return true; /* FIXME: poly never goes down, harsh on memory.. */ if (poly > _poly) { - _prepared_buffers = new Array<Buffer*>(poly, *_buffers); + _prepared_buffers = new Array< SharedPtr<Buffer> >(poly, *_buffers); for (uint32_t i = _poly; i < _prepared_buffers->size(); ++i) - _prepared_buffers->at(i) = Buffer::create(_type, _buffer_size); + _prepared_buffers->at(i) = bufs.get(_type, _buffer_size); } return true; @@ -138,24 +143,12 @@ PortImpl::apply_poly(Maid& maid, uint32_t poly) void -PortImpl::allocate_buffers() -{ - _buffers->alloc(_poly); - - for (uint32_t i=0; i < _poly; ++i) - _buffers->at(i) = Buffer::create(_type, _buffer_size); - - _prepared_buffers = _buffers; -} - - -void -PortImpl::set_buffer_size(size_t size) +PortImpl::set_buffer_size(BufferFactory& bufs, size_t size) { _buffer_size = size; - for (uint32_t i=0; i < _poly; ++i) - _buffers->at(i)->resize(size); + for (uint32_t v = 0; v < _poly; ++v) + _buffers->at(v)->resize(size); connect_buffers(); } @@ -164,16 +157,16 @@ PortImpl::set_buffer_size(size_t size) void PortImpl::connect_buffers() { - for (uint32_t i=0; i < _poly; ++i) - PortImpl::parent_node()->set_port_buffer(i, _index, buffer(i)); + for (uint32_t v = 0; v < _poly; ++v) + PortImpl::parent_node()->set_port_buffer(v, _index, buffer(v)); } void PortImpl::clear_buffers() { - for (uint32_t i=0; i < _poly; ++i) - buffer(i)->clear(); + for (uint32_t v = 0; v < _poly; ++v) + buffer(v)->clear(); } @@ -186,16 +179,16 @@ PortImpl::broadcast_value(Context& context, bool force) break; case DataType::AUDIO: case DataType::CONTROL: - val = ((AudioBuffer*)buffer(0))->value_at(0); + val = ((AudioBuffer*)buffer(0).get())->value_at(0); break; case DataType::EVENTS: - if (((EventBuffer*)buffer(0))->event_count() > 0) { + if (((EventBuffer*)buffer(0).get())->event_count() > 0) { const Events::SendPortActivity ev(context.engine(), context.start(), this); context.event_sink().write(sizeof(ev), &ev); } break; case DataType::VALUE: - LV2Object::to_atom(context.engine().world(), ((ObjectBuffer*)buffer(0))->data(), val); + LV2Object::to_atom(context.engine().world(), ((ObjectBuffer*)buffer(0).get())->object(), val); break; } |