diff DPF-Prymula-audioplugins/dpf/distrho/DistrhoUtils.hpp @ 3:84e66ea83026

DPF-Prymula-audioplugins-0.231015-2
author prymula <prymula76@outlook.com>
date Mon, 16 Oct 2023 21:53:34 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DPF-Prymula-audioplugins/dpf/distrho/DistrhoUtils.hpp	Mon Oct 16 21:53:34 2023 +0200
@@ -0,0 +1,324 @@
+/*
+ * DISTRHO Plugin Framework (DPF)
+ * Copyright (C) 2012-2023 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.
+ */
+
+#ifndef DISTRHO_UTILS_HPP_INCLUDED
+#define DISTRHO_UTILS_HPP_INCLUDED
+
+#include "src/DistrhoDefines.h"
+
+#include <cstdarg>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+#include <cmath>
+#include <limits>
+
+#ifdef DISTRHO_PROPER_CPP11_SUPPORT
+# include <cstdint>
+#else
+# include <stdint.h>
+#endif
+
+#if defined(DISTRHO_OS_WINDOWS) && defined(_MSC_VER)
+#include <basetsd.h>
+typedef SSIZE_T ssize_t;
+#endif
+
+#if ! defined(CARLA_MATH_UTILS_HPP_INCLUDED) && ! defined(DISTRHO_PROPER_CPP11_SUPPORT)
+namespace std {
+inline float fmin(float __x, float __y)
+  { return __builtin_fminf(__x, __y); }
+inline float fmax(float __x, float __y)
+  { return __builtin_fmaxf(__x, __y); }
+inline float rint(float __x)
+  { return __builtin_rintf(__x); }
+inline float round(float __x)
+  { return __builtin_roundf(__x); }
+}
+#endif
+
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+
+#define DISTRHO_MACRO_AS_STRING_VALUE(MACRO) #MACRO
+#define DISTRHO_MACRO_AS_STRING(MACRO) DISTRHO_MACRO_AS_STRING_VALUE(MACRO)
+
+/* --------------------------------------------------------------------------------------------------------------------
+ * misc functions */
+
+/**
+   @defgroup MiscellaneousFunctions Miscellaneous functions
+
+   @{
+ */
+
+/**
+   Return a 32-bit number from 4 8-bit numbers.@n
+   The return type is a int64_t for better compatibility with plugin formats that use such numbers.
+ */
+static inline constexpr
+int64_t d_cconst(const uint8_t a, const uint8_t b, const uint8_t c, const uint8_t d) noexcept
+{
+    return (a << 24) | (b << 16) | (c << 8) | (d << 0);
+}
+
+/**
+   Return an hexadecimal representation of a MAJ.MIN.MICRO version number.
+ */
+static inline constexpr
+uint32_t d_version(const uint8_t major, const uint8_t minor, const uint8_t micro) noexcept
+{
+    return uint32_t(major << 16) | uint32_t(minor << 8) | (micro << 0);
+}
+
+/**
+   Dummy, no-op function.
+ */
+static inline
+void d_pass() noexcept {}
+
+/** @} */
+
+/* --------------------------------------------------------------------------------------------------------------------
+ * string print functions */
+
+/**
+   @defgroup StringPrintFunctions String print functions
+
+   @{
+ */
+
+/**
+   Print a string to stdout with newline (gray color).
+   Does nothing if DEBUG is not defined.
+ */
+#ifndef DEBUG
+# define d_debug(...)
+#else
+static inline
+void d_debug(const char* const fmt, ...) noexcept
+{
+    try {
+        va_list args;
+        va_start(args, fmt);
+        std::fprintf(stdout, "\x1b[30;1m");
+        std::vfprintf(stdout, fmt, args);
+        std::fprintf(stdout, "\x1b[0m\n");
+        va_end(args);
+    } catch (...) {}
+}
+#endif
+
+/**
+   Print a string to stdout with newline.
+ */
+static inline
+void d_stdout(const char* const fmt, ...) noexcept
+{
+    try {
+        va_list args;
+        va_start(args, fmt);
+        std::vfprintf(stdout, fmt, args);
+        std::fprintf(stdout, "\n");
+        va_end(args);
+    } catch (...) {}
+}
+
+/**
+   Print a string to stderr with newline.
+ */
+static inline
+void d_stderr(const char* const fmt, ...) noexcept
+{
+    try {
+        va_list args;
+        va_start(args, fmt);
+        std::vfprintf(stderr, fmt, args);
+        std::fprintf(stderr, "\n");
+        va_end(args);
+    } catch (...) {}
+}
+
+/**
+   Print a string to stderr with newline (red color).
+ */
+static inline
+void d_stderr2(const char* const fmt, ...) noexcept
+{
+    try {
+        va_list args;
+        va_start(args, fmt);
+        std::fprintf(stderr, "\x1b[31m");
+        std::vfprintf(stderr, fmt, args);
+        std::fprintf(stderr, "\x1b[0m\n");
+        va_end(args);
+    } catch (...) {}
+}
+
+/**
+   Print a safe assertion error message.
+ */
+static inline
+void d_safe_assert(const char* const assertion, const char* const file, const int line) noexcept
+{
+    d_stderr2("assertion failure: \"%s\" in file %s, line %i", assertion, file, line);
+}
+
+/**
+   Print a safe assertion error message, with 1 extra signed integer value.
+ */
+static inline
+void d_safe_assert_int(const char* const assertion, const char* const file,
+                       const int line, const int value) noexcept
+{
+    d_stderr2("assertion failure: \"%s\" in file %s, line %i, value %i", assertion, file, line, value);
+}
+
+/**
+   Print a safe assertion error message, with 1 extra unsigned integer value.
+ */
+static inline
+void d_safe_assert_uint(const char* const assertion, const char* const file,
+                        const int line, const uint value) noexcept
+{
+    d_stderr2("assertion failure: \"%s\" in file %s, line %i, value %u", assertion, file, line, value);
+}
+
+/**
+   Print a safe assertion error message, with 2 extra signed integer values.
+ */
+static inline
+void d_safe_assert_int2(const char* const assertion, const char* const file,
+                        const int line, const int v1, const int v2) noexcept
+{
+    d_stderr2("assertion failure: \"%s\" in file %s, line %i, v1 %i, v2 %i", assertion, file, line, v1, v2);
+}
+
+/**
+   Print a safe assertion error message, with 2 extra unsigned integer values.
+ */
+static inline
+void d_safe_assert_uint2(const char* const assertion, const char* const file,
+                         const int line, const uint v1, const uint v2) noexcept
+{
+    d_stderr2("assertion failure: \"%s\" in file %s, line %i, v1 %u, v2 %u", assertion, file, line, v1, v2);
+}
+
+/**
+   Print a safe assertion error message, with a custom error message.
+ */
+static inline
+void d_custom_safe_assert(const char* const message, const char* const assertion, const char* const file,
+                          const int line) noexcept
+{
+    d_stderr2("assertion failure: %s, condition \"%s\" in file %s, line %i", message, assertion, file, line);
+}
+
+/**
+   Print a safe exception error message.
+ */
+static inline
+void d_safe_exception(const char* const exception, const char* const file, const int line) noexcept
+{
+    d_stderr2("exception caught: \"%s\" in file %s, line %i", exception, file, line);
+}
+
+/** @} */
+
+/* --------------------------------------------------------------------------------------------------------------------
+ * math functions */
+
+/**
+   @defgroup MathFunctions Math related functions
+
+   @{
+ */
+
+/**
+   Safely compare two floating point numbers.
+   Returns true if they match.
+ */
+template<typename T>
+static inline constexpr
+bool d_isEqual(const T& v1, const T& v2)
+{
+    return std::abs(v1-v2) < std::numeric_limits<T>::epsilon();
+}
+
+/**
+   Safely compare two floating point numbers.
+   Returns true if they don't match.
+ */
+template<typename T>
+static inline constexpr
+bool d_isNotEqual(const T& v1, const T& v2)
+{
+    return std::abs(v1-v2) >= std::numeric_limits<T>::epsilon();
+}
+
+/**
+   Safely check if a floating point number is zero.
+ */
+template<typename T>
+static inline constexpr
+bool d_isZero(const T& value)
+{
+    return std::abs(value) < std::numeric_limits<T>::epsilon();
+}
+
+/**
+   Safely check if a floating point number is not zero.
+ */
+template<typename T>
+static inline constexpr
+bool d_isNotZero(const T& value)
+{
+    return std::abs(value) >= std::numeric_limits<T>::epsilon();
+}
+
+/**
+   Get next power of 2.
+ */
+static inline
+uint32_t d_nextPowerOf2(uint32_t size) noexcept
+{
+    DISTRHO_SAFE_ASSERT_RETURN(size > 0, 0);
+
+    // http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
+    --size;
+    size |= size >> 1;
+    size |= size >> 2;
+    size |= size >> 4;
+    size |= size >> 8;
+    size |= size >> 16;
+    return ++size;
+}
+
+/** @} */
+
+/* --------------------------------------------------------------------------------------------------------------------
+ * math functions */
+
+#ifndef DONT_SET_USING_DISTRHO_NAMESPACE
+  // If your code uses a lot of DISTRHO classes, then this will obviously save you
+  // a lot of typing, but can be disabled by setting DONT_SET_USING_DISTRHO_NAMESPACE.
+  namespace DISTRHO_NAMESPACE {}
+  using namespace DISTRHO_NAMESPACE;
+#endif
+
+#endif // DISTRHO_UTILS_HPP_INCLUDED