diff options
author | David Robillard <d@drobilla.net> | 2011-10-21 04:51:04 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2011-10-21 04:51:04 +0000 |
commit | 96dcffcb222bc920cef9bfbaffb0548138352d65 (patch) | |
tree | ef1ee41a55af73d4197910a5788b299d529d7479 /libs/ardour/lv2_plugin_lilv.cc | |
parent | 454f14d9c58de541a230c266ad59987b8ca7b1a4 (diff) |
More robust plugin I/O mapping.
This does not change the actual mapping logic, but makes the application of
the mapping much more robust. If there is no valid mapping for a given port,
that port is connected to silence (instead of crashing messily and/or via a
failed assertion).
Also tolerate mappings that nonsensically map to a buffer that is not present
(this particularly happens for MIDI ports in some cases) as a temporary fix.
The mapping logic needs work and/or our concept of just how much MIDI we support
in a route needs simplification...
git-svn-id: svn://localhost/ardour2/branches/3.0@10262 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/lv2_plugin_lilv.cc')
-rw-r--r-- | libs/ardour/lv2_plugin_lilv.cc | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/libs/ardour/lv2_plugin_lilv.cc b/libs/ardour/lv2_plugin_lilv.cc index a1f42e6407..25020e541a 100644 --- a/libs/ardour/lv2_plugin_lilv.cc +++ b/libs/ardour/lv2_plugin_lilv.cc @@ -908,31 +908,54 @@ LV2Plugin::connect_and_run(BufferSet& bufs, cycles_t then = get_cycles(); + ChanCount bufs_count; + bufs_count.set(DataType::AUDIO, 1); + bufs_count.set(DataType::MIDI, 1); + BufferSet& silent_bufs = _session.get_silent_buffers(bufs_count); + BufferSet& scratch_bufs = _session.get_silent_buffers(bufs_count); + uint32_t audio_in_index = 0; uint32_t audio_out_index = 0; uint32_t midi_in_index = 0; uint32_t midi_out_index = 0; + bool valid; for (uint32_t port_index = 0; port_index < parameter_count(); ++port_index) { if (parameter_is_audio(port_index)) { if (parameter_is_input(port_index)) { - const uint32_t buf_index = in_map.get(DataType::AUDIO, audio_in_index++); + const uint32_t buf_index = in_map.get(DataType::AUDIO, audio_in_index++, &valid); lilv_instance_connect_port(_impl->instance, port_index, - bufs.get_audio(buf_index).data(offset)); + valid ? bufs.get_audio(buf_index).data(offset) + : silent_bufs.get_audio(0).data(offset)); } else if (parameter_is_output(port_index)) { - const uint32_t buf_index = out_map.get(DataType::AUDIO, audio_out_index++); + const uint32_t buf_index = out_map.get(DataType::AUDIO, audio_out_index++, &valid); //cerr << port_index << " : " << " AUDIO OUT " << buf_index << endl; lilv_instance_connect_port(_impl->instance, port_index, - bufs.get_audio(buf_index).data(offset)); + valid ? bufs.get_audio(buf_index).data(offset) + : scratch_bufs.get_audio(0).data(offset)); } } else if (parameter_is_midi(port_index)) { + /* FIXME: The checks here for bufs.count().n_midi() > buf_index shouldn't + be necessary, but the mapping is illegal in some cases. Ideally + that should be fixed, but this is easier... + */ if (parameter_is_input(port_index)) { - const uint32_t buf_index = in_map.get(DataType::MIDI, midi_in_index++); - lilv_instance_connect_port(_impl->instance, port_index, - bufs.get_lv2_midi(true, buf_index).data()); + const uint32_t buf_index = in_map.get(DataType::MIDI, midi_in_index++, &valid); + if (valid && bufs.count().n_midi() > buf_index) { + lilv_instance_connect_port(_impl->instance, port_index, + bufs.get_lv2_midi(true, buf_index).data()); + } else { + lilv_instance_connect_port(_impl->instance, port_index, + silent_bufs.get_lv2_midi(true, 0).data()); + } } else if (parameter_is_output(port_index)) { - const uint32_t buf_index = out_map.get(DataType::MIDI, midi_out_index++); - lilv_instance_connect_port(_impl->instance, port_index, - bufs.get_lv2_midi(false, buf_index).data()); + const uint32_t buf_index = out_map.get(DataType::MIDI, midi_out_index++, &valid); + if (valid && bufs.count().n_midi() > buf_index) { + lilv_instance_connect_port(_impl->instance, port_index, + bufs.get_lv2_midi(false, buf_index).data()); + } else { + lilv_instance_connect_port(_impl->instance, port_index, + scratch_bufs.get_lv2_midi(true, 0).data()); + } } } else if (!parameter_is_control(port_index)) { // Optional port (it'd better be if we've made it this far...) @@ -945,8 +968,10 @@ LV2Plugin::connect_and_run(BufferSet& bufs, midi_out_index = 0; for (uint32_t port_index = 0; port_index < parameter_count(); ++port_index) { if (parameter_is_midi(port_index) && parameter_is_output(port_index)) { - const uint32_t buf_index = out_map.get(DataType::MIDI, midi_out_index++); - bufs.flush_lv2_midi(true, buf_index); + const uint32_t buf_index = out_map.get(DataType::MIDI, midi_out_index++, &valid); + if (valid) { + bufs.flush_lv2_midi(true, buf_index); + } } } |