mirror of
https://github.com/onyx-and-iris/xair-cli.git
synced 2026-03-12 14:39:10 +00:00
Compare commits
No commits in common. "58866b794b6fa2661a692e365d7f06079f49b590" and "106f896c453e206537ff8c247456964716b98c04" have entirely different histories.
58866b794b
...
106f896c45
@ -46,10 +46,9 @@ type CLI struct {
|
|||||||
|
|
||||||
Version VersionFlag `help:"Print x32-cli version information and quit" name:"version" short:"v"`
|
Version VersionFlag `help:"Print x32-cli version information and quit" name:"version" short:"v"`
|
||||||
|
|
||||||
Completion kongcompletion.Completion `help:"Generate shell completion scripts." cmd:""`
|
Completion kongcompletion.Completion `help:"Generate shell completion scripts." cmd:"" aliases:"c"`
|
||||||
Info InfoCmd `help:"Print mixer information." cmd:""`
|
|
||||||
Raw RawCmd `help:"Send raw OSC messages to the mixer." cmd:""`
|
|
||||||
|
|
||||||
|
Raw RawCmd `help:"Send raw OSC messages to the mixer." cmd:"" group:"Raw"`
|
||||||
Main MainCmdGroup `help:"Control the Main L/R output" cmd:"" group:"Main"`
|
Main MainCmdGroup `help:"Control the Main L/R output" cmd:"" group:"Main"`
|
||||||
Mainmono MainMonoCmdGroup `help:"Control the Main Mono output" cmd:"" group:"MainMono"`
|
Mainmono MainMonoCmdGroup `help:"Control the Main Mono output" cmd:"" group:"MainMono"`
|
||||||
Matrix MatrixCmdGroup `help:"Control the matrix outputs." cmd:"" group:"Matrix"`
|
Matrix MatrixCmdGroup `help:"Control the matrix outputs." cmd:"" group:"Matrix"`
|
||||||
|
|||||||
@ -1,18 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
type InfoCmd struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *InfoCmd) Run(ctx *context) error {
|
|
||||||
fmt.Fprintf(
|
|
||||||
ctx.Out,
|
|
||||||
"Host: %s | Name: %s | Model: %s | Firmware: %s\n",
|
|
||||||
ctx.Client.Info.Host,
|
|
||||||
ctx.Client.Info.Name,
|
|
||||||
ctx.Client.Info.Model,
|
|
||||||
ctx.Client.Info.Firmware,
|
|
||||||
)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -46,10 +46,9 @@ type CLI struct {
|
|||||||
|
|
||||||
Version VersionFlag `help:"Print xair-cli version information and quit" name:"version" short:"v"`
|
Version VersionFlag `help:"Print xair-cli version information and quit" name:"version" short:"v"`
|
||||||
|
|
||||||
Completion kongcompletion.Completion `help:"Generate shell completion scripts." cmd:""`
|
Completion kongcompletion.Completion `help:"Generate shell completion scripts." cmd:"" aliases:"c"`
|
||||||
Info InfoCmd `help:"Print mixer information." cmd:""`
|
|
||||||
Raw RawCmd `help:"Send raw OSC messages to the mixer." cmd:""`
|
|
||||||
|
|
||||||
|
Raw RawCmd `help:"Send raw OSC messages to the mixer." cmd:"" group:"Raw"`
|
||||||
Main MainCmdGroup `help:"Control the Main L/R output" cmd:"" group:"Main"`
|
Main MainCmdGroup `help:"Control the Main L/R output" cmd:"" group:"Main"`
|
||||||
Strip StripCmdGroup `help:"Control the strips." cmd:"" group:"Strip"`
|
Strip StripCmdGroup `help:"Control the strips." cmd:"" group:"Strip"`
|
||||||
Bus BusCmdGroup `help:"Control the buses." cmd:"" group:"Bus"`
|
Bus BusCmdGroup `help:"Control the buses." cmd:"" group:"Bus"`
|
||||||
|
|||||||
@ -1,18 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
type InfoCmd struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *InfoCmd) Run(ctx *context) error {
|
|
||||||
fmt.Fprintf(
|
|
||||||
ctx.Out,
|
|
||||||
"Host: %s | Name: %s | Model: %s | Firmware: %s\n",
|
|
||||||
ctx.Client.Info.Host,
|
|
||||||
ctx.Client.Info.Name,
|
|
||||||
ctx.Client.Info.Model,
|
|
||||||
ctx.Client.Info.Firmware,
|
|
||||||
)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@ -3,14 +3,14 @@ package xair
|
|||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
type Bus struct {
|
type Bus struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
Eq *Eq
|
Eq *Eq
|
||||||
Comp *Comp
|
Comp *Comp
|
||||||
}
|
}
|
||||||
|
|
||||||
// newBus creates a new Bus instance
|
// newBus creates a new Bus instance
|
||||||
func newBus(c *client) *Bus {
|
func newBus(c *Client) *Bus {
|
||||||
return &Bus{
|
return &Bus{
|
||||||
client: c,
|
client: c,
|
||||||
baseAddress: c.addressMap["bus"],
|
baseAddress: c.addressMap["bus"],
|
||||||
|
|||||||
@ -9,9 +9,13 @@ import (
|
|||||||
"github.com/hypebeast/go-osc/osc"
|
"github.com/hypebeast/go-osc/osc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Client struct {
|
||||||
|
*engine
|
||||||
|
}
|
||||||
|
|
||||||
// XAirClient is a client for controlling XAir mixers
|
// XAirClient is a client for controlling XAir mixers
|
||||||
type XAirClient struct {
|
type XAirClient struct {
|
||||||
client
|
Client
|
||||||
Main *Main
|
Main *Main
|
||||||
Strip *Strip
|
Strip *Strip
|
||||||
Bus *Bus
|
Bus *Bus
|
||||||
@ -20,29 +24,9 @@ type XAirClient struct {
|
|||||||
DCA *DCA
|
DCA *DCA
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewXAirClient creates a new XAirClient instance with optional engine configuration
|
|
||||||
func NewXAirClient(mixerIP string, mixerPort int, opts ...EngineOption) (*XAirClient, error) {
|
|
||||||
e, err := newEngine(mixerIP, mixerPort, kindXAir, opts...)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c := &XAirClient{
|
|
||||||
client: client{e, InfoResponse{}},
|
|
||||||
}
|
|
||||||
c.Main = newMainStereo(&c.client)
|
|
||||||
c.Strip = newStrip(&c.client)
|
|
||||||
c.Bus = newBus(&c.client)
|
|
||||||
c.HeadAmp = newHeadAmp(&c.client)
|
|
||||||
c.Snapshot = newSnapshot(&c.client)
|
|
||||||
c.DCA = newDCA(&c.client)
|
|
||||||
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// X32Client is a client for controlling X32 mixers
|
// X32Client is a client for controlling X32 mixers
|
||||||
type X32Client struct {
|
type X32Client struct {
|
||||||
client
|
Client
|
||||||
Main *Main
|
Main *Main
|
||||||
MainMono *Main
|
MainMono *Main
|
||||||
Matrix *Matrix
|
Matrix *Matrix
|
||||||
@ -61,33 +45,48 @@ func NewX32Client(mixerIP string, mixerPort int, opts ...EngineOption) (*X32Clie
|
|||||||
}
|
}
|
||||||
|
|
||||||
c := &X32Client{
|
c := &X32Client{
|
||||||
client: client{e, InfoResponse{}},
|
Client: Client{e},
|
||||||
}
|
}
|
||||||
c.Main = newMainStereo(&c.client)
|
c.Main = newMainStereo(&c.Client)
|
||||||
c.MainMono = newMainMono(&c.client)
|
c.MainMono = newMainMono(&c.Client)
|
||||||
c.Matrix = newMatrix(&c.client)
|
c.Matrix = newMatrix(&c.Client)
|
||||||
c.Strip = newStrip(&c.client)
|
c.Strip = newStrip(&c.Client)
|
||||||
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)
|
c.DCA = newDCA(&c.Client)
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type client struct {
|
// NewXAirClient creates a new XAirClient instance with optional engine configuration
|
||||||
*engine
|
func NewXAirClient(mixerIP string, mixerPort int, opts ...EngineOption) (*XAirClient, error) {
|
||||||
Info InfoResponse
|
e, err := newEngine(mixerIP, mixerPort, kindXAir, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
c := &XAirClient{
|
||||||
|
Client: Client{e},
|
||||||
|
}
|
||||||
|
c.Main = newMainStereo(&c.Client)
|
||||||
|
c.Strip = newStrip(&c.Client)
|
||||||
|
c.Bus = newBus(&c.Client)
|
||||||
|
c.HeadAmp = newHeadAmp(&c.Client)
|
||||||
|
c.Snapshot = newSnapshot(&c.Client)
|
||||||
|
c.DCA = newDCA(&c.Client)
|
||||||
|
|
||||||
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start begins listening for messages in a goroutine
|
// Start begins listening for messages in a goroutine
|
||||||
func (c *client) StartListening() {
|
func (c *Client) StartListening() {
|
||||||
go c.engine.receiveLoop()
|
go c.engine.receiveLoop()
|
||||||
log.Debugf("Started listening on %s...", c.engine.conn.LocalAddr().String())
|
log.Debugf("Started listening on %s...", c.engine.conn.LocalAddr().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close stops the client and closes the connection
|
// Close stops the client and closes the connection
|
||||||
func (c *client) Close() {
|
func (c *Client) Close() {
|
||||||
close(c.engine.done)
|
close(c.engine.done)
|
||||||
if c.engine.conn != nil {
|
if c.engine.conn != nil {
|
||||||
c.engine.conn.Close()
|
c.engine.conn.Close()
|
||||||
@ -95,12 +94,12 @@ func (c *client) Close() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SendMessage sends an OSC message to the mixer using the unified connection
|
// SendMessage sends an OSC message to the mixer using the unified connection
|
||||||
func (c *client) SendMessage(address string, args ...any) error {
|
func (c *Client) SendMessage(address string, args ...any) error {
|
||||||
return c.engine.sendToAddress(c.mixerAddr, address, args...)
|
return c.engine.sendToAddress(c.mixerAddr, address, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReceiveMessage receives an OSC message from the mixer
|
// ReceiveMessage receives an OSC message from the mixer
|
||||||
func (c *client) ReceiveMessage() (*osc.Message, error) {
|
func (c *Client) ReceiveMessage() (*osc.Message, error) {
|
||||||
t := time.Tick(c.engine.timeout)
|
t := time.Tick(c.engine.timeout)
|
||||||
select {
|
select {
|
||||||
case <-t:
|
case <-t:
|
||||||
@ -114,7 +113,7 @@ func (c *client) ReceiveMessage() (*osc.Message, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RequestInfo requests mixer information
|
// RequestInfo requests mixer information
|
||||||
func (c *client) RequestInfo() (InfoResponse, error) {
|
func (c *Client) RequestInfo() (InfoResponse, error) {
|
||||||
var info InfoResponse
|
var info InfoResponse
|
||||||
err := c.SendMessage("/xinfo")
|
err := c.SendMessage("/xinfo")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -125,31 +124,20 @@ func (c *client) RequestInfo() (InfoResponse, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return info, err
|
return info, err
|
||||||
}
|
}
|
||||||
if len(msg.Arguments) == 4 {
|
if len(msg.Arguments) >= 3 {
|
||||||
if host, ok := msg.Arguments[0].(string); ok {
|
info.Host = msg.Arguments[0].(string)
|
||||||
info.Host = host
|
info.Name = msg.Arguments[1].(string)
|
||||||
}
|
info.Model = msg.Arguments[2].(string)
|
||||||
if name, ok := msg.Arguments[1].(string); ok {
|
|
||||||
info.Name = name
|
|
||||||
}
|
|
||||||
if model, ok := msg.Arguments[2].(string); ok {
|
|
||||||
info.Model = model
|
|
||||||
}
|
|
||||||
if firmware, ok := msg.Arguments[3].(string); ok {
|
|
||||||
info.Firmware = firmware
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
c.Info = info
|
|
||||||
|
|
||||||
return info, nil
|
return info, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// KeepAlive sends keep-alive message (required for multi-client usage)
|
// KeepAlive sends keep-alive message (required for multi-client usage)
|
||||||
func (c *client) KeepAlive() error {
|
func (c *Client) KeepAlive() error {
|
||||||
return c.SendMessage("/xremote")
|
return c.SendMessage("/xremote")
|
||||||
}
|
}
|
||||||
|
|
||||||
// RequestStatus requests mixer status
|
// RequestStatus requests mixer status
|
||||||
func (c *client) RequestStatus() error {
|
func (c *Client) RequestStatus() error {
|
||||||
return c.SendMessage("/status")
|
return c.SendMessage("/status")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,13 +4,13 @@ import "fmt"
|
|||||||
|
|
||||||
// Comp represents the compressor parameters.
|
// Comp represents the compressor parameters.
|
||||||
type Comp struct {
|
type Comp struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
AddressFunc func(fmtString string, args ...any) string
|
AddressFunc func(fmtString string, args ...any) string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Factory function to create Comp instance with optional configuration
|
// Factory function to create Comp instance with optional configuration
|
||||||
func newComp(c *client, baseAddress string, opts ...CompOption) *Comp {
|
func newComp(c *Client, baseAddress string, opts ...CompOption) *Comp {
|
||||||
comp := &Comp{
|
comp := &Comp{
|
||||||
client: c,
|
client: c,
|
||||||
baseAddress: fmt.Sprintf("%s/dyn", baseAddress),
|
baseAddress: fmt.Sprintf("%s/dyn", baseAddress),
|
||||||
|
|||||||
@ -3,12 +3,12 @@ package xair
|
|||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
type DCA struct {
|
type DCA struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
}
|
}
|
||||||
|
|
||||||
// newDCA creates a new DCA instance
|
// newDCA creates a new DCA instance
|
||||||
func newDCA(c *client) *DCA {
|
func newDCA(c *Client) *DCA {
|
||||||
return &DCA{
|
return &DCA{
|
||||||
client: c,
|
client: c,
|
||||||
baseAddress: c.addressMap["dca"],
|
baseAddress: c.addressMap["dca"],
|
||||||
|
|||||||
@ -6,13 +6,13 @@ import (
|
|||||||
|
|
||||||
// Eq represents the EQ parameters.
|
// Eq represents the EQ parameters.
|
||||||
type Eq struct {
|
type Eq struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
AddressFunc func(fmtString string, args ...any) string
|
AddressFunc func(fmtString string, args ...any) string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Factory function to create Eq instance with optional configuration
|
// Factory function to create Eq instance with optional configuration
|
||||||
func newEq(c *client, baseAddress string, opts ...EqOption) *Eq {
|
func newEq(c *Client, baseAddress string, opts ...EqOption) *Eq {
|
||||||
eq := &Eq{
|
eq := &Eq{
|
||||||
client: c,
|
client: c,
|
||||||
baseAddress: fmt.Sprintf("%s/eq", baseAddress),
|
baseAddress: fmt.Sprintf("%s/eq", baseAddress),
|
||||||
|
|||||||
@ -4,13 +4,13 @@ import "fmt"
|
|||||||
|
|
||||||
// Gate represents the gate parameters.
|
// Gate represents the gate parameters.
|
||||||
type Gate struct {
|
type Gate struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
AddressFunc func(fmtString string, args ...any) string
|
AddressFunc func(fmtString string, args ...any) string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Factory function to create Gate instance with optional configuration
|
// Factory function to create Gate instance with optional configuration
|
||||||
func newGate(c *client, baseAddress string, opts ...GateOption) *Gate {
|
func newGate(c *Client, baseAddress string, opts ...GateOption) *Gate {
|
||||||
gate := &Gate{
|
gate := &Gate{
|
||||||
client: c,
|
client: c,
|
||||||
baseAddress: fmt.Sprintf("%s/gate", baseAddress),
|
baseAddress: fmt.Sprintf("%s/gate", baseAddress),
|
||||||
|
|||||||
@ -3,12 +3,12 @@ package xair
|
|||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
type HeadAmp struct {
|
type HeadAmp struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
}
|
}
|
||||||
|
|
||||||
// newHeadAmp creates a new HeadAmp instance with the provided client.
|
// newHeadAmp creates a new HeadAmp instance with the provided client.
|
||||||
func newHeadAmp(c *client) *HeadAmp {
|
func newHeadAmp(c *Client) *HeadAmp {
|
||||||
return &HeadAmp{
|
return &HeadAmp{
|
||||||
client: c,
|
client: c,
|
||||||
baseAddress: c.addressMap["headamp"],
|
baseAddress: c.addressMap["headamp"],
|
||||||
|
|||||||
@ -3,14 +3,14 @@ package xair
|
|||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
type Main struct {
|
type Main struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
Eq *Eq
|
Eq *Eq
|
||||||
Comp *Comp
|
Comp *Comp
|
||||||
}
|
}
|
||||||
|
|
||||||
// newMainStereo creates a new Main instance for stereo main output
|
// newMainStereo creates a new Main instance for stereo main output
|
||||||
func newMainStereo(c *client) *Main {
|
func newMainStereo(c *Client) *Main {
|
||||||
addressFunc := func(fmtString string, args ...any) string {
|
addressFunc := func(fmtString string, args ...any) string {
|
||||||
return fmtString
|
return fmtString
|
||||||
}
|
}
|
||||||
@ -24,7 +24,7 @@ func newMainStereo(c *client) *Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// newMainMono creates a new MainMono instance for mono main output (X32 only)
|
// newMainMono creates a new MainMono instance for mono main output (X32 only)
|
||||||
func newMainMono(c *client) *Main {
|
func newMainMono(c *Client) *Main {
|
||||||
addressFunc := func(fmtString string, args ...any) string {
|
addressFunc := func(fmtString string, args ...any) string {
|
||||||
return fmtString
|
return fmtString
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,14 +3,14 @@ package xair
|
|||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
type Matrix struct {
|
type Matrix struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
Eq *Eq
|
Eq *Eq
|
||||||
Comp *Comp
|
Comp *Comp
|
||||||
}
|
}
|
||||||
|
|
||||||
// newMatrix creates a new Matrix instance
|
// newMatrix creates a new Matrix instance
|
||||||
func newMatrix(c *client) *Matrix {
|
func newMatrix(c *Client) *Matrix {
|
||||||
return &Matrix{
|
return &Matrix{
|
||||||
client: c,
|
client: c,
|
||||||
baseAddress: c.addressMap["matrix"],
|
baseAddress: c.addressMap["matrix"],
|
||||||
|
|||||||
@ -1,8 +1,7 @@
|
|||||||
package xair
|
package xair
|
||||||
|
|
||||||
type InfoResponse struct {
|
type InfoResponse struct {
|
||||||
Host string
|
Host string
|
||||||
Name string
|
Name string
|
||||||
Model string
|
Model string
|
||||||
Firmware string
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,12 +3,12 @@ package xair
|
|||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
type Snapshot struct {
|
type Snapshot struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
}
|
}
|
||||||
|
|
||||||
// newSnapshot creates a new Snapshot instance
|
// newSnapshot creates a new Snapshot instance
|
||||||
func newSnapshot(c *client) *Snapshot {
|
func newSnapshot(c *Client) *Snapshot {
|
||||||
return &Snapshot{
|
return &Snapshot{
|
||||||
client: c,
|
client: c,
|
||||||
baseAddress: c.addressMap["snapshot"],
|
baseAddress: c.addressMap["snapshot"],
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package xair
|
|||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
type Strip struct {
|
type Strip struct {
|
||||||
client *client
|
client *Client
|
||||||
baseAddress string
|
baseAddress string
|
||||||
Gate *Gate
|
Gate *Gate
|
||||||
Eq *Eq
|
Eq *Eq
|
||||||
@ -11,7 +11,7 @@ type Strip struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// newStrip creates a new Strip instance
|
// newStrip creates a new Strip instance
|
||||||
func newStrip(c *client) *Strip {
|
func newStrip(c *Client) *Strip {
|
||||||
return &Strip{
|
return &Strip{
|
||||||
client: c,
|
client: c,
|
||||||
baseAddress: c.addressMap["strip"],
|
baseAddress: c.addressMap["strip"],
|
||||||
|
|||||||
@ -12,9 +12,10 @@ Flags:
|
|||||||
-v, --version Print x32-cli version information and quit
|
-v, --version Print x32-cli version information and quit
|
||||||
|
|
||||||
Commands:
|
Commands:
|
||||||
completion Generate shell completion scripts.
|
completion (c) Generate shell completion scripts.
|
||||||
info Print mixer information.
|
|
||||||
raw Send raw OSC messages to the mixer.
|
Raw
|
||||||
|
raw Send raw OSC messages to the mixer.
|
||||||
|
|
||||||
Main
|
Main
|
||||||
main mute Get or set the mute state of the Main L/R output.
|
main mute Get or set the mute state of the Main L/R output.
|
||||||
|
|||||||
@ -12,9 +12,10 @@ Flags:
|
|||||||
-v, --version Print xair-cli version information and quit
|
-v, --version Print xair-cli version information and quit
|
||||||
|
|
||||||
Commands:
|
Commands:
|
||||||
completion Generate shell completion scripts.
|
completion (c) Generate shell completion scripts.
|
||||||
info Print mixer information.
|
|
||||||
raw Send raw OSC messages to the mixer.
|
Raw
|
||||||
|
raw Send raw OSC messages to the mixer.
|
||||||
|
|
||||||
Main
|
Main
|
||||||
main mute Get or set the mute state of the Main L/R output.
|
main mute Get or set the mute state of the Main L/R output.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user