Browse Source

Preserve device timestamp offsets across output reopen and counter wrap

master
evgeny 4 days ago
parent
commit
a165372bbe
  1. 10
      tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallOutputRecovery.kt
  2. 5
      tools/chatgui-android/app/src/test/java/com/utun/chat/data/CallOutputRecoveryTest.kt

10
tools/chatgui-android/app/src/main/java/com/utun/chat/data/CallOutputRecovery.kt

@ -32,5 +32,13 @@ internal class CallOutputPosition {
}
fun played(raw: Int, written: Long): Long? = head.update(raw, written - base)?.let { base + it }
fun timestamp(local: Long): Long = if (local < 0) -1 else base + local
fun timestamp(local: Long, written: Long): Long {
if (local < 0) return -1
var extended = local
if (local <= 0xffffffffL) {
extended = ((written - base) and -0x100000000L) or local
if (extended > written - base) extended -= 0x100000000L
}
return if (extended < 0) -1 else base + extended
}
}

5
tools/chatgui-android/app/src/test/java/com/utun/chat/data/CallOutputRecoveryTest.kt

@ -22,8 +22,9 @@ class CallOutputRecoveryTest {
p.reopen(accepted)
assertEquals(accepted, p.played(0, accepted))
assertEquals(accepted + 96, p.played(96, accepted + 672))
assertEquals(accepted + 48, p.timestamp(48))
assertEquals(-1L, p.timestamp(-1))
assertEquals(accepted + 48, p.timestamp(48, accepted + 672))
assertEquals(-1L, p.timestamp(-1, accepted + 672))
assertEquals(accepted + 0x100000030L, p.timestamp(48, accepted + 0x100000100L))
assertNull(p.played(1000, accepted + 672))
p.reopen(1920)
assertEquals(1920L, p.played(0, 1920))

Loading…
Cancel
Save