Go (nozzle.go)
nozzle.go provides Go bindings for nozzle via cgo.
Setup
git clone --recursive https://github.com/nozzle-io/nozzle.go.git
cd nozzle.go
make
Requirements
- Go 1.21+
- C++17 compiler (clang / MSVC)
- macOS 12+ / Windows 10+ / Linux
Sender
sender, err := nozzle.NewSender(nozzle.SenderDesc{
Name: "my_sender",
ApplicationName: "MyApp",
RingBufferSize: 3,
})
if err != nil {
panic(err)
}
defer sender.Close()
frame, err := sender.AcquireWritableFrame(1920, 1080, nozzle.FormatRGBA8UNorm)
pixels, err := frame.LockWritablePixels(nozzle.OriginTopLeft)
defer frame.UnmapWritablePixels()
for y := 0; y < pixels.Height; y++ {
row, _ := pixels.Row(y)
for i := range row {
row[i] = 0xFF
}
}
sender.CommitFrame(frame)
Receiver
receiver, err := nozzle.NewReceiver(nozzle.ReceiverDesc{
Name: "my_sender",
ApplicationName: "MyViewer",
ReceiveMode: nozzle.ReceiveLatestOnly,
})
if err != nil {
panic(err)
}
defer receiver.Close()
frame, err := receiver.AcquireFrame(5000)
if err != nil {
panic(err)
}
defer frame.Release()
info, _ := frame.Info()
fmt.Printf("%dx%d frame #%d\n", info.Width, info.Height, info.FrameIndex)
Error Handling
All fallible operations return error. Nozzle errors implement the error interface:
_, err := nozzle.NewSender(nozzle.SenderDesc{Name: ""})
if err == nozzle.ErrorInvalidArgument {
// handle bad args
}
Platform Notes
- macOS: Links Metal, IOSurface, Foundation, Accelerate, OpenGL via cgo
- Windows: Links d3d11, dxgi, opengl32, bcrypt via cgo
- Linux: Links drm, gbm, EGL, GL via cgo