diff --git a/resources/ui/carla_settings.ui b/resources/ui/carla_settings.ui
index 64d997993..dc2fbd05e 100644
--- a/resources/ui/carla_settings.ui
+++ b/resources/ui/carla_settings.ui
@@ -180,7 +180,7 @@
0
- 1
+ 0
diff --git a/source/carla b/source/carla
new file mode 100755
index 000000000..c7dadedbc
--- /dev/null
+++ b/source/carla
@@ -0,0 +1,252 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+# Carla plugin host
+# Copyright (C) 2011-2013 Filipe Coelho
+#
+# 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_())
diff --git a/source/carla.py b/source/carla.py
index 4fa357cac..dee108dfd 100755
--- a/source/carla.py
+++ b/source/carla.py
@@ -75,10 +75,6 @@ class CarlaMainW(QMainWindow):
# -------------------------------------------------------------
# Set-up GUI stuff
- self.fInfoLabel = QLabel(self)
- self.fInfoLabel.setText("")
- self.fInfoText = ""
-
if not WINDOWS:
self.fSyntaxLog = LogSyntaxHighlighter(self.ui.pte_log)
self.fSyntaxLog.setDocument(self.ui.pte_log.document())
@@ -105,19 +101,6 @@ class CarlaMainW(QMainWindow):
self.ui.miniCanvasPreview.init(self.scene, DEFAULT_CANVAS_WIDTH, DEFAULT_CANVAS_HEIGHT, self.fSavedSettings["UseCustomMiniCanvasPaint"])
QTimer.singleShot(100, self, SLOT("slot_miniCanvasInit()"))
- def updateInfoLabelPos(self):
- tabBar = self.ui.tabMain.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.ui.tabMain.tabBar()
- self.fInfoLabel.resize(self.ui.tabMain.width()-tabBar.width()-20, self.fInfoLabel.height())
-
@pyqtSlot()
def slot_fileExportLv2Preset(self):
fileFilter = self.tr("LV2 Preset (*.lv2)")
@@ -170,14 +153,6 @@ class CarlaMainW(QMainWindow):
""" % (manifestPath, os.path.basename(filenameTry), presetContents))
manifestFd.close()
- @pyqtSlot()
- def slot_toolbarShown(self):
- self.updateInfoLabelPos()
-
- @pyqtSlot()
- def slot_splitterMoved(self):
- self.updateInfoLabelSize()
-
@pyqtSlot(float, float)
def slot_miniCanvasMoved(self, xp, yp):
self.ui.graphicsView.horizontalScrollBar().setValue(xp * DEFAULT_CANVAS_WIDTH)
@@ -215,12 +190,6 @@ class CarlaMainW(QMainWindow):
self.ui.graphicsView.horizontalScrollBar().setValue(settings.value("HorizontalScrollBarValue", DEFAULT_CANVAS_WIDTH / 3, type=int))
self.ui.graphicsView.verticalScrollBar().setValue(settings.value("VerticalScrollBarValue", DEFAULT_CANVAS_HEIGHT * 3 / 8, type=int))
- tabBar = self.ui.tabMain.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.ui.tabMain.width()-x, tabBar.height())
-
@pyqtSlot()
def slot_miniCanvasCheckAll(self):
self.slot_miniCanvasCheckSize()
@@ -301,6 +270,4 @@ class CarlaMainW(QMainWindow):
else:
QTimer.singleShot(0, self, SLOT("slot_miniCanvasCheckSize()"))
- self.updateInfoLabelSize()
-
QMainWindow.resizeEvent(self, event)
diff --git a/source/carla_host.py b/source/carla_host.py
index e6ce7e892..1a13db400 100644
--- a/source/carla_host.py
+++ b/source/carla_host.py
@@ -83,6 +83,9 @@ class CarlaDummyW(object):
def engineStopped(self):
pass
+ def engineChanged(self):
+ pass
+
# -----------------------------------------------------------------
def idleFast(self):
@@ -172,6 +175,7 @@ class HostWindow(QMainWindow):
self.fLastTransportFrame = 0
self.fLastTransportState = False
+ self.fTextTransport = ""
self.fSavedSettings = {}
@@ -251,8 +255,6 @@ class HostWindow(QMainWindow):
self.ui.act_help_about.triggered.connect(self.slot_aboutCarla)
self.ui.act_help_about_qt.triggered.connect(self.slot_aboutQt)
- #self.ui.splitter.splitterMoved.connect(self.slot_splitterMoved)
-
self.ui.cb_disk.currentIndexChanged.connect(self.slot_diskFolderChanged)
self.ui.b_disk_add.clicked.connect(self.slot_diskFolderAdd)
self.ui.b_disk_remove.clicked.connect(self.slot_diskFolderRemove)
@@ -520,9 +522,7 @@ class HostWindow(QMainWindow):
mins = (time / 60) % 60
hrs = (time / 3600) % 60
- #textTransport = "Transport %s, at %02i:%02i:%02i" % ("playing" if playing else "stopped", hrs, mins, secs)
- #self.fInfoLabel.setText("%s | %s" % (self.fInfoText, textTransport))
-
+ self.fTextTransport = "Transport %s, at %02i:%02i:%02i" % ("playing" if playing else "stopped", hrs, mins, secs)
self.fLastTransportFrame = frame
def setTransportMenuEnabled(self, enabled):
@@ -738,12 +738,11 @@ class HostWindow(QMainWindow):
self.setTransportMenuEnabled(check)
if check:
- #self.fInfoText = "Engine running | SampleRate: %g | BufferSize: %i" % (self.fSampleRate, self.fBufferSize)
- self.fContainer.engineStarted()
-
if not Carla.isPlugin:
self.refreshTransport(True)
+ self.fContainer.engineStarted()
+
@pyqtSlot()
def slot_engineStop(self, doStop = True):
if doStop: self.stopEngine()
@@ -764,9 +763,8 @@ class HostWindow(QMainWindow):
self.setTransportMenuEnabled(check)
if not check:
+ self.fTextTransport = ""
self.fContainer.engineStopped()
- #self.fInfoText = ""
- #self.fInfoLabel.setText("Engine stopped")
# -----------------------------------------------------------------
@@ -927,12 +925,12 @@ class HostWindow(QMainWindow):
@pyqtSlot(int)
def slot_handleBufferSizeChangedCallback(self, newBufferSize):
self.fBufferSize = newBufferSize
- #self.fInfoText = "Engine running | SampleRate: %g | BufferSize: %i" % (self.fSampleRate, self.fBufferSize)
+ self.fContainer.engineChanged()
@pyqtSlot(float)
def slot_handleSampleRateChangedCallback(self, newSampleRate):
self.fSampleRate = newSampleRate
- #self.fInfoText = "Engine running | SampleRate: %g | BufferSize: %i" % (self.fSampleRate, self.fBufferSize)
+ self.fContainer.engineChanged()
# -----------------------------------------------------------------
diff --git a/source/carla_patchbay.py b/source/carla_patchbay.py
index 9f747902f..4e7193202 100644
--- a/source/carla_patchbay.py
+++ b/source/carla_patchbay.py
@@ -218,6 +218,9 @@ class CarlaPatchbayW(QGraphicsView):
def engineStopped(self):
patchcanvas.clear()
+ def engineChanged(self):
+ pass
+
# -----------------------------------------------------------------
def idleFast(self):
diff --git a/source/carla_rack.py b/source/carla_rack.py
index d278c662a..4e03ce6e4 100644
--- a/source/carla_rack.py
+++ b/source/carla_rack.py
@@ -198,6 +198,9 @@ class CarlaRackW(QListWidget):
def engineStopped(self):
pass
+ def engineChanged(self):
+ pass
+
# -----------------------------------------------------------------
def idleFast(self):