Make audiographer SndfileWriter use PBD::Signal and use it properly. Also make export...
authorSakari Bergen <sakari.bergen@beatwaves.net>
Fri, 2 Apr 2010 20:49:02 +0000 (20:49 +0000)
committerSakari Bergen <sakari.bergen@beatwaves.net>
Fri, 2 Apr 2010 20:49:02 +0000 (20:49 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6844 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/export_dialog.h
libs/ardour/ardour/export_graph_builder.h
libs/ardour/ardour/export_profile_manager.h
libs/ardour/export_graph_builder.cc
libs/ardour/wscript
libs/audiographer/audiographer/sndfile/sndfile_writer.h

index 75511b5ad34b689044716b041fdf3cbb4965549b..33a983062f5ec96d6295d2cca4626554a627581b 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef __export_dialog_h__
 #define __export_dialog_h__
 
-#include <boost/shared_ptr.hpp>
+#include <boost/scoped_ptr.hpp>
 
 #include "ardour/export_profile_manager.h"
 
@@ -75,10 +75,10 @@ class ExportDialog : public ArdourDialog {
        // Must initialize all the shared_ptrs below
        virtual void init_components ();
 
-       boost::shared_ptr<ExportPresetSelector>   preset_selector;
-       boost::shared_ptr<ExportTimespanSelector> timespan_selector;
-       boost::shared_ptr<ExportChannelSelector>  channel_selector;
-       boost::shared_ptr<ExportFileNotebook>     file_notebook;
+       boost::scoped_ptr<ExportPresetSelector>   preset_selector;
+       boost::scoped_ptr<ExportTimespanSelector> timespan_selector;
+       boost::scoped_ptr<ExportChannelSelector>  channel_selector;
+       boost::scoped_ptr<ExportFileNotebook>     file_notebook;
 
        Gtk::VBox                                 warning_widget;
        Gtk::VBox                                 progress_widget;
index e67c2fe90c4896d3c319535abd3dfc2538fa129e..55fa7133fcf2eec476375df22b6035f7b5324e24 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "audiographer/utils/identity_vertex.h"
 
+#include <boost/ptr_container/ptr_list.hpp>
 #include <glibmm/threadpool.h>
 
 namespace AudioGrapher {
@@ -71,7 +72,7 @@ class ExportGraphBuilder
        
        void add_split_config (FileSpec const & config);
        
-       class Encoder : public sigc::trackable {
+       class Encoder {
          public:
                template <typename T> boost::shared_ptr<AudioGrapher::Sink<T> > init (FileSpec const & new_config);
                void add_child (FileSpec const & new_config);
@@ -89,6 +90,7 @@ class ExportGraphBuilder
                
                FileSpec               config;
                std::list<FilenamePtr> filenames;
+               PBD::ScopedConnection  copy_files_connection;
                
                // Only one of these should be available at a time
                FloatWriterPtr float_writer;
@@ -100,8 +102,8 @@ class ExportGraphBuilder
        class SFC {
          public:
                // This constructor so that this can be constructed like a Normalizer
-               SFC (ExportGraphBuilder &) : data_width(0) {}
-               FloatSinkPtr init (FileSpec const & new_config, nframes_t max_frames);
+               SFC (ExportGraphBuilder &, FileSpec const & new_config, nframes_t max_frames);
+               FloatSinkPtr sink ();
                void add_child (FileSpec const & new_config);
                bool operator== (FileSpec const & other_config) const;
                
@@ -111,19 +113,19 @@ class ExportGraphBuilder
                typedef boost::shared_ptr<AudioGrapher::SampleFormatConverter<short> > ShortConverterPtr;
                
                FileSpec           config;
-               std::list<Encoder> children;
+               boost::ptr_list<Encoder> children;
                int                data_width;
                
                // Only one of these should be available at a time
                FloatConverterPtr float_converter;
-               IntConverterPtr   int_converter;
+               IntConverterPtr int_converter;
                ShortConverterPtr short_converter;
        };
        
-       class Normalizer : public sigc::trackable {
+       class Normalizer {
          public:
-               Normalizer (ExportGraphBuilder & parent) : parent (parent) {}
-               FloatSinkPtr init (FileSpec const & new_config, nframes_t max_frames);
+               Normalizer (ExportGraphBuilder & parent, FileSpec const & new_config, nframes_t max_frames);
+               FloatSinkPtr sink ();
                void add_child (FileSpec const & new_config);
                bool operator== (FileSpec const & other_config) const;
                
@@ -149,14 +151,16 @@ class ExportGraphBuilder
                TmpFilePtr      tmp_file;
                NormalizerPtr   normalizer;
                ThreaderPtr     threader;
-               std::list<SFC>  children;
+               boost::ptr_list<SFC> children;
+               
+               PBD::ScopedConnection post_processing_connection;
        };
        
        // sample rate converter
        class SRC {
          public:
-               SRC (ExportGraphBuilder & parent) : parent (parent) {}
-               FloatSinkPtr init (FileSpec const & new_config, nframes_t max_frames);
+               SRC (ExportGraphBuilder & parent, FileSpec const & new_config, nframes_t max_frames);
+               FloatSinkPtr sink ();
                void add_child (FileSpec const & new_config);
                bool operator== (FileSpec const & other_config) const;
                
@@ -164,12 +168,12 @@ class ExportGraphBuilder
                typedef boost::shared_ptr<AudioGrapher::SampleRateConverter> SRConverterPtr;
                
                template<typename T>
-               void add_child_to_list (FileSpec const & new_config, std::list<T> & list);
+               void add_child_to_list (FileSpec const & new_config, boost::ptr_list<T> & list);
   
                ExportGraphBuilder &  parent;
                FileSpec              config;
-               std::list<SFC>        children;
-               std::list<Normalizer> normalized_children;
+               boost::ptr_list<SFC>  children;
+               boost::ptr_list<Normalizer> normalized_children;
                SRConverterPtr        converter;
                nframes_t             max_frames_out;
        };
@@ -177,8 +181,8 @@ class ExportGraphBuilder
        // Silence trimmer + adder
        class SilenceHandler {
          public:
-               SilenceHandler (ExportGraphBuilder & parent) : parent (parent) {}
-               FloatSinkPtr init (FileSpec const & new_config, nframes_t max_frames);
+               SilenceHandler (ExportGraphBuilder & parent, FileSpec const & new_config, nframes_t max_frames);
+               FloatSinkPtr sink ();
                void add_child (FileSpec const & new_config);
                bool operator== (FileSpec const & other_config) const;
                
@@ -187,7 +191,7 @@ class ExportGraphBuilder
                
                ExportGraphBuilder & parent;
                FileSpec             config;
-               std::list<SRC>       children;
+               boost::ptr_list<SRC> children;
                SilenceTrimmerPtr    silence_trimmer;
                nframes_t            max_frames_in;
        };
@@ -195,8 +199,7 @@ class ExportGraphBuilder
        // channel configuration
        class ChannelConfig {
          public:
-               ChannelConfig (ExportGraphBuilder & parent) : parent (parent) {}
-               void init (FileSpec const & new_config, ChannelMap & channel_map);
+               ChannelConfig (ExportGraphBuilder & parent, FileSpec const & new_config, ChannelMap & channel_map);
                void add_child (FileSpec const & new_config);
                bool operator== (FileSpec const & other_config) const;
                
@@ -205,7 +208,7 @@ class ExportGraphBuilder
                
                ExportGraphBuilder &      parent;
                FileSpec                  config;
-               std::list<SilenceHandler> children;
+               boost::ptr_list<SilenceHandler> children;
                InterleaverPtr            interleaver;
                nframes_t                 max_frames;
        };
@@ -213,7 +216,7 @@ class ExportGraphBuilder
        Session const & session;
        
        // Roots for export processor trees
-       typedef std::list<ChannelConfig> ChannelConfigList;
+       typedef boost::ptr_list<ChannelConfig> ChannelConfigList;
        ChannelConfigList channel_configs;
        
        // The sources of all data, each channel is read only once
index 793ceac1f589a430ecd915a22099283e6d53c62d..aff481eced4bc11d05ed659c681dcc90c155d12c 100644 (file)
@@ -124,13 +124,12 @@ class ExportProfileManager
 
                TimespanState (boost::shared_ptr<Location> session_range,
                               boost::shared_ptr<Location> selection_range,
-                              boost::shared_ptr<LocationList> ranges) :
-                 timespans (new TimespanList ()),
-                 time_format (Timecode),
-
-                 session_range (session_range),
-                 selection_range (selection_range),
-                 ranges (ranges)
+                              boost::shared_ptr<LocationList> ranges)
+                 : timespans (new TimespanList ())
+                 , time_format (Timecode)
+                 , session_range (session_range)
+                 , selection_range (selection_range)
+                 , ranges (ranges)
                {}
        };
 
index bc3a162e042558c58cbb7805cc961a4d0e1b4da3..ab77252e0513aeaea5defc9adcfdb57da68ca6b6 100644 (file)
@@ -109,9 +109,7 @@ ExportGraphBuilder::add_split_config (FileSpec const & config)
        }
        
        // No duplicate channel config found, create new one
-       channel_configs.push_back (ChannelConfig (*this));
-       ChannelConfig & c_config (channel_configs.back());
-       c_config.init (config, channels);
+       channel_configs.push_back (new ChannelConfig (*this, config, channels));
 }
 
 /* Encoder */
@@ -171,7 +169,7 @@ ExportGraphBuilder::Encoder::init_writer (boost::shared_ptr<AudioGrapher::Sndfil
        Glib::ustring filename = config.filename->get_path (config.format);
        
        writer.reset (new AudioGrapher::SndfileWriter<T> (filename, format, channels, config.format->sample_rate()));
-       writer->FileWritten.connect (sigc::mem_fun (*this, &ExportGraphBuilder::Encoder::copy_files));
+       writer->FileWritten.connect_same_thread (copy_files_connection, boost::bind (&ExportGraphBuilder::Encoder::copy_files, this, _1));
 }
 
 void
@@ -186,8 +184,8 @@ ExportGraphBuilder::Encoder::copy_files (std::string orig_path)
 
 /* SFC */
 
-ExportGraphBuilder::FloatSinkPtr
-ExportGraphBuilder::SFC::init (FileSpec const & new_config, nframes_t max_frames)
+ExportGraphBuilder::SFC::SFC (ExportGraphBuilder &, FileSpec const & new_config, nframes_t max_frames)
+  : data_width(0)
 {
        config = new_config;
        data_width = sndfile_data_width (Encoder::get_real_format (config));
@@ -197,16 +195,25 @@ ExportGraphBuilder::SFC::init (FileSpec const & new_config, nframes_t max_frames
                short_converter = ShortConverterPtr (new SampleFormatConverter<short> (channels));
                short_converter->init (max_frames, config.format->dither_type(), data_width);
                add_child (config);
-               return short_converter;
        } else if (data_width == 24 || data_width == 32) {
                int_converter = IntConverterPtr (new SampleFormatConverter<int> (channels));
                int_converter->init (max_frames, config.format->dither_type(), data_width);
                add_child (config);
-               return int_converter;
        } else {
                float_converter = FloatConverterPtr (new SampleFormatConverter<Sample> (channels));
                float_converter->init (max_frames, config.format->dither_type(), data_width);
                add_child (config);
+       }
+}
+
+ExportGraphBuilder::FloatSinkPtr
+ExportGraphBuilder::SFC::sink ()
+{
+       if (data_width == 8 || data_width == 16) {
+               return short_converter;
+       } else if (data_width == 24 || data_width == 32) {
+               return int_converter;
+       } else {
                return float_converter;
        }
 }
@@ -214,14 +221,14 @@ ExportGraphBuilder::SFC::init (FileSpec const & new_config, nframes_t max_frames
 void
 ExportGraphBuilder::SFC::add_child (FileSpec const & new_config)
 {
-       for (std::list<Encoder>::iterator it = children.begin(); it != children.end(); ++it) {
+       for (boost::ptr_list<Encoder>::iterator it = children.begin(); it != children.end(); ++it) {
                if (*it == new_config) {
                        it->add_child (new_config);
                        return;
                }
        }
        
-       children.push_back (Encoder());
+       children.push_back (new Encoder());
        Encoder & encoder = children.back();
        
        if (data_width == 8 || data_width == 16) {
@@ -241,8 +248,8 @@ ExportGraphBuilder::SFC::operator== (FileSpec const & other_config) const
 
 /* Normalizer */
 
-ExportGraphBuilder::FloatSinkPtr
-ExportGraphBuilder::Normalizer::init (FileSpec const & new_config, nframes_t /*max_frames*/)
+ExportGraphBuilder::Normalizer::Normalizer (ExportGraphBuilder & parent, FileSpec const & new_config, nframes_t /*max_frames*/)
+  : parent (parent)
 {
        config = new_config;
        max_frames_out = 4086; // TODO good chunk size
@@ -258,26 +265,31 @@ ExportGraphBuilder::Normalizer::init (FileSpec const & new_config, nframes_t /*m
        int format = ExportFormatBase::F_RAW | ExportFormatBase::SF_Float;
        tmp_file.reset (new TmpFile<float> (format, config.channel_config->get_n_chans(), 
                                            config.format->sample_rate()));
-       tmp_file->FileWritten.connect (sigc::hide (sigc::mem_fun (*this, &Normalizer::start_post_processing)));
+       tmp_file->FileWritten.connect_same_thread (post_processing_connection, boost::bind (&Normalizer::start_post_processing, this));
        
        add_child (new_config);
        
        peak_reader->add_output (tmp_file);
+}
+
+ExportGraphBuilder::FloatSinkPtr
+ExportGraphBuilder::Normalizer::sink ()
+{
        return peak_reader;
 }
 
 void
 ExportGraphBuilder::Normalizer::add_child (FileSpec const & new_config)
 {
-       for (std::list<SFC>::iterator it = children.begin(); it != children.end(); ++it) {
+       for (boost::ptr_list<SFC>::iterator it = children.begin(); it != children.end(); ++it) {
                if (*it == new_config) {
                        it->add_child (new_config);
                        return;
                }
        }
        
-       children.push_back (SFC (parent));
-       threader->add_output (children.back().init (new_config, max_frames_out));
+       children.push_back (new SFC (parent, new_config, max_frames_out));
+       threader->add_output (children.back().sink());
 }
 
 bool
@@ -305,8 +317,8 @@ ExportGraphBuilder::Normalizer::start_post_processing()
 
 /* SRC */
 
-ExportGraphBuilder::FloatSinkPtr
-ExportGraphBuilder::SRC::init (FileSpec const & new_config, nframes_t max_frames)
+ExportGraphBuilder::SRC::SRC (ExportGraphBuilder & parent, FileSpec const & new_config, nframes_t max_frames)
+  : parent (parent)
 {
        config = new_config;
        converter.reset (new SampleRateConverter (new_config.channel_config->get_n_chans()));
@@ -315,7 +327,11 @@ ExportGraphBuilder::SRC::init (FileSpec const & new_config, nframes_t max_frames
        max_frames_out = converter->allocate_buffers (max_frames);
        
        add_child (new_config);
-       
+}
+
+ExportGraphBuilder::FloatSinkPtr
+ExportGraphBuilder::SRC::sink ()
+{
        return converter;
 }
 
@@ -331,17 +347,17 @@ ExportGraphBuilder::SRC::add_child (FileSpec const & new_config)
 
 template<typename T>
 void
-ExportGraphBuilder::SRC::add_child_to_list (FileSpec const & new_config, std::list<T> & list)
+ExportGraphBuilder::SRC::add_child_to_list (FileSpec const & new_config, boost::ptr_list<T> & list)
 {
-       for (typename std::list<T>::iterator it = list.begin(); it != list.end(); ++it) {
+       for (typename boost::ptr_list<T>::iterator it = list.begin(); it != list.end(); ++it) {
                if (*it == new_config) {
                        it->add_child (new_config);
                        return;
                }
        }
        
-       list.push_back (T (parent));
-       converter->add_output (list.back().init (new_config, max_frames_out));
+       list.push_back (new T (parent, new_config, max_frames_out));
+       converter->add_output (list.back().sink ());
 }
 
 bool
@@ -351,8 +367,8 @@ ExportGraphBuilder::SRC::operator== (FileSpec const & other_config) const
 }
 
 /* SilenceHandler */
-ExportGraphBuilder::FloatSinkPtr
-ExportGraphBuilder::SilenceHandler::init (FileSpec const & new_config, nframes_t max_frames)
+ExportGraphBuilder::SilenceHandler::SilenceHandler (ExportGraphBuilder & parent, FileSpec const & new_config, nframes_t max_frames)
+  : parent (parent)
 {
        config = new_config;
        max_frames_in = max_frames;
@@ -365,22 +381,26 @@ ExportGraphBuilder::SilenceHandler::init (FileSpec const & new_config, nframes_t
        silence_trimmer->add_silence_to_end (config.format->silence_end(sample_rate));
        
        add_child (new_config);
-       
+}
+
+ExportGraphBuilder::FloatSinkPtr
+ExportGraphBuilder::SilenceHandler::sink ()
+{
        return silence_trimmer;
 }
 
 void
 ExportGraphBuilder::SilenceHandler::add_child (FileSpec const & new_config)
 {
-       for (std::list<SRC>::iterator it = children.begin(); it != children.end(); ++it) {
+       for (boost::ptr_list<SRC>::iterator it = children.begin(); it != children.end(); ++it) {
                if (*it == new_config) {
                        it->add_child (new_config);
                        return;
                }
        }
        
-       children.push_back (SRC (parent));
-       silence_trimmer->add_output (children.back().init (new_config, max_frames_in));
+       children.push_back (new SRC (parent, new_config, max_frames_in));
+       silence_trimmer->add_output (children.back().sink());
 }
 
 bool
@@ -396,8 +416,8 @@ ExportGraphBuilder::SilenceHandler::operator== (FileSpec const & other_config) c
 
 /* ChannelConfig */
 
-void
-ExportGraphBuilder::ChannelConfig::init (FileSpec const & new_config, ChannelMap & channel_map)
+ExportGraphBuilder::ChannelConfig::ChannelConfig (ExportGraphBuilder & parent, FileSpec const & new_config, ChannelMap & channel_map)
+  : parent (parent)
 {
        typedef ExportChannelConfiguration::ChannelList ChannelList;
        
@@ -426,16 +446,16 @@ ExportGraphBuilder::ChannelConfig::init (FileSpec const & new_config, ChannelMap
 void
 ExportGraphBuilder::ChannelConfig::add_child (FileSpec const & new_config)
 {
-       for (std::list<SilenceHandler>::iterator it = children.begin(); it != children.end(); ++it) {
+       for (boost::ptr_list<SilenceHandler>::iterator it = children.begin(); it != children.end(); ++it) {
                if (*it == new_config) {
                        it->add_child (new_config);
                        return;
                }
        }
        
-       children.push_back (SilenceHandler (parent));
        nframes_t max_frames_out = new_config.channel_config->get_n_chans() * max_frames;
-       interleaver->add_output (children.back().init (new_config, max_frames_out));
+       children.push_back (new SilenceHandler (parent, new_config, max_frames_out));
+       interleaver->add_output (children.back().sink ());
 }
 
 bool
index 54fe07199fe67206a70bda2008b373fbe074e551..e49c1b12848407baffdefbb7a4e33a78a94d9f90 100644 (file)
@@ -258,6 +258,8 @@ def configure(conf):
        # Boost headers
        autowaf.check_header(conf, 'boost/shared_ptr.hpp')
        autowaf.check_header(conf, 'boost/weak_ptr.hpp')
+       autowaf.check_header(conf, 'boost/scoped_ptr.hpp')
+       autowaf.check_header(conf, 'boost/ptr_container/ptr_list.hpp')
 
 
 def build(bld):
index aa06a2c3ef2a6a27f48a10ad099193259eaac315..38e1b8148cc60803d456a9a2b81d56370af1624e 100644 (file)
@@ -10,6 +10,8 @@
 #include "audiographer/types.h"
 #include "audiographer/sndfile/sndfile_base.h"
 
+#include "pbd/signals.h"
+
 namespace AudioGrapher
 {
 
@@ -62,7 +64,7 @@ class SndfileWriter
        
        using Sink<T>::process;
        
-       boost::signals2::signal<void (std::string)> FileWritten;
+       PBD::Signal1<void, std::string> FileWritten;
 
   protected:
        /// SndfileHandle has to be constructed directly by deriving classes