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.

196 lines
4.3KB

  1. /*
  2. Copyright (C) 2006-2011 Nasca Octavian Paul
  3. Author: Nasca Octavian Paul
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of version 2 of the GNU General Public License
  6. as published by the Free Software Foundation.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License (version 2) for more details.
  11. You should have received a copy of the GNU General Public License (version 2)
  12. along with this program; if not, write to the Free Software Foundation,
  13. Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  14. */
  15. #pragma once
  16. #include <vector>
  17. #include <memory>
  18. #include "../JuceLibraryCode/JuceHeader.h"
  19. using REALTYPE = float;
  20. using floatvector = std::vector<REALTYPE>;
  21. using float2dvector = std::vector<std::vector<float>>;
  22. using float3dvector = std::vector<std::vector<std::vector<float>>>;
  23. template<typename T>
  24. inline std::unique_ptr<T> unique_from_raw(T* ptr)
  25. {
  26. return std::unique_ptr<T>(ptr);
  27. }
  28. template<typename T>
  29. inline String toString(const T& x)
  30. {
  31. return String(x);
  32. }
  33. inline String toString(double x)
  34. {
  35. return String(x,3);
  36. }
  37. template<typename... Args>
  38. inline String formatted(Args... args)
  39. {
  40. String result;
  41. (result << ... << toString(args));
  42. return result;
  43. }
  44. #ifndef USEOLDPLAYCURSOR
  45. #define USEOLDPLAYCURSOR
  46. #endif
  47. #ifndef NULL
  48. #define NULL 0
  49. #endif
  50. #ifndef M_PI
  51. #define M_PI 3.14159265359
  52. #endif
  53. const int g_maxnumoutchans = 32;
  54. #ifndef USE_LUA_SCRIPTING
  55. //#define USE_LUA_SCRIPTING
  56. #endif
  57. inline void storeToTreeProperties(ValueTree dest, UndoManager* uman, juce::Identifier varname, var val)
  58. {
  59. dest.setProperty(varname, val, uman);
  60. }
  61. template<typename... Ts>
  62. inline void storeToTreeProperties(ValueTree dest, UndoManager* uman, juce::Identifier varname, var val, Ts&&... args)
  63. {
  64. dest.setProperty(varname, val, uman);
  65. storeToTreeProperties(dest, uman, args...);
  66. }
  67. template<typename T>
  68. inline void storeToTreeProperties(ValueTree dest, UndoManager* uman, juce::Identifier varname, Range<T> x)
  69. {
  70. dest.setProperty(varname+"_start", x.getStart(), uman);
  71. dest.setProperty(varname+"_end", x.getEnd(), uman);
  72. }
  73. template<typename T>
  74. inline void getFromTreeProperties(ValueTree src, juce::Identifier varname, T& val)
  75. {
  76. if (src.hasProperty(varname))
  77. val = src.getProperty(varname);
  78. }
  79. template<typename... Ts, typename T>
  80. inline void getFromTreeProperties(ValueTree src, juce::Identifier varname, T& val, Ts&... args)
  81. {
  82. if (src.hasProperty(varname))
  83. val = src.getProperty(varname);
  84. getFromTreeProperties(src, args...);
  85. }
  86. template<typename T>
  87. inline void getFromTreeProperties(ValueTree src, juce::Identifier varname, Range<T>& rng)
  88. {
  89. if (src.hasProperty(varname + "_start") && src.hasProperty(varname + "_end"))
  90. {
  91. rng.setStart(src.getProperty(varname + "_start"));
  92. rng.setEnd(src.getProperty(varname + "_end"));
  93. }
  94. }
  95. template<typename F>
  96. inline void timeCall(String msgprefix,F&& f)
  97. {
  98. double t0 = Time::getMillisecondCounterHiRes();
  99. f();
  100. double t1 = Time::getMillisecondCounterHiRes();
  101. Logger::writeToLog(formatted(msgprefix, " took " , t1 - t0 , " ms"));
  102. }
  103. template<typename T>
  104. class CircularBuffer final
  105. {
  106. public:
  107. CircularBuffer(int size)
  108. {
  109. m_buf.resize(size);
  110. }
  111. void clear()
  112. {
  113. m_avail = 0;
  114. m_readpos = 0;
  115. m_writepos = 0;
  116. std::fill(m_buf.begin(), m_buf.end(), T());
  117. }
  118. void push(T x)
  119. {
  120. m_buf[m_writepos] = x;
  121. ++m_writepos;
  122. ++m_avail;
  123. if (m_writepos >= m_buf.size())
  124. m_writepos = 0;
  125. }
  126. T get()
  127. {
  128. jassert(m_avail > 0);
  129. T x = m_buf[m_readpos];
  130. ++m_readpos;
  131. --m_avail;
  132. if (m_readpos >= m_buf.size())
  133. m_readpos = 0;
  134. return x;
  135. }
  136. int available() { return m_avail; }
  137. int getToBuf(T* buf, int len)
  138. {
  139. jassert(m_avail > 0);
  140. if (len > m_avail)
  141. len = m_avail;
  142. for (int i = 0; i < len; ++i)
  143. buf[i] = get();
  144. return len;
  145. }
  146. int getFromBuf(T* buf, int len)
  147. {
  148. for (int i = 0; i < len; ++i)
  149. push(buf[i]);
  150. return len;
  151. }
  152. int getSize() { return (int)m_buf.size(); }
  153. void resize(int size)
  154. {
  155. m_avail = 0;
  156. m_readpos = 0;
  157. m_writepos = 0;
  158. m_buf.resize(size);
  159. }
  160. private:
  161. int m_writepos = 0;
  162. int m_readpos = 0;
  163. int m_avail = 0;
  164. std::vector<T> m_buf;
  165. };
  166. template<typename Cont,typename T>
  167. inline void fill_container(Cont& c, const T& x)
  168. {
  169. std::fill(std::begin(c), std::end(c), x);
  170. }