table.hpp (1422B)
1 #pragma once 2 3 #include <assert.h> 4 #include <mutex> 5 6 #include "base.hpp" 7 8 namespace bogaudio { 9 namespace dsp { 10 11 class Table { 12 protected: 13 int _length = 0; 14 float* _table = NULL; 15 16 public: 17 Table(int n = 10) { 18 assert(n > 0); 19 assert(n <= 16); 20 _length = 1 << n; 21 } 22 virtual ~Table() { 23 if (_table) { 24 delete[] _table; 25 } 26 } 27 28 inline int length() const { return _length; } 29 30 inline float value(int i) const { 31 assert(i >= 0 && i < _length); 32 assert(_table); 33 return _table[i]; 34 } 35 36 void generate(); 37 38 protected: 39 virtual void _generate() = 0; 40 }; 41 42 template<class T, int N> class StaticTable { 43 private: 44 Table* _table = NULL; 45 std::mutex _lock; 46 47 StaticTable() { 48 } 49 ~StaticTable() { 50 if (_table) { 51 delete _table; 52 } 53 } 54 55 public: 56 StaticTable(const StaticTable&) = delete; 57 void operator=(const StaticTable&) = delete; 58 59 static const Table& table() { 60 static StaticTable<T, N> instance; 61 std::lock_guard<std::mutex> lock(instance._lock); 62 if (!instance._table) { 63 instance._table = new T(N); 64 instance._table->generate(); 65 } 66 return *instance._table; 67 } 68 }; 69 70 struct SineTable : Table { 71 SineTable(int n = 10) : Table(n) {} 72 void _generate() override; 73 }; 74 struct StaticSineTable : StaticTable<SineTable, 12> {}; 75 76 struct BlepTable : Table { 77 BlepTable(int n = 10) : Table(n) {} 78 void _generate() override; 79 }; 80 struct StaticBlepTable : StaticTable<BlepTable, 12> {}; 81 82 } // namespace dsp 83 } // namespace bogaudio