264 lines
8.5 KiB
Python
Executable File
264 lines
8.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Script to start carla plugin bridges
|
|
# Copyright (C) 2015-2018 Filipe Coelho <falktx@falktx.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License as
|
|
# published by the Free Software Foundation; either version 2 of
|
|
# the License, or any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# For a full copy of the GNU General Public License see the doc/GPL.txt file.
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Imports
|
|
|
|
import os
|
|
import sys
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Setup
|
|
|
|
INSTALL_PREFIX = "X-PREFIX-X"
|
|
|
|
CARLA_LIBDIR = os.path.join(INSTALL_PREFIX, "lib", "carla")
|
|
CARLA_RESDIR = os.path.join(INSTALL_PREFIX, "share", "carla", "resources")
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Check for enough arguments
|
|
|
|
usageMsg = """\
|
|
usage: %s [arch (optional)] [format] [filename/uri] [label (optional)] [uniqueId (optional)]
|
|
|
|
Possible archs:
|
|
- native (default)
|
|
- linux32
|
|
- linux64
|
|
- win32
|
|
- win64
|
|
|
|
Possible formats:
|
|
- internal
|
|
- ladspa
|
|
- dssi
|
|
- lv2
|
|
- vst|vst2
|
|
- vst3
|
|
- clap
|
|
- jsfx
|
|
- sf2
|
|
- sfz
|
|
|
|
Examples:
|
|
$ %s internal midisplit
|
|
$ %s dssi /usr/lib/dssi/whysynth.so
|
|
$ %s lv2 http://calf.sourceforge.net/plugins/Compressor
|
|
$ %s native vst /usr/lib/vst/TAL-NoiseMaker.so
|
|
$ %s win32 vst \"~/.wine/drive_c/Program Files (x86)/VstPlugins/Kontakt 5.dll\"
|
|
$ CARLA_BRIDGE_PLUGIN_BINARY_TYPE=win64 %s vst \"~/.wine/drive_c/Program Files/Common Files/VST2/Sytrus VSTi.dll\"
|
|
|
|
Format can be skipped for internal and lv2 plugins (auto-detected), like this:
|
|
$ %s midipattern
|
|
$ %s http://synthv1.sourceforge.net/lv2""" % ((sys.argv[0],)*9)
|
|
|
|
def printUsageAndQuit():
|
|
print(usageMsg)
|
|
sys.exit(0)
|
|
|
|
if len(sys.argv) < 2:
|
|
printUsageAndQuit()
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Initialize variables to null
|
|
|
|
ARCH = os.getenv("CARLA_BRIDGE_PLUGIN_BINARY_TYPE", "native")
|
|
TESTING = os.getenv("CARLA_BRIDGE_TESTING", None)
|
|
FORMAT = "none"
|
|
FILENAME = ""
|
|
LABEL = ""
|
|
UNIQUEID = 0
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Set arch
|
|
|
|
arg = 1
|
|
|
|
if sys.argv[arg] in ("native", "posix32", "posix64", "linux32", "linux64", "mac32", "mac64", "win32", "win64"):
|
|
ARCH = sys.argv[arg].replace("linux", "posix").replace("mac", "posix")
|
|
arg += 1
|
|
|
|
if len(sys.argv) == arg:
|
|
printUsageAndQuit()
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Set format
|
|
|
|
if sys.argv[arg] in ("internal", "ladspa", "dssi", "lv2", "vst", "vst2", "vst3", "au", "clap", "jsfx", "sf2", "sfz"):
|
|
FORMAT = sys.argv[arg]
|
|
arg += 1
|
|
|
|
if FORMAT == "vst":
|
|
FORMAT = "vst2"
|
|
|
|
elif len(sys.argv) == arg+1:
|
|
FORMAT = "lv2" if ":" in sys.argv[arg] else "internal"
|
|
|
|
else:
|
|
print("Invalid format")
|
|
sys.exit(1)
|
|
|
|
if len(sys.argv) == arg:
|
|
printUsageAndQuit()
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Set filename/uri
|
|
|
|
if FORMAT in ("internal", "lv2"):
|
|
LABEL = sys.argv[arg]
|
|
arg += 1
|
|
|
|
else:
|
|
FILENAME = os.path.expanduser(sys.argv[arg])
|
|
arg += 1
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Set label (optional)
|
|
|
|
if len(sys.argv) > arg:
|
|
if FORMAT == "internal":
|
|
print("label/uri already set, ignoring 2nd label")
|
|
elif FORMAT == "lv2":
|
|
newpwd = sys.argv[arg]
|
|
if os.path.exists(newpwd):
|
|
print("using path hack for lv2 plugin")
|
|
os.chdir(newpwd)
|
|
else:
|
|
LABEL = sys.argv[arg]
|
|
arg += 1
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Set uniqueId (optional)
|
|
|
|
if len(sys.argv) > arg:
|
|
if FORMAT in ("internal", "dssi", "lv2", "au", "sf2", "sfz"):
|
|
print("uniqueId is not used in this format, ignored")
|
|
else:
|
|
try:
|
|
UNIQUEID = int(sys.argv[arg])
|
|
except:
|
|
print("uniqueId must be a number")
|
|
sys.exit(1)
|
|
arg += 1
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Others?
|
|
|
|
if len(sys.argv) > arg:
|
|
print("Got too many arguments, ignoring past uniqueId")
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Set bridge binary
|
|
|
|
BRIDGE = os.path.join(CARLA_LIBDIR, "carla-bridge-" + ARCH)
|
|
|
|
if ARCH in ("win32", "win64") or TESTING in ("win32", "win64"):
|
|
BRIDGE = BRIDGE + ".exe"
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Check for existing carla folder
|
|
|
|
if not os.path.exists(CARLA_LIBDIR):
|
|
print("Carla library folder does not exist, is Carla installed?")
|
|
sys.exit(2)
|
|
|
|
if not os.path.exists(CARLA_RESDIR):
|
|
print("Carla resource folder does not exist, is Carla installed?")
|
|
sys.exit(2)
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Check for existing arch binary
|
|
|
|
if not os.path.exists(BRIDGE):
|
|
print("Carla plugin bridge (%s) for the requested arch (%s) does not exist" % (os.path.basename(BRIDGE), ARCH,))
|
|
sys.exit(2)
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Final checks
|
|
|
|
if ARCH not in ("native", "posix32", "posix64", "win32", "win64"):
|
|
print("Invalid arch")
|
|
sys.exit(1)
|
|
|
|
if FORMAT not in ("internal", "ladspa", "dssi", "lv2", "vst2", "vst3", "au", "clap", "jsfx", "sf2", "sfz"):
|
|
print("Invalid format")
|
|
sys.exit(1)
|
|
|
|
if FILENAME and not os.path.exists(FILENAME):
|
|
print("Requested filename does not exist")
|
|
sys.exit(1)
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Setup environment
|
|
|
|
LADSPA_PATH = os.getenv("LADSPA_PATH")
|
|
DSSI_PATH = os.getenv("DSSI_PATH")
|
|
LV2_PATH = os.getenv("LV2_PATH")
|
|
VST2_PATH = os.getenv("VST_PATH")
|
|
VST3_PATH = os.getenv("VST3_PATH")
|
|
CLAP_PATH = os.getenv("CLAP_PATH")
|
|
SF2_PATH = os.getenv("SF2_PATH")
|
|
SFZ_PATH = os.getenv("SFZ_PATH")
|
|
|
|
if LADSPA_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_LADSPA"] = LADSPA_PATH
|
|
if DSSI_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_DSSI"] = DSSI_PATH
|
|
if LV2_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_LV2"] = LV2_PATH
|
|
if VST2_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_VST2"] = VST2_PATH
|
|
if VST3_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_VST3"] = VST3_PATH
|
|
if CLAP_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_CLAP"] = CLAP_PATH
|
|
if SF2_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_SF2"] = SF2_PATH
|
|
if SFZ_PATH is not None: os.environ["ENGINE_OPTION_PLUGIN_PATH_SFZ"] = SFZ_PATH
|
|
|
|
os.environ["ENGINE_OPTION_PATH_BINARIES"] = CARLA_LIBDIR
|
|
os.environ["ENGINE_OPTION_PATH_RESOURCES"] = CARLA_RESDIR
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
|
|
CARLA_CLIENT_NAME = os.getenv("CARLA_CLIENT_NAME")
|
|
LADISH_APP_NAME = os.getenv("LADISH_APP_NAME")
|
|
|
|
if CARLA_CLIENT_NAME is not None:
|
|
os.environ["CARLA_CLIENT_NAME"] = CARLA_CLIENT_NAME
|
|
elif LADISH_APP_NAME is not None:
|
|
os.environ["CARLA_CLIENT_NAME"] = LADISH_APP_NAME
|
|
else:
|
|
os.environ["CARLA_CLIENT_NAME"] = "(none)"
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|
|
# Exec
|
|
|
|
command = []
|
|
|
|
if os.getenv("CARLA_BRIDGE_PLUGIN_BINARY_TYPE") is not None:
|
|
BRIDGE = os.path.join(CARLA_LIBDIR, "carla-bridge-native")
|
|
elif ARCH == "win32" or TESTING == "win32":
|
|
command.append("wine")
|
|
elif ARCH == "win64" or TESTING == "win64":
|
|
command.append("wine64")
|
|
|
|
command.append(BRIDGE)
|
|
command.append(FORMAT)
|
|
command.append(FILENAME or "(none)")
|
|
command.append(LABEL or "(none)")
|
|
command.append(str(UNIQUEID))
|
|
|
|
print(command)
|
|
os.execvp(command[0], command)
|
|
|
|
# --------------------------------------------------------------------------------------------------------
|