a better fix for CUE/TOC string escaping: if the text is not Latin-1 already, reject...
[ardour.git] / libs / ardour / ardour / export_handler.h
index f826e09bf5f8e48220313e38da8cceea130b900a..025ab063133dd3b1336776a63afb5490646775ad 100644 (file)
 #include <list>
 #include <fstream>
 
+#include <boost/operators.hpp>
 #include <boost/shared_ptr.hpp>
 
 #include "ardour/ardour.h"
+#include "ardour/export_pointers.h"
 #include "ardour/session.h"
 #include "ardour/types.h"
 
@@ -47,27 +49,21 @@ class ExportGraphBuilder;
 
 class ExportElementFactory
 {
-  public:
-       typedef boost::shared_ptr<ExportTimespan> TimespanPtr;
-       typedef boost::shared_ptr<ExportChannelConfiguration> ChannelConfigPtr;
-       typedef boost::shared_ptr<ExportFormatSpecification> FormatPtr;
-       typedef boost::shared_ptr<ExportFilename> FilenamePtr;
-
   public:
 
        ExportElementFactory (Session & session);
        ~ExportElementFactory ();
 
-       TimespanPtr      add_timespan ();
+       ExportTimespanPtr add_timespan ();
 
-       ChannelConfigPtr add_channel_config ();
+       ExportChannelConfigPtr add_channel_config ();
 
-       FormatPtr        add_format ();
-       FormatPtr        add_format (XMLNode const & state);
-       FormatPtr        add_format_copy (FormatPtr other);
+       ExportFormatSpecPtr    add_format ();
+       ExportFormatSpecPtr    add_format (XMLNode const & state);
+       ExportFormatSpecPtr    add_format_copy (ExportFormatSpecPtr other);
 
-       FilenamePtr      add_filename ();
-       FilenamePtr      add_filename_copy (FilenamePtr other);
+       ExportFilenamePtr      add_filename ();
+       ExportFilenamePtr      add_filename_copy (ExportFilenamePtr other);
 
   private:
        Session & session;
@@ -78,30 +74,30 @@ class ExportHandler : public ExportElementFactory
   public:
        struct FileSpec {
                FileSpec() {}
-               FileSpec (ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename, boost::shared_ptr<AudioGrapher::BroadcastInfo> broadcast_info)
+               FileSpec (ExportChannelConfigPtr channel_config, ExportFormatSpecPtr format,
+                         ExportFilenamePtr filename, BroadcastInfoPtr broadcast_info)
                  : channel_config (channel_config)
                  , format (format)
                  , filename (filename)
                  , broadcast_info (broadcast_info)
                        {}
 
-               ChannelConfigPtr channel_config;
-               FormatPtr        format;
-               FilenamePtr      filename;
-               boost::shared_ptr<AudioGrapher::BroadcastInfo> broadcast_info;
+               ExportChannelConfigPtr channel_config;
+               ExportFormatSpecPtr        format;
+               ExportFilenamePtr      filename;
+               BroadcastInfoPtr       broadcast_info;
        };
-       
+
   private:
 
        /* Stuff for export configs
         * The multimap maps timespans to file specifications
         */
 
-       typedef std::pair<TimespanPtr, FileSpec> ConfigPair;
-       typedef std::multimap<TimespanPtr, FileSpec> ConfigMap;
+       typedef std::pair<ExportTimespanPtr, FileSpec> ConfigPair;
+       typedef std::multimap<ExportTimespanPtr, FileSpec> ConfigMap;
 
        typedef boost::shared_ptr<ExportGraphBuilder> GraphBuilderPtr;
-       typedef boost::shared_ptr<ExportStatus> StatusPtr;
 
   private:
        /* Session::get_export_handler() should be used to obtain an export handler
@@ -114,16 +110,20 @@ class ExportHandler : public ExportElementFactory
   public:
        ~ExportHandler ();
 
-       bool add_export_config (TimespanPtr timespan, ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename, boost::shared_ptr<AudioGrapher::BroadcastInfo> broadcast_info);
+       bool add_export_config (ExportTimespanPtr timespan, ExportChannelConfigPtr channel_config,
+                               ExportFormatSpecPtr format, ExportFilenamePtr filename,
+                               BroadcastInfoPtr broadcast_info);
        void do_export (bool rt = false);
 
+       std::string get_cd_marker_filename(std::string filename, CDMarkerFormat format);
+
   private:
 
-       int process (nframes_t frames);
-       
+       int process (framecnt_t frames);
+
        Session &          session;
        GraphBuilderPtr    graph_builder;
-       StatusPtr          export_status;
+       ExportStatusPtr    export_status;
        ConfigMap          config_map;
 
        bool               realtime;
@@ -132,35 +132,36 @@ class ExportHandler : public ExportElementFactory
        /* Timespan management */
 
        void start_timespan ();
-       int  process_timespan (nframes_t frames);
+       int  process_timespan (framecnt_t frames);
        int  process_normalize ();
        void finish_timespan ();
 
        typedef std::pair<ConfigMap::iterator, ConfigMap::iterator> TimespanBounds;
-       TimespanPtr           current_timespan;
+       ExportTimespanPtr     current_timespan;
        TimespanBounds        timespan_bounds;
-       
+
        PBD::ScopedConnection process_connection;
        framepos_t             process_position;
 
        /* CD Marker stuff */
 
        struct CDMarkerStatus {
-               CDMarkerStatus (std::string out_file, TimespanPtr timespan, FormatPtr format, std::string filename) :
-                 out (out_file.c_str()), timespan (timespan), format (format), filename (filename), marker(0),
-                 track_number (1), track_position (0), track_duration (0), track_start_frame (0),
-                 index_number (1), index_position (0)
+               CDMarkerStatus (std::string out_file, ExportTimespanPtr timespan,
+                               ExportFormatSpecPtr format, std::string filename)
+                 : out (out_file.c_str()), timespan (timespan), format (format), filename (filename), marker(0)
+                 , track_number (1), track_position (0), track_duration (0), track_start_frame (0)
+                 , index_number (1), index_position (0)
                  {}
 
                /* General info */
                std::ofstream  out;
-               TimespanPtr    timespan;
-               FormatPtr      format;
-               std::string    filename;
-               Location *     marker;
+               ExportTimespanPtr   timespan;
+               ExportFormatSpecPtr format;
+               std::string         filename;
+               Location *          marker;
 
                /* Track info */
-               uint32_t       track_number;
+               uint32_t        track_number;
                framepos_t      track_position;
                framepos_t      track_duration;
                framepos_t      track_start_frame;
@@ -171,7 +172,8 @@ class ExportHandler : public ExportElementFactory
        };
 
 
-       void export_cd_marker_file (TimespanPtr timespan, FormatPtr file_format, std::string filename, CDMarkerFormat format);
+       void export_cd_marker_file (ExportTimespanPtr timespan, ExportFormatSpecPtr file_format,
+                                   std::string filename, CDMarkerFormat format);
 
        void write_cue_header (CDMarkerStatus & status);
        void write_toc_header (CDMarkerStatus & status);
@@ -183,6 +185,7 @@ class ExportHandler : public ExportElementFactory
        void write_index_info_toc (CDMarkerStatus & status);
 
        void frames_to_cd_frames_string (char* buf, framepos_t when);
+       std::string cd_marker_file_escape_string (const std::string&);
 
        int cue_tracknum;
        int cue_indexnum;