From: Sakari Bergen Date: Sat, 20 Sep 2008 22:06:02 +0000 (+0000) Subject: * Added filename extension definitions for export presets and format profiles X-Git-Tag: 3.0-alpha5~4124 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=eec19ca7afde0da57b2a4d9abc6ef847e6924975;p=ardour.git * Added filename extension definitions for export presets and format profiles * Export Preset widget doesn't allow overwriting existing presets * Some error detection for export preset loading * Moved some serialization code away from ExportProfileManager to respective classes git-svn-id: svn://localhost/ardour2/branches/3.0@3778 d708f5d6-7413-0410-9779-e7cbd77b26cf --- diff --git a/gtk2_ardour/export_main_dialog.cc b/gtk2_ardour/export_main_dialog.cc index a9955a3953..16a2b9e6e1 100644 --- a/gtk2_ardour/export_main_dialog.cc +++ b/gtk2_ardour/export_main_dialog.cc @@ -409,11 +409,20 @@ ExportMainDialog::select_preset () { Gtk::ListStore::iterator it = preset_entry.get_active (); Glib::ustring text = preset_entry.get_entry()->get_text(); + bool preset_name_exists = false; + + for (PresetList::const_iterator it = profile_manager->get_presets().begin(); it != profile_manager->get_presets().end(); ++it) { + if (!(*it)->name().compare (text)) { preset_name_exists = true; } + } if (preset_list->iter_is_valid (it)) { previous_preset = current_preset = it->get_value (preset_cols.preset); - profile_manager->load_preset (current_preset); + if (!profile_manager->load_preset (current_preset)) { + Gtk::MessageDialog dialog (_("The selected preset did not load successfully!\nPerhaps it references a format that has been removed?"), + false, Gtk::MESSAGE_WARNING); + dialog.run (); + } sync_with_manager (); /* Make an edit, so that signal changed will be emitted on re-selection */ @@ -436,7 +445,7 @@ ExportMainDialog::select_preset () preset_save_button.set_sensitive (current_preset); preset_remove_button.set_sensitive (current_preset); - preset_new_button.set_sensitive (!current_preset && !text.empty()); + preset_new_button.set_sensitive (!current_preset && !text.empty() && !preset_name_exists); } void diff --git a/libs/ardour/ardour/export_channel_configuration.h b/libs/ardour/ardour/export_channel_configuration.h index 8f2fcdbd28..234cd5d127 100644 --- a/libs/ardour/ardour/export_channel_configuration.h +++ b/libs/ardour/ardour/export_channel_configuration.h @@ -30,6 +30,8 @@ #include #include +#include + using Glib::ustring; namespace ARDOUR @@ -42,13 +44,11 @@ class ExportFormatSpecification; class ExportFilename; class ExportProcessor; class ExportTimespan; +class Session; class ExportChannel : public std::set { public: - ExportChannel (); - ~ExportChannel (); - void add_port (AudioPort * port) { if (port) { insert (port); } } void read_ports (float * data, nframes_t frames) const; }; @@ -80,10 +80,11 @@ class ExportChannelConfiguration private: friend class ExportElementFactory; - ExportChannelConfiguration (ExportStatus & status); + ExportChannelConfiguration (ExportStatus & status, Session & session); public: - ~ExportChannelConfiguration (); + XMLNode & get_state (); + int set_state (const XMLNode &); typedef boost::shared_ptr ChannelPtr; typedef std::list ChannelList; @@ -114,6 +115,8 @@ class ExportChannelConfiguration private: + Session & session; + // processor has to be prepared before doing this. void write_file (); diff --git a/libs/ardour/ardour/export_profile_manager.h b/libs/ardour/ardour/export_profile_manager.h index 84a5251aa8..d63549e185 100644 --- a/libs/ardour/ardour/export_profile_manager.h +++ b/libs/ardour/ardour/export_profile_manager.h @@ -70,7 +70,7 @@ class ExportProfileManager typedef std::list PresetList; PresetList const & get_presets () { return preset_list; } - void load_preset (PresetPtr preset); + bool load_preset (PresetPtr preset); PresetPtr save_preset (string const & name); void remove_preset (); @@ -86,9 +86,9 @@ class ExportProfileManager void load_presets (); void load_preset_from_disk (PBD::sys::path const & path); - void set_state (XMLNode const & root); - void set_global_state (XMLNode const & root); - void set_local_state (XMLNode const & root); + bool set_state (XMLNode const & root); + bool set_global_state (XMLNode const & root); + bool set_local_state (XMLNode const & root); void serialize_profile (XMLNode & root); void serialize_global_profile (XMLNode & root); @@ -149,7 +149,7 @@ class ExportProfileManager TimespanStateList timespans; - void init_timespans (XMLNodeList nodes); + bool init_timespans (XMLNodeList nodes); TimespanStatePtr deserialize_timespan (XMLNode & root); XMLNode & serialize_timespan (TimespanStatePtr state); @@ -181,10 +181,7 @@ class ExportProfileManager ChannelConfigStateList channel_configs; - void init_channel_configs (XMLNodeList nodes); - - ChannelConfigStatePtr deserialize_channel_config (XMLNode & root); - XMLNode & serialize_channel_config (ChannelConfigStatePtr state); + bool init_channel_configs (XMLNodeList nodes); /* Formats */ public: @@ -216,7 +213,7 @@ class ExportProfileManager FormatStateList formats; - void init_formats (XMLNodeList nodes); + bool init_formats (XMLNodeList nodes); FormatStatePtr deserialize_format (XMLNode & root); XMLNode & serialize_format (FormatStatePtr state); @@ -249,11 +246,7 @@ class ExportProfileManager FilenameStateList filenames; - void init_filenames (XMLNodeList nodes); - - FilenameStatePtr deserialize_filename (XMLNode & root); - XMLNode & serialize_filename (FilenameStatePtr state); - + bool init_filenames (XMLNodeList nodes); FilenamePtr load_filename (XMLNode & node); /* Warnings */ diff --git a/libs/ardour/ardour/filename_extensions.h b/libs/ardour/ardour/filename_extensions.h index 3e280d6326..24d75c4a18 100644 --- a/libs/ardour/ardour/filename_extensions.h +++ b/libs/ardour/ardour/filename_extensions.h @@ -11,6 +11,8 @@ extern const char* const peakfile_suffix; extern const char* const backup_suffix; extern const char* const temp_suffix; extern const char* const history_suffix; +extern const char* const export_preset_suffix; +extern const char* const export_format_suffix; } diff --git a/libs/ardour/export_channel_configuration.cc b/libs/ardour/export_channel_configuration.cc index cd29a4e578..97b05c2f1e 100644 --- a/libs/ardour/export_channel_configuration.cc +++ b/libs/ardour/export_channel_configuration.cc @@ -28,6 +28,10 @@ #include #include #include +#include +#include + +#include #include namespace ARDOUR @@ -35,16 +39,6 @@ namespace ARDOUR /* ExportChannel */ -ExportChannel::ExportChannel () -{ - -} - -ExportChannel::~ExportChannel () -{ - -} - void ExportChannel::read_ports (float * data, nframes_t frames) const { @@ -63,7 +57,8 @@ ExportChannel::read_ports (float * data, nframes_t frames) const /* ExportChannelConfiguration */ -ExportChannelConfiguration::ExportChannelConfiguration (ExportStatus & status) : +ExportChannelConfiguration::ExportChannelConfiguration (ExportStatus & status, Session & session) : + session (session), writer_thread (*this), status (status), files_written (false), @@ -72,9 +67,60 @@ ExportChannelConfiguration::ExportChannelConfiguration (ExportStatus & status) : } -ExportChannelConfiguration::~ExportChannelConfiguration () + +XMLNode & +ExportChannelConfiguration::get_state () +{ + XMLNode * root = new XMLNode ("ExportChannelConfiguration"); + XMLNode * channel; + XMLNode * port_node; + + root->add_property ("split", get_split() ? "true" : "false"); + root->add_property ("channels", to_string (get_n_chans(), std::dec)); + + uint32_t i = 1; + for (ExportChannelConfiguration::ChannelList::const_iterator c_it = channels.begin(); c_it != channels.end(); ++c_it) { + channel = root->add_child ("Channel"); + if (!channel) { continue; } + + channel->add_property ("number", to_string (i, std::dec)); + + for (ExportChannel::const_iterator p_it = (*c_it)->begin(); p_it != (*c_it)->end(); ++p_it) { + if ((port_node = channel->add_child ("Port"))) { + port_node->add_property ("name", (*p_it)->name()); + } + } + + ++i; + } + + return *root; +} + +int +ExportChannelConfiguration::set_state (const XMLNode & root) { + XMLProperty const * prop; + + if ((prop = root.property ("split"))) { + set_split (!prop->value().compare ("true")); + } + + XMLNodeList channels = root.children ("Channel"); + for (XMLNodeList::iterator it = channels.begin(); it != channels.end(); ++it) { + boost::shared_ptr channel (new ExportChannel ()); + + XMLNodeList ports = (*it)->children ("Port"); + for (XMLNodeList::iterator p_it = ports.begin(); p_it != ports.end(); ++p_it) { + if ((prop = (*p_it)->property ("name"))) { + channel->add_port (dynamic_cast (session.engine().get_port_by_name (prop->value()))); + } + } + + register_channel (channel); + } + return 0; } bool diff --git a/libs/ardour/export_handler.cc b/libs/ardour/export_handler.cc index fd76b2e9e0..0e22fdad27 100644 --- a/libs/ardour/export_handler.cc +++ b/libs/ardour/export_handler.cc @@ -61,7 +61,7 @@ ExportElementFactory::add_timespan () ExportElementFactory::ChannelConfigPtr ExportElementFactory::add_channel_config () { - return ChannelConfigPtr (new ExportChannelConfiguration (session.export_status)); + return ChannelConfigPtr (new ExportChannelConfiguration (session.export_status, session)); } ExportElementFactory::FormatPtr diff --git a/libs/ardour/export_profile_manager.cc b/libs/ardour/export_profile_manager.cc index 7fb1b928d3..ac17ec7310 100644 --- a/libs/ardour/export_profile_manager.cc +++ b/libs/ardour/export_profile_manager.cc @@ -29,7 +29,6 @@ #include #include -#include #include #include #include @@ -37,6 +36,7 @@ #include #include #include +#include #include #include "i18n.h" @@ -121,26 +121,32 @@ ExportProfileManager::prepare_for_export () } } -void +bool ExportProfileManager::load_preset (PresetPtr preset) { + bool ok = true; + current_preset = preset; - if (!preset) { return; } + if (!preset) { return false; } XMLNode const * state; if ((state = preset->get_local_state())) { set_local_state (*state); - } + } else { ok = false; } if ((state = preset->get_global_state())) { - set_global_state (*state); - } + if (!set_global_state (*state)) { + ok = false; + } + } else { ok = false; } + + return ok; } void ExportProfileManager::load_presets () { - vector found = find_file ("*.preset"); + vector found = find_file (string_compose (X_("*%1"),export_preset_suffix)); for (vector::iterator it = found.begin(); it != found.end(); ++it) { load_preset_from_disk (*it); @@ -151,7 +157,7 @@ ExportProfileManager::PresetPtr ExportProfileManager::save_preset (string const & name) { if (!current_preset) { - string filename = export_config_dir.to_string() + "/" + name + ".preset"; + string filename = export_config_dir.to_string() + "/" + name + export_preset_suffix; current_preset.reset (new ExportPreset (filename, session)); preset_list.push_back (current_preset); } @@ -205,25 +211,24 @@ ExportProfileManager::load_preset_from_disk (PBD::sys::path const & path) preset_file_map.insert (pair); } -void +bool ExportProfileManager::set_state (XMLNode const & root) { - set_global_state (root); - set_local_state (root); + return set_global_state (root) && set_local_state (root); } -void +bool ExportProfileManager::set_global_state (XMLNode const & root) { - init_formats (root.children ("ExportFormat")); - init_filenames (root.children ("ExportFilename")); + return init_filenames (root.children ("ExportFilename")) && + init_formats (root.children ("ExportFormat")); } -void +bool ExportProfileManager::set_local_state (XMLNode const & root) { - init_timespans (root.children ("ExportTimespan"));; - init_channel_configs (root.children ("ExportChannelConfiguration")); + return init_timespans (root.children ("ExportTimespan")) && + init_channel_configs (root.children ("ExportChannelConfiguration")); } void @@ -241,7 +246,7 @@ ExportProfileManager::serialize_global_profile (XMLNode & root) } for (FilenameStateList::iterator it = filenames.begin(); it != filenames.end(); ++it) { - root.add_child_nocopy (serialize_filename (*it)); + root.add_child_nocopy ((*it)->filename->get_state()); } } @@ -253,7 +258,7 @@ ExportProfileManager::serialize_local_profile (XMLNode & root) } for (ChannelConfigStateList::iterator it = channel_configs.begin(); it != channel_configs.end(); ++it) { - root.add_child_nocopy (serialize_channel_config (*it)); + root.add_child_nocopy ((*it)->config->get_state()); } } @@ -285,7 +290,7 @@ ExportProfileManager::set_selection_range (nframes_t start, nframes_t end) } } -void +bool ExportProfileManager::init_timespans (XMLNodeList nodes) { timespans.clear (); @@ -296,12 +301,14 @@ ExportProfileManager::init_timespans (XMLNodeList nodes) TimespanStatePtr timespan (new TimespanState (session_range, selection_range, ranges)); timespans.push_back (timespan); - return; + return false; } for (XMLNodeList::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { timespans.push_back (deserialize_timespan (**it)); } + + return true; } ExportProfileManager::TimespanStatePtr @@ -384,7 +391,7 @@ ExportProfileManager::update_ranges () { } } -void +bool ExportProfileManager::init_channel_configs (XMLNodeList nodes) { channel_configs.clear(); @@ -392,70 +399,16 @@ ExportProfileManager::init_channel_configs (XMLNodeList nodes) if (nodes.empty()) { ChannelConfigStatePtr config (new ChannelConfigState (handler->add_channel_config())); channel_configs.push_back (config); - return; + return false; } for (XMLNodeList::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { - channel_configs.push_back (deserialize_channel_config (**it)); - } -} - -ExportProfileManager::ChannelConfigStatePtr -ExportProfileManager::deserialize_channel_config (XMLNode & root) -{ - - ChannelConfigStatePtr state (new ChannelConfigState (handler->add_channel_config())); - XMLProperty const * prop; - - if ((prop = root.property ("split"))) { - state->config->set_split(!prop->value().compare ("true")); - } - - XMLNodeList channels = root.children ("Channel"); - for (XMLNodeList::iterator it = channels.begin(); it != channels.end(); ++it) { - boost::shared_ptr channel (new ExportChannel ()); - - XMLNodeList ports = (*it)->children ("Port"); - for (XMLNodeList::iterator p_it = ports.begin(); p_it != ports.end(); ++p_it) { - if ((prop = (*p_it)->property ("name"))) { - channel->add_port (dynamic_cast (session.engine().get_port_by_name (prop->value()))); - } - } - - state->config->register_channel (channel); - } - - return state; -} - -XMLNode & -ExportProfileManager::serialize_channel_config (ChannelConfigStatePtr state) -{ - XMLNode * root = new XMLNode ("ExportChannelConfiguration"); - XMLNode * channel; - XMLNode * port_node; - - root->add_property ("split", state->config->get_split() ? "true" : "false"); - root->add_property ("channels", to_string (state->config->get_n_chans(), std::dec)); - - uint32_t i = 1; - ExportChannelConfiguration::ChannelList const & chan_list = state->config->get_channels(); - for (ExportChannelConfiguration::ChannelList::const_iterator c_it = chan_list.begin(); c_it != chan_list.end(); ++c_it) { - channel = root->add_child ("Channel"); - if (!channel) { continue; } - - channel->add_property ("number", to_string (i, std::dec)); - - for (ExportChannel::const_iterator p_it = (*c_it)->begin(); p_it != (*c_it)->end(); ++p_it) { - if ((port_node = channel->add_child ("Port"))) { - port_node->add_property ("name", (*p_it)->name()); - } - } - - ++i; + ChannelConfigStatePtr config (new ChannelConfigState (handler->add_channel_config())); + config->config->set_state (**it); + channel_configs.push_back (config); } - return *root; + return true; } ExportProfileManager::FormatStatePtr @@ -488,7 +441,7 @@ ExportProfileManager::save_format_to_disk (FormatPtr format) /* Get filename for file */ Glib::ustring new_name = format->name(); - new_name += ".format"; + new_name += export_format_suffix; sys::path new_path (export_config_dir); new_path /= new_name; @@ -561,21 +514,24 @@ ExportProfileManager::get_new_format (FormatPtr original) return format; } -void +bool ExportProfileManager::init_formats (XMLNodeList nodes) { + bool ok = true; formats.clear(); if (nodes.empty()) { FormatStatePtr format (new FormatState (format_list, FormatPtr ())); formats.push_back (format); - return; + return false; } for (XMLNodeList::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { FormatStatePtr format; if ((format = deserialize_format (**it))) { formats.push_back (format); + } else { + ok = false; } } @@ -583,6 +539,8 @@ ExportProfileManager::init_formats (XMLNodeList nodes) FormatStatePtr format (new FormatState (format_list, FormatPtr ())); formats.push_back (format); } + + return ok; } ExportProfileManager::FormatStatePtr @@ -618,7 +576,7 @@ ExportProfileManager::serialize_format (FormatStatePtr state) void ExportProfileManager::load_formats () { - vector found = find_file ("*.format"); + vector found = find_file (string_compose ("*%1", export_format_suffix)); for (vector::iterator it = found.begin(); it != found.end(); ++it) { load_format_from_disk (*it); @@ -659,7 +617,7 @@ ExportProfileManager::remove_filename_state (FilenameStatePtr state) } } -void +bool ExportProfileManager::init_filenames (XMLNodeList nodes) { filenames.clear (); @@ -667,26 +625,16 @@ ExportProfileManager::init_filenames (XMLNodeList nodes) if (nodes.empty()) { FilenameStatePtr filename (new FilenameState (handler->add_filename())); filenames.push_back (filename); - return; + return false; } for (XMLNodeList::const_iterator it = nodes.begin(); it != nodes.end(); ++it) { - filenames.push_back (deserialize_filename (**it)); + FilenamePtr filename = handler->add_filename(); + filename->set_state (**it); + filenames.push_back (FilenameStatePtr (new FilenameState (filename))); } -} - -ExportProfileManager::FilenameStatePtr -ExportProfileManager::deserialize_filename (XMLNode & root) -{ - FilenamePtr filename = handler->add_filename(); - filename->set_state (root); - return FilenameStatePtr (new FilenameState (filename)); -} - -XMLNode & -ExportProfileManager::serialize_filename (FilenameStatePtr state) -{ - return state->filename->get_state(); + + return true; } boost::shared_ptr diff --git a/libs/ardour/filename_extensions.cc b/libs/ardour/filename_extensions.cc index c51e7aa915..d018dc7f4a 100644 --- a/libs/ardour/filename_extensions.cc +++ b/libs/ardour/filename_extensions.cc @@ -11,5 +11,7 @@ const char* const peakfile_suffix = X_(".peak"); const char* const backup_suffix = X_(".bak"); const char* const temp_suffix = X_(".tmp"); const char* const history_suffix = X_(".history"); +const char* const export_preset_suffix = X_(".preset"); +const char* const export_format_suffix = X_(".format"); }