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.

311 lines
13KB

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