Mercurial > hg > pub > prymula > com
diff DPF-Prymula-audioplugins/dpf/distrho/DistrhoPlugin.hpp @ 3:84e66ea83026
DPF-Prymula-audioplugins-0.231015-2
author | prymula <prymula76@outlook.com> |
---|---|
date | Mon, 16 Oct 2023 21:53:34 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DPF-Prymula-audioplugins/dpf/distrho/DistrhoPlugin.hpp Mon Oct 16 21:53:34 2023 +0200 @@ -0,0 +1,401 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com> + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_PLUGIN_HPP_INCLUDED +#define DISTRHO_PLUGIN_HPP_INCLUDED + +#include "DistrhoDetails.hpp" +#include "extra/LeakDetector.hpp" +#include "src/DistrhoPluginChecks.h" + +START_NAMESPACE_DISTRHO + +/* ------------------------------------------------------------------------------------------------------------ + * DPF Plugin */ + +/** + @defgroup MainClasses Main Classes + @{ + */ + +/** + DPF Plugin class from where plugin instances are created. + + The public methods (Host state) are called from the plugin to get or set host information.@n + They can be called from a plugin instance at anytime unless stated otherwise.@n + All other methods are to be implemented by the plugin and will be called by the host. + + Shortly after a plugin instance is created, the various init* functions will be called by the host.@n + Host will call activate() before run(), and deactivate() before the plugin instance is destroyed.@n + The host may call deactivate right after activate and vice-versa, but never activate/deactivate consecutively.@n + There is no limit on how many times run() is called, only that activate/deactivate will be called in between. + + The buffer size and sample rate values will remain constant between activate and deactivate.@n + Buffer size is only a hint though, the host might call run() with a higher or lower number of frames. + + Some of this class functions are only available according to some macros. + + DISTRHO_PLUGIN_WANT_PROGRAMS activates program related features.@n + When enabled you need to implement initProgramName() and loadProgram(). + + DISTRHO_PLUGIN_WANT_STATE activates internal state features.@n + When enabled you need to implement initState() and setState(). + + The process function run() changes wherever DISTRHO_PLUGIN_WANT_MIDI_INPUT is enabled or not.@n + When enabled it provides midi input events. + */ +class Plugin +{ +public: + /** + Plugin class constructor.@n + You must set all parameter values to their defaults, matching ParameterRanges::def. + */ + Plugin(uint32_t parameterCount, uint32_t programCount, uint32_t stateCount); + + /** + Destructor. + */ + virtual ~Plugin(); + + /* -------------------------------------------------------------------------------------------------------- + * Host state */ + + /** + Get the current buffer size that will probably be used during processing, in frames.@n + This value will remain constant between activate and deactivate. + @note This value is only a hint!@n + Hosts might call run() with a higher or lower number of frames. + @see bufferSizeChanged(uint32_t) + */ + uint32_t getBufferSize() const noexcept; + + /** + Get the current sample rate that will be used during processing.@n + This value will remain constant between activate and deactivate. + @see sampleRateChanged(double) + */ + double getSampleRate() const noexcept; + + /** + Get the bundle path where the plugin resides. + Can return null if the plugin is not available in a bundle (if it is a single binary). + @see getBinaryFilename + @see getResourcePath + */ + const char* getBundlePath() const noexcept; + + /** + Check if this plugin instance is a "dummy" one used for plugin meta-data/information export.@n + When true no processing will be done, the plugin is created only to extract information.@n + In DPF, LADSPA/DSSI, VST2 and VST3 formats create one global instance per plugin binary + while LV2 creates one when generating turtle meta-data. + */ + bool isDummyInstance() const noexcept; + + /** + Check if this plugin instance is a "selftest" one used for automated plugin tests.@n + To enable this mode build with `DPF_RUNTIME_TESTING` macro defined (i.e. set as compiler build flag), + and run the JACK/Standalone executable with "selftest" as its only and single argument. + + A few basic DSP and UI tests will run in self-test mode, with once instance having this function returning true.@n + You can use this chance to do a few tests of your own as well. + */ + bool isSelfTestInstance() const noexcept; + +#if DISTRHO_PLUGIN_WANT_TIMEPOS + /** + Get the current host transport time position.@n + This function should only be called during run().@n + You can call this during other times, but the returned position is not guaranteed to be in sync. + @note TimePosition is not supported in LADSPA and DSSI plugin formats. + */ + const TimePosition& getTimePosition() const noexcept; +#endif + +#if DISTRHO_PLUGIN_WANT_LATENCY + /** + Change the plugin audio output latency to @a frames.@n + This function should only be called in the constructor, activate() and run(). + @note This function is only available if DISTRHO_PLUGIN_WANT_LATENCY is enabled. + */ + void setLatency(uint32_t frames) noexcept; +#endif + +#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + /** + Write a MIDI output event.@n + This function must only be called during run().@n + Returns false when the host buffer is full, in which case do not call this again until the next run(). + */ + bool writeMidiEvent(const MidiEvent& midiEvent) noexcept; +#endif + +#if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST + /** + Check if parameter value change requests will work with the current plugin host. + @note This function is only available if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST is enabled. + @see requestParameterValueChange(uint32_t, float) + */ + bool canRequestParameterValueChanges() const noexcept; + + /** + Request a parameter value change from the host. + If successful, this function will automatically trigger a parameter update on the UI side as well. + This function can fail, for example if the host is busy with the parameter for read-only automation. + Some hosts simply do not have this functionality, which can be verified with canRequestParameterValueChanges(). + @note This function is only available if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST is enabled. + */ + bool requestParameterValueChange(uint32_t index, float value) noexcept; +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + /** + Set state value and notify the host about the change.@n + This function will call `setState()` and also trigger an update on the UI side as necessary.@n + It must not be called during run.@n + The state must be host readable. + @note this function does nothing on DSSI plugin format, as DSSI only supports UI->DSP messages. + + TODO API under construction + */ + bool updateStateValue(const char* key, const char* value) noexcept; +#endif + +protected: + /* -------------------------------------------------------------------------------------------------------- + * Information */ + + /** + Get the plugin name.@n + Returns DISTRHO_PLUGIN_NAME by default. + */ + virtual const char* getName() const { return DISTRHO_PLUGIN_NAME; } + + /** + Get the plugin label.@n + This label is a short restricted name consisting of only _, a-z, A-Z and 0-9 characters. + */ + virtual const char* getLabel() const = 0; + + /** + Get an extensive comment/description about the plugin.@n + Optional, returns nothing by default. + */ + virtual const char* getDescription() const { return ""; } + + /** + Get the plugin author/maker. + */ + virtual const char* getMaker() const = 0; + + /** + Get the plugin homepage.@n + Optional, returns nothing by default. + */ + virtual const char* getHomePage() const { return ""; } + + /** + Get the plugin license (a single line of text or a URL).@n + For commercial plugins this should return some short copyright information. + */ + virtual const char* getLicense() const = 0; + + /** + Get the plugin version, in hexadecimal. + @see d_version() + */ + virtual uint32_t getVersion() const = 0; + + /** + Get the plugin unique Id.@n + This value is used by LADSPA, DSSI and VST plugin formats. + @see d_cconst() + */ + virtual int64_t getUniqueId() const = 0; + + /* -------------------------------------------------------------------------------------------------------- + * Init */ + + /** + Initialize the audio port @a index.@n + This function will be called once, shortly after the plugin is created. + */ + virtual void initAudioPort(bool input, uint32_t index, AudioPort& port); + + /** + Initialize the parameter @a index.@n + This function will be called once, shortly after the plugin is created. + */ + virtual void initParameter(uint32_t index, Parameter& parameter); + + /** + Initialize the port group @a groupId.@n + This function will be called once, + shortly after the plugin is created and all audio ports and parameters have been enumerated. + */ + virtual void initPortGroup(uint32_t groupId, PortGroup& portGroup); + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + /** + Set the name of the program @a index.@n + This function will be called once, shortly after the plugin is created.@n + Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled. + */ + virtual void initProgramName(uint32_t index, String& programName) = 0; +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + /** + Initialize the state @a index.@n + This function will be called once, shortly after the plugin is created.@n + Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. + */ + virtual void initState(uint32_t index, State& state); + + DISTRHO_DEPRECATED_BY("initState(uint32_t,State&)") + virtual void initState(uint32_t, String&, String&) {} + + DISTRHO_DEPRECATED_BY("initState(uint32_t,State&)") + virtual bool isStateFile(uint32_t) { return false; } +#endif + + /* -------------------------------------------------------------------------------------------------------- + * Internal data */ + + /** + Get the current value of a parameter.@n + The host may call this function from any context, including realtime processing. + */ + virtual float getParameterValue(uint32_t index) const; + + /** + Change a parameter value.@n + The host may call this function from any context, including realtime processing.@n + When a parameter is marked as automatable, you must ensure no non-realtime operations are performed. + @note This function will only be called for parameter inputs. + */ + virtual void setParameterValue(uint32_t index, float value); + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + /** + Load a program.@n + The host may call this function from any context, including realtime processing.@n + Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled. + */ + virtual void loadProgram(uint32_t index); +#endif + +#if DISTRHO_PLUGIN_WANT_FULL_STATE + /** + Get the value of an internal state.@n + The host may call this function from any non-realtime context.@n + Must be implemented by your plugin class if DISTRHO_PLUGIN_WANT_FULL_STATE is enabled. + @note The use of this function breaks compatibility with the DSSI format. + */ + virtual String getState(const char* key) const; +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + /** + Change an internal state @a key to @a value.@n + Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. + */ + virtual void setState(const char* key, const char* value); +#endif + + /* -------------------------------------------------------------------------------------------------------- + * Audio/MIDI Processing */ + + /** + Activate this plugin. + */ + virtual void activate() {} + + /** + Deactivate this plugin. + */ + virtual void deactivate() {} + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + /** + Run/process function for plugins with MIDI input. + @note Some parameters might be null if there are no audio inputs/outputs or MIDI events. + */ + virtual void run(const float** inputs, float** outputs, uint32_t frames, + const MidiEvent* midiEvents, uint32_t midiEventCount) = 0; +#else + /** + Run/process function for plugins without MIDI input. + @note Some parameters might be null if there are no audio inputs or outputs. + */ + virtual void run(const float** inputs, float** outputs, uint32_t frames) = 0; +#endif + + /* -------------------------------------------------------------------------------------------------------- + * Callbacks (optional) */ + + /** + Optional callback to inform the plugin about a buffer size change.@n + This function will only be called when the plugin is deactivated. + @note This value is only a hint!@n + Hosts might call run() with a higher or lower number of frames. + @see getBufferSize() + */ + virtual void bufferSizeChanged(uint32_t newBufferSize); + + /** + Optional callback to inform the plugin about a sample rate change.@n + This function will only be called when the plugin is deactivated. + @see getSampleRate() + */ + virtual void sampleRateChanged(double newSampleRate); + + // ------------------------------------------------------------------------------------------------------- + +private: + struct PrivateData; + PrivateData* const pData; + friend class PluginExporter; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Plugin) +}; + +/** @} */ + +/* ------------------------------------------------------------------------------------------------------------ + * Create plugin, entry point */ + +/** + @defgroup EntryPoints Entry Points + @{ + */ + +/** + Create an instance of the Plugin class.@n + This is the entry point for DPF plugins.@n + DPF will call this to either create an instance of your plugin for the host + or to fetch some initial information for internal caching. + */ +extern Plugin* createPlugin(); + +/** @} */ + +// ----------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_PLUGIN_HPP_INCLUDED