diff --git a/data/cadence-pulse2jack b/data/cadence-pulse2jack index 5266cb9..bf667cb 100755 --- a/data/cadence-pulse2jack +++ b/data/cadence-pulse2jack @@ -43,38 +43,66 @@ else fi # ---------------------------------------------- +wanted_capture_ports=0 # -1 means default +wanted_playback_ports=0 # -1 means default -PLAY_ONLY="no" +arg_is_for="" -case $1 in - -h|--h|--help) -echo "usage: $0 [command] +for arg in "$@";do + case "$arg" in + -h|--h|--help) + echo "usage: $0 [command] + + -p Playback only with default number of channels + -p Number of playback channels + -c Capture only with default number of channels + -c Number of capture channels - -p, --play Playback mode only + -h, --help Show this help menu + --dummy Don't do anything, just create the needed files - -h, --help Show this help menu - --dummy Don't do anything, just create the needed files + NOTE: + When runned with no arguments, $(basename "$0") will + activate PulseAudio with both playback and record modes with default number of channels. + " + exit + ;; + --dummy) + exit + ;; + -c|--capture) + arg_is_for="capture" + wanted_capture_ports=-1 # -1 means default, if no (correct) argument is given. + ;; + -p|--play|--playback) + arg_is_for="playback" + wanted_playback_ports=-1 + ;; + * ) + case "$arg_is_for" in + "capture") + [ "$arg" -ge 0 ] 2>/dev/null && wanted_capture_ports="$arg" + ;; + "playback") + [ "$arg" -ge 0 ] 2>/dev/null && wanted_playback_ports="$arg" + ;; + esac + ;; + esac +done -NOTE: - When runned with no arguments, pulse2jack will - activate PulseAudio with both playback and record modes. -" -exit - ;; - --dummy) -exit - ;; +if [ $wanted_capture_ports == 0 ] && [ $wanted_playback_ports == 0 ];then + #no sense to want to start/bridge pulseaudio without ports, set as default + capture_ports=-1 # -1 means default + playback_ports=-1 # -1 means default +fi - -p|--p|--play) -PLAY_ONLY="yes" -FILE=$INSTALL_PREFIX/share/cadence/pulse2jack/play.pa - ;; +str_capture="channels=$wanted_capture_ports" #used for pulseaudio commands +str_playback="channels=$wanted_playback_ports" ## - *) -FILE=$INSTALL_PREFIX/share/cadence/pulse2jack/play+rec.pa - ;; -esac +[ $wanted_capture_ports == -1 ] && str_capture="" # -1 means default, no command channels=n +[ $wanted_playback_ports == -1 ] && str_playback="" ## # ---------------------------------------------- @@ -88,40 +116,166 @@ IsPulseAudioRunning() fi } -if (IsPulseAudioRunning); then +StartBridged() { - if (`jack_lsp | grep "PulseAudio JACK Sink:" > /dev/null`); then - { - echo "PulseAudio is already running and bridged to JACK" - } + #write pulseaudio config file in a tmp file + pa_file=$(mktemp --suffix .pa) + echo .fail > $pa_file + + ### Automatically restore the volume of streams and devices + echo load-module module-device-restore >> $pa_file + echo load-module module-stream-restore >> $pa_file + echo load-module module-card-restore >> $pa_file + + ### Load Jack modules + [ $wanted_capture_ports != 0 ] && echo load-module module-jack-source $str_capture >> $pa_file + [ $wanted_playback_ports != 0 ] && echo load-module module-jack-sink $str_playback >> $pa_file + + ### Load unix protocol + echo load-module module-native-protocol-unix >> $pa_file + + ### Automatically restore the default sink/source when changed by the user + ### during runtime + ### NOTE: This should be loaded as early as possible so that subsequent modules + ### that look up the default sink/source get the right value + echo load-module module-default-device-restore >> $pa_file + + ### Automatically move streams to the default sink if the sink they are + ### connected to dies, similar for sources + echo load-module module-rescue-streams >> $pa_file + + ### Make sure we always have a sink around, even if it is a null sink. + echo load-module module-always-sink >> $pa_file + + ### Make Jack default + [ $wanted_capture_ports != 0 ] && echo set-default-source jack_in >> $pa_file + [ $wanted_playback_ports != 0 ] && echo set-default-sink jack_out >> $pa_file + + if (`pulseaudio --daemonize --high-priority --realtime --exit-idle-time=-1 --file=$pa_file -n`); then + echo "Initiated PulseAudio successfully!" else - { - echo "PulseAudio is already running, bridge it..." + echo "Failed to initialize PulseAudio!" + fi +} - if [ "$PLAY_ONLY" == "yes" ]; then - { - pactl load-module module-jack-sink > /dev/null - pacmd set-default-source jack_in > /dev/null - } - else - { - pactl load-module module-jack-sink > /dev/null - pactl load-module module-jack-source > /dev/null - pacmd set-default-sink jack_out > /dev/null +killReStart() +{ + pulseaudio -k && StartBridged + exit +} + +JackNotRunning() +{ + echo "JACK seems not running, start JACK before bridge PulseAudio" + exit 1 +} + +if (IsPulseAudioRunning); then +{ + #count all Jack Audio Physical ports + all_jack_lsp=$(jack_lsp -p -t) || JackNotRunning + output_physical_lines=$(echo "$all_jack_lsp"|grep -n "output,physical,"|cut -d':' -f1) + input_physical_lines=$( echo "$all_jack_lsp"|grep -n "input,physical," |cut -d':' -f1) + audio_lines=$(echo "$all_jack_lsp" |grep -n " audio"|cut -d':' -f1) + + capture_physical_ports=0 + playback_physical_ports=0 + + for out_phy_line in $output_physical_lines;do + if echo "$audio_lines"|grep -q $(($out_phy_line + 1));then + ((capture_physical_ports++)) + fi + done + + for in_phy_line in $input_physical_lines;do + if echo "$audio_lines"|grep -q $(($in_phy_line + 1));then + ((playback_physical_ports++)) + fi + done + + #count PulseAudio jack ports + current_playback_ports=$(echo "$all_jack_lsp"|grep ^"PulseAudio JACK Sink:" |wc -l) + current_capture_ports=$( echo "$all_jack_lsp"|grep ^"PulseAudio JACK Source:"|wc -l) + + #if number of pulseaudio ports equal to physical ports, consider pulseaudio module is running the default mode (no channels=n) + [ $current_capture_ports == $capture_physical_ports ] && current_capture_ports=-1 + [ $current_playback_ports == $playback_physical_ports ] && current_playback_ports=-1 + [ $wanted_capture_ports == $capture_physical_ports ] && wanted_capture_ports=-1 + [ $wanted_playback_ports == $playback_physical_ports ] && wanted_playback_ports=-1 + + if [ $wanted_capture_ports == $current_capture_ports ] && [ $wanted_playback_ports == $current_playback_ports ];then + echo "PulseAudio is already started and bridged to Jack with $current_capture_ports inputs and $current_playback_ports outputs, nothing to do !" + exit + fi + + if [ $current_capture_ports != $wanted_capture_ports ];then + if [ $current_capture_ports != 0 ];then + echo "unload PulseAudio JACK Source" + pactl unload-module module-jack-source > /dev/null || killReStart + fi + + if [ $wanted_capture_ports != 0 ];then + echo "load PulseAudio JACK Source $str_capture" + + pactl load-module module-jack-source $str_capture > /dev/null pacmd set-default-source jack_in > /dev/null - } fi - - echo "Done" - } + fi + + if [ $current_playback_ports != $wanted_playback_ports ];then + if [ $current_playback_ports != 0 ];then + echo "unload PulseAudio JACK Sink" + pactl unload-module module-jack-sink > /dev/null || killReStart + fi + + if [ $wanted_playback_ports != 0 ];then + echo "load PulseAudio JACK Sink $str_playback" + + pactl load-module module-jack-sink $str_playback > /dev/null + pactl set-default-sink jack_out > /dev/null + fi fi } else -{ - if (`pulseaudio --daemonize --high-priority --realtime --exit-idle-time=-1 --file=$FILE -n`); then - echo "Initiated PulseAudio successfully!" - else - echo "Failed to initialize PulseAudio!" - fi +{ + StartBridged +# #write pulseaudio config file in a tmp file +# pa_file=$(mktemp --suffix .pa) +# echo .fail > $pa_file +# +# ### Automatically restore the volume of streams and devices +# echo load-module module-device-restore >> $pa_file +# echo load-module module-stream-restore >> $pa_file +# echo load-module module-card-restore >> $pa_file +# +# ### Load Jack modules +# [ $wanted_capture_ports != 0 ] && echo load-module module-jack-source $str_capture >> $pa_file +# [ $wanted_playback_ports != 0 ] && echo load-module module-jack-sink $str_playback >> $pa_file +# +# ### Load unix protocol +# echo load-module module-native-protocol-unix >> $pa_file +# +# ### Automatically restore the default sink/source when changed by the user +# ### during runtime +# ### NOTE: This should be loaded as early as possible so that subsequent modules +# ### that look up the default sink/source get the right value +# echo load-module module-default-device-restore >> $pa_file +# +# ### Automatically move streams to the default sink if the sink they are +# ### connected to dies, similar for sources +# echo load-module module-rescue-streams >> $pa_file +# +# ### Make sure we always have a sink around, even if it is a null sink. +# echo load-module module-always-sink >> $pa_file +# +# ### Make Jack default +# [ $wanted_capture_ports != 0 ] && echo set-default-source jack_in >> $pa_file +# [ $wanted_playback_ports != 0 ] && echo set-default-sink jack_out >> $pa_file +# +# if (`pulseaudio --daemonize --high-priority --realtime --exit-idle-time=-1 --file=$pa_file -n`); then +# echo "Initiated PulseAudio successfully!" +# else +# echo "Failed to initialize PulseAudio!" +# fi } fi diff --git a/resources/ui/cadence.ui b/resources/ui/cadence.ui index 267f04d..5404e52 100644 --- a/resources/ui/cadence.ui +++ b/resources/ui/cadence.ui @@ -7,7 +7,7 @@ 0 0 740 - 564 + 680 @@ -544,7 +544,16 @@ JACK Bridges - + + 2 + + + 2 + + + 2 + + 2 @@ -572,8 +581,8 @@ 0 0 - 360 - 100 + 435 + 130 @@ -720,8 +729,8 @@ 0 0 - 360 - 97 + 435 + 130 @@ -854,8 +863,8 @@ 0 0 - 360 - 97 + 435 + 130 @@ -916,6 +925,13 @@ + + + + Channels + + + @@ -956,13 +972,6 @@ - - - - ... - - - @@ -1572,7 +1581,7 @@ Audio Plugins PATH - AlignHCenter|AlignVCenter|AlignCenter + AlignCenter ItemIsSelectable|ItemIsEnabled @@ -1583,7 +1592,7 @@ Default Applications - AlignHCenter|AlignVCenter|AlignCenter + AlignCenter ItemIsSelectable|ItemIsEnabled @@ -1594,7 +1603,7 @@ WineASIO - AlignHCenter|AlignVCenter|AlignCenter + AlignCenter ItemIsSelectable|ItemIsEnabled @@ -1613,7 +1622,16 @@ - + + 0 + + + 0 + + + 0 + + 0 @@ -1681,8 +1699,8 @@ 0 0 - 416 - 334 + 413 + 401 @@ -1711,8 +1729,8 @@ 0 0 - 94 - 66 + 96 + 86 @@ -1741,8 +1759,8 @@ 0 0 - 94 - 66 + 96 + 86 @@ -1771,8 +1789,8 @@ 0 0 - 94 - 66 + 96 + 86 @@ -1832,12 +1850,21 @@ - - 20 + + 0 + + + 0 + + + 0 - + 0 + + 20 + @@ -2063,7 +2090,16 @@ - + + 0 + + + 0 + + + 0 + + 0 diff --git a/resources/ui/cadence_tb_pa.ui b/resources/ui/cadence_tb_pa.ui index ed31ef4..b2d76c1 100644 --- a/resources/ui/cadence_tb_pa.ui +++ b/resources/ui/cadence_tb_pa.ui @@ -6,8 +6,8 @@ 0 0 - 317 - 72 + 218 + 124 @@ -15,11 +15,60 @@ - - - Playback Mode only - - + + + + + Input Channels : + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Output Channels : + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Default + + + -1 + + + 10 + + + -1 + + + + + + + Default + + + -1 + + + 10 + + + -1 + + + + diff --git a/src/cadence.py b/src/cadence.py index 8b5192f..b1b9e84 100755 --- a/src/cadence.py +++ b/src/cadence.py @@ -116,10 +116,15 @@ XDG_APPLICATIONS_PATH = [ WINEASIO_PREFIX = "HKEY_CURRENT_USER\Software\Wine\WineASIO" # --------------------------------------------------------------------- +class PulseAudioJackBridgeValues(object): + clientIdCapture = -1 + clientIdPlayback = -1 + portCaptureNumber = 0 + portPlaybackNumber = 0 -global jackClientIdALSA, jackClientIdPulse -jackClientIdALSA = -1 -jackClientIdPulse = -1 +global jackClientIdALSA +jackClientIdALSA = -1 +pA_bridge_values = PulseAudioJackBridgeValues() # jackdbus indexes iGraphVersion = 0 @@ -333,8 +338,7 @@ def isPulseAudioStarted(): return bool("pulseaudio" in getProcList()) def isPulseAudioBridged(): - global jackClientIdPulse - return bool(jackClientIdPulse != -1) + return bool(pA_bridge_values.clientIdCapture != -1 or pA_bridge_values.clientIdPlayback != -1) def isDesktopFileInstalled(desktop): for X_PATH in XDG_APPLICATIONS_PATH: @@ -581,10 +585,10 @@ class ForceRestartThread(QThread): # PulseAudio if GlobalSettings.value("Pulse2JACK/AutoStart", True, type=bool) and not isPulseAudioBridged(): - if GlobalSettings.value("Pulse2JACK/PlaybackModeOnly", False, type=bool): - os.system("cadence-pulse2jack -p") - else: - os.system("cadence-pulse2jack") + inputs = GlobalSettings.value("Pulse2JACK/CaptureChannels", -1, type=int) + outputs = GlobalSettings.value("Pulse2JACK/PlaybackChannels", -1, type=int) + + os.system("cadence-pulse2jack -c %s -p %s" % (str(inputs), str(outputs))) self.progressChanged.emit(100) @@ -718,18 +722,24 @@ class ToolBarAlsaAudioDialog(QDialog, ui_cadence_tb_alsa.Ui_Dialog): self.close() # Additional PulseAudio options -class ToolBarPADialog(QDialog, ui_cadence_tb_pa.Ui_Dialog): +class PAChannelsDialog(QDialog, ui_cadence_tb_pa.Ui_Dialog): def __init__(self, parent): QDialog.__init__(self, parent) self.setupUi(self) + self.parent = parent + + self.spinBoxPulseInputs.setValue(GlobalSettings.value("Pulse2JACK/CaptureChannels", 2, type=int)) + self.spinBoxPulseOutputs.setValue(GlobalSettings.value("Pulse2JACK/PlaybackChannels", 2, type=int)) - self.cb_playback_only.setChecked(GlobalSettings.value("Pulse2JACK/PlaybackModeOnly", False, type=bool)) - - self.accepted.connect(self.slot_setOptions) + self.accepted.connect(self.slot_updateChannels) @pyqtSlot() - def slot_setOptions(self): - GlobalSettings.setValue("Pulse2JACK/PlaybackModeOnly", self.cb_playback_only.isChecked()) + def slot_updateChannels(self): + GlobalSettings.setValue("Pulse2JACK/CaptureChannels", self.spinBoxPulseInputs.value()) + GlobalSettings.setValue("Pulse2JACK/PlaybackChannels", self.spinBoxPulseOutputs.value()) + + if isPulseAudioBridged(): + self.parent.slot_PulseAudioBridgeStart() def done(self, r): QDialog.done(self, r) @@ -739,8 +749,10 @@ class ToolBarPADialog(QDialog, ui_cadence_tb_pa.Ui_Dialog): class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): DBusJackServerStartedCallback = pyqtSignal() DBusJackServerStoppedCallback = pyqtSignal() - DBusJackClientAppearedCallback = pyqtSignal(int, str) + DBusJackClientAppearedCallback = pyqtSignal(int, str) DBusJackClientDisappearedCallback = pyqtSignal(int) + DBusJackPortAppearedCallback = pyqtSignal(int) + DBusJackPortDisappearedCallback = pyqtSignal(int) DBusA2JBridgeStartedCallback = pyqtSignal() DBusA2JBridgeStoppedCallback = pyqtSignal() @@ -1066,6 +1078,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.systray.addMenu("pulse", self.tr("PulseAudio Bridge")) self.systray.addMenuAction("pulse", "pulse_start", self.tr("Start")) self.systray.addMenuAction("pulse", "pulse_stop", self.tr("Stop")) + self.systray.addMenuAction("pulse", "pulse_channels", self.tr("Channels")) self.systray.setActionIcon("jack_start", "media-playback-start") self.systray.setActionIcon("jack_stop", "media-playback-stop") @@ -1076,6 +1089,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.systray.setActionIcon("a2j_stop", "media-playback-stop") self.systray.setActionIcon("pulse_start", "media-playback-start") self.systray.setActionIcon("pulse_stop", "media-playback-stop") + self.systray.setActionIcon("pulse_channels", "audio-card") self.systray.connect("jack_start", self.slot_JackServerStart) self.systray.connect("jack_stop", self.slot_JackServerStop) @@ -1086,6 +1100,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.systray.connect("a2j_stop", self.slot_A2JBridgeStop) self.systray.connect("pulse_start", self.slot_PulseAudioBridgeStart) self.systray.connect("pulse_stop", self.slot_PulseAudioBridgeStop) + self.systray.connect("pulse_channels", self.slot_PulseAudioBridgeChannels) self.systray.addMenu("tools", self.tr("Tools")) self.systray.addMenuAction("tools", "app_catarina", "Catarina") @@ -1128,9 +1143,10 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.b_a2j_start.clicked.connect(self.slot_A2JBridgeStart) self.b_a2j_stop.clicked.connect(self.slot_A2JBridgeStop) + self.b_pulse_start.clicked.connect(self.slot_PulseAudioBridgeStart) self.b_pulse_stop.clicked.connect(self.slot_PulseAudioBridgeStop) - self.tb_pulse_options.clicked.connect(self.slot_PulseAudioBridgeOptions) + self.b_pulse_channels.clicked.connect(self.slot_PulseAudioBridgeChannels) self.pic_catia.clicked.connect(self.func_start_catia) self.pic_claudia.clicked.connect(self.func_start_claudia) @@ -1182,6 +1198,8 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): # org.jackaudio.JackPatchbay self.DBusJackClientAppearedCallback.connect(self.slot_DBusJackClientAppearedCallback) self.DBusJackClientDisappearedCallback.connect(self.slot_DBusJackClientDisappearedCallback) + self.DBusJackPortAppearedCallback.connect(self.slot_DBusJackPortAppearedCallback) + self.DBusJackPortDisappearedCallback.connect(self.slot_DBusJackPortDisappearedCallback) # org.gna.home.a2jmidid.control self.DBusA2JBridgeStartedCallback.connect(self.slot_DBusA2JBridgeStartedCallback) @@ -1230,9 +1248,12 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): if group_name == "alsa2jack": global jackClientIdALSA jackClientIdALSA = group_id + elif group_name == "PulseAudio JACK Source": + pA_bridge_values.clientIdCapture = group_id + pA_bridge_values.portCaptureNumber = len(ports) elif group_name == "PulseAudio JACK Sink": - global jackClientIdPulse - jackClientIdPulse = group_id + pA_bridge_values.clientIdPlayback = group_id + pA_bridge_values.portPlaybackNumber = len(ports) self.jackStarted() @@ -1298,6 +1319,10 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.DBusJackClientAppearedCallback.emit(args[iJackClientId], args[iJackClientName]) elif kwds['member'] == "ClientDisappeared": self.DBusJackClientDisappearedCallback.emit(args[iJackClientId]) + elif kwds['member'] == "PortAppeared": + self.DBusJackPortAppearedCallback.emit(args[iJackClientId]) + elif kwds['member'] == "PortDisappeared": + self.DBusJackPortDisappearedCallback.emit(args[iJackClientId]) elif kwds['interface'] == "org.gna.home.a2jmidid.control": if DEBUG: print("org.gna.home.a2jmidid.control", kwds['member']) @@ -1378,10 +1403,12 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): if gDBus.a2j: self.b_a2j_start.setEnabled(False) self.systray.setActionEnabled("a2j_start", False) - - global jackClientIdALSA, jackClientIdPulse - jackClientIdALSA = -1 - jackClientIdPulse = -1 + + global jackClientIdALSA + jackClientIdALSA = -1 + + pA_bridge_values.clientIdCapture = -1 + pA_bridge_values.clientIdPlayback = -1 if haveDBus: self.checkAlsaAudio() @@ -1484,7 +1511,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.b_pulse_stop.setEnabled(True) self.systray.setActionEnabled("pulse_start", False) self.systray.setActionEnabled("pulse_stop", True) - self.label_bridge_pulse.setText(self.tr("PulseAudio is started and bridged to JACK")) + self.label_bridge_pulse.setText(self.tr("PulseAudio is started and bridged to JACK with %s inputs/%s outputs") % (pA_bridge_values.portCaptureNumber, pA_bridge_values.portPlaybackNumber)) else: jackRunning = bool(gDBus.jack and gDBus.jack.IsStarted()) self.b_pulse_start.setEnabled(jackRunning) @@ -1620,21 +1647,46 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): global jackClientIdALSA jackClientIdALSA = group_id self.checkAlsaAudio() + elif group_name == "PulseAudio JACK Source": + pA_bridge_values.clientIdCapture = group_id + self.checkPulseAudio() elif group_name == "PulseAudio JACK Sink": - global jackClientIdPulse - jackClientIdPulse = group_id + pA_bridge_values.clientIdPlayback = group_id self.checkPulseAudio() @pyqtSlot(int) def slot_DBusJackClientDisappearedCallback(self, group_id): - global jackClientIdALSA, jackClientIdPulse + global jackClientIdALSA if group_id == jackClientIdALSA: jackClientIdALSA = -1 self.checkAlsaAudio() - elif group_id == jackClientIdPulse: - jackClientIdPulse = -1 + elif group_id == pA_bridge_values.clientIdCapture: + pA_bridge_values.clientIdCapture = -1 + pA_bridge_values.portCaptureNumber = 0 self.checkPulseAudio() - + elif group_id == pA_bridge_values.clientIdPlayback: + pA_bridge_values.clientIdPlayback = -1 + pA_bridge_values.portPlaybackNumber = 0 + self.checkPulseAudio() + + @pyqtSlot(int) + def slot_DBusJackPortAppearedCallback(self, group_id): + if group_id == pA_bridge_values.clientIdCapture: + pA_bridge_values.portCaptureNumber+=1 + self.checkPulseAudio() + elif group_id == pA_bridge_values.clientIdPlayback: + pA_bridge_values.portPlaybackNumber+=1 + self.checkPulseAudio() + + @pyqtSlot(int) + def slot_DBusJackPortDisappearedCallback(self, group_id): + if group_id == pA_bridge_values.clientIdCapture: + pA_bridge_values.portCaptureNumber+=1 + self.checkPulseAudio() + elif group_id == pA_bridge_values.clientIdPlayback: + pA_bridge_values.portPlaybackNumber+=1 + self.checkPulseAudio() + @pyqtSlot() def slot_DBusA2JBridgeStartedCallback(self): self.a2jStarted() @@ -1788,18 +1840,18 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): @pyqtSlot() def slot_PulseAudioBridgeStart(self): - if GlobalSettings.value("Pulse2JACK/PlaybackModeOnly", False, type=bool): - os.system("cadence-pulse2jack -p") - else: - os.system("cadence-pulse2jack") + inputs = GlobalSettings.value("Pulse2JACK/CaptureChannels", 2, type=int) + outputs = GlobalSettings.value("Pulse2JACK/PlaybackChannels", 2, type=int) + + os.system("cadence-pulse2jack -c %s -p %s" % (str(inputs), str(outputs))) @pyqtSlot() def slot_PulseAudioBridgeStop(self): os.system("pulseaudio -k") @pyqtSlot() - def slot_PulseAudioBridgeOptions(self): - ToolBarPADialog(self).exec_() + def slot_PulseAudioBridgeChannels(self): + PAChannelsDialog(self).exec_() @pyqtSlot() def slot_handleCrash_jack(self):