X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Fexport_handler.cc;h=20abc80de1995866ff8befb89228d04bd1e83845;hb=1b24aad933a850f61d7442778134a001b2002ec2;hp=ef9d32474abf5130ae02c758436d566f53e55f3c;hpb=d17918e32e36011cff47405243a320197f72c564;p=ardour.git diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc index ef9d32474a..20abc80de1 100644 --- a/libs/ardour/export_handler.cc +++ b/libs/ardour/export_handler.cc @@ -20,21 +20,20 @@ #include "ardour/export_handler.h" +#include #include #include #include "pbd/convert.h" -#include "pbd/filesystem.h" -#include "ardour/ardour.h" -#include "ardour/configuration.h" +#include "ardour/audiofile_tagger.h" #include "ardour/export_graph_builder.h" #include "ardour/export_timespan.h" #include "ardour/export_channel_configuration.h" #include "ardour/export_status.h" #include "ardour/export_format_specification.h" #include "ardour/export_filename.h" -#include "ardour/export_failed.h" +#include "ardour/session_metadata.h" #include "i18n.h" @@ -106,7 +105,6 @@ ExportHandler::ExportHandler (Session & session) , session (session) , graph_builder (new ExportGraphBuilder (session)) , export_status (session.get_export_status ()) - , realtime (false) , normalizing (false) , cue_tracknum (0) , cue_indexnum (0) @@ -115,23 +113,23 @@ ExportHandler::ExportHandler (Session & session) ExportHandler::~ExportHandler () { - // TODO remove files that were written but not finsihed + // TODO remove files that were written but not finished } +/** Add an export to the `to-do' list */ bool ExportHandler::add_export_config (ExportTimespanPtr timespan, ExportChannelConfigPtr channel_config, ExportFormatSpecPtr format, ExportFilenamePtr filename, BroadcastInfoPtr broadcast_info) { FileSpec spec (channel_config, format, filename, broadcast_info); - ConfigPair pair (timespan, spec); - config_map.insert (pair); + config_map.insert (make_pair (timespan, spec)); return true; } void -ExportHandler::do_export (bool rt) +ExportHandler::do_export () { /* Count timespans */ @@ -147,7 +145,6 @@ ExportHandler::do_export (bool rt) /* Start export */ - realtime = rt; start_timespan (); } @@ -162,13 +159,22 @@ ExportHandler::start_timespan () return; } + /* finish_timespan pops the config_map entry that has been done, so + this is the timespan to do this time + */ current_timespan = config_map.begin()->first; + + export_status->total_frames_current_timespan = current_timespan->get_length(); + export_status->timespan_name = current_timespan->name(); + export_status->processed_frames_current_timespan = 0; /* Register file configurations to graph builder */ + /* Here's the config_map entries that use this 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; @@ -181,7 +187,28 @@ ExportHandler::start_timespan () normalizing = false; session.ProcessExport.connect_same_thread (process_connection, boost::bind (&ExportHandler::process, this, _1)); process_position = current_timespan->get_start(); - session.start_audio_export (process_position, realtime); + 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 @@ -215,8 +242,7 @@ ExportHandler::process_timespan (framecnt_t frames) process_position += frames_to_read; export_status->processed_frames += frames_to_read; - export_status->progress = (float) export_status->processed_frames / - export_status->total_frames; + export_status->processed_frames_current_timespan += frames_to_read; /* Do actual processing */ int ret = graph_builder->process (frames_to_read, last_cycle); @@ -246,8 +272,6 @@ ExportHandler::process_normalize () export_status->normalizing = true; } - export_status->progress = (float) export_status->current_normalize_cycle / - export_status->total_normalize_cycles; export_status->current_normalize_cycle++; return 0; @@ -259,13 +283,18 @@ ExportHandler::finish_timespan () while (config_map.begin() != timespan_bounds.second) { ExportFormatSpecPtr fmt = config_map.begin()->second.format; + std::string filename = config_map.begin()->second.filename->get_path(fmt); if (fmt->with_cue()) { - export_cd_marker_file (current_timespan, fmt, config_map.begin()->second.filename->get_path(fmt), CDMarkerCUE); - } + export_cd_marker_file (current_timespan, fmt, filename, CDMarkerCUE); + } if (fmt->with_toc()) { - export_cd_marker_file (current_timespan, fmt, config_map.begin()->second.filename->get_path(fmt), CDMarkerTOC); + export_cd_marker_file (current_timespan, fmt, filename, CDMarkerTOC); + } + + if (fmt->tag()) { + AudiofileTagger::tag_file(filename, *SessionMetadata::Metadata()); } config_map.erase (config_map.begin()); @@ -394,10 +423,10 @@ ExportHandler::export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSp } catch (std::exception& e) { error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg; - ::unlink (filepath.c_str()); + ::g_unlink (filepath.c_str()); } catch (Glib::Exception& e) { error << string_compose (_("an error occured while writing a TOC/CUE file: %1"), e.what()) << endmsg; - ::unlink (filepath.c_str()); + ::g_unlink (filepath.c_str()); } } @@ -424,7 +453,7 @@ ExportHandler::write_cue_header (CDMarkerStatus & status) { string title = status.timespan->name().compare ("Session") ? status.timespan->name() : (string) session.name(); - status.out << "REM Cue file generated by Ardour" << endl; + status.out << "REM Cue file generated by " << PROGRAM_NAME << endl; status.out << "TITLE " << cue_escape_cdtext (title) << endl; /* The original cue sheet sepc metions five file types