package com.suno.android.media.player import androidx.media3.common.Player import com.suno.android.common_core_utils.SunoLogger import kotlin.reflect.KProperty class SharedPlayer( loggerFactory: SunoLogger.Factory, private val playerFactory: PlayerFactory, ) { private val logger = loggerFactory.create(this@SharedPlayer) private var playerInstance: ReleaseOverridePlayer? = null fun getInstance(): Player { playerInstance?.let { return it } return ReleaseOverridePlayer( player = playerFactory.create(), onRelease = { this.releaseInstance() }, ).also { logger.d { "Created SharedPlayer: ${it.hashCode()}" } playerInstance = it } } operator fun getValue( thisRef: Any?, property: KProperty<*>, ): Player = getInstance() fun releaseInstance() { playerInstance?.releaseInternal() playerInstance = null } } private class ReleaseOverridePlayer( private val player: Player, private val onRelease: () -> Unit, ) : Player by player { override fun release() { onRelease.invoke() } fun releaseInternal() { player.release() } }