| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO Plugin Framework (DPF) | * DISTRHO Plugin Framework (DPF) | ||||
| * Copyright (C) 2012-2016 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
| @@ -89,6 +89,15 @@ static const uint32_t kParameterIsLogarithmic = 0x08; | |||||
| */ | */ | ||||
| static const uint32_t kParameterIsOutput = 0x10; | static const uint32_t kParameterIsOutput = 0x10; | ||||
| /** | |||||
| Parameter value is a trigger.@n | |||||
| This means the value resets back to its default after each process/run call.@n | |||||
| Cannot be used for output parameters. | |||||
| @note Only officially supported under LV2. For other formats DPF simulates the behaviour. | |||||
| */ | |||||
| static const uint32_t kParameterIsTrigger = 0x20 | kParameterIsBoolean; | |||||
| /** @} */ | /** @} */ | ||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| @@ -274,6 +283,90 @@ struct ParameterRanges { | |||||
| } | } | ||||
| }; | }; | ||||
| /** | |||||
| Parameter enumeration value.@n | |||||
| A string representation of a plugin parameter value.@n | |||||
| Used together can be used to give meaning to parameter values, working as an enumeration. | |||||
| */ | |||||
| struct ParameterEnumerationValue { | |||||
| /** | |||||
| Parameter value. | |||||
| */ | |||||
| float value; | |||||
| /** | |||||
| String representation of this value. | |||||
| */ | |||||
| String label; | |||||
| /** | |||||
| Default constructor, using 0.0 as value and empty label. | |||||
| */ | |||||
| ParameterEnumerationValue() noexcept | |||||
| : value(0.0f), | |||||
| label() {} | |||||
| /** | |||||
| Constructor using custom values. | |||||
| */ | |||||
| ParameterEnumerationValue(float v, const char* l) noexcept | |||||
| : value(v), | |||||
| label(l) {} | |||||
| }; | |||||
| /** | |||||
| Collection of parameter enumeration values.@n | |||||
| Handy class to handle the lifetime and count of all enumeration values. | |||||
| */ | |||||
| struct ParameterEnumerationValues { | |||||
| /** | |||||
| Number of elements allocated in @values. | |||||
| */ | |||||
| uint8_t count; | |||||
| /** | |||||
| Wherever the host is to be restricted to only use enumeration values. | |||||
| @note This mode is only a hint! Not all hosts and plugin formats support this mode. | |||||
| */ | |||||
| bool restrictedMode; | |||||
| /** | |||||
| Array of @ParameterEnumerationValue items.@n | |||||
| This pointer must be null or have been allocated on the heap with `new`. | |||||
| */ | |||||
| const ParameterEnumerationValue* values; | |||||
| /** | |||||
| Default constructor, for zero enumeration values. | |||||
| */ | |||||
| ParameterEnumerationValues() noexcept | |||||
| : count(0), | |||||
| restrictedMode(false), | |||||
| values() {} | |||||
| /** | |||||
| Constructor using custom values.@n | |||||
| The pointer to @values must have been allocated on the heap with `new`. | |||||
| */ | |||||
| ParameterEnumerationValues(uint32_t c, bool r, const ParameterEnumerationValue* v) noexcept | |||||
| : count(c), | |||||
| restrictedMode(r), | |||||
| values(v) {} | |||||
| ~ParameterEnumerationValues() noexcept | |||||
| { | |||||
| count = 0; | |||||
| restrictedMode = false; | |||||
| if (values != nullptr) | |||||
| { | |||||
| delete[] values; | |||||
| values = nullptr; | |||||
| } | |||||
| } | |||||
| }; | |||||
| /** | /** | ||||
| Parameter. | Parameter. | ||||
| */ | */ | ||||
| @@ -312,6 +405,12 @@ struct Parameter { | |||||
| */ | */ | ||||
| ParameterRanges ranges; | ParameterRanges ranges; | ||||
| /** | |||||
| Enumeration values.@n | |||||
| Can be used to give meaning to parameter values, working as an enumeration. | |||||
| */ | |||||
| ParameterEnumerationValues enumValues; | |||||
| /** | /** | ||||
| Designation for this parameter. | Designation for this parameter. | ||||
| */ | */ | ||||
| @@ -334,6 +433,7 @@ struct Parameter { | |||||
| symbol(), | symbol(), | ||||
| unit(), | unit(), | ||||
| ranges(), | ranges(), | ||||
| enumValues(), | |||||
| designation(kParameterDesignationNull), | designation(kParameterDesignationNull), | ||||
| midiCC(0) {} | midiCC(0) {} | ||||
| @@ -346,6 +446,7 @@ struct Parameter { | |||||
| symbol(s), | symbol(s), | ||||
| unit(u), | unit(u), | ||||
| ranges(def, min, max), | ranges(def, min, max), | ||||
| enumValues(), | |||||
| designation(kParameterDesignationNull), | designation(kParameterDesignationNull), | ||||
| midiCC(0) {} | midiCC(0) {} | ||||
| @@ -593,9 +694,6 @@ public: | |||||
| Write a MIDI output event.@n | Write a MIDI output event.@n | ||||
| This function must only be called during run().@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(). | Returns false when the host buffer is full, in which case do not call this again until the next run(). | ||||
| @note This function is not implemented yet!@n | |||||
| It's here so that developers can prepare MIDI plugins in advance.@n | |||||
| If you plan to use this, please report to DPF authors so it can be implemented. | |||||
| */ | */ | ||||
| bool writeMidiEvent(const MidiEvent& midiEvent) noexcept; | bool writeMidiEvent(const MidiEvent& midiEvent) noexcept; | ||||
| #endif | #endif | ||||
| @@ -90,10 +90,11 @@ public: | |||||
| void setState(const char* key, const char* value); | void setState(const char* key, const char* value); | ||||
| #endif | #endif | ||||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||||
| #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||||
| /** | /** | ||||
| sendNote. | sendNote. | ||||
| @TODO Document this. | @TODO Document this. | ||||
| @note Work in progress. Implemented for DSSI and LV2 formats. | |||||
| */ | */ | ||||
| void sendNote(uint8_t channel, uint8_t note, uint8_t velocity); | void sendNote(uint8_t channel, uint8_t note, uint8_t velocity); | ||||
| #endif | #endif | ||||
| @@ -106,7 +106,7 @@ std::vector<uint8_t> d_getChunkFromBase64String(const char* const base64string) | |||||
| if (c == ' ' || c == '\n') | if (c == ' ' || c == '\n') | ||||
| continue; | continue; | ||||
| DISTRHO_SAFE_ASSERT_CONTINUE(CarlaBase64Helpers::isBase64Char(c)); | |||||
| DISTRHO_SAFE_ASSERT_CONTINUE(DistrhoBase64Helpers::isBase64Char(c)); | |||||
| charArray4[i++] = static_cast<uint>(c); | charArray4[i++] = static_cast<uint>(c); | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO Plugin Framework (DPF) | * DISTRHO Plugin Framework (DPF) | ||||
| * Copyright (C) 2012-2016 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
| @@ -27,9 +27,10 @@ double d_lastSampleRate = 0.0; | |||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * Static fallback data, see DistrhoPluginInternal.hpp */ | * Static fallback data, see DistrhoPluginInternal.hpp */ | ||||
| const String PluginExporter::sFallbackString; | |||||
| const AudioPort PluginExporter::sFallbackAudioPort; | |||||
| const ParameterRanges PluginExporter::sFallbackRanges; | |||||
| const String PluginExporter::sFallbackString; | |||||
| const AudioPort PluginExporter::sFallbackAudioPort; | |||||
| const ParameterRanges PluginExporter::sFallbackRanges; | |||||
| const ParameterEnumerationValues PluginExporter::sFallbackEnumValues; | |||||
| /* ------------------------------------------------------------------------------------------------------------ | /* ------------------------------------------------------------------------------------------------------------ | ||||
| * Plugin */ | * Plugin */ | ||||
| @@ -102,10 +103,9 @@ void Plugin::setLatency(uint32_t frames) noexcept | |||||
| #endif | #endif | ||||
| #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT | #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT | ||||
| bool Plugin::writeMidiEvent(const MidiEvent& /*midiEvent*/) noexcept | |||||
| bool Plugin::writeMidiEvent(const MidiEvent& midiEvent) noexcept | |||||
| { | { | ||||
| // TODO | |||||
| return false; | |||||
| return pData->writeMidiCallback(midiEvent); | |||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -1,17 +1,17 @@ | |||||
| /* | /* | ||||
| * DISTRHO Plugin Framework (DPF) | * DISTRHO Plugin Framework (DPF) | ||||
| * Copyright (C) 2012-2016 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * This program is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation. | |||||
| * 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. | |||||
| * | * | ||||
| * 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 Lesser General Public License for more details. | |||||
| * | |||||
| * For a full copy of the license see the LGPL.txt file | |||||
| * 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. | |||||
| */ | */ | ||||
| #include "DistrhoPluginInternal.hpp" | #include "DistrhoPluginInternal.hpp" | ||||
| @@ -30,6 +30,9 @@ START_NAMESPACE_DISTRHO | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Carla UI | // Carla UI | ||||
| #if ! DISTRHO_PLUGIN_WANT_MIDI_OUTPUT | |||||
| static const writeMidiFunc writeMidiCallback = nullptr; | |||||
| #endif | |||||
| #if ! DISTRHO_PLUGIN_WANT_STATE | #if ! DISTRHO_PLUGIN_WANT_STATE | ||||
| static const setStateFunc setStateCallback = nullptr; | static const setStateFunc setStateCallback = nullptr; | ||||
| #endif | #endif | ||||
| @@ -104,15 +107,19 @@ protected: | |||||
| fHost->ui_parameter_changed(fHost->handle, rindex, value); | fHost->ui_parameter_changed(fHost->handle, rindex, value); | ||||
| } | } | ||||
| #if DISTRHO_PLUGIN_WANT_STATE | |||||
| void handleSetState(const char* const key, const char* const value) | void handleSetState(const char* const key, const char* const value) | ||||
| { | { | ||||
| fHost->ui_custom_data_changed(fHost->handle, key, value); | fHost->ui_custom_data_changed(fHost->handle, key, value); | ||||
| } | } | ||||
| #endif | |||||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||||
| void handleSendNote(const uint8_t, const uint8_t, const uint8_t) | void handleSendNote(const uint8_t, const uint8_t, const uint8_t) | ||||
| { | { | ||||
| // TODO | // TODO | ||||
| } | } | ||||
| #endif | |||||
| void handleSetSize(const uint width, const uint height) | void handleSetSize(const uint width, const uint height) | ||||
| { | { | ||||
| @@ -175,7 +182,8 @@ class PluginCarla : public NativePluginClass | |||||
| { | { | ||||
| public: | public: | ||||
| PluginCarla(const NativeHostDescriptor* const host) | PluginCarla(const NativeHostDescriptor* const host) | ||||
| : NativePluginClass(host) | |||||
| : NativePluginClass(host), | |||||
| fPlugin(this, writeMidiCallback) | |||||
| { | { | ||||
| #if DISTRHO_PLUGIN_HAS_UI | #if DISTRHO_PLUGIN_HAS_UI | ||||
| fUiPtr = nullptr; | fUiPtr = nullptr; | ||||
| @@ -317,7 +325,7 @@ protected: | |||||
| fPlugin.deactivate(); | fPlugin.deactivate(); | ||||
| } | } | ||||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||||
| #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||||
| void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const NativeMidiEvent* const midiEvents, const uint32_t midiEventCount) override | void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const NativeMidiEvent* const midiEvents, const uint32_t midiEventCount) override | ||||
| { | { | ||||
| MidiEvent realMidiEvents[midiEventCount]; | MidiEvent realMidiEvents[midiEventCount]; | ||||
| @@ -455,6 +463,20 @@ private: | |||||
| } | } | ||||
| #endif | #endif | ||||
| #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT | |||||
| static bool writeMidiCallback(void* ptr, const MidiEvent& midiEvent) | |||||
| { | |||||
| if (midiEvent.size > 4) | |||||
| return; | |||||
| const NativeMidiEvent event = { | |||||
| midiEvent.frame, 0, midiEvent.size, midiEvent.data | |||||
| }; | |||||
| return ((PluginCarla*)ptr)->fPlugin.writeMidiEvent(midiEvent); | |||||
| } | |||||
| #endif | |||||
| CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginCarla) | CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginCarla) | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO Plugin Framework (DPF) | * DISTRHO Plugin Framework (DPF) | ||||
| * Copyright (C) 2012-2016 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
| @@ -32,6 +32,11 @@ static const uint32_t kMaxMidiEvents = 512; | |||||
| extern uint32_t d_lastBufferSize; | extern uint32_t d_lastBufferSize; | ||||
| extern double d_lastSampleRate; | extern double d_lastSampleRate; | ||||
| // ----------------------------------------------------------------------- | |||||
| // DSP callbacks | |||||
| typedef bool (*writeMidiFunc) (void* ptr, const MidiEvent& midiEvent); | |||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| // Plugin private data | // Plugin private data | ||||
| @@ -65,6 +70,10 @@ struct Plugin::PrivateData { | |||||
| TimePosition timePosition; | TimePosition timePosition; | ||||
| #endif | #endif | ||||
| // Callbacks | |||||
| void* callbacksPtr; | |||||
| writeMidiFunc writeMidiCallbackFunc; | |||||
| uint32_t bufferSize; | uint32_t bufferSize; | ||||
| double sampleRate; | double sampleRate; | ||||
| @@ -88,6 +97,8 @@ struct Plugin::PrivateData { | |||||
| #if DISTRHO_PLUGIN_WANT_LATENCY | #if DISTRHO_PLUGIN_WANT_LATENCY | ||||
| latency(0), | latency(0), | ||||
| #endif | #endif | ||||
| callbacksPtr(nullptr), | |||||
| writeMidiCallbackFunc(nullptr), | |||||
| bufferSize(d_lastBufferSize), | bufferSize(d_lastBufferSize), | ||||
| sampleRate(d_lastSampleRate) | sampleRate(d_lastSampleRate) | ||||
| { | { | ||||
| @@ -149,6 +160,16 @@ struct Plugin::PrivateData { | |||||
| } | } | ||||
| #endif | #endif | ||||
| } | } | ||||
| #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT | |||||
| bool writeMidiCallback(const MidiEvent& midiEvent) | |||||
| { | |||||
| if (writeMidiCallbackFunc != nullptr) | |||||
| return writeMidiCallbackFunc(callbacksPtr, midiEvent); | |||||
| return false; | |||||
| } | |||||
| #endif | |||||
| }; | }; | ||||
| // ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
| @@ -157,7 +178,7 @@ struct Plugin::PrivateData { | |||||
| class PluginExporter | class PluginExporter | ||||
| { | { | ||||
| public: | public: | ||||
| PluginExporter() | |||||
| PluginExporter(void* const callbacksPtr, const writeMidiFunc writeMidiCall) | |||||
| : fPlugin(createPlugin()), | : fPlugin(createPlugin()), | ||||
| fData((fPlugin != nullptr) ? fPlugin->pData : nullptr), | fData((fPlugin != nullptr) ? fPlugin->pData : nullptr), | ||||
| fIsActive(false) | fIsActive(false) | ||||
| @@ -191,6 +212,9 @@ public: | |||||
| for (uint32_t i=0, count=fData->stateCount; i < count; ++i) | for (uint32_t i=0, count=fData->stateCount; i < count; ++i) | ||||
| fPlugin->initState(i, fData->stateKeys[i], fData->stateDefValues[i]); | fPlugin->initState(i, fData->stateKeys[i], fData->stateDefValues[i]); | ||||
| #endif | #endif | ||||
| fData->callbacksPtr = callbacksPtr; | |||||
| fData->writeMidiCallbackFunc = writeMidiCall; | |||||
| } | } | ||||
| ~PluginExporter() | ~PluginExporter() | ||||
| @@ -322,9 +346,26 @@ public: | |||||
| return fData->parameters[index].designation; | return fData->parameters[index].designation; | ||||
| } | } | ||||
| bool isParameterInput(const uint32_t index) const noexcept | |||||
| { | |||||
| return (getParameterHints(index) & kParameterIsOutput) == 0x0; | |||||
| } | |||||
| bool isParameterOutput(const uint32_t index) const noexcept | bool isParameterOutput(const uint32_t index) const noexcept | ||||
| { | { | ||||
| return (getParameterHints(index) & kParameterIsOutput); | |||||
| return (getParameterHints(index) & kParameterIsOutput) != 0x0; | |||||
| } | |||||
| bool isParameterOutputOrTrigger(const uint32_t index) const noexcept | |||||
| { | |||||
| const uint32_t hints = getParameterHints(index); | |||||
| if (hints & kParameterIsOutput) | |||||
| return true; | |||||
| if ((hints & kParameterIsTrigger) == kParameterIsTrigger) | |||||
| return true; | |||||
| return false; | |||||
| } | } | ||||
| const String& getParameterName(const uint32_t index) const noexcept | const String& getParameterName(const uint32_t index) const noexcept | ||||
| @@ -348,6 +389,13 @@ public: | |||||
| return fData->parameters[index].unit; | return fData->parameters[index].unit; | ||||
| } | } | ||||
| const ParameterEnumerationValues& getParameterEnumValues(const uint32_t index) const noexcept | |||||
| { | |||||
| DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackEnumValues); | |||||
| return fData->parameters[index].enumValues; | |||||
| } | |||||
| const ParameterRanges& getParameterRanges(const uint32_t index) const noexcept | const ParameterRanges& getParameterRanges(const uint32_t index) const noexcept | ||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackRanges); | DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackRanges); | ||||
| @@ -503,7 +551,7 @@ public: | |||||
| } | } | ||||
| } | } | ||||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||||
| #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||||
| void run(const float** const inputs, float** const outputs, const uint32_t frames, | void run(const float** const inputs, float** const outputs, const uint32_t frames, | ||||
| const MidiEvent* const midiEvents, const uint32_t midiEventCount) | const MidiEvent* const midiEvents, const uint32_t midiEventCount) | ||||
| { | { | ||||
| @@ -601,9 +649,10 @@ private: | |||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| // Static fallback data, see DistrhoPlugin.cpp | // Static fallback data, see DistrhoPlugin.cpp | ||||
| static const String sFallbackString; | |||||
| static const AudioPort sFallbackAudioPort; | |||||
| static const ParameterRanges sFallbackRanges; | |||||
| static const String sFallbackString; | |||||
| static const AudioPort sFallbackAudioPort; | |||||
| static const ParameterRanges sFallbackRanges; | |||||
| static const ParameterEnumerationValues sFallbackEnumValues; | |||||
| DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginExporter) | DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginExporter) | ||||
| DISTRHO_PREVENT_HEAP_ALLOCATION | DISTRHO_PREVENT_HEAP_ALLOCATION | ||||
| @@ -82,7 +82,7 @@ void UI::setState(const char* key, const char* value) | |||||
| } | } | ||||
| #endif | #endif | ||||
| #if DISTRHO_PLUGIN_IS_SYNTH | |||||
| #if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||||
| void UI::sendNote(uint8_t channel, uint8_t note, uint8_t velocity) | void UI::sendNote(uint8_t channel, uint8_t note, uint8_t velocity) | ||||
| { | { | ||||
| pData->sendNoteCallback(channel, note, velocity); | pData->sendNoteCallback(channel, note, velocity); | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * DISTRHO Plugin Framework (DPF) | * DISTRHO Plugin Framework (DPF) | ||||
| * Copyright (C) 2012-2016 Filipe Coelho <falktx@falktx.com> | |||||
| * Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com> | |||||
| * | * | ||||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | * 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 | * or without fee is hereby granted, provided that the above copyright notice and this | ||||
| @@ -61,12 +61,12 @@ struct UI::PrivateData { | |||||
| #endif | #endif | ||||
| // Callbacks | // Callbacks | ||||
| void* callbacksPtr; | |||||
| editParamFunc editParamCallbackFunc; | editParamFunc editParamCallbackFunc; | ||||
| setParamFunc setParamCallbackFunc; | setParamFunc setParamCallbackFunc; | ||||
| setStateFunc setStateCallbackFunc; | setStateFunc setStateCallbackFunc; | ||||
| sendNoteFunc sendNoteCallbackFunc; | sendNoteFunc sendNoteCallbackFunc; | ||||
| setSizeFunc setSizeCallbackFunc; | setSizeFunc setSizeCallbackFunc; | ||||
| void* ptr; | |||||
| PrivateData() noexcept | PrivateData() noexcept | ||||
| : sampleRate(d_lastUiSampleRate), | : sampleRate(d_lastUiSampleRate), | ||||
| @@ -74,12 +74,12 @@ struct UI::PrivateData { | |||||
| #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS | ||||
| dspPtr(d_lastUiDspPtr), | dspPtr(d_lastUiDspPtr), | ||||
| #endif | #endif | ||||
| callbacksPtr(nullptr), | |||||
| editParamCallbackFunc(nullptr), | editParamCallbackFunc(nullptr), | ||||
| setParamCallbackFunc(nullptr), | setParamCallbackFunc(nullptr), | ||||
| setStateCallbackFunc(nullptr), | setStateCallbackFunc(nullptr), | ||||
| sendNoteCallbackFunc(nullptr), | sendNoteCallbackFunc(nullptr), | ||||
| setSizeCallbackFunc(nullptr), | |||||
| ptr(nullptr) | |||||
| setSizeCallbackFunc(nullptr) | |||||
| { | { | ||||
| DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate)); | DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate)); | ||||
| @@ -103,31 +103,31 @@ struct UI::PrivateData { | |||||
| void editParamCallback(const uint32_t rindex, const bool started) | void editParamCallback(const uint32_t rindex, const bool started) | ||||
| { | { | ||||
| if (editParamCallbackFunc != nullptr) | if (editParamCallbackFunc != nullptr) | ||||
| editParamCallbackFunc(ptr, rindex, started); | |||||
| editParamCallbackFunc(callbacksPtr, rindex, started); | |||||
| } | } | ||||
| void setParamCallback(const uint32_t rindex, const float value) | void setParamCallback(const uint32_t rindex, const float value) | ||||
| { | { | ||||
| if (setParamCallbackFunc != nullptr) | if (setParamCallbackFunc != nullptr) | ||||
| setParamCallbackFunc(ptr, rindex, value); | |||||
| setParamCallbackFunc(callbacksPtr, rindex, value); | |||||
| } | } | ||||
| void setStateCallback(const char* const key, const char* const value) | void setStateCallback(const char* const key, const char* const value) | ||||
| { | { | ||||
| if (setStateCallbackFunc != nullptr) | if (setStateCallbackFunc != nullptr) | ||||
| setStateCallbackFunc(ptr, key, value); | |||||
| setStateCallbackFunc(callbacksPtr, key, value); | |||||
| } | } | ||||
| void sendNoteCallback(const uint8_t channel, const uint8_t note, const uint8_t velocity) | void sendNoteCallback(const uint8_t channel, const uint8_t note, const uint8_t velocity) | ||||
| { | { | ||||
| if (sendNoteCallbackFunc != nullptr) | if (sendNoteCallbackFunc != nullptr) | ||||
| sendNoteCallbackFunc(ptr, channel, note, velocity); | |||||
| sendNoteCallbackFunc(callbacksPtr, channel, note, velocity); | |||||
| } | } | ||||
| void setSizeCallback(const uint width, const uint height) | void setSizeCallback(const uint width, const uint height) | ||||
| { | { | ||||
| if (setSizeCallbackFunc != nullptr) | if (setSizeCallbackFunc != nullptr) | ||||
| setSizeCallbackFunc(ptr, width, height); | |||||
| setSizeCallbackFunc(callbacksPtr, width, height); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -221,8 +221,13 @@ UI* createUiWrapper(void* const dspPtr, const uintptr_t winId, const char* const | |||||
| class UIExporter | class UIExporter | ||||
| { | { | ||||
| public: | public: | ||||
| UIExporter(void* const ptr, const intptr_t winId, | |||||
| const editParamFunc editParamCall, const setParamFunc setParamCall, const setStateFunc setStateCall, const sendNoteFunc sendNoteCall, const setSizeFunc setSizeCall, | |||||
| UIExporter(void* const callbacksPtr, | |||||
| const intptr_t winId, | |||||
| const editParamFunc editParamCall, | |||||
| const setParamFunc setParamCall, | |||||
| const setStateFunc setStateCall, | |||||
| const sendNoteFunc sendNoteCall, | |||||
| const setSizeFunc setSizeCall, | |||||
| void* const dspPtr = nullptr, | void* const dspPtr = nullptr, | ||||
| const char* const bundlePath = nullptr) | const char* const bundlePath = nullptr) | ||||
| #ifdef HAVE_DGL | #ifdef HAVE_DGL | ||||
| @@ -238,7 +243,7 @@ public: | |||||
| DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); | ||||
| DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); | DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); | ||||
| fData->ptr = ptr; | |||||
| fData->callbacksPtr = callbacksPtr; | |||||
| fData->editParamCallbackFunc = editParamCall; | fData->editParamCallbackFunc = editParamCall; | ||||
| fData->setParamCallbackFunc = setParamCall; | fData->setParamCallbackFunc = setParamCall; | ||||
| fData->setStateCallbackFunc = setStateCall; | fData->setStateCallbackFunc = setStateCall; | ||||