package ttymididrv import ( "fmt" "sync" "github.com/tarm/serial" ) type out struct { mu sync.RWMutex driver *driver port *serial.Port name string baud int closed bool number int } func (o *out) Open() (err error) { o.mu.RLock() if o.closed || o.port != nil { o.mu.RUnlock() return nil } o.mu.RUnlock() o.mu.Lock() defer o.mu.Unlock() c := &serial.Config{Name: o.name, Baud: o.baud} o.port, err = serial.OpenPort(c) if err != nil { return err } o.driver.mu.Lock() o.driver.opened = append(o.driver.opened, o) o.driver.mu.Unlock() return nil } func (o *out) Close() error { o.mu.RLock() if o.closed || o.port == nil { o.mu.RUnlock() return nil } o.mu.RUnlock() o.mu.Lock() o.closed = true o.mu.Unlock() return o.port.Close() } func (o *out) IsOpen() bool { o.mu.RLock() defer o.mu.RUnlock() return !o.closed && o.port != nil } func (o *out) Number() int { return o.number } func (o *out) String() string { return o.name } func (o *out) Underlying() interface{} { return o.port } func (o *out) Write(b []byte) (int, error) { _, err := o.port.Write(b) if err != nil { return 0, fmt.Errorf("could not write to port: %w", err) } return len(b), nil }