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.NativeInterface nativeCmdLock = sync.Mutex{} ) func initNative(systemVersion *semver.Version, appVersion *semver.Version) { if failsafeModeActive { nativeInstance = &native.EmptyNativeInterface{} nativeLogger.Warn().Msg("failsafe mode active, using empty native interface") return } nativeLogger.Info().Msg("initializing native proxy") var err error nativeInstance, err = native.NewNativeProxy(native.NativeOptions{ SystemVersion: systemVersion, AppVersion: appVersion, DisplayRotation: config.GetDisplayRotation(), DefaultQualityFactor: config.VideoQualityFactor, MaxRestartAttempts: config.NativeMaxRestart, OnNativeRestart: func() { configureDisplayOnNativeRestart() }, 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") } } }, }) if err != nil { nativeLogger.Fatal().Err(err).Msg("failed to create native proxy") } if err := nativeInstance.Start(); err != nil { nativeLogger.Fatal().Err(err).Msg("failed to start native proxy") } go func() { if err := nativeInstance.VideoSetEDID(config.EdidString); err != nil { nativeLogger.Warn().Err(err).Msg("error setting EDID") } }() if os.Getenv("JETKVM_CRASH_TESTING") == "1" { nativeInstance.DoNotUseThisIsForCrashTestingOnly() } }