diff options
Diffstat (limited to 'libs/ardour/ardour/export_utilities.h')
-rw-r--r-- | libs/ardour/ardour/export_utilities.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/libs/ardour/ardour/export_utilities.h b/libs/ardour/ardour/export_utilities.h new file mode 100644 index 0000000000..e5660e3b75 --- /dev/null +++ b/libs/ardour/ardour/export_utilities.h @@ -0,0 +1,146 @@ +/* + Copyright (C) 2008 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. + +*/ + +#ifndef __ardour_export_utilities_h__ +#define __ardour_export_utilities_h__ + +#include <samplerate.h> + +#include <ardour/graph.h> +#include <ardour/types.h> +#include <ardour/ardour.h> +#include <ardour/export_format_base.h> +#include <ardour/runtime_functions.h> + +namespace ARDOUR +{ + +/* Processors */ + +/* Sample rate converter */ + +class SampleRateConverter : public GraphSinkVertex<float, float> +{ + public: + SampleRateConverter (uint32_t channels, nframes_t in_rate, nframes_t out_rate, int quality); + ~SampleRateConverter (); + + protected: + nframes_t process (float * data, nframes_t frames); + + private: + bool active; + uint32_t channels; + + nframes_t leftover_frames; + nframes_t max_leftover_frames; + nframes_t frames_in; + nframes_t frames_out; + + float * data_in; + float * leftover_data; + + float * data_out; + nframes_t data_out_size; + + SRC_DATA src_data; + SRC_STATE* src_state; +}; + +/* Sample format converter */ + +template <typename TOut> +class SampleFormatConverter : public GraphSinkVertex<float, TOut> +{ + public: + SampleFormatConverter (uint32_t channels, ExportFormatBase::DitherType type = ExportFormatBase::D_None, int data_width_ = 0); + ~SampleFormatConverter (); + + void set_clip_floats (bool yn) { clip_floats = yn; } + + protected: + nframes_t process (float * data, nframes_t frames); + + private: + uint32_t channels; + int data_width; + GDither dither; + nframes_t data_out_size; + TOut * data_out; + + bool clip_floats; + +}; + +/* Peak reader */ + +class PeakReader : public GraphSinkVertex<float, float> +{ + public: + PeakReader (uint32_t channels) : channels (channels), peak (0) {} + ~PeakReader () {} + + float get_peak () { return peak; } + + protected: + nframes_t process (float * data, nframes_t frames) + { + peak = compute_peak (data, channels * frames, peak); + return piped_to->write (data, frames); + } + + private: + uint32_t channels; + float peak; +}; + +/* Normalizer */ + +class Normalizer : public GraphSinkVertex<float, float> +{ + public: + Normalizer (uint32_t channels, float target_dB); + ~Normalizer (); + + void set_peak (float peak); + + protected: + nframes_t process (float * data, nframes_t frames); + + private: + uint32_t channels; + + bool enabled; + gain_t target; + gain_t gain; +}; + +/* Other */ + +class NullSink : public GraphSink<float> +{ + public: + nframes_t write (float * data, nframes_t frames) { return frames; } +}; + + +} // namespace ARDOUR + +#endif /* __ardour_export_utilities_h__ */ |