diff --git a/Makefile b/Makefile
index 2f1bb07c6..c1d9af530 100644
--- a/Makefile
+++ b/Makefile
@@ -270,7 +270,6 @@ RES = \
bin/resources/carla_control.py \
bin/resources/carla_database.py \
bin/resources/carla_host.py \
- bin/resources/carla_panels.py \
bin/resources/carla_settings.py \
bin/resources/carla_skin.py \
bin/resources/carla_shared.py \
@@ -295,7 +294,6 @@ RES = \
bin/resources/ui_carla_database.py \
bin/resources/ui_carla_edit.py \
bin/resources/ui_carla_host.py \
- bin/resources/ui_carla_panel_time.py \
bin/resources/ui_carla_parameter.py \
bin/resources/ui_carla_plugin_calf.py \
bin/resources/ui_carla_plugin_classic.py \
@@ -340,7 +338,6 @@ UIs = \
source/ui_carla_database.py \
source/ui_carla_edit.py \
source/ui_carla_host.py \
- source/ui_carla_panel_time.py \
source/ui_carla_parameter.py \
source/ui_carla_plugin_calf.py \
source/ui_carla_plugin_classic.py \
@@ -640,7 +637,6 @@ endif
$(LINK) $(DATADIR)/carla/carla_database.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/carla_host.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/carla_modgui.py $(DESTDIR)$(DATADIR)/carla/resources
- $(LINK) $(DATADIR)/carla/carla_panels.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/carla_settings.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/carla_skin.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/carla_shared.py $(DESTDIR)$(DATADIR)/carla/resources
@@ -665,7 +661,6 @@ endif
$(LINK) $(DATADIR)/carla/ui_carla_database.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/ui_carla_edit.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/ui_carla_host.py $(DESTDIR)$(DATADIR)/carla/resources
- $(LINK) $(DATADIR)/carla/ui_carla_panel_time.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/ui_carla_parameter.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/ui_carla_plugin_calf.py $(DESTDIR)$(DATADIR)/carla/resources
$(LINK) $(DATADIR)/carla/ui_carla_plugin_classic.py $(DESTDIR)$(DATADIR)/carla/resources
diff --git a/resources/ui/carla_host.ui b/resources/ui/carla_host.ui
index 90548960b..d7e761771 100644
--- a/resources/ui/carla_host.ui
+++ b/resources/ui/carla_host.ui
@@ -6,8 +6,8 @@
0
0
- 870
- 681
+ 1058
+ 716
@@ -192,8 +192,8 @@
0
0
- 870
- 20
+ 1058
+ 37
+
+
+ Transport
+
+
+ -
+
+
+ Playback Controls
+
+
+
-
+
+
+
+
+
+
+ :/16x16/media-playback-start.png:/16x16/media-playback-start.png
+
+
+ true
+
+
+
+ -
+
+
+
+
+
+
+ :/16x16/media-playback-stop.png:/16x16/media-playback-stop.png
+
+
+
+ -
+
+
+
+
+
+
+ :/16x16/media-seek-backward.png:/16x16/media-seek-backward.png
+
+
+ true
+
+
+
+ -
+
+
+
+
+
+
+ :/16x16/media-seek-forward.png:/16x16/media-seek-forward.png
+
+
+ true
+
+
+
+
+
+
+ -
+
+
+ Time Information
+
+
+
-
+
+
-
+
+
+ Frame:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ DejaVu Sans Mono
+
+
+
+ 00000000
+
+
+
+
+
+ -
+
+
-
+
+
+ Time:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ DejaVu Sans Mono
+
+
+
+ 00:00:00
+
+
+
+
+
+ -
+
+
-
+
+
+ BBT:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ DejaVu Sans Mono
+
+
+
+ 000|0|000
+
+
+
+
+
+
+
+
+ -
+
+
+ Settings
+
+
+
-
+
+
+ false
+
+
+ BPM
+
+
+ 1
+
+
+ 20.000000000000000
+
+
+ 999.000000000000000
+
+
+
+ -
+
+
+ Use JACK Transport
+
+
+
+ -
+
+
+ Use Ableton Link
+
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
-
diff --git a/source/carla_host.py b/source/carla_host.py
index 1b172e8d1..d6f9cbf6a 100644
--- a/source/carla_host.py
+++ b/source/carla_host.py
@@ -41,7 +41,6 @@ import ui_carla_host
from carla_app import *
from carla_database import *
-from carla_panels import *
from carla_settings import *
from carla_utils import *
from carla_widgets import *
@@ -124,6 +123,11 @@ class HostWindow(QMainWindow):
self.fIsProjectLoading = False
self.fCurrentlyRemovingAllPlugins = False
+ self.fLastTransportBPM = 0.0
+ self.fLastTransportFrame = 0
+ self.fLastTransportState = False
+ self.fSampleRate = 0.0
+
# run a custom action after engine is properly closed
# 1 for close carla, 2 for load project
self.fCustomStopAction = 0
@@ -175,8 +179,6 @@ class HostWindow(QMainWindow):
self.ui.act_engine_start.setVisible(False)
self.ui.act_engine_stop.setEnabled(False)
self.ui.act_engine_stop.setVisible(False)
- self.ui.act_settings_show_time_panel.setEnabled(False)
- self.ui.act_settings_show_time_panel.setVisible(False)
self.ui.menu_Engine.setEnabled(False)
self.ui.menu_Engine.setVisible(False)
self.ui.menu_Engine.menuAction().setVisible(False)
@@ -268,11 +270,21 @@ class HostWindow(QMainWindow):
self.ui.fileTreeView.setHeaderHidden(True)
# ----------------------------------------------------------------------------------------------------
- # Set up GUI (panels)
+ # Set up GUI (transport)
+
+ self.ui.l_transport_bbt.setMinimumWidth(QFontMetrics(self.ui.l_transport_bbt.font()).width("000|00|0000") + 3)
+ self.ui.l_transport_frame.setMinimumWidth(QFontMetrics(self.ui.l_transport_frame.font()).width("000'000'000") + 3)
+ self.ui.l_transport_time.setMinimumWidth(QFontMetrics(self.ui.l_transport_time.font()).width("00:00:00") + 3)
- self.ui.panelTime = CarlaPanelTime(host, self)
- self.ui.panelTime.setEnabled(False)
- self.ui.panelTime.adjustSize()
+ if host.isPlugin:
+ self.ui.b_transport_play.setEnabled(False)
+ self.ui.b_transport_stop.setEnabled(False)
+ self.ui.b_transport_backwards.setEnabled(False)
+ self.ui.b_transport_forwards.setEnabled(False)
+ self.ui.cb_transport_link.setEnabled(False)
+ self.ui.dsb_transport_bpm.setEnabled(False)
+
+ self.ui.w_transport.setEnabled(False)
# ----------------------------------------------------------------------------------------------------
# Set up GUI (rack)
@@ -392,7 +404,6 @@ class HostWindow(QMainWindow):
self.ui.act_canvas_save_image.triggered.connect(self.slot_canvasSaveImage)
self.ui.act_canvas_arrange.setEnabled(False) # TODO, later
- self.ui.act_settings_show_time_panel.toggled.connect(self.slot_showTimePanel)
self.ui.act_settings_show_toolbar.toggled.connect(self.slot_showToolbar)
self.ui.act_settings_show_meters.toggled.connect(self.slot_showCanvasMeters)
self.ui.act_settings_show_keyboard.toggled.connect(self.slot_showCanvasKeyboard)
@@ -408,6 +419,13 @@ class HostWindow(QMainWindow):
self.ui.b_disk_remove.clicked.connect(self.slot_diskFolderRemove)
self.ui.fileTreeView.doubleClicked.connect(self.slot_fileTreeDoubleClicked)
+ self.ui.b_transport_play.clicked.connect(self.slot_transportPlayPause)
+ self.ui.b_transport_stop.clicked.connect(self.slot_transportStop)
+ self.ui.b_transport_backwards.clicked.connect(self.slot_transportBackwards)
+ self.ui.b_transport_forwards.clicked.connect(self.slot_transportForwards)
+ self.ui.cb_transport_jack.clicked.connect(self.slot_transportJackEnabled)
+ self.ui.cb_transport_link.clicked.connect(self.slot_transportLinkEnabled)
+
self.ui.listWidget.customContextMenuRequested.connect(self.showPluginActionsMenu)
self.ui.graphicsView.horizontalScrollBar().valueChanged.connect(self.slot_horizontalScrollBarChanged)
@@ -418,7 +436,6 @@ class HostWindow(QMainWindow):
self.ui.miniCanvasPreview.miniCanvasMoved.connect(self.slot_miniCanvasMoved)
- self.ui.panelTime.finished.connect(self.slot_timePanelClosed)
self.ui.tabWidget.currentChanged.connect(self.slot_tabChanged)
self.scene.scaleChanged.connect(self.slot_canvasScaleChanged)
@@ -430,6 +447,7 @@ class HostWindow(QMainWindow):
host.EngineStartedCallback.connect(self.slot_handleEngineStartedCallback)
host.EngineStoppedCallback.connect(self.slot_handleEngineStoppedCallback)
+ host.SampleRateChangedCallback.connect(self.slot_handleSampleRateChangedCallback)
host.PluginAddedCallback.connect(self.slot_handlePluginAddedCallback)
host.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback)
@@ -701,6 +719,8 @@ class HostWindow(QMainWindow):
@pyqtSlot(int, int, str)
def slot_handleEngineStartedCallback(self, processMode, transportMode, driverName):
+ self.fSampleRate = self.host.get_sample_rate()
+
self.ui.menu_PluginMacros.setEnabled(True)
self.ui.menu_Canvas.setEnabled(True)
@@ -726,12 +746,17 @@ class HostWindow(QMainWindow):
self.ui.act_file_save.setEnabled(canSave)
self.ui.act_engine_start.setEnabled(False)
self.ui.act_engine_stop.setEnabled(True)
- self.ui.panelTime.setEnabled(True)
+ self.ui.w_transport.setEnabled(True)
if self.host.isPlugin or not self.fSessionManagerName:
self.ui.act_file_open.setEnabled(True)
self.ui.act_file_save_as.setEnabled(True)
+ self.refreshTransport(True)
+
+ self.ui.cb_transport_jack.setChecked(transportMode == ENGINE_TRANSPORT_MODE_JACK)
+ self.ui.cb_transport_jack.setEnabled(driverName == "JACK")
+
self.startTimers()
@pyqtSlot()
@@ -749,12 +774,17 @@ class HostWindow(QMainWindow):
self.ui.act_file_save.setEnabled(False)
self.ui.act_engine_start.setEnabled(True)
self.ui.act_engine_stop.setEnabled(False)
- self.ui.panelTime.setEnabled(False)
+ self.ui.w_transport.setEnabled(False)
if self.host.isPlugin or not self.fSessionManagerName:
self.ui.act_file_open.setEnabled(False)
self.ui.act_file_save_as.setEnabled(False)
+ @pyqtSlot(float)
+ def slot_handleSampleRateChangedCallback(self, newSampleRate):
+ self.fSampleRate = newSampleRate
+ self.refreshTransport(True)
+
# --------------------------------------------------------------------------------------------------------
# Plugins
@@ -1308,13 +1338,9 @@ class HostWindow(QMainWindow):
settings = QSettings()
settings.setValue("Geometry", self.saveGeometry())
- settings.setValue("TimePanelGeometry", self.ui.panelTime.saveGeometry())
#settings.setValue("SplitterState", self.ui.splitter.saveState())
- if not (self.host.isControl or self.host.isPlugin):
- settings.setValue("ShowTimePanel", self.ui.panelTime.isVisible())
-
settings.setValue("ShowToolbar", self.ui.toolBar.isEnabled())
settings.setValue("ShowSidePanel", self.ui.dockWidget.isEnabled())
@@ -1337,17 +1363,6 @@ class HostWindow(QMainWindow):
if firstTime:
self.restoreGeometry(settings.value("Geometry", b""))
- if not (self.host.isControl or self.host.isPlugin):
- self.ui.panelTime.restoreGeometry(settings.value("TimePanelGeometry", b""))
-
- showTimePanel = settings.value("ShowTimePanel", True, type=bool)
- self.ui.act_settings_show_time_panel.setChecked(showTimePanel)
-
- if showTimePanel:
- QTimer.singleShot(0, self.ui.panelTime.show)
- else:
- self.ui.panelTime.hide()
-
showToolbar = settings.value("ShowToolbar", True, type=bool)
self.ui.act_settings_show_toolbar.setChecked(showToolbar)
self.ui.toolBar.setEnabled(showToolbar)
@@ -1422,10 +1437,6 @@ class HostWindow(QMainWindow):
# --------------------------------------------------------------------------------------------------------
# Settings (menu actions)
- @pyqtSlot(bool)
- def slot_showTimePanel(self, yesNo):
- self.ui.panelTime.setVisible(yesNo)
-
@pyqtSlot(bool)
def slot_showSidePanel(self, yesNo):
self.ui.dockWidget.setEnabled(yesNo)
@@ -1535,6 +1546,123 @@ class HostWindow(QMainWindow):
self.tr("Failed to load file"),
self.host.get_last_error(), QMessageBox.Ok, QMessageBox.Ok)
+ # --------------------------------------------------------------------------------------------------------
+ # Transport
+
+ def refreshTransport(self, forced = False):
+ if not self.isVisible():
+ return
+ if self.fSampleRate == 0.0 or not self.host.is_engine_running():
+ return
+
+ timeInfo = self.host.get_transport_info()
+ playing = timeInfo['playing']
+ frame = timeInfo['frame']
+ bpm = timeInfo['bpm']
+
+ if playing != self.fLastTransportState or forced:
+ if playing:
+ icon = getIcon("media-playback-pause")
+ self.ui.b_transport_play.setChecked(True)
+ self.ui.b_transport_play.setIcon(icon)
+ #self.ui.b_transport_play.setText(self.tr("&Pause"))
+ else:
+ icon = getIcon("media-playback-start")
+ self.ui.b_transport_play.setChecked(False)
+ self.ui.b_transport_play.setIcon(icon)
+ #self.ui.b_play.setText(self.tr("&Play"))
+
+ self.fLastTransportState = playing
+
+ if frame != self.fLastTransportFrame or forced:
+ self.fLastTransportFrame = frame
+
+ time = frame / self.fSampleRate
+ secs = time % 60
+ mins = (time / 60) % 60
+ hrs = (time / 3600) % 60
+ self.ui.l_transport_time.setText("%02i:%02i:%02i" % (hrs, mins, secs))
+
+ frame1 = frame % 1000
+ frame2 = (frame / 1000) % 1000
+ frame3 = (frame / 1000000) % 1000
+ self.ui.l_transport_frame.setText("%03i'%03i'%03i" % (frame3, frame2, frame1))
+
+ bar = timeInfo['bar']
+ beat = timeInfo['beat']
+ tick = timeInfo['tick']
+ self.ui.l_transport_bbt.setText("%03i|%02i|%04i" % (bar, beat, tick))
+
+ if bpm != self.fLastTransportBPM or forced:
+ self.fLastTransportBPM = bpm
+
+ if bpm > 0.0:
+ self.ui.dsb_transport_bpm.setValue(bpm)
+ self.ui.dsb_transport_bpm.setStyleSheet("")
+ else:
+ self.ui.dsb_transport_bpm.setStyleSheet("QDoubleSpinBox { color: palette(mid); }")
+
+ # --------------------------------------------------------------------------------------------------------
+ # Transport (menu actions)
+
+ @pyqtSlot(bool)
+ def slot_transportPlayPause(self, toggled):
+ if self.host.isPlugin or not self.host.is_engine_running():
+ return
+
+ if toggled:
+ self.host.transport_play()
+ else:
+ self.host.transport_pause()
+
+ self.refreshTransport()
+
+ @pyqtSlot()
+ def slot_transportStop(self):
+ if self.host.isPlugin or not self.host.is_engine_running():
+ return
+
+ self.host.transport_pause()
+ self.host.transport_relocate(0)
+
+ self.refreshTransport()
+
+ @pyqtSlot()
+ def slot_transportBackwards(self):
+ if self.host.isPlugin or not self.host.is_engine_running():
+ return
+
+ newFrame = self.host.get_current_transport_frame() - 100000
+
+ if newFrame < 0:
+ newFrame = 0
+
+ self.host.transport_relocate(newFrame)
+
+ @pyqtSlot()
+ def slot_transportForwards(self):
+ if self.fSampleRate == 0.0 or self.host.isPlugin or not self.host.is_engine_running():
+ return
+
+ newFrame = self.host.get_current_transport_frame() + int(self.fSampleRate*2.5)
+ self.host.transport_relocate(newFrame)
+
+ @pyqtSlot(bool)
+ def slot_transportJackEnabled(self, clicked):
+ if not self.host.is_engine_running():
+ return
+ mode = ENGINE_TRANSPORT_MODE_JACK if clicked else ENGINE_TRANSPORT_MODE_INTERNAL
+ extra = ":link:" if self.ui.cb_transport_link.isChecked() else ""
+ self.host.set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, mode, extra)
+
+ @pyqtSlot(bool)
+ def slot_transportLinkEnabled(self, clicked):
+ if not self.host.is_engine_running():
+ return
+ mode = ENGINE_TRANSPORT_MODE_JACK if self.ui.cb_transport_jack.isChecked() else ENGINE_TRANSPORT_MODE_INTERNAL
+ extra = ":link:" if clicked else ""
+ self.host.set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, mode, extra)
+
# --------------------------------------------------------------------------------------------------------
# Canvas scrollbars
@@ -1684,10 +1812,6 @@ class HostWindow(QMainWindow):
# --------------------------------------------------------------------------------------------------------
# Misc
- @pyqtSlot()
- def slot_timePanelClosed(self):
- self.ui.act_settings_show_time_panel.setChecked(False)
-
@pyqtSlot(int)
def slot_tabChanged(self, index):
if index != 1:
@@ -1873,6 +1997,7 @@ class HostWindow(QMainWindow):
# show/hide event
def showEvent(self, event):
+ self.refreshTransport(True)
QMainWindow.showEvent(self, event)
# set our gui as parent for all plugins UIs
@@ -1908,7 +2033,7 @@ class HostWindow(QMainWindow):
def idleFast(self):
self.host.engine_idle()
- self.ui.panelTime.refreshTransport()
+ self.refreshTransport()
if self.fPluginCount == 0 or self.fCurrentlyRemovingAllPlugins:
return
diff --git a/source/carla_panels.py b/source/carla_panels.py
deleted file mode 100644
index 8383d276f..000000000
--- a/source/carla_panels.py
+++ /dev/null
@@ -1,227 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-
-# Carla host code
-# Copyright (C) 2011-2017 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 doc/GPL.txt file.
-
-# ------------------------------------------------------------------------------------------------------------
-# Imports (Config)
-
-from carla_config import *
-
-# ------------------------------------------------------------------------------------------------------------
-# Imports (Global)
-
-if config_UseQt5:
- from PyQt5.QtCore import pyqtSlot
- from PyQt5.QtGui import QFontMetrics
- from PyQt5.QtWidgets import QDialog
-else:
- from PyQt4.QtCore import pyqtSlot
- from PyQt4.QtGui import QDialog, QFontMetrics
-
-# ------------------------------------------------------------------------------------------------------------
-# Imports (Custom)
-
-from carla_shared import *
-
-import ui_carla_panel_time
-
-# ------------------------------------------------------------------------------------------------------------
-# Time Panel
-
-class CarlaPanelTime(QDialog):
- def __init__(self, host, parent):
- QDialog.__init__(self, parent)
- self.host = host
- self.ui = ui_carla_panel_time.Ui_Dialog()
- self.ui.setupUi(self)
-
- if False:
- # kdevelop likes this :)
- host = CarlaHostNull()
- self.host = host
-
- # ----------------------------------------------------------------------------------------------------
- # Internal stuff
-
- self.fLastTransportBPM = 0.0
- self.fLastTransportFrame = 0
- self.fLastTransportState = False
- self.fSampleRate = 0.0
-
- self.ui.l_time_frame.setMinimumWidth(QFontMetrics(self.ui.l_time_frame.font()).width("000'000'000") + 3)
- self.ui.l_time_clock.setMinimumWidth(QFontMetrics(self.ui.l_time_clock.font()).width("00:00:00") + 3)
- self.ui.l_time_bbt.setMinimumWidth(QFontMetrics(self.ui.l_time_bbt.font()).width("000|00|0000") + 3)
-
- # ----------------------------------------------------------------------------------------------------
- # Disable buttons if plugin
-
- if host.isPlugin:
- self.ui.b_play.setEnabled(False)
- self.ui.b_stop.setEnabled(False)
- self.ui.b_backwards.setEnabled(False)
- self.ui.b_forwards.setEnabled(False)
- self.ui.cb_transport_link.setEnabled(False)
- self.ui.dsb_bpm.setEnabled(False)
-
- # ----------------------------------------------------------------------------------------------------
- # Connect actions to functions
-
- self.ui.b_play.clicked.connect(self.slot_transportPlayPause)
- self.ui.b_stop.clicked.connect(self.slot_transportStop)
- self.ui.b_backwards.clicked.connect(self.slot_transportBackwards)
- self.ui.b_forwards.clicked.connect(self.slot_transportForwards)
- self.ui.cb_transport_jack.clicked.connect(self.slot_transportJackEnabled)
- self.ui.cb_transport_link.clicked.connect(self.slot_transportLinkEnabled)
-
- host.EngineStartedCallback.connect(self.slot_handleEngineStartedCallback)
- host.SampleRateChangedCallback.connect(self.slot_handleSampleRateChangedCallback)
-
- # --------------------------------------------------------------------------------------------------------
- # Button actions
-
- @pyqtSlot(bool)
- def slot_transportPlayPause(self, toggled):
- if self.host.isPlugin or not self.host.is_engine_running():
- return
-
- if toggled:
- self.host.transport_play()
- else:
- self.host.transport_pause()
-
- self.refreshTransport()
-
- @pyqtSlot()
- def slot_transportStop(self):
- if self.host.isPlugin or not self.host.is_engine_running():
- return
-
- self.host.transport_pause()
- self.host.transport_relocate(0)
-
- self.refreshTransport()
-
- @pyqtSlot()
- def slot_transportBackwards(self):
- if self.host.isPlugin or not self.host.is_engine_running():
- return
-
- newFrame = self.host.get_current_transport_frame() - 100000
-
- if newFrame < 0:
- newFrame = 0
-
- self.host.transport_relocate(newFrame)
-
- @pyqtSlot()
- def slot_transportForwards(self):
- if self.fSampleRate == 0.0 or self.host.isPlugin or not self.host.is_engine_running():
- return
-
- newFrame = self.host.get_current_transport_frame() + int(self.fSampleRate*2.5)
- self.host.transport_relocate(newFrame)
-
- @pyqtSlot(bool)
- def slot_transportJackEnabled(self, clicked):
- if not self.host.is_engine_running():
- return
- mode = ENGINE_TRANSPORT_MODE_JACK if clicked else ENGINE_TRANSPORT_MODE_INTERNAL
- extra = ":link:" if self.ui.cb_transport_link.isChecked() else ""
- self.host.set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, mode, extra)
-
- @pyqtSlot(bool)
- def slot_transportLinkEnabled(self, clicked):
- if not self.host.is_engine_running():
- return
- mode = ENGINE_TRANSPORT_MODE_JACK if self.ui.cb_transport_jack.isChecked() else ENGINE_TRANSPORT_MODE_INTERNAL
- extra = ":link:" if clicked else ""
- self.host.set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, mode, extra)
-
- def showEvent(self, event):
- self.refreshTransport(True)
- QDialog.showEvent(self, event)
-
- def refreshTransport(self, forced = False):
- if not self.isVisible():
- return
- if self.fSampleRate == 0.0 or not self.host.is_engine_running():
- return
-
- timeInfo = self.host.get_transport_info()
- playing = timeInfo['playing']
- frame = timeInfo['frame']
- bpm = timeInfo['bpm']
-
- if playing != self.fLastTransportState or forced:
- if playing:
- icon = getIcon("media-playback-pause")
- self.ui.b_play.setChecked(True)
- self.ui.b_play.setIcon(icon)
- #self.ui.b_play.setText(self.tr("&Pause"))
- else:
- icon = getIcon("media-playback-start")
- self.ui.b_play.setChecked(False)
- self.ui.b_play.setIcon(icon)
- #self.ui.b_play.setText(self.tr("&Play"))
-
- self.fLastTransportState = playing
-
- if frame != self.fLastTransportFrame or forced:
- self.fLastTransportFrame = frame
-
- time = frame / self.fSampleRate
- secs = time % 60
- mins = (time / 60) % 60
- hrs = (time / 3600) % 60
- self.ui.l_time_clock.setText("%02i:%02i:%02i" % (hrs, mins, secs))
-
- frame1 = frame % 1000
- frame2 = (frame / 1000) % 1000
- frame3 = (frame / 1000000) % 1000
- self.ui.l_time_frame.setText("%03i'%03i'%03i" % (frame3, frame2, frame1))
-
- bar = timeInfo['bar']
- beat = timeInfo['beat']
- tick = timeInfo['tick']
- self.ui.l_time_bbt.setText("%03i|%02i|%04i" % (bar, beat, tick))
-
- if bpm != self.fLastTransportBPM or forced:
- self.fLastTransportBPM = bpm
-
- if bpm > 0.0:
- self.ui.dsb_bpm.setValue(bpm)
- self.ui.dsb_bpm.setStyleSheet("")
- else:
- self.ui.dsb_bpm.setStyleSheet("QDoubleSpinBox { color: palette(mid); }")
-
- # --------------------------------------------------------------------------------------------------------
- # Engine callbacks
-
- @pyqtSlot(int, int, str)
- def slot_handleEngineStartedCallback(self, processMode, transportMode, driverName):
- self.fSampleRate = self.host.get_sample_rate()
- self.refreshTransport(True)
-
- self.ui.cb_transport_jack.setEnabled(driverName == "JACK")
- self.ui.cb_transport_jack.setChecked(transportMode == ENGINE_TRANSPORT_MODE_JACK)
-
- @pyqtSlot(float)
- def slot_handleSampleRateChangedCallback(self, newSampleRate):
- self.fSampleRate = newSampleRate
- self.refreshTransport(True)
-
-# ------------------------------------------------------------------------------------------------------------