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.

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