Compare commits

..

No commits in common. "942d1b18bdd76cec63fdb8c0b73e95b8fee12811" and "873ff874291ceabf200a8b93819529a03d9daa89" have entirely different histories.

17 changed files with 35 additions and 298 deletions

View File

@ -3,6 +3,8 @@ package main
import ( import (
"fmt" "fmt"
"time" "time"
"github.com/alecthomas/kong"
) )
// BusCmdGroup defines the commands related to controlling the buses of the X-Air device. // BusCmdGroup defines the commands related to controlling the buses of the X-Air device.
@ -181,13 +183,9 @@ type BusEqCmdGroup struct {
} }
// Validate checks that the provided EQ band number is within the valid range (1-6). // Validate checks that the provided EQ band number is within the valid range (1-6).
func (cmd *BusEqCmdGroup) Validate() error { func (cmd *BusEqCmdGroup) Validate(ctx kong.Context) error {
if cmd.Band.Band == 0 {
return nil
}
if cmd.Band.Band < 1 || cmd.Band.Band > 6 { if cmd.Band.Band < 1 || cmd.Band.Band > 6 {
return fmt.Errorf("EQ band number must be between 1 and 6, got %d", cmd.Band.Band) return fmt.Errorf("EQ band number must be between 1 and 6")
} }
return nil return nil
} }

View File

@ -56,7 +56,6 @@ type CLI struct {
Bus BusCmdGroup `help:"Control the buses." cmd:"" group:"Bus"` Bus BusCmdGroup `help:"Control the buses." cmd:"" group:"Bus"`
Headamp HeadampCmdGroup `help:"Control input gain and phantom power." cmd:"" group:"Headamp"` Headamp HeadampCmdGroup `help:"Control input gain and phantom power." cmd:"" group:"Headamp"`
Snapshot SnapshotCmdGroup `help:"Save and load mixer states." cmd:"" group:"Snapshot"` Snapshot SnapshotCmdGroup `help:"Save and load mixer states." cmd:"" group:"Snapshot"`
Dca DCACmdGroup `help:"Control DCA groups." cmd:"" group:"DCA"`
} }
func main() { func main() {

View File

@ -1,67 +0,0 @@
package main
import (
"fmt"
)
type DCACmdGroup struct {
Index struct {
Index int `arg:"" help:"The index of the DCA group (1-8)."`
Mute DCAMuteCmd `help:"Get or set the mute status of the DCA group." cmd:""`
Name DCANameCmd `help:"Get or set the name of the DCA group." cmd:""`
} `arg:"" help:"Control a specific DCA group by its index."`
}
// Validate checks if the provided index is within the valid range.
func (cmd *DCACmdGroup) Validate() error {
if cmd.Index.Index < 1 || cmd.Index.Index > 8 {
return fmt.Errorf("DCA group index must be between 1 and 8, got %d", cmd.Index.Index)
}
return nil
}
// DCAMuteCmd is the command to get or set the mute status of a DCA group.
type DCAMuteCmd struct {
State *string `arg:"" help:"Set the mute status of the DCA group." optional:"" enum:"true,false"`
}
// Run executes the DCAMuteCmd command.
func (cmd *DCAMuteCmd) Run(ctx *context, dca *DCACmdGroup) error {
if cmd.State == nil {
resp, err := ctx.Client.DCA.Mute(dca.Index.Index)
if err != nil {
return fmt.Errorf("failed to get DCA mute status: %w", err)
}
fmt.Fprintf(ctx.Out, "DCA Group %d mute state: %t\n", dca.Index.Index, resp)
return nil
}
if err := ctx.Client.DCA.SetMute(dca.Index.Index, *cmd.State == "true"); err != nil {
return fmt.Errorf("failed to set DCA mute status: %w", err)
}
return nil
}
// DCANameCmd is the command to get or set the name of a DCA group.
type DCANameCmd struct {
Name *string `arg:"" help:"Set the name of the DCA group." optional:""`
}
// Run executes the DCANameCmd command.
func (cmd *DCANameCmd) Run(ctx *context, dca *DCACmdGroup) error {
if cmd.Name == nil {
resp, err := ctx.Client.DCA.Name(dca.Index.Index)
if err != nil {
return fmt.Errorf("failed to get DCA name: %w", err)
}
if resp == "" {
resp = fmt.Sprintf("DCA %d", dca.Index.Index)
}
fmt.Fprintf(ctx.Out, "DCA Group %d is named '%s'\n", dca.Index.Index, resp)
return nil
}
if err := ctx.Client.DCA.SetName(dca.Index.Index, *cmd.Name); err != nil {
return fmt.Errorf("failed to set DCA name: %w", err)
}
return nil
}

View File

@ -3,6 +3,8 @@ package main
import ( import (
"fmt" "fmt"
"time" "time"
"github.com/alecthomas/kong"
) )
// MainCmdGroup defines the command group for controlling the Main L/R output, including commands for mute state, fader level, and fade-in/fade-out times. // MainCmdGroup defines the command group for controlling the Main L/R output, including commands for mute state, fader level, and fade-in/fade-out times.
@ -144,13 +146,9 @@ type MainEqCmdGroup struct {
} }
// Validate checks if the provided EQ band number is within the valid range (1-6) for the Main L/R output. // Validate checks if the provided EQ band number is within the valid range (1-6) for the Main L/R output.
func (cmd *MainEqCmdGroup) Validate() error { func (cmd *MainEqCmdGroup) Validate(ctx kong.Context) error {
if cmd.Band.Band == 0 {
return nil
}
if cmd.Band.Band < 1 || cmd.Band.Band > 6 { if cmd.Band.Band < 1 || cmd.Band.Band > 6 {
return fmt.Errorf("EQ band number must be between 1 and 6, got %d", cmd.Band.Band) return fmt.Errorf("invalid EQ band number: %d. Valid range is 1-6", cmd.Band.Band)
} }
return nil return nil
} }

View File

@ -3,6 +3,8 @@ package main
import ( import (
"fmt" "fmt"
"time" "time"
"github.com/alecthomas/kong"
) )
// MainMonoCmdGroup defines the command group for controlling the Main Mono output, including commands for mute state, fader level, and fade-in/fade-out times. // MainMonoCmdGroup defines the command group for controlling the Main Mono output, including commands for mute state, fader level, and fade-in/fade-out times.
@ -144,13 +146,9 @@ type MainMonoEqCmdGroup struct {
} }
// Validate checks if the provided EQ band number is within the valid range (1-6) for the Main Mono output. // Validate checks if the provided EQ band number is within the valid range (1-6) for the Main Mono output.
func (cmd *MainMonoEqCmdGroup) Validate() error { func (cmd *MainMonoEqCmdGroup) Validate(ctx kong.Context) error {
if cmd.Band.Band == 0 {
return nil
}
if cmd.Band.Band < 1 || cmd.Band.Band > 6 { if cmd.Band.Band < 1 || cmd.Band.Band > 6 {
return fmt.Errorf("EQ band number must be between 1 and 6, got %d", cmd.Band.Band) return fmt.Errorf("invalid EQ band number: %d. Valid range is 1-6", cmd.Band.Band)
} }
return nil return nil
} }

View File

@ -3,6 +3,8 @@ package main
import ( import (
"fmt" "fmt"
"time" "time"
"github.com/alecthomas/kong"
) )
// MatrixCmdGroup defines the command group for controlling the Matrix outputs, including commands for mute state, fader level, and fade-in/fade-out times. // MatrixCmdGroup defines the command group for controlling the Matrix outputs, including commands for mute state, fader level, and fade-in/fade-out times.
@ -20,9 +22,9 @@ type MatrixCmdGroup struct {
} `help:"Commands for controlling individual Matrix outputs." arg:""` } `help:"Commands for controlling individual Matrix outputs." arg:""`
} }
func (cmd *MatrixCmdGroup) Validate() error { func (cmd *MatrixCmdGroup) Validate(ctx kong.Context) error {
if cmd.Index.Index < 1 || cmd.Index.Index > 6 { if cmd.Index.Index < 1 || cmd.Index.Index > 6 {
return fmt.Errorf("Matrix output index must be between 1 and 6, got %d", cmd.Index.Index) return fmt.Errorf("invalid Matrix output index: %d. Valid range is 1-6", cmd.Index.Index)
} }
return nil return nil
} }
@ -154,13 +156,9 @@ type MatrixEqCmdGroup struct {
} }
// Validate checks if the provided EQ band number is within the valid range (1-6) for the Matrix output. // Validate checks if the provided EQ band number is within the valid range (1-6) for the Matrix output.
func (cmd *MatrixEqCmdGroup) Validate() error { func (cmd *MatrixEqCmdGroup) Validate(ctx kong.Context) error {
if cmd.Band.Band == 0 {
return nil
}
if cmd.Band.Band < 1 || cmd.Band.Band > 6 { if cmd.Band.Band < 1 || cmd.Band.Band > 6 {
return fmt.Errorf("EQ band number must be between 1 and 6, got %d", cmd.Band.Band) return fmt.Errorf("invalid EQ band number: %d. Valid range is 1-6", cmd.Band.Band)
} }
return nil return nil
} }

View File

@ -3,6 +3,8 @@ package main
import ( import (
"fmt" "fmt"
"time" "time"
"github.com/alecthomas/kong"
) )
// StripCmdGroup defines the command group for controlling the strips of the mixer, including commands for getting and setting various parameters such as mute state, fader level, send levels, and EQ settings. // StripCmdGroup defines the command group for controlling the strips of the mixer, including commands for getting and setting various parameters such as mute state, fader level, send levels, and EQ settings.
@ -372,13 +374,9 @@ type StripEqCmdGroup struct {
} }
// Validate checks if the provided EQ band number is valid (between 1 and 4) and returns an error if it is not. // Validate checks if the provided EQ band number is valid (between 1 and 4) and returns an error if it is not.
func (cmd *StripEqCmdGroup) Validate() error { func (cmd *StripEqCmdGroup) Validate(ctx kong.Context) error {
if cmd.Band.Band == 0 {
return nil
}
if cmd.Band.Band < 1 || cmd.Band.Band > 4 { if cmd.Band.Band < 1 || cmd.Band.Band > 4 {
return fmt.Errorf("EQ band number must be between 1 and 4, got %d", cmd.Band.Band) return fmt.Errorf("EQ band number must be between 1 and 4")
} }
return nil return nil
} }

View File

@ -3,6 +3,8 @@ package main
import ( import (
"fmt" "fmt"
"time" "time"
"github.com/alecthomas/kong"
) )
// BusCmdGroup defines the commands related to controlling the buses of the X-Air device. // BusCmdGroup defines the commands related to controlling the buses of the X-Air device.
@ -181,14 +183,9 @@ type BusEqCmdGroup struct {
} }
// Validate checks that the provided EQ band number is within the valid range (1-6). // Validate checks that the provided EQ band number is within the valid range (1-6).
// Only validates when a band number is actually specified (non-zero). func (cmd *BusEqCmdGroup) Validate(ctx kong.Context) error {
func (cmd *BusEqCmdGroup) Validate() error {
if cmd.Band.Band == 0 {
return nil
}
if cmd.Band.Band < 1 || cmd.Band.Band > 6 { if cmd.Band.Band < 1 || cmd.Band.Band > 6 {
return fmt.Errorf("EQ band number must be between 1 and 6, got %d", cmd.Band.Band) return fmt.Errorf("EQ band number must be between 1 and 6")
} }
return nil return nil
} }

View File

@ -54,7 +54,6 @@ type CLI struct {
Bus BusCmdGroup `help:"Control the buses." cmd:"" group:"Bus"` Bus BusCmdGroup `help:"Control the buses." cmd:"" group:"Bus"`
Headamp HeadampCmdGroup `help:"Control input gain and phantom power." cmd:"" group:"Headamp"` Headamp HeadampCmdGroup `help:"Control input gain and phantom power." cmd:"" group:"Headamp"`
Snapshot SnapshotCmdGroup `help:"Save and load mixer states." cmd:"" group:"Snapshot"` Snapshot SnapshotCmdGroup `help:"Save and load mixer states." cmd:"" group:"Snapshot"`
Dca DCACmdGroup `help:"Control DCA groups." cmd:"" group:"DCA"`
} }
func main() { func main() {

View File

@ -1,68 +0,0 @@
package main
import (
"fmt"
)
// DCACmdGroup is the command group for controlling DCA groups.
type DCACmdGroup struct {
Index struct {
Index int `arg:"" help:"The index of the DCA group (1-4)."`
Mute DCAMuteCmd `help:"Get or set the mute status of the DCA group." cmd:""`
Name DCANameCmd `help:"Get or set the name of the DCA group." cmd:""`
} `arg:"" help:"Control a specific DCA group by its index."`
}
// Validate checks if the provided index is within the valid range.
func (cmd *DCACmdGroup) Validate() error {
if cmd.Index.Index < 1 || cmd.Index.Index > 4 {
return fmt.Errorf("DCA group index must be between 1 and 4, got %d", cmd.Index.Index)
}
return nil
}
// DCAMuteCmd is the command to get or set the mute status of a DCA group.
type DCAMuteCmd struct {
State *string `arg:"" help:"Set the mute status of the DCA group." optional:"" enum:"true,false"`
}
// Run executes the DCAMuteCmd command.
func (cmd *DCAMuteCmd) Run(ctx *context, dca *DCACmdGroup) error {
if cmd.State == nil {
resp, err := ctx.Client.DCA.Mute(dca.Index.Index)
if err != nil {
return fmt.Errorf("failed to get DCA mute status: %w", err)
}
fmt.Fprintf(ctx.Out, "DCA Group %d mute state: %t\n", dca.Index.Index, resp)
return nil
}
if err := ctx.Client.DCA.SetMute(dca.Index.Index, *cmd.State == "true"); err != nil {
return fmt.Errorf("failed to set DCA mute status: %w", err)
}
return nil
}
// DCANameCmd is the command to get or set the name of a DCA group.
type DCANameCmd struct {
Name *string `arg:"" help:"Set the name of the DCA group." optional:""`
}
// Run executes the DCANameCmd command.
func (cmd *DCANameCmd) Run(ctx *context, dca *DCACmdGroup) error {
if cmd.Name == nil {
resp, err := ctx.Client.DCA.Name(dca.Index.Index)
if err != nil {
return fmt.Errorf("failed to get DCA name: %w", err)
}
if resp == "" {
resp = fmt.Sprintf("DCA %d", dca.Index.Index)
}
fmt.Fprintf(ctx.Out, "DCA Group %d is named '%s'\n", dca.Index.Index, resp)
return nil
}
if err := ctx.Client.DCA.SetName(dca.Index.Index, *cmd.Name); err != nil {
return fmt.Errorf("failed to set DCA name: %w", err)
}
return nil
}

View File

@ -3,6 +3,8 @@ package main
import ( import (
"fmt" "fmt"
"time" "time"
"github.com/alecthomas/kong"
) )
// MainCmdGroup defines the command group for controlling the Main L/R output, including commands for mute state, fader level, and fade-in/fade-out times. // MainCmdGroup defines the command group for controlling the Main L/R output, including commands for mute state, fader level, and fade-in/fade-out times.
@ -144,13 +146,9 @@ type MainEqCmdGroup struct {
} }
// Validate checks if the provided EQ band number is within the valid range (1-6) for the Main L/R output. // Validate checks if the provided EQ band number is within the valid range (1-6) for the Main L/R output.
func (cmd *MainEqCmdGroup) Validate() error { func (cmd *MainEqCmdGroup) Validate(ctx kong.Context) error {
if cmd.Band.Band == 0 {
return nil
}
if cmd.Band.Band < 1 || cmd.Band.Band > 6 { if cmd.Band.Band < 1 || cmd.Band.Band > 6 {
return fmt.Errorf("EQ band number must be between 1 and 6, got %d", cmd.Band.Band) return fmt.Errorf("invalid EQ band number: %d. Valid range is 1-6", cmd.Band.Band)
} }
return nil return nil
} }

View File

@ -3,6 +3,8 @@ package main
import ( import (
"fmt" "fmt"
"time" "time"
"github.com/alecthomas/kong"
) )
// StripCmdGroup defines the command group for controlling the strips of the mixer, including commands for getting and setting various parameters such as mute state, fader level, send levels, and EQ settings. // StripCmdGroup defines the command group for controlling the strips of the mixer, including commands for getting and setting various parameters such as mute state, fader level, send levels, and EQ settings.
@ -372,13 +374,9 @@ type StripEqCmdGroup struct {
} }
// Validate checks if the provided EQ band number is valid (between 1 and 4) and returns an error if it is not. // Validate checks if the provided EQ band number is valid (between 1 and 4) and returns an error if it is not.
func (cmd *StripEqCmdGroup) Validate() error { func (cmd *StripEqCmdGroup) Validate(ctx kong.Context) error {
if cmd.Band.Band == 0 {
return nil
}
if cmd.Band.Band < 1 || cmd.Band.Band > 4 { if cmd.Band.Band < 1 || cmd.Band.Band > 4 {
return fmt.Errorf("EQ band number must be between 1 and 4, got %d", cmd.Band.Band) return fmt.Errorf("EQ band number must be between 1 and 4")
} }
return nil return nil
} }

View File

@ -3,10 +3,9 @@ package xair
var xairAddressMap = map[string]string{ var xairAddressMap = map[string]string{
"main": "/lr", "main": "/lr",
"strip": "/ch/%02d", "strip": "/ch/%02d",
"bus": "/bus/%d", "bus": "/bus/%01d",
"headamp": "/headamp/%02d", "headamp": "/headamp/%02d",
"snapshot": "/-snap", "snapshot": "/-snap",
"dca": "/dca/%d",
} }
var x32AddressMap = map[string]string{ var x32AddressMap = map[string]string{
@ -17,7 +16,6 @@ var x32AddressMap = map[string]string{
"bus": "/bus/%02d", "bus": "/bus/%02d",
"headamp": "/headamp/%03d", "headamp": "/headamp/%03d",
"snapshot": "/-snap", "snapshot": "/-snap",
"dca": "/dca/%d",
} }
func addressMapFromMixerKind(kind mixerKind) map[string]string { func addressMapFromMixerKind(kind mixerKind) map[string]string {

View File

@ -21,7 +21,6 @@ type XAirClient struct {
Bus *Bus Bus *Bus
HeadAmp *HeadAmp HeadAmp *HeadAmp
Snapshot *Snapshot Snapshot *Snapshot
DCA *DCA
} }
// X32Client is a client for controlling X32 mixers // X32Client is a client for controlling X32 mixers
@ -34,7 +33,6 @@ type X32Client struct {
Bus *Bus Bus *Bus
HeadAmp *HeadAmp HeadAmp *HeadAmp
Snapshot *Snapshot Snapshot *Snapshot
DCA *DCA
} }
// NewX32Client creates a new X32Client instance with optional engine configuration // NewX32Client creates a new X32Client instance with optional engine configuration
@ -54,7 +52,6 @@ func NewX32Client(mixerIP string, mixerPort int, opts ...EngineOption) (*X32Clie
c.Bus = newBus(&c.Client) c.Bus = newBus(&c.Client)
c.HeadAmp = newHeadAmp(&c.Client) c.HeadAmp = newHeadAmp(&c.Client)
c.Snapshot = newSnapshot(&c.Client) c.Snapshot = newSnapshot(&c.Client)
c.DCA = newDCA(&c.Client)
return c, nil return c, nil
} }
@ -74,7 +71,6 @@ func NewXAirClient(mixerIP string, mixerPort int, opts ...EngineOption) (*XAirCl
c.Bus = newBus(&c.Client) c.Bus = newBus(&c.Client)
c.HeadAmp = newHeadAmp(&c.Client) c.HeadAmp = newHeadAmp(&c.Client)
c.Snapshot = newSnapshot(&c.Client) c.Snapshot = newSnapshot(&c.Client)
c.DCA = newDCA(&c.Client)
return c, nil return c, nil
} }

View File

@ -1,95 +0,0 @@
package xair
import "fmt"
type DCA struct {
client *Client
baseAddress string
}
// newDCA creates a new DCA instance
func newDCA(c *Client) *DCA {
return &DCA{
client: c,
baseAddress: c.addressMap["dca"],
}
}
// Mute requests the current mute status for a DCA group
func (d *DCA) Mute(group int) (bool, error) {
address := fmt.Sprintf(d.baseAddress, group) + "/on"
err := d.client.SendMessage(address)
if err != nil {
return false, err
}
msg, err := d.client.ReceiveMessage()
if err != nil {
return false, err
}
val, ok := msg.Arguments[0].(int32)
if !ok {
return false, fmt.Errorf("unexpected argument type for DCA mute value")
}
return val == 0, nil
}
// SetMute sets the mute status for a specific DCA group (1-based indexing)
func (d *DCA) SetMute(group int, muted bool) error {
address := fmt.Sprintf(d.baseAddress, group) + "/on"
var value int32
if !muted {
value = 1
}
return d.client.SendMessage(address, value)
}
// Name requests the current name for a DCA group
func (d *DCA) Name(group int) (string, error) {
address := fmt.Sprintf(d.baseAddress, group) + "/config/name"
err := d.client.SendMessage(address)
if err != nil {
return "", err
}
msg, err := d.client.ReceiveMessage()
if err != nil {
return "", err
}
name, ok := msg.Arguments[0].(string)
if !ok {
return "", fmt.Errorf("unexpected argument type for DCA name value")
}
return name, nil
}
// SetName sets the name for a specific DCA group (1-based indexing)
func (d *DCA) SetName(group int, name string) error {
address := fmt.Sprintf(d.baseAddress, group) + "/config/name"
return d.client.SendMessage(address, name)
}
// Color requests the current color for a DCA group
func (d *DCA) Color(group int) (int32, error) {
address := fmt.Sprintf(d.baseAddress, group) + "/config/color"
err := d.client.SendMessage(address)
if err != nil {
return 0, err
}
msg, err := d.client.ReceiveMessage()
if err != nil {
return 0, err
}
color, ok := msg.Arguments[0].(int32)
if !ok {
return 0, fmt.Errorf("unexpected argument type for DCA color value")
}
return color, nil
}
// SetColor sets the color for a specific DCA group (1-based indexing)
func (d *DCA) SetColor(group int, color int32) error {
address := fmt.Sprintf(d.baseAddress, group) + "/config/color"
return d.client.SendMessage(address, color)
}

View File

@ -190,9 +190,5 @@ Snapshot
snapshot <index> load Load a mixer state from a snapshot. snapshot <index> load Load a mixer state from a snapshot.
snapshot <index> delete Delete a snapshot. snapshot <index> delete Delete a snapshot.
DCA
dca <index> mute Get or set the mute status of the DCA group.
dca <index> name Get or set the name of the DCA group.
Run "x32-cli <command> --help" for more information on a command. Run "x32-cli <command> --help" for more information on a command.
``` ```

View File

@ -122,9 +122,5 @@ Snapshot
snapshot <index> load Load a mixer state from a snapshot. snapshot <index> load Load a mixer state from a snapshot.
snapshot <index> delete Delete a snapshot. snapshot <index> delete Delete a snapshot.
DCA
dca <index> mute Get or set the mute status of the DCA group.
dca <index> name Get or set the name of the DCA group.
Run "xair-cli <command> --help" for more information on a command. Run "xair-cli <command> --help" for more information on a command.
``` ```