You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.6KB

  1. #include <assert.h>
  2. #include "AudioMath.h"
  3. #include "LookupTableFactory.h"
  4. #include "ObjectCache.h"
  5. template <typename T>
  6. std::shared_ptr<LookupTableParams<T>> ObjectCache<T>::getBipolarAudioTaper()
  7. {
  8. std::shared_ptr< LookupTableParams<T>> ret = bipolarAudioTaper.lock();
  9. if (!ret) {
  10. ret = std::make_shared<LookupTableParams<T>>();
  11. LookupTableFactory<T>::makeBipolarAudioTaper(*ret);
  12. bipolarAudioTaper = ret;
  13. }
  14. return ret;
  15. }
  16. template <typename T>
  17. std::shared_ptr<LookupTableParams<T>> ObjectCache<T>::getSinLookup()
  18. {
  19. std::shared_ptr< LookupTableParams<T>> ret = sinLookupTable.lock();
  20. if (!ret) {
  21. ret = std::make_shared<LookupTableParams<T>>();
  22. std::function<double(double)> f = AudioMath::makeFunc_Sin();
  23. // Used to use 4096, but 256 gives about 80db snr, so let's save memory
  24. LookupTable<T>::init(*ret, 256, 0, 1, f);
  25. sinLookupTable = ret;
  26. }
  27. return ret;
  28. }
  29. template <typename T>
  30. std::shared_ptr<LookupTableParams<T>> ObjectCache<T>::getExp2()
  31. {
  32. std::shared_ptr< LookupTableParams<T>> ret = exp2.lock();
  33. if (!ret) {
  34. ret = std::make_shared<LookupTableParams<T>>();
  35. LookupTableFactory<T>::makeExp2(*ret);
  36. exp2 = ret;
  37. }
  38. return ret;
  39. }
  40. template <typename T>
  41. std::shared_ptr<LookupTableParams<T>> ObjectCache<T>::getDb2Gain()
  42. {
  43. std::shared_ptr< LookupTableParams<T>> ret = db2Gain.lock();
  44. if (!ret) {
  45. ret = std::make_shared<LookupTableParams<T>>();
  46. LookupTable<T>::init(*ret, 32, -80, 20, [](double x) {
  47. return AudioMath::gainFromDb(x);
  48. });
  49. db2Gain = ret;
  50. }
  51. return ret;
  52. }
  53. template <typename T>
  54. std::shared_ptr<LookupTableParams<T>> ObjectCache<T>::getTanh5()
  55. {
  56. std::shared_ptr< LookupTableParams<T>> ret = tanh5.lock();
  57. if (!ret) {
  58. ret = std::make_shared<LookupTableParams<T>>();
  59. LookupTable<T>::init(*ret, 256, -5, 5, [](double x) {
  60. return std::tanh(x);
  61. });
  62. tanh5 = ret;
  63. }
  64. return ret;
  65. }
  66. // The weak pointer that hold our singletons.
  67. template <typename T>
  68. std::weak_ptr<LookupTableParams<T>> ObjectCache<T>::bipolarAudioTaper;
  69. template <typename T>
  70. std::weak_ptr<LookupTableParams<T>> ObjectCache<T>::sinLookupTable;
  71. template <typename T>
  72. std::weak_ptr<LookupTableParams<T>> ObjectCache<T>::exp2;
  73. template <typename T>
  74. std::weak_ptr<LookupTableParams<T>> ObjectCache<T>::db2Gain;
  75. template <typename T>
  76. std::weak_ptr<LookupTableParams<T>> ObjectCache<T>::tanh5;
  77. // Explicit instantiation, so we can put implementation into .cpp file
  78. template class ObjectCache<double>;
  79. template class ObjectCache<float>;