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();
+ }
+}