diff options
author | Sakari Bergen <sakari.bergen@beatwaves.net> | 2010-03-15 19:11:48 +0000 |
---|---|---|
committer | Sakari Bergen <sakari.bergen@beatwaves.net> | 2010-03-15 19:11:48 +0000 |
commit | 830911f6f9451d83a58043b3f9084d3caa164b7b (patch) | |
tree | f4ca4e3d86b51d66e7cecfb6b370cc4eb553e2d7 /libs/audiographer/audiographer/general/normalizer.h | |
parent | 44f4b84551d36ef4103d09452768f5ba53e0002c (diff) |
Fix export, which has been broken since the boost::signals2 changes. Also update Audiographer, bacause of its incomplete sndfile handling. Audiographer is equal to revision 74
git-svn-id: svn://localhost/ardour2/branches/3.0@6760 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/audiographer/audiographer/general/normalizer.h')
-rw-r--r-- | libs/audiographer/audiographer/general/normalizer.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/libs/audiographer/audiographer/general/normalizer.h b/libs/audiographer/audiographer/general/normalizer.h new file mode 100644 index 0000000000..205f6e70e5 --- /dev/null +++ b/libs/audiographer/audiographer/general/normalizer.h @@ -0,0 +1,95 @@ +#ifndef AUDIOGRAPHER_NORMALIZER_H +#define AUDIOGRAPHER_NORMALIZER_H + +#include "audiographer/sink.h" +#include "audiographer/routines.h" +#include "audiographer/utils/listed_source.h" + +#include <cstring> + +namespace AudioGrapher +{ + +/// A class for normalizing to a specified target in dB +class Normalizer + : public ListedSource<float> + , public Sink<float> + , public Throwing<> +{ + public: + /// Constructs a normalizer with a specific target in dB \n RT safe + Normalizer (float target_dB) + : enabled (false) + , buffer (0) + , buffer_size (0) + { + target = pow (10.0f, target_dB * 0.05f); + } + + ~Normalizer() + { + delete [] buffer; + } + + /// Sets the peak found in the material to be normalized \see PeakReader \n RT safe + void set_peak (float peak) + { + if (peak == 0.0f || peak == target) { + /* don't even try */ + enabled = false; + } else { + enabled = true; + gain = target / peak; + } + } + + /** Allocates a buffer for using with const ProcessContexts + * This function does not need to be called if + * non-const ProcessContexts are given to \a process() . + * \n Not RT safe + */ + void alloc_buffer(nframes_t frames) + { + delete [] buffer; + buffer = new float[frames]; + buffer_size = frames; + } + + /// Process a const ProcessContext \see alloc_buffer() \n RT safe + void process (ProcessContext<float> const & c) + { + if (throw_level (ThrowProcess) && c.frames() > buffer_size) { + throw Exception (*this, "Too many frames given to process()"); + } + + if (enabled) { + memcpy (buffer, c.data(), c.frames() * sizeof(float)); + Routines::apply_gain_to_buffer (buffer, c.frames(), gain); + } + + ProcessContext<float> c_out (c, buffer); + ListedSource<float>::output (c_out); + } + + /// Process a non-const ProcsesContext in-place \n RT safe + void process (ProcessContext<float> & c) + { + if (enabled) { + Routines::apply_gain_to_buffer (c.data(), c.frames(), gain); + } + ListedSource<float>::output(c); + } + + private: + bool enabled; + float target; + float gain; + + float * buffer; + nframes_t buffer_size; +}; + + +} // namespace + +#endif // AUDIOGRAPHER_NORMALIZER_H |