diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-09-17 12:58:33 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-09-17 12:58:33 +0000 |
commit | f2b007195cd75b195e38a4cd7757debac73e7792 (patch) | |
tree | 90474413776806f02794602bbb495663e07a81ea /libs/ardour/ardour/export_profile_manager.h | |
parent | 6ba5125e991e08a9d117b39a4c337cf453fd015d (diff) |
new files from sakari, missed last time
git-svn-id: svn://localhost/ardour2/branches/3.0@3740 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/ardour/export_profile_manager.h')
-rw-r--r-- | libs/ardour/ardour/export_profile_manager.h | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/libs/ardour/ardour/export_profile_manager.h b/libs/ardour/ardour/export_profile_manager.h new file mode 100644 index 0000000000..1a855d6868 --- /dev/null +++ b/libs/ardour/ardour/export_profile_manager.h @@ -0,0 +1,316 @@ +/* + Copyright (C) 2008 Paul Davis + Author: Sakari Bergen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __ardour_export_profile_manager_h__ +#define __ardour_export_profile_manager_h__ + +#include <list> +#include <vector> +#include <map> +#include <set> + +#include <boost/shared_ptr.hpp> +#include <boost/weak_ptr.hpp> +#include <sigc++/signal.h> +#include <glibmm/ustring.h> + +#include <pbd/file_utils.h> +#include <pbd/xml++.h> + +#include <ardour/filesystem_paths.h> +#include <ardour/location.h> +#include <ardour/types.h> + +using std::string; +using std::list; +using std::set; + +namespace ARDOUR +{ + +class ExportHandler; +class ExportTimespan; +class ExportChannelConfiguration; +class ExportFormatSpecification; +class ExportFilename; +class Location; +class Session; + +/// Manages (de)serialization of export profiles and related classes +class ExportProfileManager +{ + public: + class Preset { + public: + Preset (string filename, Session & s); + ~Preset (); + + uint32_t id () const { return _id; } + string name () const { return _name; } + + void set_name (string name); + void set_id (uint32_t id); + + // Note: The set_..._state functions take ownership of the XMLNode + void set_global_state (XMLNode & state); + void set_local_state (XMLNode & state); + + XMLNode const * get_global_state () const { return global.root(); } + XMLNode const * get_local_state () const { return local; } + + void save () const; + void remove_local () const; + + private: + + XMLNode * get_instant_xml () const; + void save_instant_xml () const; + void remove_instant_xml () const; + + uint32_t _id; + string _name; + + Session & session; + XMLTree global; + XMLNode * local; + + }; + + typedef boost::shared_ptr<Preset> PresetPtr; + typedef std::list<PresetPtr> PresetList; + + public: + + ExportProfileManager (Session & s); + ~ExportProfileManager (); + + void load_profile (); + void prepare_for_export (); + + PresetList const & get_presets () { return preset_list; } + void load_preset (PresetPtr preset); + PresetPtr save_preset (string const & name); + void remove_preset (); + + private: + typedef boost::shared_ptr<ExportHandler> HandlerPtr; + + typedef std::pair<uint32_t, PBD::sys::path> FilePair; + typedef std::map<uint32_t, PBD::sys::path> FileMap; + + HandlerPtr handler; + Session & session; + + void load_presets (); + uint32_t load_preset_from_disk (PBD::sys::path const & path); // Returns preset id + + void set_state (XMLNode const & root); + void set_global_state (XMLNode const & root); + void set_local_state (XMLNode const & root); + + void serialize_profile (XMLNode & root); + void serialize_global_profile (XMLNode & root); + void serialize_local_profile (XMLNode & root); + + PresetList preset_list; + PresetPtr current_preset; + uint32_t preset_id_counter; + FileMap preset_file_map; + + std::vector<PBD::sys::path> find_file (std::string const & pattern); + + PBD::sys::path export_config_dir; + PBD::SearchPath search_path; + +/* Timespans */ + public: + + typedef boost::shared_ptr<ExportTimespan> TimespanPtr; + typedef std::list<TimespanPtr> TimespanList; + typedef boost::shared_ptr<TimespanList> TimespanListPtr; + typedef std::list<Location *> LocationList; + + enum TimeFormat { + SMPTE, + BBT, + MinSec, + Frames, + Off + }; + + struct TimespanState { + TimespanListPtr timespans; + TimeFormat time_format; + + boost::shared_ptr<Location> session_range; + boost::shared_ptr<Location> selection_range; + boost::shared_ptr<LocationList> ranges; + + TimespanState (boost::shared_ptr<Location> session_range, + boost::shared_ptr<Location> selection_range, + boost::shared_ptr<LocationList> ranges) : + timespans (new TimespanList ()), + time_format (SMPTE), + + session_range (session_range), + selection_range (selection_range), + ranges (ranges) + {} + }; + + typedef boost::shared_ptr<TimespanState> TimespanStatePtr; + typedef std::list<TimespanStatePtr> TimespanStateList; + + void set_selection_range (nframes_t start = 0, nframes_t end = 0); + TimespanStateList const & get_timespans () { return timespans; } + + private: + + TimespanStateList timespans; + + void init_timespans (XMLNodeList nodes); + + TimespanStatePtr deserialize_timespan (XMLNode & root); + XMLNode & serialize_timespan (TimespanStatePtr state); + + /* Locations */ + + void update_ranges (); + + boost::shared_ptr<Location> session_range; + boost::shared_ptr<Location> selection_range; + boost::shared_ptr<LocationList> ranges; + +/* Channel Configs */ + public: + + typedef boost::shared_ptr<ExportChannelConfiguration> ChannelConfigPtr; + + struct ChannelConfigState { + ChannelConfigPtr config; + + ChannelConfigState (ChannelConfigPtr ptr) : config (ptr) {} + }; + typedef boost::shared_ptr<ChannelConfigState> ChannelConfigStatePtr; + typedef std::list<ChannelConfigStatePtr> ChannelConfigStateList; + + ChannelConfigStateList const & get_channel_configs () { return channel_configs; } + + private: + + ChannelConfigStateList channel_configs; + + void init_channel_configs (XMLNodeList nodes); + + ChannelConfigStatePtr deserialize_channel_config (XMLNode & root); + XMLNode & serialize_channel_config (ChannelConfigStatePtr state); + +/* Formats */ + public: + + typedef boost::shared_ptr<ExportFormatSpecification> FormatPtr; + typedef std::list<FormatPtr> FormatList; + + struct FormatState { + boost::shared_ptr<FormatList const> list; + FormatPtr format; + + FormatState (boost::shared_ptr<FormatList const> list, FormatPtr format) : + list (list), format (format) {} + }; + typedef boost::shared_ptr<FormatState> FormatStatePtr; + typedef std::list<FormatStatePtr> FormatStateList; + + FormatStateList const & get_formats () { return formats; } + FormatStatePtr duplicate_format_state (FormatStatePtr state); + void remove_format_state (FormatStatePtr state); + + PBD::sys::path save_format_to_disk (FormatPtr format); + void remove_format_profile (FormatPtr format); + FormatPtr get_new_format (FormatPtr original); + + sigc::signal<void> FormatListChanged; + + private: + + FormatStateList formats; + + void init_formats (XMLNodeList nodes); + FormatStatePtr deserialize_format (XMLNode & root); + XMLNode & serialize_format (FormatStatePtr state); + + void load_formats (); + + FormatPtr load_format (XMLNode & node); + void load_format_from_disk (PBD::sys::path const & path); + + boost::shared_ptr<FormatList> format_list; + FileMap format_file_map; + +/* Filenames */ + public: + + typedef boost::shared_ptr<ExportFilename> FilenamePtr; + + struct FilenameState { + FilenamePtr filename; + + FilenameState (FilenamePtr ptr) : filename (ptr) {} + }; + typedef boost::shared_ptr<FilenameState> FilenameStatePtr; + typedef std::list<FilenameStatePtr> FilenameStateList; + + FilenameStateList const & get_filenames () { return filenames; } + FilenameStatePtr duplicate_filename_state (FilenameStatePtr state); + void remove_filename_state (FilenameStatePtr state); + + private: + + FilenameStateList filenames; + + void init_filenames (XMLNodeList nodes); + + FilenameStatePtr deserialize_filename (XMLNode & root); + XMLNode & serialize_filename (FilenameStatePtr state); + + FilenamePtr load_filename (XMLNode & node); + +/* Warnings */ + public: + struct Warnings { + std::list<Glib::ustring> errors; + std::list<Glib::ustring> warnings; + std::list<Glib::ustring> conflicting_filenames; + }; + + boost::shared_ptr<Warnings> get_warnings (); + + private: + void check_config (boost::shared_ptr<Warnings> warnings, + TimespanStatePtr timespan_state, + ChannelConfigStatePtr channel_config_state, + FormatStatePtr format_state, + FilenameStatePtr filename_state); +}; + + +} // namespace ARDOUR + +#endif /* __ardour_export_profile_manager_h__ */ |