| @@ -193,7 +193,7 @@ | |||
| <x>0</x> | |||
| <y>0</y> | |||
| <width>1058</width> | |||
| <height>37</height> | |||
| <height>20</height> | |||
| </rect> | |||
| </property> | |||
| <widget class="QMenu" name="menu_File"> | |||
| @@ -285,12 +285,23 @@ | |||
| <addaction name="act_help_about_juce"/> | |||
| <addaction name="act_help_about_qt"/> | |||
| </widget> | |||
| <widget class="QMenu" name="menu_Secrets"> | |||
| <property name="title"> | |||
| <string>Secrets</string> | |||
| </property> | |||
| <addaction name="act_secret_1"/> | |||
| <addaction name="act_secret_2"/> | |||
| <addaction name="act_secret_3"/> | |||
| <addaction name="act_secret_4"/> | |||
| <addaction name="act_secret_5"/> | |||
| </widget> | |||
| <addaction name="menu_File"/> | |||
| <addaction name="menu_Engine"/> | |||
| <addaction name="menu_Plugin"/> | |||
| <addaction name="menu_Canvas"/> | |||
| <addaction name="menu_Settings"/> | |||
| <addaction name="menu_Help"/> | |||
| <addaction name="menu_Secrets"/> | |||
| </widget> | |||
| <widget class="QToolBar" name="toolBar"> | |||
| <property name="windowTitle"> | |||
| @@ -1101,6 +1112,31 @@ | |||
| <string>Expand Slots</string> | |||
| </property> | |||
| </action> | |||
| <action name="act_secret_1"> | |||
| <property name="text"> | |||
| <string>Perform secret 1</string> | |||
| </property> | |||
| </action> | |||
| <action name="act_secret_2"> | |||
| <property name="text"> | |||
| <string>Perform secret 2</string> | |||
| </property> | |||
| </action> | |||
| <action name="act_secret_3"> | |||
| <property name="text"> | |||
| <string>Perform secret 3</string> | |||
| </property> | |||
| </action> | |||
| <action name="act_secret_4"> | |||
| <property name="text"> | |||
| <string>Perform secret 4</string> | |||
| </property> | |||
| </action> | |||
| <action name="act_secret_5"> | |||
| <property name="text"> | |||
| <string>Perform secret 5</string> | |||
| </property> | |||
| </action> | |||
| </widget> | |||
| <customwidgets> | |||
| <customwidget> | |||
| @@ -58,16 +58,14 @@ public: | |||
| kEngine(engine), | |||
| kPlugin(plugin), | |||
| fShmIds(), | |||
| fExtraArgs(), | |||
| fProcess() {} | |||
| void setData(const char* const shmIds, const char* const args) noexcept | |||
| void setData(const char* const shmIds) noexcept | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(shmIds != nullptr && shmIds[0] != '\0',); | |||
| CARLA_SAFE_ASSERT(! isThreadRunning()); | |||
| fShmIds = shmIds; | |||
| fExtraArgs = args; | |||
| } | |||
| uintptr_t getProcessID() const noexcept | |||
| @@ -100,8 +98,7 @@ protected: | |||
| StringArray arguments; | |||
| // binary | |||
| arguments.add(filename); | |||
| arguments.addTokens(fExtraArgs, true); | |||
| arguments.addTokens(filename, true); | |||
| bool started; | |||
| @@ -181,7 +178,6 @@ private: | |||
| CarlaPlugin* const kPlugin; | |||
| String fShmIds; | |||
| String fExtraArgs; | |||
| ScopedPointer<ChildProcess> fProcess; | |||
| @@ -1371,7 +1367,7 @@ public: | |||
| // ------------------------------------------------------------------- | |||
| bool init(const char* const filename, const char* const name, const char* const args) | |||
| bool init(const char* const filename, const char* const name) | |||
| { | |||
| CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr, false); | |||
| @@ -1460,7 +1456,7 @@ public: | |||
| std::strncpy(shmIdsStr+6*2, &fShmNonRtClientControl.filename[fShmNonRtClientControl.filename.length()-6], 6); | |||
| std::strncpy(shmIdsStr+6*3, &fShmNonRtServerControl.filename[fShmNonRtServerControl.filename.length()-6], 6); | |||
| fBridgeThread.setData(shmIdsStr, args); | |||
| fBridgeThread.setData(shmIdsStr); | |||
| fBridgeThread.startThread(); | |||
| } | |||
| @@ -1608,7 +1604,7 @@ CarlaPlugin* CarlaPlugin::newJackApp(const Initializer& init) | |||
| CarlaPluginJack* const plugin(new CarlaPluginJack(init.engine, init.id)); | |||
| if (! plugin->init(init.filename, init.name, init.label)) | |||
| if (! plugin->init(init.filename, init.name)) | |||
| { | |||
| delete plugin; | |||
| return nullptr; | |||
| @@ -27,11 +27,11 @@ from carla_config import * | |||
| if config_UseQt5: | |||
| from PyQt5.QtCore import qCritical, QFileInfo, QModelIndex, QPointF, QTimer | |||
| from PyQt5.QtGui import QImage, QPalette | |||
| from PyQt5.QtWidgets import QAction, QApplication, QFileSystemModel, QListWidgetItem, QMainWindow | |||
| from PyQt5.QtWidgets import QAction, QApplication, QInputDialog, QFileSystemModel, QListWidgetItem, QMainWindow | |||
| else: | |||
| from PyQt4.QtCore import qCritical, QFileInfo, QModelIndex, QPointF, QTimer | |||
| from PyQt4.QtGui import QImage, QPalette | |||
| from PyQt4.QtGui import QAction, QApplication, QFileSystemModel, QListWidgetItem, QMainWindow | |||
| from PyQt4.QtGui import QAction, QApplication, QInputDialog, QFileSystemModel, QListWidgetItem, QMainWindow | |||
| # ------------------------------------------------------------------------------------------------------------ | |||
| # Imports (Custom) | |||
| @@ -346,7 +346,13 @@ class HostWindow(QMainWindow): | |||
| self.ui.act_help_about_juce.setMenuRole(QAction.ApplicationSpecificRole) | |||
| self.ui.act_help_about_qt.setMenuRole(QAction.AboutQtRole) | |||
| self.ui.menu_Settings.setTitle("Panels") | |||
| self.ui.menu_Help.hide() | |||
| self.ui.menu_Help.menuAction().setVisible(False) | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| # Set up GUI (secrets when running local) | |||
| if CWD != "/Shared/Personal/FOSS/GIT/falkTX/Carla/source": | |||
| self.ui.menu_Secrets.menuAction().setVisible(False) | |||
| # ---------------------------------------------------------------------------------------------------- | |||
| # Load Settings | |||
| @@ -414,6 +420,12 @@ class HostWindow(QMainWindow): | |||
| self.ui.act_help_about_juce.triggered.connect(self.slot_aboutJuce) | |||
| self.ui.act_help_about_qt.triggered.connect(self.slot_aboutQt) | |||
| self.ui.act_secret_1.triggered.connect(self.slot_runSecret1) | |||
| self.ui.act_secret_2.triggered.connect(self.slot_runSecret2) | |||
| self.ui.act_secret_3.triggered.connect(self.slot_runSecret3) | |||
| self.ui.act_secret_4.triggered.connect(self.slot_runSecret4) | |||
| self.ui.act_secret_5.triggered.connect(self.slot_runSecret5) | |||
| 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) | |||
| @@ -1497,6 +1509,43 @@ class HostWindow(QMainWindow): | |||
| def slot_aboutQt(self): | |||
| QApplication.instance().aboutQt() | |||
| # -------------------------------------------------------------------------------------------------------- | |||
| # Secret (menu actions) | |||
| @pyqtSlot() | |||
| def slot_runSecret1(self): | |||
| print("secret 1") | |||
| fname = "/usr/bin/audacious -p" | |||
| self.host.add_plugin(BINARY_NATIVE, PLUGIN_JACK, fname, "", "", 0, None, 0) | |||
| @pyqtSlot() | |||
| def slot_runSecret2(self): | |||
| print("secret 2") | |||
| fname = "/usr/bin/pulseaudio" | |||
| fname += " --high-priority --realtime --exit-idle-time=-1 --file=/usr/share/cadence/pulse2jack/play+rec.pa -n" | |||
| self.host.add_plugin(BINARY_NATIVE, PLUGIN_JACK, fname, "", "", 0, None, 0) | |||
| @pyqtSlot() | |||
| def slot_runSecret3(self): | |||
| print("secret 3") | |||
| fname = "/usr/bin/lmms" | |||
| self.host.add_plugin(BINARY_NATIVE, PLUGIN_JACK, fname, "", "", 0, None, 0) | |||
| @pyqtSlot() | |||
| def slot_runSecret4(self): | |||
| print("secret 4") | |||
| ret = QInputDialog.getText(self, "Command", "command to run") | |||
| if ret[1] and len(ret[0]) > 1: | |||
| fname = ret[0] | |||
| if not self.host.add_plugin(BINARY_NATIVE, PLUGIN_JACK, fname, "", "", 0, None, 0): | |||
| CustomMessageBox(self, QMessageBox.Critical, | |||
| self.tr("Error"), self.tr("Failed to load plugin"), | |||
| self.host.get_last_error(), QMessageBox.Ok, QMessageBox.Ok) | |||
| @pyqtSlot() | |||
| def slot_runSecret5(self): | |||
| print("secret 5") | |||
| # -------------------------------------------------------------------------------------------------------- | |||
| # Disk (menu actions) | |||
| @@ -52,6 +52,8 @@ def getPluginTypeAsString(ptype): | |||
| return "SF2" | |||
| if ptype == PLUGIN_SFZ: | |||
| return "SFZ" | |||
| if ptype == PLUGIN_JACK: | |||
| return "JACK" | |||
| print("getPluginTypeAsString(%i) - invalid type" % ptype); | |||
| return "Unknown" | |||
| @@ -84,6 +86,8 @@ def getPluginTypeFromString(stype): | |||
| return PLUGIN_SF2 | |||
| if stype == "sfz": | |||
| return PLUGIN_SFZ | |||
| if stype == "jack": | |||
| return PLUGIN_JACK | |||
| print("getPluginTypeFromString(\"%s\") - invalid string type" % stype) | |||
| return PLUGIN_NONE | |||
| @@ -490,6 +490,13 @@ public: | |||
| // #ifdef DEBUG | |||
| if (opcode != kPluginBridgeNonRtClientPing) | |||
| { | |||
| static int shownNull = 0; | |||
| if (opcode == kPluginBridgeNonRtClientNull) | |||
| { | |||
| if (shownNull > 5) | |||
| continue; | |||
| ++shownNull; | |||
| } | |||
| carla_stdout("CarlaJackClient::handleNonRtData() - got opcode: %s", PluginBridgeNonRtClientOpcode2str(opcode)); | |||
| } | |||
| // #endif | |||
| @@ -546,8 +553,15 @@ public: | |||
| case kPluginBridgeNonRtClientSetMidiProgram: | |||
| case kPluginBridgeNonRtClientSetCustomData: | |||
| case kPluginBridgeNonRtClientSetChunkDataFile: | |||
| case kPluginBridgeNonRtClientSetCtrlChannel: | |||
| break; | |||
| case kPluginBridgeNonRtClientSetOption: | |||
| fShmNonRtClientControl.readUInt(); | |||
| fShmNonRtClientControl.readBool(); | |||
| break; | |||
| case kPluginBridgeNonRtClientSetCtrlChannel: | |||
| fShmNonRtClientControl.readShort(); | |||
| break; | |||
| case kPluginBridgeNonRtClientPrepareForSave: | |||
| @@ -982,6 +996,15 @@ int jack_activate(jack_client_t* client) | |||
| const JackClientState& jstate(jclient->fState); | |||
| CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1); | |||
| #if 0 | |||
| // needed for pulseaudio | |||
| static bool skipFirstActivate = true; | |||
| if (skipFirstActivate) { | |||
| skipFirstActivate = false; | |||
| return 0; | |||
| } | |||
| #endif | |||
| jclient->activate(); | |||
| return 0; | |||
| } | |||
| @@ -1191,7 +1214,7 @@ int jack_transport_locate(jack_client_t*, jack_nframes_t) | |||
| CARLA_EXPORT | |||
| jack_transport_state_t jack_transport_query(const jack_client_t* client, jack_position_t* pos) | |||
| { | |||
| carla_stdout("CarlaJackClient :: %s", __FUNCTION__); | |||
| carla_debug("CarlaJackClient :: %s", __FUNCTION__); | |||
| CarlaJackClient* const jclient = (CarlaJackClient*)client; | |||
| CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, JackTransportStopped); | |||
| @@ -1360,7 +1383,7 @@ const char** jack_get_ports(jack_client_t*, const char* a, const char* b, unsign | |||
| static const char* playback_1 = "system:playback_1"; | |||
| static const char* playback_2 = "system:playback_2"; | |||
| if (flags == 0 || (flags & (JackPortIsInput|JackPortIsOutput)) != 0) | |||
| if (flags == 0 || (flags & (JackPortIsInput|JackPortIsOutput)) == (JackPortIsInput|JackPortIsOutput)) | |||
| { | |||
| if (const char** const ret = (const char**)calloc(5, sizeof(const char*))) | |||
| { | |||
| @@ -1482,6 +1505,25 @@ int jack_set_thread_init_callback(jack_client_t*, JackThreadInitCallback, void*) | |||
| return 0; | |||
| } | |||
| CARLA_EXPORT | |||
| int jack_port_name_size(void) | |||
| { | |||
| return STR_MAX; | |||
| } | |||
| CARLA_EXPORT | |||
| const char* JACK_METADATA_PRETTY_NAME; | |||
| CARLA_EXPORT | |||
| const char* JACK_METADATA_PRETTY_NAME = "http://jackaudio.org/metadata/pretty-name"; | |||
| // jack_ringbuffer_create | |||
| // jack_port_connected | |||
| // jack_port_is_mine | |||
| // jack_port_set_name | |||
| // jack_port_get_all_connections | |||
| // jack_port_uuid | |||
| // -------------------------------------------------------------------------------------------------------------------- | |||
| #include "jackbridge/JackBridge2.cpp" | |||