use new syntax for connecting to backend signals that enforces explicit connection...
[ardour.git] / libs / ardour / ardour / export_profile_manager.h
1 /*
2     Copyright (C) 2008 Paul Davis
3     Author: Sakari Bergen
4
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.
9
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.
14
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.
18
19 */
20
21 #ifndef __ardour_export_profile_manager_h__
22 #define __ardour_export_profile_manager_h__
23
24 #include <list>
25 #include <vector>
26 #include <map>
27 #include <stdexcept>
28
29 #include <boost/shared_ptr.hpp>
30 #include <boost/weak_ptr.hpp>
31 #include <glibmm/ustring.h>
32
33 #include "pbd/uuid.h"
34 #include "pbd/file_utils.h"
35 #include "pbd/xml++.h"
36
37 #include "ardour/filesystem_paths.h"
38 #include "ardour/location.h"
39 #include "ardour/types.h"
40
41 namespace ARDOUR
42 {
43
44 class ExportHandler;
45 class ExportTimespan;
46 class ExportChannelConfiguration;
47 class ExportFormatSpecification;
48 class ExportFilename;
49 class ExportPreset;
50 class Location;
51 class Session;
52
53 /// Manages (de)serialization of export profiles and related classes
54 class ExportProfileManager
55 {
56   public:
57
58         ExportProfileManager (Session & s);
59         ~ExportProfileManager ();
60
61         void load_profile ();
62         void prepare_for_export ();
63
64         typedef boost::shared_ptr<ExportPreset> PresetPtr;
65         typedef std::list<PresetPtr> PresetList;
66
67         PresetList const & get_presets () { return preset_list; }
68         bool load_preset (PresetPtr preset);
69         PresetPtr save_preset (std::string const & name);
70         void remove_preset ();
71
72   private:
73         typedef boost::shared_ptr<ExportHandler> HandlerPtr;
74
75         typedef std::pair<PBD::UUID, PBD::sys::path> FilePair;
76         typedef std::map<PBD::UUID, PBD::sys::path> FileMap;
77
78         HandlerPtr  handler;
79         Session &   session;
80
81         void load_presets ();
82         void load_preset_from_disk (PBD::sys::path const & path);
83
84         bool set_state (XMLNode const & root);
85         bool set_global_state (XMLNode const & root);
86         bool set_local_state (XMLNode const & root);
87
88         void serialize_profile (XMLNode & root);
89         void serialize_global_profile (XMLNode & root);
90         void serialize_local_profile (XMLNode & root);
91
92         PresetList preset_list;
93         PresetPtr  current_preset;
94         FileMap    preset_file_map;
95
96         std::vector<PBD::sys::path> find_file (std::string const & pattern);
97
98         PBD::sys::path  export_config_dir;
99         PBD::SearchPath search_path;
100
101 /* Timespans */
102   public:
103
104         typedef boost::shared_ptr<ExportTimespan> TimespanPtr;
105         typedef std::list<TimespanPtr> TimespanList;
106         typedef boost::shared_ptr<TimespanList> TimespanListPtr;
107         typedef std::list<Location *> LocationList;
108
109         enum TimeFormat {
110                 Timecode,
111                 BBT,
112                 MinSec,
113                 Frames,
114                 Off
115         };
116
117         struct TimespanState {
118                 TimespanListPtr timespans;
119                 TimeFormat      time_format;
120
121                 boost::shared_ptr<Location> session_range;
122                 boost::shared_ptr<Location> selection_range;
123                 boost::shared_ptr<LocationList> ranges;
124
125                 TimespanState (boost::shared_ptr<Location> session_range,
126                                boost::shared_ptr<Location> selection_range,
127                                boost::shared_ptr<LocationList> ranges) :
128                   timespans (new TimespanList ()),
129                   time_format (Timecode),
130
131                   session_range (session_range),
132                   selection_range (selection_range),
133                   ranges (ranges)
134                 {}
135         };
136
137         typedef boost::shared_ptr<TimespanState> TimespanStatePtr;
138         typedef std::list<TimespanStatePtr> TimespanStateList;
139
140         void set_selection_range (nframes_t start = 0, nframes_t end = 0);
141         std::string set_single_range (nframes_t start, nframes_t end, Glib::ustring name);
142         TimespanStateList const & get_timespans () { return check_list (timespans); }
143
144   private:
145
146         TimespanStateList timespans;
147
148         bool init_timespans (XMLNodeList nodes);
149
150         TimespanStatePtr deserialize_timespan (XMLNode & root);
151         XMLNode & serialize_timespan (TimespanStatePtr state);
152
153         /* Locations */
154
155         void update_ranges ();
156
157         boost::shared_ptr<Location>     session_range;
158         boost::shared_ptr<Location>     selection_range;
159         boost::shared_ptr<LocationList> ranges;
160
161         bool                            single_range_mode;
162         boost::shared_ptr<Location>     single_range;
163
164 /* Channel Configs */
165   public:
166
167         typedef boost::shared_ptr<ExportChannelConfiguration> ChannelConfigPtr;
168
169         struct ChannelConfigState {
170                 ChannelConfigPtr config;
171
172                 ChannelConfigState (ChannelConfigPtr ptr) : config (ptr) {}
173         };
174         typedef boost::shared_ptr<ChannelConfigState> ChannelConfigStatePtr;
175         typedef std::list<ChannelConfigStatePtr> ChannelConfigStateList;
176
177         ChannelConfigStateList const & get_channel_configs () { return check_list (channel_configs); }
178
179   private:
180
181         ChannelConfigStateList channel_configs;
182
183         bool init_channel_configs (XMLNodeList nodes);
184
185 /* Formats */
186   public:
187
188         typedef boost::shared_ptr<ExportFormatSpecification> FormatPtr;
189         typedef std::list<FormatPtr> FormatList;
190
191         struct FormatState {
192                 boost::shared_ptr<FormatList const> list;
193                 FormatPtr                           format;
194
195                 FormatState (boost::shared_ptr<FormatList const> list, FormatPtr format) :
196                   list (list), format (format) {}
197         };
198         typedef boost::shared_ptr<FormatState> FormatStatePtr;
199         typedef std::list<FormatStatePtr> FormatStateList;
200
201         FormatStateList const & get_formats () { return check_list (formats); }
202         FormatStatePtr duplicate_format_state (FormatStatePtr state);
203         void remove_format_state (FormatStatePtr state);
204
205         PBD::sys::path save_format_to_disk (FormatPtr format);
206         void remove_format_profile (FormatPtr format);
207         FormatPtr get_new_format (FormatPtr original);
208
209         PBD::Signal0<void> FormatListChanged;
210
211   private:
212
213         FormatStateList formats;
214
215         bool init_formats (XMLNodeList nodes);
216         FormatStatePtr deserialize_format (XMLNode & root);
217         XMLNode & serialize_format (FormatStatePtr state);
218
219         void load_formats ();
220
221         FormatPtr load_format (XMLNode & node);
222         void load_format_from_disk (PBD::sys::path const & path);
223
224         boost::shared_ptr<FormatList> format_list;
225         FileMap                       format_file_map;
226
227 /* Filenames */
228   public:
229
230         typedef boost::shared_ptr<ExportFilename> FilenamePtr;
231
232         struct FilenameState {
233                 FilenamePtr  filename;
234
235                 FilenameState (FilenamePtr ptr) : filename (ptr) {}
236         };
237         typedef boost::shared_ptr<FilenameState> FilenameStatePtr;
238         typedef std::list<FilenameStatePtr> FilenameStateList;
239
240         FilenameStateList const & get_filenames () { return check_list (filenames); }
241         FilenameStatePtr duplicate_filename_state (FilenameStatePtr state);
242         void remove_filename_state (FilenameStatePtr state);
243
244   private:
245
246         FilenameStateList filenames;
247
248         bool init_filenames (XMLNodeList nodes);
249         FilenamePtr load_filename (XMLNode & node);
250
251 /* Warnings */
252   public:
253         struct Warnings {
254                 std::list<Glib::ustring> errors;
255                 std::list<Glib::ustring> warnings;
256                 std::list<Glib::ustring> conflicting_filenames;
257         };
258
259         boost::shared_ptr<Warnings> get_warnings ();
260
261   private:
262         void check_config (boost::shared_ptr<Warnings> warnings,
263                            TimespanStatePtr timespan_state,
264                            ChannelConfigStatePtr channel_config_state,
265                            FormatStatePtr format_state,
266                            FilenameStatePtr filename_state);
267
268  /* Utilities */
269
270         /* Element state lists should never be empty, this is used to check them */
271         template<typename T>
272         std::list<T> const &
273         check_list (std::list<T> const & list)
274         {
275                 if (list.empty()) {
276                         throw std::runtime_error ("Programming error: Uninitialized list in ExportProfileManager");
277                 }
278                 return list;
279         }
280
281 };
282
283
284 } // namespace ARDOUR
285
286 #endif /* __ardour_export_profile_manager_h__ */