2 Copyright (C) 2008 Paul Davis
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #ifndef __ardour_export_profile_manager_h__
22 #define __ardour_export_profile_manager_h__
30 #include <boost/shared_ptr.hpp>
33 #include "pbd/file_utils.h"
34 #include "pbd/xml++.h"
36 #include "ardour/filesystem_paths.h"
37 #include "ardour/location.h"
38 #include "ardour/libardour_visibility.h"
39 #include "ardour/types.h"
40 #include "ardour/export_handler.h"
49 /// Manages (de)serialization of export profiles and related classes
50 class LIBARDOUR_API ExportProfileManager
62 ExportProfileManager (Session & s, ExportType type);
63 ~ExportProfileManager ();
66 void prepare_for_export ();
68 ExportType type () const { return _type; }
70 typedef std::list<ExportPresetPtr> PresetList;
72 PresetList const & get_presets () { return preset_list; }
73 bool load_preset (ExportPresetPtr preset);
74 ExportPresetPtr new_preset (std::string const & name);
75 ExportPresetPtr save_preset (std::string const & name);
76 void remove_preset ();
79 typedef boost::shared_ptr<ExportHandler> HandlerPtr;
81 typedef std::pair<PBD::UUID, std::string> FilePair;
82 typedef std::map<PBD::UUID, std::string> FileMap;
85 std::string xml_node_name;
89 std::string preset_filename (std::string const & preset_name);
91 void load_preset_from_disk (std::string const & path);
93 bool set_state (XMLNode const & root);
94 bool set_global_state (XMLNode const & root);
95 bool set_local_state (XMLNode const & root);
97 void serialize_profile (XMLNode & root);
98 void serialize_global_profile (XMLNode & root);
99 void serialize_local_profile (XMLNode & root);
101 PresetList preset_list;
102 ExportPresetPtr current_preset;
103 FileMap preset_file_map;
105 std::vector<std::string> find_file (std::string const & pattern);
107 std::string export_config_dir;
108 PBD::Searchpath search_path;
113 typedef std::list<ExportTimespanPtr> TimespanList;
114 typedef boost::shared_ptr<TimespanList> TimespanListPtr;
115 typedef std::list<Location *> LocationList;
124 struct TimespanState {
125 TimespanListPtr timespans;
126 TimeFormat time_format;
128 boost::shared_ptr<Location> selection_range;
129 boost::shared_ptr<LocationList> ranges;
131 TimespanState (boost::shared_ptr<Location> selection_range,
132 boost::shared_ptr<LocationList> ranges)
133 : timespans (new TimespanList ())
134 , time_format (Timecode)
135 , selection_range (selection_range)
140 typedef boost::shared_ptr<TimespanState> TimespanStatePtr;
141 typedef std::list<TimespanStatePtr> TimespanStateList;
143 void set_selection_range (samplepos_t start = 0, samplepos_t end = 0);
144 std::string set_single_range (samplepos_t start, samplepos_t end, std::string name);
145 TimespanStateList const & get_timespans () { return check_list (timespans); }
149 TimespanStateList timespans;
151 bool init_timespans (XMLNodeList nodes);
153 TimespanStatePtr deserialize_timespan (XMLNode & root);
154 XMLNode & serialize_timespan (TimespanStatePtr state);
158 void update_ranges ();
160 boost::shared_ptr<Location> selection_range;
161 boost::shared_ptr<LocationList> ranges;
163 bool single_range_mode;
164 boost::shared_ptr<Location> single_range;
166 /* Channel Configs */
169 struct ChannelConfigState {
170 ExportChannelConfigPtr config;
172 ChannelConfigState (ExportChannelConfigPtr ptr) : config (ptr) {}
174 typedef boost::shared_ptr<ChannelConfigState> ChannelConfigStatePtr;
175 typedef std::list<ChannelConfigStatePtr> ChannelConfigStateList;
177 ChannelConfigStateList const & get_channel_configs () { return check_list (channel_configs); }
178 void clear_channel_configs () { channel_configs.clear(); }
179 ChannelConfigStatePtr add_channel_config ();
183 ChannelConfigStateList channel_configs;
185 bool init_channel_configs (XMLNodeList nodes);
190 typedef std::list<ExportFormatSpecPtr> FormatList;
193 boost::shared_ptr<FormatList const> list;
194 ExportFormatSpecPtr format;
196 FormatState (boost::shared_ptr<FormatList const> list, ExportFormatSpecPtr format) :
197 list (list), format (format) {}
199 typedef boost::shared_ptr<FormatState> FormatStatePtr;
200 typedef std::list<FormatStatePtr> FormatStateList;
202 FormatStateList const & get_formats () { return check_list (formats); }
203 FormatStatePtr duplicate_format_state (FormatStatePtr state);
204 void remove_format_state (FormatStatePtr state);
206 std::string save_format_to_disk (ExportFormatSpecPtr format);
207 void remove_format_profile (ExportFormatSpecPtr format);
208 ExportFormatSpecPtr get_new_format (ExportFormatSpecPtr original);
210 PBD::Signal0<void> FormatListChanged;
214 FormatStateList formats;
216 bool init_formats (XMLNodeList nodes);
217 FormatStatePtr deserialize_format (XMLNode & root);
218 XMLNode & serialize_format (FormatStatePtr state);
220 void load_formats ();
222 ExportFormatSpecPtr load_format (XMLNode & node);
223 void load_format_from_disk (std::string const & path);
225 boost::shared_ptr<FormatList> format_list;
226 FileMap format_file_map;
231 struct FilenameState {
232 ExportFilenamePtr filename;
234 FilenameState (ExportFilenamePtr ptr) : filename (ptr) {}
236 typedef boost::shared_ptr<FilenameState> FilenameStatePtr;
237 typedef std::list<FilenameStatePtr> FilenameStateList;
239 FilenameStateList const & get_filenames () { return check_list (filenames); }
240 FilenameStatePtr duplicate_filename_state (FilenameStatePtr state);
241 void remove_filename_state (FilenameStatePtr state);
243 std::string get_sample_filename_for_format (ExportFilenamePtr filename, ExportFormatSpecPtr format);
247 FilenameStateList filenames;
249 bool init_filenames (XMLNodeList nodes);
250 ExportFilenamePtr load_filename (XMLNode & node);
255 std::list<std::string> errors;
256 std::list<std::string> warnings;
257 std::list<std::string> conflicting_filenames;
260 boost::shared_ptr<Warnings> get_warnings ();
263 void check_config (boost::shared_ptr<Warnings> warnings,
264 TimespanStatePtr timespan_state,
265 ChannelConfigStatePtr channel_config_state,
266 FormatStatePtr format_state,
267 FilenameStatePtr filename_state);
269 bool check_format (ExportFormatSpecPtr format, uint32_t channels);
270 bool check_sndfile_format (ExportFormatSpecPtr format, unsigned int channels);
274 void build_filenames(std::list<std::string> & result, ExportFilenamePtr filename,
275 TimespanListPtr timespans, ExportChannelConfigPtr channel_config,
276 ExportFormatSpecPtr format);
278 /* Element state lists should never be empty, this is used to check them */
281 check_list (std::list<T> const & list)
284 throw std::runtime_error ("Programming error: Uninitialized list in ExportProfileManager");
292 } // namespace ARDOUR
294 #endif /* __ardour_export_profile_manager_h__ */