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.

301 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. kPluginBridgeRtControlEventParameter, // uint/frame, byte/chan, ushort, float
  54. kPluginBridgeRtControlEventMidiBank, // uint/frame, byte/chan, ushort
  55. kPluginBridgeRtControlEventMidiProgram, // uint/frame, byte/chan, ushort
  56. kPluginBridgeRtControlEventAllSoundOff, // uint/frame, byte/chan
  57. kPluginBridgeRtControlEventAllNotesOff, // uint/frame, byte/chan
  58. kPluginBridgeRtMidiEvent, // uint/frame, byte/port, byte/size, byte[]/data
  59. kPluginBridgeRtProcess,
  60. kPluginBridgeRtQuit
  61. };
  62. // carla-plugin sends these during non-RT
  63. enum PluginBridgeNonRtOpcode {
  64. kPluginBridgeNonRtNull = 0,
  65. kPluginBridgeNonRtPing,
  66. kPluginBridgeNonRtActivate,
  67. kPluginBridgeNonRtDeactivate,
  68. kPluginBridgeNonRtSetBufferSize, // uint
  69. kPluginBridgeNonRtSetSampleRate, // double
  70. kPluginBridgeNonRtSetOffline,
  71. kPluginBridgeNonRtSetOnline,
  72. kPluginBridgeNonRtSetParameterValue, // uint, float
  73. kPluginBridgeNonRtSetParameterMidiChannel, // uint, byte
  74. kPluginBridgeNonRtSetParameterMidiCC, // uint, short
  75. kPluginBridgeNonRtSetProgram, // int
  76. kPluginBridgeNonRtSetMidiProgram, // int
  77. kPluginBridgeNonRtSetCustomData, // uint/size, str[], uint/size, str[], uint/size, str[] TODO plugin
  78. kPluginBridgeNonRtSetChunkDataFile, // uint/size, str[]/file
  79. kPluginBridgeNonRtSetCtrlChannel, // short
  80. kPluginBridgeNonRtSetOscURL, // uint/size, str[]/url
  81. kPluginBridgeNonRtSetOption, // uint/option, bool
  82. kPluginBridgeNonRtPrepareForSave,
  83. kPluginBridgeNonRtShowUI,
  84. kPluginBridgeNonRtHideUI,
  85. kPluginBridgeNonRtUiParameterChange, // uint, float
  86. kPluginBridgeNonRtUiProgramChange, // uint
  87. kPluginBridgeNonRtUiMidiProgramChange, // uint
  88. kPluginBridgeNonRtUiNoteOn, // byte, byte, byte
  89. kPluginBridgeNonRtUiNoteOff, // byte, byte
  90. kPluginBridgeNonRtQuit
  91. };
  92. // -----------------------------------------------------------------------
  93. const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host configure, tells host GUI is now hidden
  94. const char* const CARLA_BRIDGE_MSG_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host configure, tells host state is saved
  95. // -----------------------------------------------------------------------
  96. struct BridgeSemaphore {
  97. union {
  98. void* server;
  99. char _padServer[64];
  100. };
  101. union {
  102. void* client;
  103. char _padClient[64];
  104. };
  105. };
  106. // needs to be 64bit aligned
  107. struct BridgeTimeInfo {
  108. uint64_t playing;
  109. uint64_t frame;
  110. uint64_t usecs;
  111. uint32_t valid;
  112. // bbt
  113. int32_t bar, beat, tick;
  114. float beatsPerBar, beatType;
  115. double barStartTick, ticksPerBeat, beatsPerMinute;
  116. };
  117. struct BridgeRtData {
  118. BridgeSemaphore sem;
  119. BridgeTimeInfo timeInfo;
  120. StackBuffer ringBuffer;
  121. };
  122. struct BridgeNonRtData {
  123. BigStackBuffer ringBuffer;
  124. };
  125. // -----------------------------------------------------------------------
  126. static inline
  127. const char* PluginBridgeOscInfoType2str(const PluginBridgeOscInfoType type) noexcept
  128. {
  129. switch (type)
  130. {
  131. case kPluginBridgeOscNull:
  132. return "kPluginBridgeOscNull";
  133. case kPluginBridgeOscPong:
  134. return "kPluginBridgeOscPong";
  135. case kPluginBridgeOscPluginInfo1:
  136. return "kPluginBridgeOscPluginInfo1";
  137. case kPluginBridgeOscPluginInfo2:
  138. return "kPluginBridgeOscPluginInfo2";
  139. case kPluginBridgeOscAudioCount:
  140. return "kPluginBridgeOscAudioCount";
  141. case kPluginBridgeOscMidiCount:
  142. return "kPluginBridgeOscMidiCount";
  143. case kPluginBridgeOscParameterCount:
  144. return "kPluginBridgeOscParameterCount";
  145. case kPluginBridgeOscProgramCount:
  146. return "kPluginBridgeOscProgramCount";
  147. case kPluginBridgeOscMidiProgramCount:
  148. return "kPluginBridgeOscMidiProgramCount";
  149. case kPluginBridgeOscParameterData1:
  150. return "kPluginBridgeOscParameterData1";
  151. case kPluginBridgeOscParameterData2:
  152. return "kPluginBridgeOscParameterData2";
  153. case kPluginBridgeOscParameterRanges1:
  154. return "kPluginBridgeOscParameterRanges1";
  155. case kPluginBridgeOscParameterRanges2:
  156. return "kPluginBridgeOscParameterRanges2";
  157. case kPluginBridgeOscParameterValue:
  158. return "kPluginBridgeOscParameterValue";
  159. case kPluginBridgeOscDefaultValue:
  160. return "kPluginBridgeOscDefaultValue";
  161. case kPluginBridgeOscCurrentProgram:
  162. return "kPluginBridgeOscCurrentProgram";
  163. case kPluginBridgeOscCurrentMidiProgram:
  164. return "kPluginBridgeOscCurrentMidiProgram";
  165. case kPluginBridgeOscProgramName:
  166. return "kPluginBridgeOscProgramName";
  167. case kPluginBridgeOscMidiProgramData:
  168. return "kPluginBridgeOscMidiProgramData";
  169. case kPluginBridgeOscConfigure:
  170. return "kPluginBridgeOscConfigure";
  171. case kPluginBridgeOscSetCustomData:
  172. return "kPluginBridgeOscSetCustomData";
  173. case kPluginBridgeOscSetChunkDataFile:
  174. return "kPluginBridgeOscSetChunkDataFile";
  175. case kPluginBridgeOscLatency:
  176. return "kPluginBridgeOscLatency";
  177. case kPluginBridgeOscReady:
  178. return "kPluginBridgeOscReady";
  179. case kPluginBridgeOscError:
  180. return "kPluginBridgeOscError";
  181. }
  182. carla_stderr("CarlaBackend::PluginBridgeOscInfoType2str(%i) - invalid type", type);
  183. return nullptr;
  184. }
  185. static inline
  186. const char* PluginBridgeRtOpcode2str(const PluginBridgeRtOpcode opcode) noexcept
  187. {
  188. switch (opcode)
  189. {
  190. case kPluginBridgeRtNull:
  191. return "kPluginBridgeRtNull";
  192. case kPluginBridgeRtSetAudioPool:
  193. return "kPluginBridgeRtSetAudioPool";
  194. case kPluginBridgeRtControlEventParameter:
  195. return "kPluginBridgeRtControlEventParameter";
  196. case kPluginBridgeRtControlEventMidiBank:
  197. return "kPluginBridgeRtControlEventMidiBank";
  198. case kPluginBridgeRtControlEventMidiProgram:
  199. return "kPluginBridgeRtControlEventMidiProgram";
  200. case kPluginBridgeRtControlEventAllSoundOff:
  201. return "kPluginBridgeRtControlEventAllSoundOff";
  202. case kPluginBridgeRtControlEventAllNotesOff:
  203. return "kPluginBridgeRtControlEventAllNotesOff";
  204. case kPluginBridgeRtMidiEvent:
  205. return "kPluginBridgeRtMidiEvent";
  206. case kPluginBridgeRtProcess:
  207. return "kPluginBridgeRtProcess";
  208. case kPluginBridgeRtQuit:
  209. return "kPluginBridgeRtQuit";
  210. }
  211. carla_stderr("CarlaBackend::PluginBridgeRtOpcode2str(%i) - invalid opcode", opcode);
  212. return nullptr;
  213. }
  214. static inline
  215. const char* PluginBridgeNonRtOpcode2str(const PluginBridgeNonRtOpcode opcode) noexcept
  216. {
  217. switch (opcode)
  218. {
  219. case kPluginBridgeNonRtNull:
  220. return "kPluginBridgeNonRtNull";
  221. case kPluginBridgeNonRtPing:
  222. return "kPluginBridgeNonRtPing";
  223. case kPluginBridgeNonRtActivate:
  224. return "kPluginBridgeNonRtActivate";
  225. case kPluginBridgeNonRtDeactivate:
  226. return "kPluginBridgeNonRtDeactivate";
  227. case kPluginBridgeNonRtSetBufferSize:
  228. return "kPluginBridgeNonRtSetBufferSize";
  229. case kPluginBridgeNonRtSetSampleRate:
  230. return "kPluginBridgeNonRtSetSampleRate";
  231. case kPluginBridgeNonRtSetOffline:
  232. return "kPluginBridgeNonRtSetOffline";
  233. case kPluginBridgeNonRtSetOnline:
  234. return "kPluginBridgeNonRtSetOnline";
  235. case kPluginBridgeNonRtSetParameterValue:
  236. return "kPluginBridgeNonRtSetParameterValue";
  237. case kPluginBridgeNonRtSetParameterMidiChannel:
  238. return "kPluginBridgeNonRtSetParameterMidiChannel";
  239. case kPluginBridgeNonRtSetParameterMidiCC:
  240. return "kPluginBridgeNonRtSetParameterMidiCC";
  241. case kPluginBridgeNonRtSetProgram:
  242. return "kPluginBridgeNonRtSetProgram";
  243. case kPluginBridgeNonRtSetMidiProgram:
  244. return "kPluginBridgeNonRtSetMidiProgram";
  245. case kPluginBridgeNonRtSetCustomData:
  246. return "kPluginBridgeNonRtSetCustomData";
  247. case kPluginBridgeNonRtSetChunkDataFile:
  248. return "kPluginBridgeNonRtSetChunkDataFile";
  249. case kPluginBridgeNonRtSetCtrlChannel:
  250. return "kPluginBridgeNonRtSetCtrlChannel";
  251. case kPluginBridgeNonRtSetOscURL:
  252. return "kPluginBridgeNonRtSetOscURL";
  253. case kPluginBridgeNonRtSetOption:
  254. return "kPluginBridgeNonRtSetOption";
  255. case kPluginBridgeNonRtPrepareForSave:
  256. return "kPluginBridgeNonRtPrepareForSave";
  257. case kPluginBridgeNonRtShowUI:
  258. return "kPluginBridgeNonRtShowUI";
  259. case kPluginBridgeNonRtHideUI:
  260. return "kPluginBridgeNonRtHideUI";
  261. case kPluginBridgeNonRtUiParameterChange:
  262. return "kPluginBridgeNonRtUiParameterChange";
  263. case kPluginBridgeNonRtUiProgramChange:
  264. return "kPluginBridgeNonRtUiProgramChange";
  265. case kPluginBridgeNonRtUiMidiProgramChange:
  266. return "kPluginBridgeNonRtUiMidiProgramChange";
  267. case kPluginBridgeNonRtUiNoteOn:
  268. return "kPluginBridgeNonRtUiNoteOn";
  269. case kPluginBridgeNonRtUiNoteOff:
  270. return "kPluginBridgeNonRtUiNoteOff";
  271. case kPluginBridgeNonRtQuit:
  272. return "kPluginBridgeNonRtQuit";
  273. }
  274. carla_stderr("CarlaBackend::PluginBridgeNonRtOpcode2str(%i) - invalid opcode", opcode);
  275. return nullptr;
  276. }
  277. // -----------------------------------------------------------------------
  278. #endif // CARLA_BRIDGE_UTILS_HPP_INCLUDED