X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fexport_profile_manager.cc;h=f924ed17e5a45021a023dcaa4c748d2c0575094c;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=af7f6a73f810cbcaaf8663a177e4395dc59316d7;hpb=1cdf02ae2f3515857880c45be3e22274d281c2cf;p=ardour.git diff --git a/libs/ardour/export_profile_manager.cc b/libs/ardour/export_profile_manager.cc index af7f6a73f8..f924ed17e5 100644 --- a/libs/ardour/export_profile_manager.cc +++ b/libs/ardour/export_profile_manager.cc @@ -23,7 +23,7 @@ #include #include -#include +#include "pbd/gstdio_compat.h" #include #include @@ -34,7 +34,7 @@ #include "ardour/export_profile_manager.h" #include "ardour/export_format_specification.h" -#include "ardour/export_formats_search_path.h" +#include "ardour/search_paths.h" #include "ardour/export_timespan.h" #include "ardour/export_channel_configuration.h" #include "ardour/export_filename.h" @@ -43,11 +43,12 @@ #include "ardour/export_failed.h" #include "ardour/directory_names.h" #include "ardour/filename_extensions.h" +#include "ardour/profile.h" #include "ardour/route.h" #include "ardour/session.h" #include "ardour/broadcast_info.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace Glib; @@ -56,17 +57,34 @@ using namespace PBD; namespace ARDOUR { -ExportProfileManager::ExportProfileManager (Session & s, std::string xml_node_name) - : xml_node_name (xml_node_name) +ExportProfileManager::ExportProfileManager (Session & s, ExportType type) + : type(type) , handler (s.get_export_handler()) , session (s) - , session_range (new Location (s)) , ranges (new LocationList ()) , single_range_mode (false) , format_list (new FormatList ()) { + switch(type) { + case RegularExport: + xml_node_name = X_("ExportProfile"); + break; + case RangeExport: + xml_node_name = X_("RangeExportProfile"); + break; + case SelectionExport: + xml_node_name = X_("SelectionExportProfile"); + break; + case RegionExport: + xml_node_name = X_("RegionExportProfile"); + break; + case StemExport: + xml_node_name = X_("StemExportProfile"); + break; + } + /* Initialize path variables */ export_config_dir = Glib::build_filename (user_config_directory(), export_dir_name); @@ -97,17 +115,22 @@ ExportProfileManager::ExportProfileManager (Session & s, std::string xml_node_na ExportProfileManager::~ExportProfileManager () { - XMLNode * instant_xml (new XMLNode (xml_node_name)); - serialize_profile (*instant_xml); - session.add_instant_xml (*instant_xml, false); + XMLNode * extra_xml (new XMLNode (xml_node_name)); + serialize_profile (*extra_xml); + session.add_extra_xml (*extra_xml); } void ExportProfileManager::load_profile () { - XMLNode * instant_node = session.instant_xml (xml_node_name); - if (instant_node) { - set_state (*instant_node); + XMLNode * extra_node = session.extra_xml (xml_node_name); + /* Legacy sessions used Session instant.xml for this */ + if (!extra_node) { + extra_node = session.instant_xml (xml_node_name); + } + + if (extra_node) { + set_state (*extra_node); } else { XMLNode empty_node (xml_node_name); set_state (empty_node); @@ -139,7 +162,8 @@ ExportProfileManager::prepare_for_export () } // ...and each channel config - filename->include_channel_config = (channel_configs.size() > 1); + filename->include_channel_config = (type == StemExport) || + (channel_configs.size() > 1); for(ChannelConfigStateList::iterator cc_it = channel_configs.begin(); cc_it != channel_configs.end(); ++cc_it) { handler->add_export_config (*ts_it, (*cc_it)->config, (*format_it)->format, filename, b); } @@ -156,9 +180,14 @@ ExportProfileManager::load_preset (ExportPresetPtr preset) if (!preset) { return false; } XMLNode const * state; + /* local state is saved in instant.xml and contains timespan + * and channel config for per session. + * It may not be present for a given preset/session combination + * and is never preset for system-wide presets, but that's OK. + */ if ((state = preset->get_local_state())) { set_local_state (*state); - } else { ok = false; } + } if ((state = preset->get_global_state())) { if (!set_global_state (*state)) { @@ -314,8 +343,7 @@ ExportProfileManager::find_file (std::string const & pattern) { vector found; - Glib::PatternSpec pattern_spec (pattern); - find_matching_files_in_search_path (search_path, pattern_spec, found); + find_files_matching_pattern (found, search_path, pattern); return found; } @@ -366,13 +394,23 @@ ExportProfileManager::init_timespans (XMLNodeList nodes) } if (timespans.empty()) { - TimespanStatePtr state (new TimespanState (session_range, selection_range, ranges)); + TimespanStatePtr state (new TimespanState (selection_range, ranges)); timespans.push_back (state); // Add session as default selection + Location * session_range; + + if (Profile->get_trx()) { + session_range = (session.get_play_loop () ? session.locations()->auto_loop_location () : session.locations()->session_range_location()); + } else { + session_range = session.locations()->session_range_location(); + } + + if (!session_range) { return false; } + ExportTimespanPtr timespan = handler->add_timespan(); timespan->set_name (session_range->name()); - timespan->set_range_id ("session"); + timespan->set_range_id (session_range->id().to_s()); timespan->set_range (session_range->start(), session_range->end()); state->timespans->push_back (timespan); return false; @@ -384,7 +422,7 @@ ExportProfileManager::init_timespans (XMLNodeList nodes) ExportProfileManager::TimespanStatePtr ExportProfileManager::deserialize_timespan (XMLNode & root) { - TimespanStatePtr state (new TimespanState (session_range, selection_range, ranges)); + TimespanStatePtr state (new TimespanState (selection_range, ranges)); XMLProperty const * prop; XMLNodeList spans = root.children ("Range"); @@ -394,23 +432,32 @@ ExportProfileManager::deserialize_timespan (XMLNode & root) if (!prop) { continue; } string id = prop->value(); + Location * location = 0; for (LocationList::iterator it = ranges->begin(); it != ranges->end(); ++it) { - if ((!id.compare ("session") && *it == session_range.get()) || - (!id.compare ("selection") && *it == selection_range.get()) || - (!id.compare ((*it)->id().to_s()))) { - ExportTimespanPtr timespan = handler->add_timespan(); - timespan->set_name ((*it)->name()); - timespan->set_range_id (id); - timespan->set_range ((*it)->start(), (*it)->end()); - state->timespans->push_back (timespan); + if ((id == "selection" && *it == selection_range.get()) || + (id == (*it)->id().to_s())) { + location = *it; + break; } } + + if (!location) { continue; } + + ExportTimespanPtr timespan = handler->add_timespan(); + timespan->set_name (location->name()); + timespan->set_range_id (location->id().to_s()); + timespan->set_range (location->start(), location->end()); + state->timespans->push_back (timespan); } if ((prop = root.property ("format"))) { state->time_format = (TimeFormat) string_2_enum (prop->value(), TimeFormat); } + if (state->timespans->empty()) { + return TimespanStatePtr(); + } + return state; } @@ -421,7 +468,6 @@ ExportProfileManager::serialize_timespan (TimespanStatePtr state) XMLNode * span; update_ranges (); - for (TimespanList::iterator it = state->timespans->begin(); it != state->timespans->end(); ++it) { if ((span = root.add_child ("Range"))) { span->add_property ("id", (*it)->range_id()); @@ -442,11 +488,16 @@ ExportProfileManager::update_ranges () { return; } - /* Session */ - session_range->set_name (_("Session")); - session_range->set (session.current_start_frame(), session.current_end_frame()); - ranges->push_back (session_range.get()); + /* Loop */ + if (session.locations()->auto_loop_location ()) { + ranges->push_back (session.locations()->auto_loop_location ()); + } + + /* Session */ + if (session.locations()->session_range_location()) { + ranges->push_back (session.locations()->session_range_location()); + } /* Selection */ @@ -482,6 +533,8 @@ ExportProfileManager::init_channel_configs (XMLNodeList nodes) channel_configs.push_back (config); // Add master outs as default + if (!session.master_out()) { return false; } + IO* master_out = session.master_out()->output().get(); if (!master_out) { return false; } @@ -612,6 +665,7 @@ ExportProfileManager::get_new_format (ExportFormatSpecPtr original) ExportFormatSpecPtr format; if (original) { format.reset (new ExportFormatSpecification (*original)); + std::cerr << "After new format created from original, format has id [" << format->id().to_s() << ']' << std::endl; } else { format = handler->add_format(); format->set_name (_("empty format")); @@ -652,8 +706,8 @@ ExportProfileManager::init_formats (XMLNodeList nodes) ExportProfileManager::FormatStatePtr ExportProfileManager::deserialize_format (XMLNode & root) { - XMLProperty * prop; - UUID id; + XMLProperty const * prop; + PBD::UUID id; if ((prop = root.property ("id"))) { id = prop->value(); @@ -692,8 +746,20 @@ ExportProfileManager::load_formats () void ExportProfileManager::load_format_from_disk (std::string const & path) { - XMLTree const tree (path); - ExportFormatSpecPtr format = handler->add_format (*tree.root()); + XMLTree tree; + + if (!tree.read (path)) { + error << string_compose (_("Cannot load export format from %1"), path) << endmsg; + return; + } + + XMLNode* root = tree.root(); + if (!root) { + error << string_compose (_("Cannot export format read from %1"), path) << endmsg; + return; + } + + ExportFormatSpecPtr format = handler->add_format (*root); /* Handle id to filename mapping and don't add duplicates to list */ @@ -728,7 +794,7 @@ std::string ExportProfileManager::get_sample_filename_for_format (ExportFilenamePtr filename, ExportFormatSpecPtr format) { assert (format); - + if (channel_configs.empty()) { return ""; } std::list filenames; @@ -768,7 +834,7 @@ ExportProfileManager::get_warnings () if (!channel_configs.empty ()) { channel_config_state = channel_configs.front(); } - + TimespanStatePtr timespan_state = timespans.front(); /*** Check "global" config ***/ @@ -806,7 +872,7 @@ ExportProfileManager::get_warnings () check_config (warnings, timespan_state, channel_config_state, *format_it, *filename_it); } } - + return warnings; }