13
0

Merge branch 'windows+cc' into cairocanvas

This commit is contained in:
John Emmas 2014-01-13 15:05:30 +00:00
commit a1a3f6c826
18 changed files with 117 additions and 74 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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<>

View File

@ -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<>
{

View File

@ -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<>
{

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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<>

View File

@ -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;

View File

@ -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

View File

@ -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 () {}

View File

@ -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 () { }

View File

@ -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() {}

View File

@ -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);

View File

@ -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); }

View File

@ -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); }

View 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