prepare region RMS (loudness) normalization
This commit is contained in:
parent
80bd3e7279
commit
23a2cc4b71
|
@ -82,8 +82,17 @@ class LIBARDOUR_API AudioRegion : public Region
|
||||||
gain_t scale_amplitude() const { return _scale_amplitude; }
|
gain_t scale_amplitude() const { return _scale_amplitude; }
|
||||||
|
|
||||||
void normalize (float, float target_in_dB = 0.0f);
|
void normalize (float, float target_in_dB = 0.0f);
|
||||||
|
|
||||||
|
/** @return the maximum (linear) amplitude of the region, or a -ve
|
||||||
|
* number if the Progress object reports that the process was cancelled.
|
||||||
|
*/
|
||||||
double maximum_amplitude (Progress* p = 0) const;
|
double maximum_amplitude (Progress* p = 0) const;
|
||||||
|
|
||||||
|
/** @return the maximum (rms) signal power of the region, or a -1
|
||||||
|
* if the Progress object reports that the process was cancelled.
|
||||||
|
*/
|
||||||
|
double rms (Progress* p = 0) const;
|
||||||
|
|
||||||
bool envelope_active () const { return _envelope_active; }
|
bool envelope_active () const { return _envelope_active; }
|
||||||
bool fade_in_active () const { return _fade_in_active; }
|
bool fade_in_active () const { return _fade_in_active; }
|
||||||
bool fade_out_active () const { return _fade_out_active; }
|
bool fade_out_active () const { return _fade_out_active; }
|
||||||
|
|
|
@ -1402,9 +1402,6 @@ AudioRegion::set_scale_amplitude (gain_t g)
|
||||||
send_change (PropertyChange (Properties::scale_amplitude));
|
send_change (PropertyChange (Properties::scale_amplitude));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return the maximum (linear) amplitude of the region, or a -ve
|
|
||||||
* number if the Progress object reports that the process was cancelled.
|
|
||||||
*/
|
|
||||||
double
|
double
|
||||||
AudioRegion::maximum_amplitude (Progress* p) const
|
AudioRegion::maximum_amplitude (Progress* p) const
|
||||||
{
|
{
|
||||||
|
@ -1444,6 +1441,45 @@ AudioRegion::maximum_amplitude (Progress* p) const
|
||||||
return maxamp;
|
return maxamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
AudioRegion::rms (Progress* p) const
|
||||||
|
{
|
||||||
|
framepos_t fpos = _start;
|
||||||
|
framepos_t const fend = _start + _length;
|
||||||
|
uint32_t const n_chan = n_channels ();
|
||||||
|
double rms = 0;
|
||||||
|
|
||||||
|
framecnt_t const blocksize = 64 * 1024;
|
||||||
|
Sample buf[blocksize];
|
||||||
|
|
||||||
|
framecnt_t total = 0;
|
||||||
|
|
||||||
|
if (n_chan == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fpos < fend) {
|
||||||
|
framecnt_t const to_read = min (fend - fpos, blocksize);
|
||||||
|
total += to_read;
|
||||||
|
for (uint32_t c = 0; c < n_chan; ++c) {
|
||||||
|
if (read_raw_internal (buf, fpos, to_read, c) != to_read) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for (framepos_t i = 0; i < to_read; ++i) {
|
||||||
|
rms += buf[i] * buf[i];
|
||||||
|
}
|
||||||
|
fpos += to_read;
|
||||||
|
if (p) {
|
||||||
|
p->set_progress (float (fpos - _start) / _length);
|
||||||
|
if (p->cancelled ()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sqrt (rms / (double)(total * n_chan));
|
||||||
|
}
|
||||||
|
|
||||||
/** Normalize using a given maximum amplitude and target, so that region
|
/** Normalize using a given maximum amplitude and target, so that region
|
||||||
* _scale_amplitude becomes target / max_amplitude.
|
* _scale_amplitude becomes target / max_amplitude.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue
Block a user