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.

276 lines
10KB

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