diff --git a/resources/ui/cadence.ui b/resources/ui/cadence.ui index 1a3016a..7fa44c6 100644 --- a/resources/ui/cadence.ui +++ b/resources/ui/cadence.ui @@ -720,8 +720,8 @@ 0 0 - 360 - 97 + 290 + 77 @@ -861,8 +861,8 @@ 0 0 - 360 - 97 + 204 + 77 @@ -1079,7 +1079,7 @@ :/screens/catia.png - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignCenter @@ -1126,7 +1126,7 @@ :/screens/claudia.png - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignCenter @@ -1173,7 +1173,7 @@ :/screens/cadence-jackmeter.png - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignCenter @@ -1270,7 +1270,7 @@ :/screens/cadence-logs.png - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignCenter @@ -1317,7 +1317,7 @@ :/screens/cadence-render.png - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignCenter @@ -1364,7 +1364,7 @@ :/screens/cadence-xycontroller.png - Qt::AlignHCenter|Qt::AlignTop + Qt::AlignCenter @@ -1671,8 +1671,8 @@ 0 0 - 416 - 334 + 94 + 66 @@ -1701,7 +1701,7 @@ 0 0 - 89 + 94 66 @@ -1731,7 +1731,7 @@ 0 0 - 89 + 94 66 @@ -1761,8 +1761,8 @@ 0 0 - 416 - 334 + 94 + 66 diff --git a/resources/ui/cadence_tb_alsa.ui b/resources/ui/cadence_tb_alsa.ui index 431fac5..c9467e6 100644 --- a/resources/ui/cadence_tb_alsa.ui +++ b/resources/ui/cadence_tb_alsa.ui @@ -15,17 +15,119 @@ - - - This is your current ~/.asoundrc file: + + + 0 + + + + 0 + + + + + This is your current ~/.asoundrc file: + + + + + + + + + + + + + + Number of channels: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 2 + + + 16 + + + + + + + Bridge tool: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + alsa_in/out + + + + + zita_a2j/j2a (EXPERIMENTAL) + + + + + + - + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + - + + + buttonBox + accepted() + Dialog + accept() + + + 255 + 440 + + + 255 + 229 + + + + + buttonBox + rejected() + Dialog + reject() + + + 255 + 440 + + + 255 + 229 + + + + diff --git a/src/cadence.py b/src/cadence.py index 606a0ab..7626644 100755 --- a/src/cadence.py +++ b/src/cadence.py @@ -21,7 +21,7 @@ from platform import architecture from PyQt4.QtCore import QFileSystemWatcher, QThread -from PyQt4.QtGui import QApplication, QLabel, QMainWindow, QSizePolicy +from PyQt4.QtGui import QApplication, QDialogButtonBox, QLabel, QMainWindow, QSizePolicy # ------------------------------------------------------------------------------------------------------------ # Imports (Custom Stuff) @@ -96,6 +96,7 @@ DESKTOP_X_TEXT = [ DESKTOP_X_BROWSER = [ "chrome.desktop", "firefox.desktop", + "iceweasel.desktop", "kde4/konqbrowser.desktop" ] @@ -548,7 +549,7 @@ class ForceRestartThread(QThread): # ALSA-Audio if GlobalSettings.value("ALSA-Audio/BridgeIndexType", iAlsaFileNone, type=int) == iAlsaFileLoop: - os.system("cadence-aloop-daemon &") + startAlsaAudioLoopBridge() sleep(0.5) self.emit(SIGNAL("progressChanged(int)"), 94) @@ -657,16 +658,43 @@ class ToolBarJackDialog(QDialog, ui_cadence_tb_jack.Ui_Dialog): # Additional ALSA Audio options class ToolBarAlsaAudioDialog(QDialog, ui_cadence_tb_alsa.Ui_Dialog): - def __init__(self, parent): + def __init__(self, parent, customMode): QDialog.__init__(self, parent) self.setupUi(self) - asoundrcFile = os.path.join(HOME, ".asoundrc") - asoundrcFd = open(asoundrcFile, "r") - asoundrcRead = asoundrcFd.read().strip() - asoundrcFd.close() + self.asoundrcFile = os.path.join(HOME, ".asoundrc") + self.fCustomMode = customMode + + if customMode: + asoundrcFd = open(self.asoundrcFile, "r") + asoundrcRead = asoundrcFd.read().strip() + asoundrcFd.close() + self.textBrowser.setPlainText(asoundrcRead) + self.stackedWidget.setCurrentIndex(0) + self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel) + else: + self.textBrowser.hide() + self.stackedWidget.setCurrentIndex(1) + self.adjustSize() + + self.spinBox.setValue(GlobalSettings.value("ALSA-Audio/BridgeChannels", 2, type=int)) + + if GlobalSettings.value("ALSA-Audio/BridgeTool", "alsa_in", type=str) == "zita": + self.comboBox.setCurrentIndex(1) + else: + self.comboBox.setCurrentIndex(0) + + self.connect(self, SIGNAL("accepted()"), SLOT("slot_setOptions()")) + + @pyqtSlot() + def slot_setOptions(self): + channels = self.spinBox.value() + GlobalSettings.setValue("ALSA-Audio/BridgeChannels", channels) + GlobalSettings.setValue("ALSA-Audio/BridgeTool", "zita" if (self.comboBox.currentIndex() == 1) else "alsa_in") - self.textBrowser.setPlainText(asoundrcRead) + asoundrcFd = open(self.asoundrcFile, "w") + asoundrcFd.write(asoundrc_aloop.replace("channels 2\n", "channels %i\n" % channels) + "\n") + asoundrcFd.close() def done(self, r): QDialog.done(self, r) @@ -840,6 +868,10 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.toolBox_pulseaudio.setEnabled(False) self.label_bridge_pulse.setText(self.tr("PulseAudio is not installed")) + # Not available in cxfreeze builds + if sys.argv[0].endswith("/cadence"): + self.groupBox_bridges.setEnabled(False) + # ------------------------------------------------------------- # Set-up GUI (Tweaks) @@ -1379,7 +1411,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.label_bridge_alsa.setText(self.tr("Using Cadence snd-aloop daemon, stopped")) self.cb_alsa_type.setCurrentIndex(iAlsaFileLoop) - self.tb_alsa_options.setEnabled(False) + self.tb_alsa_options.setEnabled(True) elif asoundrcRead == asoundrc_jack: self.b_alsa_start.setEnabled(False) @@ -1388,7 +1420,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.systray.setActionEnabled("alsa_stop", False) self.cb_alsa_type.setCurrentIndex(iAlsaFileJACK) self.tb_alsa_options.setEnabled(False) - self.label_bridge_alsa.setText(self.tr("Using JACK plugin bridge")) + self.label_bridge_alsa.setText(self.tr("Using JACK plugin bridge (Always on)")) elif asoundrcRead == asoundrc_pulse: self.b_alsa_start.setEnabled(False) @@ -1397,7 +1429,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): self.systray.setActionEnabled("alsa_stop", False) self.cb_alsa_type.setCurrentIndex(iAlsaFilePulse) self.tb_alsa_options.setEnabled(False) - self.label_bridge_alsa.setText(self.tr("Using PulseAudio plugin bridge")) + self.label_bridge_alsa.setText(self.tr("Using PulseAudio plugin bridge (Always on)")) else: self.b_alsa_start.setEnabled(False) @@ -1610,7 +1642,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): @pyqtSlot() def slot_AlsaBridgeStart(self): self.slot_AlsaBridgeStop() - self.func_start_tool("cadence-aloop-daemon") + startAlsaAudioLoopBridge() @pyqtSlot() def slot_AlsaBridgeStop(self): @@ -1669,7 +1701,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW): @pyqtSlot() def slot_AlsaAudioBridgeOptions(self): - ToolBarAlsaAudioDialog(self).exec_() + ToolBarAlsaAudioDialog(self, (self.cb_alsa_type.currentIndex() != iAlsaFileLoop)).exec_() @pyqtSlot() def slot_A2JBridgeStart(self): diff --git a/src/cadence_aloop_daemon.py b/src/cadence_aloop_daemon.py index 563b09d..49a58cd 100755 --- a/src/cadence_aloop_daemon.py +++ b/src/cadence_aloop_daemon.py @@ -1,13 +1,33 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +# Cadence ALSA-Loop daemon +# Copyright (C) 2012-2013 Filipe Coelho +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# For a full copy of the GNU General Public License see the COPYING file + +# ------------------------------------------------------------------------------------------------------------ # Imports (Global) -import os, sys + +import os +import sys from signal import signal, SIGINT, SIGTERM from time import sleep from PyQt4.QtCore import QProcess +# ------------------------------------------------------------------------------------------------------------ # Imports (Custom Stuff) + import jacklib # -------------------------------------------------- @@ -90,8 +110,8 @@ def run_alsa_bridge(): procOut.waitForFinished(1000) if useZita: - procIn.start("env", ["JACK_SAMPLE_RATE=%i" % sampleRate, "JACK_PERIOD_SIZE=%i" % bufferSize, "zita-a2j", "-L", "-j", "alsa2jack", "-d", "hw:Loopback,1,0"]) - procOut.start("env", ["JACK_SAMPLE_RATE=%i" % sampleRate, "JACK_PERIOD_SIZE=%i" % bufferSize, "zita-j2a", "-L", "-j", "jack2alsa", "-d", "hw:Loopback,1,1"]) + procIn.start("env", ["JACK_SAMPLE_RATE=%i" % sampleRate, "JACK_PERIOD_SIZE=%i" % bufferSize, "zita-a2j", "-j", "alsa2jack", "-d", "hw:Loopback,1,0", "-c", "%i" % channels]) + procOut.start("env", ["JACK_SAMPLE_RATE=%i" % sampleRate, "JACK_PERIOD_SIZE=%i" % bufferSize, "zita-j2a", "-j", "jack2alsa", "-d", "hw:Loopback,1,1", "-c", "%i" % channels]) else: procIn.start("env", ["JACK_SAMPLE_RATE=%i" % sampleRate, "JACK_PERIOD_SIZE=%i" % bufferSize, "alsa_in", "-j", "alsa2jack", "-d", "cloop", "-q", "1", "-c", "%i" % channels]) procOut.start("env", ["JACK_SAMPLE_RATE=%i" % sampleRate, "JACK_PERIOD_SIZE=%i" % bufferSize, "alsa_out", "-j", "jack2alsa", "-d", "ploop", "-q", "1", "-c", "%i" % channels]) @@ -109,9 +129,18 @@ def run_alsa_bridge(): #--------------- main ------------------ if __name__ == '__main__': - useZita = bool(len(sys.argv) == 2 and sys.argv[1] in ("-zita", "--zita")) + for i in range(len(sys.argv)): + if i == 0: continue + + argv = sys.argv[i] + + if argv == "--zita": + useZita = True + elif argv.startswith("--channels="): + chStr = argv.replace("--channels=", "") - # TODO - check consistency, and check channels value + if chStr.isdigit(): + channels = int(chStr) # Init JACK client client = jacklib.client_open("cadence-aloop-daemon", jacklib.JackUseExactName, None) @@ -149,7 +178,7 @@ if __name__ == '__main__': if firstStart: firstStart = False - print("cadence-aloop-daemon started, using %s" % ("zita-a2j/j2a" if useZita else "alsa_in/out")) + print("cadence-aloop-daemon started, using %s and %i channels" % ("zita-a2j/j2a" if useZita else "alsa_in/out", channels)) sleep(1) diff --git a/src/cadence_session_start.py b/src/cadence_session_start.py index 9bd0d4b..383baae 100755 --- a/src/cadence_session_start.py +++ b/src/cadence_session_start.py @@ -110,7 +110,7 @@ def startSession(systemStarted): # ALSA-Audio if GlobalSettings.value("ALSA-Audio/BridgeIndexType", iAlsaFileNone, type=int) == iAlsaFileLoop: - os.system("cadence-aloop-daemon &") + startAlsaAudioLoopBridge() sleep(0.5) # ALSA-MIDI diff --git a/src/shared_cadence.py b/src/shared_cadence.py index 92c597e..8f1b020 100644 --- a/src/shared_cadence.py +++ b/src/shared_cadence.py @@ -92,6 +92,15 @@ def getProcList(): return retProcs +# ------------------------------------------------------------------------------------------------------------ +# Start ALSA-Audio Bridge, reading its settings + +def startAlsaAudioLoopBridge(): + channels = GlobalSettings.value("ALSA-Audio/BridgeChannels", 2, type=int) + useZita = bool(GlobalSettings.value("ALSA-Audio/BridgeTool", "alsa_in", type=str) == "zita") + + os.system("cadence-aloop-daemon --channels=%i %s &" % (channels, "--zita" if useZita else "")) + # ------------------------------------------------------------------------------------------------------------ # Stop all audio processes, used for force-restart