mirror of
https://github.com/truewhile/MeBox.git
synced 2026-09-29 03:26:37 +08:00
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
export const PLAYBACK_RATE_OPTIONS = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.5, 3] as const
|
|
|
|
export const MIN_PLAYBACK_RATE = PLAYBACK_RATE_OPTIONS[0]
|
|
export const MAX_PLAYBACK_RATE = PLAYBACK_RATE_OPTIONS[PLAYBACK_RATE_OPTIONS.length - 1]
|
|
|
|
export function normalizePlaybackRate(value: unknown): number {
|
|
const parsed = Number(value)
|
|
if (!Number.isFinite(parsed)) return 1
|
|
let closest: number = PLAYBACK_RATE_OPTIONS[0]
|
|
let closestDistance = Number.POSITIVE_INFINITY
|
|
for (const option of PLAYBACK_RATE_OPTIONS) {
|
|
const distance = Math.abs(option - parsed)
|
|
if (distance < closestDistance) {
|
|
closest = option
|
|
closestDistance = distance
|
|
}
|
|
}
|
|
return closest
|
|
}
|
|
|
|
export function stepPlaybackRate(current: unknown, direction: 1 | -1): number {
|
|
const normalized = normalizePlaybackRate(current)
|
|
const index = PLAYBACK_RATE_OPTIONS.indexOf(normalized as (typeof PLAYBACK_RATE_OPTIONS)[number])
|
|
const next = Math.min(PLAYBACK_RATE_OPTIONS.length - 1, Math.max(0, index + direction))
|
|
return PLAYBACK_RATE_OPTIONS[next]
|
|
}
|
|
|
|
export function formatPlaybackRate(rate: unknown): string {
|
|
const normalized = normalizePlaybackRate(rate)
|
|
return `${Number.isInteger(normalized) ? normalized.toFixed(0) : String(normalized)}x`
|
|
}
|