mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-18 08:36:13 +00:00
Move example files to separate packages to avoid main redeclaration. Fix cyclomatic complexity and variable shadowing. Address errcheck and wsl linting issues. Update tests to handle capabilities and fix panics. Apply consistent formatting with gofmt.
400 lines
11 KiB
Go
400 lines
11 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/urfave/cli/v2"
|
|
)
|
|
|
|
// getAudioDSPControls gets the current DSP audio controls
|
|
func getAudioDSPControls(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
PrintDeviceHeader("Getting DSP audio controls", clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
dspControls, err := client.GetAudioDSPControls()
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to get DSP controls: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Println("DSP Audio Controls:")
|
|
fmt.Printf(" Audio Mode: %s\n", dspControls.AudioMode)
|
|
fmt.Printf(" Video Sync Audio Delay: %d ms\n", dspControls.VideoSyncAudioDelay)
|
|
|
|
supportedModes := dspControls.GetSupportedAudioModes()
|
|
if len(supportedModes) > 0 {
|
|
fmt.Printf(" Supported Audio Modes: %s\n", strings.Join(supportedModes, ", "))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// setAudioDSPControls sets the DSP audio controls
|
|
func setAudioDSPControls(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
audioMode := c.String("mode")
|
|
videoSyncDelay := c.Int("delay")
|
|
|
|
if audioMode == "" && videoSyncDelay == 0 {
|
|
return fmt.Errorf("at least one of --mode or --delay must be specified")
|
|
}
|
|
|
|
PrintDeviceHeader("Setting DSP audio controls", clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
err = client.SetAudioDSPControls(audioMode, videoSyncDelay)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to set DSP controls: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Println("✅ DSP controls updated successfully")
|
|
|
|
if audioMode != "" {
|
|
fmt.Printf(" Audio Mode: %s\n", audioMode)
|
|
}
|
|
|
|
if videoSyncDelay != 0 {
|
|
fmt.Printf(" Video Sync Delay: %d ms\n", videoSyncDelay)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// setAudioMode sets only the audio mode
|
|
func setAudioMode(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
audioMode := c.String("mode")
|
|
|
|
if audioMode == "" {
|
|
return fmt.Errorf("audio mode is required (use --mode)")
|
|
}
|
|
|
|
PrintDeviceHeader(fmt.Sprintf("Setting audio mode to '%s'", audioMode), clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
err = client.SetAudioMode(audioMode)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to set audio mode: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Printf("✅ Audio mode set to '%s'\n", audioMode)
|
|
|
|
return nil
|
|
}
|
|
|
|
// setVideoSyncDelay sets only the video sync audio delay
|
|
func setVideoSyncDelay(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
delay := c.Int("delay")
|
|
|
|
PrintDeviceHeader(fmt.Sprintf("Setting video sync audio delay to %d ms", delay), clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
err = client.SetVideoSyncAudioDelay(delay)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to set video sync delay: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Printf("✅ Video sync audio delay set to %d ms\n", delay)
|
|
|
|
return nil
|
|
}
|
|
|
|
// getAudioToneControls gets the current advanced tone controls
|
|
func getAudioToneControls(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
PrintDeviceHeader("Getting advanced tone controls", clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
toneControls, err := client.GetAudioProductToneControls()
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to get tone controls: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Println("Advanced Tone Controls:")
|
|
fmt.Printf(" Bass: %d (range: %d to %d, step: %d)\n",
|
|
toneControls.Bass.Value, toneControls.Bass.MinValue, toneControls.Bass.MaxValue, toneControls.Bass.Step)
|
|
fmt.Printf(" Treble: %d (range: %d to %d, step: %d)\n",
|
|
toneControls.Treble.Value, toneControls.Treble.MinValue, toneControls.Treble.MaxValue, toneControls.Treble.Step)
|
|
|
|
return nil
|
|
}
|
|
|
|
// setAudioToneControls sets the advanced tone controls
|
|
func setAudioToneControls(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
bassStr := c.String("bass")
|
|
trebleStr := c.String("treble")
|
|
|
|
if bassStr == "" && trebleStr == "" {
|
|
return fmt.Errorf("at least one of --bass or --treble must be specified")
|
|
}
|
|
|
|
var bass, treble *int
|
|
|
|
var err error
|
|
|
|
if bassStr != "" {
|
|
bassVal, errVal := strconv.Atoi(bassStr)
|
|
if errVal != nil {
|
|
return fmt.Errorf("invalid bass value: %s", bassStr)
|
|
}
|
|
|
|
bass = &bassVal
|
|
}
|
|
|
|
if trebleStr != "" {
|
|
trebleVal, errVal := strconv.Atoi(trebleStr)
|
|
if errVal != nil {
|
|
return fmt.Errorf("invalid treble value: %s", trebleStr)
|
|
}
|
|
|
|
treble = &trebleVal
|
|
}
|
|
|
|
PrintDeviceHeader("Setting advanced tone controls", clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
err = client.SetAudioProductToneControls(bass, treble)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to set tone controls: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Println("✅ Advanced tone controls updated successfully")
|
|
|
|
if bass != nil {
|
|
fmt.Printf(" Bass: %d\n", *bass)
|
|
}
|
|
|
|
if treble != nil {
|
|
fmt.Printf(" Treble: %d\n", *treble)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// setAdvancedBass sets only the advanced bass control
|
|
func setAdvancedBass(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
level := c.Int("level")
|
|
|
|
PrintDeviceHeader(fmt.Sprintf("Setting advanced bass to %d", level), clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
err = client.SetAdvancedBass(level)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to set advanced bass: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Printf("✅ Advanced bass set to %d\n", level)
|
|
|
|
return nil
|
|
}
|
|
|
|
// setAdvancedTreble sets only the advanced treble control
|
|
func setAdvancedTreble(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
level := c.Int("level")
|
|
|
|
PrintDeviceHeader(fmt.Sprintf("Setting advanced treble to %d", level), clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
err = client.SetAdvancedTreble(level)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to set advanced treble: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Printf("✅ Advanced treble set to %d\n", level)
|
|
|
|
return nil
|
|
}
|
|
|
|
// getAudioLevelControls gets the current speaker level controls
|
|
func getAudioLevelControls(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
PrintDeviceHeader("Getting speaker level controls", clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
levelControls, err := client.GetAudioProductLevelControls()
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to get level controls: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Println("Speaker Level Controls:")
|
|
fmt.Printf(" Front-Center Speaker: %d (range: %d to %d, step: %d)\n",
|
|
levelControls.FrontCenterSpeakerLevel.Value,
|
|
levelControls.FrontCenterSpeakerLevel.MinValue,
|
|
levelControls.FrontCenterSpeakerLevel.MaxValue,
|
|
levelControls.FrontCenterSpeakerLevel.Step)
|
|
fmt.Printf(" Rear-Surround Speakers: %d (range: %d to %d, step: %d)\n",
|
|
levelControls.RearSurroundSpeakersLevel.Value,
|
|
levelControls.RearSurroundSpeakersLevel.MinValue,
|
|
levelControls.RearSurroundSpeakersLevel.MaxValue,
|
|
levelControls.RearSurroundSpeakersLevel.Step)
|
|
|
|
return nil
|
|
}
|
|
|
|
// setAudioLevelControls sets the speaker level controls
|
|
func setAudioLevelControls(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
frontCenterStr := c.String("front-center")
|
|
rearSurroundStr := c.String("rear-surround")
|
|
|
|
if frontCenterStr == "" && rearSurroundStr == "" {
|
|
return fmt.Errorf("at least one of --front-center or --rear-surround must be specified")
|
|
}
|
|
|
|
var frontCenter, rearSurround *int
|
|
|
|
var err error
|
|
|
|
if frontCenterStr != "" {
|
|
frontCenterVal, errVal := strconv.Atoi(frontCenterStr)
|
|
if errVal != nil {
|
|
return fmt.Errorf("invalid front-center value: %s", frontCenterStr)
|
|
}
|
|
|
|
frontCenter = &frontCenterVal
|
|
}
|
|
|
|
if rearSurroundStr != "" {
|
|
rearSurroundVal, errVal := strconv.Atoi(rearSurroundStr)
|
|
if errVal != nil {
|
|
return fmt.Errorf("invalid rear-surround value: %s", rearSurroundStr)
|
|
}
|
|
|
|
rearSurround = &rearSurroundVal
|
|
}
|
|
|
|
PrintDeviceHeader("Setting speaker level controls", clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
err = client.SetAudioProductLevelControls(frontCenter, rearSurround)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to set level controls: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Println("✅ Speaker level controls updated successfully")
|
|
|
|
if frontCenter != nil {
|
|
fmt.Printf(" Front-Center Speaker: %d\n", *frontCenter)
|
|
}
|
|
|
|
if rearSurround != nil {
|
|
fmt.Printf(" Rear-Surround Speakers: %d\n", *rearSurround)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// setFrontCenterLevel sets only the front-center speaker level
|
|
func setFrontCenterLevel(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
level := c.Int("level")
|
|
|
|
PrintDeviceHeader(fmt.Sprintf("Setting front-center speaker level to %d", level), clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
err = client.SetFrontCenterSpeakerLevel(level)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to set front-center speaker level: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Printf("✅ Front-center speaker level set to %d\n", level)
|
|
|
|
return nil
|
|
}
|
|
|
|
// setRearSurroundLevel sets only the rear-surround speakers level
|
|
func setRearSurroundLevel(c *cli.Context) error {
|
|
clientConfig := GetClientConfig(c)
|
|
level := c.Int("level")
|
|
|
|
PrintDeviceHeader(fmt.Sprintf("Setting rear-surround speakers level to %d", level), clientConfig.Host, clientConfig.Port)
|
|
|
|
client, err := CreateSoundTouchClient(clientConfig)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to create client: %v", err))
|
|
return err
|
|
}
|
|
|
|
err = client.SetRearSurroundSpeakersLevel(level)
|
|
if err != nil {
|
|
PrintError(fmt.Sprintf("Failed to set rear-surround speakers level: %v", err))
|
|
return err
|
|
}
|
|
|
|
fmt.Printf("✅ Rear-surround speakers level set to %d\n", level)
|
|
|
|
return nil
|
|
}
|