#!/bin/bash # A script to manage the volume on my system universally # Depends on: bash, pactl, libnotify # By David Penkowoj, 2024-09-16 memfile="/tmp/$(whoami)-volctl.memtxt" # Headphones def_sink="$(pactl get-default-sink)" sink_volume="$(pactl get-sink-volume "$def_sink" | grep -o [0-9]*% | head -n 1)" # Microphone def_source="$(pactl get-default-source)" source_volume="$(pactl get-source-volume "$def_source" | grep -o [0-9]*% | head -n 1)" # Send notification notify_volume() { v="$2" if [ "$2" == "0%" ]; then v="muted" fi notify-send -u low -r "110" "$1 volume: $v" } # Toggle headphones volume toggle_deaf() { newvol="0%" if [ "$sink_volume" == "0%" ]; then newvol="$(<"$memfile")" pactl set-sink-volume "$def_sink" "$newvol" else echo "$sink_volume" > "$memfile" pactl set-sink-volume "$def_sink" 0% fi # notify_volume "Output" "$newvol" } # Toggle microphone volume toggle_mute() { newvol="0%" if [ "$source_volume" == "0%" ]; then pactl set-source-volume "$def_source" 70% newvol="70%" else pactl set-source-volume "$def_source" 0% fi notify_volume "Input" "$newvol" } # Decide what to do case "$1" in "up") pactl set-sink-volume "$def_sink" +5% ;; "down") pactl set-sink-volume "$def_sink" -5% ;; "deaf") toggle_deaf ;; "mute") toggle_mute ;; "get") printf "In: %s, Out: %s\n" "$source_volume" "$sink_volume" ;; *) printf "[ Error ] Usage: volctl [up|down|deaf|mute|get]" exit 1 ;; esac