From 9d72c26b7353ce3bc8ee38f06de59ae68588ee20 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 5 Mar 2006 19:45:12 +0000 Subject: add new files for export dialogs git-svn-id: svn://localhost/trunk/ardour2@350 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/export_range_markers_dialog.cc | 209 +++++++++++++++++++++++++++++ gtk2_ardour/export_range_markers_dialog.h | 62 +++++++++ gtk2_ardour/export_region_dialog.cc | 69 ++++++++++ gtk2_ardour/export_region_dialog.h | 43 ++++++ gtk2_ardour/export_session_dialog.cc | 56 ++++++++ gtk2_ardour/export_session_dialog.h | 37 +++++ 6 files changed, 476 insertions(+) create mode 100644 gtk2_ardour/export_range_markers_dialog.cc create mode 100644 gtk2_ardour/export_range_markers_dialog.h create mode 100644 gtk2_ardour/export_region_dialog.cc create mode 100644 gtk2_ardour/export_region_dialog.h create mode 100644 gtk2_ardour/export_session_dialog.cc create mode 100644 gtk2_ardour/export_session_dialog.h diff --git a/gtk2_ardour/export_range_markers_dialog.cc b/gtk2_ardour/export_range_markers_dialog.cc new file mode 100644 index 0000000000..07ce651e62 --- /dev/null +++ b/gtk2_ardour/export_range_markers_dialog.cc @@ -0,0 +1,209 @@ +/* + Copyright (C) 2006 Paul Davis + Author: Andre Raue + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include + +#include + +#include +#include + +#include + +#include "ardour_ui.h" +#include "export_range_markers_dialog.h" + +#include "i18n.h" + +using namespace Gtk; +using namespace ARDOUR; +using namespace std; + +ExportRangeMarkersDialog::ExportRangeMarkersDialog (PublicEditor& editor) + : ExportDialog(editor) +{ + do_not_allow_export_cd_markers(); + + total_duration = 0; + current_range_marker_index = 0; +} + + +void +ExportRangeMarkersDialog::export_audio_data () +{ + getSession().locations()->apply(*this, &ExportRangeMarkersDialog::process_range_markers_export); +} + +void +ExportRangeMarkersDialog::process_range_markers_export(Locations::LocationList& locations) +{ + Locations::LocationList::iterator locationIter; + current_range_marker_index = 0; + init_progress_computing(locations); + + for (locationIter = locations.begin(); locationIter != locations.end(); ++locationIter) { + Location *currentLocation = (*locationIter); + + if(currentLocation->is_range_marker()){ + // init filename + string filepath = get_target_filepath( + 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 + return; + } + + // wait until export of this range finished + gtk_main_iteration(); + while(spec.running){ + if(gtk_events_pending()){ + gtk_main_iteration(); + }else { + usleep(10000); + } + } + + getSession().engine().freewheel (false); + current_range_marker_index++; + } + } + + spec.running = false; +} + + +string +ExportRangeMarkersDialog::get_target_filepath(string path, string filename, string postfix) +{ + string target_path = path; + if ((target_path.find_last_of ('/')) != string::npos) { + target_path += '/'; + } + + 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 + ostringstream scounter; + scounter.flush(); + scounter << counter; + + 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."); + MessageDialog msg (*this, txt, false, MESSAGE_ERROR, BUTTONS_OK, true); + msg.run(); + return false; + } + + 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; + } + + // directory needs to exist and be writable + string dirpath = PBD::dirname (filepath); + if (::access (dirpath.c_str(), W_OK) != 0) { + 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; + 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; + } + } + + total_duration = duration_before_current_location; +} + + +gint +ExportRangeMarkersDialog::progress_timeout () +{ + double progress = 0.0; + + 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])) / + (double) total_duration; + } + + set_progress_fraction( progress ); + return TRUE; +} diff --git a/gtk2_ardour/export_range_markers_dialog.h b/gtk2_ardour/export_range_markers_dialog.h new file mode 100644 index 0000000000..a69e2b749b --- /dev/null +++ b/gtk2_ardour/export_range_markers_dialog.h @@ -0,0 +1,62 @@ +/* + Copyright (C) 2006 Andre Raue + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __export_range_markers_dialog_h__ +#define __export_range_markers_dialog_h__ + +#include + +#include "export_dialog.h" + + +class ExportRangeMarkersDialog : public ExportDialog +{ + public: + ExportRangeMarkersDialog (PublicEditor&); + + protected: + virtual bool is_filepath_valid(string &filepath); + + void export_audio_data(); + + private: + // keeps the duration of all range_markers before the current + vector range_markers_durations_aggregated; + vector range_markers_durations; + // duration of all range markers + jack_nframes_t total_duration; + // index of range marker, that get's exported right now + unsigned int current_range_marker_index; + + // sets value of progress bar + virtual gint progress_timeout (); + + // initializes range_markers_durations_aggregated, range_markers_durations + // and total_duration + void init_progress_computing(ARDOUR::Locations::LocationList& locations); + + // searches for a filename like "." in path, that + // does not exist + string get_target_filepath(string path, string filename, string postfix); + + void process_range_markers_export(ARDOUR::Locations::LocationList&); +}; + + +#endif // __export_range_markers_dialog_h__ diff --git a/gtk2_ardour/export_region_dialog.cc b/gtk2_ardour/export_region_dialog.cc new file mode 100644 index 0000000000..97bf7c22b1 --- /dev/null +++ b/gtk2_ardour/export_region_dialog.cc @@ -0,0 +1,69 @@ +/* + Copyright (C) 2006 Paul Davis + Author: Andre Raue + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include + +#include "export_region_dialog.h" + +#include "i18n.h" + + +ExportRegionDialog::ExportRegionDialog (PublicEditor& editor, ARDOUR::AudioRegion* region) + : ExportDialog(editor) +{ + audio_region = region; + + do_not_allow_track_and_master_selection(); + do_not_allow_channel_count_selection(); +} + + +void +ExportRegionDialog::export_audio_data() +{ + pthread_t thr; + pthread_create_and_store ("region export", &thr, 0, ExportRegionDialog::_export_region_thread, this); + + gtk_main_iteration (); + while (spec.running) { + if (gtk_events_pending()) { + gtk_main_iteration (); + } else { + usleep (10000); + } + } +} + + +void* +ExportRegionDialog::_export_region_thread (void *arg) +{ + PBD::ThreadCreated (pthread_self(), X_("Export Region")); + + static_cast(arg)->export_region (); + return 0; +} + +void +ExportRegionDialog::export_region () +{ + audio_region->exportme (getSession(), spec); +} diff --git a/gtk2_ardour/export_region_dialog.h b/gtk2_ardour/export_region_dialog.h new file mode 100644 index 0000000000..00464eb5b3 --- /dev/null +++ b/gtk2_ardour/export_region_dialog.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2006 Andre Raue + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __export_region_dialog_h__ +#define __export_region_dialog_h__ + +#include "ardour_ui.h" +#include "export_dialog.h" + + +class ExportRegionDialog : public ExportDialog +{ + public: + ExportRegionDialog (PublicEditor&, ARDOUR::AudioRegion*); + + static void* _export_region_thread (void *); + void export_region (); + + protected: + void export_audio_data(); + + private: + ARDOUR::AudioRegion* audio_region; +}; + + +#endif // __export_region_dialog_h__ diff --git a/gtk2_ardour/export_session_dialog.cc b/gtk2_ardour/export_session_dialog.cc new file mode 100644 index 0000000000..3c09efc0e6 --- /dev/null +++ b/gtk2_ardour/export_session_dialog.cc @@ -0,0 +1,56 @@ +/* + Copyright (C) 2006 Paul Davis + Author: Andre Raue + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "ardour_ui.h" +#include "export_session_dialog.h" + + +ExportSessionDialog::ExportSessionDialog (PublicEditor& editor) + : ExportDialog(editor) +{ +} + + +void +ExportSessionDialog::export_audio_data () +{ + if (getSession().start_audio_export (spec)) { + return; + } + + gtk_main_iteration (); + while (spec.running) { + if (gtk_events_pending()) { + gtk_main_iteration (); + } else { + usleep (10000); + } + } +} + + +void +ExportSessionDialog::set_range (jack_nframes_t start, jack_nframes_t end) +{ + ExportDialog::set_range (start, end); + + // XXX: this is a hack until we figure out what is really wrong + getSession().request_locate (spec.start_frame, false); +} diff --git a/gtk2_ardour/export_session_dialog.h b/gtk2_ardour/export_session_dialog.h new file mode 100644 index 0000000000..707989444a --- /dev/null +++ b/gtk2_ardour/export_session_dialog.h @@ -0,0 +1,37 @@ +/* + Copyright (C) 2006 Andre Raue + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __export_session_dialog_h__ +#define __export_session_dialog_h__ + +#include "export_dialog.h" + + +class ExportSessionDialog : public ExportDialog +{ + public: + ExportSessionDialog (PublicEditor&); + void set_range (jack_nframes_t start, jack_nframes_t end); + + protected: + void export_audio_data(); +}; + + +#endif // __export_session_dialog_h__ -- cgit v1.2.3