From ace11bbb5112ee0a8a973643d6c4c009fc961cc2 Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Wed, 16 Oct 2024 13:11:39 -0500 Subject: [PATCH 01/10] [NEW] pipewire: Add initial config. --- .config/pipewire/pipewire.conf | 334 +++++++++++++++++++++++++++++++++ GNUmakefile | 10 +- 2 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 .config/pipewire/pipewire.conf diff --git a/.config/pipewire/pipewire.conf b/.config/pipewire/pipewire.conf new file mode 100644 index 0000000..0aefb0e --- /dev/null +++ b/.config/pipewire/pipewire.conf @@ -0,0 +1,334 @@ +{ + "config.name": "pipewire.conf", + #"config.path": "/usr/share/pipewire/pipewire.conf", + "context.properties": { + ## Configure properties in the system. + #library.name.system = support/libspa-support + #context.data-loop.library.name.system = support/libspa-support + #support.dbus = true + #link.max-buffers = 64 + link.max-buffers = 16 # version < 3 clients can't handle more + #mem.warn-mlock = false + #mem.allow-mlock = true + #mem.mlock-all = false + #clock.power-of-two-quantum = true + #log.level = 2 + #cpu.zero.denormals = false + + loop.rt-prio = -1 # -1 = use module-rt prio, 0 disable rt + loop.class = data.rt + #thread.affinity = [ 0 1 ] # optional array of CPUs + context.num-data-loops = -1 # -1 = num-cpus, 0 = no data loops + + context.data-loops = [ + { loop.rt-prio = -1 + loop.class = [ data.rt audio.rt ] + #library.name.system = support/libspa-support + thread.name = data-loop.0 + #thread.affinity = [ 0 1 ] # optional array of CPUs + } + ] + + core.daemon = true # listening for socket connections + core.name = pipewire-0 # core name and socket name + + ## Properties for the DSP configuration. + default.clock.rate = 192000 + default.clock.allowed-rates = [ 192000, 96000, 48000, 384000 44100 ] + #default.clock.quantum = 1024 + #default.clock.min-quantum = 32 + #default.clock.max-quantum = 2048 + #default.clock.quantum-limit = 8192 + #default.clock.quantum-floor = 4 + #default.video.width = 640 + #default.video.height = 480 + #default.video.rate.num = 25 + #default.video.rate.denom = 1 + # + settings.check-quantum = true + settings.check-rate = true + + # keys checked below to disable module loading + module.x11.bell = true + # enables autoloading of access module, when disabled an alternative + # access module needs to be loaded. + module.access = true + # enables autoloading of module-jackdbus-detect + module.jackdbus-detect = true +}, + "context.properties.rules": [ + { matches = [ { cpu.vm.name = !null } ] + actions = { + update-props = { + # These overrides are only applied when running in a vm. + default.clock.min-quantum = 1024 + } + } + } +], + "context.spa-libs": { + # = + # + # Used to find spa factory names. It maps an spa factory name + # regular expression to a library name that should contain + # that factory. + # + audio.convert.* = audioconvert/libspa-audioconvert + avb.* = avb/libspa-avb + api.alsa.* = alsa/libspa-alsa + api.v4l2.* = v4l2/libspa-v4l2 + api.libcamera.* = libcamera/libspa-libcamera + api.bluez5.* = bluez5/libspa-bluez5 + api.vulkan.* = vulkan/libspa-vulkan + api.jack.* = jack/libspa-jack + support.* = support/libspa-support + video.convert.* = videoconvert/libspa-videoconvert + #videotestsrc = videotestsrc/libspa-videotestsrc + #audiotestsrc = audiotestsrc/libspa-audiotestsrc +}, + "context.modules": [ + #{ name = + # ( args = { = ... } ) + # ( flags = [ ( ifexists ) ( nofail ) ] ) + # ( condition = [ { = ... } ... ] ) + #} + # + # Loads a module with the given parameters. + # If ifexists is given, the module is ignored when it is not found. + # If nofail is given, module initialization failures are ignored. + # If condition is given, the module is loaded only when the context + # properties all match the match rules. + # + + # Uses realtime scheduling to boost the audio thread priorities. This uses + # RTKit if the user doesn't have permission to use regular realtime + # scheduling. You can also clamp utilisation values to improve scheduling + # on embedded and heterogeneous systems, e.g. Arm big.LITTLE devices. + { name = libpipewire-module-rt + args = { + nice.level = -11 + rt.prio = 88 + rt.time.soft = -1 + #rt.time.hard = -1 + #uclamp.min = 0 + #uclamp.max = 1024 + } + flags = [ ifexists nofail ] + } + + # The native communication protocol. + { name = libpipewire-module-protocol-native + args = { + # List of server Unix sockets, and optionally permissions + #sockets = [ { name = "pipewire-0" }, { name = "pipewire-0-manager" } ] + } + } + + # The profile module. Allows application to access profiler + # and performance data. It provides an interface that is used + # by pw-top and pw-profiler. + { name = libpipewire-module-profiler } + + # Allows applications to create metadata objects. It creates + # a factory for Metadata objects. + { name = libpipewire-module-metadata } + + # Creates a factory for making devices that run in the + # context of the PipeWire server. + { name = libpipewire-module-spa-device-factory } + + # Creates a factory for making nodes that run in the + # context of the PipeWire server. + { name = libpipewire-module-spa-node-factory } + + # Allows creating nodes that run in the context of the + # client. Is used by all clients that want to provide + # data to PipeWire. + { name = libpipewire-module-client-node } + + # Allows creating devices that run in the context of the + # client. Is used by the session manager. + { name = libpipewire-module-client-device } + + # The portal module monitors the PID of the portal process + # and tags connections with the same PID as portal + # connections. + { name = libpipewire-module-portal + flags = [ ifexists nofail ] + } + + # The access module can perform access checks and block + # new clients. + { name = libpipewire-module-access + args = { + # Socket-specific access permissions + #access.socket = { pipewire-0 = "default", pipewire-0-manager = "unrestricted" } + + # Deprecated legacy mode (not socket-based), + # for now enabled by default if access.socket is not specified + #access.legacy = true + } + condition = [ { module.access = true } ] + } + + # Makes a factory for wrapping nodes in an adapter with a + # converter and resampler. + { name = libpipewire-module-adapter } + + # Makes a factory for creating links between ports. + { name = libpipewire-module-link-factory } + + # Provides factories to make session manager objects. + { name = libpipewire-module-session-manager } + + # Use libcanberra to play X11 Bell + { name = libpipewire-module-x11-bell + args = { + #sink.name = "@DEFAULT_SINK@" + #sample.name = "bell-window-system" + #x11.display = null + #x11.xauthority = null + } + flags = [ ifexists nofail ] + condition = [ { module.x11.bell = true } ] + } + { name = libpipewire-module-jackdbus-detect + args = { + #jack.library = libjack.so.0 + #jack.server = null + #jack.client-name = PipeWire + #jack.connect = true + #tunnel.mode = duplex # source|sink|duplex + source.props = { + #audio.channels = 2 + #midi.ports = 1 + #audio.position = [ FL FR ] + # extra sink properties + } + sink.props = { + #audio.channels = 2 + #midi.ports = 1 + #audio.position = [ FL FR ] + # extra sink properties + } + } + flags = [ ifexists nofail ] + condition = [ { module.jackdbus-detect = true } ] + } +], + "context.objects": [ + #{ factory = + # ( args = { = ... } ) + # ( flags = [ ( nofail ) ] ) + # ( condition = [ { = ... } ... ] ) + #} + # + # Creates an object from a PipeWire factory with the given parameters. + # If nofail is given, errors are ignored (and no object is created). + # If condition is given, the object is created only when the context properties + # all match the match rules. + # + #{ factory = spa-node-factory args = { factory.name = videotestsrc node.name = videotestsrc node.description = videotestsrc "Spa:Pod:Object:Param:Props:patternType" = 1 } } + #{ factory = spa-device-factory args = { factory.name = api.jack.device foo=bar } flags = [ nofail ] } + #{ factory = spa-device-factory args = { factory.name = api.alsa.enum.udev } } + #{ factory = spa-node-factory args = { factory.name = api.alsa.seq.bridge node.name = Internal-MIDI-Bridge } } + #{ factory = adapter args = { factory.name = audiotestsrc node.name = my-test node.description = audiotestsrc } } + #{ factory = spa-node-factory args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } } + + # A default dummy driver. This handles nodes marked with the "node.always-process" + # property when no other driver is currently active. JACK clients need this. + { factory = spa-node-factory + args = { + factory.name = support.node.driver + node.name = Dummy-Driver + node.group = pipewire.dummy + node.sync-group = sync.dummy + priority.driver = 200000 + #clock.id = monotonic # realtime | tai | monotonic-raw | boottime + #clock.name = "clock.system.monotonic" + } + } + { factory = spa-node-factory + args = { + factory.name = support.node.driver + node.name = Freewheel-Driver + priority.driver = 190000 + node.group = pipewire.freewheel + node.sync-group = sync.dummy + node.freewheel = true + #freewheel.wait = 10 + } + } + + # This creates a new Source node. It will have input ports + # that you can link, to provide audio for this source. + #{ factory = adapter + # args = { + # factory.name = support.null-audio-sink + # node.name = "my-mic" + # node.description = "Microphone" + # media.class = "Audio/Source/Virtual" + # audio.position = "FL,FR" + # monitor.passthrough = true + # } + #} + + # This creates a single PCM source device for the given + # alsa device path hw:0. You can change source to sink + # to make a sink in the same way. + #{ factory = adapter + # args = { + # factory.name = api.alsa.pcm.source + # node.name = "alsa-source" + # node.description = "PCM Source" + # media.class = "Audio/Source" + # api.alsa.path = "hw:0" + # api.alsa.period-size = 1024 + # api.alsa.headroom = 0 + # api.alsa.disable-mmap = false + # api.alsa.disable-batch = false + # audio.format = "S16LE" + # audio.rate = 48000 + # audio.channels = 2 + # audio.position = "FL,FR" + # } + #} + + # Use the metadata factory to create metadata and some default values. + #{ factory = metadata + # args = { + # metadata.name = my-metadata + # metadata.values = [ + # { key = default.audio.sink value = { name = somesink } } + # { key = default.audio.source value = { name = somesource } } + # ] + # } + #} +], + "context.exec": [ + #{ path = + # ( args = "" | [ ... ] ) + # ( condition = [ { = ... } ... ] ) + #} + # + # Execute the given program with arguments. + # If condition is given, the program is executed only when the context + # properties all match the match rules. + # + # You can optionally start the session manager here, + # but it is better to start it as a systemd service. + # Run the session manager with -h for options. + # + #{ path = "/usr/bin/pipewire-media-session" args = "" + # condition = [ { exec.session-manager = null } { exec.session-manager = true } ] } + # + # You can optionally start the pulseaudio-server here as well + # but it is better to start it as a systemd service. + # It can be interesting to start another daemon here that listens + # on another address with the -a option (eg. -a tcp:4713). + # + #{ path = "/usr/bin/pipewire" args = [ "-c" "pipewire-pulse.conf" ] + # condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] } +], + "config.name.d": "pipewire.conf.d" +} diff --git a/GNUmakefile b/GNUmakefile index 62878b5..54d0004 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -100,6 +100,14 @@ $(HOME)/.vim/bundle: $(HOME)/.vim/bundle/Vundle.vim: $(HOME)/.vim/bundle git clone https://github.com/VundleVim/Vundle.vim.git $@ || cd $@; git pull; exit 0 +### PIPEWIRE ################################################################### + +$(HOME)/.config/pipewire/pipewire.conf: .config/pipewire/pipewire.conf + $(INSTALL) -D -m 644 $< $@ + +restart-pw: + systemctl restart --user pipewire{,-pulse}{.service,.socket} + ### X.ORG CRAP ################################################################# $(HOME)/.Xmodcapslock: x-crap/.Xmodcapslock @@ -118,7 +126,7 @@ x-crap: $(HOME)/.Xmodcapslock $(HOME)/.Xdefaults $(HOME)/.Xresources $(HOME)/.xi ### "PHONY" TARGETS ############################################################ -.PHONY: aliases profileds README x-crap sway i3status +.PHONY: aliases profileds README x-crap sway i3status restart-pw pipewire ### README ##################################################################### From 42b633e81000fbce2949ff176463fe29fd2c88db Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Thu, 9 Jan 2025 10:54:25 -0600 Subject: [PATCH 02/10] Makefile: Alacritty phony, profie->bash_profile In systems with greetd or Sxmo naming my profile '.profile' conflicts with existing environment config filenames, often badly enough to arrest the entire GUI bringup sequence. To circumvent this, I'm naming my per-user shell profile '.bash_profile' instead. This compromise should work on all tested environments since I only support the Bash shell for my dotties (patches welcome for others). --- GNUmakefile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 54d0004..bb7b473 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,4 +1,4 @@ -DEFAULT_TARGETS += $(HOME)/.profile \ +DEFAULT_TARGETS += $(HOME)/.bash_profile \ $(HOME)/.vim/bundle/Vundle.vim $(HOME)/.vimrc \ $(HOME)/.inputrc \ $(HOME)/.config/alacritty/alacritty.toml \ @@ -51,7 +51,7 @@ $(HOME)/.profile.d/%: .profile.d/% $(HOME)/.profile.d profileds: $(PROFILEDS) -$(HOME)/.profile: $(PROFILE) +$(HOME)/.bash_profile: $(PROFILE) cp $< $@ $(HOME)/.profile.%: .profile.% @@ -77,6 +77,8 @@ $(HOME)/.bashrc.%: .bashrc.% $(HOME)/.config/alacritty/alacritty.toml: .config/alacritty/alacritty.toml $(INSTALL) -D -m 644 $< $@ +alacritty: $(HOME)/.config/alacritty/alacritty.toml + ### SWAY ####################################################################### $(HOME)/.sway/config: .sway/config @@ -126,7 +128,7 @@ x-crap: $(HOME)/.Xmodcapslock $(HOME)/.Xdefaults $(HOME)/.Xresources $(HOME)/.xi ### "PHONY" TARGETS ############################################################ -.PHONY: aliases profileds README x-crap sway i3status restart-pw pipewire +.PHONY: aliases profileds README x-crap sway i3status restart-pw pipewire alacritty ### README ##################################################################### From 3547f0b2eada2bb11733da78260dbe6ae4fad760 Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Wed, 22 Jan 2025 02:55:13 -0600 Subject: [PATCH 03/10] profile: Make GPG behave --- .profile | 3 +++ .profile.mac | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.profile b/.profile index 5a34f0e..783a0da 100644 --- a/.profile +++ b/.profile @@ -22,3 +22,6 @@ command -v uname >/dev/null && ; export EDITOR=`which vim` + +# Make GPG and Git signing behave! +export GPG_TTY=$(tty) diff --git a/.profile.mac b/.profile.mac index b7dfdfd..49e82a2 100644 --- a/.profile.mac +++ b/.profile.mac @@ -27,3 +27,6 @@ fi # Makes Vim and friends behave! export LANG=en_US.UTF-8 + +# Make GPG and Git signing behave! +export GPG_TTY=$(tty) From d0194b923212687fd982960770393bf44eeb90b2 Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Tue, 18 Feb 2025 23:49:50 -0600 Subject: [PATCH 04/10] bashrc: Colorful PS1 on "linux" TERM --- .bashrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bashrc b/.bashrc index 80e38f5..eb24255 100644 --- a/.bashrc +++ b/.bashrc @@ -8,7 +8,7 @@ HISTSIZE=10000 HISTFILESIZE=900000 case ${TERM} in - xterm*|rxvt*|Eterm|aterm|kterm|gnome*|alacritty*|tmux-256color) + xterm*|rxvt*|Eterm|aterm|kterm|gnome*|alacritty*|tmux-256color|linux) PS1='\[\033]2;\h:\W \u\007\]\h:\[\033[38;5;219m\]\W\[\033[00m\] \[\033[01;35m\]\u\[\033[00m\]\$ ' ;; *) From 390cae1aee353d0ed35cff8728ba0631d6d2501d Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Tue, 4 Mar 2025 13:12:20 -0600 Subject: [PATCH 05/10] bashrc: Add Bash completion on Linux --- .bashrc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.bashrc b/.bashrc index eb24255..3c16ea5 100644 --- a/.bashrc +++ b/.bashrc @@ -28,6 +28,9 @@ command -v uname >/dev/null && Linux) alias ls='ls --color' [ -z "$ID" ] && [ -f /etc/os-release ] && . /etc/os-release + + [ -r /usr/share/bash-completion/bash_completion ] \ + && . /usr/share/bash-completion/bash_completion ;; Darwin) command -v port >/dev/null && . /opt/local/etc/bashrc.mac From 11361930912c43a563a461573f7df57b71351124 Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Tue, 4 Mar 2025 13:15:10 -0600 Subject: [PATCH 06/10] Makefile: Add system-wide bashrc target for Linux This fixes login shells on Arch Linux. Hopefully it fixes others, as well. --- GNUmakefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index bb7b473..721288b 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -6,6 +6,7 @@ DEFAULT_TARGETS += $(HOME)/.bash_profile \ $(HOME)/.profile.d profileds ALIASES = $(foreach a,$(wildcard .aliases/*),$(subst .aliases/,$(HOME)/.aliases/,$(a))) PROFILEDS = $(foreach p,$(wildcard .profile.d/*),$(subst .profile.d/,$(HOME)/.profile.d/,$(p))) +DOSU ?= $(shell command -v sudo || which doas) UNAME = $(shell uname -s) ifeq ($(UNAME),Darwin) @@ -60,6 +61,9 @@ $(HOME)/.profile.%: .profile.% $(HOME)/.bashrc: .bashrc cp $< $@ +/etc/bash.bashrc: .bashrc + $(DOSU) cp $< $@ + $(HOME)/.inputrc: .inputrc cp $< $@ @@ -67,10 +71,10 @@ $(HOME)/.bashrc.%: .bashrc.% cp $< $@ /opt/local/etc/bashrc: .bashrc - sudo cp $< $@ + $(DOSU) cp $< $@ /opt/local/etc/bashrc.%: .bashrc.% - sudo cp $< $@ + $(DOSU) cp $< $@ ### TERMINAL EMULATOR ########################################################## From 85e22af1f6b05a3157a41050a330071b8ac95eff Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Tue, 4 Mar 2025 16:58:22 -0600 Subject: [PATCH 07/10] aliases: Make Python checks less chatty --- .aliases/python.bash | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.aliases/python.bash b/.aliases/python.bash index 24b9878..522a729 100644 --- a/.aliases/python.bash +++ b/.aliases/python.bash @@ -2,5 +2,6 @@ alias mk-venv='python -m venv .venv' alias do-venv='. .venv/bin/activate' alias rm-venv='rm -rf .venv' -[ $(command -v pdb) ] || alias pdb='python -m pdb' -[ $(command -v pip) ] || alias pip='python -m pip' + +command -v pdb > /dev/null || alias pdb='python -m pdb' +command -v pip > /dev/null || alias pip='python -m pip' From c5cd631345f9d8a4519b93f641a858ae7b76a4ff Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Tue, 4 Mar 2025 16:59:20 -0600 Subject: [PATCH 08/10] profile.linux: Source bashrc properly --- .profile.linux | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.profile.linux b/.profile.linux index 43274e3..7bdd557 100644 --- a/.profile.linux +++ b/.profile.linux @@ -1,5 +1,7 @@ #!/usr/bin/env bash +shopt -q login_shell && . $HOME/.bashrc + # Make compositor behave on Alpine if [ -z "$XDG_RUNTIME_DIR" ]; then export XDG_RUNTIME_DIR=/tmp/runtime-$UID From 1600ffb6738cfd9a3df4fd75b88f8cdc4356e8eb Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Wed, 10 Sep 2025 16:49:58 -0500 Subject: [PATCH 09/10] profile: Perl environment improvements --- .profile.d/perl.bash | 8 ++++++++ .profile.mac | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .profile.d/perl.bash diff --git a/.profile.d/perl.bash b/.profile.d/perl.bash new file mode 100644 index 0000000..ca889c8 --- /dev/null +++ b/.profile.d/perl.bash @@ -0,0 +1,8 @@ +perl_env() { eval $(perl -I $HOME/perl5/lib/perl5/ -Mlocal::lib) ; } + +perl_env \ + || ( + command -v cpanm \ + && cpanm --local-lib=$HOME/perl5 local::lib \ + && perl_env \ + ) diff --git a/.profile.mac b/.profile.mac index 49e82a2..59de1b1 100644 --- a/.profile.mac +++ b/.profile.mac @@ -1,6 +1,6 @@ #[%MACPORTS%]# # MacPorts Installer addition on 2023-01-11_at_01:28:57: adding an appropriate PATH variable for use with MacPorts. -export PATH="$HOME/Library/Python/3.12/bin:$HOME/Library/Python/3.11/bin:$HOME/perl5/bin:$HOME/.local/bin:$HOME/.local/sbin:/opt/local/bin:/opt/local/sbin:/Applications/ArmGNUToolchain/12.2.rel1/arm-none-eabi/bin:$PATH" +export PATH="$HOME/Library/Python/3.12/bin:$HOME/Library/Python/3.11/bin:$HOME/.local/bin:$HOME/.local/sbin:/opt/local/bin:/opt/local/sbin:/Applications/ArmGNUToolchain/12.2.rel1/arm-none-eabi/bin:$PATH" # Finished adapting your PATH environment variable for use with MacPorts. #[%MACPORTS%]# From db1ee8957db638fdfbd3574e7575217944f7ec85 Mon Sep 17 00:00:00 2001 From: Andrea Rogers Date: Mon, 9 Feb 2026 22:36:57 -0600 Subject: [PATCH 10/10] bashrc: Source aliases after everything else --- .bashrc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.bashrc b/.bashrc index 3c16ea5..83395c0 100644 --- a/.bashrc +++ b/.bashrc @@ -1,9 +1,5 @@ #!/usr/bin/env bash -for af in "$HOME/.aliases"/*; do - . "$af" -done - HISTSIZE=10000 HISTFILESIZE=900000 @@ -43,3 +39,7 @@ command -v uname >/dev/null && ;; esac \ ; + +for af in "$HOME/.aliases"/*; do + . "$af" +done