Drop references held by any GUI Lua script after execution
[ardour.git] / gtk2_ardour / video_monitor.cc
index cb146e4ea5f6ac0d10da13b6b12fffde70e9c98b..38a5a08177bfb82b5bf6145e2aeb26596b435613 100644 (file)
@@ -1,29 +1,32 @@
 /*
-    Copyright (C) 2010 Paul Davis
-    Author: Robin Gareus <robin@gareus.org>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Copyright (C) 2013-2016 Tim Mayberry <mojofunk@gmail.com>
+ * Copyright (C) 2013-2018 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2013-2019 Robin Gareus <robin@gareus.org>
+ * Copyright (C) 2013 John Emmas <john@creativepost.co.uk>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+#include <cstdio>
 
-*/
 #include "pbd/file_utils.h"
 #include "pbd/convert.h"
+#include "ardour/filesystem_paths.h"
+
 #include "gui_thread.h"
 #include "timers.h"
 #include "utils.h"
-
-#include <stdio.h>
 #include "public_editor.h"
 #include "editor.h"
 #include "video_monitor.h"
@@ -37,7 +40,7 @@ using namespace ARDOUR_UI_UTILS;
 VideoMonitor::VideoMonitor (PublicEditor *ed, std::string xjadeo_bin_path)
        : editor (ed)
 {
-       manually_seeked_sample = 0;
+       manually_seeked_frame = 0;
        fps =0.0; // = _session->timecode_frames_per_second();
        sync_by_manual_seek = true;
        _restore_settings_mask = 0;
@@ -72,11 +75,11 @@ VideoMonitor::start ()
                return true;
        }
 
-       manually_seeked_sample = 0;
+       manually_seeked_frame = 0;
        sync_by_manual_seek = false;
        if (clock_connection.connected()) { clock_connection.disconnect(); }
 
-       if (process->start(debug_enable?2:1)) {
+       if (process->start (debug_enable ? SystemExec::MergeWithStdin : SystemExec::IgnoreAndClose)) {
                return false;
        }
        return true;
@@ -126,10 +129,17 @@ void
 VideoMonitor::open (std::string filename)
 {
        if (!is_started()) return;
-       manually_seeked_sample = 0;
+       manually_seeked_frame = 0;
        osdmode = 10; // 1: frameno, 2: timecode, 8: box
        starting = 15;
+
+       std::string ardour_mono_file;
+       if (find_file (ARDOUR::ardour_data_search_path(), "ArdourMono.ttf", ardour_mono_file)) {
+               process->write_to_stdin("osd font "+ ardour_mono_file  +"\n");
+       }
+
        process->write_to_stdin("load " + filename + "\n");
+
        process->write_to_stdin("set fps -1\n");
        process->write_to_stdin("window resize 100%\n");
        process->write_to_stdin("window ontop on\n");
@@ -150,6 +160,7 @@ VideoMonitor::open (std::string filename)
        process->write_to_stdin("notify settings\n");
        process->write_to_stdin("window letterbox on\n");
        process->write_to_stdin("osd mode 10\n");
+
        for(XJSettings::const_iterator it = xjadeo_settings.begin(); it != xjadeo_settings.end(); ++it) {
                if (skip_setting(it->first)) { continue; }
                process->write_to_stdin(it->first + " " + it->second + "\n");
@@ -381,11 +392,11 @@ VideoMonitor::parse_output (std::string d, size_t /*s*/)
                                                xjadeo_settings["window letterbox"] = value;
                                        } else if(key ==  "osdmode") {
                                                knownstate |= 1;
-                                               osdmode = atoi(value);
+                                               osdmode = atoi(value) & ~0x40;
                                                if (starting || atoi(xjadeo_settings["osd mode"]) != osdmode) {
                                                        if (!starting && _session) _session->set_dirty ();
-                                                       if ((osdmode & 1) == 1) { UiState("xjadeo-window-osd-sample-on"); }
-                                                       if ((osdmode & 1) == 0) { UiState("xjadeo-window-osd-sample-off"); }
+                                                       if ((osdmode & 1) == 1) { UiState("xjadeo-window-osd-frame-on"); }
+                                                       if ((osdmode & 1) == 0) { UiState("xjadeo-window-osd-frame-off"); }
                                                        if ((osdmode & 2) == 2) { UiState("xjadeo-window-osd-timecode-on"); }
                                                        if ((osdmode & 2) == 0) { UiState("xjadeo-window-osd-timecode-off"); }
                                                        if ((osdmode & 8) == 8) { UiState("xjadeo-window-osd-box-on"); }
@@ -472,7 +483,9 @@ void
 VideoMonitor::srsupdate ()
 {
        if (!_session) { return; }
-       if (editor->dragging_playhead()) { return ;}
+       if (editor->dragging_playhead() || editor->preview_video_drag_active()) {
+               return;
+       }
        manual_seek(_session->audible_sample(), false, NO_OFFSET);
 }
 
@@ -526,8 +539,8 @@ VideoMonitor::manual_seek (samplepos_t when, bool /*force*/, ARDOUR::sampleoffse
        }
        if (video_frame < 0 ) video_frame = 0;
 
-       if (video_frame == manually_seeked_sample) { return; }
-       manually_seeked_sample = video_frame;
+       if (video_frame == manually_seeked_frame) { return; }
+       manually_seeked_frame = video_frame;
 
 #if 0 /* DEBUG */
        std::cout <<"seek: " << video_frame << std::endl;
@@ -556,9 +569,8 @@ VideoMonitor::xjadeo_sync_setup ()
        if (!_session) { return; }
 
        bool my_manual_seek = true;
-       if (_session->config.get_external_sync()) {
-               if (ARDOUR::Config->get_sync_source() == ARDOUR::Engine)
-                       my_manual_seek = false;
+       if (_session->synced_to_engine ()) {
+               my_manual_seek = false;
        }
 
        if (my_manual_seek != sync_by_manual_seek) {