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