02PulseAudio 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #! /bin/sh
  2. . "${PM_FUNCTIONS}"
  3. test_pulse_system() {
  4. getent passwd pulse | awk -F: '{print $3}'
  5. }
  6. get_pulse_users() {
  7. PULSE_SYSTEM_USER=$(test_pulse_system)
  8. if [ -z "${PULSE_SYSTEM_USER}" ]; then
  9. ps -C pulseaudio -o uid= | tr -d ' '
  10. else
  11. ps -C pulseaudio -o uid= | tr -d ' ' | sed s/${PULSE_SYSTEM_USER}//
  12. fi
  13. }
  14. # $1 = sink|source
  15. # $2 = username
  16. save_pulse_state() {
  17. su "${2}" -c -- "pacmd list-${1}s" | \
  18. sed -n "s/^[[:space:]*]*//; /\(index\|mute\)/p" | \
  19. (index="";
  20. while read field value; do
  21. if [ ${field%:} = "index" ]; then
  22. index=${value}
  23. else
  24. savestate pulse:"${2}":${1}${index} ${value}
  25. fi
  26. done)
  27. }
  28. # $1 = sink|source
  29. # $2 = username
  30. restore_pulse_state() {
  31. su "${2}" -c -- "pacmd list-${1}s" | \
  32. sed -n "s/^[[:space:]*]*index: //p" | \
  33. while read index; do
  34. if state_exists pulse:"${2}":${1}${index}; then
  35. su "${2}" -c -- "pacmd \
  36. set-${1}-mute \
  37. ${index} \
  38. $(restorestate pulse:"${2}":${1}${index})"
  39. fi
  40. done
  41. }
  42. # $1 = sink|source
  43. # $2 = username
  44. mute_pulse() {
  45. su "${2}" -c -- "pacmd list-${1}s" | \
  46. sed -n "s/^[[:space:]*]*//; /\(index\|mute\)/p" | \
  47. (index="";
  48. while read field value; do
  49. if [ ${field%:} = "index" ]; then
  50. index=${value}
  51. su "${2}" -c -- "pacmd \
  52. set-${1}-mute ${index} yes"
  53. fi
  54. done)
  55. }
  56. suspend_pulse() {
  57. for i in $(get_pulse_users); do
  58. THIS_USER="$(getent passwd ${i} | cut -f1 -d:)"
  59. save_pulse_state sink "${THIS_USER}"
  60. save_pulse_state source "${THIS_USER}"
  61. su "${THIS_USER}" -c -- 'pacmd suspend true' > /dev/null 2>&1
  62. done
  63. for i in $(get_pulse_users); do
  64. THIS_USER="$(getent passwd ${i} | cut -f1 -d:)"
  65. if su "${THIS_USER}" -c -- 'ck-list-sessions | grep "active = TRUE"' > /dev/null 2>&1; then
  66. mute_pulse sink "${THIS_USER}"
  67. mute_pulse source "${THIS_USER}"
  68. break
  69. fi
  70. done
  71. }
  72. resume_pulse() {
  73. for i in $(get_pulse_users); do
  74. THIS_USER="$(getent passwd ${i} | cut -f1 -d:)"
  75. restore_pulse_state sink "${THIS_USER}"
  76. restore_pulse_state source "${THIS_USER}"
  77. su "${THIS_USER}" -c -- 'pacmd suspend false' > /dev/null 2>&1
  78. done
  79. }
  80. case $1 in
  81. hibernate|suspend)
  82. suspend_pulse
  83. ;;
  84. thaw|resume)
  85. resume_pulse
  86. ;;
  87. *) exit $NA
  88. ;;
  89. esac