From 8cbb9727e959a744057de387a293aecdce09a62c Mon Sep 17 00:00:00 2001 From: Sakari Bergen Date: Sun, 17 Mar 2013 12:32:48 +0200 Subject: Handle mutiple export files with the same extension but different format. If multiple filenames have the same extension, append the format name to the filename. This still requires a bit of extra logic to be optimal, as the format name will now be added in some situations where it is not needed. However, this is better than producing a broken file... --- libs/ardour/ardour/export_filename.h | 1 + libs/ardour/ardour/export_format_specification.h | 2 +- libs/ardour/ardour/export_handler.h | 1 + libs/ardour/export_filename.cc | 7 +++++++ libs/ardour/export_format_specification.cc | 8 ++++++-- libs/ardour/export_graph_builder.cc | 2 +- libs/ardour/export_handler.cc | 22 ++++++++++++++++++++++ 7 files changed, 39 insertions(+), 4 deletions(-) (limited to 'libs') diff --git a/libs/ardour/ardour/export_filename.h b/libs/ardour/ardour/export_filename.h index b5f0bde234..994f584e8d 100644 --- a/libs/ardour/ardour/export_filename.h +++ b/libs/ardour/ardour/export_filename.h @@ -92,6 +92,7 @@ class ExportFilename { bool include_session; bool include_revision; bool include_channel_config; + bool include_format_name; bool include_channel; bool include_timespan; bool include_time; diff --git a/libs/ardour/ardour/export_format_specification.h b/libs/ardour/ardour/export_format_specification.h index 286aa58353..fc03eb94b0 100644 --- a/libs/ardour/ardour/export_format_specification.h +++ b/libs/ardour/ardour/export_format_specification.h @@ -64,7 +64,7 @@ class ExportFormatSpecification : public ExportFormatBase { ExportFormatSpecification (Session & s, XMLNode const & state); public: - ExportFormatSpecification (ExportFormatSpecification const & other); + ExportFormatSpecification (ExportFormatSpecification const & other, bool modify_name = true); ~ExportFormatSpecification (); /* compatibility */ diff --git a/libs/ardour/ardour/export_handler.h b/libs/ardour/ardour/export_handler.h index 235219e2f5..d4dd5627f7 100644 --- a/libs/ardour/ardour/export_handler.h +++ b/libs/ardour/ardour/export_handler.h @@ -106,6 +106,7 @@ class ExportHandler : public ExportElementFactory private: + void handle_duplicate_format_extensions(); int process (framecnt_t frames); Session & session; diff --git a/libs/ardour/export_filename.cc b/libs/ardour/export_filename.cc index a5b0a07a60..9e126ed087 100644 --- a/libs/ardour/export_filename.cc +++ b/libs/ardour/export_filename.cc @@ -49,6 +49,7 @@ ExportFilename::ExportFilename (Session & session) : include_session (false), include_revision (false), include_channel_config (false), + include_format_name (false), include_channel (false), include_timespan (true), // Include timespan name always include_time (false), @@ -206,6 +207,12 @@ ExportFilename::get_path (ExportFormatSpecPtr format) const filename_empty = false; } + if (include_format_name) { + path += filename_empty ? "" : "_"; + path += format->name(); + filename_empty = false; + } + path += "."; path += format->extension (); diff --git a/libs/ardour/export_format_specification.cc b/libs/ardour/export_format_specification.cc index ce61babcbf..b139faeee2 100644 --- a/libs/ardour/export_format_specification.cc +++ b/libs/ardour/export_format_specification.cc @@ -189,13 +189,17 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s, XMLNode const set_state (state); } -ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification const & other) +ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification const & other, bool modify_name) : ExportFormatBase(other) , session (other.session) , _silence_beginning (other.session) , _silence_end (other.session) { - set_name (other.name() + " (copy)"); + if (modify_name) { + set_name (other.name() + " (copy)"); + } else { + set_name (other.name()); + } _format_name = other._format_name; has_sample_format = other.has_sample_format; diff --git a/libs/ardour/export_graph_builder.cc b/libs/ardour/export_graph_builder.cc index cc7992ecd2..c7875c0b9b 100644 --- a/libs/ardour/export_graph_builder.cc +++ b/libs/ardour/export_graph_builder.cc @@ -129,7 +129,7 @@ ExportGraphBuilder::add_config (FileSpec const & config) // If the sample rate is "session rate", change it to the real value. // However, we need to copy it to not change the config which is saved... FileSpec new_config (config); - new_config.format.reset(new ExportFormatSpecification(*new_config.format)); + new_config.format.reset(new ExportFormatSpecification(*new_config.format, false)); if(new_config.format->sample_rate() == ExportFormatBase::SR_Session) { framecnt_t session_rate = session.nominal_frame_rate(); new_config.format->set_sample_rate(ExportFormatBase::nearest_sample_rate(session_rate)); diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc index d93ec7779a..4a6b0552c5 100644 --- a/libs/ardour/export_handler.cc +++ b/libs/ardour/export_handler.cc @@ -171,6 +171,7 @@ ExportHandler::start_timespan () timespan_bounds = config_map.equal_range (current_timespan); graph_builder->reset (); graph_builder->set_current_timespan (current_timespan); + handle_duplicate_format_extensions(); for (ConfigMap::iterator it = timespan_bounds.first; it != timespan_bounds.second; ++it) { // Filenames can be shared across timespans FileSpec & spec = it->second; @@ -186,6 +187,27 @@ ExportHandler::start_timespan () session.start_audio_export (process_position); } +void +ExportHandler::handle_duplicate_format_extensions() +{ + typedef std::map ExtCountMap; + + ExtCountMap counts; + for (ConfigMap::iterator it = timespan_bounds.first; it != timespan_bounds.second; ++it) { + counts[it->second.format->extension()]++; + } + + bool duplicates_found = false; + for (ExtCountMap::iterator it = counts.begin(); it != counts.end(); ++it) { + if (it->second > 1) { duplicates_found = true; } + } + + // Set this always, as the filenames are shared... + for (ConfigMap::iterator it = timespan_bounds.first; it != timespan_bounds.second; ++it) { + it->second.filename->include_format_name = duplicates_found; + } +} + int ExportHandler::process (framecnt_t frames) { -- cgit v1.2.3