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.

413 lines
11KB

  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. desc.instantiate = _instantiate;
  36. desc.activate = _activate;
  37. desc.deactivate = _deactivate;
  38. desc.cleanup = _cleanup;
  39. desc.get_parameter_ranges = _get_parameter_ranges;
  40. desc.get_parameter_value = _get_parameter_value;
  41. desc.get_parameter_text = _get_parameter_text;
  42. desc.get_parameter_unit = _get_parameter_unit;
  43. desc.set_parameter_value = _set_parameter_value;
  44. desc.set_midi_program = _set_midi_program;
  45. desc.set_custom_data = _set_custom_data;
  46. desc.show_gui = _show_gui;
  47. desc.idle_gui = _idle_gui;
  48. desc.process = _process;
  49. desc._handle = this;
  50. desc._init = _init;
  51. desc._fini = _fini;
  52. }
  53. PluginDescriptorClass(PluginDescriptorClass* that)
  54. {
  55. desc.category = that->desc.category;
  56. desc.hints = that->desc.hints;
  57. desc.name = that->desc.name;
  58. desc.label = that->desc.label;
  59. desc.maker = that->desc.maker;
  60. desc.copyright = that->desc.copyright;
  61. desc.portCount = that->desc.portCount;
  62. desc.ports = that->desc.ports;
  63. desc.midiProgramCount = that->desc.midiProgramCount;
  64. desc.midiPrograms = that->desc.midiPrograms;
  65. desc.instantiate = _instantiate;
  66. desc.activate = _activate;
  67. desc.deactivate = _deactivate;
  68. desc.cleanup = _cleanup;
  69. desc.get_parameter_ranges = _get_parameter_ranges;
  70. desc.get_parameter_value = _get_parameter_value;
  71. desc.get_parameter_text = _get_parameter_text;
  72. desc.get_parameter_unit = _get_parameter_unit;
  73. desc.set_parameter_value = _set_parameter_value;
  74. desc.set_midi_program = _set_midi_program;
  75. desc.set_custom_data = _set_custom_data;
  76. desc.show_gui = _show_gui;
  77. desc.idle_gui = _idle_gui;
  78. desc.process = _process;
  79. desc._handle = this;
  80. desc._init = _init;
  81. desc._fini = _fini;
  82. }
  83. virtual ~PluginDescriptorClass()
  84. {
  85. }
  86. PluginDescriptor* descriptorInit()
  87. {
  88. desc.category = getCategory();
  89. desc.hints = getHints();
  90. desc.name = getName();
  91. desc.label = getLabel();
  92. desc.maker = getMaker();
  93. desc.copyright = getCopyright();
  94. return &desc;
  95. }
  96. // -------------------------------------------------------------------
  97. protected:
  98. virtual PluginDescriptorClass* createMe() = 0;
  99. virtual void deleteMe() = 0;
  100. virtual PluginCategory getCategory()
  101. {
  102. return PLUGIN_CATEGORY_NONE;
  103. }
  104. virtual uint32_t getHints()
  105. {
  106. return 0;
  107. }
  108. virtual const char* getName()
  109. {
  110. return nullptr;
  111. }
  112. virtual const char* getLabel()
  113. {
  114. return nullptr;
  115. }
  116. virtual const char* getMaker()
  117. {
  118. return nullptr;
  119. }
  120. virtual const char* getCopyright()
  121. {
  122. return nullptr;
  123. }
  124. // -------------------------------------------------------------------
  125. virtual uint32_t getPortCount()
  126. {
  127. return 0;
  128. }
  129. virtual PortType getPortType(uint32_t index)
  130. {
  131. Q_ASSERT(index < getPortCount());
  132. return PORT_TYPE_NULL;
  133. }
  134. virtual uint32_t getPortHints(uint32_t index)
  135. {
  136. Q_ASSERT(index < getPortCount());
  137. return 0;
  138. }
  139. virtual const char* getPortName(uint32_t index)
  140. {
  141. Q_ASSERT(index < getPortCount());
  142. return nullptr;
  143. }
  144. virtual void getParameterRanges(uint32_t index, ParameterRanges* ranges)
  145. {
  146. Q_ASSERT(index < getPortCount());
  147. Q_ASSERT(ranges);
  148. }
  149. virtual double getParameterValue(uint32_t index)
  150. {
  151. Q_ASSERT(index < getPortCount());
  152. return 0.0;
  153. }
  154. virtual const char* getParameterText(uint32_t index)
  155. {
  156. Q_ASSERT(index < getPortCount());
  157. return nullptr;
  158. }
  159. virtual const char* getParameterUnit(uint32_t index)
  160. {
  161. Q_ASSERT(index < getPortCount());
  162. return nullptr;
  163. }
  164. // -------------------------------------------------------------------
  165. virtual uint32_t getMidiProgramCount()
  166. {
  167. return 0;
  168. }
  169. virtual void getMidiProgram(uint32_t index, MidiProgram* midiProgram)
  170. {
  171. Q_ASSERT(index < getMidiProgramCount());
  172. Q_ASSERT(midiProgram);
  173. }
  174. // -------------------------------------------------------------------
  175. virtual void setParameterValue(uint32_t index, double value)
  176. {
  177. Q_ASSERT(index < getPortCount());
  178. Q_UNUSED(value);
  179. }
  180. virtual void setMidiProgram(uint32_t bank, uint32_t program)
  181. {
  182. Q_ASSERT(program < 128);
  183. Q_UNUSED(bank);
  184. }
  185. virtual void setCustomData(const char* key, const char* value)
  186. {
  187. Q_ASSERT(key);
  188. Q_ASSERT(value);
  189. }
  190. // -------------------------------------------------------------------
  191. virtual void activate()
  192. {
  193. }
  194. virtual void deactivate()
  195. {
  196. }
  197. // -------------------------------------------------------------------
  198. virtual void showGui(bool show)
  199. {
  200. Q_UNUSED(show);
  201. }
  202. virtual void idleGui()
  203. {
  204. }
  205. // -------------------------------------------------------------------
  206. virtual void process(float** inBuffer, float** outBuffer, const uint32_t frames, uint32_t midiEventCount, MidiEvent* midiEvents)
  207. {
  208. Q_ASSERT(inBuffer);
  209. Q_ASSERT(outBuffer);
  210. Q_ASSERT(midiEvents);
  211. Q_UNUSED(frames);
  212. Q_UNUSED(midiEventCount);
  213. }
  214. // -------------------------------------------------------------------
  215. private:
  216. PluginDescriptor desc;
  217. static PluginHandle _instantiate(struct _PluginDescriptor* _this_)
  218. {
  219. return ((PluginDescriptorClass*)_this_->_handle)->createMe();
  220. }
  221. static void _activate(PluginHandle handle)
  222. {
  223. ((PluginDescriptorClass*)handle)->activate();
  224. }
  225. static void _deactivate(PluginHandle handle)
  226. {
  227. ((PluginDescriptorClass*)handle)->deactivate();
  228. }
  229. static void _cleanup(PluginHandle handle)
  230. {
  231. ((PluginDescriptorClass*)handle)->deleteMe();
  232. }
  233. static void _get_parameter_ranges(PluginHandle handle, uint32_t index, ParameterRanges* ranges)
  234. {
  235. ((PluginDescriptorClass*)handle)->getParameterRanges(index, ranges);
  236. }
  237. static double _get_parameter_value(PluginHandle handle, uint32_t index)
  238. {
  239. return ((PluginDescriptorClass*)handle)->getParameterValue(index);
  240. }
  241. static const char* _get_parameter_text(PluginHandle handle, uint32_t index)
  242. {
  243. return ((PluginDescriptorClass*)handle)->getParameterText(index);
  244. }
  245. static const char* _get_parameter_unit(PluginHandle handle, uint32_t index)
  246. {
  247. return ((PluginDescriptorClass*)handle)->getParameterUnit(index);
  248. }
  249. static void _set_parameter_value(PluginHandle handle, uint32_t index, double value)
  250. {
  251. return ((PluginDescriptorClass*)handle)->setParameterValue(index, value);
  252. }
  253. static void _set_midi_program(PluginHandle handle, uint32_t bank, uint32_t program)
  254. {
  255. return ((PluginDescriptorClass*)handle)->setMidiProgram(bank, program);
  256. }
  257. static void _set_custom_data(PluginHandle handle, const char* key, const char* value)
  258. {
  259. return ((PluginDescriptorClass*)handle)->setCustomData(key, value);
  260. }
  261. static void _show_gui(PluginHandle handle, bool show)
  262. {
  263. return ((PluginDescriptorClass*)handle)->showGui(show);
  264. }
  265. static void _idle_gui(PluginHandle handle)
  266. {
  267. return ((PluginDescriptorClass*)handle)->idleGui();
  268. }
  269. static void _process(PluginHandle handle, float** inBuffer, float** outBuffer, const uint32_t frames, uint32_t midiEventCount, MidiEvent* midiEvents)
  270. {
  271. return ((PluginDescriptorClass*)handle)->process(inBuffer, outBuffer, frames, midiEventCount, midiEvents);
  272. }
  273. static void _init(PluginDescriptor* const _this_)
  274. {
  275. ((PluginDescriptorClass*)_this_->_handle)->handleInit();
  276. }
  277. static void _fini(PluginDescriptor* const _this_)
  278. {
  279. ((PluginDescriptorClass*)_this_->_handle)->handleFini();
  280. }
  281. void handleInit()
  282. {
  283. desc.portCount = getPortCount();
  284. if (desc.portCount > 0)
  285. {
  286. desc.ports = new PluginPort [desc.portCount];
  287. for (uint32_t i=0; i < desc.portCount; i++)
  288. {
  289. PluginPort* const port = &desc.ports[i];
  290. port->type = getPortType(i);
  291. port->hints = getPortHints(i);
  292. port->name = getPortName(i);
  293. }
  294. }
  295. desc.midiProgramCount = getMidiProgramCount();
  296. if (desc.midiProgramCount > 0)
  297. {
  298. desc.midiPrograms = new MidiProgram [desc.midiProgramCount];
  299. for (uint32_t i=0; i < desc.midiProgramCount; i++)
  300. getMidiProgram(i, &desc.midiPrograms[i]);
  301. }
  302. }
  303. void handleFini()
  304. {
  305. if (desc.midiProgramCount > 0 && desc.midiPrograms)
  306. delete[] desc.midiPrograms;
  307. desc.midiProgramCount = 0;
  308. desc.midiPrograms = nullptr;
  309. if (desc.portCount > 0 && desc.ports)
  310. delete[] desc.ports;
  311. desc.portCount = 0;
  312. desc.ports = nullptr;
  313. }
  314. };
  315. // -----------------------------------------------------------------------
  316. #define CARLA_REGISTER_NATIVE_PLUGIN_MM(label, descMM) \
  317. void carla_register_native_plugin_##label () __attribute__((constructor)); \
  318. void carla_register_native_plugin_##label () { carla_register_native_plugin(descMM.descriptorInit()); }
  319. #endif // CARLA_NATIVE_MM_H