volume 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #!/bin/sh
  2. # Uncomment the following line to get debug info
  3. #set -x
  4. SELF="$(basename ${0})"
  5. DEFAULT_VOLUME_VALUE=50
  6. MINIMUM_VOLUME=16
  7. VOLUME_STEP=10
  8. NOTIF_DURATION=2
  9. usage() {
  10. >&2 echo "Usage: ${SELF} get"
  11. >&2 echo " ${SELF} set new_volume_percentage"
  12. exit 1
  13. }
  14. increase_volume() {
  15. # Get current value
  16. local current_volume=$(get_volume)
  17. # Compute new volume value
  18. local new_volume=0
  19. let new_volume=${current_volume}+${VOLUME_STEP}
  20. if [ ${new_volume} -gt 100 ]; then
  21. new_volume=100
  22. fi
  23. # Change volume
  24. if [ ${new_volume} -ne ${current_volume} ]; then
  25. set_volume ${new_volume}
  26. fi
  27. # Notif
  28. notif set ${NOTIF_DURATION} " VOLUME: ${new_volume}%%"
  29. }
  30. decrease_volume() {
  31. # Get current value
  32. local current_volume=$(get_volume)
  33. # Compute new volume value
  34. local new_volume=0
  35. if [ ${current_volume} -gt ${VOLUME_STEP} ]; then
  36. let new_volume=${current_volume}-${VOLUME_STEP}
  37. fi
  38. # Change volume
  39. if [ ${new_volume} -ne ${current_volume} ]; then
  40. set_volume ${new_volume}
  41. fi
  42. # Notif
  43. notif set ${NOTIF_DURATION} " VOLUME: ${new_volume}%%"
  44. }
  45. get_volume() {
  46. local volume=$(fw_printenv -n volume 2>/dev/null)
  47. if ! [ ! "${volume}" -ne "${volume}" ] 2> /dev/null; then
  48. volume=${DEFAULT_VOLUME_VALUE}
  49. fw_setenv volume ${volume}
  50. fi
  51. echo ${volume}
  52. }
  53. set_volume() {
  54. local current_volume=$(get_volume)
  55. # Set the new volume value (from 0 to 63) into ALSA
  56. local new_volume=${1}
  57. local alsa_volume=$(echo "a = $new_volume * (63 - $MINIMUM_VOLUME) / 100 + \
  58. $MINIMUM_VOLUME + 0.5; scale = 0; a / 1" | bc -l)
  59. amixer -q sset 'Headphone' ${alsa_volume} unmute
  60. # Set the new volume value in a bootloader variable
  61. if [ ${?} -eq 0 -a ${current_volume} -ne ${new_volume} ]; then
  62. fw_setenv volume ${new_volume}
  63. fi
  64. # Turn on/off audio amplifier if necessary
  65. if [ ${new_volume} -eq 0 ]; then
  66. audio_amp off
  67. else
  68. audio_amp on
  69. fi
  70. }
  71. # Check number of arguments
  72. if [ ${#} -lt 1 -o ${#} -gt 2 ]; then
  73. usage
  74. fi
  75. case "${1}" in
  76. up)
  77. if [ ${#} -ne 1 ]; then
  78. usage
  79. fi
  80. increase_volume
  81. ;;
  82. down)
  83. if [ ${#} -ne 1 ]; then
  84. usage
  85. fi
  86. decrease_volume
  87. ;;
  88. get)
  89. if [ ${#} -ne 1 ]; then
  90. usage
  91. fi
  92. get_volume
  93. ;;
  94. set)
  95. if [ ${#} -ne 2 ]; then
  96. usage
  97. fi
  98. # Make sure the argument is a positive number <= 100
  99. if [ -n "${2}" ] && [ "${2}" -eq "${2}" ] 2>/dev/null && \
  100. [ "${2}" -ge 0 ] && [ "${2}" -le 100 ]; then
  101. set_volume "${2}"
  102. else
  103. usage
  104. fi
  105. ;;
  106. *)
  107. usage
  108. ;;
  109. esac
  110. exit 0