BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

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