@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,540 @@
1
+ import {
2
+ useCallback,
3
+ useRef,
4
+ useState,
5
+ type RefObject,
6
+ } from "./react-runtime";
7
+ import {
8
+ ClipNode,
9
+ detectStreamFormat,
10
+ float32ArrayFromAudioBuffer,
11
+ getProcessorBlobUrl,
12
+ getStreamingWorkerUrl,
13
+ linFromDb,
14
+ usesBufferedContainerDecode,
15
+ } from "./clip-node-lib";
16
+ import type { ControlKey } from "./clip-node-lib";
17
+ import type { ClipNodeState, FrameData } from "./clip-node-lib";
18
+ import type { StreamFormat } from "./clip-node-lib";
19
+ import {
20
+ clampSeekTargetSamples,
21
+ secondsFromSamples,
22
+ } from "./streamTimeline";
23
+
24
+ function getWorkerUrl(format: StreamFormat): string {
25
+ return getStreamingWorkerUrl(format);
26
+ }
27
+
28
+ function applyValueToClip(node: ClipNode, key: ControlKey, value: number) {
29
+ switch (key) {
30
+ case "playhead":
31
+ node.playhead = value;
32
+ break;
33
+ case "offset":
34
+ node.offset = value;
35
+ break;
36
+ case "duration":
37
+ node.duration = value;
38
+ break;
39
+ case "loopStart":
40
+ node.loopStart = value;
41
+ break;
42
+ case "loopEnd":
43
+ node.loopEnd = value;
44
+ break;
45
+ case "loopCrossfade":
46
+ node.loopCrossfade = value;
47
+ break;
48
+ case "fadeIn":
49
+ node.fadeIn = value;
50
+ break;
51
+ case "fadeOut":
52
+ node.fadeOut = value;
53
+ break;
54
+ case "playbackRate":
55
+ node.playbackRate.value = value;
56
+ break;
57
+ case "detune":
58
+ node.detune.value = value;
59
+ break;
60
+ case "gain":
61
+ node.gain.value = linFromDb(value);
62
+ break;
63
+ case "pan":
64
+ node.pan.value = value;
65
+ break;
66
+ case "lowpass":
67
+ node.lowpass.value = value;
68
+ break;
69
+ case "highpass":
70
+ node.highpass.value = value;
71
+ break;
72
+ case "startDelay":
73
+ case "stopDelay":
74
+ break;
75
+ }
76
+ }
77
+
78
+ function applyToggleToClip(node: ClipNode, key: ControlKey, on: boolean) {
79
+ switch (key) {
80
+ case "fadeIn":
81
+ node.toggleFadeIn(on);
82
+ break;
83
+ case "fadeOut":
84
+ node.toggleFadeOut(on);
85
+ break;
86
+ case "loopCrossfade":
87
+ node.toggleLoopCrossfade(on);
88
+ break;
89
+ case "loopStart":
90
+ node.toggleLoopStart(on);
91
+ break;
92
+ case "loopEnd":
93
+ node.toggleLoopEnd(on);
94
+ break;
95
+ case "playbackRate":
96
+ node.togglePlaybackRate(on);
97
+ break;
98
+ case "detune":
99
+ node.toggleDetune(on);
100
+ break;
101
+ case "gain":
102
+ node.toggleGain(on);
103
+ break;
104
+ case "pan":
105
+ node.togglePan(on);
106
+ break;
107
+ case "lowpass":
108
+ node.toggleLowpass(on);
109
+ break;
110
+ case "highpass":
111
+ node.toggleHighpass(on);
112
+ break;
113
+ case "offset":
114
+ node.offset = on ? node.offset : 0;
115
+ break;
116
+ case "duration":
117
+ node.duration = on ? node.duration : -1;
118
+ break;
119
+ case "startDelay":
120
+ case "stopDelay":
121
+ break;
122
+ }
123
+ }
124
+
125
+ interface UseStreamingClipNodeParams {
126
+ values: Record<ControlKey, number>;
127
+ enabled: Record<ControlKey, boolean>;
128
+ loop: boolean;
129
+ setValue: (key: ControlKey, val: number) => void;
130
+ }
131
+
132
+ export function useStreamingClipNode({
133
+ values,
134
+ enabled,
135
+ loop,
136
+ setValue,
137
+ }: UseStreamingClipNodeParams) {
138
+ const [nodeState, setNodeState] = useState<ClipNodeState>("initial");
139
+ const [statusMessage, setStatusMessage] = useState<string | null>("Idle");
140
+ const [progress, setProgress] = useState(0);
141
+ const [audioDuration, setAudioDuration] = useState<number | null>(null);
142
+ const [seekableDuration, setSeekableDuration] = useState<number | null>(null);
143
+ const [seekableSamples, setSeekableSamples] = useState<number | null>(null);
144
+
145
+ const configureClip = useCallback(
146
+ (ctx: AudioContext, clip: ClipNode) => {
147
+ clip.loop = loop;
148
+ clip.connect(ctx.destination);
149
+
150
+ for (const key of Object.keys(values) as ControlKey[]) {
151
+ applyValueToClip(clip, key, values[key]);
152
+ }
153
+ for (const key of Object.keys(enabled) as ControlKey[]) {
154
+ if (!enabled[key]) {
155
+ applyToggleToClip(clip, key, false);
156
+ }
157
+ }
158
+
159
+ clip.onstatechange = (s) => setNodeState(s);
160
+ clip.onlooped = () => {
161
+ timesLoopedRef.current = clip.timesLooped.toString();
162
+ };
163
+ clip.onframe = (data) => {
164
+ frameRef.current = data;
165
+ };
166
+
167
+ setInfoLatency(
168
+ ctx.outputLatency != null
169
+ ? `base: ${Math.round(ctx.baseLatency * ctx.sampleRate)} | output: ${Math.round(ctx.outputLatency * ctx.sampleRate)}`
170
+ : "unknown",
171
+ );
172
+
173
+ clipRef.current = clip;
174
+ },
175
+ [enabled, loop, values],
176
+ );
177
+ const [infoLatency, setInfoLatency] = useState("unknown");
178
+ const statusRef = useRef<string | null>("Idle");
179
+ const finalDurationRef = useRef<number | null>(null);
180
+ const timelineSampleRateRef = useRef<number | null>(null);
181
+
182
+ const ctxRef = useRef<AudioContext | null>(null);
183
+ const clipRef = useRef<ClipNode | null>(null);
184
+ const workerRef = useRef<Worker | null>(null);
185
+ const frameRef = useRef<FrameData | null>(null);
186
+ const timesLoopedRef = useRef("0");
187
+
188
+ const ensureContext = useCallback(async () => {
189
+ if (ctxRef.current) return ctxRef.current;
190
+ const ctx = new AudioContext({ sampleRate: 48000 });
191
+ await ctx.audioWorklet.addModule(getProcessorBlobUrl());
192
+ ctxRef.current = ctx;
193
+ return ctx;
194
+ }, []);
195
+
196
+ const setStatus = useCallback((next: string) => {
197
+ if (statusRef.current === next) return;
198
+ statusRef.current = next;
199
+ setStatusMessage(next);
200
+ }, []);
201
+
202
+ const stream = useCallback(
203
+ async (url: string, throttle: number, format?: StreamFormat) => {
204
+ if (!url.trim()) {
205
+ setStatus("Enter a URL first.");
206
+ return;
207
+ }
208
+
209
+ // Tear down previous run
210
+ if (workerRef.current) {
211
+ workerRef.current.postMessage({ type: "abort" });
212
+ workerRef.current.terminate();
213
+ workerRef.current = null;
214
+ }
215
+ if (clipRef.current) {
216
+ clipRef.current.stop();
217
+ clipRef.current.disconnect();
218
+ clipRef.current = null;
219
+ }
220
+
221
+ try {
222
+ const ctx = await ensureContext();
223
+ await ctx.resume();
224
+ const selectedFormat = format ?? detectStreamFormat(url);
225
+ finalDurationRef.current = null;
226
+ timelineSampleRateRef.current = ctx.sampleRate;
227
+ setAudioDuration(null);
228
+ setSeekableDuration(null);
229
+ setSeekableSamples(null);
230
+ setProgress(0);
231
+
232
+ if (usesBufferedContainerDecode(selectedFormat)) {
233
+ const absoluteUrl = new URL(url, location.href).href;
234
+ const response = await fetch(absoluteUrl);
235
+ if (!response.ok) {
236
+ throw new Error(
237
+ `Fetch failed: ${response.status} ${response.statusText}`,
238
+ );
239
+ }
240
+ if (!response.body) {
241
+ throw new Error("Response has no body");
242
+ }
243
+
244
+ const contentLength = response.headers.get("content-length");
245
+ const totalBytes = contentLength
246
+ ? Number.parseInt(contentLength, 10)
247
+ : null;
248
+ const reader = response.body.getReader();
249
+ const chunks: Uint8Array[] = [];
250
+ let bytesReceived = 0;
251
+
252
+ while (true) {
253
+ const { done, value } = await reader.read();
254
+ if (done) break;
255
+ chunks.push(value);
256
+ bytesReceived += value.length;
257
+ if (totalBytes != null) {
258
+ setProgress(bytesReceived / totalBytes);
259
+ setStatus(
260
+ `Downloading container… ${((bytesReceived / 1024) | 0)} / ${((totalBytes / 1024) | 0)} KB`,
261
+ );
262
+ } else {
263
+ setStatus(`Downloading container… ${((bytesReceived / 1024) | 0)} KB`);
264
+ }
265
+ }
266
+
267
+ const combined = new Uint8Array(bytesReceived);
268
+ let offset = 0;
269
+ for (const chunk of chunks) {
270
+ combined.set(chunk, offset);
271
+ offset += chunk.length;
272
+ }
273
+
274
+ setStatus("Decoding container audio…");
275
+ const decoded = await ctx.decodeAudioData(combined.buffer);
276
+ const clip = new ClipNode(ctx, {
277
+ processorOptions: {
278
+ buffer: float32ArrayFromAudioBuffer(decoded),
279
+ },
280
+ });
281
+ configureClip(ctx, clip);
282
+ finalDurationRef.current = decoded.duration;
283
+ setAudioDuration(decoded.duration);
284
+ setSeekableDuration(decoded.duration);
285
+ setSeekableSamples(decoded.length);
286
+ setProgress(1);
287
+ clip.start();
288
+ setStatus(
289
+ `Buffered & playing… ${decoded.sampleRate} Hz, ${decoded.numberOfChannels} ch`,
290
+ );
291
+ return;
292
+ }
293
+
294
+ // Create ClipNode (no buffer — streaming mode)
295
+ const clip = new ClipNode(ctx);
296
+ configureClip(ctx, clip);
297
+
298
+ // Create MessageChannel: port1 → Worker, port2 → Processor
299
+ const channel = new MessageChannel();
300
+ clip.transferPort(channel.port2);
301
+
302
+ // Create and start decode worker
303
+ const worker = new Worker(getWorkerUrl(selectedFormat));
304
+ workerRef.current = worker;
305
+ worker.onerror = (event: ErrorEvent) => {
306
+ setStatus(
307
+ `Error: worker startup failed${event.message ? ` (${event.message})` : ""}`,
308
+ );
309
+ };
310
+ worker.onmessageerror = () => {
311
+ setStatus("Error: worker message channel failed.");
312
+ };
313
+
314
+ worker.onmessage = (ev: MessageEvent) => {
315
+ const { type } = ev.data;
316
+ switch (type) {
317
+ case "streamMeta": {
318
+ const sampleRate = ev.data.sampleRate as number;
319
+ const estimatedTotalSamples =
320
+ ev.data.estimatedTotalSamples as number | null;
321
+ timelineSampleRateRef.current =
322
+ sampleRate > 0 ? sampleRate : timelineSampleRateRef.current;
323
+ if (
324
+ estimatedTotalSamples != null &&
325
+ timelineSampleRateRef.current != null
326
+ ) {
327
+ const estimatedDuration = secondsFromSamples(
328
+ estimatedTotalSamples,
329
+ timelineSampleRateRef.current,
330
+ );
331
+ if (
332
+ estimatedDuration != null &&
333
+ finalDurationRef.current == null
334
+ ) {
335
+ setAudioDuration(estimatedDuration);
336
+ }
337
+ }
338
+ break;
339
+ }
340
+ case "progress": {
341
+ const { bytesReceived, totalBytes } = ev.data;
342
+ if (totalBytes) {
343
+ setProgress(bytesReceived / totalBytes);
344
+ setStatus(
345
+ `Downloading… ${((bytesReceived / 1024) | 0)} / ${((totalBytes / 1024) | 0)} KB`,
346
+ );
347
+ } else {
348
+ setStatus(
349
+ `Downloading… ${((bytesReceived / 1024) | 0)} KB`,
350
+ );
351
+ }
352
+ break;
353
+ }
354
+ case "decoded": {
355
+ const { samplesDecoded } = ev.data;
356
+ setSeekableSamples(samplesDecoded);
357
+ if (timelineSampleRateRef.current != null) {
358
+ const nextSeekable = secondsFromSamples(
359
+ samplesDecoded,
360
+ timelineSampleRateRef.current,
361
+ );
362
+ if (nextSeekable != null) {
363
+ setSeekableDuration(nextSeekable);
364
+ }
365
+ }
366
+ if (
367
+ samplesDecoded > 0 &&
368
+ clipRef.current?.state === "initial"
369
+ ) {
370
+ clipRef.current.start();
371
+ setStatus("Streaming & playing…");
372
+ }
373
+ break;
374
+ }
375
+ case "info": {
376
+ setStatus(
377
+ `Decoding: ${ev.data.sampleRate} Hz, ${ev.data.channels} ch`,
378
+ );
379
+ break;
380
+ }
381
+ case "done": {
382
+ const samples = ev.data.samplesDecoded as number;
383
+ setStatus(
384
+ `Done — ${samples} samples decoded.`,
385
+ );
386
+ setProgress(1);
387
+ if (ctx.sampleRate > 0) {
388
+ const duration = samples / ctx.sampleRate;
389
+ finalDurationRef.current = duration;
390
+ setAudioDuration(duration);
391
+ setSeekableDuration(duration);
392
+ setSeekableSamples(samples);
393
+ }
394
+ break;
395
+ }
396
+ case "error": {
397
+ setStatus(`Error: ${ev.data.message}`);
398
+ break;
399
+ }
400
+ case "aborted": {
401
+ setStatus("Aborted.");
402
+ break;
403
+ }
404
+ }
405
+ };
406
+
407
+ const absoluteUrl = new URL(url, location.href).href;
408
+ worker.postMessage(
409
+ {
410
+ type: "init",
411
+ port: channel.port1,
412
+ url: absoluteUrl,
413
+ throttle,
414
+ targetSampleRate: ctx.sampleRate,
415
+ },
416
+ [channel.port1],
417
+ );
418
+
419
+ setStatus(
420
+ throttle > 0
421
+ ? `Starting stream… (${(throttle / 1024).toFixed(0)} KB/s)`
422
+ : "Starting stream…",
423
+ );
424
+ setNodeState("initial");
425
+ } catch (error) {
426
+ if (workerRef.current) {
427
+ workerRef.current.terminate();
428
+ workerRef.current = null;
429
+ }
430
+ if (clipRef.current) {
431
+ clipRef.current.disconnect();
432
+ clipRef.current = null;
433
+ }
434
+ setStatus(
435
+ `Error: ${error instanceof Error ? error.message : String(error)}`,
436
+ );
437
+ }
438
+ },
439
+ [ensureContext, loop, values, enabled, setStatus],
440
+ );
441
+
442
+ const pause = useCallback(() => {
443
+ const clip = clipRef.current;
444
+ if (!clip) return;
445
+ if (clip.state === "resumed" || clip.state === "started") {
446
+ clip.pause();
447
+ setStatus("Paused.");
448
+ } else if (clip.state === "paused") {
449
+ clip.start();
450
+ setStatus("Resumed.");
451
+ }
452
+ }, [setStatus]);
453
+
454
+ const stop = useCallback(() => {
455
+ const clip = clipRef.current;
456
+ if (!clip) return;
457
+ clip.stop();
458
+ if (workerRef.current) {
459
+ workerRef.current.postMessage({ type: "abort" });
460
+ workerRef.current.terminate();
461
+ workerRef.current = null;
462
+ }
463
+ setProgress(0);
464
+ setStatus("Stopped.");
465
+ setSeekableDuration(null);
466
+ setSeekableSamples(null);
467
+ if (finalDurationRef.current != null) {
468
+ setAudioDuration(finalDurationRef.current);
469
+ }
470
+ }, [setStatus]);
471
+
472
+ const seekPlayhead = useCallback(
473
+ (targetSample: number) => {
474
+ const { value: clampedValue, clamped } = clampSeekTargetSamples(
475
+ targetSample,
476
+ seekableSamples,
477
+ );
478
+ setValue("playhead", clampedValue);
479
+ const node = clipRef.current;
480
+ if (node) {
481
+ applyValueToClip(node, "playhead", clampedValue);
482
+ }
483
+ if (clamped) {
484
+ setStatus("Seek limited to decoded region while streaming.");
485
+ }
486
+ },
487
+ [seekableSamples, setStatus, setValue],
488
+ );
489
+
490
+ const applyValue = useCallback(
491
+ (key: ControlKey, val: number) => {
492
+ setValue(key, val);
493
+ const node = clipRef.current;
494
+ if (node) applyValueToClip(node, key, val);
495
+ },
496
+ [setValue],
497
+ );
498
+
499
+ const applyToggle = useCallback((key: ControlKey, on: boolean) => {
500
+ const node = clipRef.current;
501
+ if (node) applyToggleToClip(node, key, on);
502
+ }, []);
503
+
504
+ const applyValues = useCallback(
505
+ (valuesToApply: Partial<Record<ControlKey, number>>) => {
506
+ const node = clipRef.current;
507
+ if (!node) return;
508
+ for (const [key, value] of Object.entries(valuesToApply) as Array<
509
+ [ControlKey, number]
510
+ >) {
511
+ applyValueToClip(node, key, value);
512
+ }
513
+ },
514
+ [],
515
+ );
516
+
517
+ const setLoopOnNode = useCallback((checked: boolean) => {
518
+ const node = clipRef.current;
519
+ if (node) node.loop = checked;
520
+ }, []);
521
+
522
+ return {
523
+ nodeState,
524
+ statusMessage,
525
+ progress,
526
+ audioDuration,
527
+ seekableDuration,
528
+ frameRef: frameRef as RefObject<FrameData | null>,
529
+ timesLoopedRef: timesLoopedRef as RefObject<string>,
530
+ infoLatency,
531
+ stream,
532
+ pause,
533
+ stop,
534
+ seekPlayhead,
535
+ applyValue,
536
+ applyValues,
537
+ applyToggle,
538
+ setLoopOnNode,
539
+ };
540
+ }
@@ -0,0 +1,153 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import {
3
+ appendWebmOpusBytes,
4
+ createWebmOpusParserState,
5
+ processWebmOpusElements,
6
+ type WebmElementDetail,
7
+ } from "../webm-opus-parser";
8
+
9
+ function detail<T extends object>(base: T): T & WebmElementDetail {
10
+ return {
11
+ data: new Uint8Array(0),
12
+ ...base,
13
+ name: (base as { name?: string }).name ?? "",
14
+ } as T & WebmElementDetail;
15
+ }
16
+
17
+ function buildOpusHead(channels = 2, preSkip = 312): Uint8Array {
18
+ const head = new Uint8Array(19);
19
+ head.set(new TextEncoder().encode("OpusHead"), 0);
20
+ head[8] = 1;
21
+ head[9] = channels;
22
+ head[10] = preSkip & 0xff;
23
+ head[11] = (preSkip >>> 8) & 0xff;
24
+ return head;
25
+ }
26
+
27
+ function buildSimpleBlock(trackNumber: number, timecode: number, packet: Uint8Array): Uint8Array {
28
+ const out = new Uint8Array(4 + packet.length);
29
+ out[0] = 0x80 | trackNumber;
30
+ out[1] = (timecode >>> 8) & 0xff;
31
+ out[2] = timecode & 0xff;
32
+ out[3] = 0x80;
33
+ out.set(packet, 4);
34
+ return out;
35
+ }
36
+
37
+ function encodeVint(value: number): number[] {
38
+ for (let length = 1; length <= 4; length++) {
39
+ const maxValue = 2 ** (7 * length) - 2;
40
+ if (value <= maxValue) {
41
+ const out = new Array<number>(length).fill(0);
42
+ let remaining = value;
43
+ for (let index = length - 1; index >= 0; index--) {
44
+ out[index] = remaining & 0xff;
45
+ remaining >>>= 8;
46
+ }
47
+ out[0] |= 1 << (8 - length);
48
+ return out;
49
+ }
50
+ }
51
+ throw new Error("value too large for test vint");
52
+ }
53
+
54
+ function encodeUnsigned(value: number): Uint8Array {
55
+ if (value === 0) return new Uint8Array([0]);
56
+ const bytes: number[] = [];
57
+ let remaining = value;
58
+ while (remaining > 0) {
59
+ bytes.unshift(remaining & 0xff);
60
+ remaining >>>= 8;
61
+ }
62
+ return new Uint8Array(bytes);
63
+ }
64
+
65
+ function ebml(id: number[], data: Uint8Array): Uint8Array {
66
+ return new Uint8Array([...id, ...encodeVint(data.length), ...data]);
67
+ }
68
+
69
+ function concatBytes(...parts: Uint8Array[]): Uint8Array {
70
+ const totalLength = parts.reduce((sum, part) => sum + part.length, 0);
71
+ const out = new Uint8Array(totalLength);
72
+ let offset = 0;
73
+ for (const part of parts) {
74
+ out.set(part, offset);
75
+ offset += part.length;
76
+ }
77
+ return out;
78
+ }
79
+
80
+ function buildMinimalWebmStream(packet: Uint8Array): Uint8Array {
81
+ const opusHead = buildOpusHead();
82
+ const trackEntry = ebml(
83
+ [0xae],
84
+ concatBytes(
85
+ ebml([0xd7], new Uint8Array([1])),
86
+ ebml([0x83], new Uint8Array([2])),
87
+ ebml([0x86], new TextEncoder().encode("A_OPUS")),
88
+ ebml([0x63, 0xa2], opusHead),
89
+ ebml([0x56, 0xaa], encodeUnsigned(6_500_000)),
90
+ ebml([0xe1], ebml([0x9f], new Uint8Array([2]))),
91
+ ),
92
+ );
93
+ const tracks = ebml([0x16, 0x54, 0xae, 0x6b], trackEntry);
94
+ const info = ebml(
95
+ [0x15, 0x49, 0xa9, 0x66],
96
+ ebml([0x2a, 0xd7, 0xb1], encodeUnsigned(1_000_000)),
97
+ );
98
+ const cluster = ebml(
99
+ [0x1f, 0x43, 0xb6, 0x75],
100
+ concatBytes(
101
+ ebml([0xe7], encodeUnsigned(100)),
102
+ ebml([0xa3], buildSimpleBlock(1, 20, packet)),
103
+ ),
104
+ );
105
+ const segment = ebml([0x18, 0x53, 0x80, 0x67], concatBytes(info, tracks, cluster));
106
+ return concatBytes(segment);
107
+ }
108
+
109
+ describe("webm opus parser", () => {
110
+ it("extracts track metadata and simple block packets", () => {
111
+ const opusHead = buildOpusHead();
112
+ const packet = new Uint8Array([0xaa, 0xbb, 0xcc]);
113
+ const elements = [
114
+ detail({ name: "TrackEntry", type: "m", isEnd: false }),
115
+ detail({ name: "TrackNumber", type: "u", value: 1, data: Buffer.alloc(0) }),
116
+ detail({ name: "TrackType", type: "u", value: 2, data: Buffer.alloc(0) }),
117
+ detail({ name: "CodecID", type: "s", value: "A_OPUS", data: Buffer.alloc(0) }),
118
+ detail({ name: "CodecPrivate", type: "b", value: Buffer.from(opusHead), data: Buffer.from(opusHead) }),
119
+ detail({ name: "CodecDelay", type: "u", value: 6_500_000, data: Buffer.alloc(0) }),
120
+ detail({ name: "Audio", type: "m", isEnd: false }),
121
+ detail({ name: "Channels", type: "u", value: 2, data: Buffer.alloc(0) }),
122
+ detail({ name: "Audio", type: "m", isEnd: true }),
123
+ detail({ name: "TrackEntry", type: "m", isEnd: true }),
124
+ detail({ name: "TimestampScale", type: "u", value: 1_000_000, data: Buffer.alloc(0) }),
125
+ detail({ name: "Timestamp", type: "u", value: 100, data: Buffer.alloc(0) }),
126
+ detail({ name: "SimpleBlock", type: "b", value: Buffer.from(packet), data: Buffer.from(buildSimpleBlock(1, 20, packet)) }),
127
+ ] as WebmElementDetail[];
128
+ const state = createWebmOpusParserState();
129
+ const parsed = processWebmOpusElements(elements, state);
130
+ expect(parsed.head?.channels).toBe(2);
131
+ expect(parsed.head?.preSkip).toBe(312);
132
+ expect(parsed.packets).toHaveLength(1);
133
+ expect(parsed.packets[0]?.packet).toEqual(packet);
134
+ expect(parsed.packets[0]?.timestampUs).toBe(113_500);
135
+ });
136
+
137
+ it("parses incremental webm bytes without ts-ebml", () => {
138
+ const packet = new Uint8Array([0xaa, 0xbb, 0xcc]);
139
+ const bytes = buildMinimalWebmStream(packet);
140
+ const state = createWebmOpusParserState();
141
+
142
+ const first = appendWebmOpusBytes(bytes.subarray(0, 17), state);
143
+ expect(first.head).toBeNull();
144
+ expect(first.packets).toHaveLength(0);
145
+
146
+ const second = appendWebmOpusBytes(bytes.subarray(17), state);
147
+ expect(second.head?.channels).toBe(2);
148
+ expect(second.head?.preSkip).toBe(312);
149
+ expect(second.packets).toHaveLength(1);
150
+ expect(second.packets[0]?.packet).toEqual(packet);
151
+ expect(second.packets[0]?.timestampUs).toBe(113_500);
152
+ });
153
+ });
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ES2022",
5
+ "moduleResolution": "bundler",
6
+ "jsx": "react-jsx",
7
+ "strict": true,
8
+ "esModuleInterop": true,
9
+ "types": ["bun-types"],
10
+ "skipLibCheck": true,
11
+ "noEmit": true,
12
+ "paths": {
13
+ "@jadujoel/web-audio-clip-node": ["../../src/lib"],
14
+ "@jadujoel/web-audio-clip-node/react": ["../../src/lib-react"],
15
+ "@jadujoel/web-audio-clip-node/styles.css": ["../../src/styles.css"]
16
+ }
17
+ },
18
+ "include": ["src/**/*", "*.ts", "generated/**/*"]
19
+ }