From 9abaee2a2d7fdb5c9787303c20e69e0604f45e64 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 29 Mar 2013 13:01:53 +0000 Subject: [PATCH] Add first steps of transport control --- resources/ui/carla.ui | 214 +++++------------- source/backend/CarlaStandalone.hpp | 1 + source/backend/standalone/CarlaStandalone.cpp | 19 +- source/carla.py | 103 +++++---- source/carla_backend.py | 6 + 5 files changed, 148 insertions(+), 195 deletions(-) diff --git a/resources/ui/carla.ui b/resources/ui/carla.ui index b1bf26d7b..5ed942368 100644 --- a/resources/ui/carla.ui +++ b/resources/ui/carla.ui @@ -15,139 +15,6 @@ - - - - - 0 - - - 0 - - - 0 - - - - - Transport Mode: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - Qt::Vertical - - - - - - - - 22 - 22 - - - - - - - - :/16x16/media-playback-start.png:/16x16/media-playback-start.png - - - true - - - - - - - - 22 - 22 - - - - - - - - :/16x16/media-playback-stop.png:/16x16/media-playback-stop.png - - - - - - - - 22 - 22 - - - - - - - - :/16x16/media-seek-backward.png:/16x16/media-seek-backward.png - - - - - - - - 22 - 22 - - - - - - - - :/16x16/media-seek-forward.png:/16x16/media-seek-forward.png - - - - - - - Qt::Vertical - - - - - - - TIME (TODO) - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - @@ -336,7 +203,6 @@ &Settings - @@ -361,9 +227,19 @@ + + + &Transport + + + + + + + @@ -467,9 +343,6 @@ &Remove All - - Ctrl+Shift+R - @@ -649,6 +522,57 @@ Ctrl+1 + + + true + + + + :/16x16/media-playback-start.png:/16x16/media-playback-start.png + + + &Play + + + Ctrl+Shift+P + + + + + + :/16x16/media-playback-stop.png:/16x16/media-playback-stop.png + + + &Stop + + + Ctrl+Shift+X + + + + + + :/16x16/media-seek-backward.png:/16x16/media-seek-backward.png + + + &Backwards + + + Ctrl+Shift+B + + + + + + :/16x16/media-seek-forward.png:/16x16/media-seek-forward.png + + + &Forwards + + + Ctrl+Shift+F + + @@ -694,21 +618,5 @@ - - act_settings_show_transport - triggered(bool) - frame_transport - setVisible(bool) - - - -1 - -1 - - - 377 - 65 - - - diff --git a/source/backend/CarlaStandalone.hpp b/source/backend/CarlaStandalone.hpp index dd62b01fc..e99167721 100644 --- a/source/backend/CarlaStandalone.hpp +++ b/source/backend/CarlaStandalone.hpp @@ -178,6 +178,7 @@ CARLA_EXPORT void carla_patchbay_refresh(); CARLA_EXPORT void carla_transport_play(); CARLA_EXPORT void carla_transport_pause(); CARLA_EXPORT void carla_transport_relocate(uint32_t frames); +CARLA_EXPORT uint64_t carla_get_current_transport_frame(); CARLA_EXPORT bool carla_add_plugin(CarlaBinaryType btype, CarlaPluginType ptype, const char* filename, const char* name, const char* label, const void* extraPtr); CARLA_EXPORT bool carla_remove_plugin(unsigned int pluginId); diff --git a/source/backend/standalone/CarlaStandalone.cpp b/source/backend/standalone/CarlaStandalone.cpp index a769c439c..a72388879 100644 --- a/source/backend/standalone/CarlaStandalone.cpp +++ b/source/backend/standalone/CarlaStandalone.cpp @@ -572,7 +572,7 @@ void carla_transport_play() CARLA_ASSERT(standalone.engine != nullptr); if (standalone.engine != nullptr) - return standalone.engine->transportPlay(); + standalone.engine->transportPlay(); } void carla_transport_pause() @@ -581,7 +581,7 @@ void carla_transport_pause() CARLA_ASSERT(standalone.engine != nullptr); if (standalone.engine != nullptr) - return standalone.engine->transportPause(); + standalone.engine->transportPause(); } void carla_transport_relocate(uint32_t frames) @@ -590,7 +590,20 @@ void carla_transport_relocate(uint32_t frames) CARLA_ASSERT(standalone.engine != nullptr); if (standalone.engine != nullptr) - return standalone.engine->transportRelocate(frames); + standalone.engine->transportRelocate(frames); +} + +uint64_t carla_get_current_transport_frame() +{ + CARLA_ASSERT(standalone.engine != nullptr); + + if (standalone.engine != nullptr) + { + const CarlaBackend::EngineTimeInfo& timeInfo(standalone.engine->getTimeInfo()); + return timeInfo.frame; + } + + return 0; } // ------------------------------------------------------------------------------------------------------------------- diff --git a/source/carla.py b/source/carla.py index ebf9a9bab..ff23f67a9 100755 --- a/source/carla.py +++ b/source/carla.py @@ -566,6 +566,7 @@ class CarlaMainW(QMainWindow): self.fInfoLabel = QLabel(self) self.fInfoLabel.setText("") + self.fInfoText = "" self.fDirModel = QFileSystemModel(self) self.fDirModel.setNameFilters(cString(Carla.host.get_supported_file_types()).split(";")) @@ -659,9 +660,10 @@ class CarlaMainW(QMainWindow): self.connect(self.ui.act_help_about, SIGNAL("triggered()"), SLOT("slot_aboutCarla()")) self.connect(self.ui.act_help_about_qt, SIGNAL("triggered()"), app, SLOT("aboutQt()")) - self.connect(self.ui.ch_transport, SIGNAL("currentIndexChanged(int)"), SLOT("slot_transportModeChanged(int)")) - self.connect(self.ui.b_transport_play, SIGNAL("clicked(bool)"), SLOT("slot_transportPlayPause(bool)")) - self.connect(self.ui.b_transport_stop, SIGNAL("clicked()"), SLOT("slot_transportStop()")) + self.connect(self.ui.act_transport_play, SIGNAL("triggered(bool)"), SLOT("slot_transportPlayPause(bool)")) + self.connect(self.ui.act_transport_stop, SIGNAL("triggered()"), SLOT("slot_transportStop()")) + self.connect(self.ui.act_transport_backwards, SIGNAL("triggered()"), SLOT("slot_transportBackwards()")) + self.connect(self.ui.act_transport_forwards, SIGNAL("triggered()"), SLOT("slot_transportForwards()")) self.connect(self.ui.graphicsView.horizontalScrollBar(), SIGNAL("valueChanged(int)"), SLOT("slot_horizontalScrollBarChanged(int)")) self.connect(self.ui.graphicsView.verticalScrollBar(), SIGNAL("valueChanged(int)"), SLOT("slot_verticalScrollBarChanged(int)")) @@ -969,23 +971,15 @@ class CarlaMainW(QMainWindow): else: maxCount = MAX_DEFAULT_PLUGINS - self.ui.ch_transport.blockSignals(True) - self.ui.ch_transport.addItem(self.tr("Internal")) - - if audioDriver == "JACK": - self.ui.ch_transport.addItem(self.tr("JACK")) - elif transportMode == TRANSPORT_MODE_JACK: + if transportMode == TRANSPORT_MODE_JACK and audioDriver != "JACK": transportMode = TRANSPORT_MODE_INTERNAL - self.ui.ch_transport.setCurrentIndex(transportMode) - self.ui.ch_transport.blockSignals(False) - for x in range(maxCount): self.fPluginList.append(None) Carla.host.set_engine_option(OPTION_TRANSPORT_MODE, transportMode, "") - # Peaks + # Peaks and TimeInfo self.fIdleTimerFast = self.startTimer(self.fSavedSettings["Main/RefreshInterval"]) # LEDs and edit dialog parameters self.fIdleTimerSlow = self.startTimer(self.fSavedSettings["Main/RefreshInterval"]*2) @@ -1010,12 +1004,6 @@ class CarlaMainW(QMainWindow): self.killTimer(self.fIdleTimerFast) self.killTimer(self.fIdleTimerSlow) - settings = QSettings() - settings.setValue("Engine/TransportMode", self.ui.ch_transport.currentIndex()) - self.ui.ch_transport.blockSignals(True) - self.ui.ch_transport.clear() - self.ui.ch_transport.blockSignals(False) - patchcanvas.clear() def loadProject(self, filename): @@ -1119,14 +1107,14 @@ class CarlaMainW(QMainWindow): self.ui.act_engine_start.setEnabled(not check) self.ui.act_engine_stop.setEnabled(check) self.ui.act_engine_configure.setEnabled(not check) - self.ui.frame_transport.setEnabled(check) if check: bufferSize = Carla.host.get_buffer_size() sampleRate = Carla.host.get_sample_rate() - self.fInfoLabel.setText("Engine running, using %g sample rate and %i buffer size" % (sampleRate, bufferSize)) - else: - self.fInfoLabel.setText("Engine failed to start") + self.fInfoText = "Engine running | SampleRate: %g | BufferSize: %i" % (sampleRate, bufferSize) + self.fInfoLabel.setText(self.fInfoText) + + self.menuTransport(check) @pyqtSlot() def slot_engineStop(self): @@ -1135,13 +1123,13 @@ class CarlaMainW(QMainWindow): self.ui.act_file_open.setEnabled(check) self.ui.act_engine_start.setEnabled(not check) self.ui.act_engine_stop.setEnabled(check) - self.ui.frame_transport.setEnabled(check) - if check: - self.fInfoLabel.setText("Engine failed to stop, still running...") - else: + if not check: + self.fInfoText = "" self.fInfoLabel.setText("Engine stopped") + self.menuTransport(check) + @pyqtSlot() def slot_pluginAdd(self): dialog = PluginDatabaseW(self) @@ -1157,26 +1145,67 @@ class CarlaMainW(QMainWindow): def slot_pluginRemoveAll(self): self.removeAllPlugins() - self.connect(self.ui.ch_transport, SIGNAL("currentIndexChanged(int)"), SLOT("(int)")) - self.connect(self.ui.b_transport_play, SIGNAL("clicked(bool)"), SLOT("(bool)")) - self.connect(self.ui.b_transport_stop, SIGNAL("clicked()"), SLOT("()")) + def menuTransport(self, enabled): + self.ui.act_transport_play.setEnabled(enabled) + self.ui.act_transport_stop.setEnabled(enabled) + self.ui.act_transport_backwards.setEnabled(enabled) + self.ui.act_transport_forwards.setEnabled(enabled) + self.ui.menu_Transport.setEnabled(enabled) - @pyqtSlot(int) - def slot_transportModeChanged(self, newMode): - Carla.host.set_engine_option(OPTION_TRANSPORT_MODE, newMode, "") + def refreshTransport(self): + if not self.fEngineStarted: + return + + time = Carla.host.get_current_transport_frame() / int(Carla.host.get_sample_rate()) + secs = time % 60 + mins = (time / 60) % 60 + hrs = (time / 3600) % 60 + + textTransport = "Transport %s, at %02i:%02i:%02i" % ("", hrs, mins, secs) + self.fInfoLabel.setText("%s | %s" % (self.fInfoText, textTransport)) @pyqtSlot(bool) def slot_transportPlayPause(self, toggled): + if not self.fEngineStarted: + return + if toggled: Carla.host.transport_play() else: Carla.host.transport_pause() + self.refreshTransport() + @pyqtSlot() def slot_transportStop(self): + if not self.fEngineStarted: + return + Carla.host.transport_pause() Carla.host.transport_relocate(0) + self.refreshTransport() + + @pyqtSlot() + def slot_transportBackwards(self): + if not self.fEngineStarted: + return + + newFrame = Carla.host.get_current_transport_frame() - 100000 + + if newFrame < 0: + newFrame = 0 + + Carla.host.transport_relocate(newFrame) + + @pyqtSlot() + def slot_transportForwards(self): + if not self.fEngineStarted: + return + + newFrame = Carla.host.get_current_transport_frame() + 100000 + Carla.host.transport_relocate(newFrame) + @pyqtSlot() def slot_aboutCarla(self): CarlaAboutW(self).exec_() @@ -1553,7 +1582,6 @@ class CarlaMainW(QMainWindow): settings.setValue("Geometry", self.saveGeometry()) settings.setValue("SplitterState", self.ui.splitter.saveState()) settings.setValue("ShowToolbar", self.ui.toolBar.isVisible()) - #settings.setValue("ShowTransport", self.ui.frame_transport.isVisible()) settings.setValue("HorizontalScrollBarValue", self.ui.graphicsView.horizontalScrollBar().value()) settings.setValue("VerticalScrollBarValue", self.ui.graphicsView.verticalScrollBar().value()) @@ -1567,11 +1595,6 @@ class CarlaMainW(QMainWindow): self.ui.act_settings_show_toolbar.setChecked(showToolbar) self.ui.toolBar.setVisible(showToolbar) - #showTransport = settings.value("ShowTransport", True, type=bool) - #self.ui.act_settings_show_transport.setChecked(showTransport) - #self.ui.frame_transport.setVisible(showTransport) - self.ui.frame_transport.setVisible(False) - if settings.contains("SplitterState"): self.ui.splitter.restoreState(settings.value("SplitterState", "")) else: @@ -1643,6 +1666,8 @@ class CarlaMainW(QMainWindow): break pwidget.idleFast() + self.refreshTransport() + elif event.timerId() == self.fIdleTimerSlow: for pwidget in self.fPluginList: if pwidget is None: diff --git a/source/carla_backend.py b/source/carla_backend.py index 07fa1bfed..dd8ae579c 100644 --- a/source/carla_backend.py +++ b/source/carla_backend.py @@ -212,6 +212,9 @@ class Host(object): self.lib.carla_transport_relocate.argtypes = [c_uint32] self.lib.carla_transport_relocate.restype = None + self.lib.carla_get_current_transport_frame.argtypes = None + self.lib.carla_get_current_transport_frame.restype = c_uint64 + self.lib.carla_add_plugin.argtypes = [c_enum, c_enum, c_char_p, c_char_p, c_char_p, c_void_p] self.lib.carla_add_plugin.restype = c_bool @@ -443,6 +446,9 @@ class Host(object): def transport_relocate(self, frames): self.lib.carla_transport_relocate(frames) + def get_current_transport_frame(self): + return self.lib.carla_get_current_transport_frame() + def add_plugin(self, btype, ptype, filename, name, label, extraStuff): cfilename = filename.encode("utf-8") if filename else c_nullptr cname = name.encode("utf-8") if name else c_nullptr