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.

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