@@ -161,40 +161,15 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
161
161
162
162
val voiceBroadcastState = getVoiceBroadcastUseCase.execute(roomId, eventId)?.content?.voiceBroadcastState
163
163
isLive = voiceBroadcastState != null && voiceBroadcastState != VoiceBroadcastState .STOPPED
164
- observeIncomingEvents (roomId, eventId)
164
+ fetchPlaylistAndStartPlayback (roomId, eventId)
165
165
}
166
166
167
- private fun startPlayback () {
168
- val event = if (isLive) playlist.lastOrNull() else playlist.firstOrNull()
169
- val content = event?.content ? : run { Timber .w(" ## VoiceBroadcastPlayer: No content to play" ); return }
170
- val sequence = event.getVoiceBroadcastChunk()?.sequence
171
- coroutineScope.launch {
172
- try {
173
- currentMediaPlayer = prepareMediaPlayer(content)
174
- currentMediaPlayer?.start()
175
- currentVoiceBroadcastId?.let { playbackTracker.startPlayback(it) }
176
- currentSequence = sequence
177
- withContext(Dispatchers .Main ) { playingState = State .PLAYING }
178
- nextMediaPlayer = prepareNextMediaPlayer()
179
- } catch (failure: Throwable ) {
180
- Timber .e(failure, " Unable to start playback" )
181
- throw VoiceFailure .UnableToPlay (failure)
182
- }
183
- }
184
- }
185
-
186
- private fun observeIncomingEvents (roomId : String , voiceBroadcastId : String ) {
167
+ private fun fetchPlaylistAndStartPlayback (roomId : String , voiceBroadcastId : String ) {
187
168
fetchPlaylistJob = getLiveVoiceBroadcastChunksUseCase.execute(roomId, voiceBroadcastId)
188
169
.onEach(this ::updatePlaylist)
189
170
.launchIn(coroutineScope)
190
171
}
191
172
192
- private fun resumePlayback () {
193
- currentMediaPlayer?.start()
194
- currentVoiceBroadcastId?.let { playbackTracker.startPlayback(it) }
195
- playingState = State .PLAYING
196
- }
197
-
198
173
private fun updatePlaylist (playlist : List <MessageAudioEvent >) {
199
174
this .playlist = playlist.sortedBy { it.getVoiceBroadcastChunk()?.sequence?.toLong() ? : it.root.originServerTs }
200
175
onPlaylistUpdated()
@@ -220,6 +195,31 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
220
195
}
221
196
}
222
197
198
+ private fun startPlayback () {
199
+ val event = if (isLive) playlist.lastOrNull() else playlist.firstOrNull()
200
+ val content = event?.content ? : run { Timber .w(" ## VoiceBroadcastPlayer: No content to play" ); return }
201
+ val sequence = event.getVoiceBroadcastChunk()?.sequence
202
+ coroutineScope.launch {
203
+ try {
204
+ currentMediaPlayer = prepareMediaPlayer(content)
205
+ currentMediaPlayer?.start()
206
+ currentVoiceBroadcastId?.let { playbackTracker.startPlayback(it) }
207
+ currentSequence = sequence
208
+ withContext(Dispatchers .Main ) { playingState = State .PLAYING }
209
+ nextMediaPlayer = prepareNextMediaPlayer()
210
+ } catch (failure: Throwable ) {
211
+ Timber .e(failure, " Unable to start playback" )
212
+ throw VoiceFailure .UnableToPlay (failure)
213
+ }
214
+ }
215
+ }
216
+
217
+ private fun resumePlayback () {
218
+ currentMediaPlayer?.start()
219
+ currentVoiceBroadcastId?.let { playbackTracker.startPlayback(it) }
220
+ playingState = State .PLAYING
221
+ }
222
+
223
223
private fun getNextAudioContent (): MessageAudioContent ? {
224
224
val nextSequence = currentSequence?.plus(1 )
225
225
? : playlist.lastOrNull()?.sequence
0 commit comments