mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-09 16:24:57 +01:00
Add normalization gain factor to Export Analysis
This commit is contained in:
parent
b9efb2ae21
commit
e6ea35c3de
7 changed files with 33 additions and 6 deletions
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue