summaryrefslogtreecommitdiff
path: root/gtk2_ardour/video_timeline.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2013-04-09 04:05:07 +0200
committerRobin Gareus <robin@gareus.org>2013-04-09 04:05:46 +0200
commited1f310f109279347906bbcb85757b5a54792e26 (patch)
treed4f1dba2351bac25b83250fffe8a6bfdfba93e61 /gtk2_ardour/video_timeline.cc
parent49ddf8ecce0027e5cb96de2d361aec8d74b3c921 (diff)
vtl: rework session-needs-save logic
* videotimeline now immediately marks the session dirty on every state-changing operation * video-montor is polled every 2.5 seconds for menu-relevant state info (ontop, OSD,..) and every 30 seconds for full state (window pos, size,..) * new interface to query the video-monitor for its state and wait for all replies - terminating the process and using ::wait() is no longer required * Ardour> quit and Ardour > close-session does no longer close the video session to enforce video-monitor state sync but uses above new interface
Diffstat (limited to 'gtk2_ardour/video_timeline.cc')
-rw-r--r--gtk2_ardour/video_timeline.cc90
1 files changed, 37 insertions, 53 deletions
diff --git a/gtk2_ardour/video_timeline.cc b/gtk2_ardour/video_timeline.cc
index 563a6a366e..78b5f0345d 100644
--- a/gtk2_ardour/video_timeline.cc
+++ b/gtk2_ardour/video_timeline.cc
@@ -89,63 +89,23 @@ VideoTimeLine::save_session ()
LocaleGuard lg (X_("POSIX"));
- bool is_dirty = false;
-
- XMLNode* prev = _session->extra_xml (X_("Videomonitor"));
-
- /* remember if vmonitor was open.. */
XMLNode* node = new XMLNode(X_("Videomonitor"));
-
+ if (!node) return;
node->add_property (X_("active"), (vmonitor && vmonitor->is_started())?"yes":"no");
- if (!prev || !(prev->property (X_("active")) && prev->property (X_("active"))->value() == node->property(X_("active"))->value()) ){
- _session->add_extra_xml (*node);
- is_dirty=true; // TODO not if !prev && value==default
+ _session->add_extra_xml (*node);
+
+ if (vmonitor) {
+ vmonitor->save_session();
}
/* VTL settings */
node = _session->extra_xml (X_("Videotimeline"));
-
- if (node) {
- if (!(node->property(X_("id")) && node->property(X_("id"))->value() == id().to_s())) {
- node->add_property (X_("id"), id().to_s());
- is_dirty=true;
- }
- }
-
- /* remember timeline height.. */
- if (node) {
- int h = editor->get_videotl_bar_height();
- if (!(node->property(X_("Height")) && atoi(node->property(X_("Height"))->value().c_str())==h)) {
- node->add_property (X_("Height"), h);
- is_dirty=true;
- }
- }
-
- /* save video-offset-lock */
- if (node) {
- if (!(node->property(X_("VideoOffsetLock")) && atoi(node->property(X_("VideoOffsetLock"))->value().c_str())==video_offset_lock)) {
- node->add_property (X_("VideoOffsetLock"), video_offset_lock?X_("1"):X_("0"));
- is_dirty=true;
- }
- }
- /* save video-offset */
- if (node) {
- if (!(node->property(X_("VideoOffset")) && atoll(node->property(X_("VideoOffset"))->value().c_str())==video_offset)) {
- node->add_property (X_("VideoOffset"), video_offset);
- is_dirty=true;
- }
- }
-
- /* save 'auto_set_session_fps' */
- if (node) {
- if (!(node->property(X_("AutoFPS")) && atoi(node->property(X_("AutoFPS"))->value().c_str())==auto_set_session_fps)) {
- node->add_property (X_("AutoFPS"), auto_set_session_fps?X_("1"):X_("0"));
- is_dirty=true;
- }
- }
- if (is_dirty) {
- _session->set_dirty ();
- }
+ if (!node) return;
+ node->add_property (X_("id"), id().to_s());
+ node->add_property (X_("Height"), editor->get_videotl_bar_height());
+ node->add_property (X_("VideoOffsetLock"), video_offset_lock?X_("1"):X_("0"));
+ node->add_property (X_("VideoOffset"), video_offset);
+ node->add_property (X_("AutoFPS"), auto_set_session_fps?X_("1"):X_("0"));
}
/* close and save settings */
@@ -156,7 +116,6 @@ VideoTimeLine::close_session ()
return;
}
sessionsave.disconnect();
- save_session();
close_video_monitor();
remove_frames();
@@ -165,6 +124,16 @@ VideoTimeLine::close_session ()
GuiUpdate("set-xjadeo-sensitive-off");
}
+void
+VideoTimeLine::sync_session_state ()
+{
+ if (!_session || !vmonitor || !vmonitor->is_started()) {
+ return;
+ }
+ vmonitor->query_full_state(true);
+ save_session();
+}
+
/** load settings from session */
void
VideoTimeLine::set_session (ARDOUR::Session *s)
@@ -762,6 +731,17 @@ VideoTimeLine::open_video_monitor() {
GuiUpdate("set-xjadeo-active-on");
vmonitor->set_fps(video_file_fps);
vmonitor->open(video_filename);
+
+ if (_session) {
+ XMLNode* node = _session->extra_xml (X_("Videomonitor"));
+ if (node) {
+ const XMLProperty* prop = node->property (X_("active"));
+ if (prop && prop->value() != "yes") _session->set_dirty ();
+ } else {
+ _session->set_dirty ();
+ }
+ }
+
}
}
@@ -788,9 +768,13 @@ VideoTimeLine::terminated_video_monitor () {
}
GuiUpdate("set-xjadeo-active-off");
vmonitor=0;
- if (reopen_vmonitor) {
+ if (reopen_vmonitor) {
reopen_vmonitor=false;
open_video_monitor();
+ } else {
+ if (_session) {
+ _session->set_dirty ();
+ }
}
}