ardour
export_handler.h
Go to the documentation of this file.
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_handler_h__
22 #define __ardour_export_handler_h__
23 
24 #include <map>
25 #include <fstream>
26 
27 #include <boost/operators.hpp>
28 #include <boost/shared_ptr.hpp>
29 
30 #include "ardour/export_pointers.h"
31 #include "ardour/session.h"
33 #include "ardour/types.h"
34 #include "pbd/signals.h"
35 
36 namespace AudioGrapher {
37  class BroadcastInfo;
38 }
39 
40 namespace ARDOUR
41 {
42 
43 class ExportTimespan;
44 class ExportChannelConfiguration;
45 class ExportFormatSpecification;
46 class ExportFilename;
47 class ExportGraphBuilder;
48 class Location;
49 
51 {
52  public:
53 
54  ExportElementFactory (Session & session);
56 
57  ExportTimespanPtr add_timespan ();
58 
59  ExportChannelConfigPtr add_channel_config ();
60 
61  ExportFormatSpecPtr add_format ();
62  ExportFormatSpecPtr add_format (XMLNode const & state);
63  ExportFormatSpecPtr add_format_copy (ExportFormatSpecPtr other);
64 
65  ExportFilenamePtr add_filename ();
66  ExportFilenamePtr add_filename_copy (ExportFilenamePtr other);
67 
68  private:
70 };
71 
72 class LIBARDOUR_API ExportHandler : public ExportElementFactory, public sigc::trackable
73 {
74  public:
75  struct FileSpec {
76  FileSpec() {}
78  ExportFilenamePtr filename, BroadcastInfoPtr broadcast_info)
79  : channel_config (channel_config)
80  , format (format)
81  , filename (filename)
82  , broadcast_info (broadcast_info)
83  {}
84 
89  };
90 
91  private:
92  /* Session::get_export_handler() should be used to obtain an export handler
93  * This ensures that it doesn't go out of scope before finalize_audio_export is called
94  */
95 
97  ExportHandler (Session & session);
98 
99  void command_output(std::string output, size_t size);
100 
101  public:
102  ~ExportHandler ();
103 
104  bool add_export_config (ExportTimespanPtr timespan, ExportChannelConfigPtr channel_config,
105  ExportFormatSpecPtr format, ExportFilenamePtr filename,
106  BroadcastInfoPtr broadcast_info);
107  void do_export ();
108 
109  std::string get_cd_marker_filename(std::string filename, CDMarkerFormat format);
110 
114  PBD::Signal3<void, double, double, std::string> SoundcloudProgress;
115 
116  /* upload credentials & preferences */
117  std::string soundcloud_username;
118  std::string soundcloud_password;
122 
123  private:
124 
125  void handle_duplicate_format_extensions();
126  int process (framecnt_t frames);
127 
131 
132  /* The timespan and corresponding file specifications that we are exporting;
133  there can be multiple FileSpecs for each ExportTimespan.
134  */
135  typedef std::multimap<ExportTimespanPtr, FileSpec> ConfigMap;
136  ConfigMap config_map;
137 
139 
140  /* Timespan management */
141 
142  void start_timespan ();
143  int process_timespan (framecnt_t frames);
144  int process_normalize ();
145  void finish_timespan ();
146 
147  typedef std::pair<ConfigMap::iterator, ConfigMap::iterator> TimespanBounds;
149  TimespanBounds timespan_bounds;
150 
153 
154  /* CD Marker stuff */
155 
156  struct CDMarkerStatus {
157  CDMarkerStatus (std::string out_file, ExportTimespanPtr timespan,
158  ExportFormatSpecPtr format, std::string filename)
159  : out (out_file.c_str()), timespan (timespan), format (format), filename (filename), marker(0)
160  , track_number (1), track_position (0), track_duration (0), track_start_frame (0)
161  , index_number (1), index_position (0)
162  {}
163 
164  /* General info */
165  std::ofstream out;
168  std::string filename;
170 
171  /* Track info */
172  uint32_t track_number;
176 
177  /* Index info */
178  uint32_t index_number;
180  };
181 
182 
183  void export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSpecPtr file_format,
184  std::string filename, CDMarkerFormat format);
185 
186  void write_cue_header (CDMarkerStatus & status);
187  void write_toc_header (CDMarkerStatus & status);
188  void write_mp4ch_header (CDMarkerStatus & status);
189 
190  void write_track_info_cue (CDMarkerStatus & status);
191  void write_track_info_toc (CDMarkerStatus & status);
192  void write_track_info_mp4ch (CDMarkerStatus & status);
193 
194  void write_index_info_cue (CDMarkerStatus & status);
195  void write_index_info_toc (CDMarkerStatus & status);
196  void write_index_info_mp4ch (CDMarkerStatus & status);
197 
198  void frames_to_cd_frames_string (char* buf, framepos_t when);
199  void frames_to_chapter_marks_string (char* buf, framepos_t when);
200 
201  std::string toc_escape_cdtext (const std::string&);
202  std::string toc_escape_filename (const std::string&);
203  std::string cue_escape_cdtext (const std::string& txt);
204 
207 };
208 
209 } // namespace ARDOUR
210 
211 #endif /* __ardour_export_handler_h__ */
ExportTimespanPtr current_timespan
std::string soundcloud_username
CDMarkerStatus(std::string out_file, ExportTimespanPtr timespan, ExportFormatSpecPtr format, std::string filename)
PBD::ScopedConnection process_connection
boost::shared_ptr< ExportHandler > get_export_handler()
ExportChannelConfigPtr channel_config
ExportStatusPtr export_status
int64_t framecnt_t
Definition: types.h:76
std::pair< ConfigMap::iterator, ConfigMap::iterator > TimespanBounds
Definition: amp.h:29
int64_t framepos_t
Definition: types.h:66
#define LIBARDOUR_API
std::string soundcloud_password
Definition: xml++.h:95
std::multimap< ExportTimespanPtr, FileSpec > ConfigMap
boost::shared_ptr< ExportGraphBuilder > graph_builder
FileSpec(ExportChannelConfigPtr channel_config, ExportFormatSpecPtr format, ExportFilenamePtr filename, BroadcastInfoPtr broadcast_info)
TimespanBounds timespan_bounds
CDMarkerFormat
Definition: types.h:468
PBD::Signal3< void, double, double, std::string > SoundcloudProgress