X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fexport_dialog.cc;h=2922edf1179313e4490850d55ab3c2a0e72309a9;hb=15433457f2d81b50a576ffa3aca2bf311edd2370;hp=db3bbaf7968983de57804ce7289c46bd37509953;hpb=ebd00236f876125e2b548fded78aee0801f71844;p=ardour.git diff --git a/gtk2_ardour/export_dialog.cc b/gtk2_ardour/export_dialog.cc index db3bbaf796..2922edf117 100644 --- a/gtk2_ardour/export_dialog.cc +++ b/gtk2_ardour/export_dialog.cc @@ -24,14 +24,17 @@ #include #include "ardour/audioregion.h" +#include "ardour/export_channel_configuration.h" #include "ardour/export_status.h" #include "ardour/export_handler.h" +#include "ardour/profile.h" #include "export_dialog.h" +#include "export_report.h" #include "gui_thread.h" #include "nag.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace PBD; @@ -94,9 +97,13 @@ ExportDialog::set_session (ARDOUR::Session* s) preset_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::sync_with_manager)); 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)); + channel_selector->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_realtime_selection)); file_notebook->CriticalSelectionChanged.connect (sigc::mem_fun (*this, &ExportDialog::update_warnings_and_example_filename)); update_warnings_and_example_filename (); + update_realtime_selection (); + + _session->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&ExportDialog::parameter_changed, this, _1), gui_context()); } void @@ -129,11 +136,11 @@ ExportDialog::init () 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)); export_button->signal_clicked().connect (sigc::mem_fun (*this, &ExportDialog::do_export)); + file_notebook->soundcloud_export_selector = soundcloud_selector; + /* Done! */ show_all_children (); @@ -151,11 +158,12 @@ ExportDialog::init_gui () 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); 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); @@ -168,13 +176,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(); @@ -184,7 +193,7 @@ ExportDialog::notify_errors () void ExportDialog::close_dialog () { - if (status->running) { + if (status->running ()) { status->abort(); } @@ -201,6 +210,7 @@ ExportDialog::sync_with_manager () file_notebook->sync_with_manager (); update_warnings_and_example_filename (); + update_realtime_selection (); } void @@ -241,6 +251,47 @@ ExportDialog::update_warnings_and_example_filename () file_notebook->update_example_filenames(); } +void +ExportDialog::update_realtime_selection () +{ + bool rt_ok = true; + switch (profile_manager->type ()) { + case ExportProfileManager::RegularExport: + break; + case ExportProfileManager::RangeExport: + break; + case ExportProfileManager::SelectionExport: + break; + case ExportProfileManager::RegionExport: + if (!profile_manager->get_channel_configs().empty ()) { + switch (profile_manager->get_channel_configs().front()->config->region_processing_type ()) { + case RegionExportChannelFactory::Raw: + case RegionExportChannelFactory::Fades: + rt_ok = false; + break; + default: + break; + } + } + break; + case ExportProfileManager::StemExport: + if (! static_cast(channel_selector.get())->track_output ()) { + rt_ok = false; + } + break; + } + + timespan_selector->allow_realtime_export (rt_ok); +} + +void +ExportDialog::parameter_changed (std::string const& p) +{ + if (p == "realtime-export") { + update_realtime_selection (); + } +} + void ExportDialog::show_conflicting_files () { @@ -257,18 +308,47 @@ ExportDialog::show_conflicting_files () dialog.run(); } +void +ExportDialog::soundcloud_upload_progress(double total, double now, std::string title) +{ + soundcloud_selector->do_progress_callback(total, now, title); + +} + void ExportDialog::do_export () { - profile_manager->prepare_for_export (); - handler->do_export (); - 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 ExportDialog::show_progress () { - status->running = true; + export_notebook.set_sensitive (false); cancel_button->set_label (_("Stop Export")); export_button->set_sensitive (false); @@ -281,43 +361,71 @@ ExportDialog::show_progress () gtk_main_iteration (); - while (status->running) { + while (status->running ()) { if (gtk_events_pending()) { gtk_main_iteration (); } else { - usleep (10000); + Glib::usleep (10000); } } - if (!status->aborted()) { + status->finish (); + + if (!status->aborted() && status->result_map.size() > 0) { + hide(); + ExportReport er (_session, status); + er.run(); + } - NagScreen* ns = NagScreen::maybe_nag (_("export")); - - if (ns) { - ns->nag (); - delete ns; + if (!status->aborted()) { + hide(); + if (!ARDOUR::Profile->get_mixbus()) { + NagScreen* ns = NagScreen::maybe_nag (_("export")); + if (ns) { + ns->nag (); + delete ns; + } } } else { notify_errors (); } - - status->finish (); + export_notebook.set_sensitive (true); } gint ExportDialog::progress_timeout () { std::string status_text; - float progress = 0.0; - if (status->normalizing) { + float progress = -1; + switch (status->active_job) { + case ExportStatus::Exporting: + 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; + break; + case ExportStatus::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)"), + break; + case ExportStatus::Encoding: + status_text = string_compose (_("Encoding '%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 = ((float) status->current_normalize_cycle) / status->total_normalize_cycles; + break; + case ExportStatus::Tagging: + status_text = string_compose (_("Tagging '%3' (timespan %1 of %2)"), + status->timespan, status->total_timespans, status->timespan_name); + break; + case ExportStatus::Uploading: + status_text = string_compose (_("Uploading '%3' (timespan %1 of %2)"), + status->timespan, status->total_timespans, status->timespan_name); + break; + case ExportStatus::Command: + status_text = string_compose (_("Running Post Export Command for '%1'"), status->timespan_name); + break; } + progress_bar.set_text (status_text); if (progress < previous_progress) { @@ -327,7 +435,12 @@ ExportDialog::progress_timeout () } previous_progress = progress; - progress_bar.set_fraction (progress); + if (progress >= 0) { + progress_bar.set_fraction (progress); + } else { + progress_bar.set_pulse_step(.1); + progress_bar.pulse(); + } return TRUE; } @@ -370,6 +483,7 @@ 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 ()); } @@ -383,6 +497,7 @@ 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 ()); } @@ -407,6 +522,7 @@ 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 ()); } @@ -422,5 +538,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 ()); }