diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-10-10 12:59:11 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-10-10 12:59:11 -0400 |
commit | 1bd04f8bf3fa6dc1e18a39e805781fe7acd1940e (patch) | |
tree | cef170ad94068e547d973dfdfbb830511955096b /libs/backends/jack | |
parent | 2308291e59f93bcf406aa78f70f22215459d0f20 (diff) |
add JACK backend support for MIDI option discovery
Diffstat (limited to 'libs/backends/jack')
-rw-r--r-- | libs/backends/jack/jack_audiobackend.cc | 15 | ||||
-rw-r--r-- | libs/backends/jack/jack_audiobackend.h | 4 | ||||
-rw-r--r-- | libs/backends/jack/jack_utils.cc | 54 | ||||
-rw-r--r-- | libs/backends/jack/jack_utils.h | 5 |
4 files changed, 78 insertions, 0 deletions
diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc index a9bbe4b35a..397ba0e498 100644 --- a/libs/backends/jack/jack_audiobackend.cc +++ b/libs/backends/jack/jack_audiobackend.cc @@ -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; +} diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h index cb24835d5b..139e1f3cce 100644 --- a/libs/backends/jack/jack_audiobackend.h +++ b/libs/backends/jack/jack_audiobackend.h @@ -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; diff --git a/libs/backends/jack/jack_utils.cc b/libs/backends/jack/jack_utils.cc index 93fc3d440a..0a5b3eb44d 100644 --- a/libs/backends/jack/jack_utils.cc +++ b/libs/backends/jack/jack_utils.cc @@ -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; +} + diff --git a/libs/backends/jack/jack_utils.h b/libs/backends/jack/jack_utils.h index a7521ad1c4..5a06fe7ad7 100644 --- a/libs/backends/jack/jack_utils.h +++ b/libs/backends/jack/jack_utils.h @@ -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 */ |