X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fexport_range_markers_dialog.cc;h=06f590758c7d7602f27723e70fd960697e6d4d97;hb=8560c029f084cc3ff26e08077e62bb7e49f26b81;hp=e43eb20cd1963cd23032e91b77ea8a18e02f72b2;hpb=912da52a539981193941d8739fa6f103b5e406db;p=ardour.git diff --git a/gtk2_ardour/export_range_markers_dialog.cc b/gtk2_ardour/export_range_markers_dialog.cc index e43eb20cd1..06f590758c 100644 --- a/gtk2_ardour/export_range_markers_dialog.cc +++ b/gtk2_ardour/export_range_markers_dialog.cc @@ -22,8 +22,10 @@ #include -#include -#include +#include "pbd/filesystem.h" + +#include "ardour/audioengine.h" +#include "ardour/sndfile_helpers.h" #include "ardour_ui.h" #include "export_range_markers_dialog.h" @@ -35,18 +37,26 @@ using namespace ARDOUR; using namespace PBD; using namespace std; -ExportRangeMarkersDialog::ExportRangeMarkersDialog (PublicEditor& editor) +ExportRangeMarkersDialog::ExportRangeMarkersDialog (PublicEditor& editor) : ExportDialog(editor) -{ +{ + set_title (_("Export Ranges")); + file_frame.set_label (_("Export to Directory")); + do_not_allow_export_cd_markers(); - + total_duration = 0; current_range_marker_index = 0; } - - -void -ExportRangeMarkersDialog::export_audio_data () + +Gtk::FileChooserAction +ExportRangeMarkersDialog::browse_action () const +{ + return Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER; +} + +void +ExportRangeMarkersDialog::export_data () { getSession().locations()->apply(*this, &ExportRangeMarkersDialog::process_range_markers_export); } @@ -57,7 +67,7 @@ ExportRangeMarkersDialog::process_range_markers_export(Locations::LocationList& Locations::LocationList::iterator locationIter; current_range_marker_index = 0; init_progress_computing(locations); - + for (locationIter = locations.begin(); locationIter != locations.end(); ++locationIter) { Location *currentLocation = (*locationIter); @@ -67,34 +77,34 @@ ExportRangeMarkersDialog::process_range_markers_export(Locations::LocationList& get_selected_file_name(), currentLocation->name(), sndfile_file_ending_from_string(get_selected_header_format())); - + initSpec(filepath); - + spec.start_frame = currentLocation->start(); spec.end_frame = currentLocation->end(); - getSession().request_locate(spec.start_frame, false); - - if (getSession().start_audio_export(spec)){ - // if export fails + if (getSession().start_export(spec)){ + // if export fails return; } // wait until export of this range finished gtk_main_iteration(); - while(spec.running){ + + while (spec.running){ if(gtk_events_pending()){ gtk_main_iteration(); }else { usleep(10000); } } - - getSession().engine().freewheel (false); + current_range_marker_index++; + + getSession().stop_export (spec); } } - + spec.running = false; } @@ -109,27 +119,26 @@ ExportRangeMarkersDialog::get_target_filepath(string path, string filename, stri string target_filepath = target_path + filename + postfix; struct stat statbuf; - + for(int counter=1; (stat (target_filepath.c_str(), &statbuf) == 0); counter++){ - // while file exists + // while file exists ostringstream scounter; scounter.flush(); scounter << counter; - - target_filepath = + + target_filepath = target_path + filename + "_" + scounter.str() + postfix; } - + return target_filepath; } - bool ExportRangeMarkersDialog::is_filepath_valid(string &filepath) { // sanity check file name first struct stat statbuf; - + if (filepath.empty()) { // warning dialog string txt = _("Please enter a valid target directory."); @@ -137,54 +146,50 @@ ExportRangeMarkersDialog::is_filepath_valid(string &filepath) msg.run(); return false; } - - if ( (stat (filepath.c_str(), &statbuf) != 0) || + + if ( (stat (filepath.c_str(), &statbuf) != 0) || (!S_ISDIR (statbuf.st_mode)) ) { - string txt = _("Please select an existing target directory. Files\n" - "are not allowed!"); - MessageDialog msg (*this, txt, false, MESSAGE_ERROR, BUTTONS_OK, true); - msg.run(); - return false; + string txt = _("Please select an existing target directory. Files are not allowed!"); + MessageDialog msg (*this, txt, false, MESSAGE_ERROR, BUTTONS_OK, true); + msg.run(); + return false; } - + // directory needs to exist and be writable string dirpath = Glib::path_get_dirname (filepath); - if (::access (dirpath.c_str(), W_OK) != 0) { + if (!exists_and_writable (sys::path (dirpath))) { string txt = _("Cannot write file in: ") + dirpath; MessageDialog msg (*this, txt, false, MESSAGE_ERROR, BUTTONS_OK, true); msg.run(); return false; } - + return true; } - void ExportRangeMarkersDialog::init_progress_computing(Locations::LocationList& locations) { // flush vector range_markers_durations_aggregated.resize(0); - - jack_nframes_t duration_before_current_location = 0; + + framecnt_t duration_before_current_location = 0; Locations::LocationList::iterator locationIter; - + for (locationIter = locations.begin(); locationIter != locations.end(); ++locationIter) { Location *currentLocation = (*locationIter); - + if(currentLocation->is_range_marker()){ - range_markers_durations_aggregated.push_back( - duration_before_current_location); - - jack_nframes_t duration = - currentLocation->end() - currentLocation->start(); - - range_markers_durations.push_back(duration); - duration_before_current_location += duration; + range_markers_durations_aggregated.push_back (duration_before_current_location); + + framecnt_t duration = currentLocation->end() - currentLocation->start(); + + range_markers_durations.push_back (duration); + duration_before_current_location += duration; } } - total_duration = duration_before_current_location; + total_duration = duration_before_current_location; } @@ -192,17 +197,15 @@ gint ExportRangeMarkersDialog::progress_timeout () { double progress = 0.0; - - if(current_range_marker_index >= range_markers_durations.size()){ + + if (current_range_marker_index >= range_markers_durations.size()){ progress = 1.0; - } - else{ - progress = - ((double) range_markers_durations_aggregated[current_range_marker_index] + - (spec.progress * (double) range_markers_durations[current_range_marker_index])) / + } else{ + progress = ((double) range_markers_durations_aggregated[current_range_marker_index] + + (spec.progress * (double) range_markers_durations[current_range_marker_index])) / (double) total_duration; } - + set_progress_fraction( progress ); return TRUE; }