Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Cleanup, update diffs
Signed-off-by: falkTX <falktx@falktx.com>
  • Loading branch information
falkTX committed Sep 10, 2023
1 parent 7cc1309 commit d9246c8
Show file tree
Hide file tree
Showing 12 changed files with 661 additions and 9 deletions.
31 changes: 28 additions & 3 deletions src/custom/dep.cpp
Expand Up @@ -1184,11 +1184,11 @@ static std::list<ExtendedNSVGimage> loadedLightSVGs;
static inline
void nsvg__duplicatePaint(NSVGpaint& dst, NSVGpaint& src)
{
if (dst.type == NSVG_PAINT_LINEAR_GRADIENT || dst.type == NSVG_PAINT_RADIAL_GRADIENT)
if (dst.type == NSVG_PAINT_LINEAR_GRADIENT || dst.type == NSVG_PAINT_RADIAL_GRADIENT)
{
const size_t size = sizeof(NSVGgradient) + sizeof(NSVGgradientStop)*(src.gradient->nstops-1);
dst.gradient = static_cast<NSVGgradient*>(malloc(size));
std::memcpy(dst.gradient, src.gradient, size);
dst.gradient = static_cast<NSVGgradient*>(malloc(size));
std::memcpy(dst.gradient, src.gradient, size);
}
}

Expand Down Expand Up @@ -1260,6 +1260,31 @@ NSVGimage* nsvgParseFromFileCardinal(const char* const filename, const char* con
{
if (NSVGimage* const handle = nsvgParseFromFile(filename, units, dpi))
{
/*
if (NSVGshape* const shapes = handle->shapes)
{
for (NSVGshape *next, *shape = shapes;;)
{
next = shape->next;
nsvg__deletePaint(&shape->fill);
nsvg__deletePaint(&shape->stroke);
std::free(shape);
if (next == nullptr)
break;
shape = next;
}
}
handle->shapes = static_cast<NSVGshape*>(std::calloc(1, sizeof(NSVGshape)));
handle->shapes->stroke.color = 0xff00ff00;
handle->shapes->stroke.type = NSVG_PAINT_COLOR;
handle->shapes->fill.color = 0xff000000;
handle->shapes->fill.type = NSVG_PAINT_COLOR;
return handle;
*/

#ifndef HEADLESS
const size_t filenamelen = std::strlen(filename);

Expand Down
6 changes: 6 additions & 0 deletions src/override/.generate-diffs.sh
Expand Up @@ -2,7 +2,13 @@

cd $(dirname ${0})

diff -U3 ../Rack/include/midi.hpp ../../include/midi.hpp > diffs/midi.hpp.diff
diff -U3 ../Rack/include/dsp/fir.hpp ../../include/dsp/fir.hpp > diffs/dsp-fir.hpp.diff
diff -U3 ../Rack/include/engine/Port.hpp ../../include/engine/Port.hpp > diffs/engine-Port.hpp.diff
diff -U3 ../Rack/include/simd/Vector.hpp ../../include/simd/Vector.hpp > diffs/simd-Vector.hpp.diff

diff -U3 ../Rack/dep/oui-blendish/blendish.c blendish.c > diffs/blendish.c.diff

diff -U3 ../Rack/src/common.cpp common.cpp > diffs/common.cpp.diff
diff -U3 ../Rack/src/context.cpp context.cpp > diffs/context.cpp.diff
diff -U3 ../Rack/src/plugin.cpp plugin.cpp > diffs/plugin.cpp.diff
Expand Down
2 changes: 1 addition & 1 deletion src/override/diffs/Engine.cpp.diff
@@ -1,4 +1,4 @@
--- ../Rack/src/engine/Engine.cpp 2023-05-20 17:03:33.006081772 +0200
--- ../Rack/src/engine/Engine.cpp 2023-09-10 12:59:02.631898592 +0200
+++ Engine.cpp 2023-05-22 04:26:39.902464764 +0200
@@ -1,3 +1,30 @@
+/*
Expand Down
2 changes: 1 addition & 1 deletion src/override/diffs/MenuBar.cpp.diff
@@ -1,4 +1,4 @@
--- ../Rack/src/app/MenuBar.cpp 2023-05-20 17:03:33.005081737 +0200
--- ../Rack/src/app/MenuBar.cpp 2023-09-10 12:59:02.630898560 +0200
+++ MenuBar.cpp 2023-08-15 17:56:23.782915145 +0200
@@ -1,8 +1,33 @@
+/*
Expand Down
2 changes: 1 addition & 1 deletion src/override/diffs/ModuleWidget.cpp.diff
@@ -1,4 +1,4 @@
--- ../Rack/src/app/ModuleWidget.cpp 2023-05-20 17:03:33.005081737 +0200
--- ../Rack/src/app/ModuleWidget.cpp 2023-09-10 12:59:02.630898560 +0200
+++ ModuleWidget.cpp 2023-05-20 18:40:08.948302802 +0200
@@ -1,8 +1,35 @@
+/*
Expand Down
2 changes: 1 addition & 1 deletion src/override/diffs/Window.cpp.diff
@@ -1,4 +1,4 @@
--- ../Rack/src/window/Window.cpp 2023-05-20 17:03:33.007081806 +0200
--- ../Rack/src/window/Window.cpp 2023-09-10 12:59:02.631898592 +0200
+++ Window.cpp 2023-08-28 09:55:57.292032175 +0200
@@ -1,33 +1,94 @@
+/*
Expand Down
2 changes: 1 addition & 1 deletion src/override/diffs/context.cpp.diff
@@ -1,4 +1,4 @@
--- ../Rack/src/context.cpp 2023-05-20 17:03:33.006081772 +0200
--- ../Rack/src/context.cpp 2023-09-10 12:59:02.630898560 +0200
+++ context.cpp 2023-05-20 18:08:56.497736615 +0200
@@ -1,14 +1,44 @@
+/*
Expand Down
56 changes: 56 additions & 0 deletions src/override/diffs/dsp-fir.hpp.diff
@@ -0,0 +1,56 @@
--- ../Rack/include/dsp/fir.hpp 2022-09-21 20:49:12.181540170 +0200
+++ ../../include/dsp/fir.hpp 2022-09-21 20:41:45.860647778 +0200
@@ -1,4 +1,32 @@
+/*
+ * DISTRHO Cardinal Plugin
+ * Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of
+ * the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * For a full copy of the GNU General Public License see the LICENSE file.
+ */
+
+/**
+ * This file is an edited version of VCVRack's dsp/fir.hpp
+ * Copyright (C) 2016-2021 VCV.
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of
+ * the License, or (at your option) any later version.
+ */
+
#pragma once
+
#include <pffft.h>

#include <dsp/common.hpp>
@@ -42,16 +70,16 @@
RealTimeConvolver(size_t blockSize) {
this->blockSize = blockSize;
pffft = pffft_new_setup(blockSize * 2, PFFFT_REAL);
- outputTail = new float[blockSize];
+ outputTail = (float*) pffft_aligned_malloc(sizeof(float) * blockSize);
std::memset(outputTail, 0, blockSize * sizeof(float));
- tmpBlock = new float[blockSize * 2];
+ tmpBlock = (float*) pffft_aligned_malloc(sizeof(float) * blockSize * 2);
std::memset(tmpBlock, 0, blockSize * 2 * sizeof(float));
}

~RealTimeConvolver() {
setKernel(NULL, 0);
- delete[] outputTail;
- delete[] tmpBlock;
+ pffft_aligned_free(outputTail);
+ pffft_aligned_free(tmpBlock);
pffft_destroy_setup(pffft);
}

226 changes: 226 additions & 0 deletions src/override/diffs/engine-Port.hpp.diff
@@ -0,0 +1,226 @@
--- ../Rack/include/engine/Port.hpp 2023-09-10 12:59:02.629898529 +0200
+++ ../../include/engine/Port.hpp 2023-07-07 18:20:12.030329564 +0200
@@ -1,19 +1,57 @@
+/*
+ * DISTRHO Cardinal Plugin
+ * Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of
+ * the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * For a full copy of the GNU General Public License see the LICENSE file.
+ */
+
+/**
+ * This file is an edited version of VCVRack's engine/Port.hpp
+ * Copyright (C) 2016-2021 VCV.
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of
+ * the License, or (at your option) any later version.
+ */
+
#pragma once
+
#include <common.hpp>
#include <engine/Light.hpp>

+#include <list>
+
+/** NOTE alignas is required in some systems in order to allow SSE usage. */
+#define SIMD_ALIGN alignas(16)
+

namespace rack {
namespace engine {


/** This is inspired by the number of MIDI channels. */
-static const int PORT_MAX_CHANNELS = 16;
+static constexpr const int PORT_MAX_CHANNELS = 16;
+
+
+struct Cable;


struct Port {
/** Voltage of the port. */
- union {
+ /** NOTE alignas is required in order to allow SSE usage.
+ Consecutive data (like in a vector) would otherwise pack Ports in a way that breaks SSE. */
+ union SIMD_ALIGN {
/** Unstable API. Use getVoltage() and setVoltage() instead. */
float voltages[PORT_MAX_CHANNELS] = {};
/** DEPRECATED. Unstable API. Use getVoltage() and setVoltage() instead. */
@@ -40,40 +78,40 @@
};

/** Sets the voltage of the given channel. */
- void setVoltage(float voltage, int channel = 0) {
+ void setVoltage(float voltage, int channel = 0) noexcept {
voltages[channel] = voltage;
}

/** Returns the voltage of the given channel.
Because of proper bookkeeping, all channels higher than the input port's number of channels should be 0V.
*/
- float getVoltage(int channel = 0) {
+ float getVoltage(int channel = 0) const noexcept {
return voltages[channel];
}

/** Returns the given channel's voltage if the port is polyphonic, otherwise returns the first voltage (channel 0). */
- float getPolyVoltage(int channel) {
+ float getPolyVoltage(int channel) const noexcept {
return isMonophonic() ? getVoltage(0) : getVoltage(channel);
}

/** Returns the voltage if a cable is connected, otherwise returns the given normal voltage. */
- float getNormalVoltage(float normalVoltage, int channel = 0) {
+ float getNormalVoltage(float normalVoltage, int channel = 0) const noexcept {
return isConnected() ? getVoltage(channel) : normalVoltage;
}

- float getNormalPolyVoltage(float normalVoltage, int channel) {
+ float getNormalPolyVoltage(float normalVoltage, int channel) const noexcept {
return isConnected() ? getPolyVoltage(channel) : normalVoltage;
}

/** Returns a pointer to the array of voltages beginning with firstChannel.
The pointer can be used for reading and writing.
*/
- float* getVoltages(int firstChannel = 0) {
+ float* getVoltages(int firstChannel = 0) noexcept {
return &voltages[firstChannel];
}

/** Copies the port's voltages to an array of size at least `channels`. */
- void readVoltages(float* v) {
+ void readVoltages(float* v) const noexcept {
for (int c = 0; c < channels; c++) {
v[c] = voltages[c];
}
@@ -89,14 +127,14 @@
}

/** Sets all voltages to 0. */
- void clearVoltages() {
+ void clearVoltages() noexcept {
for (int c = 0; c < channels; c++) {
voltages[c] = 0.f;
}
}

/** Returns the sum of all voltages. */
- float getVoltageSum() {
+ float getVoltageSum() const noexcept {
float sum = 0.f;
for (int c = 0; c < channels; c++) {
sum += voltages[c];
@@ -107,7 +145,7 @@
/** Returns the root-mean-square of all voltages.
Uses sqrt() which is slow, so use a custom approximation if calling frequently.
*/
- float getVoltageRMS() {
+ float getVoltageRMS() const {
if (channels == 0) {
return 0.f;
}
@@ -124,22 +162,22 @@
}

template <typename T>
- T getVoltageSimd(int firstChannel) {
+ T getVoltageSimd(int firstChannel) const noexcept {
return T::load(&voltages[firstChannel]);
}

template <typename T>
- T getPolyVoltageSimd(int firstChannel) {
+ T getPolyVoltageSimd(int firstChannel) const noexcept {
return isMonophonic() ? getVoltage(0) : getVoltageSimd<T>(firstChannel);
}

template <typename T>
- T getNormalVoltageSimd(T normalVoltage, int firstChannel) {
+ T getNormalVoltageSimd(T normalVoltage, int firstChannel) const noexcept {
return isConnected() ? getVoltageSimd<T>(firstChannel) : normalVoltage;
}

template <typename T>
- T getNormalPolyVoltageSimd(T normalVoltage, int firstChannel) {
+ T getNormalPolyVoltageSimd(T normalVoltage, int firstChannel) const noexcept {
return isConnected() ? getPolyVoltageSimd<T>(firstChannel) : normalVoltage;
}

@@ -153,13 +191,15 @@
If disconnected, this does nothing (`channels` remains 0).
If 0 is given, `channels` is set to 1 but all voltages are cleared.
*/
- void setChannels(int channels) {
+ void setChannels(int channels) noexcept {
// If disconnected, keep the number of channels at 0.
if (this->channels == 0) {
return;
}
// Set higher channel voltages to 0
for (int c = channels; c < this->channels; c++) {
+ if (c >= PORT_MAX_CHANNELS)
+ __builtin_unreachable();
voltages[c] = 0.f;
}
// Don't allow caller to set port as disconnected
@@ -172,35 +212,39 @@
/** Returns the number of channels.
If the port is disconnected, it has 0 channels.
*/
- int getChannels() {
+ int getChannels() const noexcept {
return channels;
}

/** Returns whether a cable is connected to the Port.
You can use this for skipping code that generates output voltages.
*/
- bool isConnected() {
+ bool isConnected() const noexcept {
return channels > 0;
}

/** Returns whether the cable exists and has 1 channel. */
- bool isMonophonic() {
+ bool isMonophonic() const noexcept {
return channels == 1;
}

/** Returns whether the cable exists and has more than 1 channel. */
- bool isPolyphonic() {
+ bool isPolyphonic() const noexcept {
return channels > 1;
}

/** Use getNormalVoltage() instead. */
- DEPRECATED float normalize(float normalVoltage) {
+ DEPRECATED float normalize(float normalVoltage) const noexcept {
return getNormalVoltage(normalVoltage);
}
};


-struct Output : Port {};
+struct Output : Port {
+ /** List of cables connected to this port. */
+ std::list<Cable*> cables;
+};
+

struct Input : Port {};

0 comments on commit d9246c8

Please sign in to comment.