diff --git a/resources/ui/settings_jack.ui b/resources/ui/settings_jack.ui
index d86bfcb5..90c89a75 100644
--- a/resources/ui/settings_jack.ui
+++ b/resources/ui/settings_jack.ui
@@ -6,8 +6,8 @@
0
0
- 680
- 449
+ 749
+ 569
@@ -17,7 +17,7 @@
-
- 0
+ 2
@@ -1335,6 +1335,43 @@ Also known as buffer size
+
+
+ -
+
+
+ false
+
+
+ Client name
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 200
+
+
+
+
+ -
+
+
+ false
+
+
+
+
+
@@ -1348,19 +1385,136 @@ Also known as buffer size
-
-
-
-
- 16
-
-
-
- Not Implemented Yet
-
-
- Qt::AlignCenter
-
-
+
+
-
+
+
+ Settings
+
+
+
-
+
+
+ 65536
+
+
+
+ -
+
+
+ Auto Connect Ports
+
+
+
+ -
+
+
+ Multicast Ip
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+ -
+
+
+ -
+
+
+ Udp Net Port
+
+
+
+ -
+
+
+ Auto Save
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Controls
+
+
+
-
+
+
+ Start at Boot
+
+
+
+ -
+
+
+ Reset Network Settings
+
+
+
+ -
+
+
-
+
+
+ Start
+
+
+
+ -
+
+
+ Stop
+
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
diff --git a/src/cadence.py b/src/cadence.py
index 88816d93..9255bdf8 100755
--- a/src/cadence.py
+++ b/src/cadence.py
@@ -1373,6 +1373,10 @@ def jackStarted(self):
self.checkAlsaAudio()
self.checkPulseAudio()
+ if GlobalSettings.value("JACKNETMANAGER/AutoStart"):
+ print("loadinternal")
+ gDBus.jack.LoadInternal("netmanager")
+
def jackStopped(self):
if self.m_timer500:
self.killTimer(self.m_timer500)
@@ -1674,7 +1678,8 @@ def slot_JackServerStart(self):
try:
gDBus.jack.StartServer()
except:
- QMessageBox.warning(self, self.tr("Warning"), self.tr("Failed to start JACK, please check the logs for more information."))
+ pass
+ #QMessageBox.warning(self, self.tr("Warning"), self.tr("Failed to start JACK, please check the logs for more information."))
@pyqtSlot()
def slot_JackServerStop(self):
@@ -2386,7 +2391,7 @@ def taskInMainThread():
if haveDBus:
gDBus.loop = DBusQtMainLoop(set_as_default=True)
- gDBus.bus = dbus.SessionBus(mainloop=gDBus.loop)
+ gDBus.bus = dbus.SessionBus(mainloop=gDBus.loop)
initSystemChecks()
diff --git a/src/catia.py b/src/catia.py
index 8101d601..3792df30 100755
--- a/src/catia.py
+++ b/src/catia.py
@@ -1132,7 +1132,8 @@ def slot_JackServerStart(self):
try:
ret = bool(gDBus.jack.StartServer())
except:
- QMessageBox.warning(self, self.tr("Warning"), self.tr("Failed to start JACK, please check the logs for more information."))
+ pass
+ #QMessageBox.warning(self, self.tr("Warning"), self.tr("Failed to start JACK, please check the logs for more information."))
#self.jackStopped()
return ret
diff --git a/src/jacksettings.py b/src/jacksettings.py
index 69e9f759..5eb488c6 100755
--- a/src/jacksettings.py
+++ b/src/jacksettings.py
@@ -30,6 +30,7 @@
from PyQt4.QtGui import QFontMetrics
from PyQt4.QtGui import QDialog, QDialogButtonBox, QMessageBox
+from shared_cadence import *
# ------------------------------------------------------------------------------------------------------------
# Imports (Custom Stuff)
@@ -75,13 +76,17 @@
def initBus(bus):
global gJackctl
+ global jack_control_iface
if not bus:
gJackctl = None
return 1
try:
- gJackctl = dbus.Interface(bus.get_object("org.jackaudio.service", "/org/jackaudio/Controller"), "org.jackaudio.Configure")
+ controller = bus.get_object("org.jackaudio.service", "/org/jackaudio/Controller")
+ gJackctl = dbus.Interface(controller, "org.jackaudio.Configure")
+ jack_control_iface = dbus.Interface(
+ controller, "org.jackaudio.JackControl")
return 0
except:
gJackctl = None
@@ -234,6 +239,10 @@ def __init__(self, parent):
self.ui.obj_driver_capture.currentIndexChanged[int].connect(self.slot_checkALSASelection)
self.ui.obj_driver_playback.currentIndexChanged[int].connect(self.slot_checkALSASelection)
+ self.ui.obj_net_manager_start.clicked.connect(self.net_manager_start)
+ self.ui.obj_net_manager_stop.clicked.connect(self.net_manager_stop)
+ self.ui.obj_net_reset.clicked.connect(self.net_manager_reset)
+
# -------------------------------------------------------------
# Load initial settings
@@ -243,6 +252,7 @@ def __init__(self, parent):
self.checkEngine()
self.loadServerSettings()
self.loadDriverSettings(True) # reset because we'll change it below
+ self.loadNetSettings()
# -------------------------------------------------------------
# Load selected JACK driver
@@ -557,11 +567,20 @@ def saveDriverSettings(self, resetIfNeeded):
if self.ui.obj_driver_inchannels.isEnabled():
value = dbus.UInt32(self.ui.obj_driver_inchannels.value())
- setDriverParameter("inchannels", value, True)
+ if self.fDriverName == 'net':
+ value = dbus.Int32(self.ui.obj_driver_inchannels.value())
+ setDriverParameter("input-ports", value, True)
+ else:
+ value = dbus.UInt32(self.ui.obj_driver_inchannels.value())
+ setDriverParameter("inchannels", value, True)
if self.ui.obj_driver_outchannels.isEnabled():
- value = dbus.UInt32(self.ui.obj_driver_outchannels.value())
- setDriverParameter("outchannels", value, True)
+ if self.fDriverName == 'net':
+ value = dbus.Int32(self.ui.obj_driver_outchannels.value())
+ setDriverParameter("output-ports", value, True)
+ else:
+ value = dbus.UInt32(self.ui.obj_driver_outchannels.value())
+ setDriverParameter("outchannels", value, True)
if self.ui.obj_driver_shorts.isEnabled():
value = dbus.Boolean(self.ui.obj_driver_shorts.isChecked())
@@ -608,6 +627,10 @@ def saveDriverSettings(self, resetIfNeeded):
value = dbus.Int32(self.ui.obj_driver_channels.value())
setDriverParameter("channels", value, True)
+ if self.ui.obj_driver_client_name.isEnabled():
+ value = dbus.String(self.ui.obj_driver_client_name.text())
+ setDriverParameter("client-name", value, True)
+
def loadDriverSettings(self, reset=False, forceReset=False):
global gJackctl
@@ -694,9 +717,92 @@ def loadDriverSettings(self, reset=False, forceReset=False):
self.ui.obj_driver_snoop.setChecked(bool(value))
elif attribute == "channels":
self.ui.obj_driver_channels.setValue(int(value))
+ elif attribute == 'client-name':
+ self.ui.obj_driver_client_name.setText(value)
+ elif attribute == 'input-ports':
+ self.ui.obj_driver_inchannels.setValue(int(value))
+ elif attribute == 'output-ports':
+ self.ui.obj_driver_outchannels.setValue(int(value))
else:
print("JackSettingsW::loadDriverSettings() - Unimplemented driver attribute '%s', value: '%s'" % (attribute, str(value)))
+ def saveNetSettings(self):
+ path = ['internals', 'netmanager']
+
+ isset, default, value = map(
+ dbus_type_to_python_type,
+ gJackctl.GetParameterValue(path + ['multicast-ip']))
+
+ curvalue = self.ui.obj_net_multicast_ip.text()
+
+ if curvalue != value:
+ gJackctl.SetParameterValue(
+ path + ['multicast-ip'],
+ python_type_to_jackdbus_type(curvalue, 's'))
+
+ isset, default, value = map(
+ dbus_type_to_python_type,
+ gJackctl.GetParameterValue(path + ['udp-net-port']))
+
+ curvalue = self.ui.obj_net_multicast_port.value()
+
+ if curvalue != value:
+ gJackctl.SetParameterValue(
+ path + ['udp-net-port'],
+ python_type_to_jackdbus_type(curvalue, 'u'))
+
+ isset, default, value = map(
+ dbus_type_to_python_type,
+ gJackctl.GetParameterValue(path + ['auto-connect']))
+
+ curvalue = self.ui.obj_net_auto_connect.isChecked()
+
+ if curvalue != value:
+ gJackctl.SetParameterValue(path + ['auto-connect'], curvalue)
+
+ isset, default, value = map(
+ dbus_type_to_python_type,
+ gJackctl.GetParameterValue(path + ['auto-save']))
+
+ curvalue = self.ui.obj_net_auto_save.isChecked()
+
+ if curvalue != value:
+ gJackctl.SetParameterValue(path + ['auto-save'], curvalue)
+
+ GlobalSettings = QSettings("Cadence", "GlobalSettings")
+ GlobalSettings.setValue('JACKNETMANAGER/AutoStart',
+ self.ui.obj_net_manager_at_boot.isChecked())
+
+ def loadNetSettings(self):
+ path = ['internals', 'netmanager']
+
+ _, _, value = map(
+ dbus_type_to_python_type,
+ gJackctl.GetParameterValue(path + ['multicast-ip']))
+
+ self.ui.obj_net_multicast_ip.setText(value)
+
+ _, _, value = map(
+ dbus_type_to_python_type,
+ gJackctl.GetParameterValue(path + ['udp-net-port']))
+
+ self.ui.obj_net_multicast_port.setValue(value)
+
+ _, _, value = map(
+ dbus_type_to_python_type,
+ gJackctl.GetParameterValue(path + ['auto-connect']))
+
+ self.ui.obj_net_auto_connect.setChecked(value)
+
+ _, _, value = map(
+ dbus_type_to_python_type,
+ gJackctl.GetParameterValue(path + ['auto-save']))
+
+ self.ui.obj_net_auto_save.setChecked(value)
+
+ GlobalSettings = QSettings("Cadence", "GlobalSettings")
+ self.ui.obj_net_manager_at_boot.setChecked(
+ GlobalSettings.value('JACKNETMANAGER/AutoStart') == "true")
# -----------------------------------------------------------------
# Helper functions
@@ -760,6 +866,7 @@ def slot_checkDriverSelection(self, row):
# Save previous settings
self.saveDriverSettings(False)
+ self.saveNetSettings()
# Set new Jack driver
self.fDriverName = dbus.String(self.ui.obj_server_driver.item(row, 0).text().lower())
@@ -834,10 +941,10 @@ def slot_checkDriverSelection(self, row):
self.ui.obj_driver_monitor.setEnabled(driverHasFeature("monitor"))
self.ui.obj_driver_dither.setEnabled(driverHasFeature("dither"))
self.ui.obj_driver_dither_label.setEnabled(driverHasFeature("dither"))
- self.ui.obj_driver_inchannels.setEnabled(driverHasFeature("inchannels"))
- self.ui.obj_driver_inchannels_label.setEnabled(driverHasFeature("inchannels"))
- self.ui.obj_driver_outchannels.setEnabled(driverHasFeature("outchannels"))
- self.ui.obj_driver_outchannels_label.setEnabled(driverHasFeature("outchannels"))
+ self.ui.obj_driver_inchannels.setEnabled(driverHasFeature("inchannels") or driverHasFeature("input-ports"))
+ self.ui.obj_driver_inchannels_label.setEnabled(driverHasFeature("inchannels") or driverHasFeature("input-ports"))
+ self.ui.obj_driver_outchannels.setEnabled(driverHasFeature("outchannels") or driverHasFeature("output-ports"))
+ self.ui.obj_driver_outchannels_label.setEnabled(driverHasFeature("outchannels") or driverHasFeature("output-ports"))
self.ui.obj_driver_shorts.setEnabled(driverHasFeature("shorts"))
self.ui.obj_driver_input_latency.setEnabled(driverHasFeature("input-latency"))
self.ui.obj_driver_input_latency_label.setEnabled(driverHasFeature("input-latency"))
@@ -852,6 +959,7 @@ def slot_checkDriverSelection(self, row):
self.ui.obj_driver_snoop.setEnabled(driverHasFeature("snoop"))
self.ui.obj_driver_channels.setEnabled(driverHasFeature("channels"))
self.ui.obj_driver_channels_label.setEnabled(driverHasFeature("channels"))
+ self.ui.obj_driver_client_name.setEnabled(driverHasFeature("client-name"))
# Misc stuff
if self.ui.obj_server_driver.item(row, 0).text() == "ALSA":
@@ -872,15 +980,35 @@ def slot_checkDriverSelection(self, row):
elif self.ui.obj_server_driver.item(row, 0).text() == "Loopback":
self.ui.toolbox_driver_misc.setCurrentIndex(4)
+ elif self.ui.obj_server_driver.item(row, 0).text() == "Net":
+ self.ui.toolbox_driver_misc.setCurrentIndex(5)
+
else:
self.ui.toolbox_driver_misc.setCurrentIndex(0)
self.slot_checkDuplexSelection(self.ui.obj_driver_duplex.isChecked())
+ def net_manager_start(self):
+ jack_control_iface.LoadInternal("netmanager")
+
+ def net_manager_stop(self):
+ jack_control_iface.UnloadInternal("netmanager")
+
+ def net_manager_reset(self):
+ path = ['internals', 'netmanager']
+ for _, name, _, _ in gJackctl.GetParametersInfo(path):
+ gJackctl.ResetParameterValue(path + [name])
+
+ GlobalSettings = QSettings("Cadence", "GlobalSettings")
+ GlobalSettings.setValue('JACKNETMANAGER/AutoStart', False)
+
+ self.loadNetSettings()
+
@pyqtSlot()
def slot_saveJackSettings(self):
self.saveServerSettings()
self.saveDriverSettings(True)
+ self.saveNetSettings()
@pyqtSlot()
def slot_resetJackSettings(self):
diff --git a/src/shared_cadence.py b/src/shared_cadence.py
index 2a819f39..9f709f6f 100644
--- a/src/shared_cadence.py
+++ b/src/shared_cadence.py
@@ -20,6 +20,7 @@
# Imports (Global)
from time import sleep
+import dbus
if True:
from PyQt5.QtCore import QProcess, QSettings
@@ -164,3 +165,47 @@ def stopAllAudioProcesses(tryCloseJack = True):
process.start("killall", ["-KILL"] + procsKill)
process.waitForFinished()
waitProcsEnd(procsKill, tries)
+
+
+def bool_convert(str_value):
+ if str_value.lower() == "false":
+ return False
+
+ if str_value.lower() == "off":
+ return False
+
+ if str_value.lower() == "no":
+ return False
+
+ if str_value == "0":
+ return False
+
+ if str_value.lower() == "(null)":
+ return False
+
+ return bool(str_value)
+
+
+def dbus_type_to_python_type(dbus_value):
+ if type(dbus_value) == dbus.Boolean:
+ return bool(dbus_value)
+ if type(dbus_value) == dbus.Int32 or type(dbus_value) == dbus.UInt32:
+ return int(dbus_value)
+ return dbus_value
+
+
+def python_type_to_jackdbus_type(value, type_char):
+ type_char = str(type_char)
+
+ if type_char == "b":
+ return bool_convert(value)
+ elif type_char == "y":
+ return dbus.Byte(value)
+ elif type_char == "i":
+ return dbus.Int32(value)
+ elif type_char == "u":
+ return dbus.UInt32(value)
+ elif type_char == "s":
+ return dbus.String(value)
+
+ return value