X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=d9ac37e36f5c94b038def8a136da7cfaa70746d4;hb=237741d18722252abd4a6a20d3422315481ccffe;hp=46308fed984a35b664abd90e0cc2b3176783bd59;hpb=be69bf15dd2fbc414b35aa84167b863caf6d7677;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 46308fed98..d9ac37e36f 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -27,15 +27,18 @@ #include #include +#ifndef PLATFORM_WINDOWS +#include +#endif + #include #include #include #include #include -#include -#include -#include +#include +#include #include #include @@ -47,7 +50,9 @@ #include "pbd/enumwriter.h" #include "pbd/memento_command.h" #include "pbd/openuri.h" +#include "pbd/stl_delete.h" #include "pbd/file_utils.h" +#include "pbd/localtime_r.h" #include "gtkmm2ext/application.h" #include "gtkmm2ext/bindings.h" @@ -67,6 +72,7 @@ #include "ardour/filename_extensions.h" #include "ardour/filesystem_paths.h" #include "ardour/port.h" +#include "ardour/plugin_manager.h" #include "ardour/process_thread.h" #include "ardour/profile.h" #include "ardour/recent_sessions.h" @@ -75,6 +81,11 @@ #include "ardour/session_state_utils.h" #include "ardour/session_utils.h" #include "ardour/slave.h" +#include "ardour/system_exec.h" + +#ifdef WINDOWS_VST_SUPPORT +#include +#endif #include "timecode/time.h" @@ -123,7 +134,6 @@ typedef uint64_t microseconds_t; #include "video_server_dialog.h" #include "add_video_dialog.h" #include "transcode_video_dialog.h" -#include "system_exec.h" #include "i18n.h" @@ -162,6 +172,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , _was_dirty (false) , _mixer_on_top (false) , first_time_engine_run (true) + , blink_timeout_tag (-1) /* transport */ @@ -215,6 +226,10 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) ui_config = new UIConfiguration(); + ui_config->ParameterChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::parameter_changed)); + boost::function pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1)); + ui_config->map_parameters (pc); + editor = 0; mixer = 0; meterbridge = 0; @@ -289,7 +304,13 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) /* and ambiguous files */ - ARDOUR::FileSource::AmbiguousFileName.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::ambiguous_file, this, _1, _2, _3)); + ARDOUR::FileSource::AmbiguousFileName.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::ambiguous_file, this, _1, _2)); + + /* also plugin scan messages */ + ARDOUR::PluginScanMessage.connect (forever_connections, MISSING_INVALIDATOR, boost::bind(&ARDOUR_UI::plugin_scan_dialog, this, _1, _2, _3), gui_context()); + ARDOUR::PluginScanTimeout.connect (forever_connections, MISSING_INVALIDATOR, boost::bind(&ARDOUR_UI::plugin_scan_timeout, this, _1), gui_context()); + + ARDOUR::GUIIdle.connect (forever_connections, MISSING_INVALIDATOR, boost::bind(&ARDOUR_UI::gui_idle_handler, this), gui_context()); /* lets get this party started */ @@ -468,7 +489,7 @@ ARDOUR_UI::post_engine () _tooltips.enable(); - ActionManager::load_menus (); + ActionManager::load_menus (ARDOUR_COMMAND_LINE::menus_file); if (setup_windows ()) { throw failed_constructor (); @@ -495,10 +516,13 @@ ARDOUR_UI::post_engine () vector::iterator n; vector::iterator k; - for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) { - cout << "Action: " << (*n) << " bound to " << (*k) << endl; + vector::iterator p; + for (n = names.begin(), k = keys.begin(), p = paths.begin(); n != names.end(); ++n, ++k, ++p) { + cout << "Action: '" << (*n) << "' bound to '" << (*k) << "' Path: '" << (*p) << "'" << endl; } + halt_connection.disconnect (); + AudioEngine::instance()->stop (); exit (0); } @@ -538,11 +562,6 @@ ARDOUR_UI::~ARDOUR_UI () ui_config->save_state(); } - delete keyboard; - delete editor; - delete mixer; - delete meterbridge; - stop_video_server(); } @@ -718,7 +737,7 @@ int ARDOUR_UI::starting () { Application* app = Application::instance (); - char *nsm_url; + const char *nsm_url; bool brand_new_user = ArdourStartup::required (); app->ShouldQuit.connect (sigc::mem_fun (*this, &ARDOUR_UI::queue_finish)); @@ -730,9 +749,18 @@ ARDOUR_UI::starting () app->ready (); - nsm_url = getenv ("NSM_URL"); + /* we need to create this early because it may need to set the + * audio backend end up. + */ + + try { + audio_midi_setup.get (true); + } catch (...) { + std::cerr << "audio-midi engine setup failed."<< std::endl; + return -1; + } - if (nsm_url) { + if ((nsm_url = g_getenv ("NSM_URL")) != 0) { nsm = new NSM_Client; if (!nsm->init (nsm_url)) { nsm->announce (PROGRAM_NAME, ":dirty:", "ardour3"); @@ -741,20 +769,35 @@ ARDOUR_UI::starting () // wait for announce reply from nsm server for ( i = 0; i < 5000; ++i) { nsm->check (); - usleep (i); - if (nsm->is_active()) + + Glib::usleep (i); + if (nsm->is_active()) { break; + } + } + if (i == 5000) { + error << _("NSM server did not announce itself") << endmsg; + return -1; } // wait for open command from nsm server for ( i = 0; i < 5000; ++i) { nsm->check (); - usleep (1000); - if (nsm->client_id ()) + Glib::usleep (1000); + if (nsm->client_id ()) { break; + } + } + + if (i == 5000) { + error << _("NSM: no client ID provided") << endmsg; + return -1; } if (_session && nsm) { _session->set_nsm_state( nsm->is_active() ); + } else { + error << _("NSM: no session created") << endmsg; + return -1; } // nsm requires these actions disabled @@ -773,10 +816,11 @@ ARDOUR_UI::starting () } } - } - else { + } else { delete nsm; nsm = 0; + error << _("NSM: initialization failed") << endmsg; + return -1; } } else { @@ -794,21 +838,12 @@ ARDOUR_UI::starting () } } - /* we need to create this early because it may need to set the - * audio backend end up. - */ - - try { - audio_midi_setup.get (true); - } catch (...) { - return -1; - } - /* go get a session */ const bool new_session_required = (ARDOUR_COMMAND_LINE::new_session || brand_new_user); if (get_session_parameters (false, new_session_required, ARDOUR_COMMAND_LINE::load_template)) { + std::cerr << "Cannot get session parameters."<< std::endl; return -1; } } @@ -831,7 +866,7 @@ ARDOUR_UI::starting () void ARDOUR_UI::check_memory_locking () { -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(PLATFORM_WINDOWS) /* OS X doesn't support mlockall(2), and so testing for memory locking capability there is pointless */ return; #else // !__APPLE__ @@ -970,8 +1005,6 @@ If you still wish to quit, please use the\n\n\ close_all_dialogs (); - loading_message (string_compose (_("Please wait while %1 cleans up..."), PROGRAM_NAME)); - if (_session) { // _session->set_deletion_in_progress (); _session->set_clean (); @@ -982,6 +1015,9 @@ If you still wish to quit, please use the\n\n\ halt_connection.disconnect (); AudioEngine::instance()->stop (); +#ifdef WINDOWS_VST_SUPPORT + fst_stop_threading(); +#endif quit (); } @@ -1200,7 +1236,7 @@ ARDOUR_UI::update_cpu_load () should also be changed. */ - float const c = AudioEngine::instance()->get_cpu_load (); + float const c = AudioEngine::instance()->get_dsp_load (); snprintf (buf, sizeof (buf), _("DSP: %5.1f%%"), c >= 90 ? X_("red") : X_("green"), c); cpu_load_label.set_markup (buf); } @@ -1380,7 +1416,7 @@ ARDOUR_UI::redisplay_recent_sessions () get_state_files_in_directory (*i, state_file_paths); - vector* states; + vector states; vector item; string fullpath = *i; @@ -1397,8 +1433,9 @@ ARDOUR_UI::redisplay_recent_sessions () } /* now get available states for this session */ + states = Session::possible_states (fullpath); - if ((states = Session::possible_states (fullpath)) == 0) { + if (states.empty()) { /* no state file? */ continue; } @@ -1407,14 +1444,14 @@ ARDOUR_UI::redisplay_recent_sessions () Gtk::TreeModel::Row row = *(recent_session_model->append()); - row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath); row[recent_session_columns.fullpath] = fullpath; row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); if (state_file_names.size() > 1) { + // multiple session files in the session directory - show the directory name. + row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath); // add the children - for (std::vector::iterator i2 = state_file_names.begin(); i2 != state_file_names.end(); ++i2) { @@ -1425,6 +1462,9 @@ ARDOUR_UI::redisplay_recent_sessions () child_row[recent_session_columns.fullpath] = fullpath; child_row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); } + } else { + // only a single session file in the directory - show its actual name. + row[recent_session_columns.visible_name] = state_file_names.front (); } } @@ -1623,10 +1663,10 @@ ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& out catch (...) { MessageDialog msg (*editor, - string_compose (_("There are insufficient JACK ports available\n\ + string_compose (_("There are insufficient ports available\n\ to create a new track or bus.\n\ You should save %1, exit and\n\ -restart JACK with more ports."), PROGRAM_NAME)); +restart with more ports."), PROGRAM_NAME)); msg.run (); } } @@ -1684,10 +1724,10 @@ ARDOUR_UI::session_add_audio_route ( catch (...) { MessageDialog msg (*editor, - string_compose (_("There are insufficient JACK ports available\n\ + string_compose (_("There are insufficient ports available\n\ to create a new track or bus.\n\ You should save %1, exit and\n\ -restart JACK with more ports."), PROGRAM_NAME)); +restart with more ports."), PROGRAM_NAME)); pop_back_splash (msg); msg.run (); } @@ -1849,12 +1889,25 @@ ARDOUR_UI::transport_roll () bool rolling = _session->transport_rolling(); if (_session->get_play_loop()) { - /* XXX it is not possible to just leave seamless loop and keep - playing at present (nov 4th 2009) + + /* If loop playback is not a mode, then we should cancel + it when this action is requested. If it is a mode + we just leave it in place. */ - if (!Config->get_seamless_loop()) { - _session->request_play_loop (false, true); - } + + if (!Config->get_loop_is_mode()) { + /* XXX it is not possible to just leave seamless loop and keep + playing at present (nov 4th 2009) + */ + if (!Config->get_seamless_loop()) { + /* stop loop playback and stop rolling */ + _session->request_play_loop (false, true); + } else if (rolling) { + /* stop loop playback but keep rolling */ + _session->request_play_loop (false, false); + } + } + } else if (_session->get_play_range () && !Config->get_always_play_range()) { /* stop playing a range if we currently are */ _session->request_play_range (0, true); @@ -1911,7 +1964,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) /* disk buffers are normal, so we can keep playing */ affect_transport = false; } - _session->request_play_loop (false, true); + _session->request_play_loop (false, affect_transport); } else if (_session->get_play_range ()) { affect_transport = false; _session->request_play_range (0, true); @@ -1942,16 +1995,23 @@ ARDOUR_UI::toggle_session_auto_loop () if (_session->get_play_loop()) { - if (_session->transport_rolling()) { + /* looping enabled, our job is to disable it */ + + _session->request_play_loop (false); + + } else { - _session->request_locate (looploc->start(), true); - _session->request_play_loop (false); + /* looping not enabled, our job is to enable it. + loop-is-NOT-mode: this action always starts the transport rolling. + loop-IS-mode: this action simply sets the loop play mechanism, but + does not start transport. + */ + if (Config->get_loop_is_mode()) { + _session->request_play_loop (true, false); } else { - _session->request_play_loop (false); + _session->request_play_loop (true, true); } - } else { - _session->request_play_loop (true); } //show the loop markers @@ -2079,7 +2139,11 @@ ARDOUR_UI::map_transport_state () auto_loop_button.set_active (true); play_selection_button.set_active (false); - roll_button.set_active (false); + if (Config->get_loop_is_mode()) { + roll_button.set_active (true); + } else { + roll_button.set_active (false); + } } else { @@ -2101,7 +2165,11 @@ ARDOUR_UI::map_transport_state () stop_button.set_active (true); roll_button.set_active (false); play_selection_button.set_active (false); - auto_loop_button.set_active (false); + if (Config->get_loop_is_mode ()) { + auto_loop_button.set_active (_session->get_play_loop()); + } else { + auto_loop_button.set_active (false); + } update_disk_space (); } } @@ -2177,8 +2245,13 @@ ARDOUR_UI::snapshot_session (bool switch_to_it) prompter.set_name ("Prompter"); prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); - prompter.set_title (_("Take Snapshot")); - prompter.set_prompt (_("Name of new snapshot")); + if (switch_to_it) { + prompter.set_title (_("Save as...")); + prompter.set_prompt (_("New session name")); + } else { + prompter.set_title (_("Take Snapshot")); + prompter.set_prompt (_("Name of new snapshot")); + } if (!switch_to_it) { char timebuf[128]; @@ -2885,7 +2958,15 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name, _session->set_clean (); } +#ifdef WINDOWS_VST_SUPPORT + fst_stop_threading(); +#endif + flush_pending (); + +#ifdef WINDOWS_VST_SUPPORT + fst_start_threading(); +#endif retval = 0; out: @@ -3080,13 +3161,13 @@ require some unused files to continue to exist.")); space_adjusted = rep.space; } else if (rep.space < 1000000) { bprefix = _("kilo"); - space_adjusted = truncf((float)rep.space / 1000.0); + space_adjusted = floorf((float)rep.space / 1000.0); } else if (rep.space < 1000000 * 1000) { bprefix = _("mega"); - space_adjusted = truncf((float)rep.space / (1000.0 * 1000.0)); + space_adjusted = floorf((float)rep.space / (1000.0 * 1000.0)); } else { bprefix = _("giga"); - space_adjusted = truncf((float)rep.space / (1000.0 * 1000 * 1000.0)); + space_adjusted = floorf((float)rep.space / (1000.0 * 1000 * 1000.0)); } if (msg_delete) { @@ -3231,22 +3312,28 @@ ARDOUR_UI::setup_order_hint () we want the new routes to have their order keys set starting from the highest order key in the selection + 1 (if available). */ + if (add_route_dialog->get_transient_for () == mixer->get_toplevel()) { + for (RouteUISelection::iterator s = mixer->selection().routes.begin(); s != mixer->selection().routes.end(); ++s) { + if ((*s)->route()->order_key() > order_hint) { + order_hint = (*s)->route()->order_key(); + } + } - for (RouteUISelection::iterator s = mixer->selection().routes.begin(); s != mixer->selection().routes.end(); ++s) { - if ((*s)->route()->order_key() > order_hint) { - order_hint = (*s)->route()->order_key(); + if (!mixer->selection().routes.empty()) { + order_hint++; } - } - for (TrackSelection::iterator s = editor->get_selection().tracks.begin(); s != editor->get_selection().tracks.end(); ++s) { - RouteTimeAxisView* tav = dynamic_cast (*s); - if (tav->route()->order_key() > order_hint) { - order_hint = tav->route()->order_key(); + } else { + for (TrackSelection::iterator s = editor->get_selection().tracks.begin(); s != editor->get_selection().tracks.end(); ++s) { + RouteTimeAxisView* tav = dynamic_cast (*s); + if (tav && tav->route() && tav->route()->order_key() > order_hint) { + order_hint = tav->route()->order_key(); + } } - } - if (!mixer->selection().routes.empty() || !editor->get_selection().tracks.empty()) { - order_hint++; + if (!editor->get_selection().tracks.empty()) { + order_hint++; + } } _session->set_order_hint (order_hint); @@ -3282,6 +3369,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) } if (float_window) { + add_route_dialog->unset_transient_for (); add_route_dialog->set_transient_for (*float_window); } @@ -3303,12 +3391,6 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) setup_order_hint(); - PBD::ScopedConnection idle_connection; - - if (count > 8) { - ARDOUR::GUIIdle.connect (idle_connection, MISSING_INVALIDATOR, boost::bind (&Gtkmm2ext::UI::flush_pending, this), gui_context()); - } - string template_path = add_route_dialog->track_template(); if (!template_path.empty()) { @@ -3350,15 +3432,13 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template); break; } - - /* idle connection will end at scope end */ } void ARDOUR_UI::stop_video_server (bool ask_confirm) { if (!video_server_process && ask_confirm) { - warning << _("Video-Server was not launched by Ardour. The request to stop it is ignored.") << endmsg; + warning << string_compose (_("Video-Server was not launched by %1. The request to stop it is ignored."), PROGRAM_NAME) << endmsg; } if (video_server_process) { if(ask_confirm) { @@ -3424,16 +3504,24 @@ ARDOUR_UI::start_video_server (Gtk::Window* float_window, bool popup_msg) std::string icsd_docroot = video_server_dialog->get_docroot(); if (icsd_docroot.empty()) {icsd_docroot = X_("/");} - struct stat sb; - if (!lstat (icsd_docroot.c_str(), &sb) == 0 || !S_ISDIR(sb.st_mode)) { + GStatBuf sb; + if (!g_lstat (icsd_docroot.c_str(), &sb) == 0 || !S_ISDIR(sb.st_mode)) { warning << _("Specified docroot is not an existing directory.") << endmsg; continue; } - if ( (!lstat (icsd_exec.c_str(), &sb) == 0) +#ifndef PLATFORM_WINDOWS + if ( (!g_lstat (icsd_exec.c_str(), &sb) == 0) || (sb.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)) == 0 ) { warning << _("Given Video Server is not an executable file.") << endmsg; continue; } +#else + if ( (!g_lstat (icsd_exec.c_str(), &sb) == 0) + || (sb.st_mode & (S_IXUSR)) == 0 ) { + warning << _("Given Video Server is not an executable file.") << endmsg; + continue; + } +#endif char **argp; argp=(char**) calloc(9,sizeof(char*)); @@ -3462,14 +3550,15 @@ ARDOUR_UI::start_video_server (Gtk::Window* float_window, bool popup_msg) delete video_server_process; } - video_server_process = new SystemExec(icsd_exec, argp); + video_server_process = new ARDOUR::SystemExec(icsd_exec, argp); if (video_server_process->start()) { warning << _("Cannot launch the video-server") << endmsg; continue; } int timeout = 120; // 6 sec while (!ARDOUR_UI::instance()->video_timeline->check_server()) { - usleep (50000); + Glib::usleep (50000); + gui_idle_handler(); if (--timeout <= 0 || !video_server_process->is_running()) break; } if (timeout <= 0) { @@ -3540,7 +3629,8 @@ ARDOUR_UI::add_video (Gtk::Window* float_window) if (!transcode_video_dialog->get_audiofile().empty()) { editor->embed_audio_from_video( transcode_video_dialog->get_audiofile(), - video_timeline->get_offset() + video_timeline->get_offset(), + (transcode_video_dialog->import_option() != VTL_IMPORT_NO_VIDEO) ); } switch (transcode_video_dialog->import_option()) { @@ -3734,6 +3824,116 @@ quickly enough to keep up with recording.\n"), PROGRAM_NAME)); } } + +/* TODO: this is getting elaborate enough to warrant being split into a dedicated class */ +static MessageDialog *scan_dlg = NULL; +static ProgressBar *scan_pbar = NULL; +static HBox *scan_tbox = NULL; + +void +ARDOUR_UI::cancel_plugin_scan () +{ + PluginManager::instance().cancel_plugin_scan(); +} + +void +ARDOUR_UI::cancel_plugin_timeout () +{ + PluginManager::instance().cancel_plugin_timeout(); + scan_tbox->hide(); +} + +void +ARDOUR_UI::plugin_scan_timeout (int timeout) +{ + if (!scan_dlg || !scan_dlg->is_mapped() || !scan_pbar) { + return; + } + if (timeout > 0) { + scan_pbar->set_fraction ((float) timeout / (float) Config->get_vst_scan_timeout()); + scan_tbox->show(); + } else { + scan_tbox->hide(); + } + gui_idle_handler(); +} + +void +ARDOUR_UI::plugin_scan_dialog (std::string type, std::string plugin, bool can_cancel) +{ + if (type == X_("closeme") && !(scan_dlg && scan_dlg->is_mapped())) { + return; + } + + const bool cancelled = PluginManager::instance().cancelled(); + if (type != X_("closeme") && !Config->get_show_plugin_scan_window()) { + if (cancelled && scan_dlg->is_mapped()) { + scan_dlg->hide(); + gui_idle_handler(); + return; + } + if (cancelled || !can_cancel) { + return; + } + } + + static Gtk::Button *cancel_button; + static Gtk::Button *timeout_button; + if (!scan_dlg) { + scan_dlg = new MessageDialog("", false, MESSAGE_INFO, BUTTONS_NONE); // TODO manage + VBox* vbox = scan_dlg->get_vbox(); + vbox->set_size_request(400,-1); + scan_dlg->set_title (_("Scanning for plugins")); + + cancel_button = manage(new Gtk::Button(_("Cancel plugin scan"))); + cancel_button->set_name ("EditorGTKButton"); + cancel_button->signal_clicked().connect ( mem_fun (*this, &ARDOUR_UI::cancel_plugin_scan) ); + cancel_button->show(); + + scan_dlg->get_vbox()->pack_start ( *cancel_button, PACK_SHRINK); + + scan_tbox = manage( new HBox() ); + + timeout_button = manage(new Gtk::Button(_("Stop Timeout"))); + timeout_button->set_name ("EditorGTKButton"); + timeout_button->signal_clicked().connect ( mem_fun (*this, &ARDOUR_UI::cancel_plugin_timeout) ); + timeout_button->show(); + + scan_pbar = manage(new ProgressBar()); + scan_pbar->set_orientation(Gtk::PROGRESS_RIGHT_TO_LEFT); + scan_pbar->set_text(_("Scan Timeout")); + scan_pbar->show(); + + scan_tbox->pack_start (*scan_pbar, PACK_EXPAND_WIDGET, 4); + scan_tbox->pack_start (*timeout_button, PACK_SHRINK, 4); + + scan_dlg->get_vbox()->pack_start (*scan_tbox, PACK_SHRINK, 4); + } + + if (type == X_("closeme")) { + scan_dlg->hide(); + } else { + scan_dlg->set_message(type + ": " + Glib::path_get_basename(plugin)); + scan_dlg->show(); + } + if (!can_cancel || !cancelled) { + scan_tbox->hide(); + } + cancel_button->set_sensitive(can_cancel && !cancelled); + + gui_idle_handler(); +} + +void +ARDOUR_UI::gui_idle_handler () +{ + int timeout = 30; + /* due to idle calls, gtk_events_pending() may always return true */ + while (gtk_events_pending() && --timeout) { + gtk_main_iteration (); + } +} + void ARDOUR_UI::disk_underrun_handler () { @@ -4066,10 +4266,14 @@ ARDOUR_UI::setup_profile () Profile->set_small_screen (); } - if (getenv ("ARDOUR_SAE")) { + if (g_getenv ("ARDOUR_SAE")) { Profile->set_sae (); Profile->set_single_package (); } + + if (g_getenv ("TRX")) { + Profile->set_trx (); + } } int @@ -4096,7 +4300,7 @@ ARDOUR_UI::missing_file (Session*s, std::string str, DataType type) } int -ARDOUR_UI::ambiguous_file (std::string file, std::string /*path*/, std::vector hits) +ARDOUR_UI::ambiguous_file (std::string file, std::vector hits) { AmbiguousFileDialog dialog (file, hits);