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.

carla-single 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # Script to start carla plugin bridges
  4. # Copyright (C) 2015-2018 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 doc/GPL.txt file.
  17. # --------------------------------------------------------------------------------------------------------
  18. # Imports
  19. import os
  20. import sys
  21. # --------------------------------------------------------------------------------------------------------
  22. # Setup
  23. INSTALL_PREFIX = "X-PREFIX-X"
  24. CARLA_LIBDIR = os.path.join(INSTALL_PREFIX, "lib", "carla")
  25. CARLA_RESDIR = os.path.join(INSTALL_PREFIX, "share", "carla", "resources")
  26. # --------------------------------------------------------------------------------------------------------
  27. # Check for enough arguments
  28. usageMsg = """\
  29. usage: %s [arch (optional)] [format] [filename/uri] [label (optional)] [uniqueId (optional)]
  30. Possible archs:
  31. - native (default)
  32. - linux32
  33. - linux64
  34. - win32
  35. - win64
  36. Possible formats:
  37. - internal
  38. - ladspa
  39. - dssi
  40. - lv2
  41. - vst|vst2
  42. - vst3
  43. - sf2
  44. - sfz
  45. Examples:
  46. $ %s internal midisplit
  47. $ %s dssi /usr/lib/dssi/whysynth.so
  48. $ %s lv2 http://calf.sourceforge.net/plugins/Compressor
  49. $ %s native vst /usr/lib/vst/TAL-NoiseMaker.so
  50. $ %s win32 vst \"~/.wine/drive_c/Program Files (x86)/VstPlugins/Kontakt 5.dll\"
  51. $ CARLA_BRIDGE_PLUGIN_BINARY_TYPE=win64 %s vst \"~/.wine/drive_c/Program Files/Common Files/VST2/Sytrus VSTi.dll\"
  52. Format can be skipped for internal and lv2 plugins (auto-detected), like this:
  53. $ %s midipattern
  54. $ %s http://synthv1.sourceforge.net/lv2""" % ((sys.argv[0],)*9)
  55. def printUsageAndQuit():
  56. print(usageMsg)
  57. sys.exit(0)
  58. if len(sys.argv) < 2:
  59. printUsageAndQuit()
  60. # --------------------------------------------------------------------------------------------------------
  61. # Initialize variables to null
  62. ARCH = os.getenv("CARLA_BRIDGE_PLUGIN_BINARY_TYPE", "native")
  63. FORMAT = "none"
  64. FILENAME = ""
  65. LABEL = ""
  66. UNIQUEID = 0
  67. # --------------------------------------------------------------------------------------------------------
  68. # Set arch
  69. arg = 1
  70. if sys.argv[arg] in ("native", "posix32", "posix64", "linux32", "linux64", "mac32", "mac64", "win32", "win64"):
  71. ARCH = sys.argv[arg].replace("linux", "posix").replace("mac", "posix")
  72. arg += 1
  73. if len(sys.argv) == arg:
  74. printUsageAndQuit()
  75. # --------------------------------------------------------------------------------------------------------
  76. # Set format
  77. if sys.argv[arg] in ("internal", "ladspa", "dssi", "lv2", "vst", "vst2", "vst3", "au", "sf2", "sfz"):
  78. FORMAT = sys.argv[arg]
  79. arg += 1
  80. if FORMAT == "vst":
  81. FORMAT = "vst2"
  82. elif len(sys.argv) == arg+1:
  83. FORMAT = "lv2" if ":" in sys.argv[arg] else "internal"
  84. else:
  85. print("Invalid format")
  86. sys.exit(1)
  87. if len(sys.argv) == arg:
  88. printUsageAndQuit()
  89. # --------------------------------------------------------------------------------------------------------
  90. # Set filename/uri
  91. if FORMAT in ("internal", "lv2"):
  92. LABEL = sys.argv[arg]
  93. arg += 1
  94. else:
  95. FILENAME = os.path.expanduser(sys.argv[arg])
  96. arg += 1
  97. # --------------------------------------------------------------------------------------------------------
  98. # Set label (optional)
  99. if len(sys.argv) > arg:
  100. if FORMAT == "internal":
  101. print("label/uri already set, ignoring 2nd label")
  102. elif FORMAT == "lv2":
  103. newpwd = sys.argv[arg]
  104. if os.path.exists(newpwd):
  105. print("using path hack for lv2 plugin")
  106. os.chdir(newpwd)
  107. else:
  108. LABEL = sys.argv[arg]
  109. arg += 1
  110. # --------------------------------------------------------------------------------------------------------
  111. # Set uniqueId (optional)
  112. if len(sys.argv) > arg:
  113. if FORMAT in ("internal", "dssi", "lv2", "au", "sf2", "sfz"):
  114. print("uniqueId is not used in this format, ignored")
  115. else:
  116. try:
  117. UNIQUEID = int(sys.argv[arg])
  118. except:
  119. print("uniqueId must be a number")
  120. sys.exit(1)
  121. arg += 1
  122. # --------------------------------------------------------------------------------------------------------
  123. # Others?
  124. if len(sys.argv) > arg:
  125. print("Got too many arguments, ignoring past uniqueId")
  126. # --------------------------------------------------------------------------------------------------------
  127. # Set bridge binary
  128. BRIDGE = os.path.join(CARLA_LIBDIR, "carla-bridge-" + ARCH)
  129. if ARCH in ("win32", "win64"):
  130. BRIDGE = BRIDGE + ".exe"
  131. # --------------------------------------------------------------------------------------------------------
  132. # Check for existing carla folder
  133. if not os.path.exists(CARLA_LIBDIR):
  134. print("Carla library folder does not exist, is Carla installed?")
  135. sys.exit(2)
  136. if not os.path.exists(CARLA_RESDIR):
  137. print("Carla resource folder does not exist, is Carla installed?")
  138. sys.exit(2)
  139. # --------------------------------------------------------------------------------------------------------
  140. # Check for existing arch binary
  141. if not os.path.exists(BRIDGE):
  142. print("Carla plugin bridge for the requested arch (%s) does not exist" % (ARCH,))
  143. sys.exit(2)
  144. # --------------------------------------------------------------------------------------------------------
  145. # Final checks
  146. if ARCH not in ("native", "posix32", "posix64", "win32", "win64"):
  147. print("Invalid arch")
  148. sys.exit(1)
  149. if FORMAT not in ("internal", "ladspa", "dssi", "lv2", "vst2", "vst3", "au", "sf2", "sfz"):
  150. print("Invalid format")
  151. sys.exit(1)
  152. if FILENAME and not os.path.exists(FILENAME):
  153. print("Requested filename does not exist")
  154. sys.exit(1)
  155. # --------------------------------------------------------------------------------------------------------
  156. # Setup environment
  157. LADSPA_PATH = os.getenv("LADSPA_PATH")
  158. DSSI_PATH = os.getenv("DSSI_PATH")
  159. LV2_PATH = os.getenv("LV2_PATH")
  160. VST2_PATH = os.getenv("VST_PATH")
  161. VST3_PATH = os.getenv("VST3_PATH")
  162. SF2_PATH = os.getenv("SF2_PATH")
  163. SFZ_PATH = os.getenv("SFZ_PATH")
  164. if LADSPA_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_LADSPA"] = LADSPA_PATH
  165. if DSSI_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_DSSI"] = DSSI_PATH
  166. if LV2_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_LV2"] = LV2_PATH
  167. if VST2_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_VST2"] = VST2_PATH
  168. if VST3_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_VST3"] = VST3_PATH
  169. if SF2_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_SF2"] = SF2_PATH
  170. if SFZ_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_SFZ"] = SFZ_PATH
  171. os.environ["ENGINE_OPTION_PATH_BINARIES"] = CARLA_LIBDIR
  172. os.environ["ENGINE_OPTION_PATH_RESOURCES"] = CARLA_RESDIR
  173. # --------------------------------------------------------------------------------------------------------
  174. CARLA_CLIENT_NAME = os.getenv("CARLA_CLIENT_NAME")
  175. LADISH_APP_NAME = os.getenv("LADISH_APP_NAME")
  176. if CARLA_CLIENT_NAME is not None:
  177. os.environ["CARLA_CLIENT_NAME"] = CARLA_CLIENT_NAME
  178. elif LADISH_APP_NAME is not None:
  179. os.environ["CARLA_CLIENT_NAME"] = LADISH_APP_NAME
  180. else:
  181. os.environ["CARLA_CLIENT_NAME"] = "(none)"
  182. # --------------------------------------------------------------------------------------------------------
  183. # Exec
  184. command = []
  185. if os.getenv("CARLA_BRIDGE_PLUGIN_BINARY_TYPE") is not None:
  186. BRIDGE = os.path.join(CARLA_LIBDIR, "carla-bridge-native")
  187. elif ARCH == "win32":
  188. command.append("wine")
  189. elif ARCH == "win64":
  190. command.append("wine64")
  191. command.append(BRIDGE)
  192. command.append(FORMAT)
  193. command.append(FILENAME or "(none)")
  194. command.append(LABEL or "(none)")
  195. command.append(str(UNIQUEID))
  196. print(command)
  197. os.execvp(command[0], command)
  198. # --------------------------------------------------------------------------------------------------------