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_handler_h__
22 #define __ardour_export_handler_h__
28 #include <boost/shared_ptr.hpp>
30 #include "ardour/session.h"
31 #include "ardour/ardour.h"
32 #include "ardour/types.h"
38 class ExportChannelConfiguration;
39 class ExportFormatSpecification;
41 class ExportProcessor;
43 class ExportElementFactory
46 typedef boost::shared_ptr<ExportTimespan> TimespanPtr;
47 typedef boost::shared_ptr<ExportChannelConfiguration> ChannelConfigPtr;
48 typedef boost::shared_ptr<ExportFormatSpecification> FormatPtr;
49 typedef boost::shared_ptr<ExportFilename> FilenamePtr;
53 ExportElementFactory (Session & session);
54 ~ExportElementFactory ();
56 TimespanPtr add_timespan ();
58 ChannelConfigPtr add_channel_config ();
60 FormatPtr add_format ();
61 FormatPtr add_format (XMLNode const & state);
62 FormatPtr add_format_copy (FormatPtr other);
64 FilenamePtr add_filename ();
65 FilenamePtr add_filename_copy (FilenamePtr other);
71 class ExportHandler : public ExportElementFactory
75 /* Stuff for export configs
76 * The multimap maps timespans to file specifications
81 FileSpec (ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename) :
82 channel_config (channel_config),
87 ChannelConfigPtr channel_config;
92 typedef std::pair<TimespanPtr, FileSpec> ConfigPair;
93 typedef std::multimap<TimespanPtr, FileSpec> ConfigMap;
95 typedef boost::shared_ptr<ExportProcessor> ProcessorPtr;
96 typedef boost::shared_ptr<ExportStatus> StatusPtr;
99 /* Session::get_export_handler() should be used to obtain an export handler
100 * This ensures that it doesn't go out of scope before finalize_audio_export is called
103 friend boost::shared_ptr<ExportHandler> Session::get_export_handler();
104 ExportHandler (Session & session);
109 bool add_export_config (TimespanPtr timespan, ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename);
110 void do_export (bool rt = false);
115 ProcessorPtr processor;
116 StatusPtr export_status;
117 ConfigMap config_map;
121 PBD::ScopedConnection files_written_connection;
122 PBD::ScopedConnection export_read_finished_connection;
123 std::list<Glib::ustring> files_written;
124 void add_file (const Glib::ustring&);
126 /* CD Marker stuff */
128 struct CDMarkerStatus {
129 CDMarkerStatus (std::string out_file, TimespanPtr timespan, FormatPtr format, std::string filename) :
130 out (out_file.c_str()), timespan (timespan), format (format), filename (filename),
131 track_number (1), track_position (0), track_duration (0), track_start_frame (0),
132 index_number (1), index_position (0)
137 TimespanPtr timespan;
139 std::string filename;
143 uint32_t track_number;
144 nframes_t track_position;
145 nframes_t track_duration;
146 nframes_t track_start_frame;
149 uint32_t index_number;
150 nframes_t index_position;
154 void export_cd_marker_file (TimespanPtr timespan, FormatPtr file_format, std::string filename, CDMarkerFormat format);
156 void write_cue_header (CDMarkerStatus & status);
157 void write_toc_header (CDMarkerStatus & status);
159 void write_track_info_cue (CDMarkerStatus & status);
160 void write_track_info_toc (CDMarkerStatus & status);
162 void write_index_info_cue (CDMarkerStatus & status);
163 void write_index_info_toc (CDMarkerStatus & status);
165 void frames_to_cd_frames_string (char* buf, nframes_t when);
170 /* Timespan management */
172 void start_timespan ();
173 void finish_timespan ();
174 void timespan_thread_finished ();
176 typedef std::pair<ConfigMap::iterator, ConfigMap::iterator> TimespanBounds;
177 TimespanPtr current_timespan;
178 ConfigMap::iterator current_map_it;
179 TimespanBounds timespan_bounds;
180 PBD::ScopedConnection channel_config_connection;
184 } // namespace ARDOUR
186 #endif /* __ardour_export_handler_h__ */