Files
hypit/packages/audio-track/src/component.ts

52 lines
2.5 KiB
TypeScript

import type { ProducerPackage } from "@hypit/hypit/producer";
import type { AdmissionPackage } from "@hypit/hypit/admission";
import type { StoredValue } from "@hypit/hypit/protocol";
import { canonicalize } from "@hypit/hypit/protocol";
import type { SynchronizedMedia } from "@hypit/media";
import type { TemporalWindow } from "@hypit/temporal";
import type { Timeline } from "@hypit/timeline";
import { audioTrackProducers, audioTrackTypes } from "./manifest.js";
import {
appendAudioClip,
assertAudioTrackProgram,
createAudioTrackSet,
finalizeAudioTrack,
renderAudioTrack,
} from "./program.js";
import type { AudioClipSpec, AudioTrackHeader, AudioTrackProgram, AudioTrackSet } from "./types.js";
function inline<T>(value: StoredValue | undefined, label: string): T {
if (value?.kind !== "inline") throw new Error(`${label} must be inline.`);
return value.value as unknown as T;
}
const output = (value: unknown) => ({ kind: "inline" as const, value: canonicalize(value) });
export const audioTrackComponent = {
producers: [
{ producer: audioTrackProducers.createSet, handler: () => ({ outputs: { set: output(createAudioTrackSet()) }, needs: {} }) },
{ producer: audioTrackProducers.appendClip, handler: ({ inputs }) => ({ outputs: { set: output(
appendAudioClip(
inline<AudioTrackSet>(inputs.set?.value, "AudioTrackSet"),
inline<AudioTrackHeader>(inputs.header?.value, "AudioTrackHeader"),
inline<Timeline>(inputs.timeline?.value, "Timeline"),
inline<SynchronizedMedia>(inputs.media?.value, "SynchronizedMedia"),
inline<AudioClipSpec>(inputs.spec?.value, "AudioClipSpec"),
inline<TemporalWindow>(inputs.window?.value, "TemporalWindow"),
),
) }, needs: {} }) },
{ producer: audioTrackProducers.finalize, handler: ({ inputs }) => ({ outputs: { program: output(finalizeAudioTrack(
inline<AudioTrackSet>(inputs.set?.value, "AudioTrackSet"),
inline<AudioTrackHeader>(inputs.header?.value, "AudioTrackHeader"),
)) }, needs: {} }) },
{ producer: audioTrackProducers.render, handler: ({ inputs }) => ({ outputs: { track: output(renderAudioTrack(
inline<Timeline>(inputs.timeline?.value, "Timeline"),
inline<AudioTrackProgram>(inputs.program?.value, "AudioTrackProgram"),
)) }, needs: {} }) },
],
validators: [{
type: audioTrackTypes.program,
handler: ({ value }) => assertAudioTrackProgram(inline<AudioTrackProgram>(value, "AudioTrackProgram")),
}],
} satisfies ProducerPackage & AdmissionPackage;