summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_audio_import.cc
diff options
context:
space:
mode:
authorSampo Savolainen <v2@iki.fi>2008-02-15 06:41:22 +0000
committerSampo Savolainen <v2@iki.fi>2008-02-15 06:41:22 +0000
commite58375fddab92aa423ed104ac7954982c18d580a (patch)
tree4a5980755f80f344e01542bd515b4799b41e56b2 /gtk2_ardour/editor_audio_import.cc
parent9a9595bcfe153a11cd1224bbd7face68de662053 (diff)
Make import GUI report if you are importing a file of a name that
already exists in the session. Legwork to allow updating existing source files via the import dialog. Fix bug which caused the current import logic to select existing file name as target file when importing. This caused the newly imported file to be concatenated after the original data. git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3059 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_audio_import.cc')
-rw-r--r--gtk2_ardour/editor_audio_import.cc295
1 files changed, 202 insertions, 93 deletions
diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc
index 971b77acef..fa14e2b88f 100644
--- a/gtk2_ardour/editor_audio_import.cc
+++ b/gtk2_ardour/editor_audio_import.cc
@@ -42,6 +42,7 @@
#include <ardour/audiofilesource.h>
#include <ardour/region_factory.h>
#include <ardour/source_factory.h>
+#include <ardour/session.h>
#include <pbd/memento_command.h>
#include "ardour_ui.h"
@@ -114,60 +115,139 @@ Editor::external_audio_dialog ()
sfbrowser->show_all ();
- again:
- int response = sfbrowser->run ();
- switch (response) {
- case RESPONSE_APPLY:
- // leave the dialog open
- break;
+ bool keepRunning;
- case RESPONSE_OK:
- sfbrowser->hide ();
- break;
+ do {
+ keepRunning = false;
- default:
- // cancel from the browser - we are done
- sfbrowser->hide ();
- return;
- }
+ int response = sfbrowser->run ();
- /* lets do it */
-
- paths = sfbrowser->get_paths ();
+ switch (response) {
+ case RESPONSE_APPLY:
+ // leave the dialog open
+ break;
- ImportPosition pos = sfbrowser->get_position ();
- ImportMode mode = sfbrowser->get_mode ();
- ImportDisposition chns = sfbrowser->get_channel_disposition ();
- nframes64_t where;
+ case RESPONSE_OK:
+ sfbrowser->hide ();
+ break;
- switch (pos) {
- case ImportAtEditPoint:
- where = get_preferred_edit_position ();
- break;
- case ImportAtTimestamp:
- where = -1;
- break;
- case ImportAtPlayhead:
- where = playhead_cursor->current_frame;
- break;
- case ImportAtStart:
- where = session->current_start_frame();
- break;
- }
+ default:
+ // cancel from the browser - we are done
+ sfbrowser->hide ();
+ return;
+ }
- SrcQuality quality = sfbrowser->get_src_quality();
+ /* lets do it */
+
+ paths = sfbrowser->get_paths ();
+
+ ImportPosition pos = sfbrowser->get_position ();
+ ImportMode mode = sfbrowser->get_mode ();
+ ImportDisposition chns = sfbrowser->get_channel_disposition ();
+ nframes64_t where;
+
+ switch (pos) {
+ case ImportAtEditPoint:
+ where = get_preferred_edit_position ();
+ break;
+ case ImportAtTimestamp:
+ where = -1;
+ break;
+ case ImportAtPlayhead:
+ where = playhead_cursor->current_frame;
+ break;
+ case ImportAtStart:
+ where = session->current_start_frame();
+ break;
+ }
- if (sfbrowser->copy_files_btn.get_active()) {
- do_import (paths, chns, mode, quality, where);
- } else {
- do_embed (paths, chns, mode, where);
+ SrcQuality quality = sfbrowser->get_src_quality();
+
+
+ if (sfbrowser->copy_files_btn.get_active()) {
+ do_import (paths, chns, mode, quality, where);
+ } else {
+ do_embed (paths, chns, mode, where);
+ }
+
+ if (response == RESPONSE_APPLY) {
+ sfbrowser->clear_selection ();
+ keepRunning = true;
+ }
+
+ } while (keepRunning);
+}
+
+typedef std::map<PBD::ID,boost::shared_ptr<AudioSource> > AudioSourceList;
+
+/**
+ * Updating is still disabled, see note in libs/ardour/import.cc Session::import_audiofiles()
+ *
+ * all_or_nothing:
+ * true = show "Update", "Import" and "Skip"
+ * false = show "Import", and "Cancel"
+ *
+ * Returns:
+ * 0 To update an existing source of the same name
+ * 1 To import/embed the file normally (make sure the new name will be unique)
+ * 2 If the user wants to skip this file
+ **/
+int
+Editor::check_whether_and_how_to_import(string path, bool all_or_nothing)
+{
+ string wave_name (basename(path.c_str()));
+
+ AudioSourceList all_sources = session->get_audio_sources();
+ bool wave_name_exists = false;
+
+ for (AudioSourceList::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
+ boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
+
+ string tmp (basename(afs->path().c_str()));
+
+ if (tmp == wave_name) {
+ wave_name_exists = true;
+ break;
+ }
}
- if (response == RESPONSE_APPLY) {
- sfbrowser->clear_selection ();
- goto again;
+ int function = 1;
+
+
+ if (wave_name_exists) {
+ string message;
+ if (all_or_nothing) {
+ // updating is still disabled
+ //message = string_compose(_("The session already contains a source file named %1. Do you want to update that file (and thus all regions using the file) or import this file as a new file?"),wave_name);
+ message = string_compose(_("The session already contains a source file named %1. This file will be imported as a new file, please confirm."),wave_name);
+ } else {
+ message = _("Lorem ipsum. Do you want to skidaddle?");
+
+ }
+ MessageDialog dialog(message, false,Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_NONE, true);
+
+ if (all_or_nothing) {
+ // disabled
+ //dialog.add_button("Update", 0);
+ dialog.add_button("Import", 1);
+ dialog.add_button("Skip", 2);
+ } else {
+ dialog.add_button("Import", 1);
+ dialog.add_button("Cancel", 2);
+ }
+
+
+ //dialog.add_button("Skip all", 4); // All or rest?
+
+ dialog.show();
+
+ function = dialog.run ();
+
+ dialog.hide();
}
+
+ return function;
}
boost::shared_ptr<AudioTrack>
@@ -205,79 +285,107 @@ Editor::do_import (vector<ustring> paths, ImportDisposition chns, ImportMode mod
{
boost::shared_ptr<AudioTrack> track;
vector<ustring> to_import;
- bool ok = false;
+ bool ok = true;
int nth = 0;
if (interthread_progress_window == 0) {
build_interthread_progress_window ();
}
- switch (chns) {
- case Editing::ImportDistinctFiles:
- for (vector<ustring>::iterator a = paths.begin(); a != paths.end(); ++a) {
-
- to_import.clear ();
- to_import.push_back (*a);
- if (mode == Editing::ImportToTrack) {
- track = get_nth_selected_audio_track (nth++);
- }
-
- if (import_sndfiles (to_import, mode, quality, pos, 1, -1, track)) {
- goto out;
+ if (chns == Editing::ImportMergeFiles) {
+ /* create 1 region from all paths, add to 1 track,
+ ignore "track"
+ */
+ bool cancel = false;
+ for (vector<ustring>::iterator a = paths.begin(); a != paths.end() && ok; ++a) {
+ int check = check_whether_and_how_to_import(*a, false);
+ if (check == 2) {
+ cancel = true;
+ break;
}
+ }
+ if (!cancel) {
+ if (import_sndfiles (paths, mode, quality, pos, 1, 1, track, false)) {
+ ok = false;
+ }
}
- break;
- case Editing::ImportDistinctChannels:
- for (vector<ustring>::iterator a = paths.begin(); a != paths.end(); ++a) {
+ } else {
+ bool replace;
- to_import.clear ();
- to_import.push_back (*a);
+ for (vector<ustring>::iterator a = paths.begin(); a != paths.end() && ok; ++a) {
- if (import_sndfiles (to_import, mode, quality, pos, -1, -1, track)) {
- goto out;
+ int check = check_whether_and_how_to_import(*a, true);
+
+ if (check == 2 ) {
+ // skip
+ continue;
}
- }
- break;
+ if (check == 0) {
+ fatal << "Updating existing sources should be disabled!" << endl;
+ replace = true;
+ } else if (check == 1) {
+ replace = false;
+ }
+
- case Editing::ImportMergeFiles:
- /* create 1 region from all paths, add to 1 track,
- ignore "track"
- */
- if (import_sndfiles (paths, mode, quality, pos, 1, 1, track)) {
- goto out;
- }
- break;
+ switch (chns) {
+ case Editing::ImportDistinctFiles:
- case Editing::ImportSerializeFiles:
- for (vector<ustring>::iterator a = paths.begin(); a != paths.end(); ++a) {
+ to_import.clear ();
+ to_import.push_back (*a);
- to_import.clear ();
- to_import.push_back (*a);
-
- /* create 1 region from this path, add to 1 track,
- reuse "track" across paths
- */
+ if (mode == Editing::ImportToTrack) {
+ track = get_nth_selected_audio_track (nth++);
+ }
- if (import_sndfiles (to_import, mode, quality, pos, 1, 1, track)) {
- goto out;
+ if (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, replace)) {
+ ok = false;
+ }
+
+ break;
+
+ case Editing::ImportDistinctChannels:
+
+ to_import.clear ();
+ to_import.push_back (*a);
+
+ if (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, replace)) {
+ ok = false;
+ }
+
+ break;
+
+ case Editing::ImportSerializeFiles:
+
+ to_import.clear ();
+ to_import.push_back (*a);
+
+ /* create 1 region from this path, add to 1 track,
+ reuse "track" across paths
+ */
+
+ if (import_sndfiles (to_import, mode, quality, pos, 1, 1, track, replace)) {
+ ok = false;
+ }
+
+ break;
+
+ case Editing::ImportMergeFiles:
+ // Not entered
+ break;
}
+ }
+ if (ok) {
+ session->save_state ("");
}
- break;
- }
- ok = true;
-
- out:
- if (ok) {
- session->save_state ("");
+ interthread_progress_window->hide_all ();
}
-
- interthread_progress_window->hide_all ();
}
bool
@@ -365,7 +473,7 @@ Editor::_do_embed (vector<ustring> paths, ImportDisposition chns, ImportMode mod
int
Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality quality, nframes64_t& pos,
- int target_regions, int target_tracks, boost::shared_ptr<AudioTrack>& track)
+ int target_regions, int target_tracks, boost::shared_ptr<AudioTrack>& track, bool replace)
{
WindowTitle title = string_compose (_("importing %1"), paths.front());
@@ -382,6 +490,7 @@ Editor::import_sndfiles (vector<ustring> paths, ImportMode mode, SrcQuality qual
import_status.freeze = false;
import_status.done = 0.0;
import_status.quality = quality;
+ import_status.replace_existing_source = replace;
interthread_progress_connection = Glib::signal_timeout().connect
(bind (mem_fun(*this, &Editor::import_progress_timeout), (gpointer) 0), 100);