summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorSakari Bergen <sakari.bergen@beatwaves.net>2010-12-18 17:56:41 +0000
committerSakari Bergen <sakari.bergen@beatwaves.net>2010-12-18 17:56:41 +0000
commitffadfff6506e507b09853e4c7e50bcedffa29cce (patch)
treec8413307ce40afe6f7f908467de1eb06dcaf427f /libs/ardour
parent850b7d24a9230c84183372691f11d29c8f9c3117 (diff)
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
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/export_format_base.h3
-rw-r--r--libs/ardour/ardour/export_formats.h2
-rw-r--r--libs/ardour/enums.cc1
-rw-r--r--libs/ardour/export_format_base.cc26
-rw-r--r--libs/ardour/export_format_manager.cc1
-rw-r--r--libs/ardour/export_format_specification.cc5
-rw-r--r--libs/ardour/export_formats.cc4
-rw-r--r--libs/ardour/export_graph_builder.cc18
8 files changed, 55 insertions, 5 deletions
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<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));