new: implement web audio player with support for js and wasmJs platforms

This commit is contained in:
2026-06-16 17:55:49 +02:00
parent 1de2d43b3b
commit 8fb8ea24cf
9 changed files with 65 additions and 58 deletions
+9
View File
@@ -48,6 +48,15 @@ kotlin {
implementation(project.dependencies.platform(libs.koin.bom)) implementation(project.dependencies.platform(libs.koin.bom))
implementation(libs.koin.core) implementation(libs.koin.core)
} }
// webMain is the js + wasmJs intermediate source set from the default hierarchy template.
webMain.dependencies {
// Browser audio (HTMLAudioElement, document) for js + wasmJs
implementation(libs.kotlinx.browser)
}
wasmJsMain {
// HTMLAudioElement interop on Wasm requires this opt-in.
languageSettings.optIn("kotlin.js.ExperimentalWasmJsInterop")
}
commonTest.dependencies { commonTest.dependencies {
implementation(libs.kotlin.test) implementation(libs.kotlin.test)
} }
@@ -1,23 +0,0 @@
package fr.ajaury.gwenedeg.player
class JsAudioPlayer : AudioPlayer {
override fun play() {
TODO("Not yet implemented")
}
override fun pause() {
TODO("Not yet implemented")
}
override fun stop() {
TODO("Not yet implemented")
}
override fun release() {
TODO("Not yet implemented")
}
override fun load(uri: String) {
TODO("Not yet implemented")
}
}
@@ -1,6 +0,0 @@
package fr.ajaury.gwenedeg.player.di
import org.koin.core.module.Module
actual val audioPlayerModule: Module
get() = TODO("Not yet implemented")
@@ -1,23 +0,0 @@
package fr.ajaury.gwenedeg.player
class WasmAudioPlayer : AudioPlayer {
override fun play() {
TODO("Not yet implemented")
}
override fun pause() {
TODO("Not yet implemented")
}
override fun stop() {
TODO("Not yet implemented")
}
override fun release() {
TODO("Not yet implemented")
}
override fun load(uri: String) {
TODO("Not yet implemented")
}
}
@@ -1,6 +0,0 @@
package fr.ajaury.gwenedeg.player.di
import org.koin.core.module.Module
actual val audioPlayerModule: Module
get() = TODO("Not yet implemented")
@@ -0,0 +1,32 @@
package fr.ajaury.gwenedeg.player
import kotlinx.browser.document
import org.w3c.dom.HTMLAudioElement
class WebAudioPlayer : AudioPlayer {
private var audio: HTMLAudioElement? = null
override fun load(uri: String) {
audio = (document.createElement("audio") as HTMLAudioElement).apply {
src = uri
}
}
override fun play() {
audio?.play()
}
override fun pause() {
audio?.pause()
}
override fun stop() {
audio?.pause()
audio?.currentTime = 0.0
}
override fun release() {
audio?.pause()
audio = null
}
}
@@ -0,0 +1,9 @@
package fr.ajaury.gwenedeg.player
class WebAudioSessionManager : AudioSessionManager {
override fun activate() {
}
override fun deactivate() {
}
}
@@ -0,0 +1,13 @@
package fr.ajaury.gwenedeg.player.di
import fr.ajaury.gwenedeg.player.AudioPlayer
import fr.ajaury.gwenedeg.player.AudioSessionManager
import fr.ajaury.gwenedeg.player.WebAudioPlayer
import fr.ajaury.gwenedeg.player.WebAudioSessionManager
import org.koin.core.module.Module
import org.koin.dsl.module
actual val audioPlayerModule: Module = module {
single<AudioPlayer> { WebAudioPlayer() }
single<AudioSessionManager> { WebAudioSessionManager() }
}
+2
View File
@@ -11,6 +11,7 @@ navigation3 = "1.1.1"
composeMultiplatform = "1.11.1" composeMultiplatform = "1.11.1"
kotlin = "2.4.0" kotlin = "2.4.0"
kotlinWrappers = "2026.6.3" kotlinWrappers = "2026.6.3"
kotlinxBrowser = "0.5.0"
kotlinxCoroutines = "1.11.0" kotlinxCoroutines = "1.11.0"
kotlinSerialization = "2.4.0" kotlinSerialization = "2.4.0"
material3 = "1.11.0-alpha07" material3 = "1.11.0-alpha07"
@@ -31,6 +32,7 @@ koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel" }
koin-core = { module = "io.insert-koin:koin-core" } koin-core = { module = "io.insert-koin:koin-core" }
koin-core-viewmodel = { module = "io.insert-koin:koin-core-viewmodel" } koin-core-viewmodel = { module = "io.insert-koin:koin-core-viewmodel" }
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
kotlinx-browser = { module = "org.jetbrains.kotlinx:kotlinx-browser", version.ref = "kotlinxBrowser" }
kotlinx-coroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinxCoroutines" } kotlinx-coroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinxCoroutines" }
lifecycle-runtimeCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidxLifecycle" } lifecycle-runtimeCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidxLifecycle" }
lifecycle-viewmodelCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidxLifecycle" } lifecycle-viewmodelCompose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidxLifecycle" }