@banou/ripple 0.0.29 → 0.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@banou/ripple",
3
- "version": "0.0.29",
3
+ "version": "0.0.30",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
package/sw.js CHANGED
@@ -8,8 +8,8 @@ const live = new Map()
8
8
  /* Stamped at build time. These are the dev defaults and must never reach production: a worker whose
9
9
  BUILD never changes is never reinstalled, so the update this feature announces would never fire. */
10
10
  const MODE = "cache" // @stamp:mode
11
- const BUILD = "cb8353dc5e7aa834" // @stamp:build
12
- const MANIFEST = [["/assets/empty-BvRk9kiK.js","e3b0c44298fc1c14"],["/assets/libtorrent-DleyqKUt.js","27516279f85831f1"],["/assets/worker-Dx1oQ7Q_.js","f43c4541e44036f4"],["/build-B7te3F-u.js","47b056c564f078c5"],["/remote-DvdN47iT.js","b0649250a9e3a079"],["/volume-normalizer-worklet.js","f317010b936c83f5"]] // @stamp:manifest
11
+ const BUILD = "0a822c9844cb9b01" // @stamp:build
12
+ const MANIFEST = [["/assets/empty-BvRk9kiK.js","e3b0c44298fc1c14"],["/assets/libtorrent-DleyqKUt.js","27516279f85831f1"],["/assets/worker-Dx1oQ7Q_.js","f43c4541e44036f4"],["/build-B7te3F-u.js","47b056c564f078c5"],["/remote-DvdN47iT.js","b0649250a9e3a079"],["/volume-normalizer-worklet.js","4021752281e110ba"]] // @stamp:manifest
13
13
 
14
14
  const CACHE = 'ripple-assets-' + BUILD
15
15
 
@@ -564,8 +564,10 @@ export const createAnalysis = ({ toWorklet, toPage = () => {} }) => {
564
564
  toWorklet({ drop: block })
565
565
  }
566
566
  if (!Number.isFinite(level)) return
567
- for (let block = Math.max(0, here - 1); block <= here + 3; block++) {
568
- if (block * BLOCK_BINS >= endBin) break
567
+ // the playhead's own block first: under load each took 21 to 43 ms, and sent after the one before it, a seek's
568
+ // cut over HTTP reached the worklet 64 to 75 ms after the seek, its audio 72 to 83 ms (HOR-888, 2026-10-23)
569
+ for (const block of [here, here - 1, here + 1, here + 2, here + 3]) {
570
+ if (block < 0 || block * BLOCK_BINS >= endBin) continue
569
571
  const start = block * BLOCK_BINS
570
572
  const known = signature(start - MARGIN_BINS, start + BLOCK_BINS + MARGIN_BINS)
571
573
  const last = sent.get(block)
@@ -1064,14 +1066,16 @@ const defineProcessor = () => class VolumeNormalizer extends AudioWorkletProcess
1064
1066
  * finds it at all, is taken only once the next search, 250 ms later, peaks within 2 ms of it, clear or not: voiced
1065
1067
  * dialogue repeats with its pitch, so a peak a pitch period off can come out ahead, and a FLAC run once matched 45 ms
1066
1068
  * off with every check passed. Over the whole 250 ms either way an Opus file's matches were never that clear (HOR-498
1067
- * build, 2026-10-17).
1069
+ * build, 2026-10-17). Kept past that next one, a candidate that a match came back to after four elsewhere locked an
1070
+ * Opus run under load 18 ms off, every cut that much late (HOR-888, 2026-10-23).
1068
1071
  */
1069
1072
  found(offset, clear) {
1070
1073
  const near = (other) => other !== null && Math.abs(offset - other) <= 0.002
1071
- if (near(this.candidate)) {
1074
+ const confirmed = near(this.candidate)
1075
+ this.candidate = null
1076
+ if (confirmed) {
1072
1077
  this.offset = offset
1073
1078
  this.doubt = false
1074
- this.candidate = null
1075
1079
  } else if (clear) {
1076
1080
  if (!this.doubt && near(this.offset)) this.offset = offset
1077
1081
  else this.candidate = offset