macOS/clang++ Porting work

- std=c++2a instead of c++20. QT Creator mkspec for mac requires this
- added missing headers in some places. likely other headers are missing
- expanded WITH_BOOST segments to include memory_resource stuff
- moved SVFilter template process() into header.
master
Rachel Fae Fox (foxiepaws) 2022-03-31 03:22:59 -04:00
parent b92dd4f3c5
commit 7aa71c5cc2
8 changed files with 71 additions and 19 deletions

View File

@ -3,11 +3,26 @@
#include <memory>
#include <functional>
#include <unordered_map>
#ifdef WITH_BOOST
#include <boost/container/pmr/memory_resource.hpp>
#include <boost/container/pmr/polymorphic_allocator.hpp>
using boost::container::pmr::polymorphic_allocator;
template <class Key,
class T,
class Hash = std::hash<Key>,
class Pred = std::equal_to<Key>>
using unordered_map = std::unordered_map<Key, T, Hash, Pred, polymorphic_allocator<std::pair<const Key,T>>>;
template <class Key, class T,
class Hash = std::hash<Key>,
class Pred = std::equal_to<Key>>
using unordered_multimap = std::unordered_multimap<Key, T, Hash, Pred, polymorphic_allocator<std::pair<const Key,T>>>;
#else
using std::pmr::unordered_map;
using std::pmr::unordered_multimap;
#endif
#include <array>
#include "nodelib/basics.h"
#include "data/node.h"
#include "util/mem.h"
namespace Xybrid::Data {
@ -91,8 +106,8 @@ namespace Xybrid::NodeLib {
double volume = 1.0;
double pan = 0.0;
std::pmr::unordered_map<uint16_t, Note> activeNotes = {16, Util::ralloc};
std::pmr::unordered_multimap<uint16_t, Tween> activeTweens = {16, Util::ralloc};
unordered_map<uint16_t, Note> activeNotes = {16, Util::ralloc};
unordered_multimap<uint16_t, Tween> activeTweens = {16, Util::ralloc};
std::function<bool(Note*, const ParamReader&)> paramFilter;
std::unordered_map<uint8_t, std::function<bool(const ParamReader&)>> globalParam;

View File

@ -10,7 +10,7 @@ using namespace Xybrid::Audio;
template class Xybrid::NodeLib::GenericSVFilter<AudioFrame>;
template class Xybrid::NodeLib::GenericSVFilter<double>;
/*
template<typename DT>
void GenericSVFilter<DT>::process(DT in, double cutoff, double resonance, int ovs) {
if (ovs <= 0) return;
@ -28,3 +28,4 @@ void GenericSVFilter<DT>::process(DT in, double cutoff, double resonance, int ov
}
notch = high+low;
}
*/

View File

@ -2,8 +2,10 @@
#include <cstring>
#include <cmath>
#include "data/audioframe.h"
#include "nodelib/basics.h"
#include "audio/audioengine.h"
using namespace Xybrid::Audio;
namespace Xybrid::NodeLib {
/// 12db Chamberlin State Variable Filter
@ -23,7 +25,22 @@ namespace Xybrid::NodeLib {
inline GenericSVFilter<DT>(const GenericSVFilter<DT>& o) { std::memcpy(static_cast<void*>(this), static_cast<const void*>(&o), sizeof(o)); }
inline GenericSVFilter<DT>& operator=(const GenericSVFilter<DT>& o) { std::memcpy(static_cast<void*>(this), static_cast<const void*>(&o), sizeof(o)); return *this; }
void process(DT in, double cutoff, double resonance, int oversamp = DEFAULT_OVERSAMP);
void process(DT in, double cutoff, double resonance, int oversamp = DEFAULT_OVERSAMP) {
if (oversamp <= 0) return;
cutoff = std::max(cutoff, 1.0);
resonance = std::max(resonance, 0.01);
double f = 2.0 * std::sin(PI * cutoff / (audioEngine->curSampleRate() * oversamp));
double q = std::sqrt(1.0 - std::atan(std::sqrt(resonance)) * 2.0 / PI);
double damp = std::sqrt(q);
for (int i = 0; i < oversamp; i++) {
low += band*f;
high = in*damp - low - band*q;
band += high*f;
}
notch = high+low;
}
inline void reset() { low = 0.0; high = 0.0; band = 0.0; notch = 0.0; }
inline void normalize(double m) {
if constexpr (std::is_arithmetic_v<DT>) {
@ -48,7 +65,7 @@ namespace Xybrid::NodeLib {
extern template void Xybrid::NodeLib::GenericSVFilter<double>::process(double, double, double, int);
/// 12db Chamberlin State Variable Filter
typedef GenericSVFilter<Data::AudioFrame> SVFilter;
typedef GenericSVFilter<Xybrid::Data::AudioFrame> SVFilter;
/// 12db Chamberlin State Variable Filter (mono version)
typedef GenericSVFilter<double> SVFilterM;
}

View File

@ -16,7 +16,6 @@
#include "data/node.h"
#include "data/audioframe.h"
#include "nodelib/svfilter.h"
#include "nodelib/param.h"

View File

@ -4,7 +4,7 @@
#include "data/node.h"
#include "data/audioframe.h"
#include <array>
namespace Xybrid::Gadgets {
class QuickLevel : public Data::Node {
QContiguousCache<Data::AudioFrame> buf;

View File

@ -2,7 +2,7 @@
using namespace Xybrid::Util;
std::pmr::synchronized_pool_resource Xybrid::Util::rpool; // instantiate
synchronized_pool_resource Xybrid::Util::rpool; // instantiate
decltype(Xybrid::Util::ralloc) Xybrid::Util::ralloc(&rpool);
namespace {
@ -15,7 +15,7 @@ void Xybrid::Util::reserveInitialPool() {
const constexpr size_t rsize = 1024*1024*128;
size_t bsize = rpool.options().largest_required_pool_block;
std::vector<void*> allocs;
vector<void*> allocs;
for (size_t ts = 0; ts < rsize; ts += bsize) {
allocs.push_back(rpool.allocate(bsize));
}

View File

@ -3,12 +3,32 @@
#include <cstddef>
#include <list>
#include <deque>
#ifdef WITH_BOOST
#include <boost/container/pmr/memory_resource.hpp>
#include <boost/container/pmr/polymorphic_allocator.hpp>
#include <boost/container/pmr/synchronized_pool_resource.hpp>
#include <boost/container/vector.hpp>
using boost::container::pmr::synchronized_pool_resource;
using boost::container::pmr::polymorphic_allocator;
using boost::container::vector;
#else
#include <memory_resource>
using std::pmr::synchronized_pool_resource;
using std::pmr::polymorphic_allocator;
#endif
#include <unordered_set>
#ifdef WITH_BOOST
template <class Key,
class Hash = std::hash<Key>,
class Pred = std::equal_to<Key>>
using unordered_set = std::unordered_set<Key, Hash, Pred, polymorphic_allocator<Key>>;
#else
using std::pmr::unordered_set;
using std::vector;
#endif
namespace Xybrid::Util {
extern std::pmr::synchronized_pool_resource rpool;
extern std::pmr::polymorphic_allocator<std::max_align_t> ralloc;
extern synchronized_pool_resource rpool;
extern polymorphic_allocator<std::max_align_t> ralloc;
void reserveInitialPool();
@ -18,7 +38,7 @@ namespace Xybrid::Util {
std::list<slot[PSIZE]> pages;
std::deque<T*> avail;
std::pmr::unordered_set<T*> used = {rpool};
unordered_set<T*> used = {rpool};
void newPage() {
auto p = pages.emplace_back();

View File

@ -26,7 +26,7 @@ DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050F00
DISTFILES += ../.astylerc
CONFIG += c++20
CONFIG += c++2a
# use all optimizations that won't generally interfere with debugging
QMAKE_CXXFLAGS_DEBUG += -Og
@ -49,12 +49,12 @@ freebsd-clang {
macx: {
DEFINES += WITH_BOOST
LIBS += -L/usr/local/Cellar/boost/1.70.0/lib/ -lboost_math_tr1
LIBS += -L/Users/rachel/.nix-profile/lib -lboost_container -lboost_math_tr1
LIBS += -framework OpenGL
LIBS += -framework Foundation
SOURCES +=
HEADERS +=
QMAKE_CXXFLAGS += -g -I/usr/local/Cellar/boost/1.70.0/include/
QMAKE_CXXFLAGS += -g -I/nix/store/gp7ascpyzsprb2i79kl5a22rmyawwscb-boost-1.77.0-dev/include
}