Browse Source

VST3: Rework headers coding style, add C++ util, cleanup

Signed-off-by: falkTX <falktx@falktx.com>
pull/330/head
falkTX 3 years ago
parent
commit
4edb06e60e
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
10 changed files with 246 additions and 424 deletions
  1. +25
    -34
      distrho/src/DistrhoPluginVST3.cpp
  2. +31
    -110
      distrho/src/DistrhoUIVST3.cpp
  3. +62
    -91
      distrho/src/travesty/audio_processor.h
  4. +26
    -13
      distrho/src/travesty/base.h
  5. +5
    -9
      distrho/src/travesty/bstream.h
  6. +33
    -40
      distrho/src/travesty/component.h
  7. +20
    -46
      distrho/src/travesty/edit_controller.h
  8. +6
    -22
      distrho/src/travesty/events.h
  9. +10
    -22
      distrho/src/travesty/factory.h
  10. +28
    -37
      distrho/src/travesty/view.h

+ 25
- 34
distrho/src/DistrhoPluginVST3.cpp View File

@@ -25,18 +25,25 @@
#include <atomic>
#include <vector>

// TESTING awful idea dont reuse
#include "../extra/Thread.hpp"
/* TODO items:
* - base component refcount handling
* - program support
* - state support
* - midi cc parameter mapping
* - full MIDI1 encode and decode
* - call component handler restart with params-changed flag when setting program
* - call component handler restart with latency-changed flag when latency changes
*/

START_NAMESPACE_DISTRHO

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

#if ! DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
static const writeMidiFunc writeMidiCallback = nullptr;
static constexpr const writeMidiFunc writeMidiCallback = nullptr;
#endif
#if ! DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST
static const requestParameterValueChangeFunc requestParameterValueChangeCallback = nullptr;
static constexpr const requestParameterValueChangeFunc requestParameterValueChangeCallback = nullptr;
#endif

// --------------------------------------------------------------------------------------------------------------------
@@ -67,7 +74,7 @@ static dpf_tuid dpf_tuid_view = { dpf_id_entry, dpf_id_view, 0, 0 };
// --------------------------------------------------------------------------------------------------------------------
// Utility functions

static const char* tuid2str(const v3_tuid iid)
const char* tuid2str(const v3_tuid iid)
{
if (v3_tuid_match(iid, v3_funknown_iid))
return "{v3_funknown}";
@@ -220,7 +227,6 @@ public:
PluginVst3()
: fPlugin(this, writeMidiCallback, requestParameterValueChangeCallback),
fComponentHandler(nullptr),
fComponentHandlerArg(nullptr),
fParameterValues(nullptr)
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
, fHostEventOutputHandle(nullptr)
@@ -1136,10 +1142,9 @@ public:
return V3_OK;
}

v3_result setComponentHandler(v3_component_handler* const handler, void* const arg) noexcept
v3_result setComponentHandler(v3_component_handler** const handler) noexcept
{
fComponentHandler = handler;
fComponentHandlerArg = arg;
return V3_OK;
}

@@ -1150,8 +1155,7 @@ private:
PluginExporter fPlugin;

// VST3 stuff
v3_component_handler* fComponentHandler;
void* fComponentHandlerArg;
v3_component_handler** fComponentHandler;

// Temporary data
float* fParameterValues;
@@ -1209,15 +1213,14 @@ private:
bool requestParameterValueChange(const uint32_t index, const float value)
{
DISTRHO_SAFE_ASSERT_RETURN(fComponentHandler != nullptr, false);
DISTRHO_SAFE_ASSERT_RETURN(fComponentHandlerArg != nullptr, false);

if (fComponentHandler->begin_edit(fComponentHandlerArg, index) != V3_OK)
if (v3_cpp_obj(fComponentHandler)->begin_edit(fComponentHandler, index) != V3_OK)
return false;

const double normalized = fPlugin.getParameterRanges(index).getNormalizedValue(value);
const bool ret = fComponentHandler->perform_edit(fComponentHandlerArg, index, normalized) == V3_OK;
const bool ret = v3_cpp_obj(fComponentHandler)->perform_edit(fComponentHandler, index, normalized) == V3_OK;

fComponentHandler->end_edit(fComponentHandlerArg, index);
v3_cpp_obj(fComponentHandler)->end_edit(fComponentHandler, index);
return ret;
}

@@ -1308,10 +1311,13 @@ struct v3_edit_controller_cpp : v3_funknown {
struct dpf_edit_controller : v3_edit_controller_cpp {
ScopedPointer<PluginVst3>& vst3;
bool initialized;
// cached values
v3_component_handler** handler;

dpf_edit_controller(ScopedPointer<PluginVst3>& v)
: vst3(v),
initialized(false)
initialized(false),
handler(nullptr)
{
static const uint8_t* kSupportedInterfaces[] = {
v3_funknown_iid,
@@ -1547,27 +1553,12 @@ struct dpf_edit_controller : v3_edit_controller_cpp {
dpf_edit_controller* const controller = *(dpf_edit_controller**)self;
DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALISED);

PluginVst3* const vst3 = controller->vst3;
DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALISED);
controller->handler = handler;

// v3_component_handler_cpp** const cpphandler = (v3_component_handler_cpp**)handler;
//
// controller->handler = cpphandler;
//
// if (controller->view != nullptr)
// {
// controller->view->handler = cpphandler;
//
// if (UIVst3* const uivst3 = controller->view->uivst3)
// uivst3->setHandler(cpphandler);
// }

// offset struct by sizeof(v3_funknown), because of differences between C and C++
v3_component_handler* const handlerptr
= handler != nullptr ? (v3_component_handler*)((uint8_t*)*(handler)+sizeof(v3_funknown))
: nullptr;
if (PluginVst3* const vst3 = controller->vst3)
return vst3->setComponentHandler(handler);

return vst3->setComponentHandler(handlerptr, handler);
return V3_NOT_INITIALISED;
};

controller.create_view = []V3_API(void* self, const char* name) -> v3_plugin_view**


+ 31
- 110
distrho/src/DistrhoUIVST3.cpp View File

@@ -21,16 +21,16 @@
// TESTING awful idea dont reuse
#include "../extra/Thread.hpp"

// #if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EMBED_UI
// # undef DISTRHO_PLUGIN_HAS_UI
// # define DISTRHO_PLUGIN_HAS_UI 0
// #endif
//
// #if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI
// # undef DISTRHO_PLUGIN_HAS_UI
// # define DISTRHO_PLUGIN_HAS_UI 0
// #endif
//
#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EMBED_UI
# undef DISTRHO_PLUGIN_HAS_UI
# define DISTRHO_PLUGIN_HAS_UI 0
#endif
#if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI
# undef DISTRHO_PLUGIN_HAS_UI
# define DISTRHO_PLUGIN_HAS_UI 0
#endif
// #undef DISTRHO_PLUGIN_HAS_UI
// #define DISTRHO_PLUGIN_HAS_UI 1

@@ -38,93 +38,33 @@
# include "DistrhoUIInternal.hpp"
// #endif

#include "travesty/audio_processor.h"
#include "travesty/component.h"
#include "travesty/edit_controller.h"
#include "travesty/factory.h"
#include "travesty/view.h"

// --------------------------------------------------------------------------------------------------------------------
/* TODO items:
* - see how to handle external non-embed UI build
* - program listener
* - state listener and sender
* - sample rate change listener
* - call component handler restart with params-changed flag when setting program
* - call component handler restart with latency-changed flag when latency changes
*/

START_NAMESPACE_DISTRHO

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

#if ! DISTRHO_PLUGIN_WANT_MIDI_INPUT
static const sendNoteFunc sendNoteCallback = nullptr;
static constexpr const sendNoteFunc sendNoteCallback = nullptr;
#endif
#if ! DISTRHO_PLUGIN_WANT_STATE
static const setStateFunc setStateCallback = nullptr;
static constexpr const setStateFunc setStateCallback = nullptr;
#endif

// --------------------------------------------------------------------------------------------------------------------
// custom v3_tuid compatible type
// Utility functions (defined on plugin side)

typedef uint32_t dpf_tuid[4];
static_assert(sizeof(v3_tuid) == sizeof(dpf_tuid), "uid size mismatch");

// --------------------------------------------------------------------------------------------------------------------
// Utility functions

const char* tuid2str(const v3_tuid iid)
{
if (v3_tuid_match(iid, v3_funknown_iid))
return "{v3_funknown}";
if (v3_tuid_match(iid, v3_plugin_base_iid))
return "{v3_plugin_base}";
if (v3_tuid_match(iid, v3_plugin_factory_iid))
return "{v3_plugin_factory}";
if (v3_tuid_match(iid, v3_plugin_factory_2_iid))
return "{v3_plugin_factory_2}";
if (v3_tuid_match(iid, v3_plugin_factory_3_iid))
return "{v3_plugin_factory_3}";
if (v3_tuid_match(iid, v3_component_iid))
return "{v3_component}";
if (v3_tuid_match(iid, v3_bstream_iid))
return "{v3_bstream}";
if (v3_tuid_match(iid, v3_event_list_iid))
return "{v3_event_list}";
if (v3_tuid_match(iid, v3_param_value_queue_iid))
return "{v3_param_value_queue}";
if (v3_tuid_match(iid, v3_param_changes_iid))
return "{v3_param_changes}";
if (v3_tuid_match(iid, v3_process_context_requirements_iid))
return "{v3_process_context_requirements}";
if (v3_tuid_match(iid, v3_audio_processor_iid))
return "{v3_audio_processor}";
if (v3_tuid_match(iid, v3_component_handler_iid))
return "{v3_component_handler}";
if (v3_tuid_match(iid, v3_edit_controller_iid))
return "{v3_edit_controller}";
if (v3_tuid_match(iid, v3_plugin_view_iid))
return "{v3_plugin_view}";
if (v3_tuid_match(iid, v3_plugin_frame_iid))
return "{v3_plugin_frame}";
if (v3_tuid_match(iid, v3_plugin_view_content_scale_steinberg_iid))
return "{v3_plugin_view_content_scale_steinberg}";
if (v3_tuid_match(iid, v3_plugin_view_parameter_finder_iid))
return "{v3_plugin_view_parameter_finder}";
/*
if (std::memcmp(iid, dpf_tuid_class, sizeof(dpf_tuid)) == 0)
return "{dpf_tuid_class}";
if (std::memcmp(iid, dpf_tuid_component, sizeof(dpf_tuid)) == 0)
return "{dpf_tuid_component}";
if (std::memcmp(iid, dpf_tuid_controller, sizeof(dpf_tuid)) == 0)
return "{dpf_tuid_controller}";
if (std::memcmp(iid, dpf_tuid_processor, sizeof(dpf_tuid)) == 0)
return "{dpf_tuid_processor}";
if (std::memcmp(iid, dpf_tuid_view, sizeof(dpf_tuid)) == 0)
return "{dpf_tuid_view}";
*/

static char buf[46];
std::snprintf(buf, sizeof(buf), "{0x%08X,0x%08X,0x%08X,0x%08X}",
(uint32_t)d_cconst(iid[ 0], iid[ 1], iid[ 2], iid[ 3]),
(uint32_t)d_cconst(iid[ 4], iid[ 5], iid[ 6], iid[ 7]),
(uint32_t)d_cconst(iid[ 8], iid[ 9], iid[10], iid[11]),
(uint32_t)d_cconst(iid[12], iid[13], iid[14], iid[15]));
return buf;
}
const char* tuid2str(const v3_tuid iid);

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

@@ -145,7 +85,6 @@ public:
scaleFactor),
fView(view),
fFrame(nullptr),
fFrameArg(nullptr),
fScaleFactor(scaleFactor)
{
// TESTING awful idea dont reuse
@@ -221,12 +160,9 @@ public:
#endif
}

v3_result setFrame(v3_plugin_frame* const frame, void* const arg) noexcept
v3_result setFrame(v3_plugin_frame** const frame) noexcept
{
d_stdout("setFrame %p %p", frame, arg);
fFrame = frame;
fFrameArg = arg;

return V3_OK;
}

@@ -257,8 +193,7 @@ private:

// VST3 stuff
v3_plugin_view** const fView;
v3_plugin_frame* fFrame;
void* fFrameArg;
v3_plugin_frame** fFrame;
// v3_component_handler_cpp** handler = nullptr;

// Temporary data
@@ -304,8 +239,7 @@ private:
{
DISTRHO_SAFE_ASSERT_RETURN(fView != nullptr,);
DISTRHO_SAFE_ASSERT_RETURN(fFrame != nullptr,);
DISTRHO_SAFE_ASSERT_RETURN(fFrameArg != nullptr,);
d_stdout("from UI setSize %u %u | %p %p %p", width, height, fView, fFrame, fFrameArg);
d_stdout("from UI setSize %u %u | %p %p", width, height, fView, fFrame);

#ifdef DISTRHO_OS_MAC
const double scaleFactor = fUI.getScaleFactor();
@@ -317,7 +251,7 @@ private:
std::memset(&rect, 0, sizeof(rect));
rect.right = width;
rect.bottom = height;
fFrame->resize_view(fFrameArg, fView, &rect);
v3_cpp_obj(fFrame)->resize_view(fFrame, fView, &rect);
}

static void setSizeCallback(void* ptr, uint width, uint height)
@@ -546,13 +480,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp {
const float scaleFactor = view->scale != nullptr ? view->scale->scaleFactor : 0.0f;
view->uivst3 = new UIVst3((uintptr_t)parent, scaleFactor, view->sampleRate,
view->instancePointer, (v3_plugin_view**)self);

// offset struct by sizeof(v3_funknown), because of differences between C and C++
v3_plugin_frame* const frameptr
= view->frame != nullptr ? (v3_plugin_frame*)((uint8_t*)*(view->frame)+sizeof(v3_funknown))
: nullptr;

view->uivst3->setFrame(frameptr, view->frame);
view->uivst3->setFrame(view->frame);
// view->uivst3->setHandler(view->handler);
return V3_OK;
}
@@ -613,11 +541,11 @@ struct dpf_plugin_view : v3_plugin_view_cpp {
dpf_plugin_view* const view = *(dpf_plugin_view**)self;
DISTRHO_SAFE_ASSERT_RETURN(view != nullptr, V3_NOT_INITIALISED);

// special case: allow UI to not be attached yet, as a way to get size before window creation

if (UIVst3* const uivst3 = view->uivst3)
return uivst3->getSize(rect);

// special case: allow UI to not be attached yet, as a way to get size before window creation

const float scaleFactor = view->scale != nullptr ? view->scale->scaleFactor : 0.0f;
UIExporter tmpUI(nullptr, 0, view->sampleRate,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
@@ -660,14 +588,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp {
view->frame = frame;

if (UIVst3* const uivst3 = view->uivst3)
{
// offset struct by sizeof(v3_funknown), because of differences between C and C++
v3_plugin_frame* const frameptr
= frame != nullptr ? (v3_plugin_frame*)((uint8_t*)*(frame)+sizeof(v3_funknown))
: nullptr;

return uivst3->setFrame(frameptr, frame);
}
return uivst3->setFrame(frame);

return V3_NOT_INITIALISED;
};
@@ -697,7 +618,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp {
};

// --------------------------------------------------------------------------------------------------------------------
// dpf_plugin_view_create (called from DSP side)
// dpf_plugin_view_create (called from plugin side)

v3_funknown** dpf_plugin_view_create(void* instancePointer, double sampleRate);



+ 62
- 91
distrho/src/travesty/audio_processor.h View File

@@ -28,8 +28,9 @@
typedef uint64_t v3_speaker_arrangement;

enum {
V3_SPEAKER_L = 1,
V3_SPEAKER_R = 1 << 1
V3_SPEAKER_L = 1 << 0,
V3_SPEAKER_R = 1 << 1,
V3_SPEAKER_M = 1 << 19
};

/**
@@ -42,14 +43,19 @@ enum v3_process_mode {
V3_OFFLINE
};

inline static const char *
v3_process_mode_str(int32_t d)
static inline
const char* v3_process_mode_str(int32_t d)
{
switch (d) {
case V3_REALTIME: return "V3_REALTIME";
case V3_PREFETCH: return "V3_PREFETCH";
case V3_OFFLINE: return "V3_OFFLINE";
default: return "[unknown]";
switch (d)
{
case V3_REALTIME:
return "V3_REALTIME";
case V3_PREFETCH:
return "V3_PREFETCH";
case V3_OFFLINE:
return "V3_OFFLINE";
default:
return "[unknown]";
}
}

@@ -58,13 +64,17 @@ enum {
V3_SAMPLE_64
};

inline static const char *
v3_sample_size_str(int32_t d)
static inline
const char* v3_sample_size_str(int32_t d)
{
switch (d) {
case V3_SAMPLE_32: return "V3_SAMPLE_32";
case V3_SAMPLE_64: return "V3_SAMPLE_64";
default: return "[unknown]";
switch (d)
{
case V3_SAMPLE_32:
return "V3_SAMPLE_32";
case V3_SAMPLE_64:
return "V3_SAMPLE_64";
default:
return "[unknown]";
}
}

@@ -82,31 +92,24 @@ struct v3_process_setup {
struct v3_param_value_queue {
struct v3_funknown;

V3_API v3_param_id (*get_param_id)(void *self);
V3_API int32_t (*get_point_count)(void *self);

V3_API v3_result (*get_point)
(void *self, int32_t idx, int32_t *sample_offset, double *value);
V3_API v3_result (*add_point)
(void *self, int32_t sample_offset, double value, int32_t *idx);
V3_API v3_param_id (*get_param_id)(void* self);
V3_API int32_t (*get_point_count)(void* self);
V3_API v3_result (*get_point)(void* self, int32_t idx, int32_t* sample_offset, double* value);
V3_API v3_result (*add_point)(void* self, int32_t sample_offset, double value, int32_t* idx);
};

static const v3_tuid v3_param_value_queue_iid =
static constexpr const v3_tuid v3_param_value_queue_iid =
V3_ID(0x01263A18, 0xED074F6F, 0x98C9D356, 0x4686F9BA);

struct v3_param_changes {
struct v3_funknown;

V3_API int32_t (*get_param_count)(void *self);

V3_API struct v3_param_value_queue **(*get_param_data)
(void *self, int32_t idx);

V3_API struct v3_param_value_queue **(*add_param_data)
(void *self, v3_param_id *id, int32_t *index);
V3_API int32_t (*get_param_count)(void* self);
V3_API struct v3_param_value_queue** (*get_param_data)(void* self, int32_t idx);
V3_API struct v3_param_value_queue** (*add_param_data)(void* self, v3_param_id* id, int32_t* index);
};

static const v3_tuid v3_param_changes_iid =
static constexpr const v3_tuid v3_param_changes_iid =
V3_ID(0xA4779663, 0x0BB64A56, 0xB44384A8, 0x466FEB9D);

/**
@@ -121,55 +124,41 @@ struct v3_frame_rate {
struct v3_chord {
uint8_t key_note;
uint8_t root_note;

int16_t chord_mask;
};

enum {
V3_PROCESS_CTX_PLAYING = 1 << 1,
V3_PROCESS_CTX_CYCLE_ACTIVE = 1 << 2,
V3_PROCESS_CTX_RECORDING = 1 << 3,

V3_PROCESS_CTX_PLAYING = 1 << 1,
V3_PROCESS_CTX_CYCLE_ACTIVE = 1 << 2,
V3_PROCESS_CTX_RECORDING = 1 << 3,
V3_PROCESS_CTX_SYSTEM_TIME_VALID = 1 << 8,
V3_PROCESS_CTX_CONT_TIME_VALID = 1 << 17,
V3_PROCESS_CTX_PROJECT_TIME_VALID = 1 << 9,
V3_PROCESS_CTX_TEMPO_VALID = 1 << 10,
V3_PROCESS_CTX_BAR_POSITION_VALID = 1 << 11,
V3_PROCESS_CTX_CYCLE_VALID = 1 << 12,

V3_PROCESS_CTX_TEMPO_VALID = 1 << 10,
V3_PROCESS_CTX_TIME_SIG_VALID = 1 << 13,
V3_PROCESS_CTX_CHORD_VALID = 1 << 18,

V3_PROCESS_CTX_SMPTE_VALID = 1 << 14,

V3_PROCESS_CTX_NEXT_CLOCK_VALID = 1 << 15
V3_PROCESS_CTX_NEXT_CLOCK_VALID = 1 << 15,
V3_PROCESS_CTX_CONT_TIME_VALID = 1 << 17,
V3_PROCESS_CTX_CHORD_VALID = 1 << 18
};

struct v3_process_context {
uint32_t state;

double sample_rate;
int64_t project_time_in_samples; // with loop

int64_t system_time_ns;
int64_t continuous_time_in_samples; // without loop

double project_time_quarters;
double bar_position_quarters;
double cycle_start_quarters;
double cycle_end_quarters;

double bpm;

int32_t time_sig_numerator;
int32_t time_sig_denom;

struct v3_chord chord;

int32_t smpte_offset_subframes;
struct v3_frame_rate frame_rate;

int32_t samples_to_next_clock;
};

@@ -194,10 +183,10 @@ enum {
struct v3_process_context_requirements {
struct v3_funknown;

V3_API uint32_t (*get_process_context_requirements)(void *self);
V3_API uint32_t (*get_process_context_requirements)(void* self);
};

static const v3_tuid v3_process_context_requirements_iid =
static constexpr const v3_tuid v3_process_context_requirements_iid =
V3_ID(0x2A654303, 0xEF764E3D, 0x95B5FE83, 0x730EF6D0);

/**
@@ -207,32 +196,25 @@ static const v3_tuid v3_process_context_requirements_iid =
struct v3_audio_bus_buffers {
int32_t num_channels;
uint64_t channel_silence_bitset;

union {
float **channel_buffers_32;
double **channel_buffers_64;
float** channel_buffers_32;
double** channel_buffers_64;
};
};

struct v3_process_data {
int32_t process_mode;
int32_t symbolic_sample_size;

int32_t nframes;

int32_t num_input_buses;
int32_t num_output_buses;

struct v3_audio_bus_buffers *inputs;
struct v3_audio_bus_buffers *outputs;

struct v3_param_changes **input_params;
struct v3_param_changes **output_params;

struct v3_event_list **input_events;
struct v3_event_list **output_events;

struct v3_process_context *ctx;
struct v3_audio_bus_buffers* inputs;
struct v3_audio_bus_buffers* outputs;
struct v3_param_changes** input_params;
struct v3_param_changes** output_params;
struct v3_event_list** input_events;
struct v3_event_list** output_events;
struct v3_process_context* ctx;
};

/**
@@ -242,29 +224,18 @@ struct v3_process_data {
struct v3_audio_processor {
struct v3_funknown;

V3_API v3_result (*set_bus_arrangements)
(void *self, v3_speaker_arrangement *inputs, int32_t num_inputs,
v3_speaker_arrangement *outputs, int32_t num_outputs);
V3_API v3_result (*get_bus_arrangement)
(void *self, int32_t bus_direction, int32_t idx, v3_speaker_arrangement *);

V3_API v3_result (*can_process_sample_size)
(void *self, int32_t symbolic_sample_size);

V3_API uint32_t (*get_latency_samples)(void *self);

V3_API v3_result (*setup_processing)
(void *self, struct v3_process_setup *);
V3_API v3_result (*set_processing)
(void *self, v3_bool state);

V3_API v3_result (*process)
(void *self, struct v3_process_data *);

V3_API uint32_t (*get_tail_samples)(void *self);
V3_API v3_result (*set_bus_arrangements)(void* self, v3_speaker_arrangement* inputs, int32_t num_inputs,
v3_speaker_arrangement* outputs, int32_t num_outputs);
V3_API v3_result (*get_bus_arrangement)(void* self, int32_t bus_direction, int32_t idx, v3_speaker_arrangement*);
V3_API v3_result (*can_process_sample_size)(void* self, int32_t symbolic_sample_size);
V3_API uint32_t (*get_latency_samples)(void* self);
V3_API v3_result (*setup_processing)(void* self, struct v3_process_setup* setup);
V3_API v3_result (*set_processing)(void* self, v3_bool state);
V3_API v3_result (*process)(void* self, struct v3_process_data* data);
V3_API uint32_t (*get_tail_samples)(void* self);
};

static const v3_tuid v3_audio_processor_iid =
static constexpr const v3_tuid v3_audio_processor_iid =
V3_ID(0x42043F99, 0xB7DA453C, 0xA569E79D, 0x9AAEC33D);

#include "align_pop.h"

+ 26
- 13
distrho/src/travesty/base.h View File

@@ -20,6 +20,23 @@
#include <stdint.h>
#include <string.h>

/**
* deal with C vs C++ differences
*/

#ifdef __cplusplus
struct v3_funknown;
template<class T> static inline
constexpr T* v3_cpp_obj(T** obj)
{
return (T*)((v3_funknown*)*obj + 1);
}
#else
# ifndef constexpr
# define constexpr
# endif
#endif

/**
* various types
*/
@@ -31,15 +48,14 @@ typedef uint8_t v3_bool;

typedef uint32_t v3_param_id;


/**
* low-level ABI nonsense
*/

typedef uint8_t v3_tuid[16];

inline static bool
v3_tuid_match(const v3_tuid a, const v3_tuid b)
static inline
bool v3_tuid_match(const v3_tuid a, const v3_tuid b)
{
return memcmp(a, b, sizeof(v3_tuid)) == 0;
}
@@ -128,14 +144,12 @@ enum {
*/

struct v3_funknown {
V3_API v3_result (*query_interface)
(void *self, const v3_tuid iid, void **obj);

V3_API uint32_t (*ref)(void *self);
V3_API uint32_t (*unref)(void *self);
V3_API v3_result (*query_interface)(void* self, const v3_tuid iid, void** obj);
V3_API uint32_t (*ref)(void* self);
V3_API uint32_t (*unref)(void* self);
};

static const v3_tuid v3_funknown_iid =
static constexpr const v3_tuid v3_funknown_iid =
V3_ID(0x00000000, 0x00000000, 0xC0000000, 0x00000046);

/**
@@ -145,10 +159,9 @@ static const v3_tuid v3_funknown_iid =
struct v3_plugin_base {
struct v3_funknown;

V3_API v3_result (*initialise)
(void *self, struct v3_funknown *context);
V3_API v3_result (*terminate)(void *self);
V3_API v3_result (*initialise)(void* self, struct v3_funknown* context);
V3_API v3_result (*terminate)(void* self);
};

static const v3_tuid v3_plugin_base_iid =
static constexpr const v3_tuid v3_plugin_base_iid =
V3_ID(0x22888DDB, 0x156E45AE, 0x8358B348, 0x08190625);

+ 5
- 9
distrho/src/travesty/bstream.h View File

@@ -27,15 +27,11 @@ enum v3_seek_mode {
struct v3_bstream {
struct v3_funknown;

V3_API v3_result (*read)
(void *self, void *buffer, int32_t num_bytes, int32_t *bytes_read);
V3_API v3_result (*write)
(void *self, void *buffer, int32_t num_bytes, int32_t *bytes_written);
V3_API v3_result (*seek)
(void *self, int64_t pos, int32_t seek_mode, int64_t *result);
V3_API v3_result (*tell)
(void *self, int64_t *pos);
V3_API v3_result (*read)(void* self, void* buffer, int32_t num_bytes, int32_t* bytes_read);
V3_API v3_result (*write)(void* self, void* buffer, int32_t num_bytes, int32_t* bytes_written);
V3_API v3_result (*seek)(void* self, int64_t pos, int32_t seek_mode, int64_t* result);
V3_API v3_result (*tell)(void* self, int64_t* pos);
};

static const v3_tuid v3_bstream_iid =
static constexpr const v3_tuid v3_bstream_iid =
V3_ID(0xC3BF6EA2, 0x30994752, 0x9B6BF990, 0x1EE33E9B);

+ 33
- 40
distrho/src/travesty/component.h View File

@@ -30,13 +30,17 @@ enum v3_media_types {
V3_EVENT
};

inline static const char *
v3_media_type_str(int32_t type)
static inline
const char* v3_media_type_str(int32_t type)
{
switch (type) {
case V3_AUDIO: return "V3_AUDIO";
case V3_EVENT: return "V3_EVENT";
default: return "[unknown]";
switch (type)
{
case V3_AUDIO:
return "V3_AUDIO";
case V3_EVENT:
return "V3_EVENT";
default:
return "[unknown]";
}
}

@@ -45,13 +49,17 @@ enum v3_bus_direction {
V3_OUTPUT
};

inline static const char *
v3_bus_direction_str(int32_t d)
static inline
const char* v3_bus_direction_str(int32_t d)
{
switch (d) {
case V3_INPUT: return "V3_INPUT";
case V3_OUTPUT: return "V3_OUTPUT";
default: return "[unknown]";
switch (d)
{
case V3_INPUT:
return "V3_INPUT";
case V3_OUTPUT:
return "V3_OUTPUT";
default:
return "[unknown]";
}
}

@@ -61,7 +69,7 @@ enum v3_bus_types {
};

enum v3_bus_flags {
V3_DEFAULT_ACTIVE = 1,
V3_DEFAULT_ACTIVE = 1 << 0,
V3_IS_CONTROL_VOLTAGE = 1 << 1
};

@@ -69,7 +77,6 @@ struct v3_bus_info {
int32_t media_type;
int32_t direction;
int32_t channel_count;

v3_str_128 bus_name;
int32_t bus_type;
uint32_t flags;
@@ -84,34 +91,20 @@ struct v3_routing_info;
struct v3_component {
struct v3_plugin_base;

V3_API v3_result (*get_controller_class_id)
(void *self, v3_tuid class_id);

V3_API v3_result (*set_io_mode)
(void *self, int32_t io_mode);

V3_API int32_t (*get_bus_count)
(void *self, int32_t media_type, int32_t bus_direction);
V3_API v3_result (*get_bus_info)
(void *self, int32_t media_type, int32_t bus_direction,
int32_t bus_idx, struct v3_bus_info *bus_info);
V3_API v3_result (*get_routing_info)
(void *self, struct v3_routing_info *input,
struct v3_routing_info *output);
V3_API v3_result (*activate_bus)
(void *self, int32_t media_type, int32_t bus_direction,
int32_t bus_idx, v3_bool state);

V3_API v3_result (*set_active)
(void *self, v3_bool state);

V3_API v3_result (*set_state)
(void *self, struct v3_bstream **);
V3_API v3_result (*get_state)
(void *self, struct v3_bstream **);
V3_API v3_result (*get_controller_class_id)(void* self, v3_tuid class_id);
V3_API v3_result (*set_io_mode)(void* self, int32_t io_mode);
V3_API int32_t (*get_bus_count)(void* self, int32_t media_type, int32_t bus_direction);
V3_API v3_result (*get_bus_info)(void* self, int32_t media_type, int32_t bus_direction,
int32_t bus_idx, struct v3_bus_info* bus_info);
V3_API v3_result (*get_routing_info)(void* self, struct v3_routing_info* input, struct v3_routing_info* output);
V3_API v3_result (*activate_bus)(void* self, int32_t media_type, int32_t bus_direction,
int32_t bus_idx, v3_bool state);
V3_API v3_result (*set_active)(void* self, v3_bool state);
V3_API v3_result (*set_state)(void* self, struct v3_bstream **);
V3_API v3_result (*get_state)(void* self, struct v3_bstream **);
};

static const v3_tuid v3_component_iid =
static constexpr const v3_tuid v3_component_iid =
V3_ID(0xE831FF31, 0xF2D54301, 0x928EBBEE, 0x25697802);

#include "align_pop.h"

+ 20
- 46
distrho/src/travesty/edit_controller.h View File

@@ -29,18 +29,13 @@
struct v3_component_handler {
struct v3_funknown;

V3_API v3_result (*begin_edit)
(void *self, v3_param_id);
V3_API v3_result (*perform_edit)
(void *self, v3_param_id, double value_normalised);
V3_API v3_result (*end_edit)
(void *self, v3_param_id);

V3_API v3_result (*restart_component)
(void *self, int32_t flags);
V3_API v3_result (*begin_edit)(void* self, v3_param_id);
V3_API v3_result (*perform_edit)(void* self, v3_param_id, double value_normalised);
V3_API v3_result (*end_edit)(void* self, v3_param_id);
V3_API v3_result (*restart_component)(void* self, int32_t flags);
};

static const v3_tuid v3_component_handler_iid =
static constexpr const v3_tuid v3_component_handler_iid =
V3_ID(0x93A0BEA3, 0x0BD045DB, 0x8E890B0C, 0xC1E46AC6);

/**
@@ -48,7 +43,7 @@ static const v3_tuid v3_component_handler_iid =
*/

enum {
V3_PARAM_CAN_AUTOMATE = 1,
V3_PARAM_CAN_AUTOMATE = 1 << 0,
V3_PARAM_READ_ONLY = 1 << 1,
V3_PARAM_WRAP_AROUND = 1 << 2,
V3_PARAM_IS_LIST = 1 << 3,
@@ -59,15 +54,11 @@ enum {

struct v3_param_info {
v3_param_id param_id;

v3_str_128 title;
v3_str_128 short_title;
v3_str_128 units;

int32_t step_count;

double default_normalised_value;

int32_t unit_id;
int32_t flags;
};
@@ -75,39 +66,22 @@ struct v3_param_info {
struct v3_edit_controller {
struct v3_plugin_base;

V3_API v3_result (*set_component_state)
(void *self, struct v3_bstream *);
V3_API v3_result (*set_state)
(void *self, struct v3_bstream *);
V3_API v3_result (*get_state)
(void *self, struct v3_bstream *);

V3_API int32_t (*get_parameter_count)(void *self);
V3_API v3_result (*get_parameter_info)
(void *self, int32_t param_idx, struct v3_param_info *);

V3_API v3_result (*get_parameter_string_for_value)
(void *self, v3_param_id, double normalised, v3_str_128 output);
V3_API v3_result (*get_parameter_value_for_string)
(void *self, v3_param_id, int16_t *input, double *output);

V3_API double (*normalised_parameter_to_plain)
(void *self, v3_param_id, double normalised);
V3_API double (*plain_parameter_to_normalised)
(void *self, v3_param_id, double plain);

V3_API double (*get_parameter_normalised)(void *self, v3_param_id);
V3_API v3_result (*set_parameter_normalised)
(void *self, v3_param_id, double normalised);

V3_API v3_result (*set_component_handler)
(void *self, struct v3_component_handler **);

V3_API struct v3_plugin_view **(*create_view)
(void *self, const char *name);
V3_API v3_result (*set_component_state)(void* self, struct v3_bstream*);
V3_API v3_result (*set_state)(void* self, struct v3_bstream*);
V3_API v3_result (*get_state)(void* self, struct v3_bstream*);
V3_API int32_t (*get_parameter_count)(void* self);
V3_API v3_result (*get_parameter_info)(void* self, int32_t param_idx, struct v3_param_info*);
V3_API v3_result (*get_parameter_string_for_value)(void* self, v3_param_id, double normalised, v3_str_128 output);
V3_API v3_result (*get_parameter_value_for_string)(void* self, v3_param_id, int16_t* input, double* output);
V3_API double (*normalised_parameter_to_plain)(void* self, v3_param_id, double normalised);
V3_API double (*plain_parameter_to_normalised)(void* self, v3_param_id, double plain);
V3_API double (*get_parameter_normalised)(void* self, v3_param_id);
V3_API v3_result (*set_parameter_normalised)(void* self, v3_param_id, double normalised);
V3_API v3_result (*set_component_handler)(void* self, struct v3_component_handler**);
V3_API struct v3_plugin_view **(*create_view)(void* self, const char* name);
};

static const v3_tuid v3_edit_controller_iid =
static constexpr const v3_tuid v3_edit_controller_iid =
V3_ID(0xDCD7BBE3, 0x7742448D, 0xA874AACC, 0x979C759E);

#include "align_pop.h"

+ 6
- 22
distrho/src/travesty/events.h View File

@@ -30,10 +30,8 @@
struct v3_event_note_on {
int16_t channel;
int16_t pitch; // MIDI note number

float tuning;
float velocity;

int32_t length;
int32_t note_id;
};
@@ -41,9 +39,7 @@ struct v3_event_note_on {
struct v3_event_note_off {
int16_t channel;
int16_t pitch; // MIDI note number

float velocity;

int32_t note_id;
float tuning;
};
@@ -51,14 +47,12 @@ struct v3_event_note_off {
struct v3_event_data {
uint32_t size;
uint32_t type;

const uint8_t *bytes;
const uint8_t* bytes;
};

struct v3_event_poly_pressure {
int16_t channel;
int16_t pitch;

float pressure;
int32_t note_id;
};
@@ -67,7 +61,6 @@ struct v3_event_chord {
int16_t root;
int16_t bass_note;
int16_t mask;

uint16_t text_len;
const int16_t *text;
};
@@ -75,14 +68,12 @@ struct v3_event_chord {
struct v3_event_scale {
int16_t root;
int16_t mask;

uint16_t text_len;
const int16_t *text;
};

struct v3_event_legacy_midi_cc_out {
uint8_t cc_number;

int8_t channel;
int8_t value;
int8_t value2;
@@ -96,7 +87,6 @@ struct v3_event_note_expression_value {

struct v3_event_note_expression_text {
int32_t note_id;

uint32_t text_len;
const int16_t *text;
};
@@ -106,7 +96,7 @@ struct v3_event_note_expression_text {
*/

enum v3_event_flags {
V3_EVENT_IS_LIVE = 1
V3_EVENT_IS_LIVE = 1 << 0
};

enum v3_event_type {
@@ -118,19 +108,15 @@ enum v3_event_type {
V3_EVENT_NOTE_EXP_TEXT = 5,
V3_EVENT_CHORD = 6,
V3_EVENT_SCALE = 7,

V3_EVENT_LEGACY_MIDI_CC_OUT = 65535
};

struct v3_event {
int32_t bus_index;
int32_t sample_offset;

double ppq_position;
uint16_t flags;

uint16_t type;

union {
struct v3_event_note_on note_on;
struct v3_event_note_off note_off;
@@ -151,14 +137,12 @@ struct v3_event {
struct v3_event_list {
struct v3_funknown;

V3_API uint32_t (*get_event_count)(void *self);
V3_API v3_result (*get_event)
(void *self, int32_t idx, struct v3_event *);
V3_API v3_result (*add_event)
(void *self, struct v3_event *);
V3_API uint32_t (*get_event_count)(void* self);
V3_API v3_result (*get_event)(void* self, int32_t idx, struct v3_event* event);
V3_API v3_result (*add_event)(void* self, struct v3_event* event);
};

static const v3_tuid v3_event_list_iid =
static constexpr const v3_tuid v3_event_list_iid =
V3_ID(0x3A2C4214, 0x346349FE, 0xB2C4F397, 0xB9695A44);

#include "align_pop.h"

+ 10
- 22
distrho/src/travesty/factory.h View File

@@ -39,19 +39,13 @@ struct v3_class_info {
struct v3_plugin_factory {
struct v3_funknown;

V3_API v3_result (*get_factory_info)
(void *self, struct v3_factory_info *);

V3_API int32_t (*num_classes)(void *self);

V3_API v3_result (*get_class_info)
(void *self, int32_t idx, struct v3_class_info *);

V3_API v3_result (*create_instance)
(void *self, const v3_tuid class_id, const v3_tuid iid, void **instance);
V3_API v3_result (*get_factory_info)(void* self, struct v3_factory_info*);
V3_API int32_t (*num_classes)(void* self);
V3_API v3_result (*get_class_info)(void* self, int32_t idx, struct v3_class_info*);
V3_API v3_result (*create_instance)(void* self, const v3_tuid class_id, const v3_tuid iid, void** instance);
};

static const v3_tuid v3_plugin_factory_iid =
static constexpr const v3_tuid v3_plugin_factory_iid =
V3_ID(0x7A4D811C, 0x52114A1F, 0xAED9D2EE, 0x0B43BF9F);

/**
@@ -63,7 +57,6 @@ struct v3_class_info_2 {
int32_t cardinality; // set to 0x7FFFFFFF
char category[32];
char name[64];

uint32_t class_flags;
char sub_categories[128];
char vendor[64];
@@ -74,11 +67,10 @@ struct v3_class_info_2 {
struct v3_plugin_factory_2 {
struct v3_plugin_factory;

V3_API v3_result (*get_class_info_2)
(void *self, int32_t idx, struct v3_class_info_2 *);
V3_API v3_result (*get_class_info_2)(void* self, int32_t idx, struct v3_class_info_2*);
};

static const v3_tuid v3_plugin_factory_2_iid =
static constexpr const v3_tuid v3_plugin_factory_2_iid =
V3_ID(0x0007B650, 0xF24B4C0B, 0xA464EDB9, 0xF00B2ABB);

/**
@@ -93,7 +85,6 @@ struct v3_class_info_3 {
int32_t cardinality; // set to 0x7FFFFFFF
char category[32];
int16_t name[64];

uint32_t class_flags;
char sub_categories[128];
int16_t vendor[64];
@@ -104,12 +95,9 @@ struct v3_class_info_3 {
struct v3_plugin_factory_3 {
struct v3_plugin_factory_2;

V3_API v3_result (*get_class_info_utf16)
(void *self, int32_t idx, struct v3_class_info_3 *);

V3_API v3_result (*set_host_context)
(void *self, struct v3_funknown *host);
V3_API v3_result (*get_class_info_utf16)(void* self, int32_t idx, struct v3_class_info_3*);
V3_API v3_result (*set_host_context)(void* self, struct v3_funknown* host);
};

static const v3_tuid v3_plugin_factory_3_iid =
static constexpr const v3_tuid v3_plugin_factory_3_iid =
V3_ID(0x4555A2AB, 0xC1234E57, 0x9B122910, 0x36878931);

+ 28
- 37
distrho/src/travesty/view.h View File

@@ -19,7 +19,7 @@
#include "base.h"

/**
* base IPlugFrame stuff
* base view stuff
*/

struct v3_view_rect {
@@ -41,50 +41,43 @@ struct v3_view_rect {
# define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_X11
#endif

/**
* plugin view
*/

struct v3_plugin_frame;

struct v3_plugin_view {
struct v3_funknown;

V3_API v3_result (*is_platform_type_supported)
(void *self, const char *platform_type);

V3_API v3_result (*attached)
(void *self, void *parent, const char *platform_type);
V3_API v3_result (*removed)(void *self);

V3_API v3_result (*on_wheel)(void *self, float distance);
V3_API v3_result (*on_key_down)
(void *self, int16_t key_char, int16_t key_code, int16_t modifiers);
V3_API v3_result (*on_key_up)
(void *self, int16_t key_char, int16_t key_code, int16_t modifiers);

V3_API v3_result (*get_size)
(void *self, struct v3_view_rect *);
V3_API v3_result (*on_size)
(void *self, struct v3_view_rect *);

V3_API v3_result (*on_focus)
(void *self, v3_bool state);

V3_API v3_result (*set_frame)
(void *self, struct v3_plugin_frame **);
V3_API v3_result (*can_resize)(void *self);
V3_API v3_result (*check_size_constraint)
(void *self, struct v3_view_rect *);
V3_API v3_result (*is_platform_type_supported)(void* self, const char* platform_type);
V3_API v3_result (*attached)(void* self, void* parent, const char* platform_type);
V3_API v3_result (*removed)(void* self);
V3_API v3_result (*on_wheel)(void* self, float distance);
V3_API v3_result (*on_key_down)(void* self, int16_t key_char, int16_t key_code, int16_t modifiers);
V3_API v3_result (*on_key_up)(void* self, int16_t key_char, int16_t key_code, int16_t modifiers);
V3_API v3_result (*get_size)(void* self, struct v3_view_rect*);
V3_API v3_result (*on_size)(void* self, struct v3_view_rect*);
V3_API v3_result (*on_focus)(void* self, v3_bool state);
V3_API v3_result (*set_frame)(void* self, struct v3_plugin_frame**);
V3_API v3_result (*can_resize)(void* self);
V3_API v3_result (*check_size_constraint)(void* self, struct v3_view_rect*);
};

static const v3_tuid v3_plugin_view_iid =
static constexpr const v3_tuid v3_plugin_view_iid =
V3_ID(0x5BC32507, 0xD06049EA, 0xA6151B52, 0x2B755B29);

/**
* plugin frame
*/

struct v3_plugin_frame {
struct v3_funknown;

V3_API v3_result (*resize_view)
(void *self, struct v3_plugin_view **, struct v3_view_rect *);
V3_API v3_result (*resize_view)(void* self, struct v3_plugin_view**, struct v3_view_rect*);
};

static const v3_tuid v3_plugin_frame_iid =
static constexpr const v3_tuid v3_plugin_frame_iid =
V3_ID(0x367FAF01, 0xAFA94693, 0x8D4DA2A0, 0xED0882A3);

/**
@@ -95,11 +88,10 @@ static const v3_tuid v3_plugin_frame_iid =
struct v3_plugin_view_content_scale_steinberg {
struct v3_funknown;

V3_API v3_result (*set_content_scale_factor)
(void *self, float factor);
V3_API v3_result (*set_content_scale_factor)(void* self, float factor);
};

static const v3_tuid v3_plugin_view_content_scale_steinberg_iid =
static constexpr const v3_tuid v3_plugin_view_content_scale_steinberg_iid =
V3_ID(0x65ED9690, 0x8AC44525, 0x8AADEF7A, 0x72EA703F);

/**
@@ -109,9 +101,8 @@ static const v3_tuid v3_plugin_view_content_scale_steinberg_iid =
struct v3_plugin_view_parameter_finder {
struct v3_funknown;

V3_API v3_result (*find_parameter)
(void *self, int32_t x, int32_t y, v3_param_id *);
V3_API v3_result (*find_parameter)(void* self, int32_t x, int32_t y, v3_param_id *);
};

static const v3_tuid v3_plugin_view_parameter_finder_iid =
static constexpr const v3_tuid v3_plugin_view_parameter_finder_iid =
V3_ID(0x0F618302, 0x215D4587, 0xA512073C, 0x77B9D383);

Loading…
Cancel
Save