Audio plugin host https://kx.studio/carla
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.

307 lines
12KB

  1. /*
  2. * Carla Bridge utils
  3. * Copyright (C) 2013-2014 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or 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 doc/GPL.txt file.
  16. */
  17. #ifndef CARLA_BRIDGE_UTILS_HPP_INCLUDED
  18. #define CARLA_BRIDGE_UTILS_HPP_INCLUDED
  19. #include "CarlaRingBuffer.hpp"
  20. // -----------------------------------------------------------------------
  21. // carla-plugin receives these via osc
  22. enum PluginBridgeOscInfoType {
  23. kPluginBridgeOscNull = 0,
  24. kPluginBridgeOscPong,
  25. kPluginBridgeOscPluginInfo1, // uuuuh => category, hints, optionsAvailable, optionsEnabled, uniqueId
  26. kPluginBridgeOscPluginInfo2, // ssss => realName, label, maker, copyright
  27. kPluginBridgeOscAudioCount, // uu => ins, outs
  28. kPluginBridgeOscMidiCount, // uu => ins, outs
  29. kPluginBridgeOscParameterCount, // uu => ins, outs
  30. kPluginBridgeOscProgramCount, // u => count
  31. kPluginBridgeOscMidiProgramCount, // u => count
  32. kPluginBridgeOscParameterData1, // uiuui => index, rindex, type, hints, cc
  33. kPluginBridgeOscParameterData2, // uss => index, name, unit
  34. kPluginBridgeOscParameterRanges1, // ufff => index, def, min, max
  35. kPluginBridgeOscParameterRanges2, // ufff => index, step, stepSmall, stepLarge
  36. kPluginBridgeOscParameterValue, // uf => index, value
  37. kPluginBridgeOscDefaultValue, // uf => index, value
  38. kPluginBridgeOscCurrentProgram, // i => index
  39. kPluginBridgeOscCurrentMidiProgram, // i => index
  40. kPluginBridgeOscProgramName, // us => index, name
  41. kPluginBridgeOscMidiProgramData, // uuus => index, bank, program, name
  42. kPluginBridgeOscConfigure, // ss => key, value
  43. kPluginBridgeOscSetCustomData, // sss => type, key, value
  44. kPluginBridgeOscSetChunkDataFile, // s => chunkFile
  45. kPluginBridgeOscLatency, // u => value
  46. kPluginBridgeOscReady,
  47. kPluginBridgeOscError
  48. };
  49. // carla-plugin sends these during RT
  50. enum PluginBridgeRtOpcode {
  51. kPluginBridgeRtNull = 0,
  52. kPluginBridgeRtSetAudioPool, // ulong/ptr
  53. kPluginBridgeRtSetCVPool, // ulong/ptr
  54. kPluginBridgeRtControlEventParameter, // uint/frame, byte/chan, ushort, float
  55. kPluginBridgeRtControlEventMidiBank, // uint/frame, byte/chan, ushort
  56. kPluginBridgeRtControlEventMidiProgram, // uint/frame, byte/chan, ushort
  57. kPluginBridgeRtControlEventAllSoundOff, // uint/frame, byte/chan
  58. kPluginBridgeRtControlEventAllNotesOff, // uint/frame, byte/chan
  59. kPluginBridgeRtMidiEvent, // uint/frame, byte/port, byte/size, byte[]/data
  60. kPluginBridgeRtProcess,
  61. kPluginBridgeRtQuit
  62. };
  63. // carla-plugin sends these during non-RT
  64. enum PluginBridgeNonRtOpcode {
  65. kPluginBridgeNonRtNull = 0,
  66. kPluginBridgeNonRtPing,
  67. kPluginBridgeNonRtActivate,
  68. kPluginBridgeNonRtDeactivate,
  69. kPluginBridgeNonRtSetBufferSize, // uint
  70. kPluginBridgeNonRtSetSampleRate, // double
  71. kPluginBridgeNonRtSetOffline,
  72. kPluginBridgeNonRtSetOnline,
  73. kPluginBridgeNonRtSetParameterValue, // uint, float
  74. kPluginBridgeNonRtSetParameterMidiChannel, // uint, byte
  75. kPluginBridgeNonRtSetParameterMidiCC, // uint, short
  76. kPluginBridgeNonRtSetProgram, // int
  77. kPluginBridgeNonRtSetMidiProgram, // int
  78. kPluginBridgeNonRtSetCustomData, // uint/size, str[], uint/size, str[], uint/size, str[] TODO plugin
  79. kPluginBridgeNonRtSetChunkDataFile, // uint/size, str[]/file
  80. kPluginBridgeNonRtSetCtrlChannel, // short
  81. kPluginBridgeNonRtSetOscURL, // uint/size, str[]/url
  82. kPluginBridgeNonRtSetOption, // uint/option, bool
  83. kPluginBridgeNonRtPrepareForSave,
  84. kPluginBridgeNonRtShowUI,
  85. kPluginBridgeNonRtHideUI,
  86. kPluginBridgeNonRtUiParameterChange, // uint, float
  87. kPluginBridgeNonRtUiProgramChange, // uint
  88. kPluginBridgeNonRtUiMidiProgramChange, // uint
  89. kPluginBridgeNonRtUiNoteOn, // byte, byte, byte
  90. kPluginBridgeNonRtUiNoteOff, // byte, byte
  91. kPluginBridgeNonRtQuit
  92. };
  93. // -----------------------------------------------------------------------
  94. const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host configure, tells host GUI is now hidden
  95. const char* const CARLA_BRIDGE_MSG_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host configure, tells host state is saved
  96. static const std::size_t kBridgeRtDataMidiOutSize = 512*4;
  97. // -----------------------------------------------------------------------
  98. struct BridgeSemaphore {
  99. union {
  100. void* server;
  101. char _padServer[64];
  102. };
  103. union {
  104. void* client;
  105. char _padClient[64];
  106. };
  107. };
  108. // needs to be 64bit aligned
  109. struct BridgeTimeInfo {
  110. uint64_t playing;
  111. uint64_t frame;
  112. uint64_t usecs;
  113. uint32_t valid;
  114. // bbt
  115. int32_t bar, beat, tick;
  116. float beatsPerBar, beatType;
  117. double barStartTick, ticksPerBeat, beatsPerMinute;
  118. };
  119. struct BridgeRtData {
  120. BridgeSemaphore sem;
  121. BridgeTimeInfo timeInfo;
  122. StackBuffer ringBuffer;
  123. uint8_t midiOut[kBridgeRtDataMidiOutSize];
  124. };
  125. struct BridgeNonRtData {
  126. BigStackBuffer ringBuffer;
  127. };
  128. // -----------------------------------------------------------------------
  129. static inline
  130. const char* PluginBridgeOscInfoType2str(const PluginBridgeOscInfoType type) noexcept
  131. {
  132. switch (type)
  133. {
  134. case kPluginBridgeOscNull:
  135. return "kPluginBridgeOscNull";
  136. case kPluginBridgeOscPong:
  137. return "kPluginBridgeOscPong";
  138. case kPluginBridgeOscPluginInfo1:
  139. return "kPluginBridgeOscPluginInfo1";
  140. case kPluginBridgeOscPluginInfo2:
  141. return "kPluginBridgeOscPluginInfo2";
  142. case kPluginBridgeOscAudioCount:
  143. return "kPluginBridgeOscAudioCount";
  144. case kPluginBridgeOscMidiCount:
  145. return "kPluginBridgeOscMidiCount";
  146. case kPluginBridgeOscParameterCount:
  147. return "kPluginBridgeOscParameterCount";
  148. case kPluginBridgeOscProgramCount:
  149. return "kPluginBridgeOscProgramCount";
  150. case kPluginBridgeOscMidiProgramCount:
  151. return "kPluginBridgeOscMidiProgramCount";
  152. case kPluginBridgeOscParameterData1:
  153. return "kPluginBridgeOscParameterData1";
  154. case kPluginBridgeOscParameterData2:
  155. return "kPluginBridgeOscParameterData2";
  156. case kPluginBridgeOscParameterRanges1:
  157. return "kPluginBridgeOscParameterRanges1";
  158. case kPluginBridgeOscParameterRanges2:
  159. return "kPluginBridgeOscParameterRanges2";
  160. case kPluginBridgeOscParameterValue:
  161. return "kPluginBridgeOscParameterValue";
  162. case kPluginBridgeOscDefaultValue:
  163. return "kPluginBridgeOscDefaultValue";
  164. case kPluginBridgeOscCurrentProgram:
  165. return "kPluginBridgeOscCurrentProgram";
  166. case kPluginBridgeOscCurrentMidiProgram:
  167. return "kPluginBridgeOscCurrentMidiProgram";
  168. case kPluginBridgeOscProgramName:
  169. return "kPluginBridgeOscProgramName";
  170. case kPluginBridgeOscMidiProgramData:
  171. return "kPluginBridgeOscMidiProgramData";
  172. case kPluginBridgeOscConfigure:
  173. return "kPluginBridgeOscConfigure";
  174. case kPluginBridgeOscSetCustomData:
  175. return "kPluginBridgeOscSetCustomData";
  176. case kPluginBridgeOscSetChunkDataFile:
  177. return "kPluginBridgeOscSetChunkDataFile";
  178. case kPluginBridgeOscLatency:
  179. return "kPluginBridgeOscLatency";
  180. case kPluginBridgeOscReady:
  181. return "kPluginBridgeOscReady";
  182. case kPluginBridgeOscError:
  183. return "kPluginBridgeOscError";
  184. }
  185. carla_stderr("CarlaBackend::PluginBridgeOscInfoType2str(%i) - invalid type", type);
  186. return nullptr;
  187. }
  188. static inline
  189. const char* PluginBridgeRtOpcode2str(const PluginBridgeRtOpcode opcode) noexcept
  190. {
  191. switch (opcode)
  192. {
  193. case kPluginBridgeRtNull:
  194. return "kPluginBridgeRtNull";
  195. case kPluginBridgeRtSetAudioPool:
  196. return "kPluginBridgeRtSetAudioPool";
  197. case kPluginBridgeRtSetCVPool:
  198. return "kPluginBridgeRtSetCVPool";
  199. case kPluginBridgeRtControlEventParameter:
  200. return "kPluginBridgeRtControlEventParameter";
  201. case kPluginBridgeRtControlEventMidiBank:
  202. return "kPluginBridgeRtControlEventMidiBank";
  203. case kPluginBridgeRtControlEventMidiProgram:
  204. return "kPluginBridgeRtControlEventMidiProgram";
  205. case kPluginBridgeRtControlEventAllSoundOff:
  206. return "kPluginBridgeRtControlEventAllSoundOff";
  207. case kPluginBridgeRtControlEventAllNotesOff:
  208. return "kPluginBridgeRtControlEventAllNotesOff";
  209. case kPluginBridgeRtMidiEvent:
  210. return "kPluginBridgeRtMidiEvent";
  211. case kPluginBridgeRtProcess:
  212. return "kPluginBridgeRtProcess";
  213. case kPluginBridgeRtQuit:
  214. return "kPluginBridgeRtQuit";
  215. }
  216. carla_stderr("CarlaBackend::PluginBridgeRtOpcode2str(%i) - invalid opcode", opcode);
  217. return nullptr;
  218. }
  219. static inline
  220. const char* PluginBridgeNonRtOpcode2str(const PluginBridgeNonRtOpcode opcode) noexcept
  221. {
  222. switch (opcode)
  223. {
  224. case kPluginBridgeNonRtNull:
  225. return "kPluginBridgeNonRtNull";
  226. case kPluginBridgeNonRtPing:
  227. return "kPluginBridgeNonRtPing";
  228. case kPluginBridgeNonRtActivate:
  229. return "kPluginBridgeNonRtActivate";
  230. case kPluginBridgeNonRtDeactivate:
  231. return "kPluginBridgeNonRtDeactivate";
  232. case kPluginBridgeNonRtSetBufferSize:
  233. return "kPluginBridgeNonRtSetBufferSize";
  234. case kPluginBridgeNonRtSetSampleRate:
  235. return "kPluginBridgeNonRtSetSampleRate";
  236. case kPluginBridgeNonRtSetOffline:
  237. return "kPluginBridgeNonRtSetOffline";
  238. case kPluginBridgeNonRtSetOnline:
  239. return "kPluginBridgeNonRtSetOnline";
  240. case kPluginBridgeNonRtSetParameterValue:
  241. return "kPluginBridgeNonRtSetParameterValue";
  242. case kPluginBridgeNonRtSetParameterMidiChannel:
  243. return "kPluginBridgeNonRtSetParameterMidiChannel";
  244. case kPluginBridgeNonRtSetParameterMidiCC:
  245. return "kPluginBridgeNonRtSetParameterMidiCC";
  246. case kPluginBridgeNonRtSetProgram:
  247. return "kPluginBridgeNonRtSetProgram";
  248. case kPluginBridgeNonRtSetMidiProgram:
  249. return "kPluginBridgeNonRtSetMidiProgram";
  250. case kPluginBridgeNonRtSetCustomData:
  251. return "kPluginBridgeNonRtSetCustomData";
  252. case kPluginBridgeNonRtSetChunkDataFile:
  253. return "kPluginBridgeNonRtSetChunkDataFile";
  254. case kPluginBridgeNonRtSetCtrlChannel:
  255. return "kPluginBridgeNonRtSetCtrlChannel";
  256. case kPluginBridgeNonRtSetOscURL:
  257. return "kPluginBridgeNonRtSetOscURL";
  258. case kPluginBridgeNonRtSetOption:
  259. return "kPluginBridgeNonRtSetOption";
  260. case kPluginBridgeNonRtPrepareForSave:
  261. return "kPluginBridgeNonRtPrepareForSave";
  262. case kPluginBridgeNonRtShowUI:
  263. return "kPluginBridgeNonRtShowUI";
  264. case kPluginBridgeNonRtHideUI:
  265. return "kPluginBridgeNonRtHideUI";
  266. case kPluginBridgeNonRtUiParameterChange:
  267. return "kPluginBridgeNonRtUiParameterChange";
  268. case kPluginBridgeNonRtUiProgramChange:
  269. return "kPluginBridgeNonRtUiProgramChange";
  270. case kPluginBridgeNonRtUiMidiProgramChange:
  271. return "kPluginBridgeNonRtUiMidiProgramChange";
  272. case kPluginBridgeNonRtUiNoteOn:
  273. return "kPluginBridgeNonRtUiNoteOn";
  274. case kPluginBridgeNonRtUiNoteOff:
  275. return "kPluginBridgeNonRtUiNoteOff";
  276. case kPluginBridgeNonRtQuit:
  277. return "kPluginBridgeNonRtQuit";
  278. }
  279. carla_stderr("CarlaBackend::PluginBridgeNonRtOpcode2str(%i) - invalid opcode", opcode);
  280. return nullptr;
  281. }
  282. // -----------------------------------------------------------------------
  283. #endif // CARLA_BRIDGE_UTILS_HPP_INCLUDED