@@ -38,8 +38,7 @@ extern "C" { | |||
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 | |||
@@ -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_FRAMES_PER_SECOND = 39; | |||
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 | |||
const uint32_t kFeatureIdBufSizeBounded = 0; | |||
@@ -339,7 +339,7 @@ struct Lv2PluginOptions { | |||
LV2_Options_Option& optFrontendWinId(opts[FrontendWinId]); | |||
optFrontendWinId.context = LV2_OPTIONS_INSTANCE; | |||
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.type = CARLA_URI_MAP_ID_ATOM_LONG; | |||
optFrontendWinId.value = &frontendWinId; | |||
@@ -2079,7 +2079,9 @@ public: | |||
// check if parameter is not enabled or automable | |||
if (LV2_IS_PORT_NOT_ON_GUI(portProps)) | |||
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.ranges[j].min = min; | |||
@@ -2667,6 +2669,13 @@ public: | |||
doPostRt = true; | |||
} | |||
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) | |||
@@ -2709,6 +2718,9 @@ public: | |||
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_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); | |||
@@ -5617,6 +5629,8 @@ private: | |||
return CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND; | |||
if (std::strcmp(uri, LV2_TIME__speed) == 0) | |||
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 | |||
if (std::strcmp(uri, LV2_MIDI__MidiEvent) == 0) | |||
@@ -5627,10 +5641,10 @@ private: | |||
return CARLA_URI_MAP_ID_UI_WINDOW_TITLE; | |||
// 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) | |||
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 | |||
return ((Lv2Plugin*)handle)->getCustomURID(uri); | |||
@@ -5729,6 +5743,8 @@ private: | |||
return LV2_TIME__framesPerSecond; | |||
if (urid == CARLA_URI_MAP_ID_TIME_SPEED) | |||
return LV2_TIME__speed; | |||
if (urid == CARLA_URI_MAP_ID_TIME_TICKS_PER_BEAT) | |||
return LV2_KXSTUDIO_PROPERTIES__TimePositionTicksPerBeat; | |||
// Others | |||
if (urid == CARLA_URI_MAP_ID_MIDI_EVENT) | |||
@@ -5741,8 +5757,8 @@ private: | |||
// Custom | |||
if (urid == CARLA_URI_MAP_ID_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 | |||
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_ON_GUI 0x1000 | |||
#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_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_ON_GUI(x) ((x) & LV2_PORT_NOT_ON_GUI) | |||
#define LV2_IS_PORT_TRIGGER(x) ((x) & LV2_PORT_TRIGGER) | |||
#define LV2_IS_PORT_NON_AUTOMABLE(x) ((x) & LV2_PORT_NON_AUTOMABLE) | |||
// Port Designation | |||
#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_FRAMES_PER_SECOND 12 | |||
#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_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_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(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 | |||
#define LV2_FEATURE_OPTIONAL 1 | |||
@@ -64,6 +64,7 @@ | |||
#include "lv2/lv2-miditype.h" | |||
#include "lv2/lv2-midifunctions.h" | |||
#include "lv2/lv2_external_ui.h" | |||
#include "lv2/lv2_kxstudio_properties.h" | |||
#include "lv2/lv2_programs.h" | |||
#include "lv2/lv2_rtmempool.h" | |||
@@ -185,6 +186,7 @@ public: | |||
Lilv::Node pprop_notAutomatic; | |||
Lilv::Node pprop_notOnGUI; | |||
Lilv::Node pprop_trigger; | |||
Lilv::Node pprop_nonAutomable; | |||
// Unit Hints | |||
Lilv::Node unit_name; | |||
@@ -309,6 +311,7 @@ public: | |||
pprop_notAutomatic (new_uri(LV2_PORT_PROPS__notAutomatic)), | |||
pprop_notOnGUI (new_uri(LV2_PORT_PROPS__notOnGUI)), | |||
pprop_trigger (new_uri(LV2_PORT_PROPS__trigger)), | |||
pprop_nonAutomable (new_uri(LV2_KXSTUDIO_PROPERTIES__NonAutomable)), | |||
unit_name (new_uri(LV2_UNITS__name)), | |||
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; | |||
if (lilvPort.has_property(lv2World.pprop_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)) | |||
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; | |||
else if (std::strcmp(designation, LV2_TIME__speed) == 0) | |||
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) | |||
pass(); | |||
else if (std::strncmp(designation, LV2_PORT_GROUPS_PREFIX, std::strlen(LV2_PORT_GROUPS_PREFIX)) == 0) | |||