Change ARDOUR::init return type to bool type for success/failure
[ardour.git] / gtk2_ardour / ardour_ui.cc
index fd75481af521b0e56a1ec0a6a59dd23bc7fae923..86e838d122357f5c55b710512932a52c21dc1892 100644 (file)
@@ -153,6 +153,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
          /* big clock */
 
        , big_clock (new AudioClock (X_("bigclock"), false, "big", true, true, false, false))
+       , video_timeline(0)
 
          /* start of private members */
 
@@ -180,6 +181,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
        , solo_alert_button (_("solo"))
        , feedback_alert_button (_("feedback"))
 
+       , editor_meter(0)
+       , editor_meter_peak_display()
+
        , speaker_config_window (X_("speaker-config"), _("Speaker Configuration"))
        , theme_manager (X_("theme-manager"), _("Theme Manager"))
        , key_editor (X_("key-editor"), _("Key Bindings"))
@@ -213,6 +217,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 
        editor = 0;
        mixer = 0;
+       meterbridge = 0;
        editor = 0;
        engine = 0;
        _session_is_new = false;
@@ -286,7 +291,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
        /* lets get this party started */
 
        try {
-               if (ARDOUR::init (ARDOUR_COMMAND_LINE::use_vst, ARDOUR_COMMAND_LINE::try_hw_optimization, localedir)) {
+               if (!ARDOUR::init (ARDOUR_COMMAND_LINE::use_vst, ARDOUR_COMMAND_LINE::try_hw_optimization, localedir)) {
                        throw failed_constructor ();
                }
 
@@ -509,6 +514,7 @@ ARDOUR_UI::~ARDOUR_UI ()
        delete keyboard;
        delete editor;
        delete mixer;
+       delete meterbridge;
 
        stop_video_server();
 }
@@ -813,13 +819,13 @@ ARDOUR_UI::check_memory_locking ()
                                                  "runs out of memory. \n\n"
                                                  "You can view the memory limit with 'ulimit -l', "
                                                  "and it is normally controlled by %2"),
-                                               PROGRAM_NAME).c_str()
+                                               PROGRAM_NAME, 
 #ifdef __FreeBSD__
-                                       X_("/etc/login.conf")
+                                               X_("/etc/login.conf")
 #else
-                                       X_(" /etc/security/limits.conf")
+                                               X_(" /etc/security/limits.conf")
 #endif
-                                       );
+                                       ).c_str());
 
                                msg.set_default_response (RESPONSE_OK);
 
@@ -895,11 +901,11 @@ If you still wish to quit, please use the\n\n\
 
                second_connection.disconnect ();
                point_one_second_connection.disconnect ();
-               point_oh_five_second_connection.disconnect ();
-               point_zero_one_second_connection.disconnect();
+               point_zero_something_second_connection.disconnect();
        }
 
        delete ARDOUR_UI::instance()->video_timeline;
+       ARDOUR_UI::instance()->video_timeline = NULL;
        stop_video_server();
 
        /* Save state before deleting the session, as that causes some
@@ -1025,11 +1031,20 @@ ARDOUR_UI::every_point_one_seconds ()
 }
 
 gint
-ARDOUR_UI::every_point_zero_one_seconds ()
+ARDOUR_UI::every_point_zero_something_seconds ()
 {
-       // august 2007: actual update frequency: 40Hz, not 100Hz
+       // august 2007: actual update frequency: 25Hz (40ms), not 100Hz
 
        SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
+       if (editor_meter && Config->get_show_editor_meter()) {
+               float mpeak = editor_meter->update_meters();
+               if (mpeak > editor_meter_max_peak) {
+                       if (mpeak >= Config->get_meter_peak()) {
+                               editor_meter_peak_display.set_name ("meterbridge peakindicator on");
+                               editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+                       }
+               }
+       }
        return TRUE;
 }
 
@@ -1485,7 +1500,14 @@ ARDOUR_UI::open_session ()
                        open_session_selector->set_current_folder(Config->get_default_session_parent_dir());
                }
 
-               open_session_selector->add_shortcut_folder (Config->get_default_session_parent_dir());
+               string default_session_folder = Config->get_default_session_parent_dir();
+               try {
+                       /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
+                       open_session_selector->add_shortcut_folder (default_session_folder);
+               }
+               catch (Glib::Error & e) {
+                       std::cerr << "open_session_selector->add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl;
+               }
 
                FileFilter session_filter;
                session_filter.add_pattern ("*.ardour");
@@ -3423,9 +3445,28 @@ ARDOUR_UI::start_video_server (Gtk::Window* float_window, bool popup_msg)
                        Config->set_video_advanced_setup(true);
                }
 
+               if (video_server_process) {
+                       delete video_server_process;
+               }
+
                video_server_process = new SystemExec(icsd_exec, argp);
-               video_server_process->start();
-               sleep(1);
+               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);
+                       if (--timeout <= 0 || !video_server_process->is_running()) break;
+               }
+               if (timeout <= 0) {
+                       warning << _("Video-server was started but does not respond to requests...") << endmsg;
+               } else {
+                       if (!ARDOUR_UI::instance()->video_timeline->check_server_docroot()) {
+                               delete video_server_process;
+                               video_server_process = 0;
+                       }
+               }
        }
        return true;
 }
@@ -3455,8 +3496,12 @@ ARDOUR_UI::add_video (Gtk::Window* float_window)
        add_video_dialog->hide();
        if (r != RESPONSE_ACCEPT) { return; }
 
-       bool local_file;
+       bool local_file, orig_local_file;
        std::string path = add_video_dialog->file_name(local_file);
+
+       std::string orig_path = path;
+       orig_local_file = local_file;
+
        bool auto_set_session_fps = add_video_dialog->auto_set_session_fps();
 
        if (local_file && !Glib::file_test(path, Glib::FILE_TEST_EXISTS)) {
@@ -3480,7 +3525,10 @@ ARDOUR_UI::add_video (Gtk::Window* float_window)
                                        return;
                                }
                                if (!transcode_video_dialog->get_audiofile().empty()) {
-                                       editor->embed_audio_from_video(transcode_video_dialog->get_audiofile());
+                                       editor->embed_audio_from_video(
+                                                       transcode_video_dialog->get_audiofile(),
+                                                       video_timeline->get_offset()
+                                                       );
                                }
                                switch (transcode_video_dialog->import_option()) {
                                        case VTL_IMPORT_TRANSCODED:
@@ -3515,6 +3563,11 @@ ARDOUR_UI::add_video (Gtk::Window* float_window)
                node->add_property (X_("Filename"), path);
                node->add_property (X_("AutoFPS"), auto_set_session_fps?X_("1"):X_("0"));
                node->add_property (X_("LocalFile"), local_file?X_("1"):X_("0"));
+               if (orig_local_file) {
+                       node->add_property (X_("OriginalVideoFile"), orig_path);
+               } else {
+                       node->remove_property (X_("OriginalVideoFile"));
+               }
                _session->add_extra_xml (*node);
                _session->set_dirty ();
 
@@ -3539,6 +3592,10 @@ ARDOUR_UI::remove_video ()
        video_timeline->close_session();
        editor->toggle_ruler_video(false);
 
+       /* reset state */
+       video_timeline->set_offset_locked(false);
+       video_timeline->set_offset(0);
+
        /* delete session state */
        XMLNode* node = new XMLNode(X_("Videotimeline"));
        _session->add_extra_xml(*node);
@@ -4076,3 +4133,32 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat
 
        msg.run ();
 }
+
+
+void
+ARDOUR_UI::reset_peak_display ()
+{
+       if (!_session || !_session->master_out() || !editor_meter) return;
+       editor_meter->clear_meters();
+       editor_meter_max_peak = -INFINITY;
+       editor_meter_peak_display.set_name ("meterbridge peakindicator");
+       editor_meter_peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
+}
+
+void
+ARDOUR_UI::reset_group_peak_display (RouteGroup* group)
+{
+       if (!_session || !_session->master_out()) return;
+       if (group == _session->master_out()->route_group()) {
+               reset_peak_display ();
+       }
+}
+
+void
+ARDOUR_UI::reset_route_peak_display (Route* route)
+{
+       if (!_session || !_session->master_out()) return;
+       if (_session->master_out().get() == route) {
+               reset_peak_display ();
+       }
+}