From ffadfff6506e507b09853e4c7e50bcedffa29cce Mon Sep 17 00:00:00 2001 From: Sakari Bergen Date: Sat, 18 Dec 2010 17:56:41 +0000 Subject: Add "session rate" as a possible sample rate for export formats git-svn-id: svn://localhost/ardour2/branches/3.0@8294 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/export_format_base.h | 3 +++ libs/ardour/ardour/export_formats.h | 2 +- libs/ardour/enums.cc | 1 + libs/ardour/export_format_base.cc | 26 ++++++++++++++++++++++++++ libs/ardour/export_format_manager.cc | 1 + libs/ardour/export_format_specification.cc | 5 +++++ libs/ardour/export_formats.cc | 4 ++++ libs/ardour/export_graph_builder.cc | 18 ++++++++++++++---- 8 files changed, 55 insertions(+), 5 deletions(-) (limited to 'libs') diff --git a/libs/ardour/ardour/export_format_base.h b/libs/ardour/ardour/export_format_base.h index 3bd2bf98fb..00da1c75c8 100644 --- a/libs/ardour/ardour/export_format_base.h +++ b/libs/ardour/ardour/export_format_base.h @@ -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: diff --git a/libs/ardour/ardour/export_formats.h b/libs/ardour/ardour/export_formats.h index c29f7a4fbf..233ae56bc7 100644 --- a/libs/ardour/ardour/export_formats.h +++ b/libs/ardour/ardour/export_formats.h @@ -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); diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 380fb2160c..9fc1ef96ce 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -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); diff --git a/libs/ardour/export_format_base.cc b/libs/ardour/export_format_base.cc index a994b97ac3..fa6f1198e9 100644 --- a/libs/ardour/export_format_base.cc +++ b/libs/ardour/export_format_base.cc @@ -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 diff --git a/libs/ardour/export_format_manager.cc b/libs/ardour/export_format_manager.cc index 7971622c4a..df787abafb 100644 --- a/libs/ardour/export_format_manager.cc +++ b/libs/ardour/export_format_manager.cc @@ -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"))); diff --git a/libs/ardour/export_format_specification.cc b/libs/ardour/export_format_specification.cc index 315da339d4..c5e63733c8 100644 --- a/libs/ardour/export_format_specification.cc +++ b/libs/ardour/export_format_specification.cc @@ -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; } diff --git a/libs/ardour/export_formats.cc b/libs/ardour/export_formats.cc index c78f9332c0..32b71f6b04 100644 --- a/libs/ardour/export_formats.cc +++ b/libs/ardour/export_formats.cc @@ -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); diff --git a/libs/ardour/export_graph_builder.cc b/libs/ardour/export_graph_builder.cc index ba7491c976..885bc9786d 100644 --- a/libs/ardour/export_graph_builder.cc +++ b/libs/ardour/export_graph_builder.cc @@ -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 > 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)); -- cgit v1.2.3