refactor: extract audio player logic into a dedicated multiplatform module
This commit is contained in:
@@ -1,13 +0,0 @@
|
||||
package fr.ajaury.gwenedeg.di
|
||||
|
||||
import fr.ajaury.gwenedeg.player.AudioPlayer
|
||||
import fr.ajaury.gwenedeg.player.AudioSessionManager
|
||||
import fr.ajaury.gwenedeg.player.IosAudioPlayer
|
||||
import fr.ajaury.gwenedeg.player.IosAudioSessionManager
|
||||
import org.koin.core.module.Module
|
||||
import org.koin.dsl.module
|
||||
|
||||
actual val platformModule: Module = module {
|
||||
single<AudioPlayer> { IosAudioPlayer() }
|
||||
single<AudioSessionManager> { IosAudioSessionManager() }
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
package fr.ajaury.gwenedeg.player
|
||||
|
||||
import gwenedeg.shared.generated.resources.Res
|
||||
import kotlinx.cinterop.ExperimentalForeignApi
|
||||
import platform.AVFoundation.AVPlayer
|
||||
import platform.AVFoundation.pause
|
||||
import platform.AVFoundation.play
|
||||
import platform.AVFoundation.replaceCurrentItemWithPlayerItem
|
||||
import platform.Foundation.NSURL
|
||||
|
||||
class IosAudioPlayer : AudioPlayer {
|
||||
private var player: AVPlayer? = null
|
||||
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
override fun load(filePath: String) {
|
||||
val uri = Res.getUri(filePath)
|
||||
val nsUrl = NSURL.URLWithString(uri) ?: error("Invalid audio URI: $uri")
|
||||
|
||||
player = AVPlayer(nsUrl)
|
||||
}
|
||||
|
||||
override fun play() {
|
||||
player?.play()
|
||||
}
|
||||
|
||||
override fun pause() {
|
||||
player?.pause()
|
||||
}
|
||||
|
||||
override fun stop() {
|
||||
player?.pause()
|
||||
player?.replaceCurrentItemWithPlayerItem(null)
|
||||
}
|
||||
|
||||
override fun release() {
|
||||
player?.pause()
|
||||
player = null
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
package fr.ajaury.gwenedeg.player
|
||||
|
||||
import kotlinx.cinterop.ExperimentalForeignApi
|
||||
import platform.AVFAudio.AVAudioSession
|
||||
import platform.AVFAudio.AVAudioSessionCategoryOptionDuckOthers
|
||||
import platform.AVFAudio.AVAudioSessionCategoryPlayback
|
||||
import platform.AVFAudio.AVAudioSessionModeSpokenAudio
|
||||
import platform.AVFAudio.setActive
|
||||
|
||||
class IosAudioSessionManager : AudioSessionManager {
|
||||
private val session = AVAudioSession.sharedInstance()
|
||||
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
override fun activate() {
|
||||
session.setCategory(
|
||||
category = AVAudioSessionCategoryPlayback,
|
||||
mode = AVAudioSessionModeSpokenAudio,
|
||||
options = AVAudioSessionCategoryOptionDuckOthers,
|
||||
error = null,
|
||||
)
|
||||
|
||||
session.setActive(
|
||||
active = true,
|
||||
error = null,
|
||||
)
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
override fun deactivate() {
|
||||
session.setActive(
|
||||
false,
|
||||
error = null,
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user