// Metro module 11416 (f11417). import MediaEngineStore from "../../../stores/MediaEngineStore"; import { VoiceMessageRecordingStatus, addVoiceMessageWave, resetVoiceMessageState, setSavedVoiceMessageUploadData, setVoiceMessageRecordingId, setVoiceMessageRecordingState, setVoiceMessageStartTimeMillis, useVoiceMessagesUIStore } from "./VoiceMessagesUIStore"; import { VOICE_RECORDING_MAX_DB, VOICE_RECORDING_MAX_DURATION_MILLIS, VOICE_RECORDING_MIN_DB, WAVEFORM_MAX_SAMPLES, WAVEFORM_WAVE_MAX_VALUE } from "../VoiceMessageConstants"; import { AnalyticEvents } from "../../../Constants"; import Logger from "../../debug/Logger"; import downsampleWaveform from "../downsampleWaveform"; import Module206 from "../../../_bundle/Module206"; import Module12 from "../../../_bundle/Module12"; import { MediaEngineEvent } from "../../../_bundle/Module4286"; import AnalyticsUtils from "../../../utils/AnalyticsUtils"; import { triggerHapticFeedback, HapticFeedbackTypes } from "../../haptics/HapticUtils.native"; import { isAndroid } from "../../../utils/PlatformUtils"; let initialize_secs, c7765_20, c7765_21, stopAndGetAudioRecording, stopAndCacheAudioRecording, $mk87149 = function() { return (a0) => Math.min(a0, WAVEFORM_WAVE_MAX_VALUE); }; const resetAudioRecording = function resetAudioRecording() { MediaEngineStore.getMediaEngine().removeListener(MediaEngineEvent.VoiceActivity, c7765_21); resetVoiceMessageState(); }; stopAndGetAudioRecording = function stopAndGetAudioRecording() { setVoiceMessageRecordingId(null); setVoiceMessageRecordingState(null); const r19 = useVoiceMessagesUIStore.getState().waveform.map((item) => { const [r8] = item; return r8; }); const r6 = r19.length <= WAVEFORM_MAX_SAMPLES ? r19 : downsampleWaveform(r19, WAVEFORM_MAX_SAMPLES); const waveform = Module206.fromByteArray(new Uint8Array(r6.map($mk87149()))); return new Promise((c27061_0) => { MediaEngineStore.getMediaEngine().stopLocalAudioRecording((a0, a1) => { c27061_0({ filename: a0, durationSecs: a1 / 1000, waveform }); }); }); }; stopAndCacheAudioRecording = async function stopAndCacheAudioRecording() { let c27063_1; c27063_1 = void 0; let c30404_0 = await stopAndGetAudioRecording(); MediaEngineStore.getMediaEngine().removeListener(MediaEngineEvent.VoiceActivity, c7765_21); (0, setSavedVoiceMessageUploadData)(c30404_0); }; initialize_secs = null; c7765_20 = new Logger("VoiceMessages"); c7765_21 = Module12.throttle((a0) => { const state = useVoiceMessagesUIStore.getState(); if (state.startTimeMillis != null) { addVoiceMessageWave(WAVEFORM_WAVE_MAX_VALUE * ((a0 - VOICE_RECORDING_MIN_DB) / (VOICE_RECORDING_MAX_DB - VOICE_RECORDING_MIN_DB))); if (state.savedVoiceMessageUploadData == null && performance.now() - state.startTimeMillis >= VOICE_RECORDING_MAX_DURATION_MILLIS) { stopAndCacheAudioRecording(); } } }, 100); export function generateBase64EncodedWaveform(a0) { return Module206.fromByteArray(new Uint8Array((a0.length <= WAVEFORM_MAX_SAMPLES ? a0 : downsampleWaveform(a0, WAVEFORM_MAX_SAMPLES)).map($mk87149()))); } export async function startAudioRecording(c27060_0) { let c27060_3; let c27060_4 = 0; let c30402_0, c30402_1, c30402_2; L12: { try { c30402_0 = c27060_0; c30402_1 = void 0; initialize_secs = null; setVoiceMessageRecordingState(VoiceMessageRecordingStatus.REQUESTED); setVoiceMessageRecordingId(c27060_0); MediaEngineStore.getMediaEngine().on(MediaEngineEvent.VoiceActivity, c7765_21); c27060_4 = 1; c30402_1 = performance.now(); await MediaEngineStore.getMediaEngine().startLocalAudioRecording({ echoCancellation: MediaEngineStore.getEchoCancellation(), echoCancellationPreEcho: false, noiseSuppression: MediaEngineStore.getNoiseSuppression(), automaticGainControlConfig: { enabled: MediaEngineStore.getAutomaticGainControl() }, noiseCancellation: MediaEngineStore.getNoiseCancellation() }); initialize_secs = performance.now() - c30402_1; c7765_20.log("Voice message audio startup latency:", initialize_secs); if (useVoiceMessagesUIStore.getState().recordingId !== c30402_0) { c27060_4 = 0; break L12; } (0, setVoiceMessageRecordingState)(VoiceMessageRecordingStatus.STARTED); (0, setVoiceMessageStartTimeMillis)(Date.now()); c27060_4 = 0; } catch ($e) { const r29 = $e; let r8 = r29; c27060_3 = r29; if (c27060_4 !== 0) { while (true) { try { const r116 = c27060_3; c27060_4 = 0; c30402_2 = r116; (0, resetAudioRecording)(); throw c30402_2; } catch (r112) { r8 = r112; c27060_3 = r112; if (c27060_4 === 0) { break; } } } } throw r8; } return void 0; } } export async function endAudioRecording() { let r74; let c27062_1; let c30403_0, c30403_1; L17: { c27062_1 = void 0; c30403_0 = void 0; c30403_1 = void 0; const state = useVoiceMessagesUIStore.getState(); c30403_0 = state.savedVoiceMessageUploadData; if (c30403_0 == null && state.recordingStatus === VoiceMessageRecordingStatus.REQUESTED) { stopAndGetAudioRecording(); c30403_0 = { filename: "", durationSecs: 0, waveform: "" }; } if (c30403_0 == null) { c30403_0 = await stopAndGetAudioRecording(); c30403_1 = useVoiceMessagesUIStore.getState().startTimeMillis; (0, resetAudioRecording)(); r74 = { data: c30403_0, startTimeMillis: c30403_1 }; break L17; } c30403_1 = useVoiceMessagesUIStore.getState().startTimeMillis; (0, resetAudioRecording)(); return { data: c30403_0, startTimeMillis: c30403_1 }; } return r74; } export { stopAndCacheAudioRecording }; export function emitVoiceMessageRecorded(a0, a1, a2) { if (a2 != null) { AnalyticsUtils.track(AnalyticEvents.VOICE_MESSAGE_RECORDED, { recording_start_timestamp: a2, recording_stop_timestamp: Date.now(), duration_secs: a1, result: a0, initialize_secs }); initialize_secs = null; } } export function triggerHaptic() { triggerHapticFeedback(isAndroid() ? HapticFeedbackTypes.IMPACT_LIGHT : HapticFeedbackTypes.IMPACT_MEDIUM); }