configurable midi audition synth
authorRobin Gareus <robin@gareus.org>
Wed, 22 Jan 2014 22:59:24 +0000 (23:59 +0100)
committerRobin Gareus <robin@gareus.org>
Wed, 22 Jan 2014 22:59:24 +0000 (23:59 +0100)
gtk2_ardour/rc_option_editor.cc
libs/ardour/ardour/auditioner.h
libs/ardour/ardour/rc_configuration_vars.h
libs/ardour/auditioner.cc

index 4085ffa934d5888969dabd14edb7d432c2514fce..fc6978275772219a44170f25def153a96cf6733c 100644 (file)
@@ -35,6 +35,7 @@
 #include "ardour/dB.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/control_protocol_manager.h"
+#include "ardour/plugin_manager.h"
 #include "control_protocol/control_protocol.h"
 
 #include "ardour_window.h"
@@ -1816,6 +1817,31 @@ RCOptionEditor::RCOptionEditor ()
                     sigc::mem_fun (*_rc_config, &RCConfiguration::set_sound_midi_notes)
                     ));
 
+       add_option (_("MIDI"), new OptionEditorHeading (_("Midi Audition")));
+
+       ComboOption<std::string>* audition_synth = new ComboOption<std::string> (
+               "midi-audition-synth-uri",
+               _("Midi Audition Synth (LV2)"),
+               sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_audition_synth_uri),
+               sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_audition_synth_uri)
+               );
+
+       audition_synth->add(X_(""), _("None"));
+       PluginInfoList all_plugs;
+       PluginManager& manager (PluginManager::instance());
+#ifdef LV2_SUPPORT
+       all_plugs.insert (all_plugs.end(), manager.lv2_plugin_info().begin(), manager.lv2_plugin_info().end());
+
+       for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
+               if (manager.get_status (*i) == PluginManager::Hidden) continue;
+               if (!(*i)->is_instrument()) continue;
+               if ((*i)->type != ARDOUR::LV2) continue;
+               audition_synth->add((*i)->unique_id, (*i)->name);
+       }
+#endif
+
+       add_option (_("MIDI"), audition_synth);
+
        /* USER INTERACTION */
 
        if (getenv ("ARDOUR_BUNDLED")) {
index fdebc8a93143bca24f4da03cb6ea334414dc2c9c..e73824b6693d2d1cc1b879ea8bc30eba4842e8a7 100644 (file)
@@ -123,6 +123,7 @@ class Auditioner : public Track
        bool via_monitor;
        bool _midi_audition;
        bool _synth_added;
+       bool _synth_changed;
        bool _queue_panic;
 
        boost::shared_ptr<Diskstream> _diskstream_audio;
@@ -130,6 +131,8 @@ class Auditioner : public Track
        boost::shared_ptr<Processor> asynth;
 
        void drop_ports ();
+       void lookup_synth ();
+       void config_changed (std::string);
        static void *_drop_ports (void *);
        void actually_drop_ports ();
        void output_changed (IOChange, void*);
index 431ef84a596141e7cea74a0bfe44d8ad3c8ae24b..3c74f067aea9d6173004486b2dd05be7a76f8012 100644 (file)
@@ -114,7 +114,7 @@ CONFIG_VARIABLE (std::string, monitor_bus_preferred_bundle, "monitor-bus-preferr
 CONFIG_VARIABLE (bool, quieten_at_speed, "quieten-at-speed", true)
 
 CONFIG_VARIABLE (bool, link_send_and_route_panner, "link-send-and-route-panner", true)
-CONFIG_VARIABLE (std::string, midi_audition_synth_uri, "midi-audition-synth-uri,", "https://community.ardour.org/node/7596")
+CONFIG_VARIABLE (std::string, midi_audition_synth_uri, "midi-audition-synth-uri", "https://community.ardour.org/node/7596")
 
 /* click */
 
index fd640f8e3ecd7df79296653ab719d3827daeba68..3e382625a0229a54b452bb070473fbadd02acef2 100644 (file)
@@ -51,6 +51,7 @@ Auditioner::Auditioner (Session& s)
        , via_monitor (false)
        , _midi_audition (false)
        , _synth_added (false)
+       , _synth_changed (false)
        , _queue_panic (false)
 {
 }
@@ -68,6 +69,21 @@ Auditioner::init ()
 
        _output->add_port ("Midiaudition", this, DataType::MIDI);
 
+       lookup_synth();
+
+       _output->changed.connect_same_thread (*this, boost::bind (&Auditioner::output_changed, this, _1, _2));
+       Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Auditioner::config_changed, this, _1));
+
+       return 0;
+}
+
+Auditioner::~Auditioner ()
+{
+}
+
+void
+Auditioner::lookup_synth ()
+{
        string plugin_id = Config->get_midi_audition_synth_uri();
        boost::shared_ptr<Plugin> p;
        if (!plugin_id.empty()) {
@@ -84,14 +100,14 @@ Auditioner::init ()
        if (p) {
                asynth = boost::shared_ptr<Processor> (new PluginInsert (_session, p));
        }
-
-       _output->changed.connect_same_thread (*this, boost::bind (&Auditioner::output_changed, this, _1, _2));
-
-       return 0;
 }
 
-Auditioner::~Auditioner ()
+void
+Auditioner::config_changed (std::string p)
 {
+       if (p == "midi-audition-synth-uri") {
+               _synth_changed = true;
+       }
 }
 
 int
@@ -393,6 +409,16 @@ Auditioner::audition_region (boost::shared_ptr<Region> region)
 
                ProcessorStreams ps;
 
+               if (_synth_changed && _synth_added) {
+                       remove_processor(asynth);
+                       _synth_added = false;
+               }
+               if (_synth_changed && !_synth_added) {
+                       _synth_added = false;
+                       lookup_synth();
+               }
+
+
                if (!_synth_added && asynth) {
                        int rv = add_processor_by_index(asynth, PreFader, &ps, true);
                        if (rv) {