mirror of
				https://github.com/onyx-and-iris/voicemeeter.git
				synced 2025-11-03 23:31:45 +00:00 
			
		
		
		
	interactive mode added to vm-cli example
toggle, get and set refactored into separate functions flag vars moved from global scope -i flag added to README
This commit is contained in:
		
							parent
							
								
									5b3f10c4b8
								
							
						
					
					
						commit
						8bb8336599
					
				@ -13,6 +13,7 @@ Toggle with `!` prefix, get by excluding `=` and set by including `=`. Mix and m
 | 
				
			|||||||
You may pass the following optional flags:
 | 
					You may pass the following optional flags:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-   -v: (-verbose) to toggle console output.
 | 
					-   -v: (-verbose) to toggle console output.
 | 
				
			||||||
 | 
					-   -i: (-interactive) to toggle interactive mode.
 | 
				
			||||||
-   -k: (-kind) to set the kind of Voicemeeter. Defaults to banana.
 | 
					-   -k: (-kind) to set the kind of Voicemeeter. Defaults to banana.
 | 
				
			||||||
-   -d: (-delay) to set a delay on the getters. Defaults to 20ms.
 | 
					-   -d: (-delay) to set a delay on the getters. Defaults to 20ms.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,27 +1,32 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"bufio"
 | 
				
			||||||
	"flag"
 | 
						"flag"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/onyx-and-iris/voicemeeter"
 | 
						"github.com/onyx-and-iris/voicemeeter"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
	var (
 | 
						var (
 | 
				
			||||||
		kind        string
 | 
							kind        string
 | 
				
			||||||
		delay       int
 | 
							delay       int
 | 
				
			||||||
		verbose     bool
 | 
							verbose     bool
 | 
				
			||||||
 | 
							interactive bool
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					 | 
				
			||||||
	flag.StringVar(&kind, "kind", "banana", "kind of voicemeeter")
 | 
						flag.StringVar(&kind, "kind", "banana", "kind of voicemeeter")
 | 
				
			||||||
	flag.StringVar(&kind, "k", "banana", "kind of voicemeeter (shorthand)")
 | 
						flag.StringVar(&kind, "k", "banana", "kind of voicemeeter (shorthand)")
 | 
				
			||||||
	flag.IntVar(&delay, "delay", 20, "delay between commands")
 | 
						flag.IntVar(&delay, "delay", 20, "delay between commands")
 | 
				
			||||||
	flag.IntVar(&delay, "d", 20, "delay between commands (shorthand)")
 | 
						flag.IntVar(&delay, "d", 20, "delay between commands (shorthand)")
 | 
				
			||||||
	flag.BoolVar(&verbose, "verbose", false, "toggle console output")
 | 
						flag.BoolVar(&verbose, "verbose", false, "toggle console output")
 | 
				
			||||||
	flag.BoolVar(&verbose, "v", false, "toggle console output (shorthand)")
 | 
						flag.BoolVar(&verbose, "v", false, "toggle console output (shorthand)")
 | 
				
			||||||
 | 
						flag.BoolVar(&interactive, "interactive", false, "toggle interactive mode")
 | 
				
			||||||
 | 
						flag.BoolVar(&interactive, "i", false, "toggle interactive mode (shorthand)")
 | 
				
			||||||
	flag.Parse()
 | 
						flag.Parse()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	vm, err := vmConnect(kind, delay)
 | 
						vm, err := vmConnect(kind, delay)
 | 
				
			||||||
@ -30,7 +35,7 @@ func main() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer vm.Logout()
 | 
						defer vm.Logout()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = runCommands(vm, verbose)
 | 
						err = runCommands(vm, verbose, interactive)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		fmt.Println(err)
 | 
							fmt.Println(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -50,45 +55,97 @@ func vmConnect(kind string, delay int) (*voicemeeter.Remote, error) {
 | 
				
			|||||||
	return vm, nil
 | 
						return vm, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func runCommands(vm *voicemeeter.Remote, verbose bool) error {
 | 
					func runCommands(vm *voicemeeter.Remote, verbose, interactive bool) error {
 | 
				
			||||||
 | 
						if interactive {
 | 
				
			||||||
 | 
							return interactiveMode(vm, verbose)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	for _, arg := range flag.Args() {
 | 
						for _, arg := range flag.Args() {
 | 
				
			||||||
		if arg[0] == '!' {
 | 
							err := parse(vm, arg, verbose)
 | 
				
			||||||
			val, err := vm.GetFloat(arg[1:])
 | 
					 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
				err = fmt.Errorf("unable to toggle %s", arg[1:])
 | 
					 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
			vm.SetFloat(arg[1:], 1-val)
 | 
					 | 
				
			||||||
			if verbose {
 | 
					 | 
				
			||||||
				fmt.Println("Toggling", arg[1:])
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		} else {
 | 
						return nil
 | 
				
			||||||
			if strings.Contains(arg, "=") {
 | 
					 | 
				
			||||||
				if verbose {
 | 
					 | 
				
			||||||
					fmt.Println("Running command", arg)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
				err := vm.SendText(arg)
 | 
					
 | 
				
			||||||
 | 
					func interactiveMode(vm *voicemeeter.Remote, verbose bool) error {
 | 
				
			||||||
 | 
						scanner := bufio.NewScanner(os.Stdin)
 | 
				
			||||||
 | 
						for scanner.Scan() {
 | 
				
			||||||
 | 
							input := scanner.Text()
 | 
				
			||||||
 | 
							if input == "q" || input == "quit" || input == "" {
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, cmd := range strings.Split(input, " ") {
 | 
				
			||||||
 | 
								err := parse(vm, cmd, verbose)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
					err = fmt.Errorf("unable to set %s", arg)
 | 
					 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			} else {
 | 
							}
 | 
				
			||||||
				valF, err := vm.GetFloat(arg)
 | 
						}
 | 
				
			||||||
				if err != nil {
 | 
						return nil
 | 
				
			||||||
					valS, err := vm.GetString(arg)
 | 
					}
 | 
				
			||||||
					if err != nil {
 | 
					
 | 
				
			||||||
						err = fmt.Errorf("unable to get %s", arg)
 | 
					func parse(vm *voicemeeter.Remote, cmd string, verbose bool) error {
 | 
				
			||||||
						return err
 | 
						if cmd[0] == '!' {
 | 
				
			||||||
					}
 | 
							err := toggleCmd(vm, cmd[1:], verbose)
 | 
				
			||||||
					if verbose {
 | 
							if err != nil {
 | 
				
			||||||
						fmt.Println("Value of", arg, "is:", valS)
 | 
								return err
 | 
				
			||||||
					}
 | 
							}
 | 
				
			||||||
				} else {
 | 
						} else {
 | 
				
			||||||
					if verbose {
 | 
							if strings.Contains(cmd, "=") {
 | 
				
			||||||
						fmt.Println("Value of", arg, "is:", valF)
 | 
								err := setCmd(vm, cmd, verbose)
 | 
				
			||||||
					}
 | 
								if err != nil {
 | 
				
			||||||
				}
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								err := getCmd(vm, cmd, verbose)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func toggleCmd(vm *voicemeeter.Remote, cmd string, verbose bool) error {
 | 
				
			||||||
 | 
						val, err := vm.GetFloat(cmd)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = fmt.Errorf("unable to toggle %s", cmd)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						vm.SetFloat(cmd[1:], 1-val)
 | 
				
			||||||
 | 
						if verbose {
 | 
				
			||||||
 | 
							fmt.Println("Toggling", cmd)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func setCmd(vm *voicemeeter.Remote, cmd string, verbose bool) error {
 | 
				
			||||||
 | 
						if verbose {
 | 
				
			||||||
 | 
							fmt.Println("Running command", cmd)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err := vm.SendText(cmd)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							err = fmt.Errorf("unable to set %s", cmd)
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getCmd(vm *voicemeeter.Remote, cmd string, verbose bool) error {
 | 
				
			||||||
 | 
						valF, err := vm.GetFloat(cmd)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							valS, err := vm.GetString(cmd)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								err = fmt.Errorf("unable to get %s", cmd)
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if verbose {
 | 
				
			||||||
 | 
								fmt.Println("Value of", cmd, "is:", valS)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if verbose {
 | 
				
			||||||
 | 
								fmt.Println("Value of", cmd, "is:", valF)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user