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__
26 #include <boost/operators.hpp>
27 #include <boost/shared_ptr.hpp>
29 #include "pbd/gstdio_compat.h"
31 #include "ardour/export_pointers.h"
32 #include "ardour/session.h"
33 #include "ardour/libardour_visibility.h"
34 #include "ardour/types.h"
35 #include "pbd/signals.h"
39 namespace AudioGrapher {
47 class ExportChannelConfiguration;
48 class ExportFormatSpecification;
50 class ExportGraphBuilder;
53 class LIBARDOUR_API ExportElementFactory
57 ExportElementFactory (Session & session);
58 ~ExportElementFactory ();
60 ExportTimespanPtr add_timespan ();
62 ExportChannelConfigPtr add_channel_config ();
64 ExportFormatSpecPtr add_format ();
65 ExportFormatSpecPtr add_format (XMLNode const & state);
66 ExportFormatSpecPtr add_format_copy (ExportFormatSpecPtr other);
68 ExportFilenamePtr add_filename ();
69 ExportFilenamePtr add_filename_copy (ExportFilenamePtr other);
76 class LIBARDOUR_API ExportHandler : public ExportElementFactory, public sigc::trackable
81 FileSpec (ExportChannelConfigPtr channel_config, ExportFormatSpecPtr format,
82 ExportFilenamePtr filename, BroadcastInfoPtr broadcast_info)
83 : channel_config (channel_config)
86 , broadcast_info (broadcast_info)
89 ExportChannelConfigPtr channel_config;
90 ExportFormatSpecPtr format;
91 ExportFilenamePtr filename;
92 BroadcastInfoPtr broadcast_info;
96 /* Session::get_export_handler() should be used to obtain an export handler
97 * This ensures that it doesn't go out of scope before finalize_audio_export is called
100 friend boost::shared_ptr<ExportHandler> Session::get_export_handler();
101 ExportHandler (Session & session);
103 void command_output(std::string output, size_t size);
108 bool add_export_config (ExportTimespanPtr timespan, ExportChannelConfigPtr channel_config,
109 ExportFormatSpecPtr format, ExportFilenamePtr filename,
110 BroadcastInfoPtr broadcast_info);
113 std::string get_cd_marker_filename(std::string filename, CDMarkerFormat format);
115 /** signal emitted when soundcloud export reports progress updates during upload.
116 * The parameters are total and current bytes downloaded, and the current filename
118 PBD::Signal3<void, double, double, std::string> SoundcloudProgress;
120 /* upload credentials & preferences */
121 std::string soundcloud_username;
122 std::string soundcloud_password;
123 bool soundcloud_make_public;
124 bool soundcloud_open_page;
125 bool soundcloud_downloadable;
131 void handle_duplicate_format_extensions();
132 int process (samplecnt_t samples);
135 boost::shared_ptr<ExportGraphBuilder> graph_builder;
136 ExportStatusPtr export_status;
138 /* The timespan and corresponding file specifications that we are exporting;
139 there can be multiple FileSpecs for each ExportTimespan.
141 typedef std::multimap<ExportTimespanPtr, FileSpec> ConfigMap;
142 ConfigMap config_map;
144 bool post_processing;
146 /* Timespan management */
148 void start_timespan ();
149 int process_timespan (samplecnt_t samples);
151 void finish_timespan ();
153 typedef std::pair<ConfigMap::iterator, ConfigMap::iterator> TimespanBounds;
154 ExportTimespanPtr current_timespan;
155 TimespanBounds timespan_bounds;
157 PBD::ScopedConnection process_connection;
158 samplepos_t process_position;
160 /* CD Marker stuff */
162 struct CDMarkerStatus {
163 CDMarkerStatus (std::string out_file, ExportTimespanPtr timespan,
164 ExportFormatSpecPtr format, std::string filename)
166 , timespan (timespan)
168 , filename (filename)
173 , track_start_sample (0)
179 if (!g_file_set_contents (path.c_str(), out.str().c_str(), -1, NULL)) {
180 PBD::error << string_compose(_("Editor: cannot open \"%1\" as export file for CD marker file"), path) << endmsg;
187 std::stringstream out;
190 ExportTimespanPtr timespan;
191 ExportFormatSpecPtr format;
192 std::string filename;
196 uint32_t track_number;
197 samplepos_t track_position;
198 samplepos_t track_duration;
199 samplepos_t track_start_sample;
202 uint32_t index_number;
203 samplepos_t index_position;
207 void export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSpecPtr file_format,
208 std::string filename, CDMarkerFormat format);
210 void write_cue_header (CDMarkerStatus & status);
211 void write_toc_header (CDMarkerStatus & status);
212 void write_mp4ch_header (CDMarkerStatus & status);
214 void write_track_info_cue (CDMarkerStatus & status);
215 void write_track_info_toc (CDMarkerStatus & status);
216 void write_track_info_mp4ch (CDMarkerStatus & status);
218 void write_index_info_cue (CDMarkerStatus & status);
219 void write_index_info_toc (CDMarkerStatus & status);
220 void write_index_info_mp4ch (CDMarkerStatus & status);
222 void samples_to_cd_samples_string (char* buf, samplepos_t when);
223 void samples_to_chapter_marks_string (char* buf, samplepos_t when);
225 std::string toc_escape_cdtext (const std::string&);
226 std::string toc_escape_filename (const std::string&);
227 std::string cue_escape_cdtext (const std::string& txt);
233 } // namespace ARDOUR
235 #endif /* __ardour_export_handler_h__ */