From 2e1f3e04cbe114d773e0807fa41db9f2c934050a Mon Sep 17 00:00:00 2001 From: "Rachel Fae Fox (foxiepaws)" Date: Thu, 18 Jul 2019 05:08:22 -0400 Subject: [PATCH] WITH_BOOST define added - some platforms don't support C++17 Special Mathmatical functions, most notibly macOS and llvm. This enables this to work by using boost for the bessel functions --- .gitignore | 2 ++ xybrid/nodelib/resampler.cpp | 19 ++++++++++++++++--- xybrid/xybrid.pro | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index f0ad36b..e2579c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # ignore build artifacts build-*/* +*.o # user config *.codekit @@ -7,3 +8,4 @@ build-*/* *.pro.user.* *.stash *.autosave + diff --git a/xybrid/nodelib/resampler.cpp b/xybrid/nodelib/resampler.cpp index 1e0ed44..3097e4b 100644 --- a/xybrid/nodelib/resampler.cpp +++ b/xybrid/nodelib/resampler.cpp @@ -1,10 +1,14 @@ #include "resampler.h" using namespace Xybrid::NodeLib; -#include + #include #include - +#ifdef WITH_BOOST +#include +#else +#include +#endif namespace { const constexpr double PI = 3.141592653589793238462643383279502884197169399375105820974; @@ -18,17 +22,26 @@ namespace { } } + + // generate const std::array, LUT_STEPS> Xybrid::NodeLib::resamplerLUT = [] { +#ifdef WITH_BOOST + double denom = boost::math::cyl_bessel_i(0, KAISER_BETA); +#else double denom = std::cyl_bessel_i(0, KAISER_BETA); - +#endif std::array, LUT_STEPS> t; t[0] = {0, 0, 0, 1, 0, 0, 0, 0}; // we already know the ideal integer step for (size_t step = 1; step < LUT_STEPS; step++) { double sv = static_cast(step) / LUT_STEPS; for (size_t tap = 0; tap < LUT_TAPS; tap++) { double x = static_cast(tap) - sv; +#ifdef WITH_BOOST + t[step][tap] = sinc(x-(LUT_TAPS/2-1)) * (boost::math::cyl_bessel_i(0, KAISER_BETA * std::sqrt(1 - std::pow(((2 * (x+1)) / (LUT_TAPS)) - 1, 2))) / denom); +#else t[step][tap] = sinc(x-(LUT_TAPS/2-1)) * (std::cyl_bessel_i(0, KAISER_BETA * std::sqrt(1 - std::pow(((2 * (x+1)) / (LUT_TAPS)) - 1, 2))) / denom); +#endif if (t[step][tap] != t[step][tap]) t[step][tap] = 0; // NaN guard //std::cout << "tap " << tap << ": " << t[step][tap] << " "; } diff --git a/xybrid/xybrid.pro b/xybrid/xybrid.pro index 3b66d63..6805bda 100644 --- a/xybrid/xybrid.pro +++ b/xybrid/xybrid.pro @@ -17,6 +17,7 @@ TEMPLATE = app # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS + # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. @@ -36,6 +37,24 @@ HEADERS += $$files(*.h, true) \ FORMS += $$files(*.ui, true) RESOURCES += res/resources.qrc +unix:!macx { + +} + +macx: { + DEFINES += WITH_BOOST + LIBS += -L/usr/local/Cellar/boost/1.70.0/lib/ -lboost_math_tr1 + LIBS += -framework OpenGL + QMAKE_CXXFLAGS += -I/usr/local/Cellar/boost/1.70.0/include/ +} + +# TODO: make this work. +CONFIG (boost) { + DEFINES += WITH_BOOST + LIBS += -L$${BOOSTPATH} + QMAKE_CXXFLAGS += -I$${BOOSTINCLUDE} +} + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin