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.

314 lines
14KB

  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. // Server sends these to client during RT
  22. enum PluginBridgeRtClientOpcode {
  23. kPluginBridgeRtClientNull = 0,
  24. kPluginBridgeRtClientSetAudioPool, // ulong/ptr
  25. kPluginBridgeRtClientSetCVPool, // ulong/ptr
  26. kPluginBridgeRtClientControlEventParameter, // uint/frame, byte/chan, ushort, float
  27. kPluginBridgeRtClientControlEventMidiBank, // uint/frame, byte/chan, ushort
  28. kPluginBridgeRtClientControlEventMidiProgram, // uint/frame, byte/chan, ushort
  29. kPluginBridgeRtClientControlEventAllSoundOff, // uint/frame, byte/chan
  30. kPluginBridgeRtClientControlEventAllNotesOff, // uint/frame, byte/chan
  31. kPluginBridgeRtClientMidiEvent, // uint/frame, byte/port, byte/size, byte[]/data
  32. kPluginBridgeRtClientProcess,
  33. kPluginBridgeRtClientQuit
  34. };
  35. // Server sends these to client during non-RT
  36. enum PluginBridgeNonRtClientOpcode {
  37. kPluginBridgeNonRtClientNull = 0,
  38. kPluginBridgeNonRtClientPing,
  39. kPluginBridgeNonRtClientActivate,
  40. kPluginBridgeNonRtClientDeactivate,
  41. kPluginBridgeNonRtClientSetBufferSize, // uint
  42. kPluginBridgeNonRtClientSetSampleRate, // double
  43. kPluginBridgeNonRtClientSetOffline,
  44. kPluginBridgeNonRtClientSetOnline,
  45. kPluginBridgeNonRtClientSetParameterValue, // uint, float
  46. kPluginBridgeNonRtClientSetParameterMidiChannel, // uint, byte
  47. kPluginBridgeNonRtClientSetParameterMidiCC, // uint, short
  48. kPluginBridgeNonRtClientSetProgram, // int
  49. kPluginBridgeNonRtClientSetMidiProgram, // int
  50. kPluginBridgeNonRtClientSetCustomData, // uint/size, str[], uint/size, str[], uint/size, str[] (compressed)
  51. kPluginBridgeNonRtClientSetChunkDataFile, // uint/size, str[] (filename)
  52. kPluginBridgeNonRtClientSetCtrlChannel, // short
  53. kPluginBridgeNonRtClientSetOption, // uint/option, bool
  54. kPluginBridgeNonRtClientPrepareForSave,
  55. kPluginBridgeNonRtClientShowUI,
  56. kPluginBridgeNonRtClientHideUI,
  57. kPluginBridgeNonRtClientUiParameterChange, // uint, float
  58. kPluginBridgeNonRtClientUiProgramChange, // uint
  59. kPluginBridgeNonRtClientUiMidiProgramChange, // uint
  60. kPluginBridgeNonRtClientUiNoteOn, // byte, byte, byte
  61. kPluginBridgeNonRtClientUiNoteOff, // byte, byte
  62. kPluginBridgeNonRtClientQuit
  63. };
  64. // Client sends these to server during non-RT
  65. enum PluginBridgeNonRtServerOpcode {
  66. kPluginBridgeNonRtServerNull = 0,
  67. kPluginBridgeNonRtServerPong,
  68. kPluginBridgeNonRtServerPluginInfo1, // uint/category, uint/hints, uint/optionsAvailable, uint/optionsEnabled, long/uniqueId
  69. kPluginBridgeNonRtServerPluginInfo2, // uint/size, str[] (realName), uint/size, str[] (label), uint/size, str[] (maker), uint/size, str[] (copyright)
  70. kPluginBridgeNonRtServerAudioCount, // uint/ins, uint/outs
  71. kPluginBridgeNonRtServerMidiCount, // uint/ins, uint/outs
  72. kPluginBridgeNonRtServerParameterCount, // uint/ins, uint/outs
  73. kPluginBridgeNonRtServerProgramCount, // uint/count
  74. kPluginBridgeNonRtServerMidiProgramCount, // uint/count
  75. kPluginBridgeNonRtServerParameterData1, // uint/index, int/rindex, uint/type, uint/hints, int/cc
  76. kPluginBridgeNonRtServerParameterData2, // uint/index, uint/size, str[] (name), uint/size, str[] (unit)
  77. kPluginBridgeNonRtServerParameterRanges1, // uint/index, float/def, float/min, float/max
  78. kPluginBridgeNonRtServerParameterRanges2, // uint/index float/step, float/stepSmall, float/stepLarge
  79. kPluginBridgeNonRtServerParameterValue, // uint/index float/value
  80. kPluginBridgeNonRtServerDefaultValue, // uint/index float/value
  81. kPluginBridgeNonRtServerCurrentProgram, // int/index
  82. kPluginBridgeNonRtServerCurrentMidiProgram, // int/index
  83. kPluginBridgeNonRtServerProgramName, // uint/index, uint/size, str[] (name)
  84. kPluginBridgeNonRtServerMidiProgramData, // uint/index, uint/bank, uint/program, uint/size, str[] (name)
  85. kPluginBridgeNonRtServerConfigure, // uint/size, str[], uint/size, str[]
  86. kPluginBridgeNonRtServerSetCustomData, // uint/size, str[], uint/size, str[], uint/size, str[] (compressed)
  87. kPluginBridgeNonRtServerSetChunkDataFile, // uint/size, str[] (filename)
  88. kPluginBridgeNonRtServerSetLatency, // uint
  89. kPluginBridgeNonRtServerReady,
  90. kPluginBridgeNonRtServerSaved,
  91. kPluginBridgeNonRtServerUiClosed,
  92. kPluginBridgeNonRtServerError
  93. };
  94. // -----------------------------------------------------------------------
  95. struct BridgeSemaphore {
  96. union {
  97. void* server;
  98. char _padServer[64];
  99. };
  100. union {
  101. void* client;
  102. char _padClient[64];
  103. };
  104. };
  105. // needs to be 64bit aligned
  106. struct BridgeTimeInfo {
  107. uint64_t playing;
  108. uint64_t frame;
  109. uint64_t usecs;
  110. uint32_t valid;
  111. // bbt
  112. int32_t bar, beat, tick;
  113. float beatsPerBar, beatType;
  114. double barStartTick, ticksPerBeat, beatsPerMinute;
  115. };
  116. // -----------------------------------------------------------------------
  117. static const std::size_t kBridgeRtClientDataMidiOutSize = 512*4;
  118. // Server => Client RT
  119. struct BridgeRtClientData {
  120. BridgeSemaphore sem;
  121. BridgeTimeInfo timeInfo;
  122. SmallStackBuffer ringBuffer;
  123. uint8_t midiOut[kBridgeRtClientDataMidiOutSize];
  124. };
  125. // Server => Client Non-RT
  126. struct BridgeNonRtClientData {
  127. BigStackBuffer ringBuffer;
  128. };
  129. // Client => Server Non-RT
  130. struct BridgeNonRtServerData {
  131. HugeStackBuffer ringBuffer;
  132. };
  133. // -----------------------------------------------------------------------
  134. static inline
  135. const char* PluginBridgeRtClientOpcode2str(const PluginBridgeRtClientOpcode opcode) noexcept
  136. {
  137. switch (opcode)
  138. {
  139. case kPluginBridgeRtClientNull:
  140. return "kPluginBridgeRtClientNull";
  141. case kPluginBridgeRtClientSetAudioPool:
  142. return "kPluginBridgeRtClientSetAudioPool";
  143. case kPluginBridgeRtClientSetCVPool:
  144. return "kPluginBridgeRtClientSetCVPool";
  145. case kPluginBridgeRtClientControlEventParameter:
  146. return "kPluginBridgeRtClientControlEventParameter";
  147. case kPluginBridgeRtClientControlEventMidiBank:
  148. return "kPluginBridgeRtClientControlEventMidiBank";
  149. case kPluginBridgeRtClientControlEventMidiProgram:
  150. return "kPluginBridgeRtClientControlEventMidiProgram";
  151. case kPluginBridgeRtClientControlEventAllSoundOff:
  152. return "kPluginBridgeRtClientControlEventAllSoundOff";
  153. case kPluginBridgeRtClientControlEventAllNotesOff:
  154. return "kPluginBridgeRtClientControlEventAllNotesOff";
  155. case kPluginBridgeRtClientMidiEvent:
  156. return "kPluginBridgeRtClientMidiEvent";
  157. case kPluginBridgeRtClientProcess:
  158. return "kPluginBridgeRtClientProcess";
  159. case kPluginBridgeRtClientQuit:
  160. return "kPluginBridgeRtClientQuit";
  161. }
  162. carla_stderr("CarlaBackend::PluginBridgeRtClientOpcode2str(%i) - invalid opcode", opcode);
  163. return nullptr;
  164. }
  165. static inline
  166. const char* PluginBridgeNonRtClientOpcode2str(const PluginBridgeNonRtClientOpcode opcode) noexcept
  167. {
  168. switch (opcode)
  169. {
  170. case kPluginBridgeNonRtClientNull:
  171. return "kPluginBridgeNonRtClientNull";
  172. case kPluginBridgeNonRtClientPing:
  173. return "kPluginBridgeNonRtClientPing";
  174. case kPluginBridgeNonRtClientActivate:
  175. return "kPluginBridgeNonRtClientActivate";
  176. case kPluginBridgeNonRtClientDeactivate:
  177. return "kPluginBridgeNonRtClientDeactivate";
  178. case kPluginBridgeNonRtClientSetBufferSize:
  179. return "kPluginBridgeNonRtClientSetBufferSize";
  180. case kPluginBridgeNonRtClientSetSampleRate:
  181. return "kPluginBridgeNonRtClientSetSampleRate";
  182. case kPluginBridgeNonRtClientSetOffline:
  183. return "kPluginBridgeNonRtClientSetOffline";
  184. case kPluginBridgeNonRtClientSetOnline:
  185. return "kPluginBridgeNonRtClientSetOnline";
  186. case kPluginBridgeNonRtClientSetParameterValue:
  187. return "kPluginBridgeNonRtClientSetParameterValue";
  188. case kPluginBridgeNonRtClientSetParameterMidiChannel:
  189. return "kPluginBridgeNonRtClientSetParameterMidiChannel";
  190. case kPluginBridgeNonRtClientSetParameterMidiCC:
  191. return "kPluginBridgeNonRtClientSetParameterMidiCC";
  192. case kPluginBridgeNonRtClientSetProgram:
  193. return "kPluginBridgeNonRtClientSetProgram";
  194. case kPluginBridgeNonRtClientSetMidiProgram:
  195. return "kPluginBridgeNonRtClientSetMidiProgram";
  196. case kPluginBridgeNonRtClientSetCustomData:
  197. return "kPluginBridgeNonRtClientSetCustomData";
  198. case kPluginBridgeNonRtClientSetChunkDataFile:
  199. return "kPluginBridgeNonRtClientSetChunkDataFile";
  200. case kPluginBridgeNonRtClientSetCtrlChannel:
  201. return "kPluginBridgeNonRtClientSetCtrlChannel";
  202. case kPluginBridgeNonRtClientSetOption:
  203. return "kPluginBridgeNonRtClientSetOption";
  204. case kPluginBridgeNonRtClientPrepareForSave:
  205. return "kPluginBridgeNonRtClientPrepareForSave";
  206. case kPluginBridgeNonRtClientShowUI:
  207. return "kPluginBridgeNonRtClientShowUI";
  208. case kPluginBridgeNonRtClientHideUI:
  209. return "kPluginBridgeNonRtClientHideUI";
  210. case kPluginBridgeNonRtClientUiParameterChange:
  211. return "kPluginBridgeNonRtClientUiParameterChange";
  212. case kPluginBridgeNonRtClientUiProgramChange:
  213. return "kPluginBridgeNonRtClientUiProgramChange";
  214. case kPluginBridgeNonRtClientUiMidiProgramChange:
  215. return "kPluginBridgeNonRtClientUiMidiProgramChange";
  216. case kPluginBridgeNonRtClientUiNoteOn:
  217. return "kPluginBridgeNonRtClientUiNoteOn";
  218. case kPluginBridgeNonRtClientUiNoteOff:
  219. return "kPluginBridgeNonRtClientUiNoteOff";
  220. case kPluginBridgeNonRtClientQuit:
  221. return "kPluginBridgeNonRtClientQuit";
  222. }
  223. carla_stderr("CarlaBackend::PluginBridgeNonRtClientOpcode2str(%i) - invalid opcode", opcode);
  224. return nullptr;
  225. }
  226. static inline
  227. const char* PluginBridgeNonRtServerOpcode2str(const PluginBridgeNonRtServerOpcode opcode) noexcept
  228. {
  229. switch (opcode)
  230. {
  231. case kPluginBridgeNonRtServerNull:
  232. return "kPluginBridgeNonRtServerNull";
  233. case kPluginBridgeNonRtServerPong:
  234. return "kPluginBridgeNonRtServerPong";
  235. case kPluginBridgeNonRtServerPluginInfo1:
  236. return "kPluginBridgeNonRtServerPluginInfo1";
  237. case kPluginBridgeNonRtServerPluginInfo2:
  238. return "kPluginBridgeNonRtServerPluginInfo2";
  239. case kPluginBridgeNonRtServerAudioCount:
  240. return "kPluginBridgeNonRtServerAudioCount";
  241. case kPluginBridgeNonRtServerMidiCount:
  242. return "kPluginBridgeNonRtServerMidiCount";
  243. case kPluginBridgeNonRtServerParameterCount:
  244. return "kPluginBridgeNonRtServerParameterCount";
  245. case kPluginBridgeNonRtServerProgramCount:
  246. return "kPluginBridgeNonRtServerProgramCount";
  247. case kPluginBridgeNonRtServerMidiProgramCount:
  248. return "kPluginBridgeNonRtServerMidiProgramCount";
  249. case kPluginBridgeNonRtServerParameterData1:
  250. return "kPluginBridgeNonRtServerParameterData1";
  251. case kPluginBridgeNonRtServerParameterData2:
  252. return "kPluginBridgeNonRtServerParameterData2";
  253. case kPluginBridgeNonRtServerParameterRanges1:
  254. return "kPluginBridgeNonRtServerParameterRanges1";
  255. case kPluginBridgeNonRtServerParameterRanges2:
  256. return "kPluginBridgeNonRtServerParameterRanges2";
  257. case kPluginBridgeNonRtServerParameterValue:
  258. return "kPluginBridgeNonRtServerParameterValue";
  259. case kPluginBridgeNonRtServerDefaultValue:
  260. return "kPluginBridgeNonRtServerDefaultValue";
  261. case kPluginBridgeNonRtServerCurrentProgram:
  262. return "kPluginBridgeNonRtServerCurrentProgram";
  263. case kPluginBridgeNonRtServerCurrentMidiProgram:
  264. return "kPluginBridgeNonRtServerCurrentMidiProgram";
  265. case kPluginBridgeNonRtServerProgramName:
  266. return "kPluginBridgeNonRtServerProgramName";
  267. case kPluginBridgeNonRtServerMidiProgramData:
  268. return "kPluginBridgeNonRtServerMidiProgramData";
  269. case kPluginBridgeNonRtServerConfigure:
  270. return "kPluginBridgeNonRtServerConfigure";
  271. case kPluginBridgeNonRtServerSetCustomData:
  272. return "kPluginBridgeNonRtServerSetCustomData";
  273. case kPluginBridgeNonRtServerSetChunkDataFile:
  274. return "kPluginBridgeNonRtServerSetChunkDataFile";
  275. case kPluginBridgeNonRtServerSetLatency:
  276. return "kPluginBridgeNonRtServerSetLatency";
  277. case kPluginBridgeNonRtServerReady:
  278. return "kPluginBridgeNonRtServerReady";
  279. case kPluginBridgeNonRtServerSaved:
  280. return "kPluginBridgeNonRtServerSaved";
  281. case kPluginBridgeNonRtServerUiClosed:
  282. return "kPluginBridgeNonRtServerUiClosed";
  283. case kPluginBridgeNonRtServerError:
  284. return "kPluginBridgeNonRtServerError";
  285. }
  286. carla_stderr("CarlaBackend::PluginBridgeNonRtServerOpcode2str%i) - invalid opcode", opcode);
  287. return nullptr;
  288. }
  289. // -----------------------------------------------------------------------
  290. #endif // CARLA_BRIDGE_UTILS_HPP_INCLUDED