DPF

DISTRHO Plugin Framework
Log | Files | Refs | Submodules | README | LICENSE

commit f3b8ec198beca059190fef55b819e4fe5c60f03b
parent 410225951712dc16b3e50bea32f5f3dcf837ccc4
Author: falkTX <falktx@gmail.com>
Date:   Sat, 16 Aug 2014 18:47:26 +0100

Write some API documentation; Cleanup

Diffstat:
Mdistrho/DistrhoPlugin.hpp | 408+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Mdistrho/DistrhoUI.hpp | 5+++++
Mdistrho/src/DistrhoPluginChecks.h | 2+-
3 files changed, 333 insertions(+), 82 deletions(-)

diff --git a/distrho/DistrhoPlugin.hpp b/distrho/DistrhoPlugin.hpp @@ -34,63 +34,114 @@ START_NAMESPACE_DISTRHO -// ----------------------------------------------------------------------- -// Parameter Hints +/* ------------------------------------------------------------------------------------------------------------ + * Parameter Hints */ -const uint32_t PARAMETER_IS_AUTOMABLE = 1 << 0; -const uint32_t PARAMETER_IS_BOOLEAN = 1 << 1; -const uint32_t PARAMETER_IS_INTEGER = 1 << 2; -const uint32_t PARAMETER_IS_LOGARITHMIC = 1 << 3; -const uint32_t PARAMETER_IS_OUTPUT = 1 << 4; +/** + @defgroup ParameterHints Parameter Hints -// ----------------------------------------------------------------------- -// Parameter Ranges + Various parameter hints. + @see Parameter::hints + @{ + */ + +/** + Parameter is automable (real-time safe). + @see Plugin::d_setParameterValue() + */ +static const uint32_t kParameterIsAutomable = 0x01; + +/** + Parameter value is boolean. + It's always at either minimum or maximum value. + */ +static const uint32_t kParameterIsBoolean = 0x02; + +/** + Parameter value is integer. + */ +static const uint32_t kParameterIsInteger = 0x04; + +/** + Parameter value is logarithmic. + */ +static const uint32_t kParameterIsLogarithmic = 0x08; + +/** + Parameter is of output type. + When unset, parameter is assumed to be of input type. + + Parameter inputs are changed by the host and must not be changed by the plugin. + The only exception being when changing programs, see Plugin::d_setProgram(). + Outputs are changed by the plugin and never modified by the host. + */ +static const uint32_t kParameterIsOutput = 0x10; + +/** @} */ + +/* ------------------------------------------------------------------------------------------------------------ + * DPF Base structs */ +/** + Parameter ranges. + This is used to set the default, minimum and maximum values of a parameter. + + By default a parameter has 0.0 as minimum, 1.0 as maximum and 0.0 as default. + When changing this struct values you must ensure maximum > minimum and default is within range. + */ struct ParameterRanges { + /** + Default value. + */ float def; + + /** + Minimum value. + */ float min; + + /** + Maximum value. + */ float max; + /** + Default constructor. + */ ParameterRanges() noexcept : def(0.0f), min(0.0f), max(1.0f) {} - ParameterRanges(float def, float min, float max) noexcept - { - this->def = def; - this->min = min; - this->max = max; - } - - void clear() noexcept - { - def = 0.0f; - min = 0.0f; - max = 1.0f; - } + /** + Constructor using custom values. + */ + ParameterRanges(const float df, const float mn, const float mx) noexcept + : def(df), + min(mn), + max(mx) {} - /*! - * Fix default value within range. + /** + Fix the default value within range. */ void fixDefault() noexcept { fixValue(def); } - /*! - * Fix a value within range. + /** + Fix a value within range. */ void fixValue(float& value) const noexcept { - if (value <= min) + if (value < min) value = min; else if (value > max) value = max; } - /*! - * Get a fixed value within range. + /** + Get a fixed value within range. */ const float& getFixedValue(const float& value) const noexcept { @@ -101,8 +152,8 @@ struct ParameterRanges { return value; } - /*! - * Get a value normalized to 0.0<->1.0. + /** + Get a value normalized to 0.0<->1.0. */ float getNormalizedValue(const float& value) const noexcept { @@ -115,8 +166,8 @@ struct ParameterRanges { return normValue; } - /*! - * Get a value normalized to 0.0<->1.0, fixed within range. + /** + Get a value normalized to 0.0<->1.0, fixed within range. */ float getFixedAndNormalizedValue(const float& value) const noexcept { @@ -135,8 +186,8 @@ struct ParameterRanges { return normValue; } - /*! - * Get a proper value previously normalized to 0.0<->1.0. + /** + Get a proper value previously normalized to 0.0<->1.0. */ float getUnnormalizedValue(const float& value) const noexcept { @@ -149,70 +200,160 @@ struct ParameterRanges { } }; -// ----------------------------------------------------------------------- -// Parameter - +/** + Parameter. + */ struct Parameter { + /** + Hints describing this parameter. + @see ParameterHints + */ uint32_t hints; + + /** + The name of this parameter. + A parameter name can contain any characters, but hosts might have a hard time with non-ascii ones. + The name doesn't have to be unique within a plugin instance, but it's recommended. + */ d_string name; + + /** + The symbol of this parameter. + A parameter symbol is a short restricted name used as a machine and human readable identifier. + The first character must be one of _, a-z or A-Z and subsequent characters can be from _, a-z, A-Z and 0-9. + @note: Parameter symbols MUST be unique within a plugin instance. + */ d_string symbol; + + /** + The unit of this parameter. + This means something like "dB", "kHz" and "ms". + Can be left blank if units do not apply to this parameter. + */ d_string unit; + + /** + Ranges of this parameter. + The ranges describe the default, minimum and maximum values. + */ ParameterRanges ranges; + /** + Default constructor for a null parameter. + */ Parameter() noexcept - : hints(0x0) {} - - void clear() noexcept - { - hints = 0x0; - name = ""; - symbol = ""; - unit = ""; - ranges.clear(); - } + : hints(0x0), + name(), + symbol(), + unit(), + ranges() {} }; -// ----------------------------------------------------------------------- -// MidiEvent - +/** + MIDI event. + */ struct MidiEvent { + /** + Size of internal data. + */ + static const uint32_t kDataSize = 4; + + /** + Time offset in frames. + */ uint32_t frame; - uint8_t size; - uint8_t buf[4]; - void clear() noexcept - { - frame = 0; - size = 0; - buf[0] = 0; - buf[1] = 0; - buf[2] = 0; - buf[3] = 0; - } -}; + /** + Number of bytes used. + */ + uint32_t size; -// ----------------------------------------------------------------------- -// TimePos + /** + MIDI data. + If size > kDataSize, dataExt is used (otherwise null). + */ + uint8_t data[kDataSize]; + const uint8_t* dataExt; +}; -struct TimePos { +/** + Time position. + This struct is inspired by the JACK API. + The @a playing and @a frame values are always valid. + BBT values are only valid when @a bbt.valid is true. + */ +struct TimePosition { + /** + Wherever the host transport is playing/rolling. + */ bool playing; + + /** + Current host transport position in frames. + */ uint64_t frame; - struct BeatBarTick { + /** + Bar-Beat-Tick time position. + */ + struct BarBeatTick { + /** + Wherever the host transport is using BBT. + If false you must not read from this struct. + */ bool valid; - int32_t bar; /*!< current bar */ - int32_t beat; /*!< current beat-within-bar */ - int32_t tick; /*!< current tick-within-beat */ + /** + Current bar. + Should always be > 0. + The first bar is bar '1'. + */ + int32_t bar; + + /** + Current beat within bar. + Should always be > 0 and <= @a beatsPerBar. + The first beat is beat '1'. + */ + int32_t beat; + + /** + Current tick within beat. + Should always be > 0 and <= @a ticksPerBeat. + The first tick is tick '0'. + */ + int32_t tick; + + /** + Number of ticks that have elapsed between frame 0 and the first beat of the current measure. + */ double barStartTick; - float beatsPerBar; /*!< time signature "numerator" */ - float beatType; /*!< time signature "denominator" */ + /** + Time signature "numerator". + */ + float beatsPerBar; + /** + Time signature "denominator". + */ + float beatType; + + /** + Number of ticks within a bar. + Usually a moderately large integer with many denominators, such as 1920.0. + */ double ticksPerBeat; + + /** + Number of beats per minute. + */ double beatsPerMinute; - BeatBarTick() noexcept + /** + Default constructor for a null BBT time position. + */ + BarBeatTick() noexcept : valid(false), bar(0), beat(0), @@ -224,29 +365,61 @@ struct TimePos { beatsPerMinute(0.0) {} } bbt; - TimePos() noexcept + /** + Default constructor for a time position. + */ + TimePosition() noexcept : playing(false), - frame(0) {} + frame(0), + bbt() {} }; -// ----------------------------------------------------------------------- -// Plugin +/* ------------------------------------------------------------------------------------------------------------ + * DPF Plugin */ +/** + TODO. + */ class Plugin { public: - Plugin(uint32_t parameterCount, uint32_t programCount, uint32_t stateCount); + /** + TODO. + */ + Plugin(const uint32_t parameterCount, const uint32_t programCount, const uint32_t stateCount); + + /** + Destructor. + */ virtual ~Plugin(); // ------------------------------------------------------------------- // Host state + /** + TODO. + */ uint32_t d_getBufferSize() const noexcept; + + /** + TODO. + */ double d_getSampleRate() const noexcept; + + /** + TODO. + */ #if DISTRHO_PLUGIN_WANT_TIMEPOS + /** + TODO. + */ const TimePos& d_getTimePos() const noexcept; #endif + #if DISTRHO_PLUGIN_WANT_LATENCY + /** + TODO. + */ void d_setLatency(uint32_t frames) noexcept; #endif @@ -254,51 +427,121 @@ protected: // ------------------------------------------------------------------- // Information + /** + TODO. + */ virtual const char* d_getName() const noexcept { return DISTRHO_PLUGIN_NAME; } + + /** + TODO. + */ virtual const char* d_getLabel() const noexcept = 0; + + /** + TODO. + */ virtual const char* d_getMaker() const noexcept = 0; + + /** + TODO. + */ virtual const char* d_getLicense() const noexcept = 0; + + /** + TODO. + */ virtual uint32_t d_getVersion() const noexcept = 0; + + /** + TODO. + */ virtual long d_getUniqueId() const noexcept = 0; // ------------------------------------------------------------------- // Init + /** + TODO. + */ virtual void d_initParameter(uint32_t index, Parameter& parameter) = 0; + #if DISTRHO_PLUGIN_WANT_PROGRAMS + /** + TODO. + */ virtual void d_initProgramName(uint32_t index, d_string& programName) = 0; #endif + #if DISTRHO_PLUGIN_WANT_STATE + /** + TODO. + */ virtual void d_initStateKey(uint32_t index, d_string& stateKey) = 0; #endif // ------------------------------------------------------------------- // Internal data + /** + TODO. + */ virtual float d_getParameterValue(uint32_t index) const = 0; + + /** + TODO. + */ virtual void d_setParameterValue(uint32_t index, float value) = 0; + #if DISTRHO_PLUGIN_WANT_PROGRAMS + /** + TODO. + */ virtual void d_setProgram(uint32_t index) = 0; #endif + #if DISTRHO_PLUGIN_WANT_STATE + /** + TODO. + */ virtual void d_setState(const char* key, const char* value) = 0; #endif // ------------------------------------------------------------------- // Process + /** + TODO. + */ virtual void d_activate() {} + + /** + TODO. + */ virtual void d_deactivate() {} + #if DISTRHO_PLUGIN_IS_SYNTH + /** + TODO. + */ virtual void d_run(const float** inputs, float** outputs, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) = 0; #else + /** + TODO. + */ virtual void d_run(const float** inputs, float** outputs, uint32_t frames) = 0; #endif // ------------------------------------------------------------------- // Callbacks (optional) + /** + TODO. + */ virtual void d_bufferSizeChanged(uint32_t newBufferSize); + + /** + TODO. + */ virtual void d_sampleRateChanged(double newSampleRate); // ------------------------------------------------------------------- @@ -311,12 +554,15 @@ private: DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Plugin) }; -// ----------------------------------------------------------------------- -// Create plugin, entry point +/* ------------------------------------------------------------------------------------------------------------ + * Create plugin, entry point */ +/** + TODO. + */ extern Plugin* createPlugin(); -// ----------------------------------------------------------------------- +/* ------------------------------------------------------------------------------------------------------------ */ END_NAMESPACE_DISTRHO diff --git a/distrho/DistrhoUI.hpp b/distrho/DistrhoUI.hpp @@ -85,6 +85,11 @@ protected: #endif // ------------------------------------------------------------------- + // DSP Callbacks (optional) + + virtual void d_sampleRateChanged(double newSampleRate); + + // ------------------------------------------------------------------- // UI Callbacks (optional) virtual void d_uiIdle() {} diff --git a/distrho/src/DistrhoPluginChecks.h b/distrho/src/DistrhoPluginChecks.h @@ -60,7 +60,7 @@ #endif #ifndef DISTRHO_PLUGIN_IS_RT_SAFE -# define DISTRHO_PLUGIN_IS_RT_SAFE 1 +# define DISTRHO_PLUGIN_IS_RT_SAFE 0 #endif #ifndef DISTRHO_UI_USE_NANOVG