new: add Android audio player

This commit is contained in:
2026-06-12 17:19:59 +02:00
parent 627eff3b0a
commit c3347ca3ff
14 changed files with 184 additions and 3 deletions
+4
View File
@@ -56,6 +56,10 @@ kotlin {
sourceSets {
androidMain.dependencies {
implementation(libs.compose.uiToolingPreview)
// Player audio
implementation(libs.media3.exoplayer)
implementation(libs.media3.common)
}
commonMain.dependencies {
implementation(libs.compose.runtime)
@@ -0,0 +1,10 @@
package fr.ajaury.gwenedeg.di
import fr.ajaury.gwenedeg.player.AndroidAudioPlayer
import fr.ajaury.gwenedeg.player.AudioPlayer
import org.koin.core.module.Module
import org.koin.dsl.module
actual val platformModule: Module = module {
single<AudioPlayer> { AndroidAudioPlayer(context = get()) }
}
@@ -0,0 +1,34 @@
package fr.ajaury.gwenedeg.player
import android.content.Context
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
import gwenedeg.shared.generated.resources.Res
class AndroidAudioPlayer(
context: Context,
) : AudioPlayer {
private val player = ExoPlayer.Builder(context).build()
override fun load(filePath: String) {
val mediaItem = MediaItem.fromUri(Res.getUri(filePath))
player.setMediaItem(mediaItem)
player.prepare()
}
override fun play() {
player.play()
}
override fun pause() {
player.pause()
}
override fun stop() {
player.stop()
}
override fun release() {
player.release()
}
}
@@ -7,7 +7,8 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation3.runtime.NavEntry
import androidx.navigation3.ui.NavDisplay
import androidx.savedstate.compose.serialization.serializers.SnapshotStateListSerializer
import fr.ajaury.gwenedeg.di.appModule
import fr.ajaury.gwenedeg.di.platformModule
import fr.ajaury.gwenedeg.di.sharedModule
import fr.ajaury.gwenedeg.navigation.Route
import fr.ajaury.gwenedeg.player.ui.PlayerScreen
import fr.ajaury.gwenedeg.records.ui.RecordsScreen
@@ -20,7 +21,10 @@ import org.koin.dsl.koinConfiguration
fun App() {
KoinApplication(
configuration = koinConfiguration {
modules(appModule)
modules(
sharedModule,
platformModule,
)
},
) {
val serializer = SnapshotStateListSerializer<Route>()
@@ -1,14 +1,19 @@
package fr.ajaury.gwenedeg.di
import fr.ajaury.gwenedeg.player.ui.viewmodel.PlayerViewModel
import fr.ajaury.gwenedeg.records.data.InMemoryRecordRepository
import fr.ajaury.gwenedeg.records.domain.RecordRepository
import fr.ajaury.gwenedeg.records.ui.viewmodel.RecordsViewModel
import org.koin.core.module.Module
import org.koin.core.module.dsl.bind
import org.koin.core.module.dsl.factoryOf
import org.koin.core.module.dsl.viewModelOf
import org.koin.dsl.module
val appModule = module {
val sharedModule = module {
factoryOf(::InMemoryRecordRepository) { bind<RecordRepository>() }
viewModelOf(::RecordsViewModel)
viewModelOf(::PlayerViewModel)
}
expect val platformModule: Module
@@ -0,0 +1,13 @@
package fr.ajaury.gwenedeg.player
interface AudioPlayer {
fun play()
fun pause()
fun stop()
fun release()
fun load(filePath: String)
}
@@ -0,0 +1,6 @@
package fr.ajaury.gwenedeg.di
import org.koin.core.module.Module
actual val platformModule: Module
get() = TODO("Not yet implemented")
@@ -0,0 +1,23 @@
package fr.ajaury.gwenedeg.player
class IosAudioPlayer : AudioPlayer {
override fun play(file: String) {
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(file: String) {
TODO("Not yet implemented")
}
}
@@ -0,0 +1,23 @@
package fr.ajaury.gwenedeg.player
class JsAudioPlayer : AudioPlayer {
override fun play(file: String) {
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(filePath: String) {
TODO("Not yet implemented")
}
}
@@ -0,0 +1,6 @@
package fr.ajaury.gwenedeg.di
import org.koin.core.module.Module
actual val platformModule: Module
get() = TODO("Not yet implemented")
@@ -0,0 +1,23 @@
package fr.ajaury.gwenedeg.player
class JvmAudioPlayer : AudioPlayer {
override fun play(file: String) {
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(filePath: String) {
TODO("Not yet implemented")
}
}
@@ -0,0 +1,23 @@
package fr.ajaury.gwenedeg.player
class WasmAudioPlayer : AudioPlayer {
override fun play(file: String) {
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(filePath: String) {
TODO("Not yet implemented")
}
}
@@ -0,0 +1,4 @@
package fr.ajaury.gwenedeg.di
actual val platformModule: org.koin.core.module.Module
get() = TODO("Not yet implemented")