summaryrefslogtreecommitdiff
path: root/apps/web/src/timeline/audio-state.ts
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-08-16 06:16:56 +0200
committercashmere <cashmere@autistici.org>2026-08-16 06:16:56 +0200
commitf1043734438c8518a302f698d9ae6583a75f0c14 (patch)
treed3e636a96e6349c1ad17afa7b28c9ffe5c882e37 /apps/web/src/timeline/audio-state.ts
parent37d22b1e390bd6cea04bf8e15069281ee125cf10 (diff)
downloadopencut-f1043734438c8518a302f698d9ae6583a75f0c14.tar.gz
feat: add transitions, track mixing, and voiceover controls
Diffstat (limited to 'apps/web/src/timeline/audio-state.ts')
-rw-r--r--apps/web/src/timeline/audio-state.ts20
1 files changed, 16 insertions, 4 deletions
diff --git a/apps/web/src/timeline/audio-state.ts b/apps/web/src/timeline/audio-state.ts
index 6c8f3044..34220cc9 100644
--- a/apps/web/src/timeline/audio-state.ts
+++ b/apps/web/src/timeline/audio-state.ts
@@ -1,7 +1,8 @@
import { hasKeyframesForPath } from "@/animation/keyframe-query";
import { resolveNumberAtTime } from "@/animation/values";
import { VOLUME_DB_MAX, VOLUME_DB_MIN } from "./audio-constants";
-import type { TimelineElement } from "./types";
+import type { TimelineElement, TimelineTrack } from "./types";
+import { TICKS_PER_SECOND } from "@/wasm";
const DEFAULT_STEP_SECONDS = 1 / 60;
export type AudioCapableElement = Extract<
@@ -29,6 +30,13 @@ export function getElementVolume({
const value = element.params.volume;
return typeof value === "number" ? value : 0;
}
+export function getTrackVolume({
+ track,
+}: {
+ track: Extract<TimelineTrack, { muted: boolean }>;
+}): number {
+ return typeof track.volume === "number" ? track.volume : 0;
+}
export function isElementMuted({
element,
@@ -49,15 +57,15 @@ export function hasAnimatedVolume({
});
}
-import { TICKS_PER_SECOND } from "@/wasm";
-
export function resolveEffectiveAudioGain({
element,
trackMuted = false,
+ trackVolume = 0,
localTime,
}: {
element: AudioCapableElement;
trackMuted?: boolean;
+ trackVolume?: number;
localTime: number;
}): number {
if (trackMuted || isElementMuted({ element })) {
@@ -71,7 +79,7 @@ export function resolveEffectiveAudioGain({
localTime: Math.round(localTime * TICKS_PER_SECOND),
});
- return dBToLinear(resolvedDb);
+ return dBToLinear(resolvedDb + trackVolume);
}
export function buildWaveformGainSamples({
@@ -91,12 +99,14 @@ export function buildWaveformGainSamples({
export function buildAudioGainAutomation({
element,
trackMuted = false,
+ trackVolume = 0,
fromLocalTime,
toLocalTime,
stepSeconds = DEFAULT_STEP_SECONDS,
}: {
element: AudioCapableElement;
trackMuted?: boolean;
+ trackVolume?: number;
fromLocalTime: number;
toLocalTime: number;
stepSeconds?: number;
@@ -115,6 +125,7 @@ export function buildAudioGainAutomation({
gain: resolveEffectiveAudioGain({
element,
trackMuted,
+ trackVolume,
localTime,
}),
});
@@ -126,6 +137,7 @@ export function buildAudioGainAutomation({
element,
trackMuted,
localTime: endTime,
+ trackVolume,
}),
});