Collection of tools useful for audio production
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.

405 lines
10KB

  1. /*
  2. * Carla Native Plugin API
  3. * Copyright (C) 2012 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the COPYING file
  16. */
  17. #ifndef CARLA_NATIVE_MM_H
  18. #define CARLA_NATIVE_MM_H
  19. #include "carla_native.h"
  20. #include "carla_includes.h"
  21. class PluginDescriptorClass {
  22. public:
  23. PluginDescriptorClass()
  24. {
  25. desc.category = PLUGIN_CATEGORY_NONE;
  26. desc.hints = 0;
  27. desc.name = nullptr;
  28. desc.label = nullptr;
  29. desc.maker = nullptr;
  30. desc.copyright = nullptr;
  31. desc.portCount = 0;
  32. desc.ports = nullptr;
  33. desc.midiProgramCount = 0;
  34. desc.midiPrograms = nullptr;
  35. host = nullptr;
  36. _initDescriptor();
  37. }
  38. PluginDescriptorClass(PluginDescriptorClass* that)
  39. {
  40. desc.category = that->desc.category;
  41. desc.hints = that->desc.hints;
  42. desc.name = that->desc.name;
  43. desc.label = that->desc.label;
  44. desc.maker = that->desc.maker;
  45. desc.copyright = that->desc.copyright;
  46. desc.portCount = that->desc.portCount;
  47. desc.ports = that->desc.ports;
  48. desc.midiProgramCount = that->desc.midiProgramCount;
  49. desc.midiPrograms = that->desc.midiPrograms;
  50. host = that->host;
  51. _initDescriptor();
  52. }
  53. virtual ~PluginDescriptorClass()
  54. {
  55. }
  56. PluginDescriptor* descriptorInit()
  57. {
  58. desc.category = getCategory();
  59. desc.hints = getHints();
  60. desc.name = getName();
  61. desc.label = getLabel();
  62. desc.maker = getMaker();
  63. desc.copyright = getCopyright();
  64. return &desc;
  65. }
  66. // -------------------------------------------------------------------
  67. protected:
  68. virtual PluginDescriptorClass* createMe() = 0;
  69. virtual void deleteMe() = 0;
  70. virtual PluginCategory getCategory()
  71. {
  72. return PLUGIN_CATEGORY_NONE;
  73. }
  74. virtual uint32_t getHints()
  75. {
  76. return 0;
  77. }
  78. virtual const char* getName()
  79. {
  80. return nullptr;
  81. }
  82. virtual const char* getLabel()
  83. {
  84. return nullptr;
  85. }
  86. virtual const char* getMaker()
  87. {
  88. return nullptr;
  89. }
  90. virtual const char* getCopyright()
  91. {
  92. return nullptr;
  93. }
  94. // -------------------------------------------------------------------
  95. virtual uint32_t getPortCount()
  96. {
  97. return 0;
  98. }
  99. virtual PortType getPortType(uint32_t index)
  100. {
  101. Q_ASSERT(index < getPortCount());
  102. return PORT_TYPE_NULL;
  103. }
  104. virtual uint32_t getPortHints(uint32_t index)
  105. {
  106. Q_ASSERT(index < getPortCount());
  107. return 0;
  108. }
  109. virtual const char* getPortName(uint32_t index)
  110. {
  111. Q_ASSERT(index < getPortCount());
  112. return nullptr;
  113. }
  114. virtual void getParameterRanges(uint32_t index, ParameterRanges* ranges)
  115. {
  116. Q_ASSERT(index < getPortCount());
  117. Q_ASSERT(ranges);
  118. }
  119. virtual double getParameterValue(uint32_t index)
  120. {
  121. Q_ASSERT(index < getPortCount());
  122. return 0.0;
  123. }
  124. virtual const char* getParameterText(uint32_t index)
  125. {
  126. Q_ASSERT(index < getPortCount());
  127. return nullptr;
  128. }
  129. virtual const char* getParameterUnit(uint32_t index)
  130. {
  131. Q_ASSERT(index < getPortCount());
  132. return nullptr;
  133. }
  134. // -------------------------------------------------------------------
  135. virtual uint32_t getMidiProgramCount()
  136. {
  137. return 0;
  138. }
  139. virtual void getMidiProgram(uint32_t index, MidiProgram* midiProgram)
  140. {
  141. Q_ASSERT(index < getMidiProgramCount());
  142. Q_ASSERT(midiProgram);
  143. }
  144. // -------------------------------------------------------------------
  145. virtual void setParameterValue(uint32_t index, double value)
  146. {
  147. Q_ASSERT(index < getPortCount());
  148. Q_UNUSED(value);
  149. }
  150. virtual void setMidiProgram(uint32_t bank, uint32_t program)
  151. {
  152. Q_ASSERT(program < 128);
  153. Q_UNUSED(bank);
  154. }
  155. virtual void setCustomData(const char* key, const char* value)
  156. {
  157. Q_ASSERT(key);
  158. Q_ASSERT(value);
  159. }
  160. // -------------------------------------------------------------------
  161. virtual void activate()
  162. {
  163. }
  164. virtual void deactivate()
  165. {
  166. }
  167. // -------------------------------------------------------------------
  168. virtual void showGui(bool show)
  169. {
  170. Q_UNUSED(show);
  171. }
  172. virtual void idleGui()
  173. {
  174. }
  175. // -------------------------------------------------------------------
  176. virtual void process(float** inBuffer, float** outBuffer, const uint32_t frames, uint32_t midiEventCount, MidiEvent* midiEvents)
  177. {
  178. Q_ASSERT(inBuffer);
  179. Q_ASSERT(outBuffer);
  180. Q_ASSERT(midiEvents);
  181. Q_UNUSED(frames);
  182. Q_UNUSED(midiEventCount);
  183. }
  184. // -------------------------------------------------------------------
  185. private:
  186. PluginDescriptor desc;
  187. const HostDescriptor* host;
  188. void _initDescriptor()
  189. {
  190. desc.instantiate = _instantiate;
  191. desc.activate = _activate;
  192. desc.deactivate = _deactivate;
  193. desc.cleanup = _cleanup;
  194. desc.get_parameter_ranges = _get_parameter_ranges;
  195. desc.get_parameter_value = _get_parameter_value;
  196. desc.get_parameter_text = _get_parameter_text;
  197. desc.get_parameter_unit = _get_parameter_unit;
  198. desc.set_parameter_value = _set_parameter_value;
  199. desc.set_midi_program = _set_midi_program;
  200. desc.set_custom_data = _set_custom_data;
  201. desc.show_gui = _show_gui;
  202. desc.idle_gui = _idle_gui;
  203. desc.process = _process;
  204. desc._singleton = this;
  205. desc._init = _init;
  206. desc._fini = _fini;
  207. }
  208. static PluginHandle _instantiate(struct _PluginDescriptor* _this_, HostDescriptor* host)
  209. {
  210. PluginDescriptorClass* handle = ((PluginDescriptorClass*)_this_->_singleton)->createMe();
  211. handle->host = host;
  212. return handle;
  213. }
  214. static void _activate(PluginHandle handle)
  215. {
  216. ((PluginDescriptorClass*)handle)->activate();
  217. }
  218. static void _deactivate(PluginHandle handle)
  219. {
  220. ((PluginDescriptorClass*)handle)->deactivate();
  221. }
  222. static void _cleanup(PluginHandle handle)
  223. {
  224. ((PluginDescriptorClass*)handle)->deleteMe();
  225. }
  226. static void _get_parameter_ranges(PluginHandle handle, uint32_t index, ParameterRanges* ranges)
  227. {
  228. ((PluginDescriptorClass*)handle)->getParameterRanges(index, ranges);
  229. }
  230. static double _get_parameter_value(PluginHandle handle, uint32_t index)
  231. {
  232. return ((PluginDescriptorClass*)handle)->getParameterValue(index);
  233. }
  234. static const char* _get_parameter_text(PluginHandle handle, uint32_t index)
  235. {
  236. return ((PluginDescriptorClass*)handle)->getParameterText(index);
  237. }
  238. static const char* _get_parameter_unit(PluginHandle handle, uint32_t index)
  239. {
  240. return ((PluginDescriptorClass*)handle)->getParameterUnit(index);
  241. }
  242. static void _set_parameter_value(PluginHandle handle, uint32_t index, double value)
  243. {
  244. return ((PluginDescriptorClass*)handle)->setParameterValue(index, value);
  245. }
  246. static void _set_midi_program(PluginHandle handle, uint32_t bank, uint32_t program)
  247. {
  248. return ((PluginDescriptorClass*)handle)->setMidiProgram(bank, program);
  249. }
  250. static void _set_custom_data(PluginHandle handle, const char* key, const char* value)
  251. {
  252. return ((PluginDescriptorClass*)handle)->setCustomData(key, value);
  253. }
  254. static void _show_gui(PluginHandle handle, bool show)
  255. {
  256. return ((PluginDescriptorClass*)handle)->showGui(show);
  257. }
  258. static void _idle_gui(PluginHandle handle)
  259. {
  260. return ((PluginDescriptorClass*)handle)->idleGui();
  261. }
  262. static void _process(PluginHandle handle, float** inBuffer, float** outBuffer, const uint32_t frames, uint32_t midiEventCount, MidiEvent* midiEvents)
  263. {
  264. return ((PluginDescriptorClass*)handle)->process(inBuffer, outBuffer, frames, midiEventCount, midiEvents);
  265. }
  266. static void _init(PluginDescriptor* const _this_)
  267. {
  268. ((PluginDescriptorClass*)_this_->_singleton)->handleInit();
  269. }
  270. static void _fini(PluginDescriptor* const _this_)
  271. {
  272. ((PluginDescriptorClass*)_this_->_singleton)->handleFini();
  273. }
  274. void handleInit()
  275. {
  276. desc.portCount = getPortCount();
  277. if (desc.portCount > 0)
  278. {
  279. desc.ports = new PluginPort [desc.portCount];
  280. for (uint32_t i=0; i < desc.portCount; i++)
  281. {
  282. PluginPort* const port = &desc.ports[i];
  283. port->type = getPortType(i);
  284. port->hints = getPortHints(i);
  285. port->name = getPortName(i);
  286. }
  287. }
  288. desc.midiProgramCount = getMidiProgramCount();
  289. if (desc.midiProgramCount > 0)
  290. {
  291. desc.midiPrograms = new MidiProgram [desc.midiProgramCount];
  292. for (uint32_t i=0; i < desc.midiProgramCount; i++)
  293. getMidiProgram(i, &desc.midiPrograms[i]);
  294. }
  295. }
  296. void handleFini()
  297. {
  298. if (desc.midiProgramCount > 0 && desc.midiPrograms)
  299. delete[] desc.midiPrograms;
  300. desc.midiProgramCount = 0;
  301. desc.midiPrograms = nullptr;
  302. if (desc.portCount > 0 && desc.ports)
  303. delete[] desc.ports;
  304. desc.portCount = 0;
  305. desc.ports = nullptr;
  306. }
  307. };
  308. // -----------------------------------------------------------------------
  309. #define CARLA_REGISTER_NATIVE_PLUGIN_MM(label, descMM) \
  310. void carla_register_native_plugin_##label () __attribute__((constructor)); \
  311. void carla_register_native_plugin_##label () { carla_register_native_plugin(descMM.descriptorInit()); }
  312. #endif // CARLA_NATIVE_MM_H