Compare commits

...

10 commits

Author SHA1 Message Date
db1ee8957d bashrc: Source aliases after everything else 2026-02-09 22:36:57 -06:00
1600ffb673 profile: Perl environment improvements 2025-09-10 16:49:58 -05:00
c5cd631345
profile.linux: Source bashrc properly 2025-03-04 16:59:20 -06:00
85e22af1f6
aliases: Make Python checks less chatty 2025-03-04 16:58:22 -06:00
1136193091
Makefile: Add system-wide bashrc target for Linux
This fixes login shells on Arch Linux.  Hopefully it fixes others, as
well.
2025-03-04 13:15:10 -06:00
390cae1aee
bashrc: Add Bash completion on Linux 2025-03-04 13:12:20 -06:00
d0194b9232
bashrc: Colorful PS1 on "linux" TERM 2025-02-18 23:49:50 -06:00
3547f0b2ea
profile: Make GPG behave 2025-01-22 02:55:13 -06:00
42b633e810 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).
2025-01-09 10:54:25 -06:00
ace11bbb51 [NEW] pipewire: Add initial config. 2024-11-16 16:11:11 -06:00
8 changed files with 381 additions and 13 deletions

View file

@ -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'

13
.bashrc
View file

@ -1,14 +1,10 @@
#!/usr/bin/env bash
for af in "$HOME/.aliases"/*; do
. "$af"
done
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\]\$ '
;;
*)
@ -28,6 +24,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
@ -40,3 +39,7 @@ command -v uname >/dev/null &&
;;
esac \
;
for af in "$HOME/.aliases"/*; do
. "$af"
done

View file

@ -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": {
#<factory-name regex> = <library-name>
#
# 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 = <module-name>
# ( args = { <key> = <value> ... } )
# ( flags = [ ( ifexists ) ( nofail ) ] )
# ( condition = [ { <key> = <value> ... } ... ] )
#}
#
# 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 = <factory-name>
# ( args = { <key> = <value> ... } )
# ( flags = [ ( nofail ) ] )
# ( condition = [ { <key> = <value> ... } ... ] )
#}
#
# 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 = <program-name>
# ( args = "<arguments>" | [ <arg1> <arg2> ... ] )
# ( condition = [ { <key> = <value> ... } ... ] )
#}
#
# 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"
}

View file

@ -22,3 +22,6 @@ command -v uname >/dev/null &&
;
export EDITOR=`which vim`
# Make GPG and Git signing behave!
export GPG_TTY=$(tty)

8
.profile.d/perl.bash Normal file
View file

@ -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 \
)

View file

@ -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

View file

@ -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%]#
@ -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)

View file

@ -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 \
@ -6,6 +6,7 @@ DEFAULT_TARGETS += $(HOME)/.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)
@ -51,7 +52,7 @@ $(HOME)/.profile.d/%: .profile.d/% $(HOME)/.profile.d
profileds: $(PROFILEDS)
$(HOME)/.profile: $(PROFILE)
$(HOME)/.bash_profile: $(PROFILE)
cp $< $@
$(HOME)/.profile.%: .profile.%
@ -60,6 +61,9 @@ $(HOME)/.profile.%: .profile.%
$(HOME)/.bashrc: .bashrc
cp $< $@
/etc/bash.bashrc: .bashrc
$(DOSU) cp $< $@
$(HOME)/.inputrc: .inputrc
cp $< $@
@ -67,16 +71,18 @@ $(HOME)/.bashrc.%: .bashrc.%
cp $< $@
/opt/local/etc/bashrc: .bashrc
sudo cp $< $@
$(DOSU) cp $< $@
/opt/local/etc/bashrc.%: .bashrc.%
sudo cp $< $@
$(DOSU) cp $< $@
### TERMINAL EMULATOR ##########################################################
$(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
@ -100,6 +106,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 +132,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 alacritty
### README #####################################################################