소스 검색

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 년 전
부모
커밋
16a918dd03
4개의 변경된 파일17개의 추가작업 그리고 1개의 파일을 삭제
  1. 1 1
      demo/index.js
  2. 6 0
      src/OpenSheetMusicDisplay/Cursor.ts
  3. 4 0
      src/OpenSheetMusicDisplay/OpenSheetMusicDisplay.ts
  4. 6 0
      src/Playback/PlaybackManager.ts

+ 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;