X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Fexport_profile_manager.cc;h=14c57436ab4b51d56dd8be99cf255f1f7abe3f48;hb=3d366053e2719ca0f129c16575ce481fcd214f61;hp=b72e9e3332b4841d8575628119b3591e8832544f;hpb=0b1a10b2d5d6c45749a59de2cc0117b026ae948c;p=ardour.git diff --git a/libs/ardour/export_profile_manager.cc b/libs/ardour/export_profile_manager.cc index b72e9e3332..14c57436ab 100644 --- a/libs/ardour/export_profile_manager.cc +++ b/libs/ardour/export_profile_manager.cc @@ -23,14 +23,14 @@ #include #include -#include +#include "pbd/gstdio_compat.h" #include #include #include "pbd/enumwriter.h" +#include "pbd/enum_convert.h" #include "pbd/xml++.h" -#include "pbd/convert.h" #include "ardour/export_profile_manager.h" #include "ardour/export_format_specification.h" @@ -43,11 +43,16 @@ #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" + +namespace PBD { + DEFINE_ENUM_CONVERT(ARDOUR::ExportProfileManager::TimeFormat); +} using namespace std; using namespace Glib; @@ -57,7 +62,7 @@ namespace ARDOUR { ExportProfileManager::ExportProfileManager (Session & s, ExportType type) - : type(type) + : _type(type) , handler (s.get_export_handler()) , session (s) @@ -144,6 +149,7 @@ ExportProfileManager::prepare_for_export () FormatStateList::const_iterator format_it; FilenameStateList::const_iterator filename_it; + handler->reset (); // For each timespan for (TimespanList::iterator ts_it = ts_list->begin(); ts_it != ts_list->end(); ++ts_it) { // ..., each format-filename pair @@ -161,7 +167,7 @@ ExportProfileManager::prepare_for_export () } // ...and each channel config - filename->include_channel_config = (type == StemExport) || + 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); @@ -179,9 +185,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)) { @@ -343,7 +354,7 @@ ExportProfileManager::find_file (std::string const & pattern) } void -ExportProfileManager::set_selection_range (framepos_t start, framepos_t end) +ExportProfileManager::set_selection_range (samplepos_t start, samplepos_t end) { if (start || end) { @@ -360,7 +371,7 @@ ExportProfileManager::set_selection_range (framepos_t start, framepos_t end) } std::string -ExportProfileManager::set_single_range (framepos_t start, framepos_t end, string name) +ExportProfileManager::set_single_range (samplepos_t start, samplepos_t end, string name) { single_range_mode = true; @@ -399,7 +410,7 @@ ExportProfileManager::init_timespans (XMLNodeList nodes) } else { session_range = session.locations()->session_range_location(); } - + if (!session_range) { return false; } ExportTimespanPtr timespan = handler->add_timespan(); @@ -417,14 +428,14 @@ ExportProfileManager::TimespanStatePtr ExportProfileManager::deserialize_timespan (XMLNode & root) { TimespanStatePtr state (new TimespanState (selection_range, ranges)); - XMLProperty const * prop; XMLNodeList spans = root.children ("Range"); for (XMLNodeList::iterator node_it = spans.begin(); node_it != spans.end(); ++node_it) { - prop = (*node_it)->property ("id"); - if (!prop) { continue; } - string id = prop->value(); + std::string id; + if (!(*node_it)->get_property ("id", id)) { + continue; + } Location * location = 0; for (LocationList::iterator it = ranges->begin(); it != ranges->end(); ++it) { @@ -444,9 +455,7 @@ ExportProfileManager::deserialize_timespan (XMLNode & root) state->timespans->push_back (timespan); } - if ((prop = root.property ("format"))) { - state->time_format = (TimeFormat) string_2_enum (prop->value(), TimeFormat); - } + root.get_property ("format", state->time_format); if (state->timespans->empty()) { return TimespanStatePtr(); @@ -464,11 +473,11 @@ ExportProfileManager::serialize_timespan (TimespanStatePtr state) 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()); + span->set_property ("id", (*it)->range_id()); } } - root.add_property ("format", enum_2_string (state->time_format)); + root.set_property ("format", state->time_format); return root; } @@ -482,12 +491,15 @@ ExportProfileManager::update_ranges () { return; } - /* Session */ - Location * session_range = (session.get_play_loop () ? session.locations()->auto_loop_location () : - session.locations()->session_range_location()); - if (session_range) { - ranges->push_back (session_range); + /* 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 */ @@ -580,9 +592,9 @@ ExportProfileManager::save_format_to_disk (ExportFormatSpecPtr format) string new_name = format->name(); new_name += export_format_suffix; - /* make sure its legal for the filesystem */ + /* make sure its legal for the filesystem */ - new_name = legalize_for_path (new_name); + new_name = legalize_for_path (new_name); std::string new_path = Glib::build_filename (export_config_dir, new_name); @@ -624,7 +636,6 @@ ExportProfileManager::save_format_to_disk (ExportFormatSpecPtr format) tree.write(); } - FormatListChanged (); return new_path; } @@ -697,7 +708,7 @@ ExportProfileManager::init_formats (XMLNodeList nodes) ExportProfileManager::FormatStatePtr ExportProfileManager::deserialize_format (XMLNode & root) { - XMLProperty * prop; + XMLProperty const * prop; PBD::UUID id; if ((prop = root.property ("id"))) { @@ -719,7 +730,7 @@ ExportProfileManager::serialize_format (FormatStatePtr state) XMLNode * root = new XMLNode ("ExportFormat"); string id = state->format ? state->format->id().to_s() : ""; - root->add_property ("id", id); + root->set_property ("id", id); return *root; } @@ -752,6 +763,13 @@ ExportProfileManager::load_format_from_disk (std::string const & path) ExportFormatSpecPtr format = handler->add_format (*root); + if (format->format_id() == ExportFormatBase::F_FFMPEG) { + std::string unused; + if (!ArdourVideoToolPaths::transcoder_exe (unused, unused)) { + error << string_compose (_("Ignored format '%1': encoder is not avilable"), path) << endmsg; + return; + } + } /* Handle id to filename mapping and don't add duplicates to list */ FilePair pair (format->id(), path); @@ -785,7 +803,7 @@ std::string ExportProfileManager::get_sample_filename_for_format (ExportFilenamePtr filename, ExportFormatSpecPtr format) { assert (format); - + if (channel_configs.empty()) { return ""; } std::list filenames; @@ -825,7 +843,7 @@ ExportProfileManager::get_warnings () if (!channel_configs.empty ()) { channel_config_state = channel_configs.front(); } - + TimespanStatePtr timespan_state = timespans.front(); /*** Check "global" config ***/ @@ -854,6 +872,8 @@ ExportProfileManager::get_warnings () /*** Check files ***/ + bool folder_ok = true; + if (channel_config_state) { FormatStateList::const_iterator format_it; FilenameStateList::const_iterator filename_it; @@ -861,18 +881,26 @@ ExportProfileManager::get_warnings () format_it != formats.end() && filename_it != filenames.end(); ++format_it, ++filename_it) { check_config (warnings, timespan_state, channel_config_state, *format_it, *filename_it); + + if (!Glib::file_test ((*filename_it)->filename->get_folder(), Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) { + folder_ok = false; + } + } } - + + if (!folder_ok) { + warnings->errors.push_back (_("Destination folder does not exist.")); + } + return warnings; } void ExportProfileManager::check_config (boost::shared_ptr warnings, - TimespanStatePtr timespan_state, - ChannelConfigStatePtr channel_config_state, - FormatStatePtr format_state, - FilenameStatePtr filename_state) + TimespanStatePtr timespan_state, + ChannelConfigStatePtr channel_config_state, + FormatStatePtr format_state, FilenameStatePtr filename_state) { TimespanListPtr timespans = timespan_state->timespans; ExportChannelConfigPtr channel_config = channel_config_state->config; @@ -933,6 +961,8 @@ ExportProfileManager::check_format (ExportFormatSpecPtr format, uint32_t channel switch (format->type()) { case ExportFormatBase::T_Sndfile: return check_sndfile_format (format, channels); + case ExportFormatBase::T_FFMPEG: + return true; default: throw ExportFailed (X_("Invalid format given for ExportFileFactory::check!"));