new: implement web audio player with support for js and wasmJs platforms
This commit is contained in:
@@ -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")
|
||||
}
|
||||
}
|
||||
-6
@@ -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")
|
||||
}
|
||||
}
|
||||
-6
@@ -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
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package fr.ajaury.gwenedeg.player
|
||||
|
||||
class WebAudioSessionManager : AudioSessionManager {
|
||||
override fun activate() {
|
||||
}
|
||||
|
||||
override fun deactivate() {
|
||||
}
|
||||
}
|
||||
+13
@@ -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() }
|
||||
}
|
||||
@@ -11,6 +11,7 @@ navigation3 = "1.1.1"
|
||||
composeMultiplatform = "1.11.1"
|
||||
kotlin = "2.4.0"
|
||||
kotlinWrappers = "2026.6.3"
|
||||
kotlinxBrowser = "0.5.0"
|
||||
kotlinxCoroutines = "1.11.0"
|
||||
kotlinSerialization = "2.4.0"
|
||||
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-viewmodel = { module = "io.insert-koin:koin-core-viewmodel" }
|
||||
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" }
|
||||
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" }
|
||||
|
||||
Reference in New Issue
Block a user