some strategic documentation
[ardour.git] / libs / ardour / ardour / export_graph_builder.h
index 444f1ae65963d07524c36c0c2a0001d516de7231..0a9912e43ef3feb06ae6ee6221665a8de027fd38 100644 (file)
 #ifndef __ardour_export_graph_builder_h__
 #define __ardour_export_graph_builder_h__
 
-#include "ardour/ardour.h"
 #include "ardour/export_handler.h"
-#include "ardour/export_channel.h"
-#include "ardour/export_format_base.h"
+#include "ardour/export_analysis.h"
 
 #include "audiographer/utils/identity_vertex.h"
 
@@ -35,6 +33,8 @@ namespace AudioGrapher {
        class SampleRateConverter;
        class PeakReader;
        class Normalizer;
+       class Analyser;
+       template <typename T> class Chunker;
        template <typename T> class SampleFormatConverter;
        template <typename T> class Interleaver;
        template <typename T> class SndfileWriter;
@@ -47,15 +47,19 @@ namespace AudioGrapher {
 namespace ARDOUR
 {
 
-class ExportGraphBuilder
+class ExportTimespan;
+class Session;
+
+class LIBARDOUR_API ExportGraphBuilder
 {
   private:
        typedef ExportHandler::FileSpec FileSpec;
-       typedef ExportElementFactory::FilenamePtr FilenamePtr;
 
        typedef boost::shared_ptr<AudioGrapher::Sink<Sample> > FloatSinkPtr;
        typedef boost::shared_ptr<AudioGrapher::IdentityVertex<Sample> > IdentityVertexPtr;
+       typedef boost::shared_ptr<AudioGrapher::Analyser> AnalysisPtr;
        typedef std::map<ExportChannelPtr,  IdentityVertexPtr> ChannelMap;
+       typedef std::map<std::string, AnalysisPtr> AnalysisMap;
 
   public:
 
@@ -64,24 +68,34 @@ class ExportGraphBuilder
 
        int process (framecnt_t frames, bool last_cycle);
        bool process_normalize (); // returns true when finished
+       bool will_normalize() { return !normalizers.empty(); }
+       unsigned get_normalize_cycle_count() const;
 
        void reset ();
+       void cleanup (bool remove_out_files = false);
        void set_current_timespan (boost::shared_ptr<ExportTimespan> span);
        void add_config (FileSpec const & config);
+       void get_analysis_results (AnalysisResults& results);
 
   private:
 
+       void add_analyser (const std::string& fn, AnalysisPtr ap) {
+               analysis_map.insert (std::make_pair (fn, ap));
+       }
+
        void add_split_config (FileSpec const & config);
 
        class Encoder {
-         public:
+            public:
                template <typename T> boost::shared_ptr<AudioGrapher::Sink<T> > init (FileSpec const & new_config);
                void add_child (FileSpec const & new_config);
+               void remove_children ();
+               void destroy_writer (bool delete_out_file);
                bool operator== (FileSpec const & other_config) const;
 
                static int get_real_format (FileSpec const & config);
 
-         private:
+                                               private:
                typedef boost::shared_ptr<AudioGrapher::SndfileWriter<Sample> > FloatWriterPtr;
                typedef boost::shared_ptr<AudioGrapher::SndfileWriter<int> >    IntWriterPtr;
                typedef boost::shared_ptr<AudioGrapher::SndfileWriter<short> >  ShortWriterPtr;
@@ -90,9 +104,11 @@ class ExportGraphBuilder
                void copy_files (std::string orig_path);
 
                FileSpec               config;
-               std::list<FilenamePtr> filenames;
+               std::list<ExportFilenamePtr> filenames;
                PBD::ScopedConnection  copy_files_connection;
 
+               std::string writer_filename;
+
                // Only one of these should be available at a time
                FloatWriterPtr float_writer;
                IntWriterPtr   int_writer;
@@ -101,14 +117,17 @@ class ExportGraphBuilder
 
        // sample format converter
        class SFC {
-         public:
+            public:
                // This constructor so that this can be constructed like a Normalizer
                SFC (ExportGraphBuilder &, FileSpec const & new_config, framecnt_t max_frames);
                FloatSinkPtr sink ();
                void add_child (FileSpec const & new_config);
+               void remove_children (bool remove_out_files);
                bool operator== (FileSpec const & other_config) const;
+               void set_peak (float);
 
-         private:
+                                               private:
+               typedef boost::shared_ptr<AudioGrapher::Chunker<float> > ChunkerPtr;
                typedef boost::shared_ptr<AudioGrapher::SampleFormatConverter<Sample> > FloatConverterPtr;
                typedef boost::shared_ptr<AudioGrapher::SampleFormatConverter<int> >   IntConverterPtr;
                typedef boost::shared_ptr<AudioGrapher::SampleFormatConverter<short> > ShortConverterPtr;
@@ -117,6 +136,9 @@ class ExportGraphBuilder
                boost::ptr_list<Encoder> children;
                int                data_width;
 
+               ChunkerPtr      chunker;
+               AnalysisPtr     analyser;
+               bool            _analyse;
                // Only one of these should be available at a time
                FloatConverterPtr float_converter;
                IntConverterPtr int_converter;
@@ -124,16 +146,19 @@ class ExportGraphBuilder
        };
 
        class Normalizer {
-         public:
+                                               public:
                Normalizer (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
                FloatSinkPtr sink ();
                void add_child (FileSpec const & new_config);
+               void remove_children (bool remove_out_files);
                bool operator== (FileSpec const & other_config) const;
 
+               unsigned get_normalize_cycle_count() const;
+
                /// Returns true when finished
                bool process ();
 
-         private:
+                                               private:
                typedef boost::shared_ptr<AudioGrapher::PeakReader> PeakReaderPtr;
                typedef boost::shared_ptr<AudioGrapher::Normalizer> NormalizerPtr;
                typedef boost::shared_ptr<AudioGrapher::TmpFile<Sample> > TmpFilePtr;
@@ -159,13 +184,15 @@ class ExportGraphBuilder
 
        // sample rate converter
        class SRC {
-         public:
+            public:
                SRC (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
                FloatSinkPtr sink ();
                void add_child (FileSpec const & new_config);
+               void remove_children (bool remove_out_files);
+
                bool operator== (FileSpec const & other_config) const;
 
-         private:
+                                               private:
                typedef boost::shared_ptr<AudioGrapher::SampleRateConverter> SRConverterPtr;
 
                template<typename T>
@@ -181,13 +208,14 @@ class ExportGraphBuilder
 
        // Silence trimmer + adder
        class SilenceHandler {
-         public:
+           public:
                SilenceHandler (ExportGraphBuilder & parent, FileSpec const & new_config, framecnt_t max_frames);
                FloatSinkPtr sink ();
                void add_child (FileSpec const & new_config);
+               void remove_children (bool remove_out_files);
                bool operator== (FileSpec const & other_config) const;
 
-         private:
+                                               private:
                typedef boost::shared_ptr<AudioGrapher::SilenceTrimmer<Sample> > SilenceTrimmerPtr;
 
                ExportGraphBuilder & parent;
@@ -199,19 +227,22 @@ class ExportGraphBuilder
 
        // channel configuration
        class ChannelConfig {
-         public:
+           public:
                ChannelConfig (ExportGraphBuilder & parent, FileSpec const & new_config, ChannelMap & channel_map);
                void add_child (FileSpec const & new_config);
+               void remove_children (bool remove_out_files);
                bool operator== (FileSpec const & other_config) const;
 
-         private:
+                                               private:
                typedef boost::shared_ptr<AudioGrapher::Interleaver<Sample> > InterleaverPtr;
+               typedef boost::shared_ptr<AudioGrapher::Chunker<Sample> > ChunkerPtr;
 
                ExportGraphBuilder &      parent;
                FileSpec                  config;
                boost::ptr_list<SilenceHandler> children;
                InterleaverPtr            interleaver;
-               framecnt_t                max_frames;
+               ChunkerPtr                chunker;
+               framecnt_t                max_frames_out;
        };
 
        Session const & session;
@@ -228,6 +259,8 @@ class ExportGraphBuilder
 
        std::list<Normalizer *> normalizers;
 
+       AnalysisMap analysis_map;
+
        Glib::ThreadPool thread_pool;
 };