@ -88,6 +88,7 @@ private fun VoiceBubble(message: Message, textColor: Color,
val durMs = message . voiceDurationMs
val durMs = message . voiceDurationMs
var playing by remember { mutableStateOf ( false ) }
var playing by remember { mutableStateOf ( false ) }
var paused by remember { mutableStateOf ( false ) }
var paused by remember { mutableStateOf ( false ) }
var seekVersion by remember { mutableStateOf ( 0 ) }
var elapsedMs by remember { mutableStateOf ( 0 ) }
var elapsedMs by remember { mutableStateOf ( 0 ) }
var progress by remember { mutableStateOf ( 0f ) }
var progress by remember { mutableStateOf ( 0f ) }
@ -95,7 +96,7 @@ private fun VoiceBubble(message: Message, textColor: Color,
val onPaused = remember { { paused = true ; playing = false } }
val onPaused = remember { { paused = true ; playing = false } }
/* elapsed timer while playing */
/* elapsed timer while playing */
LaunchedEffect ( playing ) {
LaunchedEffect ( playing , seekVersion ) {
if ( playing && ! paused ) {
if ( playing && ! paused ) {
val start = System . currentTimeMillis ( ) - elapsedMs
val start = System . currentTimeMillis ( ) - elapsedMs
while ( playing && ! paused ) {
while ( playing && ! paused ) {
@ -116,6 +117,7 @@ private fun VoiceBubble(message: Message, textColor: Color,
if ( playing && ! paused ) {
if ( playing && ! paused ) {
onPlay ( message . filePath , onDone , onPaused )
onPlay ( message . filePath , onDone , onPaused )
} else {
} else {
seekVersion ++
playing = true ; paused = false
playing = true ; paused = false
onPlay ( message . filePath , onDone , onPaused )
onPlay ( message . filePath , onDone , onPaused )
}
}
@ -136,6 +138,7 @@ private fun VoiceBubble(message: Message, textColor: Color,
if ( message . filePath . isEmpty ( ) ) return @detectTapGestures
if ( message . filePath . isEmpty ( ) ) return @detectTapGestures
val seekFrac = ( offset . x / size . width ) . coerceIn ( 0f , 1f )
val seekFrac = ( offset . x / size . width ) . coerceIn ( 0f , 1f )
val seekMs = ( seekFrac * durMs ) . toInt ( )
val seekMs = ( seekFrac * durMs ) . toInt ( )
seekVersion ++
playing = true ; paused = false ; elapsedMs = seekMs ; progress = seekFrac
playing = true ; paused = false ; elapsedMs = seekMs ; progress = seekFrac
onSeek ( message . filePath , seekMs , onDone )
onSeek ( message . filePath , seekMs , onDone )
}
}