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/operators.hpp>
29 #include <boost/shared_ptr.hpp>
31 #include "ardour/ardour.h"
32 #include "ardour/export_pointers.h"
33 #include "ardour/session.h"
34 #include "ardour/types.h"
36 namespace AudioGrapher {
44 class ExportChannelConfiguration;
45 class ExportFormatSpecification;
47 class ExportGraphBuilder;
50 class ExportElementFactory
54 ExportElementFactory (Session & session);
55 ~ExportElementFactory ();
57 ExportTimespanPtr add_timespan ();
59 ExportChannelConfigPtr add_channel_config ();
61 ExportFormatSpecPtr add_format ();
62 ExportFormatSpecPtr add_format (XMLNode const & state);
63 ExportFormatSpecPtr add_format_copy (ExportFormatSpecPtr other);
65 ExportFilenamePtr add_filename ();
66 ExportFilenamePtr add_filename_copy (ExportFilenamePtr other);
72 class ExportHandler : public ExportElementFactory
77 FileSpec (ExportChannelConfigPtr channel_config, ExportFormatSpecPtr format,
78 ExportFilenamePtr filename, BroadcastInfoPtr broadcast_info)
79 : channel_config (channel_config)
82 , broadcast_info (broadcast_info)
85 ExportChannelConfigPtr channel_config;
86 ExportFormatSpecPtr format;
87 ExportFilenamePtr filename;
88 BroadcastInfoPtr broadcast_info;
93 /* Stuff for export configs
94 * The multimap maps timespans to file specifications
97 typedef std::pair<ExportTimespanPtr, FileSpec> ConfigPair;
98 typedef std::multimap<ExportTimespanPtr, FileSpec> ConfigMap;
100 typedef boost::shared_ptr<ExportGraphBuilder> GraphBuilderPtr;
103 /* Session::get_export_handler() should be used to obtain an export handler
104 * This ensures that it doesn't go out of scope before finalize_audio_export is called
107 friend boost::shared_ptr<ExportHandler> Session::get_export_handler();
108 ExportHandler (Session & session);
113 bool add_export_config (ExportTimespanPtr timespan, ExportChannelConfigPtr channel_config,
114 ExportFormatSpecPtr format, ExportFilenamePtr filename,
115 BroadcastInfoPtr broadcast_info);
116 void do_export (bool rt = false);
120 int process (framecnt_t frames);
123 GraphBuilderPtr graph_builder;
124 ExportStatusPtr export_status;
125 ConfigMap config_map;
130 /* Timespan management */
132 void start_timespan ();
133 int process_timespan (framecnt_t frames);
134 int process_normalize ();
135 void finish_timespan ();
137 typedef std::pair<ConfigMap::iterator, ConfigMap::iterator> TimespanBounds;
138 ExportTimespanPtr current_timespan;
139 TimespanBounds timespan_bounds;
141 PBD::ScopedConnection process_connection;
142 framepos_t process_position;
144 /* CD Marker stuff */
146 struct CDMarkerStatus {
147 CDMarkerStatus (std::string out_file, ExportTimespanPtr timespan,
148 ExportFormatSpecPtr format, std::string filename)
149 : out (out_file.c_str()), timespan (timespan), format (format), filename (filename), marker(0)
150 , track_number (1), track_position (0), track_duration (0), track_start_frame (0)
151 , index_number (1), index_position (0)
156 ExportTimespanPtr timespan;
157 ExportFormatSpecPtr format;
158 std::string filename;
162 uint32_t track_number;
163 framepos_t track_position;
164 framepos_t track_duration;
165 framepos_t track_start_frame;
168 uint32_t index_number;
169 framepos_t index_position;
173 void export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSpecPtr file_format,
174 std::string filename, CDMarkerFormat format);
176 void write_cue_header (CDMarkerStatus & status);
177 void write_toc_header (CDMarkerStatus & status);
179 void write_track_info_cue (CDMarkerStatus & status);
180 void write_track_info_toc (CDMarkerStatus & status);
182 void write_index_info_cue (CDMarkerStatus & status);
183 void write_index_info_toc (CDMarkerStatus & status);
185 void frames_to_cd_frames_string (char* buf, framepos_t when);
191 } // namespace ARDOUR
193 #endif /* __ardour_export_handler_h__ */