diff options
author | David Robillard <d@drobilla.net> | 2017-02-12 15:04:20 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2017-02-12 15:31:47 +0100 |
commit | b1198f0842e6e4d6b1c01f07d91b42ef4a212788 (patch) | |
tree | 93fdf4da89a6f5f634707fb8c989e0d9ee1a3c65 /src/server/LV2Block.cpp | |
parent | 81d45973412c675e3c0b4a10b64d811a219feeae (diff) | |
download | ingen-b1198f0842e6e4d6b1c01f07d91b42ef4a212788.tar.gz ingen-b1198f0842e6e4d6b1c01f07d91b42ef4a212788.tar.bz2 ingen-b1198f0842e6e4d6b1c01f07d91b42ef4a212788.zip |
Use smart pointers to handle real-time memory disposal
Diffstat (limited to 'src/server/LV2Block.cpp')
-rw-r--r-- | src/server/LV2Block.cpp | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/src/server/LV2Block.cpp b/src/server/LV2Block.cpp index be02f3ed..ab2582d1 100644 --- a/src/server/LV2Block.cpp +++ b/src/server/LV2Block.cpp @@ -64,8 +64,6 @@ LV2Block::LV2Block(LV2Plugin* plugin, SampleRate srate) : BlockImpl(plugin, symbol, polyphonic, parent, srate) , _lv2_plugin(plugin) - , _instances(NULL) - , _prepared_instances(NULL) , _worker_iface(NULL) { assert(_lv2_plugin); @@ -73,10 +71,12 @@ LV2Block::LV2Block(LV2Plugin* plugin, LV2Block::~LV2Block() { - delete _instances; + // Explicitly drop instances first to prevent reference cycles + drop_instances(_instances); + drop_instances(_prepared_instances); } -SPtr<LilvInstance> +SPtr<LV2Block::Instance> LV2Block::make_instance(URIs& uris, SampleRate rate, uint32_t voice, @@ -90,7 +90,7 @@ LV2Block::make_instance(URIs& uris, parent_graph()->engine().log().error( fmt("Failed to instantiate <%1%>\n") % _lv2_plugin->uri().c_str()); - return SPtr<LilvInstance>(); + return SPtr<Instance>(); } const LV2_Options_Interface* options_iface = NULL; @@ -145,7 +145,7 @@ LV2Block::make_instance(URIs& uris, parent_graph()->engine().log().error( fmt("%1% auto-morphed to unknown type %2%\n") % port->path().c_str() % type); - return SPtr<LilvInstance>(); + return SPtr<Instance>(); } } else { parent_graph()->engine().log().error( @@ -156,7 +156,7 @@ LV2Block::make_instance(URIs& uris, } } - return SPtr<LilvInstance>(inst, lilv_instance_free); + return std::make_shared<Instance>(inst); } bool @@ -172,19 +172,19 @@ LV2Block::prepare_poly(BufferFactory& bufs, uint32_t poly) const SampleRate rate = bufs.engine().driver()->sample_rate(); assert(!_prepared_instances); - _prepared_instances = new Instances(poly, *_instances, SPtr<void>()); + _prepared_instances = bufs.maid().make_managed<Instances>( + poly, *_instances, SPtr<Instance>()); for (uint32_t i = _polyphony; i < _prepared_instances->size(); ++i) { - SPtr<LilvInstance> inst = make_instance(bufs.uris(), rate, i, true); + SPtr<Instance> inst = make_instance(bufs.uris(), rate, i, true); if (!inst) { - delete _prepared_instances; - _prepared_instances = NULL; + _prepared_instances.reset(); return false; } _prepared_instances->at(i) = inst; if (_activated) { - lilv_instance_activate(inst.get()); + lilv_instance_activate(inst->instance); } } @@ -192,19 +192,17 @@ LV2Block::prepare_poly(BufferFactory& bufs, uint32_t poly) } bool -LV2Block::apply_poly(RunContext& context, Raul::Maid& maid, uint32_t poly) +LV2Block::apply_poly(RunContext& context, uint32_t poly) { if (!_polyphonic) poly = 1; if (_prepared_instances) { - maid.dispose(_instances); - _instances = _prepared_instances; - _prepared_instances = NULL; + _instances = std::move(_prepared_instances); } assert(poly <= _instances->size()); - return BlockImpl::apply_poly(context, maid, poly); + return BlockImpl::apply_poly(context, poly); } /** Instantiate self from LV2 plugin descriptor. @@ -227,7 +225,7 @@ LV2Block::instantiate(BufferFactory& bufs, const LilvState* state) LilvNode* lv2_connectionOptional = lilv_new_uri( bufs.engine().world()->lilv_world(), LV2_CORE__connectionOptional); - _ports = new Raul::Array<PortImpl*>(num_ports, NULL); + _ports = bufs.maid().make_managed<BlockImpl::Ports>(num_ports, nullptr); bool ret = true; @@ -416,8 +414,7 @@ LV2Block::instantiate(BufferFactory& bufs, const LilvState* state) lilv_node_free(lv2_connectionOptional); if (!ret) { - delete _ports; - _ports = NULL; + _ports.reset(); return ret; } @@ -425,7 +422,8 @@ LV2Block::instantiate(BufferFactory& bufs, const LilvState* state) // Actually create plugin instances and port buffers. const SampleRate rate = bufs.engine().driver()->sample_rate(); - _instances = new Instances(_polyphony, SPtr<void>()); + _instances = bufs.maid().make_managed<Instances>( + _polyphony, SPtr<Instance>()); for (uint32_t i = 0; i < _polyphony; ++i) { _instances->at(i) = make_instance(bufs.uris(), rate, i, false); if (!_instances->at(i)) { |