Signed-off-by: falkTX <falktx@falktx.com>tags/v1.7
@@ -29,15 +29,23 @@ list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") | |||
include(DPF-plugin) | |||
if(DPF_LIBRARIES) | |||
if(NOT (MSVC OR APPLE)) # TODO skip this one for now | |||
dpf__add_dgl_cairo() | |||
find_package(PkgConfig) | |||
if(PKG_CONFIG_FOUND) | |||
pkg_check_modules(CAIRO "cairo") | |||
if(CAIRO_FOUND) | |||
dpf__add_dgl_cairo(FALSE) | |||
endif() | |||
endif() | |||
dpf__add_dgl_opengl() | |||
dpf__add_dgl_opengl(FALSE) | |||
endif() | |||
if(DPF_EXAMPLES) | |||
if(NOT (MSVC OR APPLE)) # TODO skip this one for now | |||
add_subdirectory("examples/CairoUI") | |||
find_package(PkgConfig) | |||
if(PKG_CONFIG_FOUND) | |||
pkg_check_modules(CAIRO "cairo") | |||
if(CAIRO_FOUND) | |||
add_subdirectory("examples/CairoUI") | |||
endif() | |||
endif() | |||
#add_subdirectory("examples/ExternalUI") | |||
add_subdirectory("examples/FileHandling") | |||
@@ -1,4 +1,4 @@ | |||
Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
Copyright (C) 2012-2022 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 | |||
@@ -272,7 +272,7 @@ BASE_OPTS = -O2 -ffast-math -fdata-sections -ffunction-sections | |||
endif | |||
ifeq ($(DEBUG),true) | |||
BASE_FLAGS += -DDEBUG -O0 -g | |||
BASE_FLAGS += -DDEBUG -O0 -g -fsanitize=address | |||
LINK_OPTS = | |||
ifeq ($(WASM),true) | |||
LINK_OPTS += -sASSERTIONS=1 | |||
@@ -284,7 +284,10 @@ endif | |||
ifeq ($(WITH_LTO),true) | |||
BASE_FLAGS += -fno-strict-aliasing -flto | |||
LINK_OPTS += -fno-strict-aliasing -flto -Werror=odr -Werror=lto-type-mismatch | |||
LINK_OPTS += -fno-strict-aliasing -flto -Werror=odr | |||
ifeq ($(GCC),true) | |||
LINK_OPTS += -Werror=lto-type-mismatch | |||
endif | |||
endif | |||
BUILD_C_FLAGS = $(BASE_FLAGS) -std=gnu99 $(CFLAGS) | |||
@@ -574,11 +577,11 @@ BUILD_CXX_FLAGS += -DDGL_WINDOWS_ICON_ID=$(WINDOWS_ICON_ID) | |||
endif | |||
ifeq ($(USE_GLES2),true) | |||
BUILD_CXX_FLAGS += -DDGL_USE_GLES -DDGL_USE_GLES2 | |||
BUILD_CXX_FLAGS += -DDGL_USE_OPENGL3 -DDGL_USE_GLES -DDGL_USE_GLES2 | |||
endif | |||
ifeq ($(USE_GLES3),true) | |||
BUILD_CXX_FLAGS += -DDGL_USE_GLES -DDGL_USE_GLES3 | |||
BUILD_CXX_FLAGS += -DDGL_USE_OPENGL3 -DDGL_USE_GLES -DDGL_USE_GLES3 | |||
endif | |||
ifeq ($(USE_OPENGL3),true) | |||
@@ -716,6 +719,9 @@ MOD_ENVIRONMENT = \ | |||
CXXFLAGS="-I${1}/staging/usr/include $(EXTRA_MOD_FLAGS)" \ | |||
LDFLAGS="-L${1}/staging/usr/lib $(EXTRA_MOD_FLAGS)" \ | |||
EXE_WRAPPER="qemu-${3}-static -L ${1}/target" \ | |||
HAVE_CAIRO=false \ | |||
HAVE_OPENGL=false \ | |||
MOD_BUILD=true \ | |||
NOOPT=true | |||
modduo: | |||
@@ -400,6 +400,7 @@ clean: | |||
rm -rf $(TARGET_DIR)/$(NAME).lv2 | |||
rm -rf $(TARGET_DIR)/$(NAME).vst | |||
rm -rf $(TARGET_DIR)/$(NAME).vst3 | |||
rm -rf $(TARGET_DIR)/$(NAME).clap | |||
# --------------------------------------------------------------------------------------------------------------------- | |||
# DGL | |||
@@ -1,5 +1,6 @@ | |||
# DISTRHO Plugin Framework (DPF) | |||
# Copyright (C) 2021 Jean Pierre Cimalando <jp-dev@inbox.ru> | |||
# Copyright (C) 2022 Filipe Coelho <falktx@falktx.com> | |||
# | |||
# SPDX-License-Identifier: ISC | |||
@@ -22,7 +23,7 @@ | |||
# add_subdirectory(DPF) | |||
# | |||
# dpf_add_plugin(MyPlugin | |||
# TARGETS lv2 vst2 vst3 | |||
# TARGETS clap lv2 vst2 vst3 | |||
# UI_TYPE opengl | |||
# FILES_DSP | |||
# src/MyPlugin.cpp | |||
@@ -71,7 +72,7 @@ include(CMakeParseArguments) | |||
# | |||
# `TARGETS` <tgt1>...<tgtN> | |||
# a list of one of more of the following target types: | |||
# `jack`, `ladspa`, `dssi`, `lv2`, `vst2`, `vst3` | |||
# `jack`, `ladspa`, `dssi`, `lv2`, `vst2`, `vst3`, `clap` | |||
# | |||
# `UI_TYPE` <type> | |||
# the user interface type: `opengl` (default), `cairo` | |||
@@ -90,7 +91,7 @@ include(CMakeParseArguments) | |||
# list of sources which are part of both DSP and UI | |||
# | |||
function(dpf_add_plugin NAME) | |||
set(options MONOLITHIC) | |||
set(options MONOLITHIC NO_SHARED_RESOURCES) | |||
set(oneValueArgs UI_TYPE) | |||
set(multiValueArgs TARGETS FILES_DSP FILES_UI FILES_COMMON) | |||
cmake_parse_arguments(_dpf_plugin "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) | |||
@@ -102,10 +103,10 @@ function(dpf_add_plugin NAME) | |||
set(_dgl_library) | |||
if(_dpf_plugin_FILES_UI) | |||
if(_dpf_plugin_UI_TYPE STREQUAL "cairo") | |||
dpf__add_dgl_cairo() | |||
dpf__add_dgl_cairo("${_dpf_plugin_NO_SHARED_RESOURCES}") | |||
set(_dgl_library dgl-cairo) | |||
elseif(_dpf_plugin_UI_TYPE STREQUAL "opengl") | |||
dpf__add_dgl_opengl() | |||
dpf__add_dgl_opengl("${_dpf_plugin_NO_SHARED_RESOURCES}") | |||
set(_dgl_library dgl-opengl) | |||
else() | |||
message(FATAL_ERROR "Unrecognized UI type for plugin: ${_dpf_plugin_UI_TYPE}") | |||
@@ -162,6 +163,8 @@ function(dpf_add_plugin NAME) | |||
dpf__build_vst2("${NAME}" "${_dgl_library}") | |||
elseif(_target STREQUAL "vst3") | |||
dpf__build_vst3("${NAME}" "${_dgl_library}") | |||
elseif(_target STREQUAL "clap") | |||
dpf__build_clap("${NAME}" "${_dgl_library}") | |||
else() | |||
message(FATAL_ERROR "Unrecognized target type for plugin: ${_target}") | |||
endif() | |||
@@ -179,7 +182,7 @@ endfunction() | |||
# dpf__build_jack | |||
# ------------------------------------------------------------------------------ | |||
# | |||
# Add build rules for a JACK program. | |||
# Add build rules for a JACK/Standalone program. | |||
# | |||
function(dpf__build_jack NAME DGL_LIBRARY) | |||
dpf__create_dummy_source_list(_no_srcs) | |||
@@ -192,11 +195,51 @@ function(dpf__build_jack NAME DGL_LIBRARY) | |||
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>" | |||
OUTPUT_NAME "${NAME}") | |||
target_compile_definitions("${NAME}" PUBLIC "HAVE_JACK") | |||
find_package(PkgConfig) | |||
pkg_check_modules(SDL2 "sdl2") | |||
if(SDL2_FOUND) | |||
target_compile_definitions("${NAME}" PUBLIC "HAVE_SDL2") | |||
target_include_directories("${NAME}-jack" PRIVATE ${SDL2_INCLUDE_DIRS}) | |||
target_link_libraries("${NAME}-jack" PRIVATE ${SDL2_LIBRARIES}) | |||
dpf__target_link_directories("${NAME}-jack" ${SDL2_LIBRARY_DIRS}) | |||
endif() | |||
if(APPLE OR WIN32) | |||
target_compile_definitions("${NAME}" PUBLIC "HAVE_RTAUDIO") | |||
else() | |||
find_package(Threads) | |||
pkg_check_modules(ALSA "alsa") | |||
pkg_check_modules(PULSEAUDIO "libpulse-simple") | |||
if(ALSA_FOUND) | |||
target_compile_definitions("${NAME}" PUBLIC "HAVE_ALSA") | |||
target_include_directories("${NAME}-jack" PRIVATE ${ALSA_INCLUDE_DIRS}) | |||
target_link_libraries("${NAME}-jack" PRIVATE ${ALSA_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) | |||
dpf__target_link_directories("${NAME}-jack" ${ALSA_LIBRARY_DIRS}) | |||
endif() | |||
if(PULSEAUDIO_FOUND) | |||
target_compile_definitions("${NAME}" PUBLIC "HAVE_PULSEAUDIO") | |||
target_include_directories("${NAME}-jack" PRIVATE ${PULSEAUDIO_INCLUDE_DIRS}) | |||
target_link_libraries("${NAME}-jack" PRIVATE ${PULSEAUDIO_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) | |||
dpf__target_link_directories("${NAME}-jack" ${PULSEAUDIO_LIBRARY_DIRS}) | |||
endif() | |||
if(ALSA_FOUND OR PULSEAUDIO_FOUND) | |||
target_compile_definitions("${NAME}" PUBLIC "HAVE_RTAUDIO") | |||
endif() | |||
endif() | |||
# for RtAudio native fallback | |||
if(APPLE) | |||
find_library(APPLE_COREAUDIO_FRAMEWORK "CoreAudio") | |||
find_library(APPLE_COREFOUNDATION_FRAMEWORK "CoreFoundation") | |||
target_link_libraries("${NAME}-jack" PRIVATE "${APPLE_COREAUDIO_FRAMEWORK}" "${APPLE_COREFOUNDATION_FRAMEWORK}") | |||
find_library(APPLE_COREMIDI_FRAMEWORK "CoreMIDI") | |||
target_link_libraries("${NAME}-jack" PRIVATE | |||
"${APPLE_COREAUDIO_FRAMEWORK}" | |||
"${APPLE_COREFOUNDATION_FRAMEWORK}" | |||
"${APPLE_COREMIDI_FRAMEWORK}") | |||
elseif(WIN32) | |||
target_link_libraries("${NAME}-jack" PRIVATE "dsound" "ole32" "winmm") | |||
endif() | |||
endfunction() | |||
@@ -233,8 +276,6 @@ function(dpf__build_dssi NAME DGL_LIBRARY) | |||
return() | |||
endif() | |||
link_directories(${LIBLO_LIBRARY_DIRS}) | |||
dpf__create_dummy_source_list(_no_srcs) | |||
dpf__add_module("${NAME}-dssi" ${_no_srcs}) | |||
@@ -255,8 +296,10 @@ function(dpf__build_dssi NAME DGL_LIBRARY) | |||
RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}-dssi/$<0:>" | |||
OUTPUT_NAME "${NAME}_ui") | |||
target_compile_definitions("${NAME}" PUBLIC "HAVE_LIBLO") | |||
target_include_directories("${NAME}-dssi-ui" PRIVATE ${LIBLO_INCLUDE_DIRS}) | |||
target_link_libraries("${NAME}-dssi-ui" PRIVATE ${LIBLO_LIBRARIES}) | |||
dpf__target_link_directories("${NAME}-dssi-ui" ${LIBLO_LIBRARY_DIRS}) | |||
endif() | |||
endfunction() | |||
@@ -306,6 +349,7 @@ function(dpf__build_lv2 NAME DGL_LIBRARY MONOLITHIC) | |||
add_custom_command(TARGET "${NAME}-lv2" POST_BUILD | |||
COMMAND | |||
${CMAKE_CROSSCOMPILING_EMULATOR} | |||
"$<TARGET_FILE:lv2_ttl_generator>" | |||
"$<TARGET_FILE:${NAME}-lv2>" | |||
WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.lv2" | |||
@@ -432,12 +476,45 @@ function(dpf__build_vst3 NAME DGL_LIBRARY) | |||
endif() | |||
endfunction() | |||
# dpf__build_clap | |||
# ------------------------------------------------------------------------------ | |||
# | |||
# Add build rules for a VST2 plugin. | |||
# | |||
function(dpf__build_clap NAME DGL_LIBRARY) | |||
dpf__create_dummy_source_list(_no_srcs) | |||
dpf__add_module("${NAME}-clap" ${_no_srcs}) | |||
dpf__add_plugin_main("${NAME}-clap" "clap") | |||
dpf__add_ui_main("${NAME}-clap" "clap" "${DGL_LIBRARY}") | |||
dpf__set_module_export_list("${NAME}-clap" "clap") | |||
target_link_libraries("${NAME}-clap" PRIVATE "${NAME}-dsp" "${NAME}-ui") | |||
set_target_properties("${NAME}-clap" PROPERTIES | |||
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>" | |||
ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/clap/$<0:>" | |||
OUTPUT_NAME "${NAME}" | |||
PREFIX "" | |||
SUFFIX ".clap") | |||
if(APPLE) | |||
set_target_properties("${NAME}-clap" PROPERTIES | |||
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.clap/Contents/MacOS/$<0:>" | |||
OUTPUT_NAME "${NAME}" | |||
SUFFIX "") | |||
set(INFO_PLIST_PROJECT_NAME "${NAME}") | |||
configure_file("${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/Info.plist" | |||
"${PROJECT_BINARY_DIR}/bin/${NAME}.clap/Contents/Info.plist" @ONLY) | |||
file(COPY "${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/PkgInfo" | |||
DESTINATION "${PROJECT_BINARY_DIR}/bin/${NAME}.clap/Contents") | |||
endif() | |||
endfunction() | |||
# dpf__add_dgl_cairo | |||
# ------------------------------------------------------------------------------ | |||
# | |||
# Add the Cairo variant of DGL, if not already available. | |||
# | |||
function(dpf__add_dgl_cairo) | |||
function(dpf__add_dgl_cairo NO_SHARED_RESOURCES) | |||
if(TARGET dgl-cairo) | |||
return() | |||
endif() | |||
@@ -455,7 +532,6 @@ function(dpf__add_dgl_cairo) | |||
"${DPF_ROOT_DIR}/dgl/src/Geometry.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/Resources.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp" | |||
@@ -465,11 +541,16 @@ function(dpf__add_dgl_cairo) | |||
"${DPF_ROOT_DIR}/dgl/src/Window.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/Cairo.cpp") | |||
if(NO_SHARED_RESOURCES) | |||
target_compile_definitions(dgl-cairo PUBLIC "DGL_NO_SHARED_RESOURCES") | |||
else() | |||
target_sources(dgl-cairo PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp") | |||
endif() | |||
if(NOT APPLE) | |||
target_sources(dgl-cairo PRIVATE | |||
"${DPF_ROOT_DIR}/dgl/src/pugl.cpp") | |||
else() | |||
target_sources(dgl-opengl PRIVATE | |||
target_sources(dgl-cairo PRIVATE | |||
"${DPF_ROOT_DIR}/dgl/src/pugl.mm") | |||
endif() | |||
target_include_directories(dgl-cairo PUBLIC | |||
@@ -497,7 +578,7 @@ endfunction() | |||
# | |||
# Add the OpenGL variant of DGL, if not already available. | |||
# | |||
function(dpf__add_dgl_opengl) | |||
function(dpf__add_dgl_opengl NO_SHARED_RESOURCES) | |||
if(TARGET dgl-opengl) | |||
return() | |||
endif() | |||
@@ -516,7 +597,6 @@ function(dpf__add_dgl_opengl) | |||
"${DPF_ROOT_DIR}/dgl/src/Geometry.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/Resources.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp" | |||
@@ -527,6 +607,11 @@ function(dpf__add_dgl_opengl) | |||
"${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/OpenGL.cpp" | |||
"${DPF_ROOT_DIR}/dgl/src/NanoVG.cpp") | |||
if(NO_SHARED_RESOURCES) | |||
target_compile_definitions(dgl-opengl PUBLIC "DGL_NO_SHARED_RESOURCES") | |||
else() | |||
target_sources(dgl-opengl PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp") | |||
endif() | |||
if(NOT APPLE) | |||
target_sources(dgl-opengl PRIVATE | |||
"${DPF_ROOT_DIR}/dgl/src/pugl.cpp") | |||
@@ -700,6 +785,9 @@ function(dpf__set_target_defaults NAME) | |||
target_compile_options("${NAME}" PUBLIC "/UTF-8") | |||
target_compile_definitions("${NAME}" PUBLIC "_CRT_SECURE_NO_WARNINGS") | |||
endif() | |||
if (CMAKE_COMPILER_IS_GNUCXX) | |||
target_compile_options("${NAME}" PUBLIC "-fno-gnu-unique") | |||
endif() | |||
endfunction() | |||
# dpf__add_plugin_main | |||
@@ -784,6 +872,20 @@ macro(dpf__create_dummy_source_list VAR) | |||
endif() | |||
endmacro() | |||
# dpf__target_link_directories | |||
# ------------------------------------------------------------------------------ | |||
# | |||
# Call `target_link_directories` if cmake >= 3.13, | |||
# otherwise fallback to global `link_directories`. | |||
# | |||
macro(dpf__target_link_directories NAME DIRS) | |||
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13") | |||
target_link_directories("${NAME}" PUBLIC ${DIRS}) | |||
else() | |||
link_directories(${DIRS}) | |||
endif() | |||
endmacro() | |||
# dpf__warn_once | |||
# ------------------------------------------------------------------------------ | |||
# | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* Copyright (C) 2012-2022 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 | |||
@@ -70,6 +70,30 @@ struct Color { | |||
*/ | |||
Color withAlpha(float alpha) const noexcept; | |||
/** | |||
Create a new color based on this one but with subtracted numeric value on all elements. | |||
Value must be in [0..255] range. | |||
*/ | |||
Color minus(int value) const noexcept; | |||
/** | |||
Create a new color based on this one but with subtracted floating-point value on all elements. | |||
Value must be in [0..1] range. | |||
*/ | |||
Color minus(float value) const noexcept; | |||
/** | |||
Create a new color based on this one but with added numeric value on all elements. | |||
Value must be in [0..255] range. | |||
*/ | |||
Color plus(int value) const noexcept; | |||
/** | |||
Create a new color based on this one but with added floating-point value on all elements. | |||
Value must be in [0..1] range. | |||
*/ | |||
Color plus(float value) const noexcept; | |||
/** | |||
Create a color specified by hue, saturation and lightness. | |||
Values must in [0..1] range. | |||
@@ -22,13 +22,16 @@ | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// Fix OpenGL includes for Windows, based on glfw code (part 1) | |||
#undef DGL_CALLBACK_DEFINED | |||
#undef DGL_WINGDIAPI_DEFINED | |||
#ifdef DISTRHO_OS_WINDOWS | |||
#ifndef WINAPI | |||
# define WINAPI __stdcall | |||
#endif | |||
#ifndef APIENTRY | |||
# define APIENTRY __stdcall | |||
# define APIENTRY WINAPI | |||
#endif // APIENTRY | |||
/* We need WINGDIAPI defined */ | |||
@@ -43,20 +46,6 @@ | |||
# define DGL_WINGDIAPI_DEFINED | |||
#endif // WINGDIAPI | |||
/* Some <GL/glu.h> files also need CALLBACK defined */ | |||
#ifndef CALLBACK | |||
# if defined(_MSC_VER) | |||
# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) | |||
# define CALLBACK __stdcall | |||
# else | |||
# define CALLBACK | |||
# endif | |||
# else | |||
# define CALLBACK __stdcall | |||
# endif | |||
# define DGL_CALLBACK_DEFINED | |||
#endif // CALLBACK | |||
#endif // DISTRHO_OS_WINDOWS | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
@@ -97,11 +86,6 @@ | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// Fix OpenGL includes for Windows, based on glfw code (part 2) | |||
#ifdef DGL_CALLBACK_DEFINED | |||
# undef CALLBACK | |||
# undef DGL_CALLBACK_DEFINED | |||
#endif | |||
#ifdef DGL_WINGDIAPI_DEFINED | |||
# undef WINGDIAPI | |||
# undef DGL_WINGDIAPI_DEFINED | |||
@@ -448,19 +448,24 @@ protected: | |||
A function called when a special key is pressed or released. | |||
DEPRECATED use onKeyboard or onCharacterInput | |||
*/ | |||
#if defined(__clang__) | |||
# pragma clang diagnostic push | |||
# pragma clang diagnostic ignored "-Wdeprecated-declarations" | |||
#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 460 | |||
# pragma GCC diagnostic push | |||
# pragma GCC diagnostic ignored "-Wdeprecated-declarations" | |||
#endif | |||
#if defined(_MSC_VER) | |||
#pragma warning(push) | |||
#pragma warning(disable:4996) | |||
#elif defined(__clang__) | |||
#pragma clang diagnostic push | |||
#pragma clang diagnostic ignored "-Wdeprecated-declarations" | |||
#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 460 | |||
#pragma GCC diagnostic push | |||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" | |||
#endif | |||
virtual bool onSpecial(const SpecialEvent&) { return false; } | |||
#if defined(__clang__) | |||
# pragma clang diagnostic pop | |||
#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 460 | |||
# pragma GCC diagnostic pop | |||
#endif | |||
#if defined(_MSC_VER) | |||
#pragma warning(pop) | |||
#elif defined(__clang__) | |||
#pragma clang diagnostic pop | |||
#elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 460 | |||
#pragma GCC diagnostic pop | |||
#endif | |||
private: | |||
struct PrivateData; | |||
@@ -121,6 +121,48 @@ Color Color::withAlpha(const float alpha2) const noexcept | |||
return color; | |||
} | |||
Color Color::minus(const int value) const noexcept | |||
{ | |||
const float fvalue = static_cast<float>(value)/255.f; | |||
Color color(*this); | |||
color.red -= fvalue; | |||
color.green -= fvalue; | |||
color.blue -= fvalue; | |||
color.fixBounds(); | |||
return color; | |||
} | |||
Color Color::minus(const float value) const noexcept | |||
{ | |||
Color color(*this); | |||
color.red -= value; | |||
color.green -= value; | |||
color.blue -= value; | |||
color.fixBounds(); | |||
return color; | |||
} | |||
Color Color::plus(const int value) const noexcept | |||
{ | |||
const float fvalue = static_cast<float>(value)/255.f; | |||
Color color(*this); | |||
color.red += fvalue; | |||
color.green += fvalue; | |||
color.blue += fvalue; | |||
color.fixBounds(); | |||
return color; | |||
} | |||
Color Color::plus(const float value) const noexcept | |||
{ | |||
Color color(*this); | |||
color.red += value; | |||
color.green += value; | |||
color.blue += value; | |||
color.fixBounds(); | |||
return color; | |||
} | |||
Color Color::fromHSL(float hue, float saturation, float lightness, float alpha) | |||
{ | |||
float m1, m2; | |||
@@ -187,12 +187,24 @@ void ImageBaseButton<ImageType>::onDisplay() | |||
const State state = ButtonEventHandler::getState(); | |||
if (state & kButtonStateActive) | |||
pData->imageDown.draw(context); | |||
else if (state & kButtonStateHover) | |||
pData->imageHover.draw(context); | |||
if (ButtonEventHandler::isCheckable()) | |||
{ | |||
if (ButtonEventHandler::isChecked()) | |||
pData->imageDown.draw(context); | |||
else if (state & kButtonStateHover) | |||
pData->imageHover.draw(context); | |||
else | |||
pData->imageNormal.draw(context); | |||
} | |||
else | |||
pData->imageNormal.draw(context); | |||
{ | |||
if (state & kButtonStateActive) | |||
pData->imageDown.draw(context); | |||
else if (state & kButtonStateHover) | |||
pData->imageHover.draw(context); | |||
else | |||
pData->imageNormal.draw(context); | |||
} | |||
} | |||
template <class ImageType> | |||
@@ -14,6 +14,11 @@ | |||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
*/ | |||
#ifdef _MSC_VER | |||
// instantiated template classes whose methods are defined elsewhere | |||
# pragma warning(disable:4661) | |||
#endif | |||
#include "../NanoVG.hpp" | |||
#include "SubWidgetPrivateData.hpp" | |||
@@ -35,17 +35,7 @@ START_NAMESPACE_DGL | |||
// ----------------------------------------------------------------------- | |||
#if defined(DGL_USE_GLES2) | |||
static void notImplemented(const char* const name) | |||
{ | |||
// d_stderr2("GLES2 function not implemented: %s", name); | |||
} | |||
#elif defined(DGL_USE_GLES3) | |||
static void notImplemented(const char* const name) | |||
{ | |||
d_stderr2("GLES3 function not implemented: %s", name); | |||
} | |||
#elif defined(DGL_USE_OPENGL3) | |||
#ifdef DGL_USE_OPENGL3 | |||
static void notImplemented(const char* const name) | |||
{ | |||
d_stderr2("OpenGL3 function not implemented: %s", name); | |||
@@ -178,7 +178,10 @@ puglKeyCallback(const int eventType, const EmscriptenKeyboardEvent* const keyEve | |||
const PuglKey special = keyCodeToSpecial(keyEvent->keyCode, keyEvent->location); | |||
uint key = keyEvent->keyCode; | |||
uint key = keyEvent->key[0] >= ' ' && keyEvent->key[0] <= '~' && keyEvent->key[1] == '\0' | |||
? keyEvent->key[0] | |||
: keyEvent->keyCode; | |||
if (key >= 'A' && key <= 'Z' && !keyEvent->shiftKey) | |||
key += 'a' - 'A'; | |||
@@ -251,6 +254,11 @@ puglMouseCallback(const int eventType, const EmscriptenMouseEvent* const mouseEv | |||
const double scaleFactor = view->world->impl->scaleFactor; | |||
// workaround missing pointer lock callback, see https://github.com/emscripten-core/emscripten/issues/9681 | |||
EmscriptenPointerlockChangeEvent e; | |||
if (emscripten_get_pointerlock_status(&e) == EMSCRIPTEN_RESULT_SUCCESS) | |||
view->impl->pointerLocked = e.isActive; | |||
switch (eventType) { | |||
case EMSCRIPTEN_EVENT_MOUSEDOWN: | |||
case EMSCRIPTEN_EVENT_MOUSEUP: | |||
@@ -214,12 +214,12 @@ void puglSetMatchingBackendForCurrentBuild(PuglView* const view) | |||
if (view->backend != nullptr) | |||
{ | |||
#ifdef DGL_OPENGL | |||
#if defined(DGL_USE_OPENGL3) || defined(DGL_USE_GLES3) | |||
puglSetViewHint(view, PUGL_USE_COMPAT_PROFILE, PUGL_FALSE); | |||
puglSetViewHint(view, PUGL_CONTEXT_VERSION_MAJOR, 3); | |||
#elif defined(DGL_USE_GLES2) | |||
#if defined(DGL_USE_GLES2) | |||
puglSetViewHint(view, PUGL_USE_COMPAT_PROFILE, PUGL_FALSE); | |||
puglSetViewHint(view, PUGL_CONTEXT_VERSION_MAJOR, 2); | |||
#elif defined(DGL_USE_OPENGL3) | |||
puglSetViewHint(view, PUGL_USE_COMPAT_PROFILE, PUGL_FALSE); | |||
puglSetViewHint(view, PUGL_CONTEXT_VERSION_MAJOR, 3); | |||
#else | |||
puglSetViewHint(view, PUGL_USE_COMPAT_PROFILE, PUGL_TRUE); | |||
puglSetViewHint(view, PUGL_CONTEXT_VERSION_MAJOR, 2); | |||
@@ -763,6 +763,27 @@ struct State { | |||
*/ | |||
String description; | |||
#ifdef __MOD_DEVICES__ | |||
/** | |||
The file types that a filename path state supports, written as a comma-separated string without whitespace. | |||
Currently supported file types are: | |||
- audioloop: Audio Loops, meant to be used for looper-style plugins | |||
- audiorecording: Audio Recordings, triggered by plugins and stored in the unit | |||
- audiosample: One-shot Audio Samples, meant to be used for sampler-style plugins | |||
- audiotrack: Audio Tracks, meant to be used as full-performance/song or backtrack | |||
- cabsim: Speaker Cabinets, meant as small IR audio files | |||
- h2drumkit: Hydrogen Drumkits, must use h2drumkit file extension | |||
- ir: Impulse Responses | |||
- midiclip: MIDI Clips, to be used in sync with host tempo, must have mid or midi file extension | |||
- midisong: MIDI Songs, meant to be used as full-performance/song or backtrack | |||
- sf2: SF2 Instruments, must have sf2 or sf3 file extension | |||
- sfz: SFZ Instruments, must have sfz file extension | |||
@note This is a custom extension only valid in builds MOD Audio. | |||
*/ | |||
String fileTypes; | |||
#endif | |||
/** | |||
Default constructor for a null state. | |||
*/ | |||
@@ -50,7 +50,7 @@ START_NAMESPACE_DISTRHO | |||
#define DISTRHO_JOIN_MACRO_HELPER(a, b) a ## b | |||
#define DISTRHO_JOIN_MACRO(item1, item2) DISTRHO_JOIN_MACRO_HELPER(item1, item2) | |||
#ifdef DEBUG | |||
#if defined(DEBUG) && !defined(NDEBUG) | |||
/** This macro lets you embed a leak-detecting object inside a class.\n | |||
To use it, simply declare a DISTRHO_LEAK_DETECTOR(YourClassName) inside a private section | |||
of the class declaration. E.g. | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* Copyright (C) 2012-2022 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 | |||
@@ -27,7 +27,13 @@ | |||
# include <windows.h> | |||
#endif | |||
// FIXME make Mutex stop relying on pthread | |||
#ifdef _MSC_VER | |||
#define DISTRHO_OS_WINDOWS__TODO | |||
#pragma NOTE(DPF Mutex implementation is TODO on MSVC) | |||
#else | |||
#include <pthread.h> | |||
#endif | |||
START_NAMESPACE_DISTRHO | |||
@@ -43,14 +49,20 @@ public: | |||
* Constructor. | |||
*/ | |||
Mutex(const bool inheritPriority = true) noexcept | |||
#ifdef DISTRHO_OS_WINDOWS__TODO | |||
#else | |||
: fMutex() | |||
#endif | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS__TODO | |||
#else | |||
pthread_mutexattr_t attr; | |||
pthread_mutexattr_init(&attr); | |||
pthread_mutexattr_setprotocol(&attr, inheritPriority ? PTHREAD_PRIO_INHERIT : PTHREAD_PRIO_NONE); | |||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); | |||
pthread_mutex_init(&fMutex, &attr); | |||
pthread_mutexattr_destroy(&attr); | |||
#endif | |||
} | |||
/* | |||
@@ -58,7 +70,10 @@ public: | |||
*/ | |||
~Mutex() noexcept | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS__TODO | |||
#else | |||
pthread_mutex_destroy(&fMutex); | |||
#endif | |||
} | |||
/* | |||
@@ -66,7 +81,10 @@ public: | |||
*/ | |||
bool lock() const noexcept | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS__TODO | |||
#else | |||
return (pthread_mutex_lock(&fMutex) == 0); | |||
#endif | |||
} | |||
/* | |||
@@ -75,7 +93,10 @@ public: | |||
*/ | |||
bool tryLock() const noexcept | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS__TODO | |||
#else | |||
return (pthread_mutex_trylock(&fMutex) == 0); | |||
#endif | |||
} | |||
/* | |||
@@ -83,11 +104,17 @@ public: | |||
*/ | |||
void unlock() const noexcept | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS__TODO | |||
#else | |||
pthread_mutex_unlock(&fMutex); | |||
#endif | |||
} | |||
private: | |||
#ifdef DISTRHO_OS_WINDOWS__TODO | |||
#else | |||
mutable pthread_mutex_t fMutex; | |||
#endif | |||
DISTRHO_DECLARE_NON_COPYABLE(Mutex) | |||
}; | |||
@@ -102,22 +129,22 @@ public: | |||
* Constructor. | |||
*/ | |||
RecursiveMutex() noexcept | |||
#ifdef DISTRHO_OS_WINDOWS | |||
#ifdef DISTRHO_OS_WINDOWS | |||
: fSection() | |||
#else | |||
#else | |||
: fMutex() | |||
#endif | |||
#endif | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS | |||
#ifdef DISTRHO_OS_WINDOWS | |||
InitializeCriticalSection(&fSection); | |||
#else | |||
#else | |||
pthread_mutexattr_t attr; | |||
pthread_mutexattr_init(&attr); | |||
pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT); | |||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); | |||
pthread_mutex_init(&fMutex, &attr); | |||
pthread_mutexattr_destroy(&attr); | |||
#endif | |||
#endif | |||
} | |||
/* | |||
@@ -125,11 +152,11 @@ public: | |||
*/ | |||
~RecursiveMutex() noexcept | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS | |||
#ifdef DISTRHO_OS_WINDOWS | |||
DeleteCriticalSection(&fSection); | |||
#else | |||
#else | |||
pthread_mutex_destroy(&fMutex); | |||
#endif | |||
#endif | |||
} | |||
/* | |||
@@ -137,12 +164,12 @@ public: | |||
*/ | |||
bool lock() const noexcept | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS | |||
#ifdef DISTRHO_OS_WINDOWS | |||
EnterCriticalSection(&fSection); | |||
return true; | |||
#else | |||
#else | |||
return (pthread_mutex_lock(&fMutex) == 0); | |||
#endif | |||
#endif | |||
} | |||
/* | |||
@@ -151,11 +178,11 @@ public: | |||
*/ | |||
bool tryLock() const noexcept | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS | |||
#ifdef DISTRHO_OS_WINDOWS | |||
return (TryEnterCriticalSection(&fSection) != FALSE); | |||
#else | |||
#else | |||
return (pthread_mutex_trylock(&fMutex) == 0); | |||
#endif | |||
#endif | |||
} | |||
/* | |||
@@ -163,23 +190,24 @@ public: | |||
*/ | |||
void unlock() const noexcept | |||
{ | |||
#ifdef DISTRHO_OS_WINDOWS | |||
#ifdef DISTRHO_OS_WINDOWS | |||
LeaveCriticalSection(&fSection); | |||
#else | |||
#else | |||
pthread_mutex_unlock(&fMutex); | |||
#endif | |||
#endif | |||
} | |||
private: | |||
#ifdef DISTRHO_OS_WINDOWS | |||
#ifdef DISTRHO_OS_WINDOWS | |||
mutable CRITICAL_SECTION fSection; | |||
#else | |||
#else | |||
mutable pthread_mutex_t fMutex; | |||
#endif | |||
#endif | |||
DISTRHO_DECLARE_NON_COPYABLE(RecursiveMutex) | |||
}; | |||
#ifndef _MSC_VER | |||
// ----------------------------------------------------------------------- | |||
// Signal class | |||
@@ -260,6 +288,7 @@ private: | |||
DISTRHO_PREVENT_HEAP_ALLOCATION | |||
DISTRHO_DECLARE_NON_COPYABLE(Signal) | |||
}; | |||
#endif // _MSC_VER | |||
// ----------------------------------------------------------------------- | |||
// Helper class to lock&unlock a mutex during a function scope. | |||
@@ -1,6 +1,6 @@ | |||
/* | |||
* DISTRHO Plugin Framework (DPF) | |||
* Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |||
* Copyright (C) 2012-2022 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 | |||
@@ -44,11 +44,11 @@ protected: | |||
: fLock(), | |||
fSignal(), | |||
fName(threadName), | |||
#ifdef PTW32_DLLPORT | |||
#ifdef PTW32_DLLPORT | |||
fHandle({nullptr, 0}), | |||
#else | |||
#else | |||
fHandle(0), | |||
#endif | |||
#endif | |||
fShouldExit(false) {} | |||
/* | |||
@@ -74,11 +74,11 @@ public: | |||
*/ | |||
bool isThreadRunning() const noexcept | |||
{ | |||
#ifdef PTW32_DLLPORT | |||
#ifdef PTW32_DLLPORT | |||
return (fHandle.p != nullptr); | |||
#else | |||
#else | |||
return (fHandle != 0); | |||
#endif | |||
#endif | |||
} | |||
/* | |||
@@ -102,26 +102,32 @@ public: | |||
pthread_attr_t attr; | |||
pthread_attr_init(&attr); | |||
struct sched_param sched_param; | |||
std::memset(&sched_param, 0, sizeof(sched_param)); | |||
struct sched_param sched_param = {}; | |||
if (withRealtimePriority) | |||
{ | |||
#ifdef __MOD_DEVICES__ | |||
int rtprio; | |||
const char* const srtprio = std::getenv("MOD_PLUGIN_THREAD_PRIORITY"); | |||
if (srtprio != nullptr && (rtprio = std::atoi(srtprio)) > 0) | |||
sched_param.sched_priority = rtprio - 1; | |||
else | |||
#endif | |||
sched_param.sched_priority = 80; | |||
#ifndef DISTRHO_OS_HAIKU | |||
#ifndef DISTRHO_OS_HAIKU | |||
if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0 && | |||
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0 && | |||
# ifndef DISTRHO_OS_WINDOWS | |||
#ifndef DISTRHO_OS_WINDOWS | |||
(pthread_attr_setschedpolicy(&attr, SCHED_FIFO) == 0 || | |||
pthread_attr_setschedpolicy(&attr, SCHED_RR) == 0) && | |||
# endif | |||
#endif | |||
pthread_attr_setschedparam(&attr, &sched_param) == 0) | |||
{ | |||
d_stdout("Thread setup with realtime priority successful"); | |||
} | |||
else | |||
#endif | |||
#endif | |||
{ | |||
d_stdout("Thread setup with realtime priority failed, going with normal priority instead"); | |||
pthread_attr_destroy(&attr); | |||
@@ -145,11 +151,11 @@ public: | |||
} | |||
DISTRHO_SAFE_ASSERT_RETURN(ok, false); | |||
#ifdef PTW32_DLLPORT | |||
#ifdef PTW32_DLLPORT | |||
DISTRHO_SAFE_ASSERT_RETURN(handle.p != nullptr, false); | |||
#else | |||
#else | |||
DISTRHO_SAFE_ASSERT_RETURN(handle != 0, false); | |||
#endif | |||
#endif | |||
pthread_detach(handle); | |||
_copyFrom(handle); | |||
@@ -244,12 +250,12 @@ public: | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); | |||
#ifdef DISTRHO_OS_LINUX | |||
#ifdef DISTRHO_OS_LINUX | |||
prctl(PR_SET_NAME, name, 0, 0, 0); | |||
#endif | |||
#if defined(__GLIBC__) && (__GLIBC__ * 1000 + __GLIBC_MINOR__) >= 2012 && !defined(DISTRHO_OS_GNU_HURD) | |||
#endif | |||
#if defined(__GLIBC__) && (__GLIBC__ * 1000 + __GLIBC_MINOR__) >= 2012 && !defined(DISTRHO_OS_GNU_HURD) | |||
pthread_setname_np(pthread_self(), name); | |||
#endif | |||
#endif | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -266,12 +272,12 @@ private: | |||
*/ | |||
void _init() noexcept | |||
{ | |||
#ifdef PTW32_DLLPORT | |||
#ifdef PTW32_DLLPORT | |||
fHandle.p = nullptr; | |||
fHandle.x = 0; | |||
#else | |||
#else | |||
fHandle = 0; | |||
#endif | |||
#endif | |||
} | |||
/* | |||
@@ -279,12 +285,12 @@ private: | |||
*/ | |||
void _copyFrom(const pthread_t& handle) noexcept | |||
{ | |||
#ifdef PTW32_DLLPORT | |||
#ifdef PTW32_DLLPORT | |||
fHandle.p = handle.p; | |||
fHandle.x = handle.x; | |||
#else | |||
#else | |||
fHandle = handle; | |||
#endif | |||
#endif | |||
} | |||
/* | |||
@@ -292,12 +298,12 @@ private: | |||
*/ | |||
void _copyTo(volatile pthread_t& handle) const noexcept | |||
{ | |||
#ifdef PTW32_DLLPORT | |||
#ifdef PTW32_DLLPORT | |||
handle.p = fHandle.p; | |||
handle.x = fHandle.x; | |||
#else | |||
#else | |||
handle = fHandle; | |||
#endif | |||
#endif | |||
} | |||
/* | |||
@@ -195,7 +195,10 @@ void Plugin::initState(const uint32_t index, State& state) | |||
uint hints = 0x0; | |||
String stateKey, defaultStateValue; | |||
#if defined(__clang__) | |||
#if defined(_MSC_VER) | |||
#pragma warning(push) | |||
#pragma warning(disable:4996) | |||
#elif defined(__clang__) | |||
#pragma clang diagnostic push | |||
#pragma clang diagnostic ignored "-Wdeprecated-declarations" | |||
#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) | |||
@@ -205,7 +208,9 @@ void Plugin::initState(const uint32_t index, State& state) | |||
initState(index, stateKey, defaultStateValue); | |||
if (isStateFile(index)) | |||
hints = kStateIsFilenamePath; | |||
#if defined(__clang__) | |||
#if defined(_MSC_VER) | |||
#pragma warning(pop) | |||
#elif defined(__clang__) | |||
#pragma clang diagnostic pop | |||
#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) | |||
#pragma GCC diagnostic pop | |||
@@ -89,7 +89,7 @@ struct ClapEventQueue | |||
}; | |||
struct Queue { | |||
Mutex lock; | |||
RecursiveMutex lock; | |||
uint allocated; | |||
uint used; | |||
Event* events; | |||
@@ -106,7 +106,7 @@ struct ClapEventQueue | |||
void addEventFromUI(const Event& event) | |||
{ | |||
const MutexLocker cml(lock); | |||
const RecursiveMutexLocker crml(lock); | |||
if (events == nullptr) | |||
{ | |||
@@ -827,9 +827,9 @@ public: | |||
#if DISTRHO_PLUGIN_HAS_UI | |||
if (const clap_output_events_t* const outputEvents = process->out_events) | |||
{ | |||
const MutexTryLocker cmtl(fEventQueue.lock); | |||
const RecursiveMutexTryLocker crmtl(fEventQueue.lock); | |||
if (cmtl.wasLocked()) | |||
if (crmtl.wasLocked()) | |||
{ | |||
// reuse the same struct for gesture and parameters, they are compatible up to where it matters | |||
clap_event_param_value_t clapEvent = { | |||
@@ -1129,7 +1129,7 @@ public: | |||
if (hints & (kParameterIsBoolean|kParameterIsInteger)) | |||
info->flags |= CLAP_PARAM_IS_STEPPED; | |||
DISTRHO_NAMESPACE::strncpy(info->name, fPlugin.getParameterName(index), CLAP_NAME_SIZE); | |||
d_strncpy(info->name, fPlugin.getParameterName(index), CLAP_NAME_SIZE); | |||
uint wrtn; | |||
if (groupId != kPortGroupNone) | |||
@@ -1145,7 +1145,7 @@ public: | |||
wrtn = 0; | |||
} | |||
DISTRHO_NAMESPACE::strncpy(info->module + wrtn, fPlugin.getParameterSymbol(index), CLAP_PATH_SIZE - wrtn); | |||
d_strncpy(info->module + wrtn, fPlugin.getParameterSymbol(index), CLAP_PATH_SIZE - wrtn); | |||
} | |||
info->id = index; | |||
@@ -1182,7 +1182,7 @@ public: | |||
{ | |||
if (d_isEqual(static_cast<double>(enumValues.values[i].value), value)) | |||
{ | |||
DISTRHO_NAMESPACE::strncpy(display, enumValues.values[i].label, size); | |||
d_strncpy(display, enumValues.values[i].label, size); | |||
return true; | |||
} | |||
} | |||
@@ -1328,7 +1328,7 @@ public: | |||
const BusInfo& busInfo(busInfos[index]); | |||
info->id = busInfo.groupId; | |||
DISTRHO_NAMESPACE::strncpy(info->name, busInfo.name, CLAP_NAME_SIZE); | |||
d_strncpy(info->name, busInfo.name, CLAP_NAME_SIZE); | |||
info->flags = busInfo.isMain ? CLAP_AUDIO_PORT_IS_MAIN : 0x0; | |||
info->channel_count = busInfo.numChannels; | |||
@@ -1893,16 +1893,15 @@ private: | |||
case kPortGroupMono: | |||
if (busInfo.isMain) | |||
{ | |||
DISTRHO_NAMESPACE::strncpy(busInfo.name, | |||
isInput ? "Audio Input" : "Audio Output", CLAP_NAME_SIZE); | |||
d_strncpy(busInfo.name, isInput ? "Audio Input" : "Audio Output", CLAP_NAME_SIZE); | |||
break; | |||
} | |||
// fall-through | |||
default: | |||
if (group.name.isNotEmpty()) | |||
DISTRHO_NAMESPACE::strncpy(busInfo.name, group.name, CLAP_NAME_SIZE); | |||
d_strncpy(busInfo.name, group.name, CLAP_NAME_SIZE); | |||
else | |||
DISTRHO_NAMESPACE::strncpy(busInfo.name, port.name, CLAP_NAME_SIZE); | |||
d_strncpy(busInfo.name, port.name, CLAP_NAME_SIZE); | |||
break; | |||
} | |||
@@ -1935,7 +1934,7 @@ private: | |||
nonGroupSidechainId++ | |||
}; | |||
DISTRHO_NAMESPACE::strncpy(busInfo.name, port.name, CLAP_NAME_SIZE); | |||
d_strncpy(busInfo.name, port.name, CLAP_NAME_SIZE); | |||
busInfos.push_back(busInfo); | |||
} | |||
@@ -1961,12 +1960,11 @@ private: | |||
if (busInfo.isMain) | |||
{ | |||
DISTRHO_NAMESPACE::strncpy(busInfo.name, | |||
isInput ? "Audio Input" : "Audio Output", CLAP_NAME_SIZE); | |||
d_strncpy(busInfo.name, isInput ? "Audio Input" : "Audio Output", CLAP_NAME_SIZE); | |||
} | |||
else | |||
{ | |||
DISTRHO_NAMESPACE::strncpy(busInfo.name, port.name, CLAP_NAME_SIZE); | |||
d_strncpy(busInfo.name, port.name, CLAP_NAME_SIZE); | |||
} | |||
busInfos.push_back(busInfo); | |||
@@ -2312,37 +2310,37 @@ static const clap_plugin_note_ports_t clap_plugin_note_ports = { | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// plugin parameters | |||
static CLAP_ABI uint32_t clap_plugin_params_count(const clap_plugin_t* const plugin) | |||
static uint32_t CLAP_ABI clap_plugin_params_count(const clap_plugin_t* const plugin) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->getParameterCount(); | |||
} | |||
static CLAP_ABI bool clap_plugin_params_get_info(const clap_plugin_t* const plugin, const uint32_t index, clap_param_info_t* const info) | |||
static bool CLAP_ABI clap_plugin_params_get_info(const clap_plugin_t* const plugin, const uint32_t index, clap_param_info_t* const info) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->getParameterInfo(index, info); | |||
} | |||
static CLAP_ABI bool clap_plugin_params_get_value(const clap_plugin_t* const plugin, const clap_id param_id, double* const value) | |||
static bool CLAP_ABI clap_plugin_params_get_value(const clap_plugin_t* const plugin, const clap_id param_id, double* const value) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->getParameterValue(param_id, value); | |||
} | |||
static CLAP_ABI bool clap_plugin_params_value_to_text(const clap_plugin_t* plugin, const clap_id param_id, const double value, char* const display, const uint32_t size) | |||
static bool CLAP_ABI clap_plugin_params_value_to_text(const clap_plugin_t* plugin, const clap_id param_id, const double value, char* const display, const uint32_t size) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->getParameterStringForValue(param_id, value, display, size); | |||
} | |||
static CLAP_ABI bool clap_plugin_params_text_to_value(const clap_plugin_t* plugin, const clap_id param_id, const char* const display, double* const value) | |||
static bool CLAP_ABI clap_plugin_params_text_to_value(const clap_plugin_t* plugin, const clap_id param_id, const char* const display, double* const value) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->getParameterValueForString(param_id, display, value); | |||
} | |||
static CLAP_ABI void clap_plugin_params_flush(const clap_plugin_t* plugin, const clap_input_events_t* in, const clap_output_events_t* out) | |||
static void CLAP_ABI clap_plugin_params_flush(const clap_plugin_t* plugin, const clap_input_events_t* in, const clap_output_events_t* out) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->flushParameters(in, out, 0); | |||
@@ -2361,7 +2359,7 @@ static const clap_plugin_params_t clap_plugin_params = { | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// plugin latency | |||
static CLAP_ABI uint32_t clap_plugin_latency_get(const clap_plugin_t* const plugin) | |||
static uint32_t CLAP_ABI clap_plugin_latency_get(const clap_plugin_t* const plugin) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->getLatency(); | |||
@@ -2376,13 +2374,13 @@ static const clap_plugin_latency_t clap_plugin_latency = { | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// plugin state | |||
static CLAP_ABI bool clap_plugin_state_save(const clap_plugin_t* const plugin, const clap_ostream_t* const stream) | |||
static bool CLAP_ABI clap_plugin_state_save(const clap_plugin_t* const plugin, const clap_ostream_t* const stream) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->stateSave(stream); | |||
} | |||
static CLAP_ABI bool clap_plugin_state_load(const clap_plugin_t* const plugin, const clap_istream_t* const stream) | |||
static bool CLAP_ABI clap_plugin_state_load(const clap_plugin_t* const plugin, const clap_istream_t* const stream) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->stateLoad(stream); | |||
@@ -2397,19 +2395,19 @@ static const clap_plugin_state_t clap_plugin_state = { | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// plugin | |||
static CLAP_ABI bool clap_plugin_init(const clap_plugin_t* const plugin) | |||
static bool CLAP_ABI clap_plugin_init(const clap_plugin_t* const plugin) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->init(); | |||
} | |||
static CLAP_ABI void clap_plugin_destroy(const clap_plugin_t* const plugin) | |||
static void CLAP_ABI clap_plugin_destroy(const clap_plugin_t* const plugin) | |||
{ | |||
delete static_cast<PluginCLAP*>(plugin->plugin_data); | |||
std::free(const_cast<clap_plugin_t*>(plugin)); | |||
} | |||
static CLAP_ABI bool clap_plugin_activate(const clap_plugin_t* const plugin, | |||
static bool CLAP_ABI clap_plugin_activate(const clap_plugin_t* const plugin, | |||
const double sample_rate, | |||
uint32_t, | |||
const uint32_t max_frames_count) | |||
@@ -2422,35 +2420,35 @@ static CLAP_ABI bool clap_plugin_activate(const clap_plugin_t* const plugin, | |||
return true; | |||
} | |||
static CLAP_ABI void clap_plugin_deactivate(const clap_plugin_t* const plugin) | |||
static void CLAP_ABI clap_plugin_deactivate(const clap_plugin_t* const plugin) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
instance->deactivate(); | |||
} | |||
static CLAP_ABI bool clap_plugin_start_processing(const clap_plugin_t*) | |||
static bool CLAP_ABI clap_plugin_start_processing(const clap_plugin_t*) | |||
{ | |||
// nothing to do | |||
return true; | |||
} | |||
static CLAP_ABI void clap_plugin_stop_processing(const clap_plugin_t*) | |||
static void CLAP_ABI clap_plugin_stop_processing(const clap_plugin_t*) | |||
{ | |||
// nothing to do | |||
} | |||
static CLAP_ABI void clap_plugin_reset(const clap_plugin_t*) | |||
static void CLAP_ABI clap_plugin_reset(const clap_plugin_t*) | |||
{ | |||
// nothing to do | |||
} | |||
static CLAP_ABI clap_process_status clap_plugin_process(const clap_plugin_t* const plugin, const clap_process_t* const process) | |||
static clap_process_status CLAP_ABI clap_plugin_process(const clap_plugin_t* const plugin, const clap_process_t* const process) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
return instance->process(process) ? CLAP_PROCESS_CONTINUE : CLAP_PROCESS_ERROR; | |||
} | |||
static CLAP_ABI const void* clap_plugin_get_extension(const clap_plugin_t*, const char* const id) | |||
static const void* CLAP_ABI clap_plugin_get_extension(const clap_plugin_t*, const char* const id) | |||
{ | |||
if (std::strcmp(id, CLAP_EXT_PARAMS) == 0) | |||
return &clap_plugin_params; | |||
@@ -2481,7 +2479,7 @@ static CLAP_ABI const void* clap_plugin_get_extension(const clap_plugin_t*, cons | |||
return nullptr; | |||
} | |||
static void clap_plugin_on_main_thread(const clap_plugin_t* const plugin) | |||
static void CLAP_ABI clap_plugin_on_main_thread(const clap_plugin_t* const plugin) | |||
{ | |||
PluginCLAP* const instance = static_cast<PluginCLAP*>(plugin->plugin_data); | |||
instance->onMainThread(); | |||
@@ -2490,12 +2488,13 @@ static void clap_plugin_on_main_thread(const clap_plugin_t* const plugin) | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// plugin factory | |||
static uint32_t clap_get_plugin_count(const clap_plugin_factory_t*) | |||
static uint32_t CLAP_ABI clap_get_plugin_count(const clap_plugin_factory_t*) | |||
{ | |||
return 1; | |||
} | |||
static const clap_plugin_descriptor_t* clap_get_plugin_descriptor(const clap_plugin_factory_t*, const uint32_t index) | |||
static const clap_plugin_descriptor_t* CLAP_ABI clap_get_plugin_descriptor(const clap_plugin_factory_t*, | |||
const uint32_t index) | |||
{ | |||
DISTRHO_SAFE_ASSERT_UINT_RETURN(index == 0, index, nullptr); | |||
@@ -2528,9 +2527,9 @@ static const clap_plugin_descriptor_t* clap_get_plugin_descriptor(const clap_plu | |||
return &descriptor; | |||
} | |||
static const clap_plugin_t* clap_create_plugin(const clap_plugin_factory_t* const factory, | |||
const clap_host_t* const host, | |||
const char*) | |||
static const clap_plugin_t* CLAP_ABI clap_create_plugin(const clap_plugin_factory_t* const factory, | |||
const clap_host_t* const host, | |||
const char*) | |||
{ | |||
clap_plugin_t* const pluginptr = static_cast<clap_plugin_t*>(std::malloc(sizeof(clap_plugin_t))); | |||
DISTRHO_SAFE_ASSERT_RETURN(pluginptr != nullptr, nullptr); | |||
@@ -2571,7 +2570,7 @@ static const clap_plugin_factory_t clap_plugin_factory = { | |||
// -------------------------------------------------------------------------------------------------------------------- | |||
// plugin entry | |||
static bool clap_plugin_entry_init(const char* const plugin_path) | |||
static bool CLAP_ABI clap_plugin_entry_init(const char* const plugin_path) | |||
{ | |||
static String bundlePath; | |||
bundlePath = plugin_path; | |||
@@ -2599,12 +2598,12 @@ static bool clap_plugin_entry_init(const char* const plugin_path) | |||
return true; | |||
} | |||
static void clap_plugin_entry_deinit(void) | |||
static void CLAP_ABI clap_plugin_entry_deinit(void) | |||
{ | |||
sPlugin = nullptr; | |||
} | |||
static const void* clap_plugin_entry_get_factory(const char* const factory_id) | |||
static const void* CLAP_ABI clap_plugin_entry_get_factory(const char* const factory_id) | |||
{ | |||
if (std::strcmp(factory_id, CLAP_PLUGIN_FACTORY_ID) == 0) | |||
return &clap_plugin_factory; | |||
@@ -89,7 +89,7 @@ void fillInPredefinedPortGroupData(const uint32_t groupId, PortGroup& portGroup) | |||
} | |||
static inline | |||
void strncpy(char* const dst, const char* const src, const size_t length) | |||
void d_strncpy(char* const dst, const char* const src, const size_t length) | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(length > 0,); | |||
@@ -859,6 +859,15 @@ public: | |||
return fData->states[index].description; | |||
} | |||
#ifdef __MOD_DEVICES__ | |||
const String& getStateFileTypes(const uint32_t index) const noexcept | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->stateCount, sFallbackString); | |||
return fData->states[index].fileTypes; | |||
} | |||
#endif | |||
# if DISTRHO_PLUGIN_WANT_FULL_STATE | |||
String getStateValue(const char* const key) const | |||
{ | |||
@@ -16,7 +16,7 @@ | |||
#include "DistrhoPluginInternal.hpp" | |||
#if !defined(DISTRHO_OS_WINDOWS) && !defined(STATIC_BUILD) | |||
#ifndef STATIC_BUILD | |||
# include "../DistrhoPluginUtils.hpp" | |||
#endif | |||
@@ -703,7 +703,7 @@ private: | |||
"msr fpcr, %0 \n" | |||
"isb \n" | |||
: "=r"(c) :: "memory"); | |||
#elif defined(__arm__) | |||
#elif defined(__arm__) && !defined(__SOFTFP__) | |||
uint32_t c; | |||
__asm__ __volatile__("vmrs %0, fpscr \n" | |||
"orr %0, %0, #0x1000000\n" | |||
@@ -954,14 +954,14 @@ int main(int argc, char* argv[]) | |||
initSignalHandler(); | |||
#if !defined(DISTRHO_OS_WINDOWS) && !defined(STATIC_BUILD) | |||
#ifndef STATIC_BUILD | |||
// find plugin bundle | |||
static String bundlePath; | |||
if (bundlePath.isEmpty()) | |||
{ | |||
String tmpPath(getBinaryFilename()); | |||
tmpPath.truncate(tmpPath.rfind(DISTRHO_OS_SEP)); | |||
#ifdef DISTRHO_OS_MAC | |||
#if defined(DISTRHO_OS_MAC) | |||
if (tmpPath.endsWith("/MacOS")) | |||
{ | |||
tmpPath.truncate(tmpPath.rfind('/')); | |||
@@ -972,13 +972,18 @@ int main(int argc, char* argv[]) | |||
d_nextBundlePath = bundlePath.buffer(); | |||
} | |||
} | |||
#else | |||
#ifdef DISTRHO_OS_WINDOWS | |||
const DWORD attr = GetFileAttributesA(tmpPath + DISTRHO_OS_SEP_STR "resources"); | |||
if (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0) | |||
#else | |||
if (access(tmpPath + DISTRHO_OS_SEP_STR "resources", F_OK) == 0) | |||
#endif | |||
{ | |||
bundlePath = tmpPath; | |||
d_nextBundlePath = bundlePath.buffer(); | |||
} | |||
#endif | |||
#endif | |||
} | |||
#endif | |||
@@ -393,9 +393,18 @@ void lv2_generate_ttl(const char* const basename) | |||
} | |||
if ((hints & kStateIsFilenamePath) == kStateIsFilenamePath) | |||
{ | |||
#ifdef __MOD_DEVICES__ | |||
const String& fileTypes(plugin.getStateFileTypes(i)); | |||
if (fileTypes.isNotEmpty()) | |||
pluginString += " mod:fileTypes \"" + fileTypes + "\" ; \n"; | |||
#endif | |||
pluginString += " rdfs:range atom:Path .\n\n"; | |||
} | |||
else | |||
{ | |||
pluginString += " rdfs:range atom:String .\n\n"; | |||
} | |||
hasHostVisibleState = true; | |||
} | |||
@@ -58,13 +58,13 @@ typedef union _VstEvent { | |||
} VstEvent; | |||
typedef struct _HostVstEvents { | |||
int numEvents; | |||
int32_t numEvents; | |||
void* reserved; | |||
const VstEvent* events[]; | |||
} HostVstEvents; | |||
typedef struct _PluginVstEvents { | |||
int numEvents; | |||
int32_t numEvents; | |||
void* reserved; | |||
VstEvent* events[1]; | |||
} PluginVstEvents; | |||
@@ -484,7 +484,7 @@ public: | |||
case VST_EFFECT_OPCODE_04: // set program name | |||
if (char* const programName = (char*)ptr) | |||
{ | |||
strncpy(fProgramName, programName, 32); | |||
d_strncpy(fProgramName, programName, 32); | |||
return 1; | |||
} | |||
break; | |||
@@ -492,7 +492,7 @@ public: | |||
case VST_EFFECT_OPCODE_05: // get program name | |||
if (char* const programName = (char*)ptr) | |||
{ | |||
strncpy(programName, fProgramName, 24); | |||
d_strncpy(programName, fProgramName, 24); | |||
return 1; | |||
} | |||
break; | |||
@@ -500,7 +500,7 @@ public: | |||
case VST_EFFECT_OPCODE_1D: // get program name indexed | |||
if (char* const programName = (char*)ptr) | |||
{ | |||
strncpy(programName, fProgramName, 24); | |||
d_strncpy(programName, fProgramName, 24); | |||
return 1; | |||
} | |||
break; | |||
@@ -1421,7 +1421,7 @@ static intptr_t VST_FUNCTION_INTERFACE vst_dispatcherCallback(vst_effect* const | |||
case VST_EFFECT_OPCODE_PARAM_GETLABEL: | |||
if (ptr != nullptr && index < static_cast<int32_t>(sPlugin->getParameterCount())) | |||
{ | |||
strncpy((char*)ptr, sPlugin->getParameterUnit(index), 8); | |||
d_strncpy((char*)ptr, sPlugin->getParameterUnit(index), 8); | |||
return 1; | |||
} | |||
return 0; | |||
@@ -1431,9 +1431,9 @@ static intptr_t VST_FUNCTION_INTERFACE vst_dispatcherCallback(vst_effect* const | |||
{ | |||
const String& shortName(sPlugin->getParameterShortName(index)); | |||
if (shortName.isNotEmpty()) | |||
strncpy((char*)ptr, shortName, 16); | |||
d_strncpy((char*)ptr, shortName, 16); | |||
else | |||
strncpy((char*)ptr, sPlugin->getParameterName(index), 16); | |||
d_strncpy((char*)ptr, sPlugin->getParameterName(index), 16); | |||
return 1; | |||
} | |||
return 0; | |||
@@ -1446,17 +1446,17 @@ static intptr_t VST_FUNCTION_INTERFACE vst_dispatcherCallback(vst_effect* const | |||
memset(properties, 0, sizeof(vst_parameter_properties)); | |||
// full name | |||
strncpy(properties->name, | |||
sPlugin->getParameterName(index), | |||
sizeof(properties->name)); | |||
d_strncpy(properties->name, | |||
sPlugin->getParameterName(index), | |||
sizeof(properties->name)); | |||
// short name | |||
const String& shortName(sPlugin->getParameterShortName(index)); | |||
if (shortName.isNotEmpty()) | |||
strncpy(properties->label, | |||
sPlugin->getParameterShortName(index), | |||
sizeof(properties->label)); | |||
d_strncpy(properties->label, | |||
sPlugin->getParameterShortName(index), | |||
sizeof(properties->label)); | |||
// parameter hints | |||
const uint32_t hints = sPlugin->getParameterHints(index); | |||
@@ -1496,9 +1496,9 @@ static intptr_t VST_FUNCTION_INTERFACE vst_dispatcherCallback(vst_effect* const | |||
{ | |||
properties->flags |= VST_PARAMETER_FLAGS_CATEGORY; | |||
properties->category = i + 1; | |||
strncpy(properties->category_label, | |||
portGroup.name.buffer(), | |||
sizeof(properties->category_label)); | |||
d_strncpy(properties->category_label, | |||
portGroup.name.buffer(), | |||
sizeof(properties->category_label)); | |||
break; | |||
} | |||
} | |||
@@ -1526,7 +1526,7 @@ static intptr_t VST_FUNCTION_INTERFACE vst_dispatcherCallback(vst_effect* const | |||
case VST_EFFECT_OPCODE_EFFECT_NAME: | |||
if (char* const cptr = (char*)ptr) | |||
{ | |||
strncpy(cptr, sPlugin->getName(), 32); | |||
d_strncpy(cptr, sPlugin->getName(), 32); | |||
return 1; | |||
} | |||
return 0; | |||
@@ -1534,7 +1534,7 @@ static intptr_t VST_FUNCTION_INTERFACE vst_dispatcherCallback(vst_effect* const | |||
case VST_EFFECT_OPCODE_VENDOR_NAME: | |||
if (char* const cptr = (char*)ptr) | |||
{ | |||
strncpy(cptr, sPlugin->getMaker(), 32); | |||
d_strncpy(cptr, sPlugin->getMaker(), 32); | |||
return 1; | |||
} | |||
return 0; | |||
@@ -1542,7 +1542,7 @@ static intptr_t VST_FUNCTION_INTERFACE vst_dispatcherCallback(vst_effect* const | |||
case VST_EFFECT_OPCODE_PRODUCT_NAME: | |||
if (char* const cptr = (char*)ptr) | |||
{ | |||
strncpy(cptr, sPlugin->getLabel(), 32); | |||
d_strncpy(cptr, sPlugin->getLabel(), 32); | |||
return 1; | |||
} | |||
return 0; | |||
@@ -1446,13 +1446,17 @@ public: | |||
#if DISTRHO_PLUGIN_NUM_INPUTS > 0 | |||
if (data->inputs != nullptr) | |||
{ | |||
for (int32_t j = 0; j < data->inputs->num_channels; ++j) | |||
{ | |||
while (!fEnabledInputs[i] && i < DISTRHO_PLUGIN_NUM_INPUTS) | |||
inputs[i++] = fDummyAudioBuffer; | |||
for (int32_t b = 0; b < data->num_input_buses; ++b) { | |||
for (int32_t j = 0; j < data->inputs[b].num_channels; ++j) | |||
{ | |||
DISTRHO_SAFE_ASSERT_INT_BREAK(i < DISTRHO_PLUGIN_NUM_INPUTS, i); | |||
if (!fEnabledInputs[i] && i < DISTRHO_PLUGIN_NUM_INPUTS) { | |||
inputs[i++] = fDummyAudioBuffer; | |||
continue; | |||
} | |||
DISTRHO_SAFE_ASSERT_INT_BREAK(i < DISTRHO_PLUGIN_NUM_INPUTS, i); | |||
inputs[i++] = data->inputs->channel_buffers_32[j]; | |||
inputs[i++] = data->inputs[b].channel_buffers_32[j]; | |||
} | |||
} | |||
} | |||
#endif | |||
@@ -1465,13 +1469,17 @@ public: | |||
#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 | |||
if (data->outputs != nullptr) | |||
{ | |||
for (int32_t j = 0; j < data->outputs->num_channels; ++j) | |||
{ | |||
while (!fEnabledOutputs[i] && i < DISTRHO_PLUGIN_NUM_OUTPUTS) | |||
outputs[i++] = fDummyAudioBuffer; | |||
for (int32_t b = 0; b < data->num_output_buses; ++b) { | |||
for (int32_t j = 0; j < data->outputs[b].num_channels; ++j) | |||
{ | |||
DISTRHO_SAFE_ASSERT_INT_BREAK(i < DISTRHO_PLUGIN_NUM_OUTPUTS, i); | |||
if (!fEnabledOutputs[i] && i < DISTRHO_PLUGIN_NUM_OUTPUTS) { | |||
outputs[i++] = fDummyAudioBuffer; | |||
continue; | |||
} | |||
DISTRHO_SAFE_ASSERT_INT_BREAK(i < DISTRHO_PLUGIN_NUM_OUTPUTS, i); | |||
outputs[i++] = data->outputs->channel_buffers_32[j]; | |||
outputs[i++] = data->outputs[b].channel_buffers_32[j]; | |||
} | |||
} | |||
} | |||
#endif | |||
@@ -1645,6 +1653,7 @@ public: | |||
// TODO hash the parameter symbol | |||
info->param_id = rindex; | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER || DISTRHO_PLUGIN_WANT_LATENCY || DISTRHO_PLUGIN_WANT_PROGRAMS | |||
switch (rindex) | |||
{ | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER | |||
@@ -1679,6 +1688,7 @@ public: | |||
return V3_OK; | |||
#endif | |||
} | |||
#endif | |||
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||
if (rindex < kVst3InternalParameterCount) | |||
@@ -1747,6 +1757,7 @@ public: | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(normalized >= 0.0 && normalized <= 1.0, V3_INVALID_ARG); | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER || DISTRHO_PLUGIN_WANT_LATENCY || DISTRHO_PLUGIN_WANT_PROGRAMS | |||
switch (rindex) | |||
{ | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER | |||
@@ -1769,6 +1780,7 @@ public: | |||
return V3_OK; | |||
#endif | |||
} | |||
#endif | |||
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||
if (rindex < kVst3InternalParameterCount) | |||
@@ -1815,6 +1827,7 @@ public: | |||
v3_result getParameterValueForString(const v3_param_id rindex, int16_t* const input, double* const output) | |||
{ | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER || DISTRHO_PLUGIN_WANT_LATENCY || DISTRHO_PLUGIN_WANT_PROGRAMS | |||
switch (rindex) | |||
{ | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER | |||
@@ -1843,6 +1856,7 @@ public: | |||
return V3_INVALID_ARG; | |||
#endif | |||
} | |||
#endif | |||
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||
if (rindex < kVst3InternalParameterCount) | |||
@@ -1883,6 +1897,7 @@ public: | |||
{ | |||
DISTRHO_SAFE_ASSERT_RETURN(normalized >= 0.0 && normalized <= 1.0, 0.0); | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER || DISTRHO_PLUGIN_WANT_LATENCY || DISTRHO_PLUGIN_WANT_PROGRAMS | |||
switch (rindex) | |||
{ | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER | |||
@@ -1900,6 +1915,7 @@ public: | |||
return std::round(normalized * fProgramCountMinusOne); | |||
#endif | |||
} | |||
#endif | |||
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||
if (rindex < kVst3InternalParameterCount) | |||
@@ -1928,6 +1944,7 @@ public: | |||
double plainParameterToNormalized(const v3_param_id rindex, const double plain) | |||
{ | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER || DISTRHO_PLUGIN_WANT_LATENCY || DISTRHO_PLUGIN_WANT_PROGRAMS | |||
switch (rindex) | |||
{ | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER | |||
@@ -1945,6 +1962,7 @@ public: | |||
return std::max(0.0, std::min(1.0, plain / fProgramCountMinusOne)); | |||
#endif | |||
} | |||
#endif | |||
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT | |||
if (rindex < kVst3InternalParameterCount) | |||
@@ -1969,7 +1987,7 @@ public: | |||
return 0.0; | |||
#endif | |||
#if DPF_VST3_HAS_INTERNAL_PARAMETERS && !DPF_VST3_PURE_MIDI_INTERNAL_PARAMETERS | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER || DISTRHO_PLUGIN_WANT_LATENCY || DISTRHO_PLUGIN_WANT_PROGRAMS | |||
switch (rindex) | |||
{ | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER | |||
@@ -2006,7 +2024,7 @@ public: | |||
return V3_INVALID_ARG; | |||
#endif | |||
#if DPF_VST3_HAS_INTERNAL_PARAMETERS && !DPF_VST3_PURE_MIDI_INTERNAL_PARAMETERS | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER || DISTRHO_PLUGIN_WANT_LATENCY || DISTRHO_PLUGIN_WANT_PROGRAMS | |||
if (rindex < kVst3InternalParameterBaseCount) | |||
{ | |||
fCachedParameterValues[rindex] = normalizedParameterToPlain(rindex, normalized); | |||
@@ -4697,9 +4715,9 @@ struct dpf_factory : v3_plugin_factory_cpp { | |||
std::memset(info, 0, sizeof(*info)); | |||
info->flags = 0x10; // unicode | |||
DISTRHO_NAMESPACE::strncpy(info->vendor, sPlugin->getMaker(), ARRAY_SIZE(info->vendor)); | |||
DISTRHO_NAMESPACE::strncpy(info->url, sPlugin->getHomePage(), ARRAY_SIZE(info->url)); | |||
// DISTRHO_NAMESPACE::strncpy(info->email, "", ARRAY_SIZE(info->email)); // TODO | |||
d_strncpy(info->vendor, sPlugin->getMaker(), ARRAY_SIZE(info->vendor)); | |||
d_strncpy(info->url, sPlugin->getHomePage(), ARRAY_SIZE(info->url)); | |||
// d_strncpy(info->email, "", ARRAY_SIZE(info->email)); // TODO | |||
return V3_OK; | |||
} | |||
@@ -4720,17 +4738,17 @@ struct dpf_factory : v3_plugin_factory_cpp { | |||
DISTRHO_SAFE_ASSERT_RETURN(idx <= 2, V3_INVALID_ARG); | |||
info->cardinality = 0x7FFFFFFF; | |||
DISTRHO_NAMESPACE::strncpy(info->name, sPlugin->getName(), ARRAY_SIZE(info->name)); | |||
d_strncpy(info->name, sPlugin->getName(), ARRAY_SIZE(info->name)); | |||
if (idx == 0) | |||
{ | |||
std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); | |||
DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); | |||
d_strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); | |||
} | |||
else | |||
{ | |||
std::memcpy(info->class_id, dpf_tuid_controller, sizeof(v3_tuid)); | |||
DISTRHO_NAMESPACE::strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category)); | |||
d_strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category)); | |||
} | |||
return V3_OK; | |||
@@ -4788,21 +4806,21 @@ struct dpf_factory : v3_plugin_factory_cpp { | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI | |||
info->class_flags = V3_DISTRIBUTABLE; | |||
#endif | |||
DISTRHO_NAMESPACE::strncpy(info->sub_categories, getPluginCategories(), ARRAY_SIZE(info->sub_categories)); | |||
DISTRHO_NAMESPACE::strncpy(info->name, sPlugin->getName(), ARRAY_SIZE(info->name)); | |||
DISTRHO_NAMESPACE::strncpy(info->vendor, sPlugin->getMaker(), ARRAY_SIZE(info->vendor)); | |||
DISTRHO_NAMESPACE::strncpy(info->version, getPluginVersion(), ARRAY_SIZE(info->version)); | |||
DISTRHO_NAMESPACE::strncpy(info->sdk_version, "Travesty 3.7.4", ARRAY_SIZE(info->sdk_version)); | |||
d_strncpy(info->sub_categories, getPluginCategories(), ARRAY_SIZE(info->sub_categories)); | |||
d_strncpy(info->name, sPlugin->getName(), ARRAY_SIZE(info->name)); | |||
d_strncpy(info->vendor, sPlugin->getMaker(), ARRAY_SIZE(info->vendor)); | |||
d_strncpy(info->version, getPluginVersion(), ARRAY_SIZE(info->version)); | |||
d_strncpy(info->sdk_version, "Travesty 3.7.4", ARRAY_SIZE(info->sdk_version)); | |||
if (idx == 0) | |||
{ | |||
std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); | |||
DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); | |||
d_strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); | |||
} | |||
else | |||
{ | |||
std::memcpy(info->class_id, dpf_tuid_controller, sizeof(v3_tuid)); | |||
DISTRHO_NAMESPACE::strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category)); | |||
d_strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category)); | |||
} | |||
return V3_OK; | |||
@@ -4821,7 +4839,7 @@ struct dpf_factory : v3_plugin_factory_cpp { | |||
#if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI | |||
info->class_flags = V3_DISTRIBUTABLE; | |||
#endif | |||
DISTRHO_NAMESPACE::strncpy(info->sub_categories, getPluginCategories(), ARRAY_SIZE(info->sub_categories)); | |||
d_strncpy(info->sub_categories, getPluginCategories(), ARRAY_SIZE(info->sub_categories)); | |||
DISTRHO_NAMESPACE::strncpy_utf16(info->name, sPlugin->getName(), ARRAY_SIZE(info->name)); | |||
DISTRHO_NAMESPACE::strncpy_utf16(info->vendor, sPlugin->getMaker(), ARRAY_SIZE(info->vendor)); | |||
DISTRHO_NAMESPACE::strncpy_utf16(info->version, getPluginVersion(), ARRAY_SIZE(info->version)); | |||
@@ -4830,12 +4848,12 @@ struct dpf_factory : v3_plugin_factory_cpp { | |||
if (idx == 0) | |||
{ | |||
std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); | |||
DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); | |||
d_strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); | |||
} | |||
else | |||
{ | |||
std::memcpy(info->class_id, dpf_tuid_controller, sizeof(v3_tuid)); | |||
DISTRHO_NAMESPACE::strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category)); | |||
d_strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category)); | |||
} | |||
return V3_OK; | |||
@@ -31,7 +31,10 @@ | |||
# include <stdlib.h> | |||
#endif | |||
#if defined(DISTRHO_OS_WINDOWS) && !defined(STATIC_BUILD) && !DISTRHO_IS_STANDALONE | |||
#ifdef DISTRHO_OS_WINDOWS | |||
# if DISTRHO_IS_STANDALONE || defined(STATIC_BUILD) | |||
static constexpr const HINSTANCE hInstance = nullptr; | |||
# else | |||
static HINSTANCE hInstance = nullptr; | |||
DISTRHO_PLUGIN_EXPORT | |||
@@ -41,6 +44,7 @@ BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID) | |||
hInstance = hInst; | |||
return 1; | |||
} | |||
# endif | |||
#endif | |||
START_NAMESPACE_DISTRHO | |||
@@ -51,25 +55,22 @@ const char* getBinaryFilename() | |||
{ | |||
static String filename; | |||
#ifndef STATIC_BUILD | |||
#ifndef STATIC_BUILD | |||
if (filename.isNotEmpty()) | |||
return filename; | |||
# ifdef DISTRHO_OS_WINDOWS | |||
#if DISTRHO_IS_STANDALONE | |||
constexpr const HINSTANCE hInstance = nullptr; | |||
#endif | |||
#ifdef DISTRHO_OS_WINDOWS | |||
CHAR filenameBuf[MAX_PATH]; | |||
filenameBuf[0] = '\0'; | |||
GetModuleFileNameA(hInstance, filenameBuf, sizeof(filenameBuf)); | |||
filename = filenameBuf; | |||
# else | |||
#else | |||
Dl_info info; | |||
dladdr((void*)getBinaryFilename, &info); | |||
char filenameBuf[PATH_MAX]; | |||
filename = realpath(info.dli_fname, filenameBuf); | |||
# endif | |||
#endif | |||
#endif | |||
#endif | |||
return filename; | |||
} | |||
@@ -251,11 +251,6 @@ struct RtAudioBridge : NativeBridge { | |||
return true; | |||
} | |||
/* RtAudio in macOS uses a different than usual way to handle audio block size, | |||
* where RTAUDIO_MINIMIZE_LATENCY makes CoreAudio use very low latencies (around 15 samples). | |||
* As such, dynamic buffer sizes are meaningless there. | |||
*/ | |||
#ifndef DISTRHO_OS_MAC | |||
bool supportsBufferSizeChanges() const override | |||
{ | |||
return true; | |||
@@ -285,7 +280,6 @@ struct RtAudioBridge : NativeBridge { | |||
activate(); | |||
return ok; | |||
} | |||
#endif | |||
bool _open(const bool withInput) | |||
{ | |||
@@ -321,7 +315,15 @@ struct RtAudioBridge : NativeBridge { | |||
#endif | |||
RtAudio::StreamOptions opts; | |||
opts.flags = RTAUDIO_NONINTERLEAVED | RTAUDIO_MINIMIZE_LATENCY | RTAUDIO_ALSA_USE_DEFAULT; | |||
opts.flags = RTAUDIO_NONINTERLEAVED | RTAUDIO_ALSA_USE_DEFAULT; | |||
#ifndef DISTRHO_OS_MAC | |||
/* RtAudio in macOS uses a different than usual way to handle audio block size, | |||
* where RTAUDIO_MINIMIZE_LATENCY makes CoreAudio use very low latencies (around 15 samples). | |||
* That has serious performance drawbacks, so we skip that here. | |||
*/ | |||
opts.flags |= RTAUDIO_MINIMIZE_LATENCY; | |||
#endif | |||
opts.numberOfBuffers = 2; | |||
opts.streamName = name.buffer(); | |||
try { | |||
@@ -55,6 +55,7 @@ DPF_UTILS_DIR=$(dirname ${0}) | |||
# can be overridden by environment variables | |||
WELCOME_TXT=${WELCOME_TXT:=${DPF_UTILS_DIR}/plugin.pkg/welcome.txt.in} | |||
mkdir -p build | |||
sed -e "s|@name@|${NAME}|" "${WELCOME_TXT}" > build/welcome.txt | |||
sed -e "s|@builddir@|${PWD}/build|" \ | |||
-e "s|@lv2bundleref@|dpf-${SNAME}-lv2bundles.pkg|" \ | |||
@@ -67,3 +67,29 @@ | |||
fun:start_thread | |||
fun:clone | |||
} | |||
{ | |||
leak in fftw plan | |||
Memcheck:Leak | |||
fun:malloc | |||
fun:fftwf_malloc_plain | |||
fun:fftwf_mkplanner | |||
fun:fftwf_the_planner | |||
fun:fftwf_mkapiplan | |||
fun:fftwf_plan_many_dft_r2c | |||
fun:fftwf_plan_dft_r2c | |||
fun:fftwf_plan_dft_r2c_1d | |||
... | |||
} | |||
{ | |||
leak in fftw plan | |||
Memcheck:Leak | |||
fun:memalign | |||
fun:fftwf_malloc_plain | |||
fun:fftwf_mkplanner | |||
fun:fftwf_the_planner | |||
fun:fftwf_mkapiplan | |||
fun:fftwf_plan_many_dft_r2c | |||
fun:fftwf_plan_dft_r2c | |||
fun:fftwf_plan_dft_r2c_1d | |||
... | |||
} |
@@ -49,7 +49,7 @@ void DistrhoPlugin3BandSplitter::initAudioPort(bool input, uint32_t index, Audio | |||
switch (index) | |||
{ | |||
case 0: | |||
port.name = "Inpput Left"; | |||
port.name = "Input Left"; | |||
port.symbol = "in_left"; | |||
break; | |||
case 1: | |||
@@ -1,165 +1,12 @@ | |||
GNU LESSER GENERAL PUBLIC LICENSE | |||
Version 3, 29 June 2007 | |||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | |||
Everyone is permitted to copy and distribute verbatim copies | |||
of this license document, but changing it is not allowed. | |||
This version of the GNU Lesser General Public License incorporates | |||
the terms and conditions of version 3 of the GNU General Public | |||
License, supplemented by the additional permissions listed below. | |||
0. Additional Definitions. | |||
As used herein, "this License" refers to version 3 of the GNU Lesser | |||
General Public License, and the "GNU GPL" refers to version 3 of the GNU | |||
General Public License. | |||
"The Library" refers to a covered work governed by this License, | |||
other than an Application or a Combined Work as defined below. | |||
An "Application" is any work that makes use of an interface provided | |||
by the Library, but which is not otherwise based on the Library. | |||
Defining a subclass of a class defined by the Library is deemed a mode | |||
of using an interface provided by the Library. | |||
A "Combined Work" is a work produced by combining or linking an | |||
Application with the Library. The particular version of the Library | |||
with which the Combined Work was made is also called the "Linked | |||
Version". | |||
The "Minimal Corresponding Source" for a Combined Work means the | |||
Corresponding Source for the Combined Work, excluding any source code | |||
for portions of the Combined Work that, considered in isolation, are | |||
based on the Application, and not on the Linked Version. | |||
The "Corresponding Application Code" for a Combined Work means the | |||
object code and/or source code for the Application, including any data | |||
and utility programs needed for reproducing the Combined Work from the | |||
Application, but excluding the System Libraries of the Combined Work. | |||
1. Exception to Section 3 of the GNU GPL. | |||
You may convey a covered work under sections 3 and 4 of this License | |||
without being bound by section 3 of the GNU GPL. | |||
2. Conveying Modified Versions. | |||
If you modify a copy of the Library, and, in your modifications, a | |||
facility refers to a function or data to be supplied by an Application | |||
that uses the facility (other than as an argument passed when the | |||
facility is invoked), then you may convey a copy of the modified | |||
version: | |||
a) under this License, provided that you make a good faith effort to | |||
ensure that, in the event an Application does not supply the | |||
function or data, the facility still operates, and performs | |||
whatever part of its purpose remains meaningful, or | |||
b) under the GNU GPL, with none of the additional permissions of | |||
this License applicable to that copy. | |||
3. Object Code Incorporating Material from Library Header Files. | |||
The object code form of an Application may incorporate material from | |||
a header file that is part of the Library. You may convey such object | |||
code under terms of your choice, provided that, if the incorporated | |||
material is not limited to numerical parameters, data structure | |||
layouts and accessors, or small macros, inline functions and templates | |||
(ten or fewer lines in length), you do both of the following: | |||
a) Give prominent notice with each copy of the object code that the | |||
Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the object code with a copy of the GNU GPL and this license | |||
document. | |||
4. Combined Works. | |||
You may convey a Combined Work under terms of your choice that, | |||
taken together, effectively do not restrict modification of the | |||
portions of the Library contained in the Combined Work and reverse | |||
engineering for debugging such modifications, if you also do each of | |||
the following: | |||
a) Give prominent notice with each copy of the Combined Work that | |||
the Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the Combined Work with a copy of the GNU GPL and this license | |||
document. | |||
c) For a Combined Work that displays copyright notices during | |||
execution, include the copyright notice for the Library among | |||
these notices, as well as a reference directing the user to the | |||
copies of the GNU GPL and this license document. | |||
d) Do one of the following: | |||
0) Convey the Minimal Corresponding Source under the terms of this | |||
License, and the Corresponding Application Code in a form | |||
suitable for, and under terms that permit, the user to | |||
recombine or relink the Application with a modified version of | |||
the Linked Version to produce a modified Combined Work, in the | |||
manner specified by section 6 of the GNU GPL for conveying | |||
Corresponding Source. | |||
1) Use a suitable shared library mechanism for linking with the | |||
Library. A suitable mechanism is one that (a) uses at run time | |||
a copy of the Library already present on the user's computer | |||
system, and (b) will operate properly with a modified version | |||
of the Library that is interface-compatible with the Linked | |||
Version. | |||
e) Provide Installation Information, but only if you would otherwise | |||
be required to provide such information under section 6 of the | |||
GNU GPL, and only to the extent that such information is | |||
necessary to install and execute a modified version of the | |||
Combined Work produced by recombining or relinking the | |||
Application with a modified version of the Linked Version. (If | |||
you use option 4d0, the Installation Information must accompany | |||
the Minimal Corresponding Source and Corresponding Application | |||
Code. If you use option 4d1, you must provide the Installation | |||
Information in the manner specified by section 6 of the GNU GPL | |||
for conveying Corresponding Source.) | |||
5. Combined Libraries. | |||
You may place library facilities that are a work based on the | |||
Library side by side in a single library together with other library | |||
facilities that are not Applications and are not covered by this | |||
License, and convey such a combined library under terms of your | |||
choice, if you do both of the following: | |||
a) Accompany the combined library with a copy of the same work based | |||
on the Library, uncombined with any other library facilities, | |||
conveyed under the terms of this License. | |||
b) Give prominent notice with the combined library that part of it | |||
is a work based on the Library, and explaining where to find the | |||
accompanying uncombined form of the same work. | |||
6. Revised Versions of the GNU Lesser General Public License. | |||
The Free Software Foundation may publish revised and/or new versions | |||
of the GNU Lesser General Public License from time to time. Such new | |||
versions will be similar in spirit to the present version, but may | |||
differ in detail to address new problems or concerns. | |||
Each version is given a distinguishing version number. If the | |||
Library as you received it specifies that a certain numbered version | |||
of the GNU Lesser General Public License "or any later version" | |||
applies to it, you have the option of following the terms and | |||
conditions either of that published version or of any later version | |||
published by the Free Software Foundation. If the Library as you | |||
received it does not specify a version number of the GNU Lesser | |||
General Public License, you may choose any version of the GNU Lesser | |||
General Public License ever published by the Free Software Foundation. | |||
If the Library as you received it specifies that a proxy can decide | |||
whether future versions of the GNU Lesser General Public License shall | |||
apply, that proxy's public statement of acceptance of any version is | |||
permanent authorization for you to choose that version for the | |||
Library. | |||
Copyright (C) 2015-2022 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. | |||
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. |
@@ -1,165 +1,12 @@ | |||
GNU LESSER GENERAL PUBLIC LICENSE | |||
Version 3, 29 June 2007 | |||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | |||
Everyone is permitted to copy and distribute verbatim copies | |||
of this license document, but changing it is not allowed. | |||
This version of the GNU Lesser General Public License incorporates | |||
the terms and conditions of version 3 of the GNU General Public | |||
License, supplemented by the additional permissions listed below. | |||
0. Additional Definitions. | |||
As used herein, "this License" refers to version 3 of the GNU Lesser | |||
General Public License, and the "GNU GPL" refers to version 3 of the GNU | |||
General Public License. | |||
"The Library" refers to a covered work governed by this License, | |||
other than an Application or a Combined Work as defined below. | |||
An "Application" is any work that makes use of an interface provided | |||
by the Library, but which is not otherwise based on the Library. | |||
Defining a subclass of a class defined by the Library is deemed a mode | |||
of using an interface provided by the Library. | |||
A "Combined Work" is a work produced by combining or linking an | |||
Application with the Library. The particular version of the Library | |||
with which the Combined Work was made is also called the "Linked | |||
Version". | |||
The "Minimal Corresponding Source" for a Combined Work means the | |||
Corresponding Source for the Combined Work, excluding any source code | |||
for portions of the Combined Work that, considered in isolation, are | |||
based on the Application, and not on the Linked Version. | |||
The "Corresponding Application Code" for a Combined Work means the | |||
object code and/or source code for the Application, including any data | |||
and utility programs needed for reproducing the Combined Work from the | |||
Application, but excluding the System Libraries of the Combined Work. | |||
1. Exception to Section 3 of the GNU GPL. | |||
You may convey a covered work under sections 3 and 4 of this License | |||
without being bound by section 3 of the GNU GPL. | |||
2. Conveying Modified Versions. | |||
If you modify a copy of the Library, and, in your modifications, a | |||
facility refers to a function or data to be supplied by an Application | |||
that uses the facility (other than as an argument passed when the | |||
facility is invoked), then you may convey a copy of the modified | |||
version: | |||
a) under this License, provided that you make a good faith effort to | |||
ensure that, in the event an Application does not supply the | |||
function or data, the facility still operates, and performs | |||
whatever part of its purpose remains meaningful, or | |||
b) under the GNU GPL, with none of the additional permissions of | |||
this License applicable to that copy. | |||
3. Object Code Incorporating Material from Library Header Files. | |||
The object code form of an Application may incorporate material from | |||
a header file that is part of the Library. You may convey such object | |||
code under terms of your choice, provided that, if the incorporated | |||
material is not limited to numerical parameters, data structure | |||
layouts and accessors, or small macros, inline functions and templates | |||
(ten or fewer lines in length), you do both of the following: | |||
a) Give prominent notice with each copy of the object code that the | |||
Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the object code with a copy of the GNU GPL and this license | |||
document. | |||
4. Combined Works. | |||
You may convey a Combined Work under terms of your choice that, | |||
taken together, effectively do not restrict modification of the | |||
portions of the Library contained in the Combined Work and reverse | |||
engineering for debugging such modifications, if you also do each of | |||
the following: | |||
a) Give prominent notice with each copy of the Combined Work that | |||
the Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the Combined Work with a copy of the GNU GPL and this license | |||
document. | |||
c) For a Combined Work that displays copyright notices during | |||
execution, include the copyright notice for the Library among | |||
these notices, as well as a reference directing the user to the | |||
copies of the GNU GPL and this license document. | |||
d) Do one of the following: | |||
0) Convey the Minimal Corresponding Source under the terms of this | |||
License, and the Corresponding Application Code in a form | |||
suitable for, and under terms that permit, the user to | |||
recombine or relink the Application with a modified version of | |||
the Linked Version to produce a modified Combined Work, in the | |||
manner specified by section 6 of the GNU GPL for conveying | |||
Corresponding Source. | |||
1) Use a suitable shared library mechanism for linking with the | |||
Library. A suitable mechanism is one that (a) uses at run time | |||
a copy of the Library already present on the user's computer | |||
system, and (b) will operate properly with a modified version | |||
of the Library that is interface-compatible with the Linked | |||
Version. | |||
e) Provide Installation Information, but only if you would otherwise | |||
be required to provide such information under section 6 of the | |||
GNU GPL, and only to the extent that such information is | |||
necessary to install and execute a modified version of the | |||
Combined Work produced by recombining or relinking the | |||
Application with a modified version of the Linked Version. (If | |||
you use option 4d0, the Installation Information must accompany | |||
the Minimal Corresponding Source and Corresponding Application | |||
Code. If you use option 4d1, you must provide the Installation | |||
Information in the manner specified by section 6 of the GNU GPL | |||
for conveying Corresponding Source.) | |||
5. Combined Libraries. | |||
You may place library facilities that are a work based on the | |||
Library side by side in a single library together with other library | |||
facilities that are not Applications and are not covered by this | |||
License, and convey such a combined library under terms of your | |||
choice, if you do both of the following: | |||
a) Accompany the combined library with a copy of the same work based | |||
on the Library, uncombined with any other library facilities, | |||
conveyed under the terms of this License. | |||
b) Give prominent notice with the combined library that part of it | |||
is a work based on the Library, and explaining where to find the | |||
accompanying uncombined form of the same work. | |||
6. Revised Versions of the GNU Lesser General Public License. | |||
The Free Software Foundation may publish revised and/or new versions | |||
of the GNU Lesser General Public License from time to time. Such new | |||
versions will be similar in spirit to the present version, but may | |||
differ in detail to address new problems or concerns. | |||
Each version is given a distinguishing version number. If the | |||
Library as you received it specifies that a certain numbered version | |||
of the GNU Lesser General Public License "or any later version" | |||
applies to it, you have the option of following the terms and | |||
conditions either of that published version or of any later version | |||
published by the Free Software Foundation. If the Library as you | |||
received it does not specify a version number of the GNU Lesser | |||
General Public License, you may choose any version of the GNU Lesser | |||
General Public License ever published by the Free Software Foundation. | |||
If the Library as you received it specifies that a proxy can decide | |||
whether future versions of the GNU Lesser General Public License shall | |||
apply, that proxy's public statement of acceptance of any version is | |||
permanent authorization for you to choose that version for the | |||
Library. | |||
Copyright (C) 2015-2022 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. | |||
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. |
@@ -1,165 +1,12 @@ | |||
GNU LESSER GENERAL PUBLIC LICENSE | |||
Version 3, 29 June 2007 | |||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | |||
Everyone is permitted to copy and distribute verbatim copies | |||
of this license document, but changing it is not allowed. | |||
This version of the GNU Lesser General Public License incorporates | |||
the terms and conditions of version 3 of the GNU General Public | |||
License, supplemented by the additional permissions listed below. | |||
0. Additional Definitions. | |||
As used herein, "this License" refers to version 3 of the GNU Lesser | |||
General Public License, and the "GNU GPL" refers to version 3 of the GNU | |||
General Public License. | |||
"The Library" refers to a covered work governed by this License, | |||
other than an Application or a Combined Work as defined below. | |||
An "Application" is any work that makes use of an interface provided | |||
by the Library, but which is not otherwise based on the Library. | |||
Defining a subclass of a class defined by the Library is deemed a mode | |||
of using an interface provided by the Library. | |||
A "Combined Work" is a work produced by combining or linking an | |||
Application with the Library. The particular version of the Library | |||
with which the Combined Work was made is also called the "Linked | |||
Version". | |||
The "Minimal Corresponding Source" for a Combined Work means the | |||
Corresponding Source for the Combined Work, excluding any source code | |||
for portions of the Combined Work that, considered in isolation, are | |||
based on the Application, and not on the Linked Version. | |||
The "Corresponding Application Code" for a Combined Work means the | |||
object code and/or source code for the Application, including any data | |||
and utility programs needed for reproducing the Combined Work from the | |||
Application, but excluding the System Libraries of the Combined Work. | |||
1. Exception to Section 3 of the GNU GPL. | |||
You may convey a covered work under sections 3 and 4 of this License | |||
without being bound by section 3 of the GNU GPL. | |||
2. Conveying Modified Versions. | |||
If you modify a copy of the Library, and, in your modifications, a | |||
facility refers to a function or data to be supplied by an Application | |||
that uses the facility (other than as an argument passed when the | |||
facility is invoked), then you may convey a copy of the modified | |||
version: | |||
a) under this License, provided that you make a good faith effort to | |||
ensure that, in the event an Application does not supply the | |||
function or data, the facility still operates, and performs | |||
whatever part of its purpose remains meaningful, or | |||
b) under the GNU GPL, with none of the additional permissions of | |||
this License applicable to that copy. | |||
3. Object Code Incorporating Material from Library Header Files. | |||
The object code form of an Application may incorporate material from | |||
a header file that is part of the Library. You may convey such object | |||
code under terms of your choice, provided that, if the incorporated | |||
material is not limited to numerical parameters, data structure | |||
layouts and accessors, or small macros, inline functions and templates | |||
(ten or fewer lines in length), you do both of the following: | |||
a) Give prominent notice with each copy of the object code that the | |||
Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the object code with a copy of the GNU GPL and this license | |||
document. | |||
4. Combined Works. | |||
You may convey a Combined Work under terms of your choice that, | |||
taken together, effectively do not restrict modification of the | |||
portions of the Library contained in the Combined Work and reverse | |||
engineering for debugging such modifications, if you also do each of | |||
the following: | |||
a) Give prominent notice with each copy of the Combined Work that | |||
the Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the Combined Work with a copy of the GNU GPL and this license | |||
document. | |||
c) For a Combined Work that displays copyright notices during | |||
execution, include the copyright notice for the Library among | |||
these notices, as well as a reference directing the user to the | |||
copies of the GNU GPL and this license document. | |||
d) Do one of the following: | |||
0) Convey the Minimal Corresponding Source under the terms of this | |||
License, and the Corresponding Application Code in a form | |||
suitable for, and under terms that permit, the user to | |||
recombine or relink the Application with a modified version of | |||
the Linked Version to produce a modified Combined Work, in the | |||
manner specified by section 6 of the GNU GPL for conveying | |||
Corresponding Source. | |||
1) Use a suitable shared library mechanism for linking with the | |||
Library. A suitable mechanism is one that (a) uses at run time | |||
a copy of the Library already present on the user's computer | |||
system, and (b) will operate properly with a modified version | |||
of the Library that is interface-compatible with the Linked | |||
Version. | |||
e) Provide Installation Information, but only if you would otherwise | |||
be required to provide such information under section 6 of the | |||
GNU GPL, and only to the extent that such information is | |||
necessary to install and execute a modified version of the | |||
Combined Work produced by recombining or relinking the | |||
Application with a modified version of the Linked Version. (If | |||
you use option 4d0, the Installation Information must accompany | |||
the Minimal Corresponding Source and Corresponding Application | |||
Code. If you use option 4d1, you must provide the Installation | |||
Information in the manner specified by section 6 of the GNU GPL | |||
for conveying Corresponding Source.) | |||
5. Combined Libraries. | |||
You may place library facilities that are a work based on the | |||
Library side by side in a single library together with other library | |||
facilities that are not Applications and are not covered by this | |||
License, and convey such a combined library under terms of your | |||
choice, if you do both of the following: | |||
a) Accompany the combined library with a copy of the same work based | |||
on the Library, uncombined with any other library facilities, | |||
conveyed under the terms of this License. | |||
b) Give prominent notice with the combined library that part of it | |||
is a work based on the Library, and explaining where to find the | |||
accompanying uncombined form of the same work. | |||
6. Revised Versions of the GNU Lesser General Public License. | |||
The Free Software Foundation may publish revised and/or new versions | |||
of the GNU Lesser General Public License from time to time. Such new | |||
versions will be similar in spirit to the present version, but may | |||
differ in detail to address new problems or concerns. | |||
Each version is given a distinguishing version number. If the | |||
Library as you received it specifies that a certain numbered version | |||
of the GNU Lesser General Public License "or any later version" | |||
applies to it, you have the option of following the terms and | |||
conditions either of that published version or of any later version | |||
published by the Free Software Foundation. If the Library as you | |||
received it does not specify a version number of the GNU Lesser | |||
General Public License, you may choose any version of the GNU Lesser | |||
General Public License ever published by the Free Software Foundation. | |||
If the Library as you received it specifies that a proxy can decide | |||
whether future versions of the GNU Lesser General Public License shall | |||
apply, that proxy's public statement of acceptance of any version is | |||
permanent authorization for you to choose that version for the | |||
Library. | |||
Copyright (C) 2015-2022 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. | |||
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. |
@@ -1,165 +1,12 @@ | |||
GNU LESSER GENERAL PUBLIC LICENSE | |||
Version 3, 29 June 2007 | |||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | |||
Everyone is permitted to copy and distribute verbatim copies | |||
of this license document, but changing it is not allowed. | |||
This version of the GNU Lesser General Public License incorporates | |||
the terms and conditions of version 3 of the GNU General Public | |||
License, supplemented by the additional permissions listed below. | |||
0. Additional Definitions. | |||
As used herein, "this License" refers to version 3 of the GNU Lesser | |||
General Public License, and the "GNU GPL" refers to version 3 of the GNU | |||
General Public License. | |||
"The Library" refers to a covered work governed by this License, | |||
other than an Application or a Combined Work as defined below. | |||
An "Application" is any work that makes use of an interface provided | |||
by the Library, but which is not otherwise based on the Library. | |||
Defining a subclass of a class defined by the Library is deemed a mode | |||
of using an interface provided by the Library. | |||
A "Combined Work" is a work produced by combining or linking an | |||
Application with the Library. The particular version of the Library | |||
with which the Combined Work was made is also called the "Linked | |||
Version". | |||
The "Minimal Corresponding Source" for a Combined Work means the | |||
Corresponding Source for the Combined Work, excluding any source code | |||
for portions of the Combined Work that, considered in isolation, are | |||
based on the Application, and not on the Linked Version. | |||
The "Corresponding Application Code" for a Combined Work means the | |||
object code and/or source code for the Application, including any data | |||
and utility programs needed for reproducing the Combined Work from the | |||
Application, but excluding the System Libraries of the Combined Work. | |||
1. Exception to Section 3 of the GNU GPL. | |||
You may convey a covered work under sections 3 and 4 of this License | |||
without being bound by section 3 of the GNU GPL. | |||
2. Conveying Modified Versions. | |||
If you modify a copy of the Library, and, in your modifications, a | |||
facility refers to a function or data to be supplied by an Application | |||
that uses the facility (other than as an argument passed when the | |||
facility is invoked), then you may convey a copy of the modified | |||
version: | |||
a) under this License, provided that you make a good faith effort to | |||
ensure that, in the event an Application does not supply the | |||
function or data, the facility still operates, and performs | |||
whatever part of its purpose remains meaningful, or | |||
b) under the GNU GPL, with none of the additional permissions of | |||
this License applicable to that copy. | |||
3. Object Code Incorporating Material from Library Header Files. | |||
The object code form of an Application may incorporate material from | |||
a header file that is part of the Library. You may convey such object | |||
code under terms of your choice, provided that, if the incorporated | |||
material is not limited to numerical parameters, data structure | |||
layouts and accessors, or small macros, inline functions and templates | |||
(ten or fewer lines in length), you do both of the following: | |||
a) Give prominent notice with each copy of the object code that the | |||
Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the object code with a copy of the GNU GPL and this license | |||
document. | |||
4. Combined Works. | |||
You may convey a Combined Work under terms of your choice that, | |||
taken together, effectively do not restrict modification of the | |||
portions of the Library contained in the Combined Work and reverse | |||
engineering for debugging such modifications, if you also do each of | |||
the following: | |||
a) Give prominent notice with each copy of the Combined Work that | |||
the Library is used in it and that the Library and its use are | |||
covered by this License. | |||
b) Accompany the Combined Work with a copy of the GNU GPL and this license | |||
document. | |||
c) For a Combined Work that displays copyright notices during | |||
execution, include the copyright notice for the Library among | |||
these notices, as well as a reference directing the user to the | |||
copies of the GNU GPL and this license document. | |||
d) Do one of the following: | |||
0) Convey the Minimal Corresponding Source under the terms of this | |||
License, and the Corresponding Application Code in a form | |||
suitable for, and under terms that permit, the user to | |||
recombine or relink the Application with a modified version of | |||
the Linked Version to produce a modified Combined Work, in the | |||
manner specified by section 6 of the GNU GPL for conveying | |||
Corresponding Source. | |||
1) Use a suitable shared library mechanism for linking with the | |||
Library. A suitable mechanism is one that (a) uses at run time | |||
a copy of the Library already present on the user's computer | |||
system, and (b) will operate properly with a modified version | |||
of the Library that is interface-compatible with the Linked | |||
Version. | |||
e) Provide Installation Information, but only if you would otherwise | |||
be required to provide such information under section 6 of the | |||
GNU GPL, and only to the extent that such information is | |||
necessary to install and execute a modified version of the | |||
Combined Work produced by recombining or relinking the | |||
Application with a modified version of the Linked Version. (If | |||
you use option 4d0, the Installation Information must accompany | |||
the Minimal Corresponding Source and Corresponding Application | |||
Code. If you use option 4d1, you must provide the Installation | |||
Information in the manner specified by section 6 of the GNU GPL | |||
for conveying Corresponding Source.) | |||
5. Combined Libraries. | |||
You may place library facilities that are a work based on the | |||
Library side by side in a single library together with other library | |||
facilities that are not Applications and are not covered by this | |||
License, and convey such a combined library under terms of your | |||
choice, if you do both of the following: | |||
a) Accompany the combined library with a copy of the same work based | |||
on the Library, uncombined with any other library facilities, | |||
conveyed under the terms of this License. | |||
b) Give prominent notice with the combined library that part of it | |||
is a work based on the Library, and explaining where to find the | |||
accompanying uncombined form of the same work. | |||
6. Revised Versions of the GNU Lesser General Public License. | |||
The Free Software Foundation may publish revised and/or new versions | |||
of the GNU Lesser General Public License from time to time. Such new | |||
versions will be similar in spirit to the present version, but may | |||
differ in detail to address new problems or concerns. | |||
Each version is given a distinguishing version number. If the | |||
Library as you received it specifies that a certain numbered version | |||
of the GNU Lesser General Public License "or any later version" | |||
applies to it, you have the option of following the terms and | |||
conditions either of that published version or of any later version | |||
published by the Free Software Foundation. If the Library as you | |||
received it does not specify a version number of the GNU Lesser | |||
General Public License, you may choose any version of the GNU Lesser | |||
General Public License ever published by the Free Software Foundation. | |||
If the Library as you received it specifies that a proxy can decide | |||
whether future versions of the GNU Lesser General Public License shall | |||
apply, that proxy's public statement of acceptance of any version is | |||
permanent authorization for you to choose that version for the | |||
Library. | |||
Copyright (C) 2015-2022 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. | |||
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. |