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.

447 lines
14KB

  1. /*
  2. * Carla VST utils
  3. * Copyright (C) 2011-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_VST_UTILS_HPP
  18. #define CARLA_VST_UTILS_HPP
  19. // Disable deprecated VST features (NOT)
  20. #define VST_FORCE_DEPRECATED 0
  21. #include <cstdint>
  22. // ------------------------------------------------------------------------------------------------
  23. #if VESTIGE_HEADER
  24. #include "vestige/aeffectx.h"
  25. #define audioMasterGetOutputSpeakerArrangement audioMasterGetSpeakerArrangement
  26. #define effFlagsProgramChunks (1 << 5)
  27. #define effSetProgramName 4
  28. #define effGetParamLabel 6
  29. #define effGetParamDisplay 7
  30. #define effGetVu 9
  31. #define effEditDraw 16
  32. #define effEditMouse 17
  33. #define effEditKey 18
  34. #define effEditSleep 21
  35. #define effIdentify 22
  36. #define effGetChunk 23
  37. #define effSetChunk 24
  38. #define effCanBeAutomated 26
  39. #define effString2Parameter 27
  40. #define effGetNumProgramCategories 28
  41. #define effGetProgramNameIndexed 29
  42. #define effCopyProgram 30
  43. #define effConnectInput 31
  44. #define effConnectOutput 32
  45. #define effGetInputProperties 33
  46. #define effGetOutputProperties 34
  47. #define effGetPlugCategory 35
  48. #define effGetCurrentPosition 36
  49. #define effGetDestinationBuffer 37
  50. #define effOfflineNotify 38
  51. #define effOfflinePrepare 39
  52. #define effOfflineRun 40
  53. #define effProcessVarIo 41
  54. #define effSetSpeakerArrangement 42
  55. #define effSetBlockSizeAndSampleRate 43
  56. #define effSetBypass 44
  57. #define effGetErrorText 46
  58. #define effVendorSpecific 50
  59. #define effGetTailSize 52
  60. #define effIdle 53
  61. #define effGetIcon 54
  62. #define effSetViewPosition 55
  63. #define effKeysRequired 57
  64. #define effEditKeyDown 59
  65. #define effEditKeyUp 60
  66. #define effSetEditKnobMode 61
  67. #define effGetMidiProgramName 62
  68. #define effGetCurrentMidiProgram 63
  69. #define effGetMidiProgramCategory 64
  70. #define effHasMidiProgramsChanged 65
  71. #define effGetMidiKeyName 66
  72. #define effBeginSetProgram 67
  73. #define effEndSetProgram 68
  74. #define effGetSpeakerArrangement 69
  75. #define effShellGetNextPlugin 70
  76. #define effStartProcess 71
  77. #define effStopProcess 72
  78. #define effSetTotalSampleToProcess 73
  79. #define effSetPanLaw 74
  80. #define effBeginLoadBank 75
  81. #define effBeginLoadProgram 76
  82. #define effSetProcessPrecision 77
  83. #define effGetNumMidiInputChannels 78
  84. #define effGetNumMidiOutputChannels 79
  85. #define kPlugCategSynth 2
  86. #define kPlugCategAnalysis 3
  87. #define kPlugCategMastering 4
  88. #define kPlugCategRoomFx 6
  89. #define kPlugCategRestoration 8
  90. #define kPlugCategShell 10
  91. #define kPlugCategGenerator 11
  92. #define kVstAutomationReadWrite 4
  93. #define kVstProcessLevelUnknown 0
  94. #define kVstProcessLevelUser 1
  95. #define kVstProcessLevelRealtime 2
  96. #define kVstProcessLevelOffline 4
  97. #define kVstProcessPrecision32 0
  98. #define kVstTransportChanged 1
  99. #define kVstVersion 2400
  100. #define VSTCALLBACK
  101. struct ERect {
  102. int16_t top, left, bottom, right;
  103. };
  104. struct VstTimeInfo_R {
  105. double samplePos, sampleRate, nanoSeconds, ppqPos, tempo, barStartPos, cycleStartPos, cycleEndPos;
  106. int32_t timeSigNumerator, timeSigDenominator, smpteOffset, smpteFrameRate, samplesToNextClock, flags;
  107. };
  108. #else
  109. #include "vst/aeffectx.h"
  110. typedef VstTimeInfo VstTimeInfo_R;
  111. #endif
  112. #include "carla_defines.hpp"
  113. // ------------------------------------------------------------------------------------------------
  114. typedef AEffect* (*VST_Function)(audioMasterCallback);
  115. static inline
  116. bool vstPluginCanDo(AEffect* const effect, const char* const feature)
  117. {
  118. return (effect->dispatcher(effect, effCanDo, 0, 0, (void*)feature, 0.0f) == 1);
  119. }
  120. // ------------------------------------------------------------------------------------------------
  121. static inline
  122. const char* vstEffectOpcode2str(const int32_t opcode)
  123. {
  124. switch (opcode)
  125. {
  126. case effOpen:
  127. return "effOpen";
  128. case effClose:
  129. return "effClose";
  130. case effSetProgram:
  131. return "effSetProgram";
  132. case effGetProgram:
  133. return "effGetProgram";
  134. case effSetProgramName:
  135. return "effSetProgramName";
  136. case effGetProgramName:
  137. return "effGetProgramName";
  138. case effGetParamLabel:
  139. return "effGetParamLabel";
  140. case effGetParamDisplay:
  141. return "effGetParamDisplay";
  142. case effGetParamName:
  143. return "effGetParamName";
  144. #if ! VST_FORCE_DEPRECATED
  145. case effGetVu:
  146. return "effGetVu";
  147. #endif
  148. case effSetSampleRate:
  149. return "effSetSampleRate";
  150. case effSetBlockSize:
  151. return "effSetBlockSize";
  152. case effMainsChanged:
  153. return "effMainsChanged";
  154. case effEditGetRect:
  155. return "effEditGetRect";
  156. case effEditOpen:
  157. return "effEditOpen";
  158. case effEditClose:
  159. return "effEditClose";
  160. #if ! VST_FORCE_DEPRECATED
  161. case effEditDraw:
  162. return "effEditDraw";
  163. case effEditMouse:
  164. return "effEditMouse";
  165. case effEditKey:
  166. return "effEditKey";
  167. case effEditTop:
  168. return "effEditTop";
  169. case effEditSleep:
  170. return "effEditSleep";
  171. case effIdentify:
  172. return "effIdentify";
  173. #endif
  174. case effGetChunk:
  175. return "effGetChunk";
  176. case effSetChunk:
  177. return "effSetChunk";
  178. case effProcessEvents:
  179. return "effProcessEvents";
  180. case effCanBeAutomated:
  181. return "effCanBeAutomated";
  182. case effString2Parameter:
  183. return "effString2Parameter";
  184. #if ! VST_FORCE_DEPRECATED
  185. case effGetNumProgramCategories:
  186. return "effGetNumProgramCategories";
  187. #endif
  188. case effGetProgramNameIndexed:
  189. return "effGetProgramNameIndexed";
  190. #if ! VST_FORCE_DEPRECATED
  191. case effCopyProgram:
  192. return "effCopyProgram";
  193. case effConnectInput:
  194. return "effConnectInput";
  195. case effConnectOutput:
  196. return "effConnectOutput";
  197. #endif
  198. case effGetInputProperties:
  199. return "effGetInputProperties";
  200. case effGetOutputProperties:
  201. return "effGetOutputProperties";
  202. case effGetPlugCategory:
  203. return "effGetPlugCategory";
  204. #if ! VST_FORCE_DEPRECATED
  205. case effGetCurrentPosition:
  206. return "effGetCurrentPosition";
  207. case effGetDestinationBuffer:
  208. return "effGetDestinationBuffer";
  209. #endif
  210. case effOfflineNotify:
  211. return "effOfflineNotify";
  212. case effOfflinePrepare:
  213. return "effOfflinePrepare";
  214. case effOfflineRun:
  215. return "effOfflineRun";
  216. case effProcessVarIo:
  217. return "effProcessVarIo";
  218. case effSetSpeakerArrangement:
  219. return "effSetSpeakerArrangement";
  220. #if ! VST_FORCE_DEPRECATED
  221. case effSetBlockSizeAndSampleRate:
  222. return "effSetBlockSizeAndSampleRate";
  223. #endif
  224. case effSetBypass:
  225. return "effSetBypass";
  226. case effGetEffectName:
  227. return "effGetEffectName";
  228. #if ! VST_FORCE_DEPRECATED
  229. case effGetErrorText:
  230. return "effGetErrorText";
  231. #endif
  232. case effGetVendorString:
  233. return "effGetVendorString";
  234. case effGetProductString:
  235. return "effGetProductString";
  236. case effGetVendorVersion:
  237. return "effGetVendorVersion";
  238. case effVendorSpecific:
  239. return "effVendorSpecific";
  240. case effCanDo:
  241. return "effCanDo";
  242. case effGetTailSize:
  243. return "effGetTailSize";
  244. #if ! VST_FORCE_DEPRECATED
  245. case effIdle:
  246. return "effIdle";
  247. case effGetIcon:
  248. return "effGetIcon";
  249. case effSetViewPosition:
  250. return "effSetViewPosition";
  251. #endif
  252. case effGetParameterProperties:
  253. return "effGetParameterProperties";
  254. #if ! VST_FORCE_DEPRECATED
  255. case effKeysRequired:
  256. return "effKeysRequired";
  257. #endif
  258. case effGetVstVersion:
  259. return "effGetVstVersion";
  260. case effEditKeyDown:
  261. return "effEditKeyDown";
  262. case effEditKeyUp:
  263. return "effEditKeyUp";
  264. case effSetEditKnobMode:
  265. return "effSetEditKnobMode";
  266. case effGetMidiProgramName:
  267. return "effGetMidiProgramName";
  268. case effGetCurrentMidiProgram:
  269. return "effGetCurrentMidiProgram";
  270. case effGetMidiProgramCategory:
  271. return "effGetMidiProgramCategory";
  272. case effHasMidiProgramsChanged:
  273. return "effHasMidiProgramsChanged";
  274. case effGetMidiKeyName:
  275. return "effGetMidiKeyName";
  276. case effBeginSetProgram:
  277. return "effBeginSetProgram";
  278. case effEndSetProgram:
  279. return "effEndSetProgram";
  280. case effGetSpeakerArrangement:
  281. return "effGetSpeakerArrangement";
  282. case effShellGetNextPlugin:
  283. return "effShellGetNextPlugin";
  284. case effStartProcess:
  285. return "effStartProcess";
  286. case effStopProcess:
  287. return "effStopProcess";
  288. case effSetTotalSampleToProcess:
  289. return "effSetTotalSampleToProcess";
  290. case effSetPanLaw:
  291. return "effSetPanLaw";
  292. case effBeginLoadBank:
  293. return "effBeginLoadBank";
  294. case effBeginLoadProgram:
  295. return "effBeginLoadProgram";
  296. case effSetProcessPrecision:
  297. return "effSetProcessPrecision";
  298. case effGetNumMidiInputChannels:
  299. return "effGetNumMidiInputChannels";
  300. case effGetNumMidiOutputChannels:
  301. return "effGetNumMidiOutputChannels";
  302. default:
  303. return "unknown";
  304. }
  305. }
  306. // ------------------------------------------------------------------------------------------------
  307. static inline
  308. const char* vstMasterOpcode2str(const int32_t opcode)
  309. {
  310. switch (opcode)
  311. {
  312. case audioMasterAutomate:
  313. return "audioMasterAutomate";
  314. case audioMasterVersion:
  315. return "audioMasterVersion";
  316. case audioMasterCurrentId:
  317. return "audioMasterCurrentId";
  318. case audioMasterIdle:
  319. return "audioMasterIdle";
  320. #if ! VST_FORCE_DEPRECATED
  321. case audioMasterPinConnected:
  322. return "audioMasterPinConnected";
  323. case audioMasterWantMidi:
  324. return "audioMasterWantMidi";
  325. #endif
  326. case audioMasterGetTime:
  327. return "audioMasterGetTime";
  328. case audioMasterProcessEvents:
  329. return "audioMasterProcessEvents";
  330. #if ! VST_FORCE_DEPRECATED
  331. case audioMasterSetTime:
  332. return "audioMasterSetTime";
  333. case audioMasterTempoAt:
  334. return "audioMasterTempoAt";
  335. case audioMasterGetNumAutomatableParameters:
  336. return "audioMasterGetNumAutomatableParameters";
  337. case audioMasterGetParameterQuantization:
  338. return "audioMasterGetParameterQuantization";
  339. #endif
  340. case audioMasterIOChanged:
  341. return "audioMasterIOChanged";
  342. #if ! VST_FORCE_DEPRECATED
  343. case audioMasterNeedIdle:
  344. return "audioMasterNeedIdle";
  345. #endif
  346. case audioMasterSizeWindow:
  347. return "audioMasterSizeWindow";
  348. case audioMasterGetSampleRate:
  349. return "audioMasterGetSampleRate";
  350. case audioMasterGetBlockSize:
  351. return "audioMasterGetBlockSize";
  352. case audioMasterGetInputLatency:
  353. return "audioMasterGetInputLatency";
  354. case audioMasterGetOutputLatency:
  355. return "audioMasterGetOutputLatency";
  356. #if ! VST_FORCE_DEPRECATED
  357. case audioMasterGetPreviousPlug:
  358. return "audioMasterGetPreviousPlug";
  359. case audioMasterGetNextPlug:
  360. return "audioMasterGetNextPlug";
  361. case audioMasterWillReplaceOrAccumulate:
  362. return "audioMasterWillReplaceOrAccumulate";
  363. #endif
  364. case audioMasterGetCurrentProcessLevel:
  365. return "audioMasterGetCurrentProcessLevel";
  366. case audioMasterGetAutomationState:
  367. return "audioMasterGetAutomationState";
  368. case audioMasterOfflineStart:
  369. return "audioMasterOfflineStart";
  370. case audioMasterOfflineRead:
  371. return "audioMasterOfflineRead";
  372. case audioMasterOfflineWrite:
  373. return "audioMasterOfflineWrite";
  374. case audioMasterOfflineGetCurrentPass:
  375. return "audioMasterOfflineGetCurrentPass";
  376. case audioMasterOfflineGetCurrentMetaPass:
  377. return "audioMasterOfflineGetCurrentMetaPass";
  378. #if ! VST_FORCE_DEPRECATED
  379. case audioMasterSetOutputSampleRate:
  380. return "audioMasterSetOutputSampleRate";
  381. case audioMasterGetOutputSpeakerArrangement:
  382. return "audioMasterGetOutputSpeakerArrangement";
  383. #endif
  384. case audioMasterGetVendorString:
  385. return "audioMasterGetVendorString";
  386. case audioMasterGetProductString:
  387. return "audioMasterGetProductString";
  388. case audioMasterGetVendorVersion:
  389. return "audioMasterGetVendorVersion";
  390. case audioMasterVendorSpecific:
  391. return "audioMasterVendorSpecific";
  392. #if ! VST_FORCE_DEPRECATED
  393. case audioMasterSetIcon:
  394. return "audioMasterSetIcon";
  395. #endif
  396. case audioMasterCanDo:
  397. return "audioMasterCanDo";
  398. case audioMasterGetLanguage:
  399. return "audioMasterGetLanguage";
  400. #if ! VST_FORCE_DEPRECATED
  401. case audioMasterOpenWindow:
  402. return "audioMasterOpenWindow";
  403. case audioMasterCloseWindow:
  404. return "audioMasterCloseWindow";
  405. #endif
  406. case audioMasterGetDirectory:
  407. return "audioMasterGetDirectory";
  408. case audioMasterUpdateDisplay:
  409. return "audioMasterUpdateDisplay";
  410. case audioMasterBeginEdit:
  411. return "audioMasterBeginEdit";
  412. case audioMasterEndEdit:
  413. return "audioMasterEndEdit";
  414. case audioMasterOpenFileSelector:
  415. return "audioMasterOpenFileSelector";
  416. case audioMasterCloseFileSelector:
  417. return "audioMasterCloseFileSelector";
  418. #if ! VST_FORCE_DEPRECATED
  419. case audioMasterEditFile:
  420. return "audioMasterEditFile";
  421. case audioMasterGetChunkFile:
  422. return "audioMasterGetChunkFile";
  423. case audioMasterGetInputSpeakerArrangement:
  424. return "audioMasterGetInputSpeakerArrangement";
  425. #endif
  426. default:
  427. return "unknown";
  428. }
  429. }
  430. // ------------------------------------------------------------------------------------------------
  431. #endif // CARLA_VST_UTILS_HPP