Merge branch 'windows+cc' into cairocanvas
This commit is contained in:
commit
a1a3f6c826
@ -38,7 +38,7 @@ enum LIBAUDIOGRAPHER_API DebugLevel
|
||||
* logical and (short-circuiting).
|
||||
*/
|
||||
template<DebugLevel L = DEFAULT_DEBUG_LEVEL>
|
||||
class LIBAUDIOGRAPHER_API Debuggable
|
||||
class /*LIBAUDIOGRAPHER_API*/ Debuggable
|
||||
{
|
||||
protected:
|
||||
Debuggable(std::ostream & debug_stream = std::cerr)
|
||||
|
@ -14,7 +14,7 @@ namespace AudioGrapher
|
||||
|
||||
/// A debugging class for nodes that support a certain set of flags.
|
||||
template<DebugLevel L = DEFAULT_DEBUG_LEVEL>
|
||||
class LIBAUDIOGRAPHER_API FlagDebuggable : public Debuggable<L>
|
||||
class /*LIBAUDIOGRAPHER_API*/ FlagDebuggable : public Debuggable<L>
|
||||
{
|
||||
public:
|
||||
typedef FlagField::Flag Flag;
|
||||
|
@ -12,7 +12,7 @@ namespace AudioGrapher
|
||||
|
||||
/// A class that chunks process cycles into equal sized frames
|
||||
template<typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API Chunker
|
||||
class /*LIBAUDIOGRAPHER_API*/ Chunker
|
||||
: public ListedSource<T>
|
||||
, public Sink<T>
|
||||
, public FlagDebuggable<>
|
||||
|
@ -15,7 +15,7 @@ namespace AudioGrapher
|
||||
|
||||
/// Converts on stream of interleaved data to many streams of uninterleaved data.
|
||||
template<typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API DeInterleaver
|
||||
class /*LIBAUDIOGRAPHER_API*/ DeInterleaver
|
||||
: public Sink<T>
|
||||
, public Throwing<>
|
||||
{
|
||||
|
@ -16,7 +16,7 @@ namespace AudioGrapher
|
||||
|
||||
/// Interleaves many streams of non-interleaved data into one interleaved stream
|
||||
template<typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API Interleaver
|
||||
class /*LIBAUDIOGRAPHER_API*/ Interleaver
|
||||
: public ListedSource<T>
|
||||
, public Throwing<>
|
||||
{
|
||||
|
@ -6,8 +6,6 @@
|
||||
#include "audiographer/routines.h"
|
||||
#include "audiographer/utils/listed_source.h"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
namespace AudioGrapher
|
||||
{
|
||||
|
||||
@ -17,71 +15,28 @@ class LIBAUDIOGRAPHER_API Normalizer
|
||||
, public Sink<float>
|
||||
, public Throwing<>
|
||||
{
|
||||
public:
|
||||
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;
|
||||
}
|
||||
Normalizer (float target_dB);
|
||||
~Normalizer();
|
||||
|
||||
/// 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;
|
||||
}
|
||||
}
|
||||
void set_peak (float 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(framecnt_t frames)
|
||||
{
|
||||
delete [] buffer;
|
||||
buffer = new float[frames];
|
||||
buffer_size = frames;
|
||||
}
|
||||
void alloc_buffer(framecnt_t 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);
|
||||
}
|
||||
void process (ProcessContext<float> const & c);
|
||||
|
||||
/// 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:
|
||||
void process (ProcessContext<float> & c);
|
||||
|
||||
private:
|
||||
bool enabled;
|
||||
float target;
|
||||
float gain;
|
||||
|
@ -10,7 +10,7 @@ namespace AudioGrapher
|
||||
{
|
||||
|
||||
/// A class that reads the maximum value from a stream
|
||||
class LIBAUDIOGRAPHER_API PeakReader : public ListedSource<float>, public Sink<float>
|
||||
class /*LIBAUDIOGRAPHER_API*/ PeakReader : public ListedSource<float>, public Sink<float>
|
||||
{
|
||||
public:
|
||||
/// Constructor \n RT safe
|
||||
|
@ -10,7 +10,7 @@ namespace AudioGrapher
|
||||
{
|
||||
|
||||
/// Dither types from the gdither library
|
||||
enum LIBAUDIOGRAPHER_API DitherType
|
||||
enum /*LIBAUDIOGRAPHER_API*/ DitherType
|
||||
{
|
||||
D_None = GDitherNone, ///< No didtering
|
||||
D_Rect = GDitherRect, ///< Rectangular dithering, i.e. white noise
|
||||
|
@ -14,7 +14,7 @@ namespace AudioGrapher {
|
||||
|
||||
/// Removes and adds silent frames to beginning and/or end of stream
|
||||
template<typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API SilenceTrimmer
|
||||
class /*LIBAUDIOGRAPHER_API*/ SilenceTrimmer
|
||||
: public ListedSource<T>
|
||||
, public Sink<T>
|
||||
, public FlagDebuggable<>
|
||||
|
@ -19,7 +19,7 @@ namespace AudioGrapher
|
||||
{
|
||||
|
||||
/// Class that stores exceptions thrown from different threads
|
||||
class LIBAUDIOGRAPHER_API ThreaderException : public Exception
|
||||
class /*LIBAUDIOGRAPHER_API*/ ThreaderException : public Exception
|
||||
{
|
||||
public:
|
||||
template<typename T>
|
||||
@ -33,7 +33,7 @@ class LIBAUDIOGRAPHER_API ThreaderException : public Exception
|
||||
|
||||
/// Class for distributing processing across several threads
|
||||
template <typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API Threader : public Source<T>, public Sink<T>
|
||||
class /*LIBAUDIOGRAPHER_API*/ Threader : public Source<T>, public Sink<T>
|
||||
{
|
||||
private:
|
||||
typedef std::vector<typename Source<T>::SinkPtr> OutputVec;
|
||||
|
@ -22,7 +22,7 @@ namespace AudioGrapher
|
||||
*/
|
||||
|
||||
template <typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API ProcessContext
|
||||
class /*LIBAUDIOGRAPHER_API*/ ProcessContext
|
||||
: public Throwing<>
|
||||
{
|
||||
// Support older compilers that don't support template base class initialization without template parameters
|
||||
@ -126,7 +126,7 @@ protected:
|
||||
|
||||
/// A process context that allocates and owns it's data buffer
|
||||
template <typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API AllocatingProcessContext : public ProcessContext<T>
|
||||
class /*LIBAUDIOGRAPHER_API*/ AllocatingProcessContext : public ProcessContext<T>
|
||||
{
|
||||
public:
|
||||
/// Allocates uninitialized memory
|
||||
@ -163,7 +163,7 @@ public:
|
||||
|
||||
/// A wrapper for a const ProcesContext which can be created from const data
|
||||
template <typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API ConstProcessContext
|
||||
class /*LIBAUDIOGRAPHER_API*/ ConstProcessContext
|
||||
{
|
||||
public:
|
||||
/// Basic constructor with data, frame and channel count
|
||||
|
@ -14,7 +14,7 @@ namespace AudioGrapher
|
||||
* This is a pure virtual interface for all data sinks in AudioGrapher
|
||||
*/
|
||||
template <typename T>
|
||||
class LIBAUDIOGRAPHER_API Sink {
|
||||
class /*LIBAUDIOGRAPHER_API*/ Sink {
|
||||
public:
|
||||
virtual ~Sink () {}
|
||||
|
||||
|
@ -15,7 +15,7 @@ namespace AudioGrapher
|
||||
* This is a pure virtual interface for all data sources in AudioGrapher
|
||||
*/
|
||||
template<typename T>
|
||||
class LIBAUDIOGRAPHER_API Source
|
||||
class /*LIBAUDIOGRAPHER_API*/ Source
|
||||
{
|
||||
public:
|
||||
virtual ~Source () { }
|
||||
|
@ -16,7 +16,7 @@ namespace AudioGrapher
|
||||
* However, if you want ultra-optimized code and/or don't care about handling
|
||||
* error situations, feel free to use whatever you want.
|
||||
*/
|
||||
enum LIBAUDIOGRAPHER_API ThrowLevel
|
||||
enum /*LIBAUDIOGRAPHER_API*/ ThrowLevel
|
||||
{
|
||||
ThrowNone, ///< Not allowed to throw
|
||||
ThrowObject, ///< Object level stuff, ctors, initalizers etc.
|
||||
@ -40,7 +40,7 @@ enum LIBAUDIOGRAPHER_API ThrowLevel
|
||||
* logical and (short-circuiting).
|
||||
*/
|
||||
template<ThrowLevel L = DEFAULT_THROW_LEVEL>
|
||||
class LIBAUDIOGRAPHER_API Throwing
|
||||
class /*LIBAUDIOGRAPHER_API*/ Throwing
|
||||
{
|
||||
protected:
|
||||
Throwing() {}
|
||||
|
@ -29,7 +29,7 @@ class LIBAUDIOGRAPHER_API TypeUtilsBase
|
||||
|
||||
/// Utilities for initializing, copying, moving, etc. data
|
||||
template<typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API TypeUtils : private TypeUtilsBase
|
||||
class /*LIBAUDIOGRAPHER_API*/ TypeUtils : private TypeUtilsBase
|
||||
{
|
||||
BOOST_STATIC_ASSERT (boost::has_trivial_destructor<T>::value);
|
||||
|
||||
|
@ -11,7 +11,7 @@ namespace AudioGrapher
|
||||
|
||||
/// Outputs its input directly to a number of Sinks
|
||||
template<typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API IdentityVertex : public ListedSource<T>, Sink<T>
|
||||
class /*LIBAUDIOGRAPHER_API*/ IdentityVertex : public ListedSource<T>, Sink<T>
|
||||
{
|
||||
public:
|
||||
void process (ProcessContext<T> const & c) { ListedSource<T>::output(c); }
|
||||
|
@ -13,7 +13,7 @@ namespace AudioGrapher
|
||||
|
||||
/// An generic \a Source that uses a \a std::list for managing outputs
|
||||
template<typename T = DefaultSampleType>
|
||||
class LIBAUDIOGRAPHER_API ListedSource : public Source<T>
|
||||
class /*LIBAUDIOGRAPHER_API*/ ListedSource : public Source<T>
|
||||
{
|
||||
public:
|
||||
void add_output (typename Source<T>::SinkPtr output) { outputs.push_back(output); }
|
||||
|
88
libs/audiographer/src/general/normalizer.cc
Normal file
88
libs/audiographer/src/general/normalizer.cc
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
Copyright (C) 2012 Paul Davis
|
||||
Author: Sakari Bergen
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include "audiographer/general/normalizer.h"
|
||||
|
||||
namespace AudioGrapher
|
||||
{
|
||||
|
||||
Normalizer::Normalizer (float target_dB)
|
||||
: enabled (false)
|
||||
, buffer (0)
|
||||
, buffer_size (0)
|
||||
{
|
||||
target = pow (10.0f, target_dB * 0.05f);
|
||||
}
|
||||
|
||||
Normalizer::~Normalizer()
|
||||
{
|
||||
delete [] buffer;
|
||||
}
|
||||
|
||||
/// Sets the peak found in the material to be normalized \see PeakReader \n RT safe
|
||||
void Normalizer::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 Normalizer::alloc_buffer(framecnt_t frames)
|
||||
{
|
||||
delete [] buffer;
|
||||
buffer = new float[frames];
|
||||
buffer_size = frames;
|
||||
}
|
||||
|
||||
/// Process a const ProcessContext \see alloc_buffer() \n RT safe
|
||||
void Normalizer::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 Normalizer::process (ProcessContext<float> & c)
|
||||
{
|
||||
if (enabled) {
|
||||
Routines::apply_gain_to_buffer (c.data(), c.frames(), gain);
|
||||
}
|
||||
ListedSource<float>::output(c);
|
||||
}
|
||||
|
||||
} // namespace
|
Loading…
Reference in New Issue
Block a user