Add "session rate" as a possible sample rate for export formats
authorSakari Bergen <sakari.bergen@beatwaves.net>
Sat, 18 Dec 2010 17:56:41 +0000 (17:56 +0000)
committerSakari Bergen <sakari.bergen@beatwaves.net>
Sat, 18 Dec 2010 17:56:41 +0000 (17:56 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@8294 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/export_format_base.h
libs/ardour/ardour/export_formats.h
libs/ardour/enums.cc
libs/ardour/export_format_base.cc
libs/ardour/export_format_manager.cc
libs/ardour/export_format_specification.cc
libs/ardour/export_formats.cc
libs/ardour/export_graph_builder.cc

index 3bd2bf98fbf9e4e91faba7d07229b9e26bd7484c..00da1c75c88e1b158e429ad3f7cc36dd866ae7ed 100644 (file)
@@ -94,6 +94,7 @@ class ExportFormatBase {
 
        enum SampleRate {
                SR_None = 0,
+               SR_Session = 1,
                SR_22_05 = 220500,
                SR_44_1 = 44100,
                SR_48 = 48000,
@@ -162,6 +163,8 @@ class ExportFormatBase {
 
        void set_extension (std::string const & extension) { _extension = extension; }
        std::string const & extension () const { return _extension; }
+       
+       static SampleRate nearest_sample_rate (framecnt_t sample_rate);
 
   protected:
 
index c29f7a4fbf4309068ebba176d34307234a05ad04..233ae56bc7c6280f7fa7757c2736cfeac608870f 100644 (file)
@@ -156,7 +156,7 @@ class HasSampleFormat : public PBD::ScopedConnectionList {
 class ExportFormatLinear : public ExportFormat, public HasSampleFormat {
   public:
 
-        ExportFormatLinear (std::string name, FormatId format_id);
+       ExportFormatLinear (std::string name, FormatId format_id);
        ~ExportFormatLinear () {};
 
        bool set_compatibility_state (ExportFormatCompatibility const & compatibility);
index 380fb2160c02ff8a1480e1cd404d5221d3b28f74..9fc1ef96ce9fb1522c97eb7eac8f9b9ee90ebefb 100644 (file)
@@ -487,6 +487,7 @@ setup_enum_writer ()
        REGISTER (_ExportFormatBase_Quality);
 
        REGISTER_CLASS_ENUM (ExportFormatBase, SR_None);
+       REGISTER_CLASS_ENUM (ExportFormatBase, SR_Session);
        REGISTER_CLASS_ENUM (ExportFormatBase, SR_22_05);
        REGISTER_CLASS_ENUM (ExportFormatBase, SR_44_1);
        REGISTER_CLASS_ENUM (ExportFormatBase, SR_48);
index a994b97ac3bbe30498efbac605a78f187949a9ad..fa6f1198e94167437e344d04736de2138b245002 100644 (file)
@@ -198,4 +198,30 @@ ExportFormatBase::do_set_operation (ExportFormatBase const & other, SetOperation
        return result;
 }
 
+ExportFormatBase::SampleRate
+ExportFormatBase::nearest_sample_rate (framecnt_t sample_rate)
+{
+       int diff = 0;
+       int smallest_diff = INT_MAX;
+       SampleRate best_match = SR_None;
+       
+       #define DO_SR_COMPARISON(rate) \
+       diff = std::abs((rate) - sample_rate); \
+       if(diff < smallest_diff) { \
+               smallest_diff = diff; \
+               best_match = (rate); \
+       }
+
+       DO_SR_COMPARISON(SR_22_05);
+       DO_SR_COMPARISON(SR_22_05);
+       DO_SR_COMPARISON(SR_44_1);
+       DO_SR_COMPARISON(SR_48);
+       DO_SR_COMPARISON(SR_88_2);
+       DO_SR_COMPARISON(SR_96);
+       DO_SR_COMPARISON(SR_192);
+       
+       return best_match;
+       #undef DO_SR_COMPARISON
+}
+
 }; // namespace ARDOUR
index 7971622c4a941e306cfd73589a20a3b71f09ab67..df787abafb9bd842e56c7ef4c5234d470375201e 100644 (file)
@@ -203,6 +203,7 @@ ExportFormatManager::init_formats ()
 void
 ExportFormatManager::init_sample_rates ()
 {
+       add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_Session, _("Session rate"))));
        add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_22_05, "22,05 kHz")));
        add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_44_1, "44,1 kHz")));
        add_sample_rate (SampleRatePtr (new SampleRateState (ExportFormatBase::SR_48, "48 kHz")));
index 315da339d4c02ab6adc3e0992769a2d39598f958..c5e63733c8cffdda2fa3ecc78a731b966d49b081 100644 (file)
@@ -230,6 +230,8 @@ ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification
 
        set_silence_beginning (other.silence_beginning_time());
        set_silence_end (other.silence_end_time());
+       
+       set_extension(other.extension());
 }
 
 ExportFormatSpecification::~ExportFormatSpecification ()
@@ -556,6 +558,9 @@ ExportFormatSpecification::description ()
          case SR_192:
                desc += "192 kHz";
                break;
+         case SR_Session:
+               desc += _("Session rate");
+               break;
          case SR_None:
                break;
        }
index c78f9332c05e1b1867d86afb8fabe1f9acc8ad2c..32b71f6b045b347a163e12916c5df0256626f68a 100644 (file)
@@ -192,6 +192,7 @@ ExportFormatLinear::ExportFormatLinear (string name, FormatId format_id) :
        add_sample_rate (SR_88_2);
        add_sample_rate (SR_96);
        add_sample_rate (SR_192);
+       add_sample_rate (SR_Session);
 
        add_endianness (E_FileDefault);
 
@@ -262,6 +263,7 @@ ExportFormatOggVorbis::ExportFormatOggVorbis ()
        add_sample_rate (SR_88_2);
        add_sample_rate (SR_96);
        add_sample_rate (SR_192);
+       add_sample_rate (SR_Session);
 
        add_endianness (E_FileDefault);
 
@@ -301,6 +303,7 @@ ExportFormatFLAC::ExportFormatFLAC () :
        add_sample_rate (SR_88_2);
        add_sample_rate (SR_96);
        add_sample_rate (SR_192);
+       add_sample_rate (SR_Session);
 
        add_sample_format (SF_8);
        add_sample_format (SF_16);
@@ -334,6 +337,7 @@ ExportFormatBWF::ExportFormatBWF () :
        add_sample_rate (SR_88_2);
        add_sample_rate (SR_96);
        add_sample_rate (SR_192);
+       add_sample_rate (SR_Session);
 
        add_sample_format (SF_U8);
        add_sample_format (SF_16);
index ba7491c9762289496071156147d9971c33939e4e..885bc9786d3ca658a0a0f03a7be6c6745a8794fc 100644 (file)
@@ -77,8 +77,18 @@ ExportGraphBuilder::reset ()
 void
 ExportGraphBuilder::add_config (FileSpec const & config)
 {
-       if (!config.channel_config->get_split ()) {
-               add_split_config (config);
+       // If the sample rate is "session rate", change it to the real value.
+       // However, we need to copy it to not change the config which is saved...
+       FileSpec new_config (config);
+       new_config.format.reset(new ExportFormatSpecification(*new_config.format));
+       if(new_config.format->sample_rate() == ExportFormatBase::SR_Session) {
+               framecnt_t session_rate = session.nominal_frame_rate();
+               new_config.format->set_sample_rate(ExportFormatBase::nearest_sample_rate(session_rate));
+       }
+       
+       
+       if (!new_config.channel_config->get_split ()) {
+               add_split_config (new_config);
                return;
        }
        
@@ -86,11 +96,11 @@ ExportGraphBuilder::add_config (FileSpec const & config)
        // each corresponding to a file, at this stage
        typedef std::list<boost::shared_ptr<ExportChannelConfiguration> > ConfigList;
        ConfigList file_configs;
-       config.channel_config->configurations_for_files (file_configs);
+       new_config.channel_config->configurations_for_files (file_configs);
        
        unsigned chan = 1;
        for (ConfigList::iterator it = file_configs.begin(); it != file_configs.end(); ++it, ++chan) {
-               FileSpec copy = config;
+               FileSpec copy = new_config;
                copy.channel_config = *it;
                
                copy.filename.reset (new ExportFilename (*copy.filename));