Skip to content

Commit 47d0bbb

Browse files
authored
Ensure mic stream is cleaned up on destroy (#1907)
1 parent fb036bc commit 47d0bbb

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

frontend/viewer/src/lib/components/audio/recorder/recorder.svelte

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
8181
let wavesurfer: WaveSurfer | undefined;
8282
let recorder: RecordPlugin | undefined;
83-
let micActivatorStream: MediaStream | undefined;
83+
let micActivatorStreamPromise: Promise<MediaStream> | undefined;
8484
8585
watch(() => container, (newContainer) => {
8686
reset();
@@ -111,12 +111,17 @@
111111
// Request access/activate mic early so it's ready on demand and there's no initial crackle
112112
// Note: I don't think any browser enforces getUserMedia() to be called in the context of a user gesture
113113
// except when the user has previously denied access, in which case this could be sub-optimal
114-
micActivatorStream = await navigator.mediaDevices.getUserMedia({ audio: true });
114+
115+
// assign the promise before we wait for it so onDestroy can always see it
116+
micActivatorStreamPromise = navigator.mediaDevices.getUserMedia({ audio: true });
117+
await micActivatorStreamPromise;
115118
}
116119
117120
function cleanUpStream() {
118-
micActivatorStream?.getTracks().forEach(track => track.stop());
119-
micActivatorStream = undefined;
121+
void micActivatorStreamPromise?.then(stream => {
122+
stream.getTracks().forEach(track => track.stop());
123+
});
124+
micActivatorStreamPromise = undefined;
120125
}
121126
122127
function initRecorder(container: string | HTMLElement) {

0 commit comments

Comments
 (0)