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(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 {
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() }
}