Repository navigation
Expand file tree
/
Copy pathsongCueTimeBasis.ts
More file actions
57 lines (48 loc) · 1.56 KB
/
Copy pathsongCueTimeBasis.ts
File metadata and controls
57 lines (48 loc) · 1.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
type SongCueTimeBasisInput = {
sec?: unknown
isLoop?: unknown
loopEndSec?: unknown
source?: unknown
}
type SongCueTimelineDefinition = {
sec: number
isLoop?: boolean
loopEndSec?: number
}
const CUE_LOOP_EPSILON_SEC = 0.0001
const normalizeCueSource = (source: unknown) =>
String(source || '')
.trim()
.toLowerCase()
const resolveTimeBasisOffsetSec = (timeBasisOffsetMs: unknown) => {
const offsetMs = Number(timeBasisOffsetMs)
return Number.isFinite(offsetMs) && offsetMs > 0 ? offsetMs / 1000 : 0
}
const isRekordboxAudioCueSource = (source: unknown) => normalizeCueSource(source) === 'rekordbox'
export const resolveSongCueTimelineSec = (
seconds: unknown,
cue: { source?: unknown } | null | undefined,
timeBasisOffsetMs: unknown
) => {
const numeric = Number(seconds)
if (!Number.isFinite(numeric) || numeric < 0) return null
const offsetSec = isRekordboxAudioCueSource(cue?.source)
? resolveTimeBasisOffsetSec(timeBasisOffsetMs)
: 0
return Math.max(0, numeric + offsetSec)
}
export const resolveSongCueTimelineDefinition = (
cue: SongCueTimeBasisInput | null | undefined,
timeBasisOffsetMs: unknown
): SongCueTimelineDefinition | null => {
const sec = resolveSongCueTimelineSec(cue?.sec, cue, timeBasisOffsetMs)
if (sec === null) return null
const loopEndSec = resolveSongCueTimelineSec(cue?.loopEndSec, cue, timeBasisOffsetMs)
const isLoop =
Boolean(cue?.isLoop) && loopEndSec !== null && loopEndSec > sec + CUE_LOOP_EPSILON_SEC
return {
sec,
isLoop,
loopEndSec: isLoop ? loopEndSec : undefined
}
}