Sfoglia il codice sorgente

memory: prevent multiple cursors stacking up as listeners in PlaybackManager, potential memory leak (#78)

there might be another, smaller memory leak with repeated playback (without switching sheets?)
sschmidTU 2 anni fa
parent
commit
16a918dd03

+ 1 - 1
demo/index.js

@@ -958,7 +958,7 @@ import { TransposeCalculator } from '../src/Plugins/Transpose/TransposeCalculato
             timingSource.pause();
             timingSource.Settings = osmd.Sheet.playbackSettings;
             playbackManager.initialize(osmd.Sheet.musicPartManager);
-            playbackManager.addListener(osmd.cursor);
+            //playbackManager.addListener(osmd.cursor); // this leads to 1 listener per initialization added that will not be removed and will stack up
             playbackManager.reset();
             osmd.PlaybackManager = playbackManager;
             playbackControlPanel.clearVolumeTracks();

+ 6 - 0
src/OpenSheetMusicDisplay/Cursor.ts

@@ -466,4 +466,10 @@ export class Cursor implements IPlaybackListener {
     }
     return 1;
   }
+
+  public Dispose(): void {
+    this.rules = undefined;
+    this.openSheetMusicDisplay = undefined;
+    this.cursorOptions = undefined;
+  }
 }

+ 4 - 0
src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts

@@ -904,6 +904,10 @@ export class OpenSheetMusicDisplay {
                 }
                 // create new cursor
                 if (backendToDrawOn && backendToDrawOn.getRenderElement()) {
+                    if (this.cursors[i]) {
+                        this.PlaybackManager.removeListener(this.cursors[i]);
+                        this.cursors[i].Dispose();
+                    }
                     this.cursors[i] = new Cursor(backendToDrawOn.getRenderElement(), this, this.cursorsOptions[i]);
                 }
                 if (this.sheet && this.graphic && this.cursors[i]) { // else init is called in load()

+ 6 - 0
src/Playback/PlaybackManager.ts

@@ -46,6 +46,12 @@ export class PlaybackManager implements IPlaybackParametersListener {
     public addListener(listener: IPlaybackListener): void {
         this.listeners.push(listener);
     }
+    public removeListener(listenerToRemove: IPlaybackListener): void {
+        const index: number = this.listeners.indexOf(listenerToRemove);
+        if (index >= 0) {
+            this.listeners.splice(index, 1);
+        }
+    }
     private readonly percussionChannel: number = 10; // this is a definition of the midi interface (cannot be changed)
     private readonly metronomeChannel: number = 9;
     private messageViewer: IMessageViewer;