VoiceBroadcastPlayerImpl - use session coroutine scope
This commit is contained in:
parent
392fe6fa32
commit
dae4162e75
@ -22,6 +22,7 @@ import android.media.MediaPlayer.OnPreparedListener
|
|||||||
import androidx.annotation.MainThread
|
import androidx.annotation.MainThread
|
||||||
import im.vector.app.core.di.ActiveSessionHolder
|
import im.vector.app.core.di.ActiveSessionHolder
|
||||||
import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker
|
import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker
|
||||||
|
import im.vector.app.features.session.coroutineScope
|
||||||
import im.vector.app.features.voice.VoiceFailure
|
import im.vector.app.features.voice.VoiceFailure
|
||||||
import im.vector.app.features.voicebroadcast.duration
|
import im.vector.app.features.voicebroadcast.duration
|
||||||
import im.vector.app.features.voicebroadcast.isLive
|
import im.vector.app.features.voicebroadcast.isLive
|
||||||
@ -33,10 +34,7 @@ import im.vector.app.features.voicebroadcast.model.VoiceBroadcastEvent
|
|||||||
import im.vector.app.features.voicebroadcast.sequence
|
import im.vector.app.features.voicebroadcast.sequence
|
||||||
import im.vector.app.features.voicebroadcast.usecase.GetVoiceBroadcastEventUseCase
|
import im.vector.app.features.voicebroadcast.usecase.GetVoiceBroadcastEventUseCase
|
||||||
import im.vector.lib.core.utils.timer.CountUpTimer
|
import im.vector.lib.core.utils.timer.CountUpTimer
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.SupervisorJob
|
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@ -48,7 +46,6 @@ import timber.log.Timber
|
|||||||
import java.util.concurrent.CopyOnWriteArrayList
|
import java.util.concurrent.CopyOnWriteArrayList
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
import kotlin.math.absoluteValue
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
class VoiceBroadcastPlayerImpl @Inject constructor(
|
class VoiceBroadcastPlayerImpl @Inject constructor(
|
||||||
@ -58,10 +55,9 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
|
|||||||
private val getLiveVoiceBroadcastChunksUseCase: GetLiveVoiceBroadcastChunksUseCase
|
private val getLiveVoiceBroadcastChunksUseCase: GetLiveVoiceBroadcastChunksUseCase
|
||||||
) : VoiceBroadcastPlayer {
|
) : VoiceBroadcastPlayer {
|
||||||
|
|
||||||
private val session
|
private val session get() = sessionHolder.getActiveSession()
|
||||||
get() = sessionHolder.getActiveSession()
|
private val sessionScope get() = session.coroutineScope
|
||||||
|
|
||||||
private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
|
|
||||||
private var fetchPlaylistTask: Job? = null
|
private var fetchPlaylistTask: Job? = null
|
||||||
private var voiceBroadcastStateTask: Job? = null
|
private var voiceBroadcastStateTask: Job? = null
|
||||||
|
|
||||||
@ -151,13 +147,13 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
|
|||||||
private fun observeVoiceBroadcastLiveState(voiceBroadcast: VoiceBroadcast) {
|
private fun observeVoiceBroadcastLiveState(voiceBroadcast: VoiceBroadcast) {
|
||||||
voiceBroadcastStateTask = getVoiceBroadcastEventUseCase.execute(voiceBroadcast)
|
voiceBroadcastStateTask = getVoiceBroadcastEventUseCase.execute(voiceBroadcast)
|
||||||
.onEach { currentVoiceBroadcastEvent = it.getOrNull() }
|
.onEach { currentVoiceBroadcastEvent = it.getOrNull() }
|
||||||
.launchIn(coroutineScope)
|
.launchIn(sessionScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun fetchPlaylistAndStartPlayback(voiceBroadcast: VoiceBroadcast) {
|
private fun fetchPlaylistAndStartPlayback(voiceBroadcast: VoiceBroadcast) {
|
||||||
fetchPlaylistTask = getLiveVoiceBroadcastChunksUseCase.execute(voiceBroadcast)
|
fetchPlaylistTask = getLiveVoiceBroadcastChunksUseCase.execute(voiceBroadcast)
|
||||||
.onEach(this::updatePlaylist)
|
.onEach(this::updatePlaylist)
|
||||||
.launchIn(coroutineScope)
|
.launchIn(sessionScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updatePlaylist(audioEvents: List<MessageAudioEvent>) {
|
private fun updatePlaylist(audioEvents: List<MessageAudioEvent>) {
|
||||||
@ -212,7 +208,7 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
|
|||||||
val content = playlistItem?.audioEvent?.content ?: run { Timber.w("## VoiceBroadcastPlayer: No content to play"); return }
|
val content = playlistItem?.audioEvent?.content ?: run { Timber.w("## VoiceBroadcastPlayer: No content to play"); return }
|
||||||
val sequence = playlistItem.audioEvent.sequence
|
val sequence = playlistItem.audioEvent.sequence
|
||||||
val sequencePosition = position?.let { it - playlistItem.startTime } ?: 0
|
val sequencePosition = position?.let { it - playlistItem.startTime } ?: 0
|
||||||
coroutineScope.launch {
|
sessionScope.launch {
|
||||||
try {
|
try {
|
||||||
prepareMediaPlayer(content) { mp ->
|
prepareMediaPlayer(content) { mp ->
|
||||||
currentMediaPlayer = mp
|
currentMediaPlayer = mp
|
||||||
@ -255,7 +251,7 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
|
|||||||
nextMediaPlayer = null
|
nextMediaPlayer = null
|
||||||
val nextContent = getNextAudioContent()
|
val nextContent = getNextAudioContent()
|
||||||
if (nextContent != null) {
|
if (nextContent != null) {
|
||||||
coroutineScope.launch {
|
sessionScope.launch {
|
||||||
prepareMediaPlayer(nextContent) { mp ->
|
prepareMediaPlayer(nextContent) { mp ->
|
||||||
if (nextMediaPlayer == null) {
|
if (nextMediaPlayer == null) {
|
||||||
nextMediaPlayer = mp
|
nextMediaPlayer = mp
|
||||||
|
Loading…
x
Reference in New Issue
Block a user