#include #include "AudioMath.h" #include "LookupTableFactory.h" #include "ObjectCache.h" template std::shared_ptr> ObjectCache::getBipolarAudioTaper() { std::shared_ptr< LookupTableParams> ret = bipolarAudioTaper.lock(); if (!ret) { ret = std::make_shared>(); LookupTableFactory::makeBipolarAudioTaper(*ret); bipolarAudioTaper = ret; } return ret; } template std::shared_ptr> ObjectCache::getSinLookup() { std::shared_ptr< LookupTableParams> ret = sinLookupTable.lock(); if (!ret) { ret = std::make_shared>(); std::function f = AudioMath::makeFunc_Sin(); // Used to use 4096, but 256 gives about 80db snr, so let's save memory LookupTable::init(*ret, 256, 0, 1, f); sinLookupTable = ret; } return ret; } template std::shared_ptr> ObjectCache::getExp2() { std::shared_ptr< LookupTableParams> ret = exp2.lock(); if (!ret) { ret = std::make_shared>(); LookupTableFactory::makeExp2(*ret); exp2 = ret; } return ret; } template std::shared_ptr> ObjectCache::getDb2Gain() { std::shared_ptr< LookupTableParams> ret = db2Gain.lock(); if (!ret) { ret = std::make_shared>(); LookupTable::init(*ret, 32, -80, 20, [](double x) { return AudioMath::gainFromDb(x); }); db2Gain = ret; } return ret; } template std::shared_ptr> ObjectCache::getTanh5() { std::shared_ptr< LookupTableParams> ret = tanh5.lock(); if (!ret) { ret = std::make_shared>(); LookupTable::init(*ret, 256, -5, 5, [](double x) { return std::tanh(x); }); tanh5 = ret; } return ret; } // The weak pointer that hold our singletons. template std::weak_ptr> ObjectCache::bipolarAudioTaper; template std::weak_ptr> ObjectCache::sinLookupTable; template std::weak_ptr> ObjectCache::exp2; template std::weak_ptr> ObjectCache::db2Gain; template std::weak_ptr> ObjectCache::tanh5; // Explicit instantiation, so we can put implementation into .cpp file template class ObjectCache; template class ObjectCache;