@@ -1387,85 +1387,132 @@ Also known as buffer size</string> | |||
<item> | |||
<layout class="QHBoxLayout" name="horizontalLayout"> | |||
<item> | |||
<layout class="QGridLayout" name="gridLayout_16"> | |||
<item row="1" column="1"> | |||
<widget class="QSpinBox" name="obj_net_multicast_port"/> | |||
</item> | |||
<item row="2" column="0"> | |||
<widget class="QLabel" name="label_3"> | |||
<property name="text"> | |||
<string>Auto Connect</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="0" column="0"> | |||
<widget class="QLabel" name="label"> | |||
<property name="text"> | |||
<string>Multicast Ip</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="4" column="1"> | |||
<spacer name="verticalSpacer_6"> | |||
<property name="orientation"> | |||
<enum>Qt::Vertical</enum> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>20</width> | |||
<height>40</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
</item> | |||
<item row="0" column="1"> | |||
<widget class="QLineEdit" name="obj_net_multicast_ip"/> | |||
</item> | |||
<item row="1" column="0"> | |||
<widget class="QLabel" name="label_2"> | |||
<property name="text"> | |||
<string>Udp Net Port</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="3" column="0"> | |||
<widget class="QLabel" name="label_4"> | |||
<property name="text"> | |||
<string>Auto Save</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="2" column="1"> | |||
<widget class="QCheckBox" name="obj_net_auto_connect"> | |||
<property name="text"> | |||
<string/> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="3" column="1"> | |||
<widget class="QCheckBox" name="obj_net_auto_save"> | |||
<property name="text"> | |||
<string/> | |||
</property> | |||
</widget> | |||
</item> | |||
</layout> | |||
</item> | |||
<item> | |||
<layout class="QVBoxLayout" name="verticalLayout_4"/> | |||
<widget class="QGroupBox" name=""> | |||
<property name="title"> | |||
<string>Settings</string> | |||
</property> | |||
<layout class="QGridLayout" name="gridLayout_16"> | |||
<item row="1" column="1"> | |||
<widget class="QSpinBox" name="obj_net_multicast_port"> | |||
<property name="maximum"> | |||
<number>65536</number> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="2" column="0"> | |||
<widget class="QLabel" name="label_3"> | |||
<property name="text"> | |||
<string>Auto Connect Ports</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="0" column="0"> | |||
<widget class="QLabel" name="label"> | |||
<property name="text"> | |||
<string>Multicast Ip</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="4" column="1"> | |||
<spacer name="verticalSpacer_6"> | |||
<property name="orientation"> | |||
<enum>Qt::Vertical</enum> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>20</width> | |||
<height>40</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
</item> | |||
<item row="0" column="1"> | |||
<widget class="QLineEdit" name="obj_net_multicast_ip"/> | |||
</item> | |||
<item row="1" column="0"> | |||
<widget class="QLabel" name="label_2"> | |||
<property name="text"> | |||
<string>Udp Net Port</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="3" column="0"> | |||
<widget class="QLabel" name="label_4"> | |||
<property name="text"> | |||
<string>Auto Save</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="2" column="1"> | |||
<widget class="QCheckBox" name="obj_net_auto_connect"> | |||
<property name="text"> | |||
<string/> | |||
</property> | |||
</widget> | |||
</item> | |||
<item row="3" column="1"> | |||
<widget class="QCheckBox" name="obj_net_auto_save"> | |||
<property name="text"> | |||
<string/> | |||
</property> | |||
</widget> | |||
</item> | |||
</layout> | |||
</widget> | |||
</item> | |||
<item> | |||
<spacer name="horizontalSpacer_6"> | |||
<property name="orientation"> | |||
<enum>Qt::Horizontal</enum> | |||
<widget class="QGroupBox" name=""> | |||
<property name="title"> | |||
<string>Controls</string> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>40</width> | |||
<height>20</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
<layout class="QVBoxLayout" name="verticalLayout_4"> | |||
<item> | |||
<widget class="QCheckBox" name="obj_net_manager_at_boot"> | |||
<property name="text"> | |||
<string>Start at Boot</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<widget class="QPushButton" name="obj_net_reset"> | |||
<property name="text"> | |||
<string>Reset Network Settings</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<layout class="QHBoxLayout" name="horizontalLayout_6"> | |||
<item> | |||
<widget class="QPushButton" name="obj_net_manager_start"> | |||
<property name="text"> | |||
<string>Start</string> | |||
</property> | |||
</widget> | |||
</item> | |||
<item> | |||
<widget class="QPushButton" name="obj_net_manager_stop"> | |||
<property name="text"> | |||
<string>Stop</string> | |||
</property> | |||
</widget> | |||
</item> | |||
</layout> | |||
</item> | |||
<item> | |||
<spacer name="verticalSpacer_7"> | |||
<property name="orientation"> | |||
<enum>Qt::Vertical</enum> | |||
</property> | |||
<property name="sizeHint" stdset="0"> | |||
<size> | |||
<width>20</width> | |||
<height>40</height> | |||
</size> | |||
</property> | |||
</spacer> | |||
</item> | |||
</layout> | |||
</widget> | |||
</item> | |||
</layout> | |||
</item> | |||
@@ -1373,6 +1373,10 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): | |||
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) | |||
@@ -2386,7 +2390,7 @@ if __name__ == '__main__': | |||
if haveDBus: | |||
gDBus.loop = DBusQtMainLoop(set_as_default=True) | |||
gDBus.bus = dbus.SessionBus(mainloop=gDBus.loop) | |||
gDBus.bus = dbus.SessionBus(mainloop=gDBus.loop) | |||
initSystemChecks() | |||
@@ -30,6 +30,7 @@ else: | |||
from PyQt4.QtGui import QFontMetrics | |||
from PyQt4.QtGui import QDialog, QDialogButtonBox, QMessageBox | |||
from shared_cadence import * | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Imports (Custom Stuff) | |||
@@ -75,13 +76,17 @@ else: | |||
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 @@ class JackSettingsW(QDialog): | |||
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 @@ class JackSettingsW(QDialog): | |||
self.checkEngine() | |||
self.loadServerSettings() | |||
self.loadDriverSettings(True) # reset because we'll change it below | |||
self.loadNetSettings() | |||
# ------------------------------------------------------------- | |||
# Load selected JACK driver | |||
@@ -716,6 +726,83 @@ class JackSettingsW(QDialog): | |||
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 | |||
@@ -779,6 +866,7 @@ class JackSettingsW(QDialog): | |||
# 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()) | |||
@@ -900,10 +988,27 @@ class JackSettingsW(QDialog): | |||
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): | |||
@@ -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 |