Browse Source

Only bind *one* event handler. Not one per song/video. #22

Ian Walton 3 years ago
parent
commit
fc8b9ebf1d
2 changed files with 25 additions and 12 deletions
  1. 11 6
      native/mpvAudioPlayer.js
  2. 14 6
      native/mpvVideoPlayer.js

+ 11 - 6
native/mpvAudioPlayer.js

@@ -48,6 +48,7 @@ class mpvAudioPlayer {
         self._paused = false;
         self._volume = this.getSavedVolume() * 100;
         self._playRate = 1;
+        self._hasConnection = false;
 
         self.play = (options) => {
             self._started = false;
@@ -56,12 +57,15 @@ class mpvAudioPlayer {
             self._duration = undefined;
 
             const player = window.api.player;
-            player.playing.connect(onPlaying);
-            player.positionUpdate.connect(onTimeUpdate);
-            player.finished.connect(onEnded);
-            player.updateDuration.connect(onDuration);
-            player.error.connect(onError);
-            player.paused.connect(onPause);
+            if (!self._hasConnection) {
+                self._hasConnection = true;
+                player.playing.connect(onPlaying);
+                player.positionUpdate.connect(onTimeUpdate);
+                player.finished.connect(onEnded);
+                player.updateDuration.connect(onDuration);
+                player.error.connect(onError);
+                player.paused.connect(onPause);
+            }
 
             return setCurrentSrc(options);
         };
@@ -123,6 +127,7 @@ class mpvAudioPlayer {
             window.api.player.stop();
 
             const player = window.api.player;
+            self._hasConnection = false;
             player.playing.disconnect(onPlaying);
             player.positionUpdate.disconnect(onTimeUpdate);
             player.finished.disconnect(onEnded);

+ 14 - 6
native/mpvVideoPlayer.js

@@ -104,6 +104,10 @@
              * @type {float}
              */
             this._playRate = 1;
+            /**
+             * @type {boolean}
+             */
+            this._hasConnection = false;
 
             /**
              * @private
@@ -382,6 +386,7 @@
             document.body.classList.remove('hide-scroll');
 
             const player = window.api.player;
+            this._hasConnection = false;
             player.playing.disconnect(this.onPlaying);
             player.positionUpdate.disconnect(this.onTimeUpdate);
             player.finished.disconnect(this.onEnded);
@@ -433,12 +438,15 @@
                 document.body.insertBefore(dlg, document.body.firstChild);
                 this._videoDialog = dlg;
                 const player = window.api.player;
-                player.playing.connect(this.onPlaying);
-                player.positionUpdate.connect(this.onTimeUpdate);
-                player.finished.connect(this.onEnded);
-                player.updateDuration.connect(this.onDuration);
-                player.error.connect(this.onError);
-                player.paused.connect(this.onPause);
+                if (!this._hasConnection) {
+                    this._hasConnection = true;
+                    player.playing.connect(this.onPlaying);
+                    player.positionUpdate.connect(this.onTimeUpdate);
+                    player.finished.connect(this.onEnded);
+                    player.updateDuration.connect(this.onDuration);
+                    player.error.connect(this.onError);
+                    player.paused.connect(this.onPause);    
+                }
 
                 if (options.fullscreen) {
                     // At this point, we must hide the scrollbar placeholder, so it's not being displayed while the item is being loaded