fix initial display of solo-model in monitor section
[ardour.git] / gtk2_ardour / ardour_ui.cc
index 1130177fe238ef9775e21daa52bfb90a653e5617..cc173c80e333649ddb51240089dfb33784ab2e36 100644 (file)
@@ -78,6 +78,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;
 
@@ -178,6 +179,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
 
        , error_log_button (_("Errors"))
 
+       , _status_bar_visibility (X_("status-bar"))
+
 {
        using namespace Gtk::Menu_Helpers;
 
@@ -329,6 +332,9 @@ 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 ();
 }
 
 /** @return true if a session was chosen and `apply' clicked, otherwise false if `cancel' was clicked */
@@ -409,6 +415,12 @@ ARDOUR_UI::post_engine ()
                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 +724,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));
 }
 
@@ -959,7 +976,7 @@ ARDOUR_UI::every_point_zero_one_seconds ()
 void
 ARDOUR_UI::update_sample_rate (framecnt_t)
 {
-       char buf[32];
+       char buf[64];
 
        ENSURE_GUI_THREAD (*this, &ARDOUR_UI::update_sample_rate, ignored)
 
@@ -972,17 +989,17 @@ ARDOUR_UI::update_sample_rate (framecnt_t)
                framecnt_t rate = engine->frame_rate();
 
                if (fmod (rate, 1000.0) != 0.0) {
-                       snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f ms"),
+                       snprintf (buf, sizeof (buf), _("JACK: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"),
                                  (float) rate/1000.0f,
                                  (engine->frames_per_cycle() / (float) rate) * 1000.0f);
                } else {
-                       snprintf (buf, sizeof (buf), _("%" PRId64 " kHz / %4.1f ms"),
+                       snprintf (buf, sizeof (buf), _("JACK: <span foreground=\"green\">%" PRId64 " kHz / %4.1f ms</span>"),
                                  rate/1000,
                                  (engine->frames_per_cycle() / (float) rate) * 1000.0f);
                }
        }
 
-       sample_rate_label.set_text (buf);
+       sample_rate_label.set_markup (buf);
 }
 
 void
@@ -994,6 +1011,7 @@ ARDOUR_UI::update_format ()
        }
 
        stringstream s;
+       s << "File: <span foreground=\"green\">";
 
        switch (_session->config.get_native_file_header_format ()) {
        case BWF:
@@ -1033,26 +1051,49 @@ ARDOUR_UI::update_format ()
                break;
        }
 
-       format_label.set_text (s.str ());
+       s << "</span>";
+
+       format_label.set_markup (s.str ());
 }
 
 void
 ARDOUR_UI::update_cpu_load ()
 {
-       char buf[32];
-       snprintf (buf, sizeof (buf), _("DSP: %5.1f%%"), engine->get_cpu_load());
-       cpu_load_label.set_text (buf);
+       char buf[64];
+
+       /* If this text is changed, the set_size_request_to_display_given_text call in ARDOUR_UI::build_menu_bar
+          should also be changed.
+       */
+
+       float const c = engine->get_cpu_load ();
+       snprintf (buf, sizeof (buf), _("DSP: <span foreground=\"%s\">%5.1f%%</span>"), c >= 90 ? X_("red") : X_("green"), c);
+       cpu_load_label.set_markup (buf);
 }
 
 void
 ARDOUR_UI::update_buffer_load ()
 {
-       char buf[64];
+       char buf[256];
+
+       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::build_menu_bar
+          should also be changed.
+       */
+       
        if (_session) {
-               snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
-                         _session->playback_load(), _session->capture_load());
-               buffer_load_label.set_text (buf);
+               snprintf (
+                       buf, sizeof (buf),
+                       _("Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">%" PRIu32 "%%</span> "
+                                  "<span foreground=\"green\">c:</span><span foreground=\"%s\">%" PRIu32 "%%</span>"),
+                       playback <= 5 ? X_("red") : X_("green"),
+                       playback,
+                       capture <= 5 ? X_("red") : X_("green"),
+                       capture
+                       );
+
+               buffer_load_label.set_markup (buf);
        } else {
                buffer_load_label.set_text ("");
        }
@@ -1079,7 +1120,7 @@ ARDOUR_UI::update_disk_space()
        framecnt_t fr = _session->frame_rate();
 
        if (frames == max_framecnt) {
-               strcpy (buf, _("Disk: 24hrs+"));
+               snprintf (buf, sizeof (buf), _("Disk: <span foreground=\"green\">24hrs+</span>"));
        } else {
                rec_enabled_streams = 0;
                _session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
@@ -1098,10 +1139,17 @@ ARDOUR_UI::update_disk_space()
                frames -= mins * fr * 60;
                secs = frames / fr;
 
-               snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
+               bool const low = (hrs == 0 && mins <= 30);
+
+               snprintf (
+                       buf, sizeof(buf),
+                       _("Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"),
+                       low ? X_("red") : X_("green"),
+                       hrs, mins, secs
+                       );
        }
 
-       disk_space_label.set_text (buf);
+       disk_space_label.set_markup (buf);
 
        // An attempt to make the disk space label flash red when space has run out.
 
@@ -2129,7 +2177,7 @@ ARDOUR_UI::snapshot_session (bool switch_to_it)
 
                time (&n);
                localtime_r (&n, &local_time);
-               strftime (timebuf, sizeof(timebuf), "%FT%T", &local_time);
+               strftime (timebuf, sizeof(timebuf), "%FT%H.%M.%S", &local_time);
                prompter.set_initial_text (timebuf);
        }
 
@@ -2154,6 +2202,12 @@ ARDOUR_UI::snapshot_session (bool switch_to_it)
                                msg.run ();
                                goto again;
                        }
+                       if (snapname.find (':') != string::npos) {
+                               MessageDialog msg (_("To ensure compatibility with various systems\n"
+                                                    "snapshot names may not contain a ':' character"));
+                               msg.run ();
+                               goto again;
+                       }
                }
 
                vector<sys::path> p;
@@ -3695,12 +3749,6 @@ ARDOUR_UI::TransportControllable::get_value (void) const
        return val;
 }
 
-void
-ARDOUR_UI::TransportControllable::set_id (const string& str)
-{
-       _id = str;
-}
-
 void
 ARDOUR_UI::setup_profile ()
 {
@@ -3806,3 +3854,17 @@ ARDOUR_UI::ambiguous_file (std::string file, std::string /*path*/, std::vector<s
        dialog.run ();
        return dialog.get_which ();
 }
+
+/** Allocate our thread-local buffers */
+void
+ARDOUR_UI::get_process_buffers ()
+{
+       _process_thread->get_buffers ();
+}
+
+/** Drop our thread-local buffers */
+void
+ARDOUR_UI::drop_process_buffers ()
+{
+       _process_thread->drop_buffers ();
+}