fix(voice): cleanup audio context on processing init failure
This commit is contained in:
parent
7a85935eee
commit
bdd5ff768e
|
|
@ -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 }> => {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue