- Kotlin 97.1%
- Shell 1.5%
- Swift 0.7%
- Python 0.4%
- Dockerfile 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
EqualizerEvents has been declared since the port began -- BandChanged, PresetChanged, Ready, Changed, each with a payload and a doc comment explaining when to use which -- with ZERO references anywhere in the library. No key, no emit, no listener. A payload type nothing ever sends is a contract nobody can hold. The consequence is not abstract: a panel can only show the changes it made itself, so a preset applied from a remote, a restored session, or a second view leaves every slider displaying the old curve. That is what the web's EqualizerPanel is built on -- band:changed and preset:changed -- and porting it found the gap. Plugin.emit is now silent before registration rather than fatal. A plugin's setters are callable on a plugin nobody has registered -- this library's own equaliser tests construct one and drag a band -- and an announcement with no host to hear it is not an error. Adding the emits turned four green tests red until this went in, which is the proof the case is real. Reads, options and storage still throw: asking a detached plugin for its host's state is a question with no honest answer, and that is a different thing from telling nobody. Proven by removing the emit: three of the new assertions fail, and the third covers the unregistered case that would otherwise regress in silence. |
||
| .github/workflows | ||
| api | ||
| config/detekt | ||
| conformance-kit | ||
| contract | ||
| detekt-player | ||
| gradle | ||
| natives | ||
| scenarios | ||
| scripts | ||
| Sources/NoMercyPlayerDevTools | ||
| src | ||
| swift-conformance | ||
| templates/plugin | ||
| testing | ||
| Tests/NoMercyPlayerDevToolsTests | ||
| tools | ||
| ui-compose | ||
| .gitattributes | ||
| .gitignore | ||
| build.gradle.kts | ||
| CHANGELOG.md | ||
| check.sh | ||
| contract.lock | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| LICENSE | ||
| Package.swift | ||
| README.md | ||
| scenarios.lock | ||
| settings.gradle.kts | ||
| THIRD_PARTY_NOTICES.md | ||
nomercy-player-core-kmp
The shared engine behind the NoMercy native players. It holds the parts that have nothing to do with a screen or a decoder: the event system, playback state, the plugin runtime, and the ports that platform engines plug into.
This is the Kotlin Multiplatform sibling of
@nomercy-entertainment/nomercy-player-core.
The web package is the specification. Where the two disagree, the web package is
right and this one has a bug.
Status
Scaffold. The build, the publishing pipeline, and the gates are in place and proven; the engine itself is being written on top of them. Nothing is published to Maven Central yet.
Targets
| Target | Consumed by |
|---|---|
androidTarget |
the Android phone and TV app |
jvm |
the desktop client and the test harness |
iosArm64, iosSimulatorArm64, iosX64 |
the iOS app, through NoMercyPlayerCore.xcframework |
tvosArm64, tvosSimulatorArm64 |
the tvOS app, through the same xcframework |
Building
You need JDK 21 and an Android SDK. Everything except linking Apple frameworks builds on any host, including Windows and Linux, because Kotlin/Native compiles klibs without Apple hardware.
./gradlew build
That runs the JVM and Android tests, detekt, and both API checks. Running the Apple unit tests and linking the xcframework needs macOS:
./gradlew iosSimulatorArm64Test tvosSimulatorArm64Test
./gradlew assembleNoMercyPlayerCoreXCFramework
Gates
Four things fail the build, and none of them have a baseline file to hide in.
Public API. Every public symbol is recorded in api/. Adding, removing or
changing one without updating those files fails apiCheck. Both the JVM surface
and the Kotlin/Native klib surface are covered, so an Apple-only change is caught
on a Linux runner. Run ./gradlew apiDump when a change to the surface is
intended, and read the diff before committing it.
Complexity. config/detekt/detekt.yml sets thresholds below detekt's own
defaults. This is a library that people read to learn the plugin API, so every
function in it is documentation whether it was meant to be or not.
Versions. KIT_VERSION and CONTRACT_VERSION are generated from
gradle.properties at build time and never typed into Kotlin. A hand-maintained
version constant and the test asserting it drift together silently, which is
exactly how the web contract generator once claimed to describe a release that
had already been superseded.
Tag and version agreement. Publishing checks that the git tag matches
VERSION_NAME before it uploads anything.
Publishing
Through CI only, triggered by a v* tag, from the macOS runner. A multiplatform
publication has to carry every declared target, and the Apple frameworks can only
be linked on Apple hardware. Publishing from anywhere else would ship an artifact
that quietly has no Apple variants in it.
Licence
Apache 2.0. See LICENSE.