summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorSakari Bergen <sakari.bergen@beatwaves.net>2013-03-17 12:32:48 +0200
committerSakari Bergen <sakari.bergen@beatwaves.net>2013-03-17 12:32:48 +0200
commit8cbb9727e959a744057de387a293aecdce09a62c (patch)
treec7f6fb66b7057dff243ee68364d6778941817a53 /libs/ardour
parent2d081e43e197851636c0da3ed46a7b0be97120b0 (diff)
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...
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/export_filename.h1
-rw-r--r--libs/ardour/ardour/export_format_specification.h2
-rw-r--r--libs/ardour/ardour/export_handler.h1
-rw-r--r--libs/ardour/export_filename.cc7
-rw-r--r--libs/ardour/export_format_specification.cc8
-rw-r--r--libs/ardour/export_graph_builder.cc2
-rw-r--r--libs/ardour/export_handler.cc22
7 files changed, 39 insertions, 4 deletions
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<std::string, int> 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)
{