From 668bb50e36a1306aa445da3af0d4a50b8894e248 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 9 Sep 2012 22:40:59 +0100 Subject: [PATCH] Cadence: Implement session auto-start jack --- src/cadence.py | 29 +----------- src/cadence_session_start.py | 90 ++++++++++++++++++++++++++++++++---- src/shared_cadence.py | 89 +++++++++++++++++++++++++++++++++++ 3 files changed, 170 insertions(+), 38 deletions(-) create mode 100644 src/shared_cadence.py diff --git a/src/cadence.py b/src/cadence.py index a6fd6da..652c223 100755 --- a/src/cadence.py +++ b/src/cadence.py @@ -24,12 +24,12 @@ except: # Imports (Global) from platform import architecture -from PyQt4.QtCore import QSettings from PyQt4.QtGui import QApplication, QLabel, QMainWindow, QSizePolicy # Imports (Custom Stuff) import ui_cadence import systray +from shared_cadence import * from shared_jack import * from shared_settings import * @@ -50,30 +50,6 @@ if haveWine: # --------------------------------------------------------------------- -DEFAULT_LADSPA_PATH = [ - os.path.join(HOME, ".ladspa"), - os.path.join("/", "usr", "lib", "ladspa"), - os.path.join("/", "usr", "local", "lib", "ladspa") -] - -DEFAULT_DSSI_PATH = [ - os.path.join(HOME, ".dssi"), - os.path.join("/", "usr", "lib", "dssi"), - os.path.join("/", "usr", "local", "lib", "dssi") -] - -DEFAULT_LV2_PATH = [ - os.path.join(HOME, ".lv2"), - os.path.join("/", "usr", "lib", "lv2"), - os.path.join("/", "usr", "local", "lib", "lv2") -] - -DEFAULT_VST_PATH = [ - os.path.join(HOME, ".vst"), - os.path.join("/", "usr", "lib", "vst"), - os.path.join("/", "usr", "local", "lib", "vst") -] - DESKTOP_X_IMAGE = [ "eog.desktop", "kde4/digikam.desktop", @@ -112,9 +88,6 @@ XDG_APPLICATIONS_PATH = [ WINEASIO_PREFIX = "HKEY_CURRENT_USER\Software\Wine\WineASIO" -# Global Settings -GlobalSettings = QSettings("Cadence", "GlobalSettings") - # --------------------------------------------------------------------- def get_architecture(): diff --git a/src/cadence_session_start.py b/src/cadence_session_start.py index 47827d7..afd5c2c 100755 --- a/src/cadence_session_start.py +++ b/src/cadence_session_start.py @@ -2,21 +2,15 @@ # -*- coding: utf-8 -*- # Imports (Global) -import dbus, os, sys -from PyQt4.QtCore import QCoreApplication, QProcess, QSettings -from time import sleep +import dbus, sys +from PyQt4.QtCore import QCoreApplication # Imports (Custom Stuff) -from shared import * +from shared_cadence import * # Cadence Global Settings GlobalSettings = QSettings("Cadence", "GlobalSettings") -DEFAULT_LADSPA_PATH = "/usr/lib/ladspa:/usr/local/lib/ladspa:/usr/lib32/ladspa:"+HOME+"/.ladspa" -DEFAULT_DSSI_PATH = "/usr/lib/dssi:/usr/local/lib/dssi:/usr/lib32/dssi:"+HOME+"/.dssi" -DEFAULT_LV2_PATH = "/usr/lib/lv2:/usr/local/lib/lv2:"+HOME+"/.lv2" -DEFAULT_VST_PATH = "/usr/lib/vst:/usr/local/lib/vst:/usr/lib32/vst:"+HOME+"/.vst" - # DBus class DBus(object): __slots__ = [ @@ -28,7 +22,83 @@ DBus = DBus() # Start JACK, A2J and Pulse, according to user settings def startSession(): - pass + # Kill all audio processes first + stopAllAudioProcesses() + + # Connect to DBus + DBus.bus = dbus.SessionBus() + DBus.jack = DBus.bus.get_object("org.jackaudio.service", "/org/jackaudio/Controller") + + try: + DBus.a2j = dbus.Interface(DBus.bus.get_object("org.gna.home.a2jmidid", "/"), "org.gna.home.a2jmidid.control") + except: + DBus.a2j = None + + # Load settings (JACK etc) + if not GlobalSettings.value("JACK/AutoStart", True, type=bool): + print("JACK is set to NOT auto-start on login") + return True + + if GlobalSettings.value("JACK/AutoLoadLadishStudio", False, type=bool): + try: + ladish_control = DBus.bus.get_object("org.ladish", "/org/ladish/Control") + except: + startJack() + return False + + try: + ladish_conf = DBus.bus.get_object("org.ladish.conf", "/org/ladish/conf") + except: + ladish_conf = None + + ladishNotifyHack = False + ladishStudioName = dbus.String(GlobalSettings.value("JACK/LadishStudioName", "", type=str)) + ladishStudioListDump = ladish_control.GetStudioList() + + for thisStudioName, thisStudioDict in ladishStudioListDump: + if ladishStudioName == thisStudioName: + if ladish_conf and ladish_conf.get('/org/ladish/daemon/notify')[0] == "true": + ladish_conf.set('/org/ladish/daemon/notify', "false") + ladishNotifyHack = True + + ladish_control.LoadStudio(thisStudioName) + ladish_studio = DBus.bus.get_object("org.ladish", "/org/ladish/Studio") + + if not bool(ladish_studio.IsStarted()): + ladish_studio.Start() + + if ladishNotifyHack: + ladish_conf.set('/org/ladish/daemon/notify', "true") + + break + + else: + startJack() + + else: + startJack() + + if not bool(DBus.jack.IsStarted()): + print("JACK Failed to Start") + return False + + if GlobalSettings.value("A2J/AutoStart", True, type=bool) and DBus.a2j and not bool(DBus.a2j.is_started()): + a2jExportHW = GlobalSettings.value("A2J/ExportHW", True, type=bool) + DBus.a2j.set_hw_export(a2jExportHW) + DBus.a2j.start() + + if GlobalSettings.value("Pulse2JACK/AutoStart", True, type=bool): + if GlobalSettings.value("Pulse2JACK/PlaybackModeOnly", False, type=bool): + os.system("cadence-pulse2jack -p") + else: + os.system("cadence-pulse2jack") + + print("JACK Started Successfully") + return True + +def startJack(): + if not bool(DBus.jack.IsStarted()): + DBus.jack.StartServer() def printLADSPA_PATH(): EXTRA_LADSPA_DIRS = GlobalSettings.value("AudioPlugins/EXTRA_LADSPA_PATH", "", type=str).split(":") diff --git a/src/shared_cadence.py b/src/shared_cadence.py new file mode 100644 index 0000000..7d6cd8c --- /dev/null +++ b/src/shared_cadence.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Imports (Global) +import os +from PyQt4.QtCore import QProcess, QSettings +from time import sleep + +# Imports (Custom Stuff) +from shared import * + +# Default Plugin PATHs +DEFAULT_LADSPA_PATH = [ + os.path.join(HOME, ".ladspa"), + os.path.join("/", "usr", "lib", "ladspa"), + os.path.join("/", "usr", "local", "lib", "ladspa") +] + +DEFAULT_DSSI_PATH = [ + os.path.join(HOME, ".dssi"), + os.path.join("/", "usr", "lib", "dssi"), + os.path.join("/", "usr", "local", "lib", "dssi") +] + +DEFAULT_LV2_PATH = [ + os.path.join(HOME, ".lv2"), + os.path.join("/", "usr", "lib", "lv2"), + os.path.join("/", "usr", "local", "lib", "lv2") +] + +DEFAULT_VST_PATH = [ + os.path.join(HOME, ".vst"), + os.path.join("/", "usr", "lib", "vst"), + os.path.join("/", "usr", "local", "lib", "vst") +] + +# Global Settings +GlobalSettings = QSettings("Cadence", "GlobalSettings") + +# Get Process list +def getProcList(): + retProcs = [] + + process = QProcess() + process.start("ps", ["-e"]) + process.waitForFinished() + + processDump = process.readAllStandardOutput().split("\n") + + for i in range(len(processDump)): + if (i == 0): continue + dumpTest = str(processDump[i]).rsplit(":", 1)[-1].split(" ") + if len(dumpTest) > 1: + retProcs.append(dumpTest[1]) + + return retProcs + +def stopAllAudioProcesses(): + process = QProcess() + + procsTerm = ["a2j", "a2jmidid", "artsd", "jackd", "jackdmp", "knotify4", "lash", "ladishd", "ladiappd", "ladiconfd", "jmcore"] + procsKill = ["jackdbus", "pulseaudio"] + tries = 20 + + process.start("killall", procsTerm) + process.waitForFinished() + + for x in range(tries): + procsList = getProcList() + for term in range(len(procsTerm)): + if term in procsList: + break + else: + sleep(0.1) + else: + break + + process.start("killall", ["-KILL"] + procsKill) + process.waitForFinished() + + for x in range(tries): + procsList = getProcList() + for kill in range(len(procsKill)): + if kill in procsList: + break + else: + sleep(0.1) + else: + break