X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fexport_dialog.cc;h=4ee9ddf8edd0864d8cf449102f11263007ee0b78;hb=1211278a2b368a4acc0e26ae5f064544b4b1ffec;hp=77e75ab0a5eeb0c865102eaafe674e463050459d;hpb=8e35583358e7df6f0f950463612740b2a8cdffb1;p=ardour.git diff --git a/gtk2_ardour/export_dialog.cc b/gtk2_ardour/export_dialog.cc index 77e75ab0a5..4ee9ddf8ed 100644 --- a/gtk2_ardour/export_dialog.cc +++ b/gtk2_ardour/export_dialog.cc @@ -21,7 +21,7 @@ #include -#include "pbd/filesystem.h" +#include #include "ardour/audioregion.h" #include "ardour/export_status.h" @@ -29,6 +29,7 @@ #include "export_dialog.h" #include "gui_thread.h" +#include "nag.h" #include "i18n.h" @@ -36,9 +37,9 @@ using namespace ARDOUR; using namespace PBD; using std::string; -ExportDialog::ExportDialog (PublicEditor & editor, std::string title, std::string xml_node_name) +ExportDialog::ExportDialog (PublicEditor & editor, std::string title, ARDOUR::ExportProfileManager::ExportType type) : ArdourDialog (title) - , xml_node_name (xml_node_name) + , type (type) , editor (editor) , warn_label ("", Gtk::ALIGN_LEFT) @@ -62,7 +63,8 @@ ExportDialog::set_session (ARDOUR::Session* s) handler = _session->get_export_handler (); status = _session->get_export_status (); - profile_manager.reset (new ExportProfileManager (*_session, xml_node_name)); + + profile_manager.reset (new ExportProfileManager (*_session, type)); /* Possibly init stuff in derived classes */ @@ -90,13 +92,11 @@ ExportDialog::set_session (ARDOUR::Session* s) /* Warnings */ preset_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::sync_with_manager)); - timespan_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings)); - channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings)); - file_notebook->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings)); - - status->Aborting.connect (abort_connection, invalidator (*this), boost::bind (&ExportDialog::notify_errors, this), gui_context()); + timespan_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename)); + channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename)); + file_notebook->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename)); - update_warnings (); + update_warnings_and_example_filename (); } void @@ -121,22 +121,20 @@ ExportDialog::init () /* Progress indicators */ - progress_widget.pack_start (progress_label, false, false, 6); progress_widget.pack_start (progress_bar, false, false, 6); /* Buttons */ cancel_button = add_button (Gtk::Stock::CANCEL, RESPONSE_CANCEL); - // Realtime export is disabled for now, as it will most probably not work - //rt_export_button = add_button (_("Realtime Export"), RESPONSE_RT); - //fast_export_button = add_button (_("Fast Export"), RESPONSE_FAST); - fast_export_button = add_button (_("Export"), RESPONSE_FAST); + export_button = add_button (_("Export"), RESPONSE_FAST); + set_default_response (RESPONSE_FAST); list_files_button.set_name ("PaddedButton"); cancel_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::close_dialog)); - //rt_export_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::export_rt)); - fast_export_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::export_fw)); + export_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::do_export)); + + file_notebook->soundcloud_export_selector = soundcloud_selector; /* Done! */ @@ -150,41 +148,21 @@ ExportDialog::init_gui () Gtk::Alignment * preset_align = Gtk::manage (new Gtk::Alignment()); preset_align->add (*preset_selector); preset_align->set_padding (0, 12, 0, 0); - get_vbox()->pack_start (*preset_align, false, false, 0); - - Gtk::VBox* advanced_vbox = Gtk::manage (new Gtk::VBox()); - advanced_vbox->set_spacing (12); - advanced_vbox->set_border_width (12); - - Gtk::Alignment * timespan_align = Gtk::manage (new Gtk::Alignment()); - timespan_label = Gtk::manage (new Gtk::Label (_("Time Span"), Gtk::ALIGN_LEFT)); - timespan_align->add (*timespan_selector); - timespan_align->set_padding (0, 12, 18, 0); - advanced_vbox->pack_start (*timespan_label, false, false, 0); - advanced_vbox->pack_start (*timespan_align, false, false, 0); - - Gtk::Alignment * channels_align = Gtk::manage (new Gtk::Alignment()); - channels_label = Gtk::manage (new Gtk::Label (_("Channels"), Gtk::ALIGN_LEFT)); - channels_align->add (*channel_selector); - channels_align->set_padding (0, 12, 18, 0); - advanced_vbox->pack_start (*channels_label, false, false, 0); - advanced_vbox->pack_start (*channels_align, false, false, 0); - - get_vbox()->pack_start (*file_notebook, false, false, 0); - get_vbox()->pack_start (warning_widget, false, false, 0); - get_vbox()->pack_start (progress_widget, false, false, 0); - Gtk::Expander* advanced = Gtk::manage (new Gtk::Expander (_("Advanced options"))); - advanced->add (*advanced_vbox); + Gtk::VBox * file_format_selector = Gtk::manage (new Gtk::VBox()); + file_format_selector->set_homogeneous (false); + file_format_selector->pack_start (*preset_align, false, false, 0); + file_format_selector->pack_start (*file_notebook, false, false, 0); + file_format_selector->pack_start (*soundcloud_selector, false, false, 0); - get_vbox()->pack_start (*advanced, false, false); - - Pango::AttrList bold; - Pango::Attribute b = Pango::Attribute::create_attr_weight (Pango::WEIGHT_BOLD); - bold.insert (b); + export_notebook.append_page (*file_format_selector, _("File format")); + export_notebook.append_page (*timespan_selector, _("Time Span")); + export_notebook.append_page (*channel_selector, _("Channels")); + + get_vbox()->pack_start (export_notebook, true, true, 0); + get_vbox()->pack_end (warning_widget, false, false, 0); + get_vbox()->pack_end (progress_widget, false, false, 0); - timespan_label->set_attributes (bold); - channels_label->set_attributes (bold); } void @@ -193,13 +171,14 @@ ExportDialog::init_components () preset_selector.reset (new ExportPresetSelector ()); timespan_selector.reset (new ExportTimespanSelectorMultiple (_session, profile_manager)); channel_selector.reset (new PortExportChannelSelector (_session, profile_manager)); + soundcloud_selector.reset (new SoundcloudExportSelector ()); file_notebook.reset (new ExportFileNotebook ()); } void -ExportDialog::notify_errors () +ExportDialog::notify_errors (bool force) { - if (status->errors()) { + if (force || status->errors()) { std::string txt = _("Export has been aborted due to an error!\nSee the Log for details."); Gtk::MessageDialog msg (txt, false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); msg.run(); @@ -225,11 +204,11 @@ ExportDialog::sync_with_manager () channel_selector->sync_with_manager(); file_notebook->sync_with_manager (); - update_warnings (); + update_warnings_and_example_filename (); } void -ExportDialog::update_warnings () +ExportDialog::update_warnings_and_example_filename () { /* Reset state */ @@ -239,8 +218,7 @@ ExportDialog::update_warnings () list_files_hbox.hide (); list_files_string = ""; - fast_export_button->set_sensitive (true); - //rt_export_button->set_sensitive (true); + export_button->set_sensitive (true); /* Add new warnings */ @@ -258,9 +236,13 @@ ExportDialog::update_warnings () list_files_hbox.show (); for (std::list::iterator it = warnings->conflicting_filenames.begin(); it != warnings->conflicting_filenames.end(); ++it) { string::size_type pos = it->find_last_of ("/"); - list_files_string += "\n" + it->substr (0, pos + 1) + "" + it->substr (pos + 1) + ""; + list_files_string += it->substr (0, pos + 1) + "" + it->substr (pos + 1) + "\n"; } } + + /* Update example filename */ + + file_notebook->update_example_filenames(); } void @@ -280,19 +262,40 @@ ExportDialog::show_conflicting_files () } void -ExportDialog::export_rt () +ExportDialog::soundcloud_upload_progress(double total, double now, std::string title) { - profile_manager->prepare_for_export (); - handler->do_export (true); - show_progress (); + soundcloud_selector->do_progress_callback(total, now, title); + } void -ExportDialog::export_fw () +ExportDialog::do_export () { - profile_manager->prepare_for_export (); - handler->do_export (false); - show_progress (); + try { + profile_manager->prepare_for_export (); + handler->soundcloud_username = soundcloud_selector->username (); + handler->soundcloud_password = soundcloud_selector->password (); + handler->soundcloud_make_public = soundcloud_selector->make_public (); + handler->soundcloud_open_page = soundcloud_selector->open_page (); + handler->soundcloud_downloadable = soundcloud_selector->downloadable (); + + handler->SoundcloudProgress.connect_same_thread( + *this, + boost::bind(&ExportDialog::soundcloud_upload_progress, this, _1, _2, _3) + ); +#if 0 + handler->SoundcloudProgress.connect( + *this, invalidator (*this), + boost::bind(&ExportDialog::soundcloud_upload_progress, this, _1, _2, _3), + gui_context() + ); +#endif + handler->do_export (); + show_progress (); + } catch(std::exception & e) { + error << string_compose (_("Export initialization failed: %1"), e.what()) << endmsg; + notify_errors(true); + } } void @@ -301,8 +304,7 @@ ExportDialog::show_progress () status->running = true; cancel_button->set_label (_("Stop Export")); - //rt_export_button->set_sensitive (false); - fast_export_button->set_sensitive (false); + export_button->set_sensitive (false); progress_bar.set_fraction (0.0); warning_widget.hide_all(); @@ -311,52 +313,61 @@ ExportDialog::show_progress () progress_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ExportDialog::progress_timeout), 100); gtk_main_iteration (); + while (status->running) { if (gtk_events_pending()) { gtk_main_iteration (); } else { - usleep (10000); + Glib::usleep (10000); } } - + if (!status->aborted()) { - status->finish (); + + NagScreen* ns = NagScreen::maybe_nag (_("export")); + + if (ns) { + ns->nag (); + delete ns; + } + } else { + notify_errors (); } + + status->finish (); } gint ExportDialog::progress_timeout () { - switch (status->stage) { - case export_None: - progress_label.set_text (""); - break; - case export_ReadTimespan: - progress_label.set_text (string_compose (_("Reading timespan %1 of %2"), status->timespan, status->total_timespans)); - break; - case export_PostProcess: - progress_label.set_text (string_compose (_("Processing file %2 of %3 (%1) from timespan %4 of %5"), - file_notebook->get_nth_format_name (status->format), - status->format, status->total_formats, - status->timespan, status->total_timespans)); - break; - case export_Write: - progress_label.set_text (string_compose (_("Encoding file %2 of %3 (%1) from timespan %4 of %5"), - file_notebook->get_nth_format_name (status->format), - status->format, status->total_formats, - status->timespan, status->total_timespans)); - break; + std::string status_text; + float progress = 0.0; + if (status->normalizing) { + status_text = string_compose (_("Normalizing '%3' (timespan %1 of %2)"), + status->timespan, status->total_timespans, status->timespan_name); + progress = ((float) status->current_normalize_cycle) / status->total_normalize_cycles; + } else { + status_text = string_compose (_("Exporting '%3' (timespan %1 of %2)"), + status->timespan, status->total_timespans, status->timespan_name); + progress = ((float) status->processed_frames_current_timespan) / status->total_frames_current_timespan; } + progress_bar.set_text (status_text); - progress_bar.set_fraction (status->progress); + if (progress < previous_progress) { + // Work around gtk bug + progress_bar.hide(); + progress_bar.show(); + } + previous_progress = progress; + + progress_bar.set_fraction (progress); return TRUE; } void ExportDialog::add_error (string const & text) { - fast_export_button->set_sensitive (false); - //rt_export_button->set_sensitive (false); + export_button->set_sensitive (false); if (warn_string.empty()) { warn_string = _("Error: ") + text + ""; @@ -382,7 +393,7 @@ ExportDialog::add_warning (string const & text) /*** Dialog specializations ***/ ExportRangeDialog::ExportRangeDialog (PublicEditor & editor, string range_id) : - ExportDialog (editor, _("Export Range"), X_("RangeExportProfile")), + ExportDialog (editor, _("Export Range"), ExportProfileManager::RangeExport), range_id (range_id) {} @@ -392,11 +403,12 @@ ExportRangeDialog::init_components () preset_selector.reset (new ExportPresetSelector ()); timespan_selector.reset (new ExportTimespanSelectorSingle (_session, profile_manager, range_id)); channel_selector.reset (new PortExportChannelSelector (_session, profile_manager)); + soundcloud_selector.reset (new SoundcloudExportSelector ()); file_notebook.reset (new ExportFileNotebook ()); } ExportSelectionDialog::ExportSelectionDialog (PublicEditor & editor) : - ExportDialog (editor, _("Export Selection"), X_("SelectionExportProfile")) + ExportDialog (editor, _("Export Selection"), ExportProfileManager::SelectionExport) {} void @@ -405,11 +417,12 @@ ExportSelectionDialog::init_components () preset_selector.reset (new ExportPresetSelector ()); timespan_selector.reset (new ExportTimespanSelectorSingle (_session, profile_manager, X_("selection"))); channel_selector.reset (new PortExportChannelSelector (_session, profile_manager)); + soundcloud_selector.reset (new SoundcloudExportSelector ()); file_notebook.reset (new ExportFileNotebook ()); } ExportRegionDialog::ExportRegionDialog (PublicEditor & editor, ARDOUR::AudioRegion const & region, ARDOUR::AudioTrack & track) : - ExportDialog (editor, _("Export Region"), X_("RegionExportProfile")), + ExportDialog (editor, _("Export Region"), ExportProfileManager::RegionExport), region (region), track (track) {} @@ -418,8 +431,7 @@ void ExportRegionDialog::init_gui () { ExportDialog::init_gui (); - - channels_label->set_text (_("Source")); + export_notebook.set_tab_label_text(*export_notebook.get_nth_page(2), _("Source")); } void @@ -430,13 +442,14 @@ ExportRegionDialog::init_components () preset_selector.reset (new ExportPresetSelector ()); timespan_selector.reset (new ExportTimespanSelectorSingle (_session, profile_manager, loc_id)); channel_selector.reset (new RegionExportChannelSelector (_session, profile_manager, region, track)); + soundcloud_selector.reset (new SoundcloudExportSelector ()); file_notebook.reset (new ExportFileNotebook ()); } StemExportDialog::StemExportDialog (PublicEditor & editor) - : ExportDialog(editor, _("Stem Export"), X_("StemExportProfile")) + : ExportDialog(editor, _("Stem Export"), ExportProfileManager::StemExport) { - + } void @@ -445,6 +458,6 @@ StemExportDialog::init_components () preset_selector.reset (new ExportPresetSelector ()); timespan_selector.reset (new ExportTimespanSelectorMultiple (_session, profile_manager)); channel_selector.reset (new TrackExportChannelSelector (_session, profile_manager)); + soundcloud_selector.reset (new SoundcloudExportSelector ()); file_notebook.reset (new ExportFileNotebook ()); } -