X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=b4ae6131a0eef9bf6754d5c1354ec734ab749faf;hb=b998b8f761aaf1b8e61633f6054a6e9aa5d6c204;hp=9d2bea5205242685f7bbd2ca714c6dcb6b4c8b92;hpb=d15d8ec40e4bb33bd5ccece63f1d8c99df782863;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 9d2bea5205..b4ae6131a0 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -62,6 +62,7 @@ #include "ardour/ardour.h" #include "ardour/callback.h" #include "ardour/profile.h" +#include "ardour/plugin_manager.h" #include "ardour/session_directory.h" #include "ardour/session_route.h" #include "ardour/session_state_utils.h" @@ -78,6 +79,7 @@ #include "ardour/midi_track.h" #include "ardour/filesystem_paths.h" #include "ardour/filename_extensions.h" +#include "ardour/process_thread.h" typedef uint64_t microseconds_t; @@ -137,13 +139,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) , gui_object_state (new GUIObjectState) , primary_clock (new AudioClock (X_("primary"), false, X_("TransportClockDisplay"), true, true, false, true)) , secondary_clock (new AudioClock (X_("secondary"), false, X_("SecondaryClockDisplay"), true, true, false, true)) - , preroll_clock (new AudioClock (X_("preroll"), false, X_("PreRollClock"), true, false, true)) - , postroll_clock (new AudioClock (X_("postroll"), false, X_("PostRollClock"), true, false, true)) - - /* preroll stuff */ - - , preroll_button (_("pre\nroll")) - , postroll_button (_("post\nroll")) /* big clock */ @@ -159,25 +154,19 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) , play_selection_controllable (new TransportControllable ("transport play selection", *this, TransportControllable::PlaySelection)) , rec_controllable (new TransportControllable ("transport rec-enable", *this, TransportControllable::RecordEnable)) - , roll_button (roll_controllable) - , stop_button (stop_controllable) - , goto_start_button (goto_start_controllable) - , goto_end_button (goto_end_controllable) - , auto_loop_button (auto_loop_controllable) - , play_selection_button (play_selection_controllable) - , rec_button (rec_controllable) - - , auto_return_button (_("Auto Return")) - , auto_play_button (_("Auto Play")) - , auto_input_button (_("Auto Input")) - // , click_button (_("Click")) - , time_master_button (_("time\nmaster")) + , auto_return_button (ArdourButton::led_default_elements) + , auto_play_button (ArdourButton::led_default_elements) + , auto_input_button (ArdourButton::led_default_elements) - , auditioning_alert_button (_("AUDITION")) - , solo_alert_button (_("SOLO")) + , auditioning_alert_button (_("audition")) + , solo_alert_button (_("solo")) + , feedback_alert_button (_("feedback")) , error_log_button (_("Errors")) + , _status_bar_visibility (X_("status-bar")) + , _feedback_exists (false) + { using namespace Gtk::Menu_Helpers; @@ -232,14 +221,28 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) original_big_clock_height = -1; original_big_clock_font_size = 0; - 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); - join_play_range_button.unset_flags (Gtk::CAN_FOCUS); + roll_button.set_controllable (roll_controllable); + stop_button.set_controllable (stop_controllable); + goto_start_button.set_controllable (goto_start_controllable); + goto_end_button.set_controllable (goto_end_controllable); + auto_loop_button.set_controllable (auto_loop_controllable); + play_selection_button.set_controllable (play_selection_controllable); + rec_button.set_controllable (rec_controllable); + + roll_button.set_name ("transport button"); + stop_button.set_name ("transport button"); + goto_start_button.set_name ("transport button"); + goto_end_button.set_name ("transport button"); + auto_loop_button.set_name ("transport button"); + play_selection_button.set_name ("transport button"); + rec_button.set_name ("transport recenable button"); + join_play_range_button.set_name ("transport button"); + midi_panic_button.set_name ("transport button"); + + goto_start_button.set_tweaks (ArdourButton::ShowClick); + goto_end_button.set_tweaks (ArdourButton::ShowClick); + midi_panic_button.set_tweaks (ArdourButton::ShowClick); + last_configure_time= 0; last_peak_grab = 0; @@ -262,6 +265,11 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) ARDOUR::Session::Quit.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::finish, this), gui_context ()); + /* tell the user about feedback */ + + ARDOUR::Session::FeedbackDetected.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::feedback_detected, this), gui_context ()); + ARDOUR::Session::SuccessfulGraphSort.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::successful_graph_sort, this), gui_context ()); + /* handle requests to deal with missing files */ ARDOUR::Session::MissingFile.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::missing_file, this, _1, _2, _3)); @@ -329,6 +337,11 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) starting.connect (sigc::mem_fun(*this, &ARDOUR_UI::startup)); stopping.connect (sigc::mem_fun(*this, &ARDOUR_UI::shutdown)); + + _process_thread = new ProcessThread (); + _process_thread->init (); + + DPIReset.connect (sigc::mem_fun (*this, &ARDOUR_UI::resize_text_widgets)); } /** @return true if a session was chosen and `apply' clicked, otherwise false if `cancel' was clicked */ @@ -402,13 +415,22 @@ ARDOUR_UI::post_engine () ARDOUR::init_post_engine (); + /* load up the UI manager */ + ActionManager::init (); + _tooltips.enable(); if (setup_windows ()) { throw failed_constructor (); } + /* Do this after setup_windows (), as that's when the _status_bar_visibility is created */ + XMLNode* n = Config->extra_xml (X_("UI")); + if (n) { + _status_bar_visibility.set_state (*n); + } + check_memory_locking(); /* this is the first point at which all the keybindings are available */ @@ -712,6 +734,11 @@ ARDOUR_UI::startup () add_window_proxy (_global_port_matrix[*i]); } + /* We have to do this here since goto_editor_window() ends up calling show_all() on the + * editor window, and we may want stuff to be hidden. + */ + _status_bar_visibility.update (); + BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME)); } @@ -1044,8 +1071,12 @@ ARDOUR_UI::update_cpu_load () { char buf[64]; + /* If this text is changed, the set_size_request_to_display_given_text call in ARDOUR_UI::resize_text_widgets + should also be changed. + */ + float const c = engine->get_cpu_load (); - snprintf (buf, sizeof (buf), _("DSP: %5.1f%%"), c >= 90 ? X_("red") : X_("green"), c_); + snprintf (buf, sizeof (buf), _("DSP: %5.1f%%"), c >= 90 ? X_("red") : X_("green"), c); cpu_load_label.set_markup (buf); } @@ -1057,6 +1088,10 @@ ARDOUR_UI::update_buffer_load () uint32_t const playback = _session ? _session->playback_load () : 100; uint32_t const capture = _session ? _session->capture_load () : 100; + /* If this text is changed, the set_size_request_to_display_given_text call in ARDOUR_UI::resize_text_widgets + should also be changed. + */ + if (_session) { snprintf ( buf, sizeof (buf), @@ -1109,19 +1144,24 @@ ARDOUR_UI::update_disk_space() int secs; hrs = frames / (fr * 3600); - frames -= hrs * fr * 3600; - mins = frames / (fr * 60); - frames -= mins * fr * 60; - secs = frames / fr; - - bool const low = (hrs == 0 && mins <= 30); - snprintf ( - buf, sizeof(buf), - _("Disk: %02dh:%02dm:%02ds"), - low ? X_("red") : X_("green"), - hrs, mins, secs - ); + if (hrs > 24) { + snprintf (buf, sizeof (buf), _("Disk: >24 hrs")); + } else { + frames -= hrs * fr * 3600; + mins = frames / (fr * 60); + frames -= mins * fr * 60; + secs = frames / fr; + + bool const low = (hrs == 0 && mins <= 30); + + snprintf ( + buf, sizeof(buf), + _("Disk: %02dh:%02dm:%02ds"), + low ? X_("red") : X_("green"), + hrs, mins, secs + ); + } } disk_space_label.set_markup (buf); @@ -1633,7 +1673,7 @@ ARDOUR_UI::transport_record (bool roll) switch (_session->record_status()) { case Session::Disabled: if (_session->ntracks() == 0) { - MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.")); + MessageDialog msg (*editor, _("Please create one or more tracks before trying to record.\nYou can do this with the \"Add Track or Bus\" option in the Session menu.")); msg.run (); return; } @@ -1689,12 +1729,12 @@ ARDOUR_UI::transport_roll () if (!Config->get_seamless_loop()) { _session->request_play_loop (false, true); } - } else if (_session->get_play_range () && !join_play_range_button.get_active()) { + } else if (_session->get_play_range () && !join_play_range_button.active_state()) { /* stop playing a range if we currently are */ _session->request_play_range (0, true); } - if (join_play_range_button.get_active()) { + if (join_play_range_button.active_state()) { _session->request_play_range (&editor->get_selection().time, true); } @@ -1753,7 +1793,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) if (rolling) { _session->request_stop (with_abort, true); } else { - if (join_play_range_button.get_active()) { + if (join_play_range_button.active_state()) { _session->request_play_range (&editor->get_selection().time, true); } @@ -1884,10 +1924,10 @@ void ARDOUR_UI::map_transport_state () { if (!_session) { - auto_loop_button.set_visual_state (0); - play_selection_button.set_visual_state (0); - roll_button.set_visual_state (0); - stop_button.set_visual_state (1); + auto_loop_button.unset_active_state (); + play_selection_button.unset_active_state (); + roll_button.unset_active_state (); + stop_button.set_active_state (Gtkmm2ext::Active); return; } @@ -1901,37 +1941,37 @@ ARDOUR_UI::map_transport_state () if (_session->get_play_range()) { - play_selection_button.set_visual_state (1); - roll_button.set_visual_state (0); - auto_loop_button.set_visual_state (0); + play_selection_button.set_active_state (Gtkmm2ext::Active); + roll_button.unset_active_state (); + auto_loop_button.unset_active_state (); } else if (_session->get_play_loop ()) { - auto_loop_button.set_visual_state (1); - play_selection_button.set_visual_state (0); - roll_button.set_visual_state (0); + auto_loop_button.set_active_state (Gtkmm2ext::Active); + play_selection_button.unset_active_state (); + roll_button.unset_active_state (); } else { - roll_button.set_visual_state (1); - play_selection_button.set_visual_state (0); - auto_loop_button.set_visual_state (0); + roll_button.set_active_state (Gtkmm2ext::Active); + play_selection_button.unset_active_state (); + auto_loop_button.unset_active_state (); } - if (join_play_range_button.get_active()) { + if (join_play_range_button.active_state()) { /* light up both roll and play-selection if they are joined */ - roll_button.set_visual_state (1); - play_selection_button.set_visual_state (1); + roll_button.set_active_state (Gtkmm2ext::Active); + play_selection_button.set_active_state (Gtkmm2ext::Active); } - stop_button.set_visual_state (0); + stop_button.unset_active_state (); } else { - stop_button.set_visual_state (1); - roll_button.set_visual_state (0); - play_selection_button.set_visual_state (0); - auto_loop_button.set_visual_state (0); + stop_button.set_active_state (Gtkmm2ext::Active); + roll_button.unset_active_state (); + play_selection_button.unset_active_state (); + auto_loop_button.unset_active_state (); update_disk_space (); } } @@ -2357,14 +2397,14 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff) if (r == Session::Enabled || (r == Session::Recording && !h)) { if (onoff) { - rec_button.set_visual_state (2); + rec_button.set_active_state (Active); } else { - rec_button.set_visual_state (0); + rec_button.set_active_state (Mid); } } else if (r == Session::Recording && h) { - rec_button.set_visual_state (1); + rec_button.set_active_state (Mid); } else { - rec_button.set_visual_state (0); + rec_button.unset_active_state (); } } @@ -3582,10 +3622,10 @@ ARDOUR_UI::step_edit_status_change (bool yn) // we make insensitive if (yn) { - rec_button.set_visual_state (3); + rec_button.set_active_state (Mid); rec_button.set_sensitive (false); } else { - rec_button.set_visual_state (0); + rec_button.unset_active_state ();; rec_button.set_sensitive (true); } } @@ -3829,3 +3869,37 @@ ARDOUR_UI::ambiguous_file (std::string file, std::string /*path*/, std::vectorget_buffers (); +} + +/** Drop our thread-local buffers */ +void +ARDOUR_UI::drop_process_buffers () +{ + _process_thread->drop_buffers (); +} + +void +ARDOUR_UI::feedback_detected () +{ + _feedback_exists = true; +} + +void +ARDOUR_UI::successful_graph_sort () +{ + _feedback_exists = false; +} + +void +ARDOUR_UI::midi_panic () +{ + if (_session) { + _session->midi_panic(); + } +}