167 lines
5.4 KiB
Python
167 lines
5.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Common/Shared code for Cadence
|
|
# Copyright (C) 2012-2018 Filipe Coelho <falktx@falktx.com>
|
|
#
|
|
# 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)
|