Advertisement
elirang

mute programs on linux (pulseaudio)

Mar 20th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 1.30 KB | None | 0 0
  1. #!/bin/bash
  2. # List or toggle mute on pulseaudio clients by process name
  3.  
  4. main() {
  5.     local action=toggle
  6.     while getopts :l option; do
  7.         case "$option" in
  8.                 l) list ; exit 0 ;;
  9.             ?) usage 1 "invalid option: -$OPTARG" ;;
  10.         esac
  11.     done
  12.     shift $((OPTIND - 1))
  13.      
  14.     local pid=$(pidof "$1")
  15.     if [[ -z "$pid" ]]; then
  16.         echo "error: no running processes for: $1" >&2
  17.     elif [[ "$1" ]]; then
  18.         toggle "$1"
  19.     else
  20.         echo "specify an application name"
  21.           exit 1
  22.     fi
  23. }
  24.  
  25. list() {
  26.     pacmd list-sink-inputs | gawk '
  27.     $1 == "application.name" {name = $3}
  28.     $1 == "application.process.binary" {bin = $3}
  29.     $1 == "application.process.id" {id = $3}
  30.     {
  31.         if (name != "" && bin != "" && id != "")
  32.             {
  33.                 gsub("\"","",name)
  34.                 gsub("\"","",bin)
  35.                 gsub("\"","",id)
  36.                 printf "%-20s %-20s %-20s \n", name, bin, id;
  37.                 bin = ""; id = ""; name = "";
  38.            }
  39.     }
  40.     '
  41. }
  42.  
  43. toggle() {
  44.      local pids=$(pidof "$1")
  45.      for pid in $pids; do
  46.           local index=$(get_index $pid)
  47.           [[ "$index" ]] && pactl set-sink-input-mute $index toggle        
  48.      done
  49. }
  50.  
  51. get_index() {
  52.      pacmd list-sink-inputs | \
  53.      gawk -v pid=$1 '
  54.      $1 == "index:" {idx = $2}
  55.      $1 == "application.process.id" && $3 == "\"" pid "\"" {print idx; exit}
  56.      '
  57. }
  58.  
  59. main "$@"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement