Chris@10: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@10: Chris@10: /* Chris@10: Rubber Band Library Chris@10: An audio time-stretching and pitch-shifting library. Chris@10: Copyright 2007-2012 Particular Programs Ltd. Chris@10: Chris@10: This program is free software; you can redistribute it and/or Chris@10: modify it under the terms of the GNU General Public License as Chris@10: published by the Free Software Foundation; either version 2 of the Chris@10: License, or (at your option) any later version. See the file Chris@10: COPYING included with this distribution for more information. Chris@10: Chris@10: Alternatively, if you have a valid commercial licence for the Chris@10: Rubber Band Library obtained by agreement with the copyright Chris@10: holders, you may redistribute and/or modify it under the terms Chris@10: described in that licence. Chris@10: Chris@10: If you wish to distribute code using the Rubber Band Library Chris@10: under terms other than those of the GNU General Public License, Chris@10: you must obtain a valid commercial licence before doing so. Chris@10: */ Chris@10: Chris@10: #ifndef _RUBBERBAND_PITCH_SHIFTER_H_ Chris@10: #define _RUBBERBAND_PITCH_SHIFTER_H_ Chris@10: Chris@10: #include Chris@10: Chris@10: #include "base/RingBuffer.h" Chris@10: Chris@10: namespace RubberBand { Chris@10: class RubberBandStretcher; Chris@10: } Chris@10: Chris@10: class RubberBandPitchShifter Chris@10: { Chris@10: public: Chris@10: static const LADSPA_Descriptor *getDescriptor(unsigned long index); Chris@10: Chris@10: protected: Chris@10: RubberBandPitchShifter(int sampleRate, size_t channels); Chris@10: ~RubberBandPitchShifter(); Chris@10: Chris@10: enum { Chris@10: LatencyPort = 0, Chris@10: OctavesPort = 1, Chris@10: SemitonesPort = 2, Chris@10: CentsPort = 3, Chris@10: CrispnessPort = 4, Chris@10: FormantPort = 5, Chris@10: FastPort = 6, Chris@10: InputPort1 = 7, Chris@10: OutputPort1 = 8, Chris@10: PortCountMono = OutputPort1 + 1, Chris@10: InputPort2 = 9, Chris@10: OutputPort2 = 10, Chris@10: PortCountStereo = OutputPort2 + 1 Chris@10: }; Chris@10: Chris@10: static const char *const portNamesMono[PortCountMono]; Chris@10: static const LADSPA_PortDescriptor portsMono[PortCountMono]; Chris@10: static const LADSPA_PortRangeHint hintsMono[PortCountMono]; Chris@10: Chris@10: static const char *const portNamesStereo[PortCountStereo]; Chris@10: static const LADSPA_PortDescriptor portsStereo[PortCountStereo]; Chris@10: static const LADSPA_PortRangeHint hintsStereo[PortCountStereo]; Chris@10: Chris@10: static const LADSPA_Properties properties; Chris@10: Chris@10: static const LADSPA_Descriptor ladspaDescriptorMono; Chris@10: static const LADSPA_Descriptor ladspaDescriptorStereo; Chris@10: Chris@10: static LADSPA_Handle instantiate(const LADSPA_Descriptor *, unsigned long); Chris@10: static void connectPort(LADSPA_Handle, unsigned long, LADSPA_Data *); Chris@10: static void activate(LADSPA_Handle); Chris@10: static void run(LADSPA_Handle, unsigned long); Chris@10: static void deactivate(LADSPA_Handle); Chris@10: static void cleanup(LADSPA_Handle); Chris@10: Chris@10: void activateImpl(); Chris@10: void runImpl(unsigned long); Chris@10: void runImpl(unsigned long, unsigned long offset); Chris@10: void updateRatio(); Chris@10: void updateCrispness(); Chris@10: void updateFormant(); Chris@10: void updateFast(); Chris@10: Chris@10: float *m_input[2]; Chris@10: float *m_output[2]; Chris@10: float *m_latency; Chris@10: float *m_cents; Chris@10: float *m_semitones; Chris@10: float *m_octaves; Chris@10: float *m_crispness; Chris@10: float *m_formant; Chris@10: float *m_fast; Chris@10: double m_ratio; Chris@10: double m_prevRatio; Chris@10: int m_currentCrispness; Chris@10: bool m_currentFormant; Chris@10: bool m_currentFast; Chris@10: Chris@10: size_t m_blockSize; Chris@10: size_t m_reserve; Chris@10: size_t m_minfill; Chris@10: Chris@10: RubberBand::RubberBandStretcher *m_stretcher; Chris@10: RubberBand::RingBuffer *m_outputBuffer[2]; Chris@10: float *m_scratch[2]; Chris@10: Chris@10: int m_sampleRate; Chris@10: size_t m_channels; Chris@10: }; Chris@10: Chris@10: Chris@10: #endif