diff options
Diffstat (limited to 'apps/web/src/actions/use-editor-actions.ts')
| -rw-r--r-- | apps/web/src/actions/use-editor-actions.ts | 41 |
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, ); |
