#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Common/Shared code for Cadence # Copyright (C) 2012-2018 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) from time import sleep if True: from PyQt5.QtCore import QProcess, QSettings else: from PyQt4.QtCore import QProcess, QSettings # ------------------------------------------------------------------------------------------------------------ # 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") ] # ------------------------------------------------------------------------------------------------------------ # ALSA file-type indexes iAlsaFileNone = 0 iAlsaFileLoop = 1 iAlsaFileJACK = 2 iAlsaFilePulse = 3 iAlsaFileMax = 4 # ------------------------------------------------------------------------------------------------------------ # Global Settings GlobalSettings = QSettings("Cadence", "GlobalSettings") # ------------------------------------------------------------------------------------------------------------ # KXStudio Check wantJackStart = os.path.exists("/usr/share/kxstudio/config/config/Cadence/GlobalSettings.conf") # ------------------------------------------------------------------------------------------------------------ # Get Process list def getProcList(): retProcs = [] if HAIKU or LINUX or MACOS: process = QProcess() process.start("ps", ["-u", str(os.getuid())]) process.waitForFinished() processDump = process.readAllStandardOutput().split("\n") for i in range(len(processDump)): if (i == 0): continue dumpTest = str(processDump[i], encoding="utf-8").rsplit(":", 1)[-1].split(" ") if len(dumpTest) > 1 and dumpTest[1]: retProcs.append(dumpTest[1]) else: print("getProcList() - Not supported in this system") 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 def waitProcsEnd(procs, tries): for x in range(tries): procsList = getProcList() for proc in procs: if proc in procsList: break else: sleep(0.1) else: break # ------------------------------------------------------------------------------------------------------------ # Cleanly close the jack dbus service def tryCloseJackDBus(): try: import dbus bus = dbus.SessionBus() jack = bus.get_object("org.jackaudio.service", "/org/jackaudio/Controller") jack.Exit() except: print("tryCloseJackDBus() failed") # ------------------------------------------------------------------------------------------------------------ # Stop all audio processes, used for force-restart def stopAllAudioProcesses(tryCloseJack = True): if tryCloseJack: tryCloseJackDBus() if not (HAIKU or LINUX or MACOS): print("stopAllAudioProcesses() - Not supported in this system") return process = QProcess() # Tell pulse2jack script to create files, prevents pulseaudio respawn process.start("cadence-pulse2jack", ["--dummy"]) process.waitForFinished() procsTerm = ["a2j", "a2jmidid", "artsd", "jackd", "jackdmp", "knotify4", "lash", "ladishd", "ladiappd", "ladiconfd", "jmcore"] procsKill = ["jackdbus", "pulseaudio"] tries = 20 process.start("killall", procsTerm) process.waitForFinished() waitProcsEnd(procsTerm, tries) process.start("killall", ["-KILL"] + procsKill) process.waitForFinished() waitProcsEnd(procsKill, tries)