summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/retime
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-01 19:27:49 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-01 19:27:49 +0200
commitbd9ec023eefc4b5d26fa8b66c4338e97104f0f96 (patch)
tree08350eaa107b27f026eebdb65df54b1ca25521fd /apps/web/src/lib/retime
parentf4b9f40ab1ba1cedf208bba708f4331d36bb30cc (diff)
downloadopencut-bd9ec023eefc4b5d26fa8b66c4338e97104f0f96.tar.gz
refactor: split constants by domain and isolate timeline panel from core
Diffstat (limited to 'apps/web/src/lib/retime')
-rw-r--r--apps/web/src/lib/retime/audio-stretch.ts2
-rw-r--r--apps/web/src/lib/retime/index.ts1
-rw-r--r--apps/web/src/lib/retime/presets.ts2
-rw-r--r--apps/web/src/lib/retime/rate.ts25
-rw-r--r--apps/web/src/lib/retime/resolve.ts2
5 files changed, 29 insertions, 3 deletions
diff --git a/apps/web/src/lib/retime/audio-stretch.ts b/apps/web/src/lib/retime/audio-stretch.ts
index f8dd297c..92902dff 100644
--- a/apps/web/src/lib/retime/audio-stretch.ts
+++ b/apps/web/src/lib/retime/audio-stretch.ts
@@ -1,5 +1,5 @@
import { PitchShifter } from "soundtouchjs";
-import { clampRetimeRate, shouldMaintainPitch } from "@/constants/retime-constants";
+import { clampRetimeRate, shouldMaintainPitch } from "@/lib/retime/rate";
import type { RetimeConfig } from "@/lib/timeline";
import { getSourceTimeAtClipTime } from "./resolve";
diff --git a/apps/web/src/lib/retime/index.ts b/apps/web/src/lib/retime/index.ts
index ca6725dd..2ab1d10f 100644
--- a/apps/web/src/lib/retime/index.ts
+++ b/apps/web/src/lib/retime/index.ts
@@ -1,3 +1,4 @@
+export * from "./rate";
export * from "./audio-stretch";
export * from "./presets";
export * from "./resolve";
diff --git a/apps/web/src/lib/retime/presets.ts b/apps/web/src/lib/retime/presets.ts
index 777c0219..fbd391ff 100644
--- a/apps/web/src/lib/retime/presets.ts
+++ b/apps/web/src/lib/retime/presets.ts
@@ -1,5 +1,5 @@
import type { RetimeConfig } from "@/lib/timeline";
-import { clampRetimeRate } from "@/constants/retime-constants";
+import { clampRetimeRate } from "@/lib/retime/rate";
export function buildConstantRetime({
rate,
diff --git a/apps/web/src/lib/retime/rate.ts b/apps/web/src/lib/retime/rate.ts
new file mode 100644
index 00000000..75ea530b
--- /dev/null
+++ b/apps/web/src/lib/retime/rate.ts
@@ -0,0 +1,25 @@
+export const DEFAULT_RETIME_RATE = 1;
+export const MIN_RETIME_RATE = 0.01;
+export const MAX_RETIME_RATE = 5;
+
+export function clampRetimeRate({ rate }: { rate: number }): number {
+ if (!Number.isFinite(rate) || rate <= 0) {
+ return DEFAULT_RETIME_RATE;
+ }
+
+ return Math.min(Math.max(rate, MIN_RETIME_RATE), MAX_RETIME_RATE);
+}
+
+export function canMaintainPitch({ rate }: { rate: number }): boolean {
+ return Number.isFinite(rate) && rate > 0;
+}
+
+export function shouldMaintainPitch({
+ rate,
+ maintainPitch,
+}: {
+ rate: number;
+ maintainPitch?: boolean;
+}): boolean {
+ return maintainPitch === true && canMaintainPitch({ rate });
+}
diff --git a/apps/web/src/lib/retime/resolve.ts b/apps/web/src/lib/retime/resolve.ts
index 31a562be..5e7236d5 100644
--- a/apps/web/src/lib/retime/resolve.ts
+++ b/apps/web/src/lib/retime/resolve.ts
@@ -1,5 +1,5 @@
import type { RetimeConfig } from "@/lib/timeline";
-import { clampRetimeRate } from "@/constants/retime-constants";
+import { clampRetimeRate } from "@/lib/retime/rate";
function getSafeRate({ rate }: { rate: number }): number {
return clampRetimeRate({ rate });