create

fun create(config: PlayerConfig = PlayerConfig()): KitePlayer

Builds a player from config, on the backends it names and nothing else.

For the default stack, call KitePlayer() from the kiteplayer module instead: it fills in FFmpeg and the platform's audio output. This is the door for a stack of your own.

The backends in PlayerConfig.backends are resolved here, and nothing is discovered: Kotlin's native targets have no classpath service lookup, so a missing backend is a typed configuration error rather than a reflective search that would fail differently on every platform. On macOS the explicit pair is KiteFFmpegMediaBackend() from kiteplayer-ffmpeg and AppleOutputBackend from kiteplayer-output; the engine never names either, which is what keeps it free of any platform.

The player owns no thread. From here until terminal close completes it runs eight serial lanes, one for the session actor and one for each worker, over the shared Dispatchers.Default and Dispatchers.IO pools, and each lane does one thing at a time, which is the confinement every contract inside the engine is written against. The one thread that is pinned is the audio device's own callback, which the platform output owns. close requests that work; closeAndAwait proves its completion.

Throws

with PlaybackError.ConfigurationInvalid when no media backend or no output backend was supplied.