@jadujoel/web-audio-clip-node 0.1.7 → 0.1.8

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.
Files changed (432) hide show
  1. package/dist/App.d.ts +6 -0
  2. package/dist/App.js +179 -0
  3. package/dist/audio/processor-code.d.ts +1 -1
  4. package/dist/audio/processor-code.js +1 -1
  5. package/dist/audio/processor-kernel.js +23 -9
  6. package/dist/audio/version.d.ts +1 -1
  7. package/dist/audio/version.js +1 -1
  8. package/dist/lib.bundle.js +3 -3
  9. package/dist/lib.bundle.js.map +3 -3
  10. package/dist/processor.js +2 -2
  11. package/dist/processor.js.map +3 -3
  12. package/dist/streaming.d.ts +6 -0
  13. package/dist/streaming.js +32 -0
  14. package/dist/workers/framed-raw-opus.d.ts +13 -0
  15. package/dist/workers/framed-raw-opus.js +68 -0
  16. package/dist/workers/mp3-decode-worker.d.ts +1 -0
  17. package/dist/workers/mp3-decode-worker.js +254 -0
  18. package/dist/workers/mp3-decode-worker.min.js +1 -0
  19. package/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  20. package/dist/workers/ogg-opus-decode-worker.js +398 -0
  21. package/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  22. package/dist/workers/opus-worker-common.d.ts +45 -0
  23. package/dist/workers/opus-worker-common.js +226 -0
  24. package/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  25. package/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  26. package/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  27. package/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  28. package/dist/workers/webm-opus-decode-worker.js +97 -0
  29. package/dist/workers/webm-opus-decode-worker.min.js +1 -0
  30. package/dist/workers/webm-opus-parser.d.ts +49 -0
  31. package/dist/workers/webm-opus-parser.js +369 -0
  32. package/dist/workers/worker-utils.d.ts +11 -0
  33. package/dist/workers/worker-utils.js +55 -0
  34. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  35. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  36. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  37. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  38. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  39. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  40. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  41. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  42. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  43. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  44. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  45. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  46. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  47. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  48. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  49. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  50. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  51. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  52. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  53. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  54. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  55. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  56. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  57. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  58. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  59. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  60. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  61. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  62. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  63. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  64. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  65. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  66. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  67. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  68. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  69. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  70. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  71. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  72. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  73. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  74. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  75. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  76. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  77. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  78. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  79. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  80. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  81. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  82. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  83. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  84. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  85. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  86. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  87. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  88. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  89. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  90. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  91. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  92. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  93. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  94. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  95. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  96. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  97. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  98. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  99. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  100. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  101. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  102. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  103. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  104. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  105. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  106. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  107. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  108. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  109. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  110. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  111. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  112. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  113. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  114. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  115. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  116. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  117. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  118. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  119. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  120. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  121. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  122. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  123. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  124. package/examples/esm-bundler/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  125. package/examples/index.html +253 -8
  126. package/examples/playground/README.md +9 -0
  127. package/examples/playground/index.html +14 -0
  128. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  129. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  130. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  131. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  132. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  133. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  134. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  135. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  136. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  137. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  138. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  139. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  140. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  141. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  142. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  143. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  144. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  145. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  146. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  147. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  148. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  149. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  150. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  151. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  152. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  153. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  154. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  155. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  156. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  157. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  158. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  159. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  160. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  161. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  162. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  163. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  164. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  165. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  166. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  167. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  168. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  169. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  170. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  171. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  172. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  173. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  174. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  175. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  176. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  177. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  178. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  179. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  180. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  181. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  182. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  183. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  184. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  185. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  186. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  187. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  188. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  189. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  190. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  191. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  192. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  193. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  194. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  195. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  196. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  197. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  198. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  199. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  200. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  201. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  202. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  203. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  204. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  205. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  206. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  207. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  208. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  209. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  210. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  211. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  212. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  213. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  214. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  215. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  216. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  217. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  218. package/examples/playground/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  219. package/examples/playground/package.json +19 -0
  220. package/examples/playground/src/App.tsx +442 -0
  221. package/examples/playground/src/main.tsx +9 -0
  222. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  223. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  224. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  225. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  226. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  227. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  228. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  229. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  230. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  231. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  232. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  233. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  234. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  235. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  236. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  237. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  238. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  239. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  240. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  241. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  242. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  243. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  244. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  245. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  246. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  247. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  248. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  249. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  250. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  251. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  252. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  253. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  254. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  255. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  256. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  257. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  258. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  259. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  260. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  261. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  262. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  263. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  264. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  265. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  266. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  267. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  268. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  269. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  270. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  271. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  272. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  273. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  274. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  275. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  276. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  277. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  278. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  279. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  280. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  281. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  282. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  283. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  284. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  285. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  286. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  287. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  288. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  289. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  290. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  291. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  292. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  293. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  294. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  295. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  296. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  297. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  298. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  299. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  300. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  301. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  302. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  303. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  304. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  305. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  306. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  307. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  308. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  309. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  310. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  311. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  312. package/examples/react/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  313. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/LICENSE +21 -0
  314. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/README.md +197 -0
  315. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/App.d.ts +6 -0
  316. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/App.js +179 -0
  317. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.d.ts +88 -0
  318. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/ClipNode.js +317 -0
  319. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.d.ts +1 -0
  320. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-code.js +2 -0
  321. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.d.ts +43 -0
  322. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor-kernel.js +892 -0
  323. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.d.ts +1 -0
  324. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/processor.js +103 -0
  325. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.d.ts +192 -0
  326. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/types.js +9 -0
  327. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.d.ts +22 -0
  328. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/utils.js +128 -0
  329. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.d.ts +1 -0
  330. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/version.js +2 -0
  331. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.d.ts +6 -0
  332. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/audio/workletUrl.js +17 -0
  333. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.d.ts +28 -0
  334. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/AudioControl.js +99 -0
  335. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.d.ts +17 -0
  336. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ContextMenu.js +73 -0
  337. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.d.ts +26 -0
  338. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/ControlSection.js +74 -0
  339. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.d.ts +10 -0
  340. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DetuneControl.js +44 -0
  341. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.d.ts +14 -0
  342. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/DisplayPanel.js +6 -0
  343. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.d.ts +12 -0
  344. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/FilterControl.js +48 -0
  345. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.d.ts +10 -0
  346. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/GainControl.js +44 -0
  347. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.d.ts +10 -0
  348. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PanControl.js +50 -0
  349. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.d.ts +10 -0
  350. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlaybackRateControl.js +44 -0
  351. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.d.ts +13 -0
  352. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/PlayheadSlider.js +20 -0
  353. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.d.ts +18 -0
  354. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/SnappableSlider.js +174 -0
  355. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.d.ts +14 -0
  356. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/components/TransportButtons.js +9 -0
  357. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.d.ts +31 -0
  358. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/controlDefs.js +214 -0
  359. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.d.ts +2 -0
  360. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/formatValueText.js +80 -0
  361. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.d.ts +20 -0
  362. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/controls/linkedControlPairs.js +51 -0
  363. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.d.ts +1 -0
  364. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/cache.js +17 -0
  365. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.d.ts +6 -0
  366. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/data/fileStore.js +39 -0
  367. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.d.ts +31 -0
  368. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/hooks/useClipNode.js +338 -0
  369. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.d.ts +15 -0
  370. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib-react.js +17 -0
  371. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js +6 -0
  372. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.bundle.js.map +7 -0
  373. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.d.ts +16 -0
  374. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/lib.js +16 -0
  375. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js +4 -0
  376. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/processor.js.map +12 -0
  377. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.d.ts +63 -0
  378. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/store/clipStore.js +71 -0
  379. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.d.ts +6 -0
  380. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/streaming.js +32 -0
  381. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css +739 -0
  382. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/styles.css.d.ts +3 -0
  383. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.d.ts +13 -0
  384. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/framed-raw-opus.js +68 -0
  385. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.d.ts +1 -0
  386. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.js +254 -0
  387. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/mp3-decode-worker.min.js +1 -0
  388. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.d.ts +1 -0
  389. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.js +398 -0
  390. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/ogg-opus-decode-worker.min.js +1 -0
  391. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.d.ts +45 -0
  392. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/opus-worker-common.js +226 -0
  393. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.d.ts +1 -0
  394. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.js +119 -0
  395. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/raw-opus-framed-decode-worker.min.js +1 -0
  396. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.d.ts +1 -0
  397. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.js +97 -0
  398. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-decode-worker.min.js +1 -0
  399. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.d.ts +49 -0
  400. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/webm-opus-parser.js +369 -0
  401. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.d.ts +11 -0
  402. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/dist/workers/worker-utils.js +55 -0
  403. package/examples/self-hosted/node_modules/@jadujoel/web-audio-clip-node/package.json +104 -0
  404. package/examples/self-hosted/public/processor.js +2 -2
  405. package/examples/streaming/build-worker.ts +45 -17
  406. package/examples/streaming/framed-raw-opus.ts +95 -0
  407. package/examples/streaming/index.html +4 -199
  408. package/examples/streaming/{decode-worker.ts → mp3-decode-worker.ts} +62 -44
  409. package/examples/streaming/ogg-opus-decode-worker.ts +479 -0
  410. package/examples/streaming/opus-worker-common.ts +278 -0
  411. package/examples/streaming/package.json +9 -1
  412. package/examples/streaming/raw-opus-framed-decode-worker.ts +148 -0
  413. package/examples/streaming/src/App.tsx +726 -0
  414. package/examples/streaming/src/clip-node-lib.ts +33 -0
  415. package/examples/streaming/src/framedRawOpus.test.ts +74 -0
  416. package/examples/streaming/src/main.tsx +6 -0
  417. package/examples/streaming/src/react-dom-runtime.d.ts +1 -0
  418. package/examples/streaming/src/react-dom-runtime.js +1 -0
  419. package/examples/streaming/src/react-runtime.d.ts +2 -0
  420. package/examples/streaming/src/react-runtime.js +7 -0
  421. package/examples/streaming/src/streamFormat.test.ts +13 -0
  422. package/examples/streaming/src/streamFormat.ts +14 -0
  423. package/examples/streaming/src/streamTimeline.test.ts +74 -0
  424. package/examples/streaming/src/streamTimeline.ts +76 -0
  425. package/examples/streaming/src/useStreamingClipNode.ts +540 -0
  426. package/examples/streaming/src/webmOpusParser.test.ts +153 -0
  427. package/examples/streaming/tsconfig.json +19 -0
  428. package/examples/streaming/webm-opus-decode-worker.ts +123 -0
  429. package/examples/streaming/webm-opus-parser.ts +461 -0
  430. package/examples/streaming/worker-utils.ts +45 -0
  431. package/package.json +13 -2
  432. package/examples/streaming/main.ts +0 -276
@@ -0,0 +1,123 @@
1
+ // WebM Opus Decode Worker — runs fetch → WebM/Matroska demux → AudioDecoder off the main thread.
2
+ // Uses the local incremental parser to extract Opus packets and feeds them into WebCodecs.
3
+
4
+ // @ts-expect-error redeclare self as DedicatedWorkerGlobalScope
5
+ declare const self: DedicatedWorkerGlobalScope;
6
+
7
+ import {
8
+ OPUS_SAMPLE_RATE,
9
+ StreamingOpusDecoder,
10
+ } from "./opus-worker-common";
11
+ import {
12
+ appendWebmOpusBytes,
13
+ createWebmOpusParserState,
14
+ } from "./webm-opus-parser";
15
+ import { createThrottleStream } from "./worker-utils";
16
+
17
+ let abortController: AbortController | null = null;
18
+
19
+ self.onmessage = (ev: MessageEvent) => {
20
+ const { type } = ev.data;
21
+ if (type === "init") {
22
+ const { port, url, throttle, targetSampleRate } = ev.data as {
23
+ port: MessagePort;
24
+ url: string;
25
+ throttle?: number;
26
+ targetSampleRate?: number;
27
+ };
28
+ abortController = new AbortController();
29
+ startStreaming(port, url, abortController.signal, throttle ?? 0, targetSampleRate ?? 0);
30
+ } else if (type === "abort") {
31
+ abortController?.abort();
32
+ }
33
+ };
34
+
35
+ async function startStreaming(
36
+ processorPort: MessagePort,
37
+ url: string,
38
+ signal: AbortSignal,
39
+ throttle: number,
40
+ targetSampleRate: number,
41
+ ) {
42
+ let totalBytes: number | null = null;
43
+ let bytesReceived = 0;
44
+ const parserState = createWebmOpusParserState();
45
+ const streamDecoder = new StreamingOpusDecoder({
46
+ processorPort,
47
+ targetSampleRate,
48
+ postMessage: (message) => self.postMessage(message),
49
+ });
50
+
51
+ try {
52
+ const response = await fetch(url, { signal });
53
+ if (!response.ok) {
54
+ self.postMessage({
55
+ type: "error",
56
+ message: `Fetch failed: ${response.status} ${response.statusText}`,
57
+ });
58
+ return;
59
+ }
60
+ if (!response.body) {
61
+ self.postMessage({ type: "error", message: "Response has no body" });
62
+ return;
63
+ }
64
+
65
+ const contentLength = response.headers.get("content-length");
66
+ totalBytes = contentLength ? Number.parseInt(contentLength, 10) : null;
67
+ streamDecoder.setTotalBytes(totalBytes);
68
+
69
+ const body = throttle > 0
70
+ ? response.body.pipeThrough(createThrottleStream(throttle))
71
+ : response.body;
72
+ const reader = body.getReader();
73
+
74
+ while (true) {
75
+ const { done, value } = await reader.read();
76
+ if (done) break;
77
+
78
+ bytesReceived += value.length;
79
+ self.postMessage({ type: "progress", bytesReceived, totalBytes });
80
+
81
+ const parsed = appendWebmOpusBytes(value, parserState);
82
+ if (parsed.head != null && !streamDecoder.hasConfiguredDecoder) {
83
+ await streamDecoder.configure(parsed.head, "opus");
84
+ }
85
+ for (const packet of parsed.packets) {
86
+ streamDecoder.decodePacket(packet.packet, packet.timestampUs);
87
+ }
88
+ }
89
+
90
+ if (streamDecoder.hasConfiguredDecoder && streamDecoder.hasDecodedPackets) {
91
+ await streamDecoder.flush();
92
+ } else {
93
+ self.postMessage({
94
+ type: "error",
95
+ message: "No WebM Opus packets found in the stream",
96
+ });
97
+ return;
98
+ }
99
+
100
+ processorPort.postMessage({
101
+ type: "bufferEnd",
102
+ data: { totalLength: streamDecoder.samplesDecoded },
103
+ });
104
+ self.postMessage({
105
+ type: "done",
106
+ samplesDecoded: streamDecoder.samplesDecoded,
107
+ sampleRate: OPUS_SAMPLE_RATE,
108
+ channels: streamDecoder.channels,
109
+ });
110
+ } catch (e: unknown) {
111
+ if (e instanceof DOMException && e.name === "AbortError") {
112
+ self.postMessage({ type: "aborted" });
113
+ } else {
114
+ self.postMessage({
115
+ type: "error",
116
+ message: e instanceof Error ? e.message : String(e),
117
+ });
118
+ }
119
+ } finally {
120
+ streamDecoder.close();
121
+ processorPort.close();
122
+ }
123
+ }
@@ -0,0 +1,461 @@
1
+ import {
2
+ createFallbackOpusHead,
3
+ parseOpusHead,
4
+ type OpusHead,
5
+ } from "./opus-worker-common";
6
+
7
+ export interface ParsedWebmOpusPacket {
8
+ packet: Uint8Array<ArrayBufferLike>;
9
+ timestampUs: number;
10
+ }
11
+
12
+ type ElementType = "m" | "u" | "s" | "8" | "b";
13
+
14
+ export interface WebmElementDetail {
15
+ name: string;
16
+ type: ElementType;
17
+ isEnd?: boolean;
18
+ value?: number | string;
19
+ data: Uint8Array<ArrayBufferLike>;
20
+ }
21
+
22
+ interface PartialTrackInfo {
23
+ trackNumber?: number;
24
+ trackType?: number;
25
+ codecId?: string;
26
+ codecPrivate?: Uint8Array<ArrayBufferLike> | null;
27
+ channels?: number;
28
+ codecDelayNs?: number;
29
+ }
30
+
31
+ interface WebmOpusTrackInfo {
32
+ trackNumber: number;
33
+ channels: number;
34
+ codecPrivate: Uint8Array<ArrayBufferLike> | null;
35
+ codecDelayNs: number;
36
+ }
37
+
38
+ interface ParserStackEntry {
39
+ name: string;
40
+ end: number | null;
41
+ }
42
+
43
+ export interface WebmOpusParserState {
44
+ timestampScaleNs: number;
45
+ clusterTimestamp: number;
46
+ currentTrack: PartialTrackInfo | null;
47
+ activeTrack: WebmOpusTrackInfo | null;
48
+ inAudio: boolean;
49
+ buffer: Uint8Array<ArrayBufferLike>;
50
+ byteOffset: number;
51
+ elementStack: ParserStackEntry[];
52
+ }
53
+
54
+ export interface WebmOpusParseResult {
55
+ packets: ParsedWebmOpusPacket[];
56
+ head: OpusHead | null;
57
+ }
58
+
59
+ const EMPTY_BYTES = new Uint8Array(0);
60
+ const UTF8_DECODER = new TextDecoder();
61
+ const ASCII_DECODER = new TextDecoder("ascii");
62
+
63
+ const WEBM_ELEMENTS = new Map<number, { name: string; type: ElementType }>([
64
+ [0x1a45dfa3, { name: "EBML", type: "m" }],
65
+ [0x18538067, { name: "Segment", type: "m" }],
66
+ [0x114d9b74, { name: "SeekHead", type: "m" }],
67
+ [0x1549a966, { name: "Info", type: "m" }],
68
+ [0x1654ae6b, { name: "Tracks", type: "m" }],
69
+ [0x1f43b675, { name: "Cluster", type: "m" }],
70
+ [0x1c53bb6b, { name: "Cues", type: "m" }],
71
+ [0xae, { name: "TrackEntry", type: "m" }],
72
+ [0xe1, { name: "Audio", type: "m" }],
73
+ [0x2ad7b1, { name: "TimestampScale", type: "u" }],
74
+ [0xe7, { name: "Timestamp", type: "u" }],
75
+ [0xd7, { name: "TrackNumber", type: "u" }],
76
+ [0x83, { name: "TrackType", type: "u" }],
77
+ [0x86, { name: "CodecID", type: "s" }],
78
+ [0x63a2, { name: "CodecPrivate", type: "b" }],
79
+ [0x56aa, { name: "CodecDelay", type: "u" }],
80
+ [0x9f, { name: "Channels", type: "u" }],
81
+ [0xa3, { name: "SimpleBlock", type: "b" }],
82
+ [0xa1, { name: "Block", type: "b" }],
83
+ ]);
84
+
85
+ interface VintResult {
86
+ length: number;
87
+ value: number;
88
+ }
89
+
90
+ interface ParsedBlock {
91
+ trackNumber: number;
92
+ timecode: number;
93
+ frames: Uint8Array<ArrayBufferLike>[];
94
+ }
95
+
96
+ export function createWebmOpusParserState(): WebmOpusParserState {
97
+ return {
98
+ timestampScaleNs: 1_000_000,
99
+ clusterTimestamp: 0,
100
+ currentTrack: null,
101
+ activeTrack: null,
102
+ inAudio: false,
103
+ buffer: EMPTY_BYTES,
104
+ byteOffset: 0,
105
+ elementStack: [],
106
+ };
107
+ }
108
+
109
+ function concatBytes(
110
+ left: Uint8Array<ArrayBufferLike>,
111
+ right: Uint8Array<ArrayBufferLike>,
112
+ ): Uint8Array<ArrayBufferLike> {
113
+ if (left.length === 0) return right;
114
+ if (right.length === 0) return left;
115
+ const combined = new Uint8Array(left.length + right.length);
116
+ combined.set(left, 0);
117
+ combined.set(right, left.length);
118
+ return combined;
119
+ }
120
+
121
+ function toUint8Array(bytes: Uint8Array): Uint8Array<ArrayBufferLike> {
122
+ return new Uint8Array(
123
+ bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength),
124
+ );
125
+ }
126
+
127
+ function readEbmlId(bytes: Uint8Array, offset: number): VintResult | null {
128
+ if (offset >= bytes.length) return null;
129
+ const firstByte = bytes[offset];
130
+ if (firstByte === 0) return null;
131
+ let length = 1;
132
+ while (length <= 4 && (firstByte & (1 << (8 - length))) === 0) {
133
+ length += 1;
134
+ }
135
+ if (length > 4 || offset + length > bytes.length) return null;
136
+ let value = 0;
137
+ for (let index = 0; index < length; index++) {
138
+ value = (value << 8) | bytes[offset + index]!;
139
+ }
140
+ return { length, value };
141
+ }
142
+
143
+ function readVint(
144
+ bytes: Uint8Array,
145
+ offset: number,
146
+ signed = false,
147
+ ): VintResult | null {
148
+ if (offset >= bytes.length) return null;
149
+ const firstByte = bytes[offset];
150
+ if (firstByte === 0) return null;
151
+ let length = 1;
152
+ while (length <= 8 && (firstByte & (1 << (8 - length))) === 0) {
153
+ length += 1;
154
+ }
155
+ if (length > 8 || offset + length > bytes.length) return null;
156
+
157
+ let value = firstByte & ((1 << (8 - length)) - 1);
158
+ for (let index = 1; index < length; index++) {
159
+ value = value * 256 + (bytes[offset + index] ?? 0);
160
+ }
161
+
162
+ const maxValue = 2 ** (7 * length) - 1;
163
+ if (!signed && value === maxValue) {
164
+ return { length, value: -1 };
165
+ }
166
+ if (signed) {
167
+ value -= 2 ** (7 * length - 1) - 1;
168
+ }
169
+ return { length, value };
170
+ }
171
+
172
+ function readUnsigned(bytes: Uint8Array): number {
173
+ let value = 0;
174
+ for (const byte of bytes) {
175
+ value = value * 256 + byte;
176
+ }
177
+ return value;
178
+ }
179
+
180
+ function decodeElementValue(
181
+ info: { name: string; type: ElementType },
182
+ data: Uint8Array<ArrayBufferLike>,
183
+ ): WebmElementDetail {
184
+ if (info.type === "u") {
185
+ return { name: info.name, type: info.type, value: readUnsigned(data), data };
186
+ }
187
+ if (info.type === "s") {
188
+ return {
189
+ name: info.name,
190
+ type: info.type,
191
+ value: ASCII_DECODER.decode(data),
192
+ data,
193
+ };
194
+ }
195
+ if (info.type === "8") {
196
+ return {
197
+ name: info.name,
198
+ type: info.type,
199
+ value: UTF8_DECODER.decode(data),
200
+ data,
201
+ };
202
+ }
203
+ return { name: info.name, type: info.type, data };
204
+ }
205
+
206
+ function drainCompletedMasters(
207
+ state: WebmOpusParserState,
208
+ absoluteOffset: number,
209
+ elements: WebmElementDetail[],
210
+ ) {
211
+ while (state.elementStack.length > 0) {
212
+ const top = state.elementStack[state.elementStack.length - 1]!;
213
+ if (top.end == null || absoluteOffset < top.end) {
214
+ break;
215
+ }
216
+ state.elementStack.pop();
217
+ elements.push({ name: top.name, type: "m", isEnd: true, data: EMPTY_BYTES });
218
+ }
219
+ }
220
+
221
+ function parseBlockFrames(payload: Uint8Array, lacing: number): Uint8Array<ArrayBufferLike>[] {
222
+ if (lacing === 0) {
223
+ return [toUint8Array(payload)];
224
+ }
225
+ if (payload.length === 0) {
226
+ return [];
227
+ }
228
+
229
+ let cursor = 0;
230
+ const frameCount = (payload[cursor++] ?? 0) + 1;
231
+ const sizes: number[] = [];
232
+
233
+ if (lacing === 2) {
234
+ const size = Math.floor((payload.length - cursor) / frameCount);
235
+ for (let index = 0; index < frameCount; index++) sizes.push(size);
236
+ return sizes.map((frameSize, index) => {
237
+ const start = cursor + index * frameSize;
238
+ return toUint8Array(payload.subarray(start, start + frameSize));
239
+ });
240
+ }
241
+
242
+ if (lacing === 1) {
243
+ let total = 0;
244
+ for (let index = 0; index < frameCount - 1; index++) {
245
+ let size = 0;
246
+ while (cursor < payload.length) {
247
+ const value = payload[cursor++] ?? 0;
248
+ size += value;
249
+ if (value !== 0xff) break;
250
+ }
251
+ sizes.push(size);
252
+ total += size;
253
+ }
254
+ sizes.push(payload.length - cursor - total);
255
+ } else {
256
+ const firstSize = readVint(payload, cursor, false);
257
+ if (!firstSize) return [];
258
+ cursor += firstSize.length;
259
+ sizes.push(firstSize.value);
260
+ let total = firstSize.value;
261
+ for (let index = 1; index < frameCount - 1; index++) {
262
+ const delta = readVint(payload, cursor, true);
263
+ if (!delta) return [];
264
+ cursor += delta.length;
265
+ const nextSize = sizes[index - 1]! + delta.value;
266
+ sizes.push(nextSize);
267
+ total += nextSize;
268
+ }
269
+ sizes.push(payload.length - cursor - total);
270
+ }
271
+
272
+ const frames: Uint8Array<ArrayBufferLike>[] = [];
273
+ for (const size of sizes) {
274
+ frames.push(toUint8Array(payload.subarray(cursor, cursor + size)));
275
+ cursor += size;
276
+ }
277
+ return frames;
278
+ }
279
+
280
+ function parseBlock(data: Uint8Array): ParsedBlock {
281
+ const track = readVint(data, 0, false);
282
+ if (!track) {
283
+ throw new Error("Invalid WebM block: missing track number");
284
+ }
285
+ let cursor = track.length;
286
+ if (data.length < cursor + 3) {
287
+ throw new Error("Invalid WebM block: truncated header");
288
+ }
289
+ let timecode = ((data[cursor] ?? 0) << 8) | (data[cursor + 1] ?? 0);
290
+ if (timecode & 0x8000) {
291
+ timecode -= 0x10000;
292
+ }
293
+ cursor += 2;
294
+ const flags = data[cursor++] ?? 0;
295
+ const lacing = (flags >> 1) & 0x03;
296
+ const frames = parseBlockFrames(data.subarray(cursor), lacing);
297
+ return {
298
+ trackNumber: track.value,
299
+ timecode,
300
+ frames,
301
+ };
302
+ }
303
+
304
+ function parseWebmElements(
305
+ chunk: Uint8Array<ArrayBufferLike>,
306
+ state: WebmOpusParserState,
307
+ ): WebmElementDetail[] {
308
+ state.buffer = concatBytes(state.buffer, chunk);
309
+ const elements: WebmElementDetail[] = [];
310
+ let cursor = 0;
311
+
312
+ while (true) {
313
+ drainCompletedMasters(state, state.byteOffset + cursor, elements);
314
+
315
+ const id = readEbmlId(state.buffer, cursor);
316
+ if (!id) break;
317
+ const size = readVint(state.buffer, cursor + id.length, false);
318
+ if (!size) break;
319
+ const headerSize = id.length + size.length;
320
+ if (state.buffer.length < cursor + headerSize) break;
321
+
322
+ const info = WEBM_ELEMENTS.get(id.value) ?? { name: "unknown", type: "b" as const };
323
+ const dataSize = size.value;
324
+ const absoluteContentStart = state.byteOffset + cursor + headerSize;
325
+ cursor += headerSize;
326
+
327
+ if (info.type === "m") {
328
+ elements.push({ name: info.name, type: "m", isEnd: false, data: EMPTY_BYTES });
329
+ state.elementStack.push({
330
+ name: info.name,
331
+ end: dataSize >= 0 ? absoluteContentStart + dataSize : null,
332
+ });
333
+ continue;
334
+ }
335
+
336
+ if (dataSize < 0 || state.buffer.length < cursor + dataSize) {
337
+ cursor -= headerSize;
338
+ break;
339
+ }
340
+
341
+ const data = toUint8Array(state.buffer.subarray(cursor, cursor + dataSize));
342
+ elements.push(decodeElementValue(info, data));
343
+ cursor += dataSize;
344
+ }
345
+
346
+ state.byteOffset += cursor;
347
+ state.buffer = toUint8Array(state.buffer.subarray(cursor));
348
+ drainCompletedMasters(state, state.byteOffset, elements);
349
+ return elements;
350
+ }
351
+
352
+ export function processWebmOpusElements(
353
+ elements: WebmElementDetail[],
354
+ state: WebmOpusParserState,
355
+ ): WebmOpusParseResult {
356
+ const packets: ParsedWebmOpusPacket[] = [];
357
+ let head: OpusHead | null = null;
358
+
359
+ for (const element of elements) {
360
+ if (element.type === "m") {
361
+ if (!element.isEnd) {
362
+ if (element.name === "TrackEntry") {
363
+ state.currentTrack = {};
364
+ } else if (element.name === "Audio") {
365
+ state.inAudio = true;
366
+ }
367
+ } else {
368
+ if (element.name === "TrackEntry") {
369
+ if (
370
+ state.activeTrack == null &&
371
+ state.currentTrack?.trackType === 2 &&
372
+ state.currentTrack.codecId === "A_OPUS" &&
373
+ state.currentTrack.trackNumber != null
374
+ ) {
375
+ const channels = state.currentTrack.channels ?? 2;
376
+ const codecPrivate = state.currentTrack.codecPrivate ?? null;
377
+ state.activeTrack = {
378
+ trackNumber: state.currentTrack.trackNumber,
379
+ channels,
380
+ codecPrivate,
381
+ codecDelayNs: state.currentTrack.codecDelayNs ?? 0,
382
+ };
383
+ head = codecPrivate != null
384
+ ? parseOpusHead(codecPrivate) ?? createFallbackOpusHead(channels)
385
+ : createFallbackOpusHead(channels);
386
+ }
387
+ state.currentTrack = null;
388
+ } else if (element.name === "Audio") {
389
+ state.inAudio = false;
390
+ }
391
+ }
392
+ continue;
393
+ }
394
+
395
+ if (element.name === "TimestampScale" || element.name === "TimecodeScale") {
396
+ state.timestampScaleNs = element.value as number;
397
+ continue;
398
+ }
399
+ if (element.name === "Timestamp" || element.name === "Timecode") {
400
+ state.clusterTimestamp = element.value as number;
401
+ continue;
402
+ }
403
+
404
+ if (state.currentTrack != null) {
405
+ switch (element.name) {
406
+ case "TrackNumber":
407
+ state.currentTrack.trackNumber = element.value as number;
408
+ continue;
409
+ case "TrackType":
410
+ state.currentTrack.trackType = element.value as number;
411
+ continue;
412
+ case "CodecID":
413
+ state.currentTrack.codecId = element.value as string;
414
+ continue;
415
+ case "CodecPrivate":
416
+ state.currentTrack.codecPrivate = element.data;
417
+ continue;
418
+ case "CodecDelay":
419
+ state.currentTrack.codecDelayNs = element.value as number;
420
+ continue;
421
+ case "Channels":
422
+ if (state.inAudio) {
423
+ state.currentTrack.channels = element.value as number;
424
+ }
425
+ continue;
426
+ }
427
+ }
428
+
429
+ if (
430
+ state.activeTrack != null &&
431
+ (element.name === "SimpleBlock" || element.name === "Block")
432
+ ) {
433
+ const block = parseBlock(element.data);
434
+ if (block.trackNumber !== state.activeTrack.trackNumber) {
435
+ continue;
436
+ }
437
+ const baseTimestampUs = Math.max(
438
+ 0,
439
+ Math.round(
440
+ ((state.clusterTimestamp + block.timecode) * state.timestampScaleNs -
441
+ state.activeTrack.codecDelayNs) / 1_000,
442
+ ),
443
+ );
444
+ for (let index = 0; index < block.frames.length; index++) {
445
+ packets.push({
446
+ packet: block.frames[index]!,
447
+ timestampUs: baseTimestampUs + index,
448
+ });
449
+ }
450
+ }
451
+ }
452
+
453
+ return { packets, head };
454
+ }
455
+
456
+ export function appendWebmOpusBytes(
457
+ chunk: Uint8Array<ArrayBufferLike>,
458
+ state: WebmOpusParserState,
459
+ ): WebmOpusParseResult {
460
+ return processWebmOpusElements(parseWebmElements(chunk, state), state);
461
+ }
@@ -0,0 +1,45 @@
1
+ export function concat(a: Uint8Array, b: Uint8Array): Uint8Array {
2
+ const out = new Uint8Array(a.length + b.length);
3
+ out.set(a);
4
+ out.set(b, a.length);
5
+ return out;
6
+ }
7
+
8
+ export function resampleChannel(
9
+ src: Float32Array,
10
+ srcRate: number,
11
+ dstRate: number,
12
+ ): Float32Array {
13
+ if (srcRate === dstRate) return src;
14
+ const ratio = srcRate / dstRate;
15
+ const dstLen = Math.round(src.length / ratio);
16
+ const dst = new Float32Array(dstLen);
17
+ for (let i = 0; i < dstLen; i++) {
18
+ const srcPos = i * ratio;
19
+ const idx = Math.floor(srcPos);
20
+ const frac = srcPos - idx;
21
+ const a = src[idx] ?? 0;
22
+ const b = src[Math.min(idx + 1, src.length - 1)] ?? 0;
23
+ dst[i] = a + frac * (b - a);
24
+ }
25
+ return dst;
26
+ }
27
+
28
+ export function createThrottleStream(
29
+ bytesPerSec: number,
30
+ ): TransformStream<Uint8Array, Uint8Array> {
31
+ let totalBytes = 0;
32
+ const startTime = performance.now();
33
+ return new TransformStream({
34
+ async transform(chunk, controller) {
35
+ totalBytes += chunk.length;
36
+ const elapsed = (performance.now() - startTime) / 1000;
37
+ const expected = totalBytes / bytesPerSec;
38
+ const delay = expected - elapsed;
39
+ if (delay > 0) {
40
+ await new Promise((resolve) => setTimeout(resolve, delay * 1000));
41
+ }
42
+ controller.enqueue(chunk);
43
+ },
44
+ });
45
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jadujoel/web-audio-clip-node",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "type": "module",
5
5
  "description": "Full-featured AudioWorklet clip player with playback rate, detune, gain, pan, filters, looping, fades, crossfade, and streaming buffer support. React components included.",
6
6
  "keywords": [
@@ -29,6 +29,10 @@
29
29
  "types": "./dist/lib-react.d.ts",
30
30
  "import": "./dist/lib-react.js"
31
31
  },
32
+ "./streaming": {
33
+ "types": "./dist/streaming.d.ts",
34
+ "import": "./dist/streaming.js"
35
+ },
32
36
  "./processor": "./dist/processor.js",
33
37
  "./styles.css": {
34
38
  "types": "./dist/styles.css.d.ts",
@@ -47,10 +51,16 @@
47
51
  "scripts": {
48
52
  "build": "bun build.ts",
49
53
  "build:lib": "bun build.ts --lib",
50
- "dev": "bun serve.ts",
54
+ "build:webpage": "bun build.ts --webpage",
55
+ "dev": "bun serve-webpage.ts",
51
56
  "examples": "bun examples.ts",
52
57
  "lint": "biome check",
58
+ "serve-webpage": "bun serve-webpage.ts",
53
59
  "test": "bun test",
60
+ "test:e2e": "bunx playwright test",
61
+ "test:e2e:chromium": "bunx playwright test --project=chromium",
62
+ "test:e2e:firefox": "bunx playwright test --project=firefox",
63
+ "test:e2e:webkit": "bunx playwright test --project=webkit",
54
64
  "typecheck": "tsc --noEmit",
55
65
  "validate": "bun run build && bun run lint && bun run typecheck && bun test",
56
66
  "prepublishOnly": "bun run build:lib"
@@ -73,6 +83,7 @@
73
83
  },
74
84
  "devDependencies": {
75
85
  "@biomejs/biome": "2.4.11",
86
+ "@playwright/test": "1.59.1",
76
87
  "@testing-library/dom": "10.4.1",
77
88
  "@testing-library/react": "16.3.2",
78
89
  "@types/react": "19.2.14",