#!/bin/sh # WARNING: This script assumes being run inside XDG compliant session, # which means D-Bus session instance is expected to be correctly set up # prior to this script starting. If that is not true, things may break! DATE_FORMAT='+%Y-%m-%dT%H:%M:%S%Z' for init in dinit openrc runit s6; do [[ -f /sbin/$init-init ]] && case $init in openrc) SUPPORT='' ;; dinit|runit|s6) SUPPORT='YES' ;; esac && break done [ $SUPPORT ] || { echo "Unsupported method; use the service manager (rc-service/dinitctl) to control PipeWire."; exit 1; } startpw() { # The core daemon which by itself does probably nothing. echo "[$(date "${DATE_FORMAT}")] Starting PipeWire." 1>>"${ARTIX_PIPEWIRE_LOG}" echo -n "Starting PipeWire... " /usr/bin/pipewire 1>>"${ARTIX_PIPEWIRE_LOG}" 2>&1 & # The so called pipewire-pulse daemon used for PulseAudio compatibility. # Commenting this out will stop the PA proxying daemon from starting, # however ALSA (with pipewire-alsa), JACK (with jack-sdk) and PW API using # clients will still have access to audio and may end up clashing with # non-PW apps over HW control (most notably, /usr/bin/pulseaudio daemon). echo "[$(date "${DATE_FORMAT}")] Starting PipeWire-Pulse." 1>>"${ARTIX_PIPEWIRE_PULSE_LOG}" echo -n "PipeWire-Pulse... " /usr/bin/pipewire -c pipewire-pulse.conf 1>>"${ARTIX_PIPEWIRE_PULSE_LOG}" 2>&1 & # Hack for bug #822498 sleep 1 # Finally a session manager is required for PipeWire to do anything echo "[$(date "${DATE_FORMAT}")] Starting WirePlumber." 1>>"${ARTIX_WIREPLUMBER_LOG}" echo -n "WirePlumber... " /usr/bin/wireplumber 1>>"${ARTIX_WIREPLUMBER_LOG}" 2>&1 & echo "done!" } restart() { echo -n "Terminating PipeWire processes... " pkill -9 -u "${USER}" -x "pipewire|wireplumber" 1>/dev/null 2>&1 pidwait -u "${USER}" -x "pipewire|wireplumber" 2>/dev/null || sleep 1 echo "terminated." startpw } CONF="${XDG_CONFIG_HOME}/artix-pipewire-launcher.conf" if [ -f "${CONF}" ]; then . "${CONF}" else ARTIX_PIPEWIRE_LOG='/dev/null' ARTIX_PIPEWIRE_PULSE_LOG='/dev/null' ARTIX_WIREPLUMBER_LOG='/dev/null' fi for L in \ "${ARTIX_PIPEWIRE_LOG}" \ "${ARTIX_PIPEWIRE_PULSE_LOG}" \ "${ARTIX_WIREPLUMBER_LOG}"; do if [ ! -e "${L}" ]; then touch "${L}" fi done pwpid=$(pgrep -u "${USER}" -x "pipewire") wppid=$(pgrep -u "${USER}" -x "wireplumber") [[ ! -z "$pwpid$wppid" && "${1}" != "restart" ]] && { echo "PipeWire/WirePlumber already running."; exit 0; } [ -z "${1}" ] && startpw if [ "${#}" -gt 0 ]; then if [ "${1}" = 'restart' ]; then restart else echo "Unrecognised argument." >&2 echo "Usage: artix-pipewire-launcher [restart]" >&2 exit 1 fi fi