From 4775a251b3aaa05d01cb06c145dfd1b0135c946e Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 11 Dec 2012 14:39:46 +0000 Subject: [PATCH] Claudia: Add A2J bridge options in menu; Fix Catia implementation --- resources/ui/catia.ui | 6 +-- resources/ui/claudia.ui | 33 ++++++++++++ src/catia.py | 1 + src/claudia.py | 108 ++++++++++++++++++++++++++++++++++++++-- 4 files changed, 142 insertions(+), 6 deletions(-) diff --git a/resources/ui/catia.ui b/resources/ui/catia.ui index cdcf6cf..3b7ec2b 100644 --- a/resources/ui/catia.ui +++ b/resources/ui/catia.ui @@ -535,7 +535,7 @@ - &A2J Bridge + &ALSA-MIDI Bridge @@ -912,7 +912,7 @@ :/16x16/media-playback-start.png:/16x16/media-playback-start.png - Start A2J Bridge + Start Bridge F7 @@ -924,7 +924,7 @@ :/16x16/media-playback-stop.png:/16x16/media-playback-stop.png - Stop A2J Bridge + Stop Bridge F8 diff --git a/resources/ui/claudia.ui b/resources/ui/claudia.ui index 858019b..73f8529 100644 --- a/resources/ui/claudia.ui +++ b/resources/ui/claudia.ui @@ -866,7 +866,17 @@ &Tools + + + ALSA-MIDI Bridge + + + + + + + @@ -1398,6 +1408,29 @@ Project Properties... + + + + :/16x16/media-playback-start.png:/16x16/media-playback-start.png + + + Start Bridge + + + + + + :/16x16/media-playback-stop.png:/16x16/media-playback-stop.png + + + Stop Bridge + + + + + Export Hardware Ports... + + diff --git a/src/catia.py b/src/catia.py index 0b7cd89..11c1ade 100755 --- a/src/catia.py +++ b/src/catia.py @@ -985,6 +985,7 @@ class CatiaMainW(AbstractCanvasJackClass, ui_catia.Ui_CatiaMainW): if DBus.jack and not DBus.jack.IsStarted(): self.act_tools_a2j_start.setEnabled(False) self.act_tools_a2j_stop.setEnabled(False) + self.act_tools_a2j_export_hw.setEnabled(DBus.a2j and not DBus.a2j.is_started()) else: self.act_tools_a2j_start.setEnabled(not started) self.act_tools_a2j_stop.setEnabled(started) diff --git a/src/claudia.py b/src/claudia.py index cb68899..957252e 100755 --- a/src/claudia.py +++ b/src/claudia.py @@ -737,6 +737,17 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): else: self.jackStopped() + if DBus.a2j: + if DBus.a2j.is_started(): + self.a2jStarted() + else: + self.a2jStopped() + else: + self.act_tools_a2j_start.setEnabled(False) + self.act_tools_a2j_stop.setEnabled(False) + self.act_tools_a2j_export_hw.setEnabled(False) + self.menu_A2J_Bridge.setEnabled(False) + if DBus.ladish_control.IsStudioLoaded(): self.studioLoaded() if DBus.ladish_studio.IsStarted(): @@ -766,6 +777,9 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): self.connect(self.act_studio_save_as, SIGNAL("triggered()"), SLOT("slot_studio_save_as()")) self.connect(self.act_studio_rename, SIGNAL("triggered()"), SLOT("slot_studio_rename()")) self.connect(self.act_studio_unload, SIGNAL("triggered()"), SLOT("slot_studio_unload()")) + self.connect(self.act_tools_a2j_start, SIGNAL("triggered()"), SLOT("slot_A2JBridgeStart()")) + self.connect(self.act_tools_a2j_stop, SIGNAL("triggered()"), SLOT("slot_A2JBridgeStop()")) + self.connect(self.act_tools_a2j_export_hw, SIGNAL("triggered()"), SLOT("slot_A2JBridgeExportHW()")) self.connect(self.b_studio_new, SIGNAL("clicked()"), SLOT("slot_studio_new()")) self.connect(self.b_studio_load, SIGNAL("clicked()"), SLOT("slot_studio_load_b()")) self.connect(self.b_studio_save, SIGNAL("clicked()"), SLOT("slot_studio_save()")) @@ -858,8 +872,8 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): # ------------------------------------------------------------- # Set-up DBus - DBus.bus.add_signal_receiver(self.DBusSignalReceiver, destination_keyword='dest', path_keyword='path', - member_keyword='member', interface_keyword='interface', sender_keyword='sender', ) + DBus.bus.add_signal_receiver(self.DBusSignalReceiver, destination_keyword="dest", path_keyword="path", + member_keyword="member", interface_keyword="interface", sender_keyword="sender") # ------------------------------------------------------------- @@ -1237,6 +1251,7 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): self.act_jack_render.setEnabled(canRender) self.b_jack_render.setEnabled(canRender) self.menuJackTransport(True) + self.menuA2JBridge(False) self.cb_buffer_size.setEnabled(True) self.cb_sample_rate.setEnabled(True) # jacksettings.getSampleRate() != -1 @@ -1281,6 +1296,7 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): self.act_jack_render.setEnabled(False) self.b_jack_render.setEnabled(False) self.menuJackTransport(False) + self.menuA2JBridge(False) if self.systray: self.systray.setActionEnabled("tools_render", False) @@ -1402,6 +1418,12 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): patchcanvas.clear() + def a2jStarted(self): + self.menuA2JBridge(True) + + def a2jStopped(self): + self.menuA2JBridge(False) + def menuJackTransport(self, enabled): self.act_transport_play.setEnabled(enabled) self.act_transport_stop.setEnabled(enabled) @@ -1410,6 +1432,16 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): self.menu_Transport.setEnabled(enabled) self.group_transport.setEnabled(enabled) + def menuA2JBridge(self, started): + if not DBus.jack.IsStarted(): + self.act_tools_a2j_start.setEnabled(False) + self.act_tools_a2j_stop.setEnabled(False) + self.act_tools_a2j_export_hw.setEnabled(DBus.a2j and not DBus.a2j.is_started()) + else: + self.act_tools_a2j_start.setEnabled(not started) + self.act_tools_a2j_stop.setEnabled(started) + self.act_tools_a2j_export_hw.setEnabled(not started) + def DBusSignalReceiver(self, *args, **kwds): if kwds['interface'] == "org.freedesktop.DBus" and kwds['path'] == "/org/freedesktop/DBus" and kwds['member'] == "NameOwnerChanged": appInterface, appId, newId = args @@ -1417,7 +1449,9 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): if not newId: # Something crashed - if appInterface in ("org.jackaudio.service", "org.ladish"): + if appInterface == "org.gna.home.a2jmidid": + QTimer.singleShot(0, self, SLOT("slot_handleCrash_a2j()")) + elif appInterface in ("org.jackaudio.service", "org.ladish"): # Prevent any more dbus calls DBus.jack = None jack.client = None @@ -1496,6 +1530,12 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): elif kwds['member'] == "AppStateChanged2": self.emit(SIGNAL("DBusAppStateChanged2Callback(QString, int, QString, bool, bool, QString)"), kwds['path'], args[iAppChangedNumber], args[iAppChangedName], args[iAppChangedActive], args[iAppChangedTerminal], args[iAppChangedLevel]) + elif kwds['interface'] == "org.gna.home.a2jmidid.control": + if kwds['member'] == "bridge_started": + self.a2jStarted() + elif kwds['member'] == "bridge_stopped": + self.a2jStopped() + def DBusReconnect(self): DBus.jack = DBus.bus.get_object("org.jackaudio.service", "/org/jackaudio/Controller") DBus.ladish_control = DBus.bus.get_object("org.ladish", "/org/ladish/Control") @@ -1511,6 +1551,11 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): except: DBus.ladish_app_daemon = None + try: + DBus.a2j = dbus.Interface(DBus.bus.get_object("org.gna.home.a2jmidid", "/"), "org.gna.home.a2jmidid.control") + except: + DBus.a2j = None + jacksettings.initBus(DBus.bus) def refreshXruns(self): @@ -2055,6 +2100,17 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): self.DBusReconnect() self.studioUnloaded() + if DBus.a2j: + if DBus.a2j.is_started(): + self.a2jStarted() + else: + self.a2jStopped() + else: + self.act_tools_a2j_start.setEnabled(False) + self.act_tools_a2j_stop.setEnabled(False) + self.act_tools_a2j_export_hw.setEnabled(False) + self.menu_A2J_Bridge.setEnabled(False) + @pyqtSlot() def slot_handleCrash_ladish(self): self.treeWidget.clear() @@ -2066,6 +2122,24 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): def slot_handleCrash_studio(self): QMessageBox.warning(self, self.tr("Error"), self.tr("jackdbus has crashed")) + @pyqtSlot() + def slot_handleCrash_a2j(self): + try: + DBus.a2j = dbus.Interface(DBus.bus.get_object("org.gna.home.a2jmidid", "/"), "org.gna.home.a2jmidid.control") + except: + DBus.a2j = None + + if DBus.a2j: + if DBus.a2j.is_started(): + self.a2jStarted() + else: + self.a2jStopped() + else: + self.act_tools_a2j_start.setEnabled(False) + self.act_tools_a2j_stop.setEnabled(False) + self.act_tools_a2j_export_hw.setEnabled(False) + self.menu_A2J_Bridge.setEnabled(False) + @pyqtSlot(str) def slot_DBusCrashCallback(self, appInterface): if appInterface == "org.jackaudio.service": @@ -2372,6 +2446,29 @@ class ClaudiaMainW(AbstractCanvasJackClass, ui_claudia.Ui_ClaudiaMainW): def slot_JackShutdownCallback(self): self.jackStopped() + @pyqtSlot() + def slot_A2JBridgeStart(self): + ret = False + if DBus.a2j: + ret = bool(DBus.a2j.start()) + return ret + + @pyqtSlot() + def slot_A2JBridgeStop(self): + ret = False + if DBus.a2j: + ret = bool(DBus.a2j.stop()) + return ret + + @pyqtSlot() + def slot_A2JBridgeExportHW(self): + if DBus.a2j: + ask = QMessageBox.question(self, self.tr("A2J Hardware Export"), self.tr("Enable Hardware Export on the A2J Bridge?"), QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel, QMessageBox.No) + if ask == QMessageBox.Yes: + DBus.a2j.set_hw_export(True) + elif ask == QMessageBox.No: + DBus.a2j.set_hw_export(False) + @pyqtSlot() def slot_configureClaudia(self): # Save groups position now @@ -2568,6 +2665,11 @@ if __name__ == '__main__': except: DBus.ladish_app_daemon = None + try: + DBus.a2j = dbus.Interface(DBus.bus.get_object("org.gna.home.a2jmidid", "/"), "org.gna.home.a2jmidid.control") + except: + DBus.a2j = None + jacksettings.initBus(DBus.bus) # Show GUI