package kvm import ( "os" "sync" "time" "github.com/Masterminds/semver/v3" "github.com/jetkvm/kvm/internal/native" "github.com/pion/webrtc/v4/pkg/media" ) var ( nativeInstance *native.Native nativeCmdLock = sync.Mutex{} ) func initNative(systemVersion *semver.Version, appVersion *semver.Version) { nativeInstance = native.NewNative(native.NativeOptions{ SystemVersion: systemVersion, AppVersion: appVersion, DisplayRotation: config.GetDisplayRotation(), OnVideoStateChange: func(state native.VideoState) { lastVideoState = state triggerVideoStateUpdate() requestDisplayUpdate(true, "video_state_changed") }, OnIndevEvent: func(event string) { nativeLogger.Trace().Str("event", event).Msg("indev event received") wakeDisplay(false, "indev_event") }, OnRpcEvent: func(event string) { nativeCmdLock.Lock() defer nativeCmdLock.Unlock() nativeLogger.Trace().Str("event", event).Msg("rpc event received") switch event { case "resetConfig": err := rpcResetConfig() if err != nil { nativeLogger.Warn().Err(err).Msg("error resetting config") } _ = rpcReboot(true) case "reboot": _ = rpcReboot(true) default: nativeLogger.Warn().Str("event", event).Msg("unknown rpc event received") } }, OnVideoFrameReceived: func(frame []byte, duration time.Duration) { if currentSession != nil { err := currentSession.VideoTrack.WriteSample(media.Sample{Data: frame, Duration: duration}) if err != nil { nativeLogger.Warn().Err(err).Msg("error writing sample") } } }, }) nativeInstance.Start() if os.Getenv("JETKVM_CRASH_TESTING") == "1" { nativeInstance.DoNotUseThisIsForCrashTestingOnly() } }