@@ -27,6 +27,7 @@ import MediaRecorder, {
2727import OpusMediaRecorder from "opus-media-recorder" ;
2828import { toaster } from "evergreen-ui" ;
2929import { env } from "utils/env" ;
30+ import { useWillUnmount } from "rooks" ;
3031
3132interface UseToneAudioOptions
3233 extends Pick < ToneState , "isPlaying" | "isRecording" | "subdivision" > ,
@@ -247,17 +248,32 @@ const useToneAudio = (options: UseToneAudioOptions): UseToneAudioResult => {
247248 updateTracks ( { isPlaying : false , loop : true } , toneTracksRef . current ) ;
248249 } , [ isRecording , lengthInMs , mimeType , onRecordingComplete ] ) ;
249250
251+ useWillUnmount ( ( ) => {
252+ cleanupTracks ( toneTracksRef . current ) ;
253+ toneTracksRef . current = Map ( ) ;
254+ Tone . Transport . stop ( ) ;
255+ } ) ;
256+
250257 const isLoading = loadingState . some ( ( loading ) => loading ) ;
251258
252259 return {
253260 isLoading,
254261 } ;
255262} ;
256263
264+ const cleanupTracks = ( tracks : Map < string , ToneTrack > ) : void => {
265+ tracks . forEach ( ( toneTrack ) => {
266+ const { channel, sampler, sequence } = toneTrack ;
267+ channel . dispose ( ) ;
268+ sampler . dispose ( ) ;
269+ sequence . dispose ( ) ;
270+ } ) ;
271+ } ;
272+
257273const updateTracks = (
258274 options : Pick < UseToneAudioOptions , "loop" | "isPlaying" > ,
259275 tracks : Map < string , ToneTrack >
260- ) => {
276+ ) : void => {
261277 const { loop, isPlaying } = options ;
262278 tracks . forEach ( ( toneTrack ) => {
263279 if ( loop != null ) {
0 commit comments