100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
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")
|
|
}
|
|
}
|
|
}
|