Normalize API rename part 2
[ardour.git] / gtk2_ardour / export_dialog.cc
index 8916806a15907a9c276cc0725a0528a76525aca5..6b9d74e7bffb968dedbe4fa5fc4084875d4faf88 100644 (file)
 #include <gtkmm/messagedialog.h>
 
 #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,80 +136,38 @@ 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 ();
        progress_widget.hide_all();
 }
 
-void
-ExportDialog::expanded_changed ()
-{
-       set_resizable(advanced->get_expanded());
-}
-
 void
 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::VPaned * advanced_paned = Gtk::manage (new Gtk::VPaned());
-
-       Gtk::VBox* timespan_vbox = Gtk::manage (new Gtk::VBox());
-       timespan_vbox->set_spacing (12);
-       timespan_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, 0, 18, 0);
-       timespan_vbox->pack_start (*timespan_label, false, false, 0);
-       timespan_vbox->pack_start (*timespan_align, true, true, 0);
-       advanced_paned->pack1(*timespan_vbox, true, false);
-
-       Gtk::VBox* channels_vbox = Gtk::manage (new Gtk::VBox());
-       channels_vbox->set_spacing (12);
-       channels_vbox->set_border_width (12);
-
-       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);
-       channels_vbox->pack_start (*channels_label, false, false, 0);
-       channels_vbox->pack_start (*channels_align, true, true, 0);
-       advanced_paned->pack2(*channels_vbox, channel_selector_is_expandable(), false);
-
-       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);
-
-       advanced = Gtk::manage (new Gtk::Expander (_("Time span and channel options")));
-       advanced->property_expanded().signal_changed().connect(
-               sigc::mem_fun(*this, &ExportDialog::expanded_changed));
-       advanced->add (*advanced_paned);
-
-       if (channel_selector_is_expandable()) {
-               advanced_sizegroup = Gtk::SizeGroup::create(Gtk::SIZE_GROUP_VERTICAL);
-               advanced_sizegroup->add_widget(*timespan_selector);
-               advanced_sizegroup->add_widget(*channel_selector);
-       }
 
-       get_vbox()->pack_start (*advanced, true, true);
+       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);
+
+       export_notebook.append_page (*file_format_selector, _("File format"));
+       export_notebook.append_page (*timespan_selector, _("Time Span"));
+       export_notebook.append_page (*channel_selector, _("Channels"));
 
-       Pango::AttrList bold;
-       Pango::Attribute b = Pango::Attribute::create_attr_weight (Pango::WEIGHT_BOLD);
-       bold.insert (b);
+       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
@@ -211,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();
@@ -227,7 +193,7 @@ ExportDialog::notify_errors ()
 void
 ExportDialog::close_dialog ()
 {
-       if (status->running) {
+       if (status->running ()) {
                status->abort();
        }
 
@@ -244,6 +210,7 @@ ExportDialog::sync_with_manager ()
        file_notebook->sync_with_manager ();
 
        update_warnings_and_example_filename ();
+       update_realtime_selection ();
 }
 
 void
@@ -284,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<TrackExportChannelSelector*>(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 ()
 {
@@ -300,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);
@@ -324,7 +361,7 @@ ExportDialog::show_progress ()
 
        gtk_main_iteration ();
 
-       while (status->running) {
+       while (status->running ()) {
                if (gtk_events_pending()) {
                        gtk_main_iteration ();
                } else {
@@ -332,35 +369,63 @@ ExportDialog::show_progress ()
                }
        }
 
-       if (!status->aborted()) {
+       status->finish ();
 
-               NagScreen* ns = NagScreen::maybe_nag (_("export"));
-               
-               if (ns) {
-                       ns->nag ();
-                       delete ns;
+       if (!status->aborted() && status->result_map.size() > 0) {
+               hide();
+               ExportReport er (_session, status);
+               er.run();
+       }
+
+       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) {
-               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 {
+       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_postprocessing_cycle) / status->total_postprocessing_cycles;
+               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->current_postprocessing_cycle) / status->total_postprocessing_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) {
@@ -370,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;
 }
 
@@ -413,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 ());
 }
 
@@ -426,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 ());
 }
 
@@ -439,8 +511,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
@@ -451,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 ());
 }
 
@@ -466,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 ());
 }