summaryrefslogtreecommitdiff
path: root/apps/web/src/actions/use-editor-actions.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/actions/use-editor-actions.ts')
-rw-r--r--apps/web/src/actions/use-editor-actions.ts41
1 files changed, 35 insertions, 6 deletions
diff --git a/apps/web/src/actions/use-editor-actions.ts b/apps/web/src/actions/use-editor-actions.ts
index ca16e989..b165d5ef 100644
--- a/apps/web/src/actions/use-editor-actions.ts
+++ b/apps/web/src/actions/use-editor-actions.ts
@@ -44,7 +44,11 @@ import {
stopVoiceOverRecording,
} from "@/voiceover/recorder";
import type { VoiceOverRecordingResult } from "@/voiceover/recorder";
-import { useVoiceOverStore } from "@/voiceover/voiceover-store";
+import {
+ useVoiceOverPreferencesStore,
+ useVoiceOverStore,
+} from "@/voiceover/voiceover-store";
+import { applyVoiceOverEnhancementsToBlob } from "@/voiceover/enhancements";
const FREEZE_DURATION_SECONDS = 3;
@@ -651,7 +655,9 @@ export function useEditorActions() {
if (voiceOverState.status === "idle") {
try {
- await startVoiceOverRecording();
+ await startVoiceOverRecording({
+ deviceId: useVoiceOverPreferencesStore.getState().selectedDeviceId,
+ });
} catch (error) {
toast.error(getVoiceOverErrorMessage({ error }));
return;
@@ -662,11 +668,16 @@ export function useEditorActions() {
return;
}
- useVoiceOverStore.getState().stopRecording();
+ if (voiceOverState.status === "processing") {
+ return;
+ }
+
+ useVoiceOverStore.getState().processRecording();
const activeProject = editor.project.getActive();
if (!activeProject) {
cancelVoiceOverRecording();
+ useVoiceOverStore.getState().stopRecording();
return;
}
@@ -675,18 +686,35 @@ export function useEditorActions() {
recording = await stopVoiceOverRecording();
} catch (error) {
toast.error(getVoiceOverErrorMessage({ error }));
+ useVoiceOverStore.getState().stopRecording();
return;
}
if (recording.blob.size === 0) {
toast.error("Voice-over recording is empty");
+ useVoiceOverStore.getState().stopRecording();
+ return;
+ }
+
+ const enhancements = useVoiceOverPreferencesStore.getState().enhancements;
+ let assetBlob = recording.blob;
+ let assetMimeType = recording.mimeType;
+ try {
+ assetBlob = await applyVoiceOverEnhancementsToBlob({
+ blob: recording.blob,
+ settings: enhancements,
+ });
+ assetMimeType = assetBlob.type || recording.mimeType;
+ } catch (error) {
+ toast.error(getVoiceOverErrorMessage({ error }));
+ useVoiceOverStore.getState().stopRecording();
return;
}
const file = new File(
- [recording.blob],
- `voice-over.${getFileExtensionForMimeType({ mimeType: recording.mimeType })}`,
- { type: recording.mimeType },
+ [assetBlob],
+ `voice-over.${getFileExtensionForMimeType({ mimeType: assetMimeType })}`,
+ { type: assetMimeType },
);
const addMediaCommand = new AddMediaAssetCommand({
projectId: activeProject.metadata.id,
@@ -715,6 +743,7 @@ export function useEditorActions() {
editor.command.execute({
command: new BatchCommand([addMediaCommand, insertCommand]),
});
+ useVoiceOverStore.getState().stopRecording();
},
undefined,
);