diff --git a/cmd/x32-cli/cli.go b/cmd/x32-cli/cli.go index 9628c88..9965d56 100644 --- a/cmd/x32-cli/cli.go +++ b/cmd/x32-cli/cli.go @@ -121,7 +121,6 @@ func connect(config Config) (*xair.X32Client, error) { client, err := xair.NewX32Client( config.Host, config.Port, - xair.WithKind("x32"), xair.WithTimeout(config.Timeout), ) if err != nil { diff --git a/cmd/xair-cli/cli.go b/cmd/xair-cli/cli.go index b7fbcf7..a48dd8e 100644 --- a/cmd/xair-cli/cli.go +++ b/cmd/xair-cli/cli.go @@ -119,7 +119,6 @@ func connect(config Config) (*xair.XAirClient, error) { client, err := xair.NewXAirClient( config.Host, config.Port, - xair.WithKind("xair"), xair.WithTimeout(config.Timeout), ) if err != nil { diff --git a/internal/xair/address.go b/internal/xair/address.go index 5706881..aaed1f6 100644 --- a/internal/xair/address.go +++ b/internal/xair/address.go @@ -18,9 +18,9 @@ var x32AddressMap = map[string]string{ "snapshot": "/-snap", } -func addressMapForMixerKind(kind MixerKind) map[string]string { +func addressMapFromMixerKind(kind mixerKind) map[string]string { switch kind { - case KindX32: + case kindX32: return x32AddressMap default: return xairAddressMap diff --git a/internal/xair/client.go b/internal/xair/client.go index d4ad61e..56ae84f 100644 --- a/internal/xair/client.go +++ b/internal/xair/client.go @@ -2,7 +2,6 @@ package xair import ( "fmt" - "net" "time" "github.com/charmbracelet/log" @@ -11,7 +10,7 @@ import ( ) type Client struct { - engine + *engine } type XAirClient struct { @@ -34,50 +33,15 @@ type X32Client struct { Snapshot *Snapshot } -func createEngine(mixerIP string, mixerPort int, opts ...Option) (*engine, error) { - localAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", 0)) - if err != nil { - return nil, fmt.Errorf("failed to resolve local address: %v", err) - } - - conn, err := net.ListenUDP("udp", localAddr) - if err != nil { - return nil, fmt.Errorf("failed to create UDP connection: %v", err) - } - - mixerAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", mixerIP, mixerPort)) - if err != nil { - conn.Close() - return nil, fmt.Errorf("failed to resolve mixer address: %v", err) - } - - log.Debugf("Local UDP connection: %s ", conn.LocalAddr().String()) - - e := &engine{ - timeout: 100 * time.Millisecond, - conn: conn, - mixerAddr: mixerAddr, - parser: newParser(), - done: make(chan bool), - respChan: make(chan *osc.Message, 100), - } - - for _, opt := range opts { - opt(e) - } - - return e, nil -} - // NewX32Client creates a new X32Client instance func NewX32Client(mixerIP string, mixerPort int, opts ...Option) (*X32Client, error) { - e, err := createEngine(mixerIP, mixerPort, opts...) + e, err := newEngine(mixerIP, mixerPort, kindX32, opts...) if err != nil { return nil, err } c := &X32Client{ - Client: Client{*e}, + Client: Client{e}, } c.Main = newMainStereo(&c.Client) c.MainMono = newMainMono(&c.Client) @@ -92,13 +56,13 @@ func NewX32Client(mixerIP string, mixerPort int, opts ...Option) (*X32Client, er // NewXAirClient creates a new XAirClient instance func NewXAirClient(mixerIP string, mixerPort int, opts ...Option) (*XAirClient, error) { - e, err := createEngine(mixerIP, mixerPort, opts...) + e, err := newEngine(mixerIP, mixerPort, kindXAir, opts...) if err != nil { return nil, err } c := &XAirClient{ - Client: Client{*e}, + Client: Client{e}, } c.Main = newMainStereo(&c.Client) c.Strip = newStrip(&c.Client) diff --git a/internal/xair/engine.go b/internal/xair/engine.go index 4099c92..9da6e63 100644 --- a/internal/xair/engine.go +++ b/internal/xair/engine.go @@ -14,7 +14,7 @@ type parser interface { } type engine struct { - Kind MixerKind + Kind mixerKind timeout time.Duration conn *net.UDPConn mixerAddr *net.UDPAddr @@ -26,6 +26,42 @@ type engine struct { respChan chan *osc.Message } +func newEngine(mixerIP string, mixerPort int, kind mixerKind, opts ...Option) (*engine, error) { + localAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", 0)) + if err != nil { + return nil, fmt.Errorf("failed to resolve local address: %v", err) + } + + conn, err := net.ListenUDP("udp", localAddr) + if err != nil { + return nil, fmt.Errorf("failed to create UDP connection: %v", err) + } + + mixerAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", mixerIP, mixerPort)) + if err != nil { + conn.Close() + return nil, fmt.Errorf("failed to resolve mixer address: %v", err) + } + + log.Debugf("Local UDP connection: %s ", conn.LocalAddr().String()) + + e := &engine{ + timeout: 100 * time.Millisecond, + conn: conn, + mixerAddr: mixerAddr, + parser: newParser(), + addressMap: addressMapFromMixerKind(kind), + done: make(chan bool), + respChan: make(chan *osc.Message, 100), + } + + for _, opt := range opts { + opt(e) + } + + return e, nil +} + // receiveLoop handles incoming OSC messages func (e *engine) receiveLoop() { buffer := make([]byte, 4096) diff --git a/internal/xair/kinds.go b/internal/xair/kinds.go index 434304a..1434dee 100644 --- a/internal/xair/kinds.go +++ b/internal/xair/kinds.go @@ -1,8 +1,8 @@ package xair -type MixerKind string +type mixerKind string const ( - KindXAir MixerKind = "xair" - KindX32 MixerKind = "x32" + kindXAir mixerKind = "xair" + kindX32 mixerKind = "x32" ) diff --git a/internal/xair/option.go b/internal/xair/option.go index 02161f0..836ef60 100644 --- a/internal/xair/option.go +++ b/internal/xair/option.go @@ -4,13 +4,6 @@ import "time" type Option func(*engine) -func WithKind(kind string) Option { - return func(e *engine) { - e.Kind = MixerKind(kind) - e.addressMap = addressMapForMixerKind(e.Kind) - } -} - func WithTimeout(timeout time.Duration) Option { return func(e *engine) { e.timeout = timeout