|
|
@@ -0,0 +1,252 @@ |
|
|
|
#!/usr/bin/env python3 |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
|
|
|
|
# Carla plugin host |
|
|
|
# Copyright (C) 2011-2013 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 GPL.txt file |
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------------------------------------ |
|
|
|
# Imports (Global) |
|
|
|
|
|
|
|
try: |
|
|
|
from PyQt5.QtWidgets import QLabel, QTabWidget |
|
|
|
except: |
|
|
|
from PyQt4.QtGui import QLabel, QTabWidget |
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------------------------------------ |
|
|
|
# Imports (Custom Stuff) |
|
|
|
|
|
|
|
from carla_host import * |
|
|
|
from carla_patchbay import CarlaPatchbayW |
|
|
|
from carla_rack import CarlaRackW |
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------------------------------------ |
|
|
|
# Tab widget (rack + patchbay) |
|
|
|
|
|
|
|
class CarlaMultiW(QTabWidget): |
|
|
|
def __init__(self, parent): |
|
|
|
QTabWidget.__init__(self, parent) |
|
|
|
|
|
|
|
self.fRack = CarlaRackW(parent) |
|
|
|
self.fPatchbay = CarlaPatchbayW(parent) |
|
|
|
self.fParent = parent |
|
|
|
|
|
|
|
self.addTab(self.fRack, "Plugins") |
|
|
|
self.addTab(self.fPatchbay, "Patchbay") |
|
|
|
|
|
|
|
self.scene = self.fPatchbay.scene |
|
|
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
|
|
def getPluginCount(self): |
|
|
|
return self.fRack.getPluginCount() |
|
|
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
|
|
def addPlugin(self, pluginId, isProjectLoading): |
|
|
|
self.fRack.addPlugin(pluginId, isProjectLoading) |
|
|
|
self.fPatchbay.addPlugin(pluginId, isProjectLoading) |
|
|
|
|
|
|
|
def removePlugin(self, pluginId): |
|
|
|
self.fRack.removePlugin(pluginId) |
|
|
|
self.fPatchbay.removePlugin(pluginId) |
|
|
|
|
|
|
|
def renamePlugin(self, pluginId, newName): |
|
|
|
self.fRack.renamePlugin(pluginId, newName) |
|
|
|
self.fPatchbay.renamePlugin(pluginId, newName) |
|
|
|
|
|
|
|
def removeAllPlugins(self): |
|
|
|
self.fRack.removeAllPlugins() |
|
|
|
self.fPatchbay.removeAllPlugins() |
|
|
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
|
|
def engineStarted(self): |
|
|
|
self.fRack.engineStarted() |
|
|
|
self.fPatchbay.engineStarted() |
|
|
|
self.fParent.engineChanged() |
|
|
|
|
|
|
|
def engineStopped(self): |
|
|
|
self.fRack.engineStopped() |
|
|
|
self.fPatchbay.engineStopped() |
|
|
|
self.fParent.engineStopped() |
|
|
|
|
|
|
|
def engineChanged(self): |
|
|
|
self.fParent.engineChanged() |
|
|
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
|
|
def idleFast(self): |
|
|
|
self.fRack.idleFast() |
|
|
|
self.fPatchbay.idleFast() |
|
|
|
|
|
|
|
def idleSlow(self): |
|
|
|
self.fRack.idleSlow() |
|
|
|
self.fPatchbay.idleSlow() |
|
|
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
|
|
def saveSettings(self, settings): |
|
|
|
self.fRack.saveSettings(settings) |
|
|
|
self.fPatchbay.saveSettings(settings) |
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------------------------------------ |
|
|
|
# Main Window |
|
|
|
|
|
|
|
class CarlaHostW(HostWindow): |
|
|
|
def __init__(self, parent=None): |
|
|
|
HostWindow.__init__(self, parent) |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
# Set-up container |
|
|
|
|
|
|
|
self.fContainer = CarlaMultiW(self) |
|
|
|
self.setupContainer(True) |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
# Set-up GUI stuff |
|
|
|
|
|
|
|
self.fInfoText = "" |
|
|
|
self.fInfoLabel = QLabel(self) |
|
|
|
self.fInfoLabel.setText("Engine stopped") |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
|
|
|
|
self.ui.act_settings_show_toolbar.triggered.connect(self.slot_toolbarShown) |
|
|
|
self.ui.splitter.splitterMoved.connect(self.slot_splitterMoved) |
|
|
|
|
|
|
|
QTimer.singleShot(0, self.slot_infoLabelInit) |
|
|
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
|
|
def engineStopped(self): |
|
|
|
self.fInfoText = "" |
|
|
|
self.fInfoLabel.setText("Engine stopped") |
|
|
|
|
|
|
|
def engineChanged(self): |
|
|
|
self.fInfoText = "Engine running | SampleRate: %g | BufferSize: %i" % (self.fSampleRate, self.fBufferSize) |
|
|
|
self.fInfoLabel.setText("%s | %s" % (self.fInfoText, self.fTextTransport)) |
|
|
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
|
|
def updateInfoLabelPos(self): |
|
|
|
tabBar = self.fContainer.tabBar() |
|
|
|
y = tabBar.mapFromParent(self.ui.centralwidget.pos()).y() #+tabBar.height()/4 |
|
|
|
|
|
|
|
if not self.ui.toolBar.isVisible(): |
|
|
|
y -= self.ui.toolBar.height() |
|
|
|
|
|
|
|
self.fInfoLabel.move(self.fInfoLabel.x(), y) |
|
|
|
|
|
|
|
def updateInfoLabelSize(self): |
|
|
|
tabBar = self.fContainer.tabBar() |
|
|
|
self.fInfoLabel.resize(self.fContainer.width()-tabBar.width()-20, self.fInfoLabel.height()) |
|
|
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
|
|
@pyqtSlot() |
|
|
|
def slot_splitterMoved(self): |
|
|
|
self.updateInfoLabelSize() |
|
|
|
|
|
|
|
@pyqtSlot() |
|
|
|
def slot_toolbarShown(self): |
|
|
|
self.updateInfoLabelPos() |
|
|
|
|
|
|
|
@pyqtSlot() |
|
|
|
def slot_infoLabelInit(self): |
|
|
|
tabBar = self.fContainer.tabBar() |
|
|
|
x = tabBar.width()+20 |
|
|
|
y = tabBar.mapFromParent(self.ui.centralwidget.pos()).y() #+ tabBar.height()/4 |
|
|
|
self.fInfoLabel.move(x, y) |
|
|
|
self.fInfoLabel.resize(self.fContainer.width()-x, tabBar.height()) |
|
|
|
|
|
|
|
# ----------------------------------------------------------------- |
|
|
|
|
|
|
|
def resizeEvent(self, event): |
|
|
|
self.updateInfoLabelSize() |
|
|
|
HostWindow.resizeEvent(self, event) |
|
|
|
|
|
|
|
def timerEvent(self, event): |
|
|
|
HostWindow.timerEvent(self, event) |
|
|
|
|
|
|
|
if event.timerId() == self.fIdleTimerFast: |
|
|
|
self.fInfoLabel.setText("%s | %s" % (self.fInfoText, self.fTextTransport)) |
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------------------------------------ |
|
|
|
# Main |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
# ------------------------------------------------------------- |
|
|
|
# App initialization |
|
|
|
|
|
|
|
app = CarlaApplication() |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
# Set-up custom signal handling |
|
|
|
|
|
|
|
setUpSignals() |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
# Read CLI args |
|
|
|
|
|
|
|
appName = os.path.basename(__file__) if ("__file__" in dir() and os.path.dirname(__file__) in PATH) else sys.argv[0] |
|
|
|
libPrefix = None |
|
|
|
projectFilename = None |
|
|
|
|
|
|
|
argv = app.arguments() |
|
|
|
argc = len(argv) |
|
|
|
|
|
|
|
for i in range(argc): |
|
|
|
if i == 0: continue |
|
|
|
argument = argv[i] |
|
|
|
|
|
|
|
if argument.startswith("--with-appname="): |
|
|
|
appName = os.path.basename(argument.replace("--with-appname=", "")) |
|
|
|
|
|
|
|
elif argument.startswith("--with-libprefix="): |
|
|
|
libPrefix = argument.replace("--with-libprefix=", "") |
|
|
|
|
|
|
|
elif os.path.exists(argument): |
|
|
|
projectFilename = argument |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
# Init host backend |
|
|
|
|
|
|
|
Carla.isControl = False |
|
|
|
Carla.isLocal = True |
|
|
|
Carla.isPlugin = False |
|
|
|
Carla.processMode = PROCESS_MODE_CONTINUOUS_RACK |
|
|
|
|
|
|
|
initHost(appName, libPrefix) |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
# Create GUI |
|
|
|
|
|
|
|
Carla.gui = CarlaHostW() |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
# Load project file if set |
|
|
|
|
|
|
|
if projectFilename is not None: |
|
|
|
Carla.gui.loadProjectLater(projectFilename) |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
# Show GUI |
|
|
|
|
|
|
|
Carla.gui.show() |
|
|
|
|
|
|
|
# ------------------------------------------------------------- |
|
|
|
# App-Loop |
|
|
|
|
|
|
|
sys.exit(app.exec_()) |