From 68bfed0a461635e3f5c05651f755dca6e22df5d9 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 20 Feb 2008 23:24:51 +0000 Subject: [PATCH] Some work towards MIDI plugins (LV2 plugins with (MIDI supporting) event ports shown in plugin selector). git-svn-id: svn://localhost/ardour2/branches/3.0@3092 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/midi_region_view.cc | 2 +- gtk2_ardour/plugin_selector.cc | 26 +++++++++++++++++--------- gtk2_ardour/plugin_selector.h | 12 ++++++++---- libs/ardour/ardour/lv2_plugin.h | 12 +++++++----- libs/ardour/lv2_plugin.cc | 27 +++++++++++++++++++++++++++ 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index a8692af77a..df72841aff 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -362,7 +362,7 @@ MidiRegionView::create_note_at(double x, double y, double dur) //double dur = m.frames_per_bar(t, trackview.session().frame_rate()) / m.beats_per_bar(); // Add a 1 beat long note (for now) - const boost::shared_ptr new_note(new Note(stamp, dur, (uint8_t)note, 0x40)); + const boost::shared_ptr new_note(new Note(0, stamp, dur, (uint8_t)note, 0x40)); view->update_bounds(new_note->note()); diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index d893bc5695..c76c5dcf78 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -71,8 +71,10 @@ PluginSelector::PluginSelector (PluginManager *mgr) plugin_display.append_column (_("Type"), plugin_columns.type_name); plugin_display.append_column (_("Category"), plugin_columns.category); plugin_display.append_column (_("Creator"), plugin_columns.creator); - plugin_display.append_column (_("# Inputs"),plugin_columns.ins); - plugin_display.append_column (_("# Outputs"), plugin_columns.outs); + plugin_display.append_column (_("# Audio In"),plugin_columns.audio_ins); + plugin_display.append_column (_("# Audio Out"), plugin_columns.audio_outs); + plugin_display.append_column (_("# MIDI In"),plugin_columns.midi_ins); + plugin_display.append_column (_("# MIDI Out"), plugin_columns.midi_outs); plugin_display.set_headers_visible (true); plugin_display.set_headers_clickable (true); plugin_display.set_reorderable (false); @@ -86,7 +88,7 @@ PluginSelector::PluginSelector (PluginManager *mgr) added_list.set_headers_visible (true); added_list.set_reorderable (false); - for (int i = 0; i <=3; i++) { + for (int i = 0; i <=7; i++) { Gtk::TreeView::Column* column = plugin_display.get_column(i); column->set_sort_column(i); } @@ -258,16 +260,22 @@ PluginSelector::refiller (const PluginInfoList& plugs, const::std::string& filte newrow[plugin_columns.creator] = creator; if ((*i)->n_inputs.n_total() < 0) { - newrow[plugin_columns.ins] = "various"; + newrow[plugin_columns.audio_ins] = "various"; + newrow[plugin_columns.midi_ins] = "various"; } else { - snprintf (buf, sizeof(buf), "%d", (*i)->n_inputs.n_total()); - newrow[plugin_columns.ins] = buf; + snprintf (buf, sizeof(buf), "%d", (*i)->n_inputs.n_audio()); + newrow[plugin_columns.audio_ins] = buf; + snprintf (buf, sizeof(buf), "%d", (*i)->n_inputs.n_midi()); + newrow[plugin_columns.midi_ins] = buf; } if ((*i)->n_outputs.n_total() < 0) { - newrow[plugin_columns.outs] = "various"; + newrow[plugin_columns.audio_outs] = "various"; + newrow[plugin_columns.midi_outs] = "various"; } else { - snprintf (buf, sizeof(buf), "%d", (*i)->n_outputs.n_total()); - newrow[plugin_columns.outs] = buf; + snprintf (buf, sizeof(buf), "%d", (*i)->n_outputs.n_audio()); + newrow[plugin_columns.audio_outs] = buf; + snprintf (buf, sizeof(buf), "%d", (*i)->n_outputs.n_midi()); + newrow[plugin_columns.midi_outs] = buf; } newrow[plugin_columns.plugin] = *i; diff --git a/gtk2_ardour/plugin_selector.h b/gtk2_ardour/plugin_selector.h index ea258d3be0..e8e8927829 100644 --- a/gtk2_ardour/plugin_selector.h +++ b/gtk2_ardour/plugin_selector.h @@ -61,16 +61,20 @@ class PluginSelector : public ArdourDialog add (type_name); add (category); add (creator); - add (ins); - add (outs); + add (audio_ins); + add (audio_outs); + add (midi_ins); + add (midi_outs); add (plugin); } Gtk::TreeModelColumn name; Gtk::TreeModelColumn type_name; Gtk::TreeModelColumn category; Gtk::TreeModelColumn creator; - Gtk::TreeModelColumn ins; - Gtk::TreeModelColumn outs; + Gtk::TreeModelColumn audio_ins; + Gtk::TreeModelColumn audio_outs; + Gtk::TreeModelColumn midi_ins; + Gtk::TreeModelColumn midi_outs; Gtk::TreeModelColumn plugin; }; PluginColumns plugin_columns; diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index 777f285e9d..d20ece65bd 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -95,6 +95,7 @@ class LV2Plugin : public ARDOUR::Plugin bool parameter_is_audio(uint32_t) const; bool parameter_is_control(uint32_t) const; + bool parameter_is_midi(uint32_t) const; bool parameter_is_input(uint32_t) const; bool parameter_is_output(uint32_t) const; bool parameter_is_toggled(uint32_t) const; @@ -138,11 +139,12 @@ struct LV2World { ~LV2World(); SLV2World world; - SLV2Value input_class; - SLV2Value output_class; - SLV2Value audio_class; - SLV2Value control_class; - SLV2Value event_class; + SLV2Value input_class; ///< Input port + SLV2Value output_class; ///< Output port + SLV2Value audio_class; ///< Audio port + SLV2Value control_class; ///< Control port + SLV2Value event_class; ///< Event port + SLV2Value midi_class; ///< MIDI event SLV2Value in_place_broken; SLV2Value integer; SLV2Value toggled; diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index e58e5ed140..4553458831 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -389,6 +389,23 @@ LV2Plugin::connect_and_run (BufferSet& bufs, uint32_t& in_index, uint32_t& out_i bufs.get_audio(index).data(nframes, offset)); out_index++; } + } else if (parameter_is_midi(port_index)) { + // FIXME: Switch MIDI buffer format to LV2 event buffer + if (parameter_is_input(port_index)) { + //const size_t index = min(in_index, nbufs - 1); + //slv2_instance_connect_port(_instance, port_index, + // bufs.get_midi(index).data(nframes, offset)); + // FIXME: hope it's connection optional... + slv2_instance_connect_port(_instance, port_index, NULL); + in_index++; + } else if (parameter_is_output(port_index)) { + //const size_t index = min(out_index,nbufs - 1); + //slv2_instance_connect_port(_instance, port_index, + // bufs.get_midi(index).data(nframes, offset)); + // FIXME: hope it's connection optional... + slv2_instance_connect_port(_instance, port_index, NULL); + out_index++; + } } port_index++; } @@ -414,6 +431,14 @@ LV2Plugin::parameter_is_audio (uint32_t param) const return slv2_port_is_a(_plugin, port, _world.audio_class); } +bool +LV2Plugin::parameter_is_midi (uint32_t param) const +{ + SLV2Port port = slv2_plugin_get_port_by_index(_plugin, param); + return slv2_port_is_a(_plugin, port, _world.event_class) + && slv2_port_supports_event(_plugin, port, _world.midi_class); +} + bool LV2Plugin::parameter_is_output (uint32_t param) const { @@ -505,6 +530,7 @@ LV2World::LV2World() control_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_CONTROL); audio_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_AUDIO); event_class = slv2_value_new_uri(world, SLV2_PORT_CLASS_EVENT); + midi_class = slv2_value_new_uri(world, SLV2_EVENT_CLASS_MIDI); in_place_broken = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "inPlaceBroken"); integer = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "integer"); toggled = slv2_value_new_uri(world, SLV2_NAMESPACE_LV2 "toggled"); @@ -518,6 +544,7 @@ LV2World::~LV2World() slv2_value_free(control_class); slv2_value_free(audio_class); slv2_value_free(event_class); + slv2_value_free(midi_class); slv2_value_free(in_place_broken); } -- 2.30.2