diff options
author | Robin Gareus <robin@gareus.org> | 2016-02-15 15:46:49 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-02-15 15:46:49 +0100 |
commit | e6ea35c3de0c234a99443a05a131540dd821487c (patch) | |
tree | 5cc035799079d8c4860b855449b61e23836b7a9e | |
parent | b9efb2ae21b785ef7273af22df1a8fcad168227f (diff) |
Add normalization gain factor to Export Analysis
-rw-r--r-- | libs/ardour/ardour/export_analysis.h | 6 | ||||
-rw-r--r-- | libs/ardour/ardour/export_graph_builder.h | 1 | ||||
-rw-r--r-- | libs/ardour/export_graph_builder.cc | 13 | ||||
-rw-r--r-- | libs/audiographer/audiographer/general/analyser.h | 7 | ||||
-rw-r--r-- | libs/audiographer/audiographer/general/normalizer.h | 2 | ||||
-rw-r--r-- | libs/audiographer/src/general/analyser.cc | 7 | ||||
-rw-r--r-- | libs/audiographer/src/general/normalizer.cc | 3 |
7 files changed, 33 insertions, 6 deletions
diff --git a/libs/ardour/ardour/export_analysis.h b/libs/ardour/ardour/export_analysis.h index 8c55edd6ab..c911acf9f0 100644 --- a/libs/ardour/ardour/export_analysis.h +++ b/libs/ardour/ardour/export_analysis.h @@ -37,6 +37,8 @@ namespace ARDOUR { , loudness_hist_max (0) , have_loudness (false) , have_dbtp (false) + , norm_gain_factor (1.0) + , normalized (false) , n_channels (1) { memset (peaks, 0, sizeof(peaks)); @@ -53,6 +55,8 @@ namespace ARDOUR { , loudness_hist_max (other.loudness_hist_max) , have_loudness (other.have_loudness) , have_dbtp (other.have_dbtp) + , norm_gain_factor (other.norm_gain_factor) + , normalized (other.normalized) , n_channels (other.n_channels) { truepeakpos[0] = other.truepeakpos[0]; @@ -71,6 +75,8 @@ namespace ARDOUR { int loudness_hist_max; bool have_loudness; bool have_dbtp; + float norm_gain_factor; + bool normalized; uint32_t n_channels; uint32_t freq[6]; // y-pos, 50, 100, 500, 1k, 5k, 10k [Hz] diff --git a/libs/ardour/ardour/export_graph_builder.h b/libs/ardour/ardour/export_graph_builder.h index 979e3632b9..f2fbbb63fa 100644 --- a/libs/ardour/ardour/export_graph_builder.h +++ b/libs/ardour/ardour/export_graph_builder.h @@ -124,6 +124,7 @@ class LIBARDOUR_API ExportGraphBuilder 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: typedef boost::shared_ptr<AudioGrapher::SampleFormatConverter<Sample> > FloatConverterPtr; diff --git a/libs/ardour/export_graph_builder.cc b/libs/ardour/export_graph_builder.cc index bdcdf2620e..75587dedae 100644 --- a/libs/ardour/export_graph_builder.cc +++ b/libs/ardour/export_graph_builder.cc @@ -332,6 +332,14 @@ ExportGraphBuilder::SFC::SFC (ExportGraphBuilder &parent, FileSpec const & new_c } } +void +ExportGraphBuilder::SFC::set_peak (float gain) +{ + if (_analyse) { + analyser->set_normalization_gain (gain); + } +} + ExportGraphBuilder::FloatSinkPtr ExportGraphBuilder::SFC::sink () { @@ -476,7 +484,10 @@ ExportGraphBuilder::Normalizer::process() void ExportGraphBuilder::Normalizer::start_post_processing() { - normalizer->set_peak (peak_reader->get_peak()); + const float gain = normalizer->set_peak (peak_reader->get_peak()); + for (boost::ptr_list<SFC>::iterator i = children.begin(); i != children.end(); ++i) { + (*i).set_peak (gain); + } tmp_file->seek (0, SEEK_SET); tmp_file->add_output (normalizer); parent.normalizers.push_back (this); diff --git a/libs/audiographer/audiographer/general/analyser.h b/libs/audiographer/audiographer/general/analyser.h index e79e4107dc..e8ca534954 100644 --- a/libs/audiographer/audiographer/general/analyser.h +++ b/libs/audiographer/audiographer/general/analyser.h @@ -41,8 +41,15 @@ class LIBAUDIOGRAPHER_API Analyser : public ListedSource<float>, public Sink<flo void process (ProcessContext<float> const & c); ARDOUR::ExportAnalysisPtr result (); + void set_normalization_gain (float gain) { + _result.normalized = true; + _result.norm_gain_factor = gain; + } + using Sink<float>::process; + static const float fft_range_db; + private: float fft_power_at_bin (const uint32_t b, const float norm) const; diff --git a/libs/audiographer/audiographer/general/normalizer.h b/libs/audiographer/audiographer/general/normalizer.h index 025131022e..e5f73a0f08 100644 --- a/libs/audiographer/audiographer/general/normalizer.h +++ b/libs/audiographer/audiographer/general/normalizer.h @@ -21,7 +21,7 @@ public: ~Normalizer(); /// Sets the peak found in the material to be normalized \see PeakReader \n RT safe - void set_peak (float peak); + float set_peak (float peak); /** Allocates a buffer for using with const ProcessContexts * This function does not need to be called if diff --git a/libs/audiographer/src/general/analyser.cc b/libs/audiographer/src/general/analyser.cc index d969095b08..c27d7dae08 100644 --- a/libs/audiographer/src/general/analyser.cc +++ b/libs/audiographer/src/general/analyser.cc @@ -21,6 +21,8 @@ using namespace AudioGrapher; +const float Analyser::fft_range_db (80); // dB + Analyser::Analyser (float sample_rate, unsigned int channels, framecnt_t bufsize, framecnt_t n_samples) : _ebur128_plugin (0) , _dbtp_plugin (0) @@ -196,12 +198,11 @@ Analyser::process (ProcessContext<float> const & c) const framecnt_t x0 = _pos / _fpp; framecnt_t x1 = (_pos + n_samples) / _fpp; if (x0 == x1) x1 = x0 + 1; - const float range = 80; // dB for (uint32_t i = 0; i < _fft_data_size - 1; ++i) { const float level = fft_power_at_bin (i, i); - if (level < -range) continue; - const float pk = level > 0.0 ? 1.0 : (range + level) / range; + if (level < -fft_range_db) continue; + const float pk = level > 0.0 ? 1.0 : (fft_range_db + level) / fft_range_db; #if 0 // linear const uint32_t y0 = floor (i * (float) height / _fft_data_size); uint32_t y1 = ceil ((i + 1.0) * (float) height / _fft_data_size); diff --git a/libs/audiographer/src/general/normalizer.cc b/libs/audiographer/src/general/normalizer.cc index d241d71892..a10382031a 100644 --- a/libs/audiographer/src/general/normalizer.cc +++ b/libs/audiographer/src/general/normalizer.cc @@ -37,7 +37,7 @@ Normalizer::~Normalizer() } /// Sets the peak found in the material to be normalized \see PeakReader \n RT safe -void Normalizer::set_peak (float peak) +float Normalizer::set_peak (float peak) { if (peak == 0.0f || peak == target) { /* don't even try */ @@ -46,6 +46,7 @@ void Normalizer::set_peak (float peak) enabled = true; gain = target / peak; } + return enabled ? gain : 1.0; } /** Allocates a buffer for using with const ProcessContexts |