* Added filename extension definitions for export presets and format profiles
authorSakari Bergen <sakari.bergen@beatwaves.net>
Sat, 20 Sep 2008 22:06:02 +0000 (22:06 +0000)
committerSakari Bergen <sakari.bergen@beatwaves.net>
Sat, 20 Sep 2008 22:06:02 +0000 (22:06 +0000)
* 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

gtk2_ardour/export_main_dialog.cc
libs/ardour/ardour/export_channel_configuration.h
libs/ardour/ardour/export_profile_manager.h
libs/ardour/ardour/filename_extensions.h
libs/ardour/export_channel_configuration.cc
libs/ardour/export_handler.cc
libs/ardour/export_profile_manager.cc
libs/ardour/filename_extensions.cc

index a9955a395375b59b78f1d793fc290ace9154e4b5..16a2b9e6e132c04d1cebcffac5243b4bbfe7970c 100644 (file)
@@ -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
index 8f2fcdbd28a139441d93b72b34245fc4288352a8..234cd5d127244cea4b1c3f18e0eca07141845482 100644 (file)
@@ -30,6 +30,8 @@
 #include <ardour/export_status.h>
 #include <ardour/ardour.h>
 
+#include <pbd/xml++.h>
+
 using Glib::ustring;
 
 namespace ARDOUR
@@ -42,13 +44,11 @@ class ExportFormatSpecification;
 class ExportFilename;
 class ExportProcessor;
 class ExportTimespan;
+class Session;
 
 class ExportChannel : public std::set<AudioPort *>
 {
   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<ExportChannel const> ChannelPtr;
        typedef std::list<ChannelPtr> ChannelList;
@@ -114,6 +115,8 @@ class ExportChannelConfiguration
        
   private:
 
+        Session & session;
+
        // processor has to be prepared before doing this.
        void write_file ();
        
index 84a5251aa8b30f7b8062158c345df93f400d72ab..d63549e1857d7a0d6e05fb52833e48fcd2c0363b 100644 (file)
@@ -70,7 +70,7 @@ class ExportProfileManager
        typedef std::list<PresetPtr> 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 */
index 3e280d6326df35e7855004d0e741f31aaff11ef8..24d75c4a18b5b9fd3aaba72e5636fc3e9640323e 100644 (file)
@@ -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;
 
 }
 
index cd29a4e5787e7cd7c2451b982d93e6d6a3c3ae20..97b05c2f1eee17574670c972ab9498bc7308b578 100644 (file)
 #include <ardour/audio_port.h>
 #include <ardour/export_failed.h>
 #include <ardour/midi_port.h>
+#include <ardour/session.h>
+#include <ardour/audioengine.h>
+
+#include <pbd/convert.h>
 #include <pbd/pthread_utils.h>
 
 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<ExportChannel> 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<AudioPort *> (session.engine().get_port_by_name (prop->value())));
+                       }
+               }
+       
+               register_channel (channel);
+       }
 
+       return 0;
 }
 
 bool
index fd76b2e9e0d7476ed92d580be912d06284ea194e..0e22fdad27b9418c2f6eae07518dfbacf4a690e9 100644 (file)
@@ -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
index 7fb1b928d3587b19bbe81ffe37bce502575d12b5..ac17ec7310f51d7d483f665097e9142d05c7e23b 100644 (file)
@@ -29,7 +29,6 @@
 #include <pbd/xml++.h>
 #include <pbd/convert.h>
 
-#include <ardour/audioengine.h>
 #include <ardour/export_failed.h>
 #include <ardour/export_format_specification.h>
 #include <ardour/export_timespan.h>
@@ -37,6 +36,7 @@
 #include <ardour/export_filename.h>
 #include <ardour/export_preset.h>
 #include <ardour/export_handler.h>
+#include <ardour/filename_extensions.h>
 #include <ardour/session.h>
 
 #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<sys::path> found = find_file ("*.preset");
+       vector<sys::path> found = find_file (string_compose (X_("*%1"),export_preset_suffix));
 
        for (vector<sys::path>::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<ExportChannel> 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<AudioPort *> (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<sys::path> found = find_file ("*.format");
+       vector<sys::path> found = find_file (string_compose ("*%1", export_format_suffix));
 
        for (vector<sys::path>::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<ExportProfileManager::Warnings>
index c51e7aa9153e5615424543083eb66bb6fd6e25f9..d018dc7f4aa8834abebfd12833ba6e29d5c31f13 100644 (file)
@@ -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");
 
 }