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' diff --git a/.bashrc b/.bashrc index 80e38f5..83395c0 100644 --- a/.bashrc +++ b/.bashrc @@ -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 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/.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.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.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 diff --git a/.profile.mac b/.profile.mac index b7dfdfd..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%]# @@ -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) diff --git a/GNUmakefile b/GNUmakefile index 62878b5..721288b 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 \ @@ -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 #####################################################################