add JACK backend support for MIDI option discovery
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 Oct 2013 16:59:11 +0000 (12:59 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 Oct 2013 16:59:11 +0000 (12:59 -0400)
libs/backends/jack/jack_audiobackend.cc
libs/backends/jack/jack_audiobackend.h
libs/backends/jack/jack_utils.cc
libs/backends/jack/jack_utils.h

index a9bbe4b35adb444b6b75c3dcc5e213dea831f332..397ba0e49884dd93b20605e74805b52e8f224d30 100644 (file)
@@ -490,6 +490,8 @@ JACKAudioBackend::setup_jack_startup_command ()
        options.realtime = true;
        options.ports_max = 2048;
        
+       ARDOUR::set_midi_option (options, _target_midi_option);
+
        /* this must always be true for any server instance we start ourselves
         */
 
@@ -1110,3 +1112,16 @@ JACKAudioBackend::launch_control_app ()
        args.push_back (appname);
        Glib::spawn_async ("", args, Glib::SPAWN_SEARCH_PATH);
 }
+
+vector<string>
+JACKAudioBackend::enumerate_midi_options () const
+{
+       return ARDOUR::enumerate_midi_options ();
+}
+
+int
+JACKAudioBackend::set_midi_option (const string& opt)
+{
+       _target_midi_option = opt;
+       return 0;
+}
index cb24835d5b2d674f95ccc7a85fcc6299f4c04901..139e1f3cceeacbcc4ac2e5a0ccdaafcb5e766e46 100644 (file)
@@ -149,6 +149,9 @@ class JACKAudioBackend : public AudioBackend {
     
     /* MIDI */
 
+    std::vector<std::string> enumerate_midi_options () const;
+    int set_midi_option (const std::string&);
+
     int      midi_event_get (pframes_t& timestamp, size_t& size, uint8_t** buf, void* port_buffer, uint32_t event_index);
     int      midi_event_put (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size);
     uint32_t get_midi_event_count (void* port_buffer);
@@ -237,6 +240,7 @@ class JACKAudioBackend : public AudioBackend {
     uint32_t     _target_systemic_output_latency;
     uint32_t     _current_sample_rate;
     uint32_t     _current_buffer_size;
+    std::string  _target_midi_option;
 
     typedef std::set<std::string> DeviceList;
     typedef std::map<std::string,DeviceList> DriverDeviceMap;
index 93fc3d440a75a5385d46681c40c968c3d57ee01e..0a5b3eb44d552acf6bfe052a1957303d87da52bf 100644 (file)
@@ -92,6 +92,8 @@ namespace {
        const char * const default_device_name = X_("Default");
 }
 
+static ARDOUR::MidiOptions midi_options;
+
 std::string
 get_none_string ()
 {
@@ -846,6 +848,9 @@ ARDOUR::get_jack_command_line_string (JackCommandLineOptions& options, string& c
                if (options.soft_mode) {
                        args.push_back ("-s");
                }
+       }
+
+       if (options.driver == alsa_driver_name || options.driver == coreaudio_driver_name) {
 
                if (!options.midi_driver.empty() && options.midi_driver != get_none_string ()) {
                        args.push_back ("-X");
@@ -900,3 +905,52 @@ ARDOUR::write_jack_config_file (const std::string& config_file_path, const strin
        jackdrc.close ();
        return true;
 }
+
+vector<string>
+ARDOUR::enumerate_midi_options () 
+{
+       if (midi_options.empty()) {
+#ifdef HAVE_ALSA
+               midi_options.push_back (make_pair (_("ALSA raw devices"), alsaraw_midi_driver_name));
+               midi_options.push_back (make_pair (_("ALSA sequencer"), alsaseq_midi_driver_name));
+#endif
+#ifdef HAVE_PORTAUDIO
+               /* Windows folks: what name makes sense here? Are there other
+                  choices as well ?
+               */
+               midi_options.push_back (make_pair (_("Multimedia Extension"), winmme_midi_driver_name));
+#endif
+#ifdef __APPLE__
+               midi_options.push_back (make_pair (_("CoreMIDI"), coremidi_midi_driver_name));
+#endif
+       }
+
+       vector<string> v;
+
+       v.push_back (get_none_string());
+
+       for (MidiOptions::const_iterator i = midi_options.begin(); i != midi_options.end(); ++i) {
+               v.push_back (i->first);
+       }
+
+       return v;
+}
+
+int
+ARDOUR::set_midi_option (ARDOUR::JackCommandLineOptions& options, const string& opt)
+{
+       if (opt.empty() || opt == get_none_string()) {
+               options.midi_driver = "";
+               return 0;
+       }
+
+       for (MidiOptions::const_iterator i = midi_options.begin(); i != midi_options.end(); ++i) {
+               if (i->first == opt) {
+                       options.midi_driver = i->second;
+                       return 0;
+               }
+       }
+
+       return -1;
+}
+
index a7521ad1c42b486b76c86fab7a6c85b858a00f04..5a06fe7ad7c7a5bcfb328821b4af1cb43e84065d 100644 (file)
@@ -180,6 +180,8 @@ namespace ARDOUR {
         */
        bool get_jack_default_server_path (std::string& server_path);
 
+       typedef std::vector<std::pair<std::string,std::string> > MidiOptions;
+
        /**
         * @return The name of the jack server config file
         */
@@ -228,6 +230,9 @@ namespace ARDOUR {
                std::string      midi_driver;
        };
 
+       std::vector<std::string> enumerate_midi_options ();
+       int set_midi_option (ARDOUR::JackCommandLineOptions&, const std::string& opt);
+
        /**
         * @return true if able to build a valid command line based on options
         */