Coverage Summary for Class: LatencyTracker (com.vsevolodganin.clicktrack.player)

Class Method, % Branch, % Line, % Instruction, %
LatencyTracker 0% (0/3) 0% (0/4) 0% (0/7) 0% (0/54)
LatencyTracker$start$1 0% (0/1) 0% (0/2) 0% (0/3) 0% (0/35)
Total 0% (0/4) 0% (0/6) 0% (0/10) 0% (0/89)


 package com.vsevolodganin.clicktrack.player
 
 import com.vsevolodganin.clicktrack.di.component.PlayerServiceScope
 import com.vsevolodganin.clicktrack.primitiveaudio.PrimitiveAudioPlayer
 import kotlinx.coroutines.DelicateCoroutinesApi
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.GlobalScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.isActive
 import kotlinx.coroutines.launch
 import me.tatarka.inject.annotations.Inject
 import kotlin.time.Duration
 import kotlin.time.Duration.Companion.milliseconds
 import kotlin.time.Duration.Companion.seconds
 
 @PlayerServiceScope
 @Inject
 class LatencyTracker(
     private val primitiveAudioPlayer: PrimitiveAudioPlayer,
 ) {
     private var latencyMeasureJob: Job? = null
 
     private val _latencyState = MutableStateFlow(Duration.ZERO)
     val latencyState: StateFlow<Duration> = _latencyState
 
     @OptIn(DelicateCoroutinesApi::class)
     fun start() {
         latencyMeasureJob?.cancel()
         latencyMeasureJob = GlobalScope.launch(Dispatchers.Main) {
             while (isActive) {
                 _latencyState.value = primitiveAudioPlayer.getLatencyMs().milliseconds
                 delay(1.seconds)
             }
         }
     }
 
     fun stop() {
         latencyMeasureJob?.cancel()
     }
 }