summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-02-27 23:17:26 +0100
committerRobin Gareus <robin@gareus.org>2015-02-28 02:36:58 +0100
commitc90400364a6d057fc101ceff30b07f4b6863cd84 (patch)
tree1b68128236e91c3731c232ddf1f8af4359a79ad9
parentc0411de949bf3cd1cd9c975efd8618e89f7ae46f (diff)
prepare saving video-export settings.
* migrate dialog from Editor to UI. * make it a WM proxied window * prepare applying state after construction..
-rw-r--r--gtk2_ardour/ardour_ui.cc34
-rw-r--r--gtk2_ardour/ardour_ui.h3
-rw-r--r--gtk2_ardour/ardour_ui_ed.cc2
-rw-r--r--gtk2_ardour/editor.cc2
-rw-r--r--gtk2_ardour/editor.h1
-rw-r--r--gtk2_ardour/editor_videotimeline.cc24
-rw-r--r--gtk2_ardour/export_video_dialog.cc145
-rw-r--r--gtk2_ardour/export_video_dialog.h9
-rw-r--r--gtk2_ardour/public_editor.h1
9 files changed, 131 insertions, 90 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index c9ef1387af..99a1541054 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -105,6 +105,8 @@ typedef uint64_t microseconds_t;
#include "big_clock_window.h"
#include "bundle_manager.h"
#include "engine_dialog.h"
+#include "export_video_dialog.h"
+#include "export_video_infobox.h"
#include "gain_meter.h"
#include "global_port_matrix.h"
#include "gui_object.h"
@@ -206,6 +208,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, location_ui (X_("locations"), _("Locations"))
, route_params (X_("inspector"), _("Tracks and Busses"))
, audio_midi_setup (X_("audio-midi-setup"), _("Audio/MIDI Setup"))
+ , export_video_dialog (X_("video-export"), _("Video Export Dialog"))
, session_option_editor (X_("session-options-editor"), _("Properties"), boost::bind (&ARDOUR_UI::create_session_option_editor, this))
, add_video_dialog (X_("add-video"), _("Add Tracks/Busses"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this))
, bundle_manager (X_("bundle-manager"), _("Bundle Manager"), boost::bind (&ARDOUR_UI::create_bundle_manager, this))
@@ -358,6 +361,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
big_clock_window.set_state (*ui_xml);
audio_port_matrix.set_state (*ui_xml);
midi_port_matrix.set_state (*ui_xml);
+ export_video_dialog.set_state (*ui_xml);
}
WM::Manager::instance().register_window (&key_editor);
@@ -369,6 +373,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
WM::Manager::instance().register_window (&add_video_dialog);
WM::Manager::instance().register_window (&route_params);
WM::Manager::instance().register_window (&audio_midi_setup);
+ WM::Manager::instance().register_window (&export_video_dialog);
WM::Manager::instance().register_window (&bundle_manager);
WM::Manager::instance().register_window (&location_ui);
WM::Manager::instance().register_window (&big_clock_window);
@@ -2439,6 +2444,10 @@ ARDOUR_UI::save_state (const string & name, bool switch_to_it)
_session->add_extra_xml (*node);
+ if (export_video_dialog) {
+ _session->add_extra_xml (export_video_dialog->get_state());
+ }
+
save_state_canfail (name, switch_to_it);
}
@@ -3821,6 +3830,8 @@ ARDOUR_UI::remove_video ()
_session->add_extra_xml(*node);
node = new XMLNode(X_("Videomonitor"));
_session->add_extra_xml(*node);
+ node = new XMLNode(X_("Videoexport"));
+ _session->add_extra_xml(*node);
stop_video_server();
}
@@ -3835,6 +3846,29 @@ ARDOUR_UI::flush_videotimeline_cache (bool localcacheonly)
editor->queue_visual_videotimeline_update();
}
+void
+ARDOUR_UI::export_video (bool range)
+{
+ if (ARDOUR::Config->get_show_video_export_info()) {
+ ExportVideoInfobox infobox (_session);
+ Gtk::ResponseType rv = (Gtk::ResponseType) infobox.run();
+ if (infobox.show_again()) {
+ ARDOUR::Config->set_show_video_export_info(false);
+ }
+ switch (rv) {
+ case GTK_RESPONSE_YES:
+ PBD::open_uri (ARDOUR::Config->get_reference_manual_url() + "/video-timeline/operations/#export");
+ break;
+ default:
+ break;
+ }
+ }
+ export_video_dialog->set_session (_session);
+ export_video_dialog->apply_state(editor->get_selection().time, range);
+ export_video_dialog->run ();
+ export_video_dialog->hide ();
+}
+
XMLNode*
ARDOUR_UI::mixer_settings () const
{
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 0e039e55d1..0124d3c8f2 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -73,6 +73,7 @@
#include "ardour_window.h"
#include "editing.h"
#include "engine_dialog.h"
+#include "export_video_dialog.h"
#include "meterbridge.h"
#include "ui_config.h"
#include "enums.h"
@@ -243,6 +244,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
bool start_video_server (Gtk::Window* float_window, bool popup_msg);
void stop_video_server (bool ask_confirm=false);
void flush_videotimeline_cache (bool localcacheonly=false);
+ void export_video (bool range = false);
void session_add_audio_track (
int input_channels,
@@ -624,6 +626,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
WM::Proxy<LocationUIWindow> location_ui;
WM::Proxy<RouteParams_UI> route_params;
WM::Proxy<EngineControl> audio_midi_setup;
+ WM::Proxy<ExportVideoDialog> export_video_dialog;
/* Windows/Dialogs that require a creator method */
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index ed0ea95c43..50798f9d6b 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -138,7 +138,7 @@ ARDOUR_UI::install_actions ()
sigc::mem_fun (*this, &ARDOUR_UI::remove_video));
act->set_sensitive (false);
act = ActionManager::register_action (main_actions, X_("ExportVideo"), _("Export To Video File"),
- hide_return (sigc::bind (sigc::mem_fun(*editor, &PublicEditor::export_video), false)));
+ hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::export_video), false)));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), false));
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index a66972a7e9..1b00ba9652 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -1878,7 +1878,7 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items)
edit_items.push_back (MenuElem (_("Bounce Range to Region List With Processing"), sigc::bind (sigc::mem_fun(*this, &Editor::bounce_range_selection), false, true)));
edit_items.push_back (MenuElem (_("Export Range..."), sigc::mem_fun(*this, &Editor::export_selection)));
if (ARDOUR_UI::instance()->video_timeline->get_duration() > 0) {
- edit_items.push_back (MenuElem (_("Export Video Range..."), sigc::bind (sigc::mem_fun(*this, &Editor::export_video), true)));
+ edit_items.push_back (MenuElem (_("Export Video Range..."), sigc::bind (sigc::mem_fun(*(ARDOUR_UI::instance()), &ARDOUR_UI::export_video), true)));
}
}
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 6fd2c7d96a..86d6126892 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -994,7 +994,6 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void toggle_ruler_video (bool onoff) {ruler_video_action->set_active(onoff);}
int videotl_bar_height; /* in units of timebar_height; default: 4 */
int get_videotl_bar_height () const { return videotl_bar_height; }
- void export_video (bool range = false);
void toggle_region_video_lock ();
friend class EditorCursor;
diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc
index 259e3e36e1..c4987bceb5 100644
--- a/gtk2_ardour/editor_videotimeline.cc
+++ b/gtk2_ardour/editor_videotimeline.cc
@@ -32,7 +32,6 @@
#include "audio_time_axis.h"
#include "video_image_frame.h"
#include "export_video_dialog.h"
-#include "export_video_infobox.h"
#include "interthread_progress_window.h"
#include "pbd/openuri.h"
@@ -105,26 +104,3 @@ Editor::embed_audio_from_video (std::string path, framepos_t n, bool lock_positi
import_status.all_done = true;
::g_unlink(path.c_str());
}
-
-void
-Editor::export_video (bool range)
-{
- if (ARDOUR::Config->get_show_video_export_info()) {
- ExportVideoInfobox infobox (_session);
- Gtk::ResponseType rv = (Gtk::ResponseType) infobox.run();
- if (infobox.show_again()) {
- ARDOUR::Config->set_show_video_export_info(false);
- }
- switch (rv) {
- case GTK_RESPONSE_YES:
- PBD::open_uri (ARDOUR::Config->get_reference_manual_url() + "/video-timeline/operations/#export");
- break;
- default:
- break;
- }
- }
- ExportVideoDialog dialog (_session, get_selection().time, range);
- Gtk::ResponseType r = (Gtk::ResponseType) dialog.run();
- (void) r; // keep gcc quiet
- dialog.hide();
-}
diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc
index 5aa26ea508..139371b21c 100644
--- a/gtk2_ardour/export_video_dialog.cc
+++ b/gtk2_ardour/export_video_dialog.cc
@@ -63,9 +63,8 @@ using namespace PBD;
using namespace ARDOUR;
using namespace VideoUtils;
-ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme, bool range)
+ExportVideoDialog::ExportVideoDialog ()
: ArdourDialog (_("Export Video File "))
- , export_range (tme)
, outfn_path_label (_("File:"), Gtk::ALIGN_LEFT)
, outfn_browse_button (_("Browse"))
, invid_path_label (_("Video:"), Gtk::ALIGN_LEFT)
@@ -90,8 +89,6 @@ ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme, bool range
, debug_checkbox (_("Debug Mode: Print ffmpeg command and output to stdout."))
#endif
{
- set_session (s);
-
set_name ("ExportVideoDialog");
set_modal (true);
set_skip_taskbar_hint (true);
@@ -144,53 +141,7 @@ ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme, bool range
insnd_combo.set_name ("PaddedButton");
insnd_combo.append_text (string_compose (_("from the %1 session's start to the session's end"), PROGRAM_NAME));
-
- frameoffset_t av_offset = ARDOUR_UI::instance()->video_timeline->get_offset();
- if (av_offset < 0 ) {
- insnd_combo.append_text (_("from 00:00:00:00 to the video's end"));
- } else {
- insnd_combo.append_text (_("from the video's start to the video's end"));
- }
- if (!export_range.empty()) {
- insnd_combo.append_text (_("Selected range")); // TODO show export_range.start() -> export_range.end_frame()
- }
- if (range) {
- insnd_combo.set_active(2);
- } else {
- insnd_combo.set_active(0);
- }
-
outfn_path_entry.set_width_chars(38);
- outfn_path_entry.set_text (_session->session_directory().export_path() + G_DIR_SEPARATOR +"export.avi");
-
- XMLNode* node = _session->extra_xml (X_("Videotimeline"));
- if (node) {
- bool filenameset = false;
- if (node->property(X_("OriginalVideoFile"))) {
- std::string filename = node->property(X_("OriginalVideoFile"))->value();
- if (Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) {
- invid_path_entry.set_text (filename);
- filenameset = true;
- }
- }
- if (!filenameset
- && node->property(X_("Filename"))
- && node->property(X_("LocalFile"))
- && node->property(X_("LocalFile"))->value() == X_("1")
- ) {
- std::string filename = node->property(X_("Filename"))->value();
- if (filename.at(0) != G_DIR_SEPARATOR) {
- filename = Glib::build_filename (_session->session_directory().video_path(), filename);
- }
- if (Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) {
- invid_path_entry.set_text (filename);
- filenameset = true;
- }
- }
- if (!filenameset) {
- invid_path_entry.set_text (X_(""));
- }
- }
l = manage (new Label (_("<b>Settings:</b>"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false));
l->set_use_markup ();
@@ -306,16 +257,6 @@ ExportVideoDialog::ExportVideoDialog (Session* s, TimeSelection &tme, bool range
fps_combo.append_text("30");
fps_combo.append_text("59.94");
fps_combo.append_text("60");
- float tcfps = _session->timecode_frames_per_second();
- if (fabs(tcfps - 23.976) < 0.01) { fps_combo.set_active(0); }
- else if (fabs(tcfps - 24.0 ) < 0.01) { fps_combo.set_active(1); }
- else if (fabs(tcfps - 24.976) < 0.01) { fps_combo.set_active(2); }
- else if (fabs(tcfps - 25.0 ) < 0.01) { fps_combo.set_active(3); }
- else if (fabs(tcfps - 29.97 ) < 0.01) { fps_combo.set_active(4); }
- else if (fabs(tcfps - 30.0 ) < 0.01) { fps_combo.set_active(5); }
- else if (fabs(tcfps - 59.94 ) < 0.01) { fps_combo.set_active(6); }
- else if (fabs(tcfps - 60.0 ) < 0.01) { fps_combo.set_active(7); }
- else { fps_combo.set_active(5); }
aspect_combo.set_name ("PaddedButton");
aspect_combo.append_text("4:3");
@@ -358,6 +299,90 @@ ExportVideoDialog::~ExportVideoDialog ()
if (transcoder) { delete transcoder; transcoder = 0;}
}
+
+void
+ExportVideoDialog::apply_state (TimeSelection &tme, bool range)
+{
+ export_range = tme;
+ outfn_path_entry.set_text (_session->session_directory().export_path() + G_DIR_SEPARATOR +"export.avi");
+
+ frameoffset_t av_offset = ARDOUR_UI::instance()->video_timeline->get_offset();
+ if (av_offset < 0 ) {
+ insnd_combo.append_text (_("from 00:00:00:00 to the video's end"));
+ } else {
+ insnd_combo.append_text (_("from the video's start to the video's end"));
+ }
+ if (!export_range.empty()) {
+ insnd_combo.append_text (_("Selected range")); // TODO show export_range.start() -> export_range.end_frame()
+ }
+ if (range) {
+ insnd_combo.set_active(2);
+ } else {
+ insnd_combo.set_active(0);
+ }
+
+ float tcfps = _session->timecode_frames_per_second();
+ if (fabs(tcfps - 23.976) < 0.01) { fps_combo.set_active(0); }
+ else if (fabs(tcfps - 24.0 ) < 0.01) { fps_combo.set_active(1); }
+ else if (fabs(tcfps - 24.976) < 0.01) { fps_combo.set_active(2); }
+ else if (fabs(tcfps - 25.0 ) < 0.01) { fps_combo.set_active(3); }
+ else if (fabs(tcfps - 29.97 ) < 0.01) { fps_combo.set_active(4); }
+ else if (fabs(tcfps - 30.0 ) < 0.01) { fps_combo.set_active(5); }
+ else if (fabs(tcfps - 59.94 ) < 0.01) { fps_combo.set_active(6); }
+ else if (fabs(tcfps - 60.0 ) < 0.01) { fps_combo.set_active(7); }
+ else { fps_combo.set_active(5); }
+
+ XMLNode* node = _session->extra_xml (X_("Videotimeline"));
+ if (node) {
+ bool filenameset = false;
+ if (node->property(X_("OriginalVideoFile"))) {
+ std::string filename = node->property(X_("OriginalVideoFile"))->value();
+ if (Glib::file_test(filename, Glib::FILE_TEST_EXISTS)) {
+ invid_path_entry.set_text (filename);
+ filenameset = true;
+ }
+ }
+ if (!filenameset
+ && node->property(X_("Filename"))
+ && node->property(X_("LocalFile"))
+ && node->property(X_("LocalFile"))->value() == X_("1")
+ )
+ {
+ std::string filename = node->property(X_("Filename"))->value();
+ if (filename.at(0) != G_DIR_SEPARATOR)
+ {
+ filename = Glib::build_filename (_session->session_directory().video_path(), filename);
+ }
+ if (Glib::file_test(filename, Glib::FILE_TEST_EXISTS))
+ {
+ invid_path_entry.set_text (filename);
+ filenameset = true;
+ }
+ }
+ if (!filenameset) {
+ invid_path_entry.set_text (X_(""));
+ }
+ }
+
+ node = _session->extra_xml (X_("Videoexport"));
+ if (node) {
+ if (node->property(X_("OriginalVideoFile"))) {
+ }
+ }
+}
+
+XMLNode&
+ExportVideoDialog::get_state ()
+{
+ XMLNode* node = new XMLNode (X_("Videoexport"));
+ return *node;
+}
+
+void
+ExportVideoDialog::set_state (const XMLNode &)
+{
+}
+
void
ExportVideoDialog::on_show ()
{
diff --git a/gtk2_ardour/export_video_dialog.h b/gtk2_ardour/export_video_dialog.h
index 117446c6a6..16e5cf7486 100644
--- a/gtk2_ardour/export_video_dialog.h
+++ b/gtk2_ardour/export_video_dialog.h
@@ -41,13 +41,18 @@
class ExportVideoDialog : public ArdourDialog , public PBD::ScopedConnectionList
{
public:
- ExportVideoDialog (ARDOUR::Session*, TimeSelection &tme, bool range = false);
+ ExportVideoDialog ();
~ExportVideoDialog ();
std::string get_exported_filename () { return outfn_path_entry.get_text(); }
+ void apply_state(TimeSelection &tme, bool range);
+
+ XMLNode& get_state ();
+ void set_state (const XMLNode &);
+
private:
- TimeSelection &export_range;
+ TimeSelection export_range;
void on_show ();
void abort_clicked ();
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index e580ac0ec3..42758e156f 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -303,7 +303,6 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual int get_videotl_bar_height () const = 0;
virtual void set_video_timeline_height (const int h) = 0;
virtual void embed_audio_from_video (std::string, framepos_t n = 0, bool lock_position_to_video = true) = 0;
- virtual void export_video (bool range = false) = 0;
virtual RouteTimeAxisView* get_route_view_by_route_id (const PBD::ID& id) const = 0;