Files
discord-decomp/modules/voice_messages/native/VoiceMessageUtils.tsx
T
2026-11-01 12:12:55 +02:00

172 lines
6.3 KiB
TypeScript

// 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);
}