feat: prewarming dylib

This commit is contained in:
tapframe 2026-05-12 19:32:33 +05:30
parent 72dfbac9a9
commit 89ca233f71
5 changed files with 57 additions and 1 deletions

View file

@ -27,6 +27,11 @@ public func nuvio_player_create() -> UnsafeMutableRawPointer {
return Unmanaged.passRetained(p).toOpaque() return Unmanaged.passRetained(p).toOpaque()
} }
@_cdecl("nuvio_player_prewarm")
public func nuvio_player_prewarm() {
NuvioPlayerPrewarmer.shared.prewarm()
}
@_cdecl("nuvio_player_destroy") @_cdecl("nuvio_player_destroy")
public func nuvio_player_destroy(_ ptr: UnsafeMutableRawPointer) { public func nuvio_player_destroy(_ ptr: UnsafeMutableRawPointer) {
let p = Unmanaged<NuvioPlayerWindow>.fromOpaque(ptr).takeRetainedValue() let p = Unmanaged<NuvioPlayerWindow>.fromOpaque(ptr).takeRetainedValue()

View file

@ -0,0 +1,20 @@
import AppKit
final class NuvioPlayerPrewarmer {
static let shared = NuvioPlayerPrewarmer()
private var started = false
private init() {
}
func prewarm() {
DispatchQueue.main.async {
guard !self.started else { return }
self.started = true
let view = NuvioMPVView(frame: NSRect(x: 0, y: 0, width: 16, height: 16))
view.setup()
view.destroyPlayer()
}
}
}

View file

@ -1,8 +1,10 @@
package com.nuvio.app package com.nuvio.app
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.window.Window import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application import androidx.compose.ui.window.application
import com.nuvio.app.features.player.prewarmDesktopPlaybackBackend
import java.awt.Color as AwtColor import java.awt.Color as AwtColor
private val DesktopWindowBackground = AwtColor(0x0D, 0x0D, 0x0D) private val DesktopWindowBackground = AwtColor(0x0D, 0x0D, 0x0D)
@ -27,6 +29,10 @@ fun main() {
onDispose { } onDispose { }
} }
LaunchedEffect(Unit) {
prewarmDesktopPlaybackBackend()
}
App() App()
} }
} }

View file

@ -0,0 +1,24 @@
package com.nuvio.app.features.player
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
import java.util.concurrent.atomic.AtomicBoolean
private val desktopPlaybackPrewarmStarted = AtomicBoolean(false)
internal suspend fun prewarmDesktopPlaybackBackend() {
val osName = System.getProperty("os.name").orEmpty().lowercase()
if (!osName.contains("mac")) return
if (!desktopPlaybackPrewarmStarted.compareAndSet(false, true)) return
val bridge = withContext(Dispatchers.IO) {
runCatching { MacOSMPVBridgeLib.INSTANCE }.getOrNull()
} ?: return
delay(1_500)
withContext(Dispatchers.IO) {
runCatching { bridge.nuvio_player_prewarm() }
}
}

View file

@ -37,6 +37,7 @@ internal interface MacOSMPVBridgeLib : Library {
} }
fun nuvio_player_create(): Pointer fun nuvio_player_create(): Pointer
fun nuvio_player_prewarm()
fun nuvio_player_destroy(player: Pointer) fun nuvio_player_destroy(player: Pointer)
fun nuvio_player_show(player: Pointer) fun nuvio_player_show(player: Pointer)