Browse Source

Preliminar "parameter value change request" support

Signed-off-by: falkTX <falktx@falktx.com>
pull/277/head
falkTX 4 years ago
parent
commit
d5d3fdf53f
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
14 changed files with 270 additions and 49 deletions
  1. +21
    -13
      distrho/DistrhoInfo.hpp
  2. +17
    -1
      distrho/DistrhoPlugin.hpp
  3. +13
    -1
      distrho/src/DistrhoPlugin.cpp
  4. +22
    -2
      distrho/src/DistrhoPluginCarla.cpp
  5. +4
    -0
      distrho/src/DistrhoPluginChecks.h
  6. +19
    -3
      distrho/src/DistrhoPluginInternal.hpp
  7. +32
    -14
      distrho/src/DistrhoPluginJack.cpp
  8. +6
    -3
      distrho/src/DistrhoPluginLADSPA+DSSI.cpp
  9. +28
    -4
      distrho/src/DistrhoPluginLV2.cpp
  10. +1
    -1
      distrho/src/DistrhoPluginLV2export.cpp
  11. +19
    -3
      distrho/src/DistrhoPluginVST.cpp
  12. +2
    -2
      distrho/src/DistrhoUIDSSI.cpp
  13. +2
    -2
      distrho/src/DistrhoUILV2.cpp
  14. +84
    -0
      distrho/src/lv2/control-input-port-change-request.h

+ 21
- 13
distrho/DistrhoInfo.hpp View File

@@ -488,20 +488,20 @@ START_NAMESPACE_DISTRHO
#define DISTRHO_PLUGIN_URI "urn:distrho:name"

/**
Wherever the plugin has a custom %UI.
Whether the plugin has a custom %UI.
@see DISTRHO_UI_USE_NANOVG
@see UI
*/
#define DISTRHO_PLUGIN_HAS_UI 1

/**
Wherever the plugin processing is realtime-safe.@n
Whether the plugin processing is realtime-safe.@n
TODO - list rtsafe requirements
*/
#define DISTRHO_PLUGIN_IS_RT_SAFE 1

/**
Wherever the plugin is a synth.@n
Whether the plugin is a synth.@n
@ref DISTRHO_PLUGIN_WANT_MIDI_INPUT is automatically enabled when this is too.
@see DISTRHO_PLUGIN_WANT_MIDI_INPUT
*/
@@ -516,39 +516,47 @@ START_NAMESPACE_DISTRHO
#define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0

/**
Wherever the plugin introduces latency during audio or midi processing.
Whether the plugin introduces latency during audio or midi processing.
@see Plugin::setLatency(uint32_t)
*/
#define DISTRHO_PLUGIN_WANT_LATENCY 1

/**
Wherever the plugin wants MIDI input.@n
Whether the plugin wants MIDI input.@n
This is automatically enabled if @ref DISTRHO_PLUGIN_IS_SYNTH is true.
*/
#define DISTRHO_PLUGIN_WANT_MIDI_INPUT 1

/**
Wherever the plugin wants MIDI output.
Whether the plugin wants MIDI output.
@see Plugin::writeMidiEvent(const MidiEvent&)
*/
#define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 1

/**
Wherever the plugin provides its own internal programs.
Whether the plugin wants to change its own parameter inputs.@n
Not all hosts or plugin formats support this,
so Plugin::canRequestParameterValueChanges() can be used to query support at runtime.
@see Plugin::requestParameterValueChange(uint32_t, float)
*/
#define DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST 1

/**
Whether the plugin provides its own internal programs.
@see Plugin::initProgramName(uint32_t, String&)
@see Plugin::loadProgram(uint32_t)
*/
#define DISTRHO_PLUGIN_WANT_PROGRAMS 1

/**
Wherever the plugin uses internal non-parameter data.
Whether the plugin uses internal non-parameter data.
@see Plugin::initState(uint32_t, String&, String&)
@see Plugin::setState(const char*, const char*)
*/
#define DISTRHO_PLUGIN_WANT_STATE 1

/**
Wherever the plugin implements the full state API.
Whether the plugin implements the full state API.
When this macro is enabled, the plugin must implement a new getState(const char* key) function, which the host calls when saving its session/project.
This is useful for plugins that have custom internal values not exposed to the host as key-value state pairs or parameters.
Most simple effects and synths will not need this.
@@ -558,13 +566,13 @@ START_NAMESPACE_DISTRHO
#define DISTRHO_PLUGIN_WANT_FULL_STATE 1

/**
Wherever the plugin wants time position information from the host.
Whether the plugin wants time position information from the host.
@see Plugin::getTimePosition()
*/
#define DISTRHO_PLUGIN_WANT_TIMEPOS 1

/**
Wherever the %UI uses a custom toolkit implementation based on OpenGL.@n
Whether the %UI uses a custom toolkit implementation based on OpenGL.@n
When enabled, the macros @ref DISTRHO_UI_CUSTOM_INCLUDE_PATH and @ref DISTRHO_UI_CUSTOM_WIDGET_TYPE are required.
*/
#define DISTRHO_UI_USE_CUSTOM 1
@@ -586,13 +594,13 @@ START_NAMESPACE_DISTRHO
#define DISTRHO_UI_CUSTOM_WIDGET_TYPE

/**
Wherever the %UI uses NanoVG for drawing instead of the default raw OpenGL calls.@n
Whether the %UI uses NanoVG for drawing instead of the default raw OpenGL calls.@n
When enabled your %UI instance will subclass @ref NanoWidget instead of @ref Widget.
*/
#define DISTRHO_UI_USE_NANOVG 1

/**
Wherever the %UI is resizable to any size by the user.@n
Whether the %UI is resizable to any size by the user.@n
By default this is false, and resizing is only allowed under the plugin UI control,@n
Enabling this options makes it possible for the user to resize the plugin UI at anytime.
@see UI::setGeometryConstraints(uint, uint, bool, bool)


+ 17
- 1
distrho/DistrhoPlugin.hpp View File

@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2021 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
@@ -746,6 +746,22 @@ public:
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.
*/
bool canRequestParameterValueChanges() const noexcept;

/**
Request a parameter value change from the host.
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

protected:
/* --------------------------------------------------------------------------------------------------------
* Information */


+ 13
- 1
distrho/src/DistrhoPlugin.cpp View File

@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2021 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
@@ -109,6 +109,18 @@ bool Plugin::writeMidiEvent(const MidiEvent& midiEvent) noexcept
}
#endif

#if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
bool Plugin::canRequestParameterValueChanges() const noexcept
{
return pData->requestParameterValueChangeCallbackFunc != nullptr;
}

bool Plugin::requestParameterValueChange(const uint32_t index, const float value) noexcept
{
return pData->requestParameterValueChangeCallback(index, value);
}
#endif

/* ------------------------------------------------------------------------------------------------------------
* Init */



+ 22
- 2
distrho/src/DistrhoPluginCarla.cpp View File

@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2021 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
@@ -22,6 +22,10 @@

#include "CarlaNative.hpp"

// TODO
#undef DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
#define DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST 0

// -----------------------------------------------------------------------

START_NAMESPACE_DISTRHO
@@ -29,6 +33,9 @@ START_NAMESPACE_DISTRHO
#if ! DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
static const writeMidiFunc writeMidiCallback = nullptr;
#endif
#if ! DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
static const requestParameterValueChangeFunc requestParameterValueChangeCallback = nullptr;
#endif

#if DISTRHO_PLUGIN_HAS_UI
// -----------------------------------------------------------------------
@@ -184,7 +191,7 @@ class PluginCarla : public NativePluginClass
public:
PluginCarla(const NativeHostDescriptor* const host)
: NativePluginClass(host),
fPlugin(this, writeMidiCallback),
fPlugin(this, writeMidiCallback, requestParameterValueChangeCallback),
fScalePointsCache(nullptr)
{
#if DISTRHO_PLUGIN_HAS_UI
@@ -512,6 +519,19 @@ private:
}
#endif

#if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
bool requestParameterValueChange(const uint32_t index, const float value)
{
// TODO implementation
return false;
}

static bool requestParameterValueChangeCallback(void* ptr, const uint32_t index, const float value)
{
return thisPtr->requestParameterValueChange(index, value);
}
#endif

CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginCarla)

// -------------------------------------------------------------------


+ 4
- 0
distrho/src/DistrhoPluginChecks.h View File

@@ -69,6 +69,10 @@
# define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 0
#endif

#ifndef DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
# define DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST 0
#endif

#ifndef DISTRHO_PLUGIN_WANT_PROGRAMS
# define DISTRHO_PLUGIN_WANT_PROGRAMS 0
#endif


+ 19
- 3
distrho/src/DistrhoPluginInternal.hpp View File

@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2021 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
@@ -36,6 +36,7 @@ extern double d_lastSampleRate;
// DSP callbacks

typedef bool (*writeMidiFunc) (void* ptr, const MidiEvent& midiEvent);
typedef bool (*requestParameterValueChangeFunc) (void* ptr, uint32_t index, float value);

// -----------------------------------------------------------------------
// Plugin private data
@@ -73,6 +74,7 @@ struct Plugin::PrivateData {
// Callbacks
void* callbacksPtr;
writeMidiFunc writeMidiCallbackFunc;
requestParameterValueChangeFunc requestParameterValueChangeCallbackFunc;

uint32_t bufferSize;
double sampleRate;
@@ -99,6 +101,7 @@ struct Plugin::PrivateData {
#endif
callbacksPtr(nullptr),
writeMidiCallbackFunc(nullptr),
requestParameterValueChangeCallbackFunc(nullptr),
bufferSize(d_lastBufferSize),
sampleRate(d_lastSampleRate)
{
@@ -170,6 +173,16 @@ struct Plugin::PrivateData {
return false;
}
#endif

#if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
bool requestParameterValueChangeCallback(const uint32_t index, const float value)
{
if (requestParameterValueChangeCallbackFunc != nullptr)
return requestParameterValueChangeCallbackFunc(callbacksPtr, index, value);

return false;
}
#endif
};

// -----------------------------------------------------------------------
@@ -178,7 +191,9 @@ struct Plugin::PrivateData {
class PluginExporter
{
public:
PluginExporter(void* const callbacksPtr, const writeMidiFunc writeMidiCall)
PluginExporter(void* const callbacksPtr,
const writeMidiFunc writeMidiCall,
const requestParameterValueChangeFunc requestParameterValueChangeCall)
: fPlugin(createPlugin()),
fData((fPlugin != nullptr) ? fPlugin->pData : nullptr),
fIsActive(false)
@@ -213,8 +228,9 @@ public:
fPlugin->initState(i, fData->stateKeys[i], fData->stateDefValues[i]);
#endif

fData->callbacksPtr = callbacksPtr;
fData->callbacksPtr = callbacksPtr;
fData->writeMidiCallbackFunc = writeMidiCall;
fData->requestParameterValueChangeCallbackFunc = requestParameterValueChangeCall;
}

~PluginExporter()


+ 32
- 14
distrho/src/DistrhoPluginJack.cpp View File

@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2021 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
@@ -31,6 +31,10 @@
# include <signal.h>
#endif

// TODO
#undef DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
#define DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST 0

// -----------------------------------------------------------------------

START_NAMESPACE_DISTRHO
@@ -41,6 +45,9 @@ static const setStateFunc setStateCallback = nullptr;
#if ! DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
static const writeMidiFunc writeMidiCallback = nullptr;
#endif
#if ! DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
static const requestParameterValueChangeFunc requestParameterValueChangeCallback = nullptr;
#endif

// -----------------------------------------------------------------------

@@ -90,7 +97,7 @@ class PluginJack
{
public:
PluginJack(jack_client_t* const client)
: fPlugin(this, writeMidiCallback),
: fPlugin(this, writeMidiCallback, requestParameterValueChangeCallback),
#if DISTRHO_PLUGIN_HAS_UI
fUI(this, 0,
nullptr, // edit param
@@ -472,18 +479,6 @@ protected:
}
#endif

#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
bool writeMidi(const MidiEvent& midiEvent)
{
DISTRHO_SAFE_ASSERT_RETURN(fPortMidiOutBuffer != nullptr, false);

return jack_midi_event_write(fPortMidiOutBuffer,
midiEvent.frame,
midiEvent.size > MidiEvent::kDataSize ? midiEvent.dataExt : midiEvent.data,
midiEvent.size) == 0;
}
#endif

// NOTE: no trigger support for JACK, simulate it here
void updateParameterTriggers()
{
@@ -584,7 +579,30 @@ private:
}
#endif

#if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
bool requestParameterValueChange(const uint32_t index, const float value)
{
// TODO implementation
return false;
}

static bool requestParameterValueChangeCallback(void* ptr, const uint32_t index, const float value)
{
return thisPtr->requestParameterValueChange(index, value);
}
#endif

#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
bool writeMidi(const MidiEvent& midiEvent)
{
DISTRHO_SAFE_ASSERT_RETURN(fPortMidiOutBuffer != nullptr, false);

return jack_midi_event_write(fPortMidiOutBuffer,
midiEvent.frame,
midiEvent.size > MidiEvent::kDataSize ? midiEvent.dataExt : midiEvent.data,
midiEvent.size) == 0;
}

static bool writeMidiCallback(void* ptr, const MidiEvent& midiEvent)
{
return thisPtr->writeMidi(midiEvent);


+ 6
- 3
distrho/src/DistrhoPluginLADSPA+DSSI.cpp View File

@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2021 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
@@ -16,6 +16,9 @@

#include "DistrhoPluginInternal.hpp"

#if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
# error Cannot use parameter value change request with LADSPA or DSSI
#endif
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
# error Cannot use MIDI Output with LADSPA or DSSI
#endif
@@ -47,7 +50,7 @@ class PluginLadspaDssi
{
public:
PluginLadspaDssi()
: fPlugin(nullptr, nullptr),
: fPlugin(nullptr, nullptr, nullptr),
fPortControls(nullptr),
fLastControlValues(nullptr)
{
@@ -550,7 +553,7 @@ static const struct DescriptorInitializer
// Create dummy plugin to get data from
d_lastBufferSize = 512;
d_lastSampleRate = 44100.0;
const PluginExporter plugin(nullptr, nullptr);
const PluginExporter plugin(nullptr, nullptr, nullptr);
d_lastBufferSize = 0;
d_lastSampleRate = 0.0;



+ 28
- 4
distrho/src/DistrhoPluginLV2.cpp View File

@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2021 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
@@ -31,6 +31,7 @@
#include "lv2/worker.h"
#include "lv2/lv2_kxstudio_properties.h"
#include "lv2/lv2_programs.h"
#include "lv2/control-input-port-change-request.h"

#ifdef DISTRHO_PLUGIN_LICENSED_FOR_MOD
# include "libmodla.h"
@@ -61,6 +62,9 @@ typedef std::map<const LV2_URID, String> UridToStringMap;
#if ! DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
static const writeMidiFunc writeMidiCallback = nullptr;
#endif
#if ! DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
static const requestParameterValueChangeFunc requestParameterValueChangeCallback = nullptr;
#endif

// -----------------------------------------------------------------------

@@ -70,8 +74,9 @@ public:
PluginLv2(const double sampleRate,
const LV2_URID_Map* const uridMap,
const LV2_Worker_Schedule* const worker,
const LV2_ControlInputPort_Change_Request* const ctrlInPortChangeReq,
const bool usingNominal)
: fPlugin(this, writeMidiCallback),
: fPlugin(this, writeMidiCallback, requestParameterValueChangeCallback),
fUsingNominal(usingNominal),
#ifdef DISTRHO_PLUGIN_LICENSED_FOR_MOD
fRunCount(0),
@@ -81,7 +86,8 @@ public:
fSampleRate(sampleRate),
fURIDs(uridMap),
fUridMap(uridMap),
fWorker(worker)
fWorker(worker),
fCtrlInPortChangeReq(ctrlInPortChangeReq)
{
#if DISTRHO_PLUGIN_NUM_INPUTS > 0
for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i)
@@ -1174,6 +1180,7 @@ private:
// LV2 features
const LV2_URID_Map* const fUridMap;
const LV2_Worker_Schedule* const fWorker;
const LV2_ControlInputPort_Change_Request* const fCtrlInPortChangeReq;

#if DISTRHO_PLUGIN_WANT_STATE
StringToStringMap fStateMap;
@@ -1231,6 +1238,20 @@ private:
#endif
}

#if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
bool requestParameterValueChange(const uint32_t index, const float value)
{
if (fCtrlInPortChangeReq == nullptr)
return false;
return fCtrlInPortChangeReq->request_change(fCtrlInPortChangeReq->handle, index, value);
}

static bool requestParameterValueChangeCallback(void* const ptr, const uint32_t index, const float value)
{
return (((PluginLv2*)ptr)->requestParameterValueChange(index, value) == 0);
}
#endif

#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
bool writeMidi(const MidiEvent& midiEvent)
{
@@ -1271,6 +1292,7 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons
const LV2_Options_Option* options = nullptr;
const LV2_URID_Map* uridMap = nullptr;
const LV2_Worker_Schedule* worker = nullptr;
const LV2_ControlInputPort_Change_Request* ctrlInPortChangeReq = nullptr;

for (int i=0; features[i] != nullptr; ++i)
{
@@ -1280,6 +1302,8 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons
uridMap = (const LV2_URID_Map*)features[i]->data;
else if (std::strcmp(features[i]->URI, LV2_WORKER__schedule) == 0)
worker = (const LV2_Worker_Schedule*)features[i]->data;
else if (std::strcmp(features[i]->URI, LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_URI) == 0)
ctrlInPortChangeReq = (const LV2_ControlInputPort_Change_Request*)features[i]->data;
}

if (options == nullptr)
@@ -1344,7 +1368,7 @@ static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, cons

d_lastSampleRate = sampleRate;

return new PluginLv2(sampleRate, uridMap, worker, usingNominal);
return new PluginLv2(sampleRate, uridMap, worker, ctrlInPortChangeReq, usingNominal);
}

#define instancePtr ((PluginLv2*)instance)


+ 1
- 1
distrho/src/DistrhoPluginLV2export.cpp View File

@@ -226,7 +226,7 @@ void lv2_generate_ttl(const char* const basename)
// Dummy plugin to get data from
d_lastBufferSize = 512;
d_lastSampleRate = 44100.0;
PluginExporter plugin(nullptr, nullptr);
PluginExporter plugin(nullptr, nullptr, nullptr);
d_lastBufferSize = 0;
d_lastSampleRate = 0.0;



+ 19
- 3
distrho/src/DistrhoPluginVST.cpp View File

@@ -25,7 +25,7 @@
#if DISTRHO_PLUGIN_HAS_UI
# undef DISTRHO_UI_USER_RESIZABLE
# define DISTRHO_UI_USER_RESIZABLE 0
# define DISTRHO_UI_IS_STANDALONE 0
# define DISTRHO_UI_IS_STANDALONE false
# include "DistrhoUIInternal.hpp"
#endif

@@ -73,6 +73,9 @@ static const int kVstMidiEventSize = static_cast<int>(sizeof(VstMidiEvent));
#if ! DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
static const writeMidiFunc writeMidiCallback = nullptr;
#endif
#if ! DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
static const requestParameterValueChangeFunc requestParameterValueChangeCallback = nullptr;
#endif

// -----------------------------------------------------------------------

@@ -429,7 +432,7 @@ class PluginVst : public ParameterCheckHelper
{
public:
PluginVst(const audioMasterCallback audioMaster, AEffect* const effect)
: fPlugin(this, writeMidiCallback),
: fPlugin(this, writeMidiCallback, requestParameterValueChangeCallback),
fAudioMaster(audioMaster),
fEffect(effect)
{
@@ -1184,6 +1187,19 @@ private:
}
#endif

#if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
bool requestParameterValueChange(const uint32_t index, const float value)
{
hostCallback(audioMasterAutomate, index, 0, nullptr, value);
return true;
}

static bool requestParameterValueChangeCallback(void* const ptr, const uint32_t index, const float value)
{
return ((PluginVst*)ptr)->requestParameterValueChange(index, value);
}
#endif

#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
bool writeMidi(const MidiEvent& midiEvent)
{
@@ -1273,7 +1289,7 @@ static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t
}

// Create dummy plugin to get data from
static PluginExporter plugin(nullptr, nullptr);
static PluginExporter plugin(nullptr, nullptr, nullptr);

if (doInternalInit)
{


+ 2
- 2
distrho/src/DistrhoUIDSSI.cpp View File

@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2016 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2021 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
@@ -14,7 +14,7 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

#define DISTRHO_UI_IS_STANDALONE 1
#define DISTRHO_UI_IS_STANDALONE true
#include "DistrhoUIInternal.hpp"

#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS


+ 2
- 2
distrho/src/DistrhoUILV2.cpp View File

@@ -1,6 +1,6 @@
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com>
* Copyright (C) 2012-2021 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
@@ -14,7 +14,7 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

#define DISTRHO_UI_IS_STANDALONE 0
#define DISTRHO_UI_IS_STANDALONE false
#include "DistrhoUIInternal.hpp"

#include "../extra/String.hpp"


+ 84
- 0
distrho/src/lv2/control-input-port-change-request.h View File

@@ -0,0 +1,84 @@
/*
LV2 ControlInputPort change request extension
Copyright 2020 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.

THIS 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.
*/

/**
@file control-input-port-change-request.h
C header for the LV2 ControlInputPort change request extension <http://kx.studio/ns/lv2ext/control-input-port-change-request>.
*/

#ifndef LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_H
#define LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_H

#include "lv2/lv2plug.in/ns/lv2core/lv2.h"

#define LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_URI "http://kx.studio/ns/lv2ext/control-input-port-change-request"
#define LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_PREFIX LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_URI "#"

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#else
#include <stdbool.h>
#endif

/** A status code for LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_URI functions. */
typedef enum {
LV2_CONTROL_INPUT_PORT_CHANGE_SUCCESS = 0, /**< Completed successfully. */
LV2_CONTROL_INPUT_PORT_CHANGE_ERR_UNKNOWN = 1, /**< Unknown error. */
LV2_CONTROL_INPUT_PORT_CHANGE_ERR_INVALID_INDEX = 2 /**< Failed due to invalid port index. */
} LV2_ControlInputPort_Change_Status;

/**
* Opaque handle for LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_URI feature.
*/
typedef void* LV2_ControlInputPort_Change_Request_Handle;

/**
* On instantiation, host must supply LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_URI feature.
* LV2_Feature::data must be pointer to LV2_ControlInputPort_Change_Request.
*/
typedef struct _LV2_ControlInputPort_Change_Request {
/**
* Opaque host data.
*/
LV2_ControlInputPort_Change_Request_Handle handle;

/**
* request_change()
*
* Ask the host to change a plugin's control input port value.
* Parameter handle MUST be the 'handle' member of this struct.
* Parameter index is port index to change.
* Parameter value is the requested value to change the control port input to.
*
* Returns status of the request.
* The host may decline this request, if e.g. it is currently automating this port.
*
* The plugin MUST call this function during run().
*/
LV2_ControlInputPort_Change_Status (*request_change)(LV2_ControlInputPort_Change_Request_Handle handle,
uint32_t index,
float value);

} LV2_ControlInputPort_Change_Request;

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* LV2_CONTROL_INPUT_PORT_CHANGE_REQUEST_H */

Loading…
Cancel
Save