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.

176 lines
6.3KB

  1. /*
  2. * Carla Bridge utils imported from dssi-vst code
  3. * Copyright (C) 2004-2010 Chris Cannam <cannam@all-day-breakfast.com>
  4. * Copyright (C) 2013 Filipe Coelho <falktx@falktx.com>
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License as
  8. * published by the Free Software Foundation; either version 2 of
  9. * the License, or any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * For a full copy of the GNU General Public License see the GPL.txt file
  17. */
  18. #ifndef __CARLA_BRIDGE_UTILS_HPP__
  19. #define __CARLA_BRIDGE_UTILS_HPP__
  20. #include "CarlaRingBuffer.hpp"
  21. // -------------------------------------------------
  22. enum PluginBridgeInfoType {
  23. kPluginBridgeAudioCount = 0,
  24. kPluginBridgeMidiCount,
  25. kPluginBridgeParameterCount,
  26. kPluginBridgeProgramCount,
  27. kPluginBridgeMidiProgramCount,
  28. kPluginBridgePluginInfo,
  29. kPluginBridgeParameterInfo,
  30. kPluginBridgeParameterData,
  31. kPluginBridgeParameterRanges,
  32. kPluginBridgeProgramInfo,
  33. kPluginBridgeMidiProgramInfo,
  34. kPluginBridgeConfigure,
  35. kPluginBridgeSetParameterValue,
  36. kPluginBridgeSetDefaultValue,
  37. kPluginBridgeSetProgram,
  38. kPluginBridgeSetMidiProgram,
  39. kPluginBridgeSetCustomData,
  40. kPluginBridgeSetChunkData,
  41. kPluginBridgeUpdateNow,
  42. kPluginBridgeError
  43. };
  44. enum PluginBridgeOpcode {
  45. kPluginBridgeOpcodeNull = 0,
  46. kPluginBridgeOpcodeSetAudioPool = 1, // long
  47. kPluginBridgeOpcodeSetBufferSize = 2, // int
  48. kPluginBridgeOpcodeSetSampleRate = 3, // float
  49. kPluginBridgeOpcodeSetParameter = 4, // int, float
  50. kPluginBridgeOpcodeSetProgram = 5, // int
  51. kPluginBridgeOpcodeSetMidiProgram = 6, // int
  52. kPluginBridgeOpcodeMidiEvent = 7, // long, int, char[] (long = timeFrame, int = size max 4)
  53. kPluginBridgeOpcodeProcess = 8,
  54. kPluginBridgeOpcodeQuit = 9
  55. };
  56. const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host call, tells host GUI is now hidden
  57. const char* const CARLA_BRIDGE_MSG_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host call, tells host state is saved
  58. #if 0
  59. const char* const CARLA_BRIDGE_MSG_SAVE_NOW = "CarlaBridgeSaveNow"; //!< Host -> Plugin call, tells plugin to save state now
  60. const char* const CARLA_BRIDGE_MSG_SET_CHUNK = "CarlaBridgeSetChunk"; //!< Host -> Plugin call, tells plugin to set chunk in file \a value
  61. 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").
  62. //If \a type is 'chunk' or 'binary' \a rvalue refers to chunk file.
  63. #endif
  64. // -------------------------------------------------
  65. struct BridgeShmControl {
  66. // 32 and 64-bit binaries align semaphores differently.
  67. // Let's make sure there's plenty of room for either one.
  68. union {
  69. void* runServer;
  70. char _alignServer[128];
  71. };
  72. union {
  73. void* runClient;
  74. char _alignClient[128];
  75. };
  76. RingBuffer ringBuffer;
  77. CARLA_DECLARE_NON_COPY_STRUCT(BridgeShmControl)
  78. };
  79. // -------------------------------------------------
  80. static inline
  81. const char* PluginBridgeInfoType2str(const PluginBridgeInfoType type)
  82. {
  83. switch (type)
  84. {
  85. case kPluginBridgeAudioCount:
  86. return "kPluginBridgeAudioCount";
  87. case kPluginBridgeMidiCount:
  88. return "kPluginBridgeMidiCount";
  89. case kPluginBridgeParameterCount:
  90. return "kPluginBridgeParameterCount";
  91. case kPluginBridgeProgramCount:
  92. return "kPluginBridgeProgramCount";
  93. case kPluginBridgeMidiProgramCount:
  94. return "kPluginBridgeMidiProgramCount";
  95. case kPluginBridgePluginInfo:
  96. return "kPluginBridgePluginInfo";
  97. case kPluginBridgeParameterInfo:
  98. return "kPluginBridgeParameterInfo";
  99. case kPluginBridgeParameterData:
  100. return "kPluginBridgeParameterData";
  101. case kPluginBridgeParameterRanges:
  102. return "kPluginBridgeParameterRanges";
  103. case kPluginBridgeProgramInfo:
  104. return "kPluginBridgeProgramInfo";
  105. case kPluginBridgeMidiProgramInfo:
  106. return "kPluginBridgeMidiProgramInfo";
  107. case kPluginBridgeConfigure:
  108. return "kPluginBridgeConfigure";
  109. case kPluginBridgeSetParameterValue:
  110. return "kPluginBridgeSetParameterValue";
  111. case kPluginBridgeSetDefaultValue:
  112. return "kPluginBridgeSetDefaultValue";
  113. case kPluginBridgeSetProgram:
  114. return "kPluginBridgeSetProgram";
  115. case kPluginBridgeSetMidiProgram:
  116. return "kPluginBridgeSetMidiProgram";
  117. case kPluginBridgeSetCustomData:
  118. return "kPluginBridgeSetCustomData";
  119. case kPluginBridgeSetChunkData:
  120. return "kPluginBridgeSetChunkData";
  121. case kPluginBridgeUpdateNow:
  122. return "kPluginBridgeUpdateNow";
  123. case kPluginBridgeError:
  124. return "kPluginBridgeError";
  125. }
  126. carla_stderr("CarlaBackend::PluginBridgeInfoType2str(%i) - invalid type", type);
  127. return nullptr;
  128. }
  129. static inline
  130. const char* PluginBridgeOpcode2str(const PluginBridgeOpcode opcode)
  131. {
  132. switch (opcode)
  133. {
  134. case kPluginBridgeOpcodeNull:
  135. return "kPluginBridgeOpcodeNull";
  136. case kPluginBridgeOpcodeSetAudioPool:
  137. return "kPluginBridgeOpcodeSetAudioPool";
  138. case kPluginBridgeOpcodeSetBufferSize:
  139. return "kPluginBridgeOpcodeSetBufferSize";
  140. case kPluginBridgeOpcodeSetSampleRate:
  141. return "kPluginBridgeOpcodeSetSampleRate";
  142. case kPluginBridgeOpcodeSetParameter:
  143. return "kPluginBridgeOpcodeSetParameter";
  144. case kPluginBridgeOpcodeSetProgram:
  145. return "kPluginBridgeOpcodeSetProgram";
  146. case kPluginBridgeOpcodeSetMidiProgram:
  147. return "kPluginBridgeOpcodeSetMidiProgram";
  148. case kPluginBridgeOpcodeMidiEvent:
  149. return "kPluginBridgeOpcodeMidiEvent";
  150. case kPluginBridgeOpcodeProcess:
  151. return "kPluginBridgeOpcodeProcess";
  152. case kPluginBridgeOpcodeQuit:
  153. return "kPluginBridgeOpcodeQuit";
  154. }
  155. carla_stderr("CarlaBackend::PluginBridgeOpcode2str(%i) - invalid opcode", opcode);
  156. return nullptr;
  157. }
  158. // -------------------------------------------------
  159. #endif // __CARLA_BRIDGE_UTILS_HPP__