package ndi import ( "git.entr0py.de/garionion/catie/internal/api" "github.com/go-gst/go-gst/gst" "github.com/rs/zerolog/log" "time" ) const deviceType = "NDI" type NDI struct { deviceMonitor *gst.DeviceMonitor devices map[string]*Device } func NewNDI() *NDI { log.Debug().Msg("creating NDI device monitor") devMon := gst.NewDeviceMonitor() caps := gst.NewCapsFromString("application/x-ndi") devMon.AddFilter("Source/Network", caps) n := &NDI{ deviceMonitor: devMon, devices: make(map[string]*Device), } bus := devMon.GetBus() bus.AddWatch(func(msg *gst.Message) bool { switch msg.Type() { case gst.MessageDeviceAdded: device := msg.ParseDeviceAdded() n.createOrUpdateDevice(device) log.Debug().Str("message", device.GetDisplayName()).Fields(device.GetProperties().Values()).Msg("NDI Device Added") case gst.MessageDeviceRemoved: device := msg.ParseDeviceRemoved() n.setDeviceUnavailable(device) log.Debug().Str("message", device.GetDisplayName()).Fields(device.GetProperties().Values()).Msg("NDI Device Removed") default: log.Debug().Str("msgType", msg.TypeName()).Str("message", msg.String()).Msg("default") } return true }) log.Debug().Msg("starting NDI device monitor") devMon.Start() return n } func (n *NDI) GetDeviceType() string { return deviceType } func (n *NDI) GetDevices() []api.Device { devices := make([]api.Device, 0, len(n.devices)) for _, d := range n.devices { devices = append(devices, d) } return devices } func (n *NDI) GetDevice(name string) api.Device { if device, ok := n.devices[name]; ok { return device } return nil } func (n *NDI) createOrUpdateDevice(d *gst.Device) { name := d.GetDisplayName() if device, ok := n.devices[name]; ok { device.updateProperties(d) return } n.devices[name] = newDevice(d) } func (n *NDI) setDeviceUnavailable(d *gst.Device) { if device, ok := n.devices[d.GetDisplayName()]; ok { device.setUnavailable() } } func (n *NDI) DiscoverSources() { ticker := time.NewTicker(5 * time.Second) for range ticker.C { devices := n.deviceMonitor.GetDevices() for _, device := range devices { log.Debug().Fields(device.GetProperties().Values()).Msg("discovering sources") } } }