fix(voice): cleanup audio context on processing init failure

This commit is contained in:
ServerBob 2026-03-05 06:41:13 +00:00
parent 7a85935eee
commit bdd5ff768e
1 changed files with 93 additions and 67 deletions

View File

@ -415,6 +415,28 @@ const VoiceProvider = memo(({ children }: TVoiceProviderProps) => {
let rnnoiseNode: AudioWorkletNode | undefined; let rnnoiseNode: AudioWorkletNode | undefined;
let gateNode: AudioWorkletNode | undefined; let gateNode: AudioWorkletNode | undefined;
const cleanupLocalProcessing = async () => {
try {
gateNode?.disconnect();
rnnoiseNode?.disconnect();
deepFilterNode?.disconnect();
source.disconnect();
dest.disconnect();
deepFilterCore?.destroy?.();
} catch {
// ignore cleanup failures
}
try {
if (ctx.state !== 'closed') {
await ctx.close();
}
} catch {
// ignore context close failures
}
};
try {
if (useDeepFilterNet) { if (useDeepFilterNet) {
const deepFilterSuppression = sensitivityToDeepFilterLevel( const deepFilterSuppression = sensitivityToDeepFilterLevel(
devices.voiceSensitivity ?? 70 devices.voiceSensitivity ?? 70
@ -488,6 +510,10 @@ const VoiceProvider = memo(({ children }: TVoiceProviderProps) => {
}); });
return dest.stream; return dest.stream;
} catch (err) {
await cleanupLocalProcessing();
throw err;
}
}, [devices.noiseSuppressionDeepFilterNet, devices.noiseSuppressionRnnoise, devices.keyboardSuppression, devices.voiceSensitivity, cleanupAudioProcessing]); }, [devices.noiseSuppressionDeepFilterNet, devices.noiseSuppressionRnnoise, devices.keyboardSuppression, devices.voiceSensitivity, cleanupAudioProcessing]);
const acquireMicStream = useCallback(async (): Promise<{ stream: MediaStream; track: MediaStreamTrack; raw: MediaStream }> => { const acquireMicStream = useCallback(async (): Promise<{ stream: MediaStream; track: MediaStreamTrack; raw: MediaStream }> => {