123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- // +build !windows,!darwin
- /*
- * Copied from https://github.com/itchyny/volume-go, MIT License
- */
- package Sound
- import (
- "errors"
- "os/exec"
- "regexp"
- "strconv"
- "strings"
- )
- var useAmixer bool
- func init() {
- if _, err := exec.LookPath("pactl"); err != nil {
- useAmixer = true
- }
- }
- func cmdEnv() []string {
- return []string{"LANG=C", "LC_ALL=C"}
- }
- func getVolumeCmd() []string {
- if useAmixer {
- return []string{"amixer", "get", "Master"}
- }
- return []string{"pactl", "list", "sinks"}
- }
- var volumePattern = regexp.MustCompile(`\d+%`)
- func parseVolume(out string) (int, error) {
- lines := strings.Split(out, "\n")
- for _, line := range lines {
- s := strings.TrimLeft(line, " \t")
- if useAmixer && strings.Contains(s, "Playback") && strings.Contains(s, "%") ||
- !useAmixer && strings.HasPrefix(s, "Volume:") {
- volumeStr := volumePattern.FindString(s)
- return strconv.Atoi(volumeStr[:len(volumeStr)-1])
- }
- }
- return 0, errors.New("no volume found")
- }
- func setVolumeCmd(volume int) []string {
- if useAmixer {
- return []string{"amixer", "set", "Master", strconv.Itoa(volume) + "%"}
- }
- return []string{"pactl", "set-sink-volume", "0", strconv.Itoa(volume) + "%"}
- }
- func increaseVolumeCmd(diff int) []string {
- var sign string
- if diff >= 0 {
- sign = "+"
- } else if useAmixer {
- diff = -diff
- sign = "-"
- }
- if useAmixer {
- return []string{"amixer", "set", "Master", strconv.Itoa(diff) + "%" + sign}
- }
- return []string{"pactl", "--", "set-sink-volume", "0", sign + strconv.Itoa(diff) + "%"}
- }
- func getMutedCmd() []string {
- if useAmixer {
- return []string{"amixer", "get", "Master"}
- }
- return []string{"pactl", "list", "sinks"}
- }
- func parseMuted(out string) (bool, error) {
- lines := strings.Split(out, "\n")
- for _, line := range lines {
- s := strings.TrimLeft(line, " \t")
- if useAmixer && strings.Contains(s, "Playback") && strings.Contains(s, "%") ||
- !useAmixer && strings.HasPrefix(s, "Mute: ") {
- if strings.Contains(s, "[off]") || strings.Contains(s, "yes") {
- return true, nil
- } else if strings.Contains(s, "[on]") || strings.Contains(s, "no") {
- return false, nil
- }
- }
- }
- return false, errors.New("no muted information found")
- }
- func muteCmd() []string {
- if useAmixer {
- return []string{"amixer", "-D", "pulse", "set", "Master", "mute"}
- }
- return []string{"pactl", "set-sink-mute", "0", "1"}
- }
- func unmuteCmd() []string {
- if useAmixer {
- return []string{"amixer", "-D", "pulse", "set", "Master", "unmute"}
- }
- return []string{"pactl", "set-sink-mute", "0", "0"}
- }
|