summaryrefslogtreecommitdiff
path: root/gtk2_ardour/ardour_ui.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/ardour_ui.cc')
-rw-r--r--gtk2_ardour/ardour_ui.cc261
1 files changed, 260 insertions, 1 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 7b4b9663f0..238c530627 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -116,6 +116,13 @@ typedef uint64_t microseconds_t;
#include "time_axis_view_item.h"
#include "utils.h"
#include "window_proxy.h"
+#ifdef WITH_VIDEOTIMELINE
+#include "video_server_dialog.h"
+#include "add_video_dialog.h"
+#include "transcode_video_dialog.h"
+#include "video_copy_dialog.h"
+#include "system_exec.h" /* to launch video-server */
+#endif
#include "i18n.h"
@@ -195,6 +202,10 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
session_selector_window = 0;
last_key_press_time = 0;
add_route_dialog = 0;
+#ifdef WITH_VIDEOTIMELINE
+ add_video_dialog = 0;
+ video_server_process = 0;
+#endif
route_params = 0;
bundle_manager = 0;
rc_option_editor = 0;
@@ -461,6 +472,10 @@ ARDOUR_UI::~ARDOUR_UI ()
delete editor;
delete mixer;
delete add_route_dialog;
+#ifdef WITH_VIDEOTIMELINE
+ if (add_video_dialog) delete add_video_dialog;
+ stop_video_server();
+#endif
}
void
@@ -769,6 +784,12 @@ ARDOUR_UI::idle_finish ()
void
ARDOUR_UI::finish()
{
+#ifdef WITH_VIDEOTIMELINE
+ /* close video-monitor & pending requests
+ * would better be done in ~Editor() but that is not called..
+ */
+ ARDOUR_UI::instance()->video_timeline->close_session();
+#endif
if (_session) {
if (_session->dirty()) {
@@ -805,6 +826,11 @@ If you still wish to quit, please use the\n\n\
point_zero_one_second_connection.disconnect();
}
+#ifdef WITH_VIDEOTIMELINE
+ delete ARDOUR_UI::instance()->video_timeline;
+ stop_video_server();
+#endif
+
/* Save state before deleting the session, as that causes some
windows to be destroyed before their visible state can be
saved.
@@ -2466,7 +2492,11 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
* treat a non-dirty session this way, so that it stays visible
* as we bring up the new session dialog.
*/
-
+#ifdef WITH_VIDEOTIMELINE
+ if (_session && ARDOUR_UI::instance()->video_timeline) {
+ ARDOUR_UI::instance()->video_timeline->close_session();
+ }
+#endif
if (_session && _session->dirty()) {
if (unload_session (false)) {
/* unload cancelled by user */
@@ -2647,6 +2677,9 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
void
ARDOUR_UI::close_session()
{
+#ifdef WITH_VIDEOTIMELINE
+ ARDOUR_UI::instance()->video_timeline->close_session();
+#endif
if (!check_audioengine()) {
return;
}
@@ -3234,6 +3267,229 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
/* idle connection will end at scope end */
}
+#ifdef WITH_VIDEOTIMELINE
+void
+ARDOUR_UI::stop_video_server (bool ask_confirm)
+{
+ if (!video_server_process && ask_confirm) {
+ warning << _("Video-Server was not launched by Ardour. The request to stop it is ignored.") << endmsg;
+ }
+ if (video_server_process) {
+ if(ask_confirm) {
+ ArdourDialog confirm (_("Stop Video-Server"), true);
+ Label m (_("Do you really want to stop the Video Server?"));
+ confirm.get_vbox()->pack_start (m, true, true);
+ confirm.add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
+ confirm.add_button (_("Yes, Stop It"), Gtk::RESPONSE_ACCEPT);
+ confirm.show_all ();
+ if (confirm.run() == RESPONSE_CANCEL) {
+ return;
+ }
+ }
+ delete video_server_process;
+ video_server_process =0;
+ }
+}
+
+void
+ARDOUR_UI::start_video_server_menu (Gtk::Window* float_window)
+{
+ ARDOUR_UI::start_video_server( float_window, true);
+}
+
+bool
+ARDOUR_UI::start_video_server (Gtk::Window* float_window, bool popup_msg)
+{
+ if (!_session) {
+ return false;
+ }
+ if (popup_msg) {
+ if (ARDOUR_UI::instance()->video_timeline->check_server()) {
+ if (video_server_process) {
+ popup_error(_("The Video Server is already started."));
+ } else {
+ popup_error(_("An external Video Server is configured and can be reached. Not starting a new instance."));
+ }
+ }
+ }
+
+ int firsttime = 0;
+ while (!ARDOUR_UI::instance()->video_timeline->check_server()) {
+ if (firsttime++) {
+ warning << _("Could not connect to the Video Server. Start it or configure its access URL in Edit -> Preferences.") << endmsg;
+ }
+ VideoServerDialog *video_server_dialog = new VideoServerDialog (_session);
+ if (float_window) {
+ video_server_dialog->set_transient_for (*float_window);
+ }
+
+ if (!Config->get_show_video_server_dialog() && firsttime < 2) {
+ video_server_dialog->hide();
+ } else {
+ ResponseType r = (ResponseType) video_server_dialog->run ();
+ video_server_dialog->hide();
+ if (r != RESPONSE_ACCEPT) { return false; }
+ if (video_server_dialog->show_again()) {
+ Config->set_show_video_server_dialog(false);
+ }
+ }
+
+ std::string icsd_exec = video_server_dialog->get_exec_path();
+ std::string icsd_docroot = video_server_dialog->get_docroot();
+ if (icsd_docroot.empty()) {icsd_docroot = "/";}
+
+ struct stat sb;
+ if (!lstat (icsd_docroot.c_str(), &sb) == 0 || !S_ISDIR(sb.st_mode)) {
+ warning << _("Specified docroot is not an existing directory.") << endmsg;
+ continue;
+ }
+ if ( (!lstat (icsd_exec.c_str(), &sb) == 0)
+ || (sb.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)) == 0 ) {
+ warning << _("Given Video Server is not an executable file.") << endmsg;
+ continue;
+ }
+
+ char **argp;
+ argp=(char**) calloc(9,sizeof(char*));
+ argp[0] = strdup(icsd_exec.c_str());
+ argp[1] = strdup("-P");
+ argp[2] = (char*) calloc(16,sizeof(char)); snprintf(argp[2], 16, "%s", video_server_dialog->get_listenaddr().c_str());
+ argp[3] = strdup("-p");
+ argp[4] = (char*) calloc(6,sizeof(char)); snprintf(argp[4], 6, "%i", video_server_dialog->get_listenport());
+ argp[5] = strdup("-C");
+ argp[6] = (char*) calloc(6,sizeof(char)); snprintf(argp[6], 6, "%i", video_server_dialog->get_cachesize());
+ argp[7] = strdup(icsd_docroot.c_str());
+ argp[8] = 0;
+ stop_video_server();
+
+ std::ostringstream osstream;
+ osstream << "http://localhost:" << video_server_dialog->get_listenport() << "/";
+ Config->set_video_server_url(osstream.str());
+ Config->set_video_server_docroot(icsd_docroot);
+ video_server_process = new SystemExec(icsd_exec, argp);
+ video_server_process->start();
+ sleep(1);
+ }
+ return true;
+}
+
+void
+ARDOUR_UI::add_video (Gtk::Window* float_window)
+{
+ if (!_session) {
+ return;
+ }
+
+ if (!start_video_server(float_window, false)) {
+ warning << _("Could not connect to the Video Server. Start it or configure its access URL in Edit -> Preferences.") << endmsg;
+ return;
+ }
+
+ if (add_video_dialog == 0) {
+ add_video_dialog = new AddVideoDialog (_session);
+ if (float_window) {
+ add_video_dialog->set_transient_for (*float_window);
+ }
+ }
+
+ if (add_video_dialog->is_visible()) {
+ /* we're already doing this */
+ return;
+ }
+ ResponseType r = (ResponseType) add_video_dialog->run ();
+ add_video_dialog->hide();
+ if (r != RESPONSE_ACCEPT) { return; }
+
+ bool local_file;
+ std::string path = add_video_dialog->file_name(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)) {
+ warning << string_compose(_("could not open %1"), path) << endmsg;
+ return;
+ }
+ if (!local_file && path.length() == 0) {
+ warning << _("no video-file selected") << endmsg;
+ return;
+ }
+
+ switch (add_video_dialog->import_option()) {
+ case VTL_IMPORT_COPY:
+ {
+ VideoCopyDialog *video_copy_dialog;
+ video_copy_dialog = new VideoCopyDialog(_session, path);
+ //video_copy_dialog->setup_non_interactive_copy();
+ ResponseType r = (ResponseType) video_copy_dialog->run ();
+ video_copy_dialog->hide();
+ if (r != RESPONSE_ACCEPT) { return; }
+ path = video_copy_dialog->get_filename();
+ delete video_copy_dialog;
+ }
+ break;
+ case VTL_IMPORT_TRANSCODE:
+ {
+ TranscodeVideoDialog *transcode_video_dialog;
+ transcode_video_dialog = new TranscodeVideoDialog (_session, path);
+ ResponseType r = (ResponseType) transcode_video_dialog->run ();
+ transcode_video_dialog->hide();
+ if (r != RESPONSE_ACCEPT) { return; }
+ path = transcode_video_dialog->get_filename();
+ if (!transcode_video_dialog->get_audiofile().empty()) {
+ editor->embed_audio_from_video(transcode_video_dialog->get_audiofile());
+ }
+ delete transcode_video_dialog;
+ }
+ break;
+ default:
+ case VTL_IMPORT_NONE:
+ break;
+ }
+
+ if (path.empty()) {
+ /* may have been overriden by 'audio only import'
+ * in transcode_video_dialog */
+ path = add_video_dialog->file_name(local_file);;
+ }
+
+ /* strip _session->session_directory().video_path() from video file if possible */
+ if (local_file && !path.compare(0, _session->session_directory().video_path().size(), _session->session_directory().video_path())) {
+ path=path.substr(_session->session_directory().video_path().size());
+ if (path.at(0) == G_DIR_SEPARATOR) {
+ path=path.substr(1);
+ }
+ }
+
+ video_timeline->set_update_session_fps(auto_set_session_fps);
+ if (video_timeline->video_file_info(path, local_file)) {
+ XMLNode* node = new XMLNode(X_("Videotimeline"));
+ 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"));
+ _session->add_extra_xml (*node);
+ _session->set_dirty ();
+
+ if (add_video_dialog->launch_xjadeo() && local_file) {
+ editor->set_xjadeo_sensitive(true);
+ editor->toggle_xjadeo_proc(1);
+ } else {
+ editor->toggle_xjadeo_proc(0);
+ }
+ editor->toggle_ruler_video(true);
+ }
+}
+
+void
+ARDOUR_UI::flush_videotimeline_cache (bool localcacheonly)
+{
+ if (localcacheonly) {
+ video_timeline->vmon_update();
+ } else {
+ video_timeline->flush_cache();
+ }
+ editor->queue_visual_videotimeline_update();
+}
+#endif
+
XMLNode*
ARDOUR_UI::mixer_settings () const
{
@@ -3502,6 +3758,9 @@ ARDOUR_UI::update_transport_clocks (framepos_t pos)
if (big_clock_window->get()) {
big_clock->set (pos);
}
+#ifdef WITH_VIDEOTIMELINE
+ ARDOUR_UI::instance()->video_timeline->manual_seek_video_monitor(pos);
+#endif
}