X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=e51edbb6318c5ce336477216a6448d773aabc67b;hb=f6f3769ae11e3a9e888abdf8c3ed92f08d3c9a5b;hp=271cbab85b69d82ea73af6dc47ea9a5b36bc9304;hpb=80c3677c837cc9eb432df3d65a34aba543fa7258;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 271cbab85b..e51edbb631 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -36,7 +37,6 @@ #include #include -#include #include #include #include @@ -73,6 +73,8 @@ #include #include +typedef uint64_t microseconds_t; + #include "actions.h" #include "ardour_ui.h" #include "public_editor.h" @@ -89,6 +91,9 @@ #include "gui_thread.h" #include "theme_manager.h" #include "bundle_manager.h" +#include "session_metadata_dialog.h" +#include "gain_meter.h" +#include "route_time_axis.h" #include "i18n.h" @@ -115,10 +120,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) preroll_clock (X_("preroll"), false, X_("PreRollClock"), true, true), postroll_clock (X_("postroll"), false, X_("PostRollClock"), true, true), - /* adjuster table */ - - adjuster_table (3, 3), - /* preroll stuff */ preroll_button (_("pre\nroll")), @@ -130,14 +131,14 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) /* transport */ - roll_controllable ("transport roll", *this, TransportControllable::Roll), - stop_controllable ("transport stop", *this, TransportControllable::Stop), - goto_start_controllable ("transport goto start", *this, TransportControllable::GotoStart), - goto_end_controllable ("transport goto end", *this, TransportControllable::GotoEnd), - auto_loop_controllable ("transport auto loop", *this, TransportControllable::AutoLoop), - play_selection_controllable ("transport play selection", *this, TransportControllable::PlaySelection), - rec_controllable ("transport rec-enable", *this, TransportControllable::RecordEnable), - shuttle_controllable ("shuttle", *this, TransportControllable::ShuttleControl), + roll_controllable (new TransportControllable ("transport roll", *this, TransportControllable::Roll)), + stop_controllable (new TransportControllable ("transport stop", *this, TransportControllable::Stop)), + goto_start_controllable (new TransportControllable ("transport goto start", *this, TransportControllable::GotoStart)), + goto_end_controllable (new TransportControllable ("transport goto end", *this, TransportControllable::GotoEnd)), + auto_loop_controllable (new TransportControllable ("transport auto loop", *this, TransportControllable::AutoLoop)), + play_selection_controllable (new TransportControllable ("transport play selection", *this, TransportControllable::PlaySelection)), + rec_controllable (new TransportControllable ("transport rec-enable", *this, TransportControllable::RecordEnable)), + shuttle_controllable (new TransportControllable ("shuttle", *this, TransportControllable::ShuttleControl)), shuttle_controller_binding_proxy (shuttle_controllable), roll_button (roll_controllable), @@ -172,6 +173,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) #ifdef TOP_MENUBAR _auto_display_errors = false; #endif + about = 0; splash = 0; @@ -191,6 +193,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) mixer = 0; session = 0; editor = 0; + engine = 0; _session_is_new = false; big_clock_window = 0; session_selector_window = 0; @@ -207,23 +210,18 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) have_disk_speed_dialog_displayed = false; session_loaded = false; last_speed_displayed = -1.0f; - - sys::path key_bindings_file; - - find_file_in_search_path (ardour_search_path() + system_config_search_path(), - "ardour.bindings", key_bindings_file); - - keybindings_path = key_bindings_file.to_string(); + ignore_dual_punch = false; + _mixer_on_top = false; - /* store all bindings changes in per-user file, no matter where they were loaded from */ - user_keybindings_path = user_config_directory().to_string (); - user_keybindings_path += '/'; - user_keybindings_path += "ardour.bindings"; + roll_button.unset_flags (Gtk::CAN_FOCUS); + stop_button.unset_flags (Gtk::CAN_FOCUS); + goto_start_button.unset_flags (Gtk::CAN_FOCUS); + goto_end_button.unset_flags (Gtk::CAN_FOCUS); + auto_loop_button.unset_flags (Gtk::CAN_FOCUS); + play_selection_button.unset_flags (Gtk::CAN_FOCUS); + rec_button.unset_flags (Gtk::CAN_FOCUS); - can_save_keybindings = false; - - last_configure_time.tv_sec = 0; - last_configure_time.tv_usec = 0; + last_configure_time= 0; shuttle_grabbed = false; shuttle_fract = 0.0; @@ -232,12 +230,17 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) shuttle_style_menu = 0; shuttle_unit_menu = 0; - gettimeofday (&last_peak_grab, 0); - gettimeofday (&last_shuttle_request, 0); - + // We do not have jack linked in yet so; + + last_shuttle_request = last_peak_grab = 0; // get_microseconds(); + ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler)); ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler)); + /* handle dialog requests */ + + ARDOUR::Session::Dialog.connect (mem_fun(*this, &ARDOUR_UI::session_dialog)); + /* handle pending state with a dialog */ ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog)); @@ -257,6 +260,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) Config->set_current_owner (ConfigVariableBase::Interface); setup_profile (); + GainMeter::setup_slider_pix (); + RouteTimeAxisView::setup_slider_pix (); + } catch (failed_constructor& err) { error << _("could not initialize Ardour.") << endmsg; // pass it on up @@ -267,6 +273,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) keyboard = new Keyboard; + reset_dpi(); + starting.connect (mem_fun(*this, &ARDOUR_UI::startup)); stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown)); @@ -305,8 +313,6 @@ ARDOUR_UI::create_engine () void ARDOUR_UI::post_engine () { - extern int setup_midi (); - /* Things to be done once we create the AudioEngine */ @@ -354,8 +360,13 @@ ARDOUR_UI::post_engine () /* set default clock modes */ - primary_clock.set_mode (AudioClock::SMPTE); - secondary_clock.set_mode (AudioClock::BBT); + if (Profile->get_sae()) { + primary_clock.set_mode (AudioClock::BBT); + secondary_clock.set_mode (AudioClock::MinSec); + } else { + primary_clock.set_mode (AudioClock::SMPTE); + secondary_clock.set_mode (AudioClock::BBT); + } /* start the time-of-day-clock */ @@ -385,26 +396,11 @@ ARDOUR_UI::~ARDOUR_UI () { save_ardour_state (); - if (keyboard) { - delete keyboard; - } - - if (editor) { - delete editor; - } - - if (mixer) { - delete mixer; - } - - if (add_route_dialog) { - delete add_route_dialog; - } - - - if (new_session_dialog) { - delete new_session_dialog; - } + delete keyboard; + delete editor; + delete mixer; + delete add_route_dialog; + delete new_session_dialog; } void @@ -419,21 +415,15 @@ ARDOUR_UI::pop_back_splash () gint ARDOUR_UI::configure_timeout () { - struct timeval now; - struct timeval diff; - - if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) { + if (last_configure_time == 0) { /* no configure events yet */ return TRUE; } - gettimeofday (&now, 0); - timersub (&now, &last_configure_time, &diff); - /* force a gap of 0.5 seconds since the last configure event */ - if (diff.tv_sec == 0 && diff.tv_usec < 500000) { + if (get_microseconds() - last_configure_time < 500000) { return TRUE; } else { have_configure_timeout = false; @@ -446,7 +436,7 @@ gboolean ARDOUR_UI::configure_handler (GdkEventConfigure* conf) { if (have_configure_timeout) { - gettimeofday (&last_configure_time, 0); + last_configure_time = get_microseconds(); } else { Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100); have_configure_timeout = true; @@ -461,28 +451,28 @@ ARDOUR_UI::set_transport_controllable_state (const XMLNode& node) const XMLProperty* prop; if ((prop = node.property ("roll")) != 0) { - roll_controllable.set_id (prop->value()); + roll_controllable->set_id (prop->value()); } if ((prop = node.property ("stop")) != 0) { - stop_controllable.set_id (prop->value()); + stop_controllable->set_id (prop->value()); } - if ((prop = node.property ("goto_start")) != 0) { - goto_start_controllable.set_id (prop->value()); + if ((prop = node.property ("goto-start")) != 0) { + goto_start_controllable->set_id (prop->value()); } - if ((prop = node.property ("goto_end")) != 0) { - goto_end_controllable.set_id (prop->value()); + if ((prop = node.property ("goto-end")) != 0) { + goto_end_controllable->set_id (prop->value()); } - if ((prop = node.property ("auto_loop")) != 0) { - auto_loop_controllable.set_id (prop->value()); + if ((prop = node.property ("auto-loop")) != 0) { + auto_loop_controllable->set_id (prop->value()); } - if ((prop = node.property ("play_selection")) != 0) { - play_selection_controllable.set_id (prop->value()); + if ((prop = node.property ("play-selection")) != 0) { + play_selection_controllable->set_id (prop->value()); } if ((prop = node.property ("rec")) != 0) { - rec_controllable.set_id (prop->value()); + rec_controllable->set_id (prop->value()); } if ((prop = node.property ("shuttle")) != 0) { - shuttle_controllable.set_id (prop->value()); + shuttle_controllable->set_id (prop->value()); } } @@ -492,21 +482,21 @@ ARDOUR_UI::get_transport_controllable_state () XMLNode* node = new XMLNode(X_("TransportControllables")); char buf[64]; - roll_controllable.id().print (buf, sizeof (buf)); + roll_controllable->id().print (buf, sizeof (buf)); node->add_property (X_("roll"), buf); - stop_controllable.id().print (buf, sizeof (buf)); + stop_controllable->id().print (buf, sizeof (buf)); node->add_property (X_("stop"), buf); - goto_start_controllable.id().print (buf, sizeof (buf)); + goto_start_controllable->id().print (buf, sizeof (buf)); node->add_property (X_("goto_start"), buf); - goto_end_controllable.id().print (buf, sizeof (buf)); + goto_end_controllable->id().print (buf, sizeof (buf)); node->add_property (X_("goto_end"), buf); - auto_loop_controllable.id().print (buf, sizeof (buf)); + auto_loop_controllable->id().print (buf, sizeof (buf)); node->add_property (X_("auto_loop"), buf); - play_selection_controllable.id().print (buf, sizeof (buf)); + play_selection_controllable->id().print (buf, sizeof (buf)); node->add_property (X_("play_selection"), buf); - rec_controllable.id().print (buf, sizeof (buf)); + rec_controllable->id().print (buf, sizeof (buf)); node->add_property (X_("rec"), buf); - shuttle_controllable.id().print (buf, sizeof (buf)); + shuttle_controllable->id().print (buf, sizeof (buf)); node->add_property (X_("shuttle"), buf); return *node; @@ -526,6 +516,9 @@ ARDOUR_UI::save_ardour_state () XMLNode* node = new XMLNode (keyboard->get_state()); Config->add_extra_xml (*node); Config->add_extra_xml (get_transport_controllable_state()); + if (new_session_dialog && new_session_dialog->engine_control.was_used()) { + Config->add_extra_xml (new_session_dialog->engine_control.get_state()); + } Config->save_state(); ui_config->save_state (); @@ -540,19 +533,28 @@ ARDOUR_UI::save_ardour_state () Config->add_instant_xml (mnode); } - save_keybindings (); + Keyboard::save_keybindings (); } gint ARDOUR_UI::autosave_session () { - if (!Config->get_periodic_safety_backups()) + if (g_main_depth() > 1) { + /* inside a recursive main loop, + give up because we may not be able to + take a lock. + */ return 1; + } - if (session) { - session->maybe_write_autosave(); + if (!Config->get_periodic_safety_backups()) { + return 1; } + if (session) { + session->maybe_write_autosave(); + } + return 1; } @@ -633,7 +635,7 @@ void ARDOUR_UI::startup () { string name, path; - + new_session_dialog = new NewSessionDialog(); bool backend_audio_is_running = EngineControl::engine_running(); @@ -647,6 +649,7 @@ ARDOUR_UI::startup () return; } + BootMessage (_("Ardour is ready for use")); show (); } @@ -754,9 +757,9 @@ If you still wish to quit, please use the\n\n\ session->set_deletion_in_progress (); } + ArdourDialog::close_all_dialogs (); engine->stop (true); - Config->save_state(); - ARDOUR_UI::config()->save_state(); + save_ardour_state (); quit (); } @@ -797,8 +800,7 @@ ARDOUR_UI::ask_about_saving_session (const string & what) prompt_label.set_name (X_("PrompterLabel")); prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP); - dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP) -; + dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP); dhbox.set_homogeneous (false); dhbox.pack_start (*dimage, false, false, 5); dhbox.pack_start (prompt_label, true, false, 5); @@ -813,9 +815,6 @@ ARDOUR_UI::ask_about_saving_session (const string & what) prompt_label.show(); dimage->show(); window.show(); - - save_the_session = 0; - window.set_keep_above (true); window.present (); @@ -930,15 +929,11 @@ ARDOUR_UI::update_disk_space() nframes_t frames = session->available_capture_duration(); char buf[64]; - + nframes_t fr = session->frame_rate(); + if (frames == max_frames) { strcpy (buf, _("Disk: 24hrs+")); } else { - int hrs; - int mins; - int secs; - nframes_t fr = session->frame_rate(); - rec_enabled_streams = 0; session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams); @@ -946,16 +941,29 @@ ARDOUR_UI::update_disk_space() frames /= rec_enabled_streams; } + int hrs; + int mins; + int secs; + hrs = frames / (fr * 3600); frames -= hrs * fr * 3600; mins = frames / (fr * 60); frames -= mins * fr * 60; secs = frames / fr; - + snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs); } - + disk_space_label.set_text (buf); + + // An attempt to make the disk space label flash red when space has run out. + + if (frames < fr * 60 * 5) { + /* disk_space_box.style ("disk_space_label_empty"); */ + } else { + /* disk_space_box.style ("disk_space_label"); */ + } + } gint @@ -1153,33 +1161,6 @@ ARDOUR_UI::open_recent_session () } } -bool -ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info) -{ - struct stat statbuf; - - if (stat (info.filename.c_str(), &statbuf) != 0) { - return false; - } - - if (!S_ISDIR(statbuf.st_mode)) { - return false; - } - - // XXX Portability - - string session_file = info.filename; - session_file += '/'; - session_file += Glib::path_get_basename (info.filename); - session_file += ".ardour"; - - if (stat (session_file.c_str(), &statbuf) != 0) { - return false; - } - - return S_ISREG (statbuf.st_mode); -} - bool ARDOUR_UI::check_audioengine () { @@ -1369,7 +1350,7 @@ ARDOUR_UI::do_transport_locate (nframes_t new_position) } void -ARDOUR_UI::transport_goto_start () +ARDOUR_UI::transport_goto_start () { if (session) { session->goto_start(); @@ -1402,6 +1383,34 @@ ARDOUR_UI::transport_goto_zero () } } +void +ARDOUR_UI::transport_goto_wallclock () +{ + if (session && editor) { + + time_t now; + struct tm tmnow; + nframes64_t frames; + + time (&now); + localtime_r (&now, &tmnow); + + frames = tmnow.tm_hour * (60 * 60 * session->frame_rate()); + frames += tmnow.tm_min * (60 * session->frame_rate()); + frames += tmnow.tm_sec * session->frame_rate(); + + session->request_locate (frames); + + /* force displayed area in editor to start no matter + what "follow playhead" setting is. + */ + + if (editor) { + editor->reset_x_origin (frames - (editor->current_page_frames()/2)); + } + } +} + void ARDOUR_UI::transport_goto_end () { @@ -1457,6 +1466,7 @@ ARDOUR_UI::remove_last_capture() void ARDOUR_UI::transport_record (bool roll) { + if (session) { switch (session->record_status()) { case Session::Disabled: @@ -1482,6 +1492,7 @@ ARDOUR_UI::transport_record (bool roll) session->disable_record (false, true); } } + //cerr << "ARDOUR_UI::transport_record () called roll = " << roll << " session->record_status() = " << session->record_status() << endl; } void @@ -1495,6 +1506,8 @@ ARDOUR_UI::transport_roll () rolling = session->transport_rolling (); + //cerr << "ARDOUR_UI::transport_roll () called session->record_status() = " << session->record_status() << endl; + if (session->get_play_loop()) { session->request_play_loop (false); auto_loop_button.set_visual_state (1); @@ -1719,8 +1732,8 @@ ARDOUR_UI::engine_halted () _("\ JACK has either been shutdown or it\n\ disconnected Ardour because Ardour\n\ -was not fast enough. You can save the\n\ -session and/or try to reconnect to JACK .")); +was not fast enough. Try to restart\n\ +JACK, reconnect and save the session.")); pop_back_splash (); msg.run (); } @@ -1913,17 +1926,6 @@ ARDOUR_UI::save_state_canfail (string name) return 0; } -void -ARDOUR_UI::restore_state (string name) -{ - if (session) { - if (name.length() == 0) { - name = session->name(); - } - session->restore_state (name); - } -} - void ARDOUR_UI::primary_clock_value_changed () { @@ -1948,37 +1950,6 @@ ARDOUR_UI::secondary_clock_value_changed () } } -void -ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w) -{ - if (session && dstream && dstream->record_enabled()) { - - Session::RecordState rs; - - rs = session->record_status (); - - switch (rs) { - case Session::Disabled: - case Session::Enabled: - if (w->get_state() != STATE_SELECTED) { - w->set_state (STATE_SELECTED); - } - break; - - case Session::Recording: - if (w->get_state() != STATE_ACTIVE) { - w->set_state (STATE_ACTIVE); - } - break; - } - - } else { - if (w->get_state() != STATE_NORMAL) { - w->set_state (STATE_NORMAL); - } - } -} - void ARDOUR_UI::transport_rec_enable_blink (bool onoff) { @@ -2005,14 +1976,6 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff) } } -gint -ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window) -{ - window->hide(); - Gtk::Main::quit (); - return TRUE; -} - void ARDOUR_UI::save_template () @@ -2043,6 +2006,24 @@ ARDOUR_UI::save_template () } } +void +ARDOUR_UI::edit_metadata () +{ + SessionMetadataEditor dialog; + dialog.set_session (session); + editor->ensure_float (dialog); + dialog.run (); +} + +void +ARDOUR_UI::import_metadata () +{ + SessionMetadataImporter dialog; + dialog.set_session (session); + editor->ensure_float (dialog); + dialog.run (); +} + void ARDOUR_UI::fontconfig_dialog () { @@ -2245,21 +2226,50 @@ ARDOUR_UI::end_loading_messages () void ARDOUR_UI::loading_message (const std::string& msg) { - cerr << "say: " << msg << endl; show_splash (); splash->message (msg); flush_pending (); } - + +void +ARDOUR_UI::idle_load (const Glib::ustring& path) +{ + if (session) { + if (Glib::file_test (path, Glib::FILE_TEST_IS_DIR)) { + /* /path/to/foo => /path/to/foo, foo */ + load_session (path, basename_nosuffix (path)); + } else { + /* /path/to/foo/foo.ardour => /path/to/foo, foo */ + load_session (Glib::path_get_dirname (path), basename_nosuffix (path)); + } + } else { + + ARDOUR_COMMAND_LINE::session_name = path; + + if (new_session_dialog) { + + + /* make it break out of Dialog::run() and + start again. + */ + + new_session_dialog->response (1); + } + } +} + +/** @param offer_quit true to offer a Cancel button, otherwise call it Quit */ bool -ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be_new) +ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be_new, bool offer_cancel) { bool existing_session = false; Glib::ustring session_name; Glib::ustring session_path; Glib::ustring template_name; + int response; - int response = Gtk::RESPONSE_NONE; + begin: + response = Gtk::RESPONSE_NONE; if (!ARDOUR_COMMAND_LINE::session_name.empty()) { @@ -2291,6 +2301,7 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be new_session_dialog->set_current_page (0); new_session_dialog->set_existing_session (existing_session); new_session_dialog->reset_recent(); + new_session_dialog->set_offer_cancel (offer_cancel); do { new_session_dialog->set_have_engine (backend_audio_is_running); @@ -2303,9 +2314,19 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be /* handle possible negative responses */ switch (response) { + case 1: + /* sent by idle_load, meaning restart the whole process again */ + new_session_dialog->hide(); + new_session_dialog->reset(); + goto begin; + break; + case Gtk::RESPONSE_CANCEL: case Gtk::RESPONSE_DELETE_EVENT: if (!session) { + if (engine && engine->running()) { + engine->stop (true); + } quit(); } new_session_dialog->hide (); @@ -2319,10 +2340,13 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be fontconfig_dialog(); if (!backend_audio_is_running) { - if (new_session_dialog->engine_control.setup_engine ()) { - new_session_dialog->hide (); + int ret = new_session_dialog->engine_control.setup_engine (); + if (ret < 0) { return false; - } + } else if (ret > 0) { + response = Gtk::RESPONSE_REJECT; + goto try_again; + } } if (create_engine ()) { @@ -2355,7 +2379,7 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be if (session_name[0] == '/' || (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { - + session_path = Glib::path_get_dirname (session_name); session_name = Glib::path_get_basename (session_name); @@ -2413,7 +2437,7 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be loadit: new_session_dialog->hide (); - + if (load_session (session_path, session_name, template_name)) { /* force a retry */ response = Gtk::RESPONSE_NONE; @@ -2426,7 +2450,7 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be } } - } while (response == Gtk::RESPONSE_NONE); + } while (response == Gtk::RESPONSE_NONE || response == Gtk::RESPONSE_REJECT); done: show(); @@ -2481,7 +2505,6 @@ ARDOUR_UI::load_session (const Glib::ustring& path, const Glib::ustring& snap_na } loading_message (_("Please wait while Ardour loads your session")); - disable_screen_updates (); try { new_session = new Session (*engine, path, snap_name, mix_template); @@ -2494,10 +2517,10 @@ ARDOUR_UI::load_session (const Glib::ustring& path, const Glib::ustring& snap_na MessageDialog msg (err.what(), true, Gtk::MESSAGE_INFO, - Gtk::BUTTONS_OK_CANCEL); + Gtk::BUTTONS_CLOSE); - msg.set_title (_("Loading Error")); - msg.set_secondary_text (_("Click the OK button to try again.")); + msg.set_title (_("Port Registration Error")); + msg.set_secondary_text (_("Click the Close button to try again.")); msg.set_position (Gtk::WIN_POS_CENTER); pop_back_splash (); msg.present (); @@ -2520,10 +2543,10 @@ ARDOUR_UI::load_session (const Glib::ustring& path, const Glib::ustring& snap_na MessageDialog msg (string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name), true, Gtk::MESSAGE_INFO, - Gtk::BUTTONS_OK_CANCEL); + Gtk::BUTTONS_CLOSE); msg.set_title (_("Loading Error")); - msg.set_secondary_text (_("Click the OK button to try again.")); + msg.set_secondary_text (_("Click the Close button to try again.")); msg.set_position (Gtk::WIN_POS_CENTER); pop_back_splash (); msg.present (); @@ -2553,7 +2576,6 @@ ARDOUR_UI::load_session (const Glib::ustring& path, const Glib::ustring& snap_na session->set_clean (); } - enable_screen_updates (); flush_pending (); retval = 0; @@ -2606,6 +2628,9 @@ ARDOUR_UI::build_session (const Glib::ustring& path, const Glib::ustring& snap_n connect_to_session (new_session); session_loaded = true; + + new_session->save_state(new_session->name()); + return 0; } @@ -2830,8 +2855,11 @@ After cleanup, unused audio files will be moved to a \ } if (session->cleanup_sources (rep)) { + editor->finish_cleanup (); return; } + + editor->finish_cleanup (); checker.hide(); display_cleanup_results (rep, @@ -2845,8 +2873,6 @@ release an additional\n\ %4 %5bytes of disk space.\n" )); - - } void @@ -2921,7 +2947,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) } /* XXX do something with name template */ - + if (add_route_dialog->type() == ARDOUR::DataType::MIDI) { if (track) { session_add_midi_track(count); @@ -2968,10 +2994,17 @@ ARDOUR_UI::editor_settings () const } else { node = Config->instant_xml(X_("Editor")); } + + if (!node) { + if (getenv("ARDOUR_INSTANT_XML_PATH")) { + node = Config->instant_xml(getenv("ARDOUR_INSTANT_XML_PATH")); + } + } if (!node) { node = new XMLNode (X_("Editor")); } + return node; } @@ -2989,15 +3022,37 @@ ARDOUR_UI::keyboard_settings () const } void -ARDOUR_UI::halt_on_xrun_message () +ARDOUR_UI::create_xrun_marker(nframes_t where) { - ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message)); + editor->mouse_add_new_marker (where, false, true); +} +void +ARDOUR_UI::halt_on_xrun_message () +{ MessageDialog msg (*editor, _("Recording was stopped because your system could not keep up.")); msg.run (); } +void +ARDOUR_UI::xrun_handler(nframes_t where) +{ + if (!session) { + return; + } + + ENSURE_GUI_THREAD (bind(mem_fun(*this, &ARDOUR_UI::xrun_handler), where)); + + if (session && Config->get_create_xrun_marker() && session->actively_recording()) { + create_xrun_marker(where); + } + + if (session && Config->get_stop_recording_on_xrun() && session->actively_recording()) { + halt_on_xrun_message (); + } +} + void ARDOUR_UI::disk_overrun_handler () { @@ -3041,6 +3096,24 @@ ARDOUR_UI::disk_speed_dialog_gone (int ignored_response, MessageDialog* msg) delete msg; } +void +ARDOUR_UI::session_dialog (std::string msg) +{ + ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::session_dialog), msg)); + + MessageDialog* d; + + if (editor) { + d = new MessageDialog (*editor, msg, false, MESSAGE_INFO, BUTTONS_OK, true); + } else { + d = new MessageDialog (msg, false, MESSAGE_INFO, BUTTONS_OK, true); + } + + d->show_all (); + d->run (); + delete d; +} + int ARDOUR_UI::pending_state_dialog () { @@ -3090,8 +3163,8 @@ The audioengine is currently running at %2 Hz\n"), desired, actual)); hbox->pack_start (*image, PACK_EXPAND_WIDGET, 12); hbox->pack_end (message, PACK_EXPAND_PADDING, 12); dialog.get_vbox()->pack_start(*hbox, PACK_EXPAND_PADDING, 6); - dialog.add_button (_("Load session anyway"), RESPONSE_ACCEPT); dialog.add_button (_("Do not load session"), RESPONSE_REJECT); + dialog.add_button (_("Load session anyway"), RESPONSE_ACCEPT); dialog.set_default_response (RESPONSE_ACCEPT); dialog.set_position (WIN_POS_CENTER); message.show(); @@ -3230,27 +3303,18 @@ ARDOUR_UI::record_state_changed () } } -void -ARDOUR_UI::set_keybindings_path (string path) -{ - keybindings_path = path; -} - -void -ARDOUR_UI::save_keybindings () -{ - if (can_save_keybindings) { - AccelMap::save (user_keybindings_path); - } -} - bool ARDOUR_UI::first_idle () { if (session) { session->allow_auto_play (true); } - can_save_keybindings = true; + + if (editor) { + editor->first_idle(); + } + + Keyboard::set_can_save_keybindings (true); return false; }