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.

201 lines
7.9KB

  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 "CarlaBackend.h"
  20. //#include "CarlaEngine.hpp"
  21. #include "CarlaRingBuffer.hpp"
  22. // -----------------------------------------------------------------------
  23. enum PluginBridgeInfoType {
  24. kPluginBridgePong = 0,
  25. kPluginBridgePluginInfo1, // uuh => category, hints, uniqueId
  26. kPluginBridgePluginInfo2, // ssss => realName, label, maker, copyright
  27. kPluginBridgeAudioCount, // uu => ins, outs
  28. kPluginBridgeMidiCount, // uu => ins, outs
  29. kPluginBridgeParameterCount, // uu => ins, outs
  30. kPluginBridgeProgramCount, // u => count
  31. kPluginBridgeMidiProgramCount, // u => count
  32. kPluginBridgeParameterData, // uiuuss => index, rindex, type, hints, name, unit
  33. kPluginBridgeParameterRanges1, // ufff => index, def, min, max
  34. kPluginBridgeParameterRanges2, // ufff => index, step, stepSmall, stepLarge
  35. kPluginBridgeParameterMidiCC, // ui => index, cc
  36. kPluginBridgeParameterMidiChannel, // uu => index, channel
  37. kPluginBridgeParameterValue, // uf => index, value
  38. kPluginBridgeDefaultValue, // uf => index, value
  39. kPluginBridgeCurrentProgram, // i => index
  40. kPluginBridgeCurrentMidiProgram, // i => index
  41. kPluginBridgeProgramName, // us => index, name
  42. kPluginBridgeMidiProgramData, // uuus => index, bank, program, name
  43. kPluginBridgeConfigure, // ss => key, value
  44. kPluginBridgeSetCustomData, // sss => type, key, value
  45. kPluginBridgeSetChunkData, // s => chunkFile
  46. kPluginBridgeUpdateNow, //
  47. kPluginBridgeError //
  48. };
  49. enum PluginBridgeOpcode {
  50. kPluginBridgeOpcodeNull = 0,
  51. kPluginBridgeOpcodeSetAudioPool = 1, // long
  52. kPluginBridgeOpcodeSetBufferSize = 2, // int
  53. kPluginBridgeOpcodeSetSampleRate = 3, // float
  54. kPluginBridgeOpcodeSetParameterRt = 4, // int, float
  55. kPluginBridgeOpcodeSetParameterNonRt = 5, // int, float
  56. kPluginBridgeOpcodeSetProgram = 6, // int
  57. kPluginBridgeOpcodeSetMidiProgram = 7, // int
  58. kPluginBridgeOpcodeMidiEvent = 8, // long, int, char[] (long = timeFrame, int = size max 4)
  59. kPluginBridgeOpcodeProcess = 9,
  60. kPluginBridgeOpcodeQuit = 10
  61. };
  62. const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host call, tells host GUI is now hidden
  63. const char* const CARLA_BRIDGE_MSG_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host call, tells host state is saved
  64. #if 0
  65. const char* const CARLA_BRIDGE_MSG_SAVE_NOW = "CarlaBridgeSaveNow"; //!< Host -> Plugin call, tells plugin to save state now
  66. const char* const CARLA_BRIDGE_MSG_SET_CHUNK = "CarlaBridgeSetChunk"; //!< Host -> Plugin call, tells plugin to set chunk in file \a value
  67. const char* const CARLA_BRIDGE_MSG_SET_CUSTOM = "CarlaBridgeSetCustom"; //!< Host -> Plugin call, tells plugin to set a custom data set using \a value ("type·key·rvalue").
  68. //If \a type is 'chunk' or 'binary' \a rvalue refers to chunk file.
  69. #endif
  70. // -----------------------------------------------------------------------
  71. struct BridgeTimeInfo {
  72. bool playing;
  73. uint64_t frame;
  74. uint64_t usecs;
  75. uint valid;
  76. // bbt
  77. int32_t bar, beat, tick;
  78. float beatsPerBar, beatType;
  79. double barStartTick, ticksPerBeat, beatsPerMinute;
  80. };
  81. // -----------------------------------------------------------------------
  82. struct BridgeShmControl {
  83. union {
  84. void* runServer;
  85. char _padServer[32];
  86. };
  87. union {
  88. void* runClient;
  89. char _padClient[32];
  90. };
  91. StackBuffer buffer;
  92. };
  93. // -----------------------------------------------------------------------
  94. static inline
  95. const char* PluginBridgeInfoType2str(const PluginBridgeInfoType type) noexcept
  96. {
  97. switch (type)
  98. {
  99. case kPluginBridgePong:
  100. return "kPluginBridgePong";
  101. case kPluginBridgePluginInfo1:
  102. return "kPluginBridgePluginInfo1";
  103. case kPluginBridgePluginInfo2:
  104. return "kPluginBridgePluginInfo2";
  105. case kPluginBridgeAudioCount:
  106. return "kPluginBridgeAudioCount";
  107. case kPluginBridgeMidiCount:
  108. return "kPluginBridgeMidiCount";
  109. case kPluginBridgeParameterCount:
  110. return "kPluginBridgeParameterCount";
  111. case kPluginBridgeProgramCount:
  112. return "kPluginBridgeProgramCount";
  113. case kPluginBridgeMidiProgramCount:
  114. return "kPluginBridgeMidiProgramCount";
  115. case kPluginBridgeParameterData:
  116. return "kPluginBridgeParameterData";
  117. case kPluginBridgeParameterRanges1:
  118. return "kPluginBridgeParameterRanges1";
  119. case kPluginBridgeParameterRanges2:
  120. return "kPluginBridgeParameterRanges2";
  121. case kPluginBridgeParameterMidiCC:
  122. return "kPluginBridgeParameterMidiCC";
  123. case kPluginBridgeParameterMidiChannel:
  124. return "kPluginBridgeParameterMidiChannel";
  125. case kPluginBridgeParameterValue:
  126. return "kPluginBridgeParameterValue";
  127. case kPluginBridgeDefaultValue:
  128. return "kPluginBridgeDefaultValue";
  129. case kPluginBridgeCurrentProgram:
  130. return "kPluginBridgeCurrentProgram";
  131. case kPluginBridgeCurrentMidiProgram:
  132. return "kPluginBridgeCurrentMidiProgram";
  133. case kPluginBridgeProgramName:
  134. return "kPluginBridgeProgramName";
  135. case kPluginBridgeMidiProgramData:
  136. return "kPluginBridgeMidiProgramData";
  137. case kPluginBridgeConfigure:
  138. return "kPluginBridgeConfigure";
  139. case kPluginBridgeSetCustomData:
  140. return "kPluginBridgeSetCustomData";
  141. case kPluginBridgeSetChunkData:
  142. return "kPluginBridgeSetChunkData";
  143. case kPluginBridgeUpdateNow:
  144. return "kPluginBridgeUpdateNow";
  145. case kPluginBridgeError:
  146. return "kPluginBridgeError";
  147. }
  148. carla_stderr("CarlaBackend::PluginBridgeInfoType2str(%i) - invalid type", type);
  149. return nullptr;
  150. }
  151. static inline
  152. const char* PluginBridgeOpcode2str(const PluginBridgeOpcode opcode) noexcept
  153. {
  154. switch (opcode)
  155. {
  156. case kPluginBridgeOpcodeNull:
  157. return "kPluginBridgeOpcodeNull";
  158. case kPluginBridgeOpcodeSetAudioPool:
  159. return "kPluginBridgeOpcodeSetAudioPool";
  160. case kPluginBridgeOpcodeSetBufferSize:
  161. return "kPluginBridgeOpcodeSetBufferSize";
  162. case kPluginBridgeOpcodeSetSampleRate:
  163. return "kPluginBridgeOpcodeSetSampleRate";
  164. case kPluginBridgeOpcodeSetParameterRt:
  165. return "kPluginBridgeOpcodeSetParameterRt";
  166. case kPluginBridgeOpcodeSetParameterNonRt:
  167. return "kPluginBridgeOpcodeSetParameterNonRt";
  168. case kPluginBridgeOpcodeSetProgram:
  169. return "kPluginBridgeOpcodeSetProgram";
  170. case kPluginBridgeOpcodeSetMidiProgram:
  171. return "kPluginBridgeOpcodeSetMidiProgram";
  172. case kPluginBridgeOpcodeMidiEvent:
  173. return "kPluginBridgeOpcodeMidiEvent";
  174. case kPluginBridgeOpcodeProcess:
  175. return "kPluginBridgeOpcodeProcess";
  176. case kPluginBridgeOpcodeQuit:
  177. return "kPluginBridgeOpcodeQuit";
  178. }
  179. carla_stderr("CarlaBackend::PluginBridgeOpcode2str(%i) - invalid opcode", opcode);
  180. return nullptr;
  181. }
  182. // -----------------------------------------------------------------------
  183. #endif // CARLA_BRIDGE_UTILS_HPP_INCLUDED