From f7079db3aa3e0073df6ce5409d4b6de0a431e26f Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Thu, 21 May 2026 20:16:34 -0400 Subject: feat(notify): add --silent flag, volume knob, and level sound files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The touchpad toggle's notification was too loud, and the eight notify sounds varied by ~13 dB in RMS loudness — bug and fail came out two to three times louder than info or security. I added a --silent flag to notify (shows the popup, plays no sound) and a NOTIFY_VOLUME knob (paplay scale, default 65536) so the master level can drop without re-encoding. toggle-touchpad now passes --silent on both enable and disable. normalize-notify-sounds.sh measures each .ogg and shifts it to a uniform -31 dB mean. It writes through the file instead of mv-ing over it, so the stow symlinks survive when the script runs against the live sound dir. I re-encoded all eight sounds to the new level. Tests: a new tests/notify suite (12 tests) covers --silent, the volume knob, flag composition, and the error paths. --- dotfiles/common/.local/bin/notify | 43 +++++++++++++++++---- .../common/.local/share/sounds/notify/alarm.ogg | Bin 45775 -> 49034 bytes .../common/.local/share/sounds/notify/alert.ogg | Bin 41684 -> 37850 bytes dotfiles/common/.local/share/sounds/notify/bug.ogg | Bin 10187 -> 8522 bytes .../common/.local/share/sounds/notify/fail.ogg | Bin 74886 -> 64144 bytes .../common/.local/share/sounds/notify/info.ogg | Bin 31466 -> 29007 bytes .../common/.local/share/sounds/notify/question.ogg | Bin 49846 -> 46024 bytes .../common/.local/share/sounds/notify/security.ogg | Bin 19910 -> 19963 bytes .../common/.local/share/sounds/notify/success.ogg | Bin 39244 -> 34480 bytes 9 files changed, 35 insertions(+), 8 deletions(-) (limited to 'dotfiles/common') diff --git a/dotfiles/common/.local/bin/notify b/dotfiles/common/.local/bin/notify index a89a3ff..6918e01 100755 --- a/dotfiles/common/.local/bin/notify +++ b/dotfiles/common/.local/bin/notify @@ -3,7 +3,7 @@ # notify - Display notifications with icons and sounds # # Usage: -# notify "title" "body" [--persist] +# notify "title" "body" [--persist] [--silent] # # Types: # success - Green checkmark, pleasant chime @@ -17,12 +17,17 @@ # # Options: # --persist Don't auto-dismiss (stays until manually closed) +# --silent Show the notification but play no sound +# +# Environment: +# NOTIFY_VOLUME Playback volume for the sound (paplay scale: 65536 = 100%). +# Lower it to soften every notification without re-encoding +# the sound files. Default 65536. # # Examples: # notify success "Job Complete" "Download finished in 12 minutes" # notify fail "Job Failed" "Connection refused" --persist -# notify alert "Warning" "Network speed reduced" -# notify question "Input Needed" "Continue or abort?" +# notify info "Touchpad" "Disabled" --silent set -euo pipefail @@ -31,7 +36,7 @@ SOUND_DIR="$HOME/.local/share/sounds/notify" usage() { cat < "title" "body" [--persist] +Usage: notify "title" "body" [--persist] [--silent] Types: success Green checkmark, pleasant chime @@ -45,10 +50,15 @@ Types: Options: --persist Don't auto-dismiss notification + --silent Show the notification but play no sound + +Environment: + NOTIFY_VOLUME Sound playback volume (paplay scale: 65536 = 100%) Examples: notify success "Job Complete" "Download finished" notify fail "Build Failed" "Test errors" --persist + notify info "Touchpad" "Disabled" --silent EOF exit 1 } @@ -61,7 +71,24 @@ fi TYPE="$1" TITLE="$2" BODY="$3" -PERSIST="${4:-}" +shift 3 + +# Optional flags, in any order +PERSIST="" +SILENT="" +for arg in "$@"; do + case "$arg" in + --persist) PERSIST="--persist" ;; + --silent) SILENT=1 ;; + *) + echo "Error: Unknown option '$arg'" >&2 + usage + ;; + esac +done + +# Master playback volume (paplay scale: 65536 = 100%) +NOTIFY_VOLUME="${NOTIFY_VOLUME:-65536}" # Validate type and set icon/sound case "$TYPE" in @@ -129,9 +156,9 @@ if [[ -f "$ICON" ]]; then NOTIFY_ARGS+=(--icon="$ICON") fi -# Play sound in background (if it exists) -if [[ -f "$SOUND" ]]; then - paplay "$SOUND" & +# Play sound in background (unless silenced, and if the file exists) +if [[ -z "$SILENT" && -f "$SOUND" ]]; then + paplay --volume="$NOTIFY_VOLUME" "$SOUND" & fi # Send notification diff --git a/dotfiles/common/.local/share/sounds/notify/alarm.ogg b/dotfiles/common/.local/share/sounds/notify/alarm.ogg index b4dff15..de9b0b7 100644 Binary files a/dotfiles/common/.local/share/sounds/notify/alarm.ogg and b/dotfiles/common/.local/share/sounds/notify/alarm.ogg differ diff --git a/dotfiles/common/.local/share/sounds/notify/alert.ogg b/dotfiles/common/.local/share/sounds/notify/alert.ogg index 217f33a..9001f2a 100644 Binary files a/dotfiles/common/.local/share/sounds/notify/alert.ogg and b/dotfiles/common/.local/share/sounds/notify/alert.ogg differ diff --git a/dotfiles/common/.local/share/sounds/notify/bug.ogg b/dotfiles/common/.local/share/sounds/notify/bug.ogg index 6842082..a1bfb03 100644 Binary files a/dotfiles/common/.local/share/sounds/notify/bug.ogg and b/dotfiles/common/.local/share/sounds/notify/bug.ogg differ diff --git a/dotfiles/common/.local/share/sounds/notify/fail.ogg b/dotfiles/common/.local/share/sounds/notify/fail.ogg index 916d88a..e4f067f 100644 Binary files a/dotfiles/common/.local/share/sounds/notify/fail.ogg and b/dotfiles/common/.local/share/sounds/notify/fail.ogg differ diff --git a/dotfiles/common/.local/share/sounds/notify/info.ogg b/dotfiles/common/.local/share/sounds/notify/info.ogg index 57900b4..0dc8e10 100644 Binary files a/dotfiles/common/.local/share/sounds/notify/info.ogg and b/dotfiles/common/.local/share/sounds/notify/info.ogg differ diff --git a/dotfiles/common/.local/share/sounds/notify/question.ogg b/dotfiles/common/.local/share/sounds/notify/question.ogg index 8e44c55..2a6017e 100644 Binary files a/dotfiles/common/.local/share/sounds/notify/question.ogg and b/dotfiles/common/.local/share/sounds/notify/question.ogg differ diff --git a/dotfiles/common/.local/share/sounds/notify/security.ogg b/dotfiles/common/.local/share/sounds/notify/security.ogg index 301287e..d2ecd20 100644 Binary files a/dotfiles/common/.local/share/sounds/notify/security.ogg and b/dotfiles/common/.local/share/sounds/notify/security.ogg differ diff --git a/dotfiles/common/.local/share/sounds/notify/success.ogg b/dotfiles/common/.local/share/sounds/notify/success.ogg index c28da65..6bf93fe 100644 Binary files a/dotfiles/common/.local/share/sounds/notify/success.ogg and b/dotfiles/common/.local/share/sounds/notify/success.ogg differ -- cgit v1.2.3