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(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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-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"
|
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" }
|
||||||
|
|||||||
Reference in New Issue
Block a user