X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fengine_dialog.cc;h=9c0a39c5547a27cc8de3fdf984434768542a58bc;hb=e57c4d4c43c0d302c0b06128e0ba10c4683ee8fe;hp=9835901a248d49d5cc740b2ffd87055a29e5d9d7;hpb=9f63ab9931e6478472853bdda58da47ea29ac125;p=ardour.git diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 9835901a24..9c0a39c554 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -5,7 +5,7 @@ #include #include -#include +#include "pbd/xml++.h" #ifdef __APPLE__ #include @@ -16,15 +16,15 @@ #include #endif -#include +#include "ardour/profile.h" #include #include #include -#include -#include -#include +#include "pbd/convert.h" +#include "pbd/error.h" +#include "pbd/pathscanner.h" #ifdef __APPLE #include @@ -218,6 +218,8 @@ EngineControl::EngineControl () realtime_button.signal_toggled().connect (mem_fun (*this, &EngineControl::realtime_changed)); realtime_changed (); +#if PROVIDE_TOO_MANY_OPTIONS + #ifndef __APPLE__ label = manage (new Label (_("Realtime Priority"))); label->set_alignment (1.0, 0.5); @@ -262,6 +264,7 @@ EngineControl::EngineControl () options_packer.attach (*label, 0, 1, row, row + 1, FILL|EXPAND, (AttachOptions) 0); ++row; +#endif /* PROVIDE_TOO_MANY_OPTIONS */ label = manage (new Label (_("Number of ports"))); label->set_alignment (1.0, 0.5); options_packer.attach (ports_spinner, 1, 2, row, row + 1, FILL|EXPAND, AttachOptions(0)); @@ -375,10 +378,12 @@ EngineControl::build_command_line (vector& cmd) if (str != _("Ignore")) { double secs = 0; uint32_t msecs; - atof (str); + secs = atof (str); msecs = (uint32_t) floor (secs * 1000.0); - cmd.push_back ("-t"); - cmd.push_back (to_string (msecs, std::dec)); + if (msecs > 0) { + cmd.push_back ("-t"); + cmd.push_back (to_string (msecs, std::dec)); + } } if (no_memory_lock_button.get_active()) { @@ -452,11 +457,19 @@ EngineControl::build_command_line (vector& cmd) } else if (str == _("Playback/Recording on 2 Devices")) { + string input_device = get_device_name (driver, input_device_combo.get_active_text()); + string output_device = get_device_name (driver, output_device_combo.get_active_text()); + + if (input_device.empty() || output_device.empty()) { + cmd.clear (); + return; + } + cmd.push_back ("-C"); - cmd.push_back (get_device_name (driver, input_device_combo.get_active_text())); + cmd.push_back (input_device); cmd.push_back ("-P"); - cmd.push_back (get_device_name (driver, output_device_combo.get_active_text())); - + cmd.push_back (output_device); + } else if (str == _("Playback only")) { cmd.push_back ("-P"); } else if (str == _("Recording only")) { @@ -478,8 +491,15 @@ EngineControl::build_command_line (vector& cmd) if (using_alsa) { if (audio_mode_combo.get_active_text() != _("Playback/Recording on 2 Devices")) { + + string device = get_device_name (driver, interface_combo.get_active_text()); + if (device.empty()) { + cmd.clear (); + return; + } + cmd.push_back ("-d"); - cmd.push_back (get_device_name (driver, interface_combo.get_active_text())); + cmd.push_back (device); } if (hw_meter_button.get_active()) { @@ -513,8 +533,15 @@ EngineControl::build_command_line (vector& cmd) #ifdef __APPLE__ // note: older versions of the CoreAudio JACK backend use -n instead of -d here + + string device = get_device_name (driver, interface_combo.get_active_text()); + if (device.empty()) { + cmd.clear (); + return; + } + cmd.push_back ("-d"); - cmd.push_back (get_device_name (driver, interface_combo.get_active_text())); + cmd.push_back (device); #endif } else if (using_oss) { @@ -544,6 +571,10 @@ EngineControl::setup_engine () std::string cwd = "/tmp"; build_command_line (args); + + if (args.empty()) { + return 1; // try again + } Glib::ustring jackdrc_path = Glib::get_home_dir(); jackdrc_path += "/.jackdrc"; @@ -553,10 +584,12 @@ EngineControl::setup_engine () error << string_compose (_("cannot open JACK rc file %1 to store parameters"), jackdrc_path) << endmsg; return -1; } - + cerr << "JACK COMMAND: "; for (vector::iterator i = args.begin(); i != args.end(); ++i) { + cerr << (*i) << ' '; jackdrc << (*i) << ' '; } + cerr << endl; jackdrc << endl; jackdrc.close (); @@ -819,7 +852,7 @@ EngineControl::driver_changed () vector& strings = devices[driver]; - if (strings.empty() && driver != "FFADO") { + if (strings.empty() && driver != "FFADO" && driver != "Dummy") { error << string_compose (_("No devices found for driver \"%1\""), driver) << endmsg; return; } @@ -839,7 +872,7 @@ EngineControl::driver_changed () interface_combo.set_active_text (strings.front()); input_device_combo.set_active_text (strings.front()); output_device_combo.set_active_text (strings.front()); - } + } if (driver == "ALSA") { soft_mode_button.set_sensitive (true); @@ -897,7 +930,7 @@ EngineControl::audio_mode_changed () } } -static bool jack_server_filter(const string& str, void *arg) +static bool jack_server_filter(const string& str, void */*arg*/) { return str == "jackd" || str == "jackdmp"; } @@ -915,7 +948,7 @@ EngineControl::find_jack_servers (vector& strings) _NSGetExecutablePath (execpath, &pathsz); - Glib::ustring path (Glib::path_get_dirname (execpath)); + string path (Glib::path_get_dirname (execpath)); path += "/jackd"; if (Glib::file_test (path, FILE_TEST_EXISTS)) { @@ -937,8 +970,36 @@ EngineControl::find_jack_servers (vector& strings) PathScanner scanner; vector *jack_servers; std::map un; - - path = getenv ("PATH"); + char *p; + bool need_minimal_path = false; + + p = getenv ("PATH"); + + if (p && *p) { + path = p; + } else { + need_minimal_path = true; + } + +#ifdef __APPLE__ + // many mac users don't have PATH set up to include + // likely installed locations of JACK + need_minimal_path = true; +#endif + + if (need_minimal_path) { + if (path.empty()) { + path = "/usr/bin:/bin:/usr/local/bin:/opt/local/bin"; + } else { + path += ":/usr/local/bin:/opt/local/bin"; + } + } + +#ifdef __APPLE__ + // push it back into the environment so that auto-started JACK can find it. + // XXX why can't we just expect OS X users to have PATH set correctly? we can't ... + setenv ("PATH", path.c_str(), 1); +#endif jack_servers = scanner (path, jack_server_filter, 0, false, true); @@ -960,6 +1021,15 @@ EngineControl::get_device_name (const string& driver, const string& human_readab vector::iterator n; vector::iterator i; + if (human_readable.empty()) { + /* this can happen if the user's .ardourrc file has a device name from + another computer system in it + */ + MessageDialog msg (_("You need to choose an audio device first.")); + msg.run (); + return string(); + } + if (backend_devs.empty()) { return human_readable; } @@ -971,12 +1041,9 @@ EngineControl::get_device_name (const string& driver, const string& human_readab } if (i == devices[driver].end()) { - fatal << string_compose (_("programming error: %1"), "true hardware name for ID missing") << endmsg; - /*NOTREACHED*/ + warning << string_compose (_("Audio device \"%1\" not known on this computer."), human_readable) << endmsg; } - /* keep gcc happy */ - return string(); }