Browse Source

fix(Playback): Fix playback crackling / cutting out in complex samples by disabling unnecessary part of memory leak fix (needs npm run prebuild)

run npm run prebuild to make this commit take effect (copies the changed files to node_modules/)

see:
https://github.com/opensheetmusicdisplay/osmd-extended/issues/78
https://github.com/opensheetmusicdisplay/osmd-extended/issues/93

also fixes playback sometimes taking slightly longer for pieces with extremely fast notes:
https://github.com/opensheetmusicdisplay/osmd-extended/issues/106
sschmidTU 1 year ago
parent
commit
e67e1ab76b
2 changed files with 23 additions and 11 deletions
  1. 5 0
      src/SamplePlayerPatch/lib/events.js
  2. 18 11
      src/SamplePlayerPatch/lib/player.js

+ 5 - 0
src/SamplePlayerPatch/lib/events.js

@@ -14,11 +14,16 @@ module.exports = function (player) {
   player.on = function (event, cb) {
     if (arguments.length === 1 && typeof event === 'function') return player.on('event', event)
     var prop = 'on' + event
+    // --- original soundfontplayer code ---
+    // var old = player[prop]
+    // player[prop] = old ? chain(old, cb) : cb
+    // --- patch ---
     if (player[prop]) {
       player[prop].push(cb)
     } else {
       player[prop] = [cb]
     }
+    // --- end patch ---
     return player
   }
   return player

+ 18 - 11
src/SamplePlayerPatch/lib/player.js

@@ -80,17 +80,24 @@ function SamplePlayer (ac, source, options) {
     var opts = options || EMPTY
     when = Math.max(ac.currentTime, when || 0)
     player.emit('start', when, name, opts)
-    // cache
-    var node
-    for (var iterator in tracked) {
-      if (buffer === tracked[iterator].source.buffer && tracked[iterator].startTime + buffer.duration < when) {
-        node = resetNode(tracked[iterator], buffer, opts)
-      }
-    }
-    if (!node) {
-      node = createNode(name, buffer, opts)
-      node.id = track(name, node)
-    }
+    // --- original soundfontplayer code ---
+    var node = createNode(name, buffer, opts)
+    node.id = track(name, node)
+    // --- patch (?) (memory leak) ---
+    // "patch" from 2022-09 for memory leak, seems to cause audio stutter for some samples,
+    //   and disabling this doesn't seem to cause leaks.
+    // // cache
+    // var node
+    // for (var iterator in tracked) {
+    //   if (buffer === tracked[iterator].source.buffer && tracked[iterator].startTime + buffer.duration < when) {
+    //     node = resetNode(tracked[iterator], buffer, opts)
+    //   }
+    // }
+    // if (!node) {
+    //   node = createNode(name, buffer, opts)
+    //   node.id = track(name, node)
+    // }
+    // --- end patch ---
     node.env.start(when)
     node.source.start(when)
     player.emit('started', when, node.id, node)