@@ -38,8 +38,7 @@ extern "C" { | |||||
using juce::File; | using juce::File; | ||||
#define URI_CARLA_ATOM_WORKER "http://kxstudio.sf.net/ns/carla/atomWorker" | |||||
#define URI_CARLA_FRONTEND_WIN_ID "http://kxstudio.sf.net/ns/carla/frontendWinId" | |||||
#define URI_CARLA_ATOM_WORKER "http://kxstudio.sf.net/ns/carla/atomWorker" | |||||
CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
@@ -108,12 +107,13 @@ const uint32_t CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE = 37; | |||||
const uint32_t CARLA_URI_MAP_ID_TIME_FRAME = 38; | const uint32_t CARLA_URI_MAP_ID_TIME_FRAME = 38; | ||||
const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 39; | const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 39; | ||||
const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 40; | const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 40; | ||||
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 41; | |||||
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 42; | |||||
const uint32_t CARLA_URI_MAP_ID_UI_WINDOW_TITLE = 43; | |||||
const uint32_t CARLA_URI_MAP_ID_CARLA_ATOM_WORKER = 44; | |||||
const uint32_t CARLA_URI_MAP_ID_CARLA_FRONTEND_WIN_ID = 45; | |||||
const uint32_t CARLA_URI_MAP_ID_COUNT = 46; | |||||
const uint32_t CARLA_URI_MAP_ID_TIME_TICKS_PER_BEAT = 41; | |||||
const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 42; | |||||
const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 43; | |||||
const uint32_t CARLA_URI_MAP_ID_UI_WINDOW_TITLE = 44; | |||||
const uint32_t CARLA_URI_MAP_ID_CARLA_ATOM_WORKER = 45; | |||||
const uint32_t CARLA_URI_MAP_ID_CARLA_TRANSIENT_WIN_ID = 46; | |||||
const uint32_t CARLA_URI_MAP_ID_COUNT = 47; | |||||
// LV2 Feature Ids | // LV2 Feature Ids | ||||
const uint32_t kFeatureIdBufSizeBounded = 0; | const uint32_t kFeatureIdBufSizeBounded = 0; | ||||
@@ -339,7 +339,7 @@ struct Lv2PluginOptions { | |||||
LV2_Options_Option& optFrontendWinId(opts[FrontendWinId]); | LV2_Options_Option& optFrontendWinId(opts[FrontendWinId]); | ||||
optFrontendWinId.context = LV2_OPTIONS_INSTANCE; | optFrontendWinId.context = LV2_OPTIONS_INSTANCE; | ||||
optFrontendWinId.subject = 0; | optFrontendWinId.subject = 0; | ||||
optFrontendWinId.key = CARLA_URI_MAP_ID_CARLA_FRONTEND_WIN_ID; | |||||
optFrontendWinId.key = CARLA_URI_MAP_ID_CARLA_TRANSIENT_WIN_ID; | |||||
optFrontendWinId.size = sizeof(int64_t); | optFrontendWinId.size = sizeof(int64_t); | ||||
optFrontendWinId.type = CARLA_URI_MAP_ID_ATOM_LONG; | optFrontendWinId.type = CARLA_URI_MAP_ID_ATOM_LONG; | ||||
optFrontendWinId.value = &frontendWinId; | optFrontendWinId.value = &frontendWinId; | ||||
@@ -2079,7 +2079,9 @@ public: | |||||
// check if parameter is not enabled or automable | // check if parameter is not enabled or automable | ||||
if (LV2_IS_PORT_NOT_ON_GUI(portProps)) | if (LV2_IS_PORT_NOT_ON_GUI(portProps)) | ||||
pData->param.data[j].hints &= ~(PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE); | pData->param.data[j].hints &= ~(PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE); | ||||
else if (LV2_IS_PORT_CAUSES_ARTIFACTS(portProps) || LV2_IS_PORT_EXPENSIVE(portProps) || LV2_IS_PORT_NOT_AUTOMATIC(portProps)) | |||||
else if (LV2_IS_PORT_CAUSES_ARTIFACTS(portProps) || LV2_IS_PORT_EXPENSIVE(portProps)) | |||||
pData->param.data[j].hints &= ~PARAMETER_IS_AUTOMABLE; | |||||
else if (LV2_IS_PORT_NOT_AUTOMATIC(portProps) || LV2_IS_PORT_NON_AUTOMABLE(portProps)) | |||||
pData->param.data[j].hints &= ~PARAMETER_IS_AUTOMABLE; | pData->param.data[j].hints &= ~PARAMETER_IS_AUTOMABLE; | ||||
pData->param.ranges[j].min = min; | pData->param.ranges[j].min = min; | ||||
@@ -2667,6 +2669,13 @@ public: | |||||
doPostRt = true; | doPostRt = true; | ||||
} | } | ||||
break; | break; | ||||
case LV2_PORT_DESIGNATION_TIME_TICKS_PER_BEAT: | |||||
if ((timeInfo.valid & EngineTimeInfo::kValidBBT) != 0 && ! carla_compareFloats(fLastTimeInfo.bbt.ticksPerBeat, timeInfo.bbt.ticksPerBeat)) | |||||
{ | |||||
fParamBuffers[k] = static_cast<float>(timeInfo.bbt.ticksPerBeat); | |||||
doPostRt = true; | |||||
} | |||||
break; | |||||
} | } | ||||
if (doPostRt) | if (doPostRt) | ||||
@@ -2709,6 +2718,9 @@ public: | |||||
lv2_atom_forge_key(&fAtomForge, CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE); | lv2_atom_forge_key(&fAtomForge, CARLA_URI_MAP_ID_TIME_BEATS_PER_MINUTE); | ||||
lv2_atom_forge_float(&fAtomForge, static_cast<float>(timeInfo.bbt.beatsPerMinute)); | lv2_atom_forge_float(&fAtomForge, static_cast<float>(timeInfo.bbt.beatsPerMinute)); | ||||
lv2_atom_forge_key(&fAtomForge, CARLA_URI_MAP_ID_TIME_TICKS_PER_BEAT); | |||||
lv2_atom_forge_double(&fAtomForge, static_cast<float>(timeInfo.bbt.ticksPerBeat)); | |||||
} | } | ||||
lv2_atom_forge_pop(&fAtomForge, &forgeFrame); | lv2_atom_forge_pop(&fAtomForge, &forgeFrame); | ||||
@@ -5617,6 +5629,8 @@ private: | |||||
return CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND; | return CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND; | ||||
if (std::strcmp(uri, LV2_TIME__speed) == 0) | if (std::strcmp(uri, LV2_TIME__speed) == 0) | ||||
return CARLA_URI_MAP_ID_TIME_SPEED; | return CARLA_URI_MAP_ID_TIME_SPEED; | ||||
if (std::strcmp(uri, LV2_KXSTUDIO_PROPERTIES__TimePositionTicksPerBeat) == 0) | |||||
return CARLA_URI_MAP_ID_TIME_TICKS_PER_BEAT; | |||||
// Others | // Others | ||||
if (std::strcmp(uri, LV2_MIDI__MidiEvent) == 0) | if (std::strcmp(uri, LV2_MIDI__MidiEvent) == 0) | ||||
@@ -5627,10 +5641,10 @@ private: | |||||
return CARLA_URI_MAP_ID_UI_WINDOW_TITLE; | return CARLA_URI_MAP_ID_UI_WINDOW_TITLE; | ||||
// Custom | // Custom | ||||
if (std::strcmp(uri, LV2_KXSTUDIO_PROPERTIES__TransientWindowId) == 0) | |||||
return CARLA_URI_MAP_ID_CARLA_TRANSIENT_WIN_ID; | |||||
if (std::strcmp(uri, URI_CARLA_ATOM_WORKER) == 0) | if (std::strcmp(uri, URI_CARLA_ATOM_WORKER) == 0) | ||||
return CARLA_URI_MAP_ID_CARLA_ATOM_WORKER; | return CARLA_URI_MAP_ID_CARLA_ATOM_WORKER; | ||||
if (std::strcmp(uri, URI_CARLA_FRONTEND_WIN_ID) == 0) | |||||
return CARLA_URI_MAP_ID_CARLA_FRONTEND_WIN_ID; | |||||
// Custom types | // Custom types | ||||
return ((Lv2Plugin*)handle)->getCustomURID(uri); | return ((Lv2Plugin*)handle)->getCustomURID(uri); | ||||
@@ -5729,6 +5743,8 @@ private: | |||||
return LV2_TIME__framesPerSecond; | return LV2_TIME__framesPerSecond; | ||||
if (urid == CARLA_URI_MAP_ID_TIME_SPEED) | if (urid == CARLA_URI_MAP_ID_TIME_SPEED) | ||||
return LV2_TIME__speed; | return LV2_TIME__speed; | ||||
if (urid == CARLA_URI_MAP_ID_TIME_TICKS_PER_BEAT) | |||||
return LV2_KXSTUDIO_PROPERTIES__TimePositionTicksPerBeat; | |||||
// Others | // Others | ||||
if (urid == CARLA_URI_MAP_ID_MIDI_EVENT) | if (urid == CARLA_URI_MAP_ID_MIDI_EVENT) | ||||
@@ -5741,8 +5757,8 @@ private: | |||||
// Custom | // Custom | ||||
if (urid == CARLA_URI_MAP_ID_CARLA_ATOM_WORKER) | if (urid == CARLA_URI_MAP_ID_CARLA_ATOM_WORKER) | ||||
return URI_CARLA_ATOM_WORKER; | return URI_CARLA_ATOM_WORKER; | ||||
if (urid == CARLA_URI_MAP_ID_CARLA_FRONTEND_WIN_ID) | |||||
return URI_CARLA_FRONTEND_WIN_ID; | |||||
if (urid == CARLA_URI_MAP_ID_CARLA_TRANSIENT_WIN_ID) | |||||
return LV2_KXSTUDIO_PROPERTIES__TransientWindowId; | |||||
// Custom types | // Custom types | ||||
return ((Lv2Plugin*)handle)->getCustomURIDString(urid); | return ((Lv2Plugin*)handle)->getCustomURIDString(urid); | ||||
@@ -0,0 +1,33 @@ | |||||
/* | |||||
LV2 KXStudio Properties Extension | |||||
Copyright 2014 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 lv2_kxstudio_properties.h | |||||
C header for the LV2 KXStudio Properties extension <http://kxstudio.sf.net/ns/lv2ext/props>. | |||||
*/ | |||||
#ifndef LV2_KXSTUDIO_PROPERTIES_H | |||||
#define LV2_KXSTUDIO_PROPERTIES_H | |||||
#define LV2_KXSTUDIO_PROPERTIES_URI "http://kxstudio.sf.net/ns/lv2ext/props" | |||||
#define LV2_KXSTUDIO_PROPERTIES_PREFIX LV2_KXSTUDIO_PROPERTIES_URI "#" | |||||
#define LV2_KXSTUDIO_PROPERTIES__NonAutomable LV2_KXSTUDIO_PROPERTIES_PREFIX "NonAutomable" | |||||
#define LV2_KXSTUDIO_PROPERTIES__TimePositionTicksPerBeat LV2_KXSTUDIO_PROPERTIES_PREFIX "TimePositionTicksPerBeat" | |||||
#define LV2_KXSTUDIO_PROPERTIES__TransientWindowId LV2_KXSTUDIO_PROPERTIES_PREFIX "TransientWindowId" | |||||
#endif /* LV2_KXSTUDIO_PROPERTIES_H */ |
@@ -154,6 +154,7 @@ typedef uint32_t LV2_Property; | |||||
#define LV2_PORT_NOT_AUTOMATIC 0x0800 | #define LV2_PORT_NOT_AUTOMATIC 0x0800 | ||||
#define LV2_PORT_NOT_ON_GUI 0x1000 | #define LV2_PORT_NOT_ON_GUI 0x1000 | ||||
#define LV2_PORT_TRIGGER 0x2000 | #define LV2_PORT_TRIGGER 0x2000 | ||||
#define LV2_PORT_NON_AUTOMABLE 0x4000 | |||||
#define LV2_IS_PORT_OPTIONAL(x) ((x) & LV2_PORT_OPTIONAL) | #define LV2_IS_PORT_OPTIONAL(x) ((x) & LV2_PORT_OPTIONAL) | ||||
#define LV2_IS_PORT_ENUMERATION(x) ((x) & LV2_PORT_ENUMERATION) | #define LV2_IS_PORT_ENUMERATION(x) ((x) & LV2_PORT_ENUMERATION) | ||||
@@ -169,6 +170,7 @@ typedef uint32_t LV2_Property; | |||||
#define LV2_IS_PORT_NOT_AUTOMATIC(x) ((x) & LV2_PORT_NOT_AUTOMATIC) | #define LV2_IS_PORT_NOT_AUTOMATIC(x) ((x) & LV2_PORT_NOT_AUTOMATIC) | ||||
#define LV2_IS_PORT_NOT_ON_GUI(x) ((x) & LV2_PORT_NOT_ON_GUI) | #define LV2_IS_PORT_NOT_ON_GUI(x) ((x) & LV2_PORT_NOT_ON_GUI) | ||||
#define LV2_IS_PORT_TRIGGER(x) ((x) & LV2_PORT_TRIGGER) | #define LV2_IS_PORT_TRIGGER(x) ((x) & LV2_PORT_TRIGGER) | ||||
#define LV2_IS_PORT_NON_AUTOMABLE(x) ((x) & LV2_PORT_NON_AUTOMABLE) | |||||
// Port Designation | // Port Designation | ||||
#define LV2_PORT_DESIGNATION_CONTROL 1 | #define LV2_PORT_DESIGNATION_CONTROL 1 | ||||
@@ -184,6 +186,7 @@ typedef uint32_t LV2_Property; | |||||
#define LV2_PORT_DESIGNATION_TIME_FRAME 11 | #define LV2_PORT_DESIGNATION_TIME_FRAME 11 | ||||
#define LV2_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND 12 | #define LV2_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND 12 | ||||
#define LV2_PORT_DESIGNATION_TIME_SPEED 13 | #define LV2_PORT_DESIGNATION_TIME_SPEED 13 | ||||
#define LV2_PORT_DESIGNATION_TIME_TICKS_PER_BEAT 14 | |||||
#define LV2_IS_PORT_DESIGNATION_CONTROL(x) ((x) == LV2_PORT_DESIGNATION_CONTROL) | #define LV2_IS_PORT_DESIGNATION_CONTROL(x) ((x) == LV2_PORT_DESIGNATION_CONTROL) | ||||
#define LV2_IS_PORT_DESIGNATION_FREEWHEELING(x) ((x) == LV2_PORT_DESIGNATION_FREEWHEELING) | #define LV2_IS_PORT_DESIGNATION_FREEWHEELING(x) ((x) == LV2_PORT_DESIGNATION_FREEWHEELING) | ||||
@@ -198,7 +201,8 @@ typedef uint32_t LV2_Property; | |||||
#define LV2_IS_PORT_DESIGNATION_TIME_FRAME(x) ((x) == LV2_PORT_DESIGNATION_TIME_FRAME) | #define LV2_IS_PORT_DESIGNATION_TIME_FRAME(x) ((x) == LV2_PORT_DESIGNATION_TIME_FRAME) | ||||
#define LV2_IS_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND(x) ((x) == LV2_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND) | #define LV2_IS_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND(x) ((x) == LV2_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND) | ||||
#define LV2_IS_PORT_DESIGNATION_TIME_SPEED(x) ((x) == LV2_PORT_DESIGNATION_TIME_SPEED) | #define LV2_IS_PORT_DESIGNATION_TIME_SPEED(x) ((x) == LV2_PORT_DESIGNATION_TIME_SPEED) | ||||
#define LV2_IS_PORT_DESIGNATION_TIME(x) ((x) >= LV2_PORT_DESIGNATION_TIME_BAR && (x) <= LV2_PORT_DESIGNATION_TIME_SPEED) | |||||
#define LV2_IS_PORT_DESIGNATION_TIME_TICKS_PER_BEAT(x) ((x) == LV2_PORT_DESIGNATION_TIME_TICKS_PER_BEAT) | |||||
#define LV2_IS_PORT_DESIGNATION_TIME(x) ((x) >= LV2_PORT_DESIGNATION_TIME_BAR && (x) <= LV2_PORT_DESIGNATION_TIME_TICKS_PER_BEAT) | |||||
// Feature Types | // Feature Types | ||||
#define LV2_FEATURE_OPTIONAL 1 | #define LV2_FEATURE_OPTIONAL 1 | ||||
@@ -64,6 +64,7 @@ | |||||
#include "lv2/lv2-miditype.h" | #include "lv2/lv2-miditype.h" | ||||
#include "lv2/lv2-midifunctions.h" | #include "lv2/lv2-midifunctions.h" | ||||
#include "lv2/lv2_external_ui.h" | #include "lv2/lv2_external_ui.h" | ||||
#include "lv2/lv2_kxstudio_properties.h" | |||||
#include "lv2/lv2_programs.h" | #include "lv2/lv2_programs.h" | ||||
#include "lv2/lv2_rtmempool.h" | #include "lv2/lv2_rtmempool.h" | ||||
@@ -185,6 +186,7 @@ public: | |||||
Lilv::Node pprop_notAutomatic; | Lilv::Node pprop_notAutomatic; | ||||
Lilv::Node pprop_notOnGUI; | Lilv::Node pprop_notOnGUI; | ||||
Lilv::Node pprop_trigger; | Lilv::Node pprop_trigger; | ||||
Lilv::Node pprop_nonAutomable; | |||||
// Unit Hints | // Unit Hints | ||||
Lilv::Node unit_name; | Lilv::Node unit_name; | ||||
@@ -309,6 +311,7 @@ public: | |||||
pprop_notAutomatic (new_uri(LV2_PORT_PROPS__notAutomatic)), | pprop_notAutomatic (new_uri(LV2_PORT_PROPS__notAutomatic)), | ||||
pprop_notOnGUI (new_uri(LV2_PORT_PROPS__notOnGUI)), | pprop_notOnGUI (new_uri(LV2_PORT_PROPS__notOnGUI)), | ||||
pprop_trigger (new_uri(LV2_PORT_PROPS__trigger)), | pprop_trigger (new_uri(LV2_PORT_PROPS__trigger)), | ||||
pprop_nonAutomable (new_uri(LV2_KXSTUDIO_PROPERTIES__NonAutomable)), | |||||
unit_name (new_uri(LV2_UNITS__name)), | unit_name (new_uri(LV2_UNITS__name)), | ||||
unit_render (new_uri(LV2_UNITS__render)), | unit_render (new_uri(LV2_UNITS__render)), | ||||
@@ -783,6 +786,8 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets) | |||||
rdfPort->Properties |= LV2_PORT_NOT_ON_GUI; | rdfPort->Properties |= LV2_PORT_NOT_ON_GUI; | ||||
if (lilvPort.has_property(lv2World.pprop_trigger)) | if (lilvPort.has_property(lv2World.pprop_trigger)) | ||||
rdfPort->Properties |= LV2_PORT_TRIGGER; | rdfPort->Properties |= LV2_PORT_TRIGGER; | ||||
if (lilvPort.has_property(lv2World.pprop_nonAutomable)) | |||||
rdfPort->Properties |= LV2_PORT_NON_AUTOMABLE; | |||||
if (lilvPort.has_property(lv2World.reportsLatency)) | if (lilvPort.has_property(lv2World.reportsLatency)) | ||||
rdfPort->Designation = LV2_PORT_DESIGNATION_LATENCY; | rdfPort->Designation = LV2_PORT_DESIGNATION_LATENCY; | ||||
@@ -881,6 +886,8 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets) | |||||
rdfPort->Designation = LV2_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND; | rdfPort->Designation = LV2_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND; | ||||
else if (std::strcmp(designation, LV2_TIME__speed) == 0) | else if (std::strcmp(designation, LV2_TIME__speed) == 0) | ||||
rdfPort->Designation = LV2_PORT_DESIGNATION_TIME_SPEED; | rdfPort->Designation = LV2_PORT_DESIGNATION_TIME_SPEED; | ||||
else if (std::strcmp(designation, LV2_KXSTUDIO_PROPERTIES__TimePositionTicksPerBeat) == 0) | |||||
rdfPort->Designation = LV2_PORT_DESIGNATION_TIME_TICKS_PER_BEAT; | |||||
else if (std::strncmp(designation, LV2_PARAMETERS_PREFIX, std::strlen(LV2_PARAMETERS_PREFIX)) == 0) | else if (std::strncmp(designation, LV2_PARAMETERS_PREFIX, std::strlen(LV2_PARAMETERS_PREFIX)) == 0) | ||||
pass(); | pass(); | ||||
else if (std::strncmp(designation, LV2_PORT_GROUPS_PREFIX, std::strlen(LV2_PORT_GROUPS_PREFIX)) == 0) | else if (std::strncmp(designation, LV2_PORT_GROUPS_PREFIX, std::strlen(LV2_PORT_GROUPS_PREFIX)) == 0) | ||||