framefields 2.12.0 → 2.13.1

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 (387) hide show
  1. package/README.md +9 -4
  2. package/dist/audio/index.d.mts +6 -5
  3. package/dist/audio/index.mjs +13 -13
  4. package/dist/{audio-afTBdB3U.d.mts → audio-C4B9p_yq.d.mts} +3 -4
  5. package/dist/audio-C4B9p_yq.d.mts.map +1 -0
  6. package/dist/{audio-DHLoNcxD.mjs → audio-DIvi6hTD.mjs} +4 -4
  7. package/dist/{audio-DHLoNcxD.mjs.map → audio-DIvi6hTD.mjs.map} +1 -1
  8. package/dist/{audio-KHBadECb.mjs → audio-DS9Jg2ls.mjs} +1 -1
  9. package/dist/{audio-KHBadECb.mjs.map → audio-DS9Jg2ls.mjs.map} +1 -1
  10. package/dist/{check-result-Culfu7Nx.mjs → check-result-DZWx73V8.mjs} +1 -1
  11. package/dist/{check-result-Culfu7Nx.mjs.map → check-result-DZWx73V8.mjs.map} +1 -1
  12. package/dist/cli/check-worker.mjs +51 -51
  13. package/dist/cli/check-worker.mjs.map +1 -1
  14. package/dist/cli/local-worker.d.mts +28 -0
  15. package/dist/cli/local-worker.d.mts.map +1 -0
  16. package/dist/cli/local-worker.mjs +83 -0
  17. package/dist/cli/local-worker.mjs.map +1 -0
  18. package/dist/cli.mjs +229 -54
  19. package/dist/cli.mjs.map +1 -1
  20. package/dist/cloud/index.d.mts +2 -0
  21. package/dist/cloud/index.d.mts.map +1 -1
  22. package/dist/cloud/index.mjs +1 -1
  23. package/dist/{cloud-COid1Ipa.mjs → cloud-Cj1TIme8.mjs} +306 -7
  24. package/dist/cloud-Cj1TIme8.mjs.map +1 -0
  25. package/dist/components/index.d.mts +15 -14
  26. package/dist/components/index.mjs +47 -47
  27. package/dist/{dist-CySGkG54.mjs → dist-BSKAbyea.mjs} +2 -2
  28. package/dist/{dist-CySGkG54.mjs.map → dist-BSKAbyea.mjs.map} +1 -1
  29. package/dist/{dist-BwtxciN4.mjs → dist-B_rSWeOz.mjs} +1 -1
  30. package/dist/{dist-Bf2_efYP.mjs → dist-C8XSqfTx.mjs} +1 -1
  31. package/dist/{dist-Bf2_efYP.mjs.map → dist-C8XSqfTx.mjs.map} +1 -1
  32. package/dist/{dist-BSqeChht.mjs → dist-CCrYOkcc.mjs} +145 -84
  33. package/dist/dist-CCrYOkcc.mjs.map +1 -0
  34. package/dist/dist-CiTgmfUw.mjs +502 -0
  35. package/dist/dist-CiTgmfUw.mjs.map +1 -0
  36. package/dist/{dist-BIE8fvlv.mjs → dist-DgZpN6IK.mjs} +1 -1
  37. package/dist/{dist-BIE8fvlv.mjs.map → dist-DgZpN6IK.mjs.map} +1 -1
  38. package/dist/{dist-B-OPY7Cs.mjs → dist-DtPPPsZV.mjs} +356 -145
  39. package/dist/dist-DtPPPsZV.mjs.map +1 -0
  40. package/dist/{dist-2_lT3Dwc.mjs → dist-Kbf-JTry.mjs} +2 -2
  41. package/dist/{dist-2_lT3Dwc.mjs.map → dist-Kbf-JTry.mjs.map} +1 -1
  42. package/dist/effects/index.d.mts +6 -6
  43. package/dist/effects/index.mjs +36 -36
  44. package/dist/{effects-C8CL9cOq.mjs → effects-B-L3rLs6.mjs} +3 -3
  45. package/dist/{effects-C8CL9cOq.mjs.map → effects-B-L3rLs6.mjs.map} +1 -1
  46. package/dist/fonts/index.d.mts +1 -1
  47. package/dist/fonts/index.mjs +3 -3
  48. package/dist/{fonts-BQrDjnpV.mjs → fonts-k5ll8NTE.mjs} +2 -2
  49. package/dist/{fonts-BQrDjnpV.mjs.map → fonts-k5ll8NTE.mjs.map} +1 -1
  50. package/dist/{gpu-DHa-3Dou.mjs → gpu-D2HT3KcE.mjs} +2 -2
  51. package/dist/{gpu-DHa-3Dou.mjs.map → gpu-D2HT3KcE.mjs.map} +1 -1
  52. package/dist/{index-CTv9ZieD.d.mts → index-B08eSpaI.d.mts} +3 -30
  53. package/dist/index-B08eSpaI.d.mts.map +1 -0
  54. package/dist/index-BFTtXosj.d.mts +63 -0
  55. package/dist/index-BFTtXosj.d.mts.map +1 -0
  56. package/dist/{index-Drk6HC2k.d.mts → index-BGlaws7-.d.mts} +3 -3
  57. package/dist/{index-Drk6HC2k.d.mts.map → index-BGlaws7-.d.mts.map} +1 -1
  58. package/dist/{index-CAuNuvIg.d.mts → index-ByhlTwxh.d.mts} +5 -5
  59. package/dist/{index-CAuNuvIg.d.mts.map → index-ByhlTwxh.d.mts.map} +1 -1
  60. package/dist/{index-Fliv2Z-w.d.mts → index-C2yaponf.d.mts} +132 -7
  61. package/dist/index-C2yaponf.d.mts.map +1 -0
  62. package/dist/{index-BW0Q1ygn.d.mts → index-C5sgRLlG.d.mts} +1 -1
  63. package/dist/{index-BW0Q1ygn.d.mts.map → index-C5sgRLlG.d.mts.map} +1 -1
  64. package/dist/{index-CdCrae-I.d.mts → index-CnZhBlob.d.mts} +2 -2
  65. package/dist/index-CnZhBlob.d.mts.map +1 -0
  66. package/dist/{index-BNClElng.d.mts → index-CtKUQ2VG.d.mts} +281 -283
  67. package/dist/index-CtKUQ2VG.d.mts.map +1 -0
  68. package/dist/{index-WwuuX8ZJ.d.mts → index-DBh3WphX.d.mts} +2 -2
  69. package/dist/{index-WwuuX8ZJ.d.mts.map → index-DBh3WphX.d.mts.map} +1 -1
  70. package/dist/{index-gOVtTm-P.d.mts → index-DQ1U3HC3.d.mts} +14 -6
  71. package/dist/index-DQ1U3HC3.d.mts.map +1 -0
  72. package/dist/{index-COYNQ_mf.d.mts → index-a6JrbAK0.d.mts} +1 -1
  73. package/dist/{index-COYNQ_mf.d.mts.map → index-a6JrbAK0.d.mts.map} +1 -1
  74. package/dist/{index-DQa7mhzq.d.mts → index-rtCXNxGO.d.mts} +2 -2
  75. package/dist/{index-DQa7mhzq.d.mts.map → index-rtCXNxGO.d.mts.map} +1 -1
  76. package/dist/index.d.mts +16 -15
  77. package/dist/index.mjs +58 -58
  78. package/dist/preview/index.d.mts +5 -4
  79. package/dist/preview/index.mjs +12 -12
  80. package/dist/preview-engine/audio.mjs +1 -1
  81. package/dist/preview-engine/{chunk-FJTURGJV.mjs → chunk-3C2XT64C.mjs} +1 -1
  82. package/dist/preview-engine/chunk-52X7SURQ.mjs +494 -0
  83. package/dist/preview-engine/{chunk-4JNIEQS2.mjs → chunk-5ZS46EFB.mjs} +1 -1
  84. package/dist/preview-engine/{chunk-KBCZKIIQ.mjs → chunk-CYM75INB.mjs} +1 -1
  85. package/dist/preview-engine/chunk-FZ4RD7HV.mjs +1 -0
  86. package/dist/preview-engine/chunk-LZNHGH56.mjs +5 -0
  87. package/dist/preview-engine/{chunk-RGKS6YIA.mjs → chunk-N2VISDTG.mjs} +1 -1
  88. package/dist/preview-engine/chunk-N3XTDAL6.mjs +2227 -0
  89. package/dist/preview-engine/{chunk-O75BFM4S.mjs → chunk-NVXFEDJS.mjs} +1 -1
  90. package/dist/preview-engine/chunk-OBIJIQCZ.mjs +1 -0
  91. package/dist/preview-engine/{chunk-VUO4K52B.mjs → chunk-PD2HKW2S.mjs} +1 -1
  92. package/dist/preview-engine/{chunk-HTAHYSCW.mjs → chunk-R4H52Q7S.mjs} +1 -1
  93. package/dist/preview-engine/{chunk-6O7UDVNL.mjs → chunk-RYSV44B4.mjs} +1 -1
  94. package/dist/preview-engine/{chunk-TKXOSEIJ.mjs → chunk-SV3ZNZQU.mjs} +1 -1
  95. package/dist/preview-engine/{chunk-JAUMCOOJ.mjs → chunk-UBY2UYEL.mjs} +1 -1
  96. package/dist/preview-engine/{chunk-32WC4FRR.mjs → chunk-UE7Y65C3.mjs} +3 -3
  97. package/dist/preview-engine/{chunk-M4QVCQ3O.mjs → chunk-VMXJZ4KQ.mjs} +1 -1
  98. package/dist/preview-engine/{chunk-EYKN2VET.mjs → chunk-XCPRRMMW.mjs} +31 -31
  99. package/dist/preview-engine/components.mjs +1 -1
  100. package/dist/preview-engine/effects.mjs +1 -1
  101. package/dist/preview-engine/framefields.mjs +1 -1
  102. package/dist/preview-engine/player.mjs +5 -5
  103. package/dist/preview-engine/{renderers-L6GFGHS6.mjs → renderers-AFTUFMQQ.mjs} +1 -1
  104. package/dist/preview-engine/renderers-DU7KPFVV.mjs +1 -1
  105. package/dist/preview-engine/{renderers-PREFONJG.mjs → renderers-EPSF5CSQ.mjs} +1 -1
  106. package/dist/preview-engine/{renderers-R22CDFO4.mjs → renderers-OJWWIVNW.mjs} +1 -1
  107. package/dist/preview-engine/{renderers-TS32FDV7.mjs → renderers-RHMRWX46.mjs} +1 -1
  108. package/dist/preview-engine/renderers-VEHYARKY.mjs +1 -0
  109. package/dist/preview-engine/renderers-VRXAG3FR.mjs +1 -0
  110. package/dist/preview-engine/renderers-ZHSOWEMQ.mjs +1 -0
  111. package/dist/preview-engine/renderers-ZMDRNYSS.mjs +1 -0
  112. package/dist/preview-engine/renderers-ZMMQ7S2A.mjs +228 -0
  113. package/dist/preview-engine/signals.mjs +1 -1
  114. package/dist/preview-engine/{src-GPF7RIBU.mjs → src-YXNX4MLK.mjs} +1 -1
  115. package/dist/{preview-BUtt481A.mjs → preview-lHH8Tv4j.mjs} +323 -35
  116. package/dist/preview-lHH8Tv4j.mjs.map +1 -0
  117. package/dist/{program-Cvv_nb9T.mjs → program-BfiB9ttP.mjs} +17 -4
  118. package/dist/program-BfiB9ttP.mjs.map +1 -0
  119. package/dist/renderer/index.d.mts +4 -3
  120. package/dist/renderer/index.mjs +3 -3
  121. package/dist/renderer-0rLmztAv.mjs +5 -0
  122. package/dist/{renderer-D3QPNBEj.mjs → renderer-4nsuReW2.mjs} +5 -5
  123. package/dist/{renderer-D3QPNBEj.mjs.map → renderer-4nsuReW2.mjs.map} +1 -1
  124. package/dist/{renderer-DO1SZ5xY.mjs → renderer-7xQmXXMH.mjs} +5 -5
  125. package/dist/{renderer-DO1SZ5xY.mjs.map → renderer-7xQmXXMH.mjs.map} +1 -1
  126. package/dist/renderer-B0pjOXFY.mjs +5 -0
  127. package/dist/{renderer-BSsKlcHk.mjs → renderer-B10HDC13.mjs} +5 -5
  128. package/dist/{renderer-BSsKlcHk.mjs.map → renderer-B10HDC13.mjs.map} +1 -1
  129. package/dist/{renderer-DaY04IyU.mjs → renderer-B2IUPjhw.mjs} +5 -5
  130. package/dist/{renderer-DaY04IyU.mjs.map → renderer-B2IUPjhw.mjs.map} +1 -1
  131. package/dist/{renderer-O4y02xkD.mjs → renderer-B3_GddgJ.mjs} +4 -4
  132. package/dist/{renderer-O4y02xkD.mjs.map → renderer-B3_GddgJ.mjs.map} +1 -1
  133. package/dist/{renderer-DQJHjU0L.mjs → renderer-B3un4Pdi.mjs} +5 -5
  134. package/dist/{renderer-DQJHjU0L.mjs.map → renderer-B3un4Pdi.mjs.map} +1 -1
  135. package/dist/{renderer-PnnkUWm-.mjs → renderer-B6bK9rXm.mjs} +4 -4
  136. package/dist/{renderer-PnnkUWm-.mjs.map → renderer-B6bK9rXm.mjs.map} +1 -1
  137. package/dist/renderer-B7J13reL.mjs +5 -0
  138. package/dist/{renderer-HXw4cJZx.mjs → renderer-BEhZiOT4.mjs} +3 -3
  139. package/dist/{renderer-HXw4cJZx.mjs.map → renderer-BEhZiOT4.mjs.map} +1 -1
  140. package/dist/{renderer-xNOKSN3V.mjs → renderer-BEuXJY-C.mjs} +5 -5
  141. package/dist/{renderer-xNOKSN3V.mjs.map → renderer-BEuXJY-C.mjs.map} +1 -1
  142. package/dist/{renderer-IAffbHXx.mjs → renderer-BGchUBW_.mjs} +4 -4
  143. package/dist/{renderer-IAffbHXx.mjs.map → renderer-BGchUBW_.mjs.map} +1 -1
  144. package/dist/{renderer-CZClDMgF.mjs → renderer-BIKkxw_Z.mjs} +5 -5
  145. package/dist/{renderer-CZClDMgF.mjs.map → renderer-BIKkxw_Z.mjs.map} +1 -1
  146. package/dist/{renderer-BvRM3OZ6.mjs → renderer-BM19iK8v.mjs} +3 -3
  147. package/dist/{renderer-BvRM3OZ6.mjs.map → renderer-BM19iK8v.mjs.map} +1 -1
  148. package/dist/{renderer-CtpEzVBn.mjs → renderer-BOlHW3Mi.mjs} +3 -3
  149. package/dist/{renderer-CtpEzVBn.mjs.map → renderer-BOlHW3Mi.mjs.map} +1 -1
  150. package/dist/renderer-BPGIKGgl.mjs +5 -0
  151. package/dist/{renderer-4uZGSmUD.mjs → renderer-BTwuM9u-.mjs} +5 -5
  152. package/dist/{renderer-4uZGSmUD.mjs.map → renderer-BTwuM9u-.mjs.map} +1 -1
  153. package/dist/{renderer-DO_zXwMJ.mjs → renderer-BZMh2io2.mjs} +5 -5
  154. package/dist/{renderer-DO_zXwMJ.mjs.map → renderer-BZMh2io2.mjs.map} +1 -1
  155. package/dist/{renderer-rKw5_EjG.mjs → renderer-BZX932Lj.mjs} +4 -4
  156. package/dist/{renderer-rKw5_EjG.mjs.map → renderer-BZX932Lj.mjs.map} +1 -1
  157. package/dist/{renderer-5fGj_tqN.mjs → renderer-BhcTYhaP.mjs} +6 -6
  158. package/dist/{renderer-5fGj_tqN.mjs.map → renderer-BhcTYhaP.mjs.map} +1 -1
  159. package/dist/{renderer-DL3o_lG1.mjs → renderer-BmyFfvVA.mjs} +5 -5
  160. package/dist/{renderer-DL3o_lG1.mjs.map → renderer-BmyFfvVA.mjs.map} +1 -1
  161. package/dist/{renderer-DX60Kr20.mjs → renderer-BrEeUw7T.mjs} +3 -3
  162. package/dist/{renderer-DX60Kr20.mjs.map → renderer-BrEeUw7T.mjs.map} +1 -1
  163. package/dist/{renderer-Bf7Z7WT5.mjs → renderer-BsrKj6Td.mjs} +4 -4
  164. package/dist/{renderer-Bf7Z7WT5.mjs.map → renderer-BsrKj6Td.mjs.map} +1 -1
  165. package/dist/{renderer-BOg8i8eF.mjs → renderer-BuvKGwk3.mjs} +1 -1
  166. package/dist/{renderer-BOg8i8eF.mjs.map → renderer-BuvKGwk3.mjs.map} +1 -1
  167. package/dist/renderer-Bv-Artj1.mjs +5 -0
  168. package/dist/{renderer-_KIBvES8.mjs → renderer-BvBqTAtk.mjs} +5 -5
  169. package/dist/{renderer-_KIBvES8.mjs.map → renderer-BvBqTAtk.mjs.map} +1 -1
  170. package/dist/renderer-BvLjbhcL.mjs +5 -0
  171. package/dist/{renderer-BC_Nse6h.mjs → renderer-Bw-_GZVw.mjs} +4 -4
  172. package/dist/{renderer-BC_Nse6h.mjs.map → renderer-Bw-_GZVw.mjs.map} +1 -1
  173. package/dist/{renderer-CLTRTtQ8.mjs → renderer-Bw0O--gW.mjs} +5 -5
  174. package/dist/{renderer-CLTRTtQ8.mjs.map → renderer-Bw0O--gW.mjs.map} +1 -1
  175. package/dist/renderer-By6awWaf.mjs +5 -0
  176. package/dist/{renderer-DsPLMzy1.mjs → renderer-C-3qhk5x.mjs} +2 -2
  177. package/dist/{renderer-DsPLMzy1.mjs.map → renderer-C-3qhk5x.mjs.map} +1 -1
  178. package/dist/renderer-C0rvsz7m.mjs +5 -0
  179. package/dist/{renderer-DP9ScNM6.mjs → renderer-C4hd6Cqi.mjs} +3 -3
  180. package/dist/{renderer-DP9ScNM6.mjs.map → renderer-C4hd6Cqi.mjs.map} +1 -1
  181. package/dist/{renderer-B09I95bo.mjs → renderer-C64_B8It.mjs} +3 -3
  182. package/dist/{renderer-DrL3J9ci.mjs → renderer-C98XwEIr.mjs} +4 -4
  183. package/dist/{renderer-DrL3J9ci.mjs.map → renderer-C98XwEIr.mjs.map} +1 -1
  184. package/dist/{renderer-6g1ri445.mjs → renderer-CC22Djgi.mjs} +5 -5
  185. package/dist/{renderer-6g1ri445.mjs.map → renderer-CC22Djgi.mjs.map} +1 -1
  186. package/dist/renderer-CDgud_HB.mjs +5 -0
  187. package/dist/renderer-CDiRF3bG.mjs +6 -0
  188. package/dist/{renderer-FvvywNvv.mjs → renderer-CHCRcCKw.mjs} +3 -3
  189. package/dist/{renderer-FvvywNvv.mjs.map → renderer-CHCRcCKw.mjs.map} +1 -1
  190. package/dist/renderer-CIIEQd4B.mjs +5 -0
  191. package/dist/renderer-CJblwOA9.mjs +5 -0
  192. package/dist/renderer-CNMOXtXE.mjs +5 -0
  193. package/dist/{renderer-D3YbHjRG.mjs → renderer-CO4NGvAh.mjs} +95 -80
  194. package/dist/renderer-CO4NGvAh.mjs.map +1 -0
  195. package/dist/{renderer-ByFPmHBC.mjs → renderer-CO9vE3sd.mjs} +4 -4
  196. package/dist/{renderer-ByFPmHBC.mjs.map → renderer-CO9vE3sd.mjs.map} +1 -1
  197. package/dist/renderer-COeSeNGg.mjs +5 -0
  198. package/dist/{renderer-CN-mCIoI.mjs → renderer-CQ4h8n7p.mjs} +5 -5
  199. package/dist/{renderer-CN-mCIoI.mjs.map → renderer-CQ4h8n7p.mjs.map} +1 -1
  200. package/dist/{renderer-DEoerd-j.mjs → renderer-CRhEGqW4.mjs} +4 -4
  201. package/dist/{renderer-DEoerd-j.mjs.map → renderer-CRhEGqW4.mjs.map} +1 -1
  202. package/dist/{renderer-CiHVnhUk.mjs → renderer-CSu_vYPn.mjs} +5 -5
  203. package/dist/{renderer-CiHVnhUk.mjs.map → renderer-CSu_vYPn.mjs.map} +1 -1
  204. package/dist/{renderer-BJEexai1.mjs → renderer-CU6WT5jW.mjs} +5 -5
  205. package/dist/{renderer-BJEexai1.mjs.map → renderer-CU6WT5jW.mjs.map} +1 -1
  206. package/dist/renderer-CUfElmtZ.mjs +5 -0
  207. package/dist/{renderer-BwJ0nXXu.mjs → renderer-CXrnzihz.mjs} +5 -5
  208. package/dist/{renderer-BwJ0nXXu.mjs.map → renderer-CXrnzihz.mjs.map} +1 -1
  209. package/dist/renderer-CYh2lFoJ.mjs +5 -0
  210. package/dist/renderer-CYtVZYMH.mjs +5 -0
  211. package/dist/{renderer-BwV-o_1b.mjs → renderer-CdXBRdFf.mjs} +4 -4
  212. package/dist/{renderer-BwV-o_1b.mjs.map → renderer-CdXBRdFf.mjs.map} +1 -1
  213. package/dist/{renderer-DrK6pyfz.mjs → renderer-Cfx_FCSf.mjs} +5 -5
  214. package/dist/{renderer-DrK6pyfz.mjs.map → renderer-Cfx_FCSf.mjs.map} +1 -1
  215. package/dist/renderer-CjxZlkjb.mjs +5 -0
  216. package/dist/{renderer-CInMMs5x.mjs → renderer-CkTehyRX.mjs} +6 -6
  217. package/dist/{renderer-CInMMs5x.mjs.map → renderer-CkTehyRX.mjs.map} +1 -1
  218. package/dist/{renderer-DGXqspB9.mjs → renderer-CldjJmRR.mjs} +3 -3
  219. package/dist/{renderer-HhJPFidU.mjs → renderer-CoC64eam.mjs} +5 -5
  220. package/dist/{renderer-HhJPFidU.mjs.map → renderer-CoC64eam.mjs.map} +1 -1
  221. package/dist/renderer-Cpd6TvTC.mjs +5 -0
  222. package/dist/{renderer-DLaUT6JZ.mjs → renderer-Cv9CKKWG.mjs} +4 -4
  223. package/dist/{renderer-DLaUT6JZ.mjs.map → renderer-Cv9CKKWG.mjs.map} +1 -1
  224. package/dist/renderer-CzgcZXKH.mjs +3 -0
  225. package/dist/{renderer-DCMoBppL.mjs → renderer-D-GWBoVT.mjs} +3 -3
  226. package/dist/{renderer-DCMoBppL.mjs.map → renderer-D-GWBoVT.mjs.map} +1 -1
  227. package/dist/{renderer-C3CGYjrC.mjs → renderer-D-mX1EVA.mjs} +5 -5
  228. package/dist/{renderer-C3CGYjrC.mjs.map → renderer-D-mX1EVA.mjs.map} +1 -1
  229. package/dist/{renderer-C2kFIZ4r.mjs → renderer-D0h1hTOo.mjs} +4 -4
  230. package/dist/{renderer-C2kFIZ4r.mjs.map → renderer-D0h1hTOo.mjs.map} +1 -1
  231. package/dist/{renderer-C_gR2H3R.mjs → renderer-D0xM67cK.mjs} +3 -3
  232. package/dist/{renderer-C_gR2H3R.mjs.map → renderer-D0xM67cK.mjs.map} +1 -1
  233. package/dist/renderer-D3ziOPhX.mjs +5 -0
  234. package/dist/renderer-D5yp74NL.mjs +3 -0
  235. package/dist/{renderer-BTd6tFcS.mjs → renderer-DCrKEVjb.mjs} +5 -5
  236. package/dist/{renderer-BTd6tFcS.mjs.map → renderer-DCrKEVjb.mjs.map} +1 -1
  237. package/dist/{renderer-Dak_wVh9.mjs → renderer-DGOMfyh8.mjs} +2 -2
  238. package/dist/{renderer-Dak_wVh9.mjs.map → renderer-DGOMfyh8.mjs.map} +1 -1
  239. package/dist/renderer-DKJOon6y.d.mts +1 -0
  240. package/dist/renderer-DL-phtL5.mjs +5 -0
  241. package/dist/{renderer-uA0UCxjA.mjs → renderer-DNynPM6X.mjs} +4 -4
  242. package/dist/{renderer-uA0UCxjA.mjs.map → renderer-DNynPM6X.mjs.map} +1 -1
  243. package/dist/renderer-DSnmYnHg.mjs +5 -0
  244. package/dist/renderer-DUGfsT-E.mjs +5 -0
  245. package/dist/renderer-DW5af9x1.mjs +5 -0
  246. package/dist/{renderer-CMCmljb0.mjs → renderer-DWYmJSrl.mjs} +3 -3
  247. package/dist/{renderer-CMCmljb0.mjs.map → renderer-DWYmJSrl.mjs.map} +1 -1
  248. package/dist/renderer-DYMrol1t.mjs +5 -0
  249. package/dist/{renderer-CGpi8CDT.mjs → renderer-DYeNNc_G.mjs} +4 -4
  250. package/dist/{renderer-CGpi8CDT.mjs.map → renderer-DYeNNc_G.mjs.map} +1 -1
  251. package/dist/{renderer-DKFaVaRJ.mjs → renderer-DYlx7VHo.mjs} +4 -4
  252. package/dist/{renderer-DKFaVaRJ.mjs.map → renderer-DYlx7VHo.mjs.map} +1 -1
  253. package/dist/{renderer-DZIxduEt.mjs → renderer-D_m6Qbsi.mjs} +3 -3
  254. package/dist/{renderer-DZIxduEt.mjs.map → renderer-D_m6Qbsi.mjs.map} +1 -1
  255. package/dist/renderer-DekeUHaz.mjs +5 -0
  256. package/dist/{renderer-snjhPaP-.mjs → renderer-DhGZ41hQ.mjs} +4 -4
  257. package/dist/{renderer-snjhPaP-.mjs.map → renderer-DhGZ41hQ.mjs.map} +1 -1
  258. package/dist/{renderer-BXGuCnCJ.mjs → renderer-DiZkZ0Pr.mjs} +4 -4
  259. package/dist/{renderer-BXGuCnCJ.mjs.map → renderer-DiZkZ0Pr.mjs.map} +1 -1
  260. package/dist/{renderer-BBjkX0Vt.mjs → renderer-Dm57W73p.mjs} +3 -3
  261. package/dist/renderer-Dt5uyJdZ.mjs +5 -0
  262. package/dist/{renderer-DwH5e3hx.mjs → renderer-DtFZbE1j.mjs} +3 -3
  263. package/dist/{renderer-Bxiiar50.mjs → renderer-DvHi_wXE.mjs} +4 -4
  264. package/dist/{renderer-Bxiiar50.mjs.map → renderer-DvHi_wXE.mjs.map} +1 -1
  265. package/dist/{renderer-DaLy1dFA.mjs → renderer-Dv_iRIyx.mjs} +21 -21
  266. package/dist/renderer-Dv_iRIyx.mjs.map +1 -0
  267. package/dist/renderer-DwLQAnaK.mjs +5 -0
  268. package/dist/{renderer-qVJdxbXB.mjs → renderer-DzON3wDZ.mjs} +4 -4
  269. package/dist/{renderer-qVJdxbXB.mjs.map → renderer-DzON3wDZ.mjs.map} +1 -1
  270. package/dist/{renderer-Dj54y3h3.mjs → renderer-GIlQ9lZq.mjs} +3 -3
  271. package/dist/{renderer-Dj54y3h3.mjs.map → renderer-GIlQ9lZq.mjs.map} +1 -1
  272. package/dist/{renderer-b0H3oDae.mjs → renderer-HKv5cBdp.mjs} +3 -3
  273. package/dist/{renderer-b0H3oDae.mjs.map → renderer-HKv5cBdp.mjs.map} +1 -1
  274. package/dist/renderer-IXQP2CWM.mjs +5 -0
  275. package/dist/renderer-K-Pkw63O.mjs +5 -0
  276. package/dist/renderer-MPw2KH9P.mjs +5 -0
  277. package/dist/{renderer-t1sXDiqm.mjs → renderer-QbSrnPZU.mjs} +3 -3
  278. package/dist/{renderer-t1sXDiqm.mjs.map → renderer-QbSrnPZU.mjs.map} +1 -1
  279. package/dist/renderer-RPu8RMav.mjs +5 -0
  280. package/dist/{renderer-Dp9FQKVP.mjs → renderer-TfeohPxt.mjs} +5 -5
  281. package/dist/{renderer-Dp9FQKVP.mjs.map → renderer-TfeohPxt.mjs.map} +1 -1
  282. package/dist/{renderer-BzTj_CeK.mjs → renderer-Y1kjtOto.mjs} +4 -4
  283. package/dist/{renderer-BzTj_CeK.mjs.map → renderer-Y1kjtOto.mjs.map} +1 -1
  284. package/dist/{renderer-LrAldCWN.mjs → renderer-YONlI6W-.mjs} +5 -5
  285. package/dist/{renderer-LrAldCWN.mjs.map → renderer-YONlI6W-.mjs.map} +1 -1
  286. package/dist/{renderer-tRi3KNoG.mjs → renderer-_J9JcCMR.mjs} +5 -5
  287. package/dist/{renderer-tRi3KNoG.mjs.map → renderer-_J9JcCMR.mjs.map} +1 -1
  288. package/dist/renderer-dCqxd5N2.mjs +5 -0
  289. package/dist/{renderer-CcmxR6Fy.d.mts → renderer-fG8Jy8Rx.d.mts} +2 -2
  290. package/dist/{renderer-CcmxR6Fy.d.mts.map → renderer-fG8Jy8Rx.d.mts.map} +1 -1
  291. package/dist/renderer-lhjmE-Fp.mjs +5 -0
  292. package/dist/{renderer-TiaHrU5z.mjs → renderer-mDBoz0zT.mjs} +5 -5
  293. package/dist/{renderer-TiaHrU5z.mjs.map → renderer-mDBoz0zT.mjs.map} +1 -1
  294. package/dist/{renderer-smP1F57W.mjs → renderer-pn52dzZz.mjs} +4 -4
  295. package/dist/{renderer-smP1F57W.mjs.map → renderer-pn52dzZz.mjs.map} +1 -1
  296. package/dist/renderer-u9cmBuvM.mjs +5 -0
  297. package/dist/{renderer-CNpq7rL-.mjs → renderer-uER8kn7f.mjs} +3 -3
  298. package/dist/{renderer-CNpq7rL-.mjs.map → renderer-uER8kn7f.mjs.map} +1 -1
  299. package/dist/{renderer-sMFJtt_H.mjs → renderer-uzU6dsdR.mjs} +3 -3
  300. package/dist/{renderer-sMFJtt_H.mjs.map → renderer-uzU6dsdR.mjs.map} +1 -1
  301. package/dist/renderer-vH12jcpz.mjs +5 -0
  302. package/dist/{renderer-oBgCEqaM.mjs → renderer-yNWYqvvq.mjs} +4 -4
  303. package/dist/{renderer-oBgCEqaM.mjs.map → renderer-yNWYqvvq.mjs.map} +1 -1
  304. package/dist/{renderer-Dy1xQOTu.mjs → renderer-zLi2qFGT.mjs} +4 -4
  305. package/dist/{renderer-Dy1xQOTu.mjs.map → renderer-zLi2qFGT.mjs.map} +1 -1
  306. package/dist/{renderers-CP8CFWDs-DWRjjeUg.mjs → renderers-CP8CFWDs-BufiCyn7.mjs} +4 -4
  307. package/dist/{renderers-CP8CFWDs-DWRjjeUg.mjs.map → renderers-CP8CFWDs-BufiCyn7.mjs.map} +1 -1
  308. package/dist/sam/index.d.mts +3 -3
  309. package/dist/sam/index.mjs +1 -1
  310. package/dist/signals/index.d.mts +7 -7
  311. package/dist/signals/index.mjs +8 -8
  312. package/dist/{signals-BfJ1aqpT.mjs → signals-tiho_9fp.mjs} +4 -4
  313. package/dist/{signals-BfJ1aqpT.mjs.map → signals-tiho_9fp.mjs.map} +1 -1
  314. package/dist/{src-BU6vm9sP-DFJ3phW0.mjs → src-BU6vm9sP-DdTHmCr4.mjs} +3 -3
  315. package/dist/{src-BU6vm9sP-DFJ3phW0.mjs.map → src-BU6vm9sP-DdTHmCr4.mjs.map} +1 -1
  316. package/dist/{src-D7M8VTzv.mjs → src-DrP7fGJX.mjs} +41 -16
  317. package/dist/{src-D7M8VTzv.mjs.map → src-DrP7fGJX.mjs.map} +1 -1
  318. package/dist/storage/index.d.mts +206 -0
  319. package/dist/storage/index.d.mts.map +1 -0
  320. package/dist/storage/index.mjs +3 -0
  321. package/package.json +67 -59
  322. package/dist/audio-afTBdB3U.d.mts.map +0 -1
  323. package/dist/cloud-COid1Ipa.mjs.map +0 -1
  324. package/dist/dist-B-OPY7Cs.mjs.map +0 -1
  325. package/dist/dist-BSqeChht.mjs.map +0 -1
  326. package/dist/index-BNClElng.d.mts.map +0 -1
  327. package/dist/index-CTv9ZieD.d.mts.map +0 -1
  328. package/dist/index-CdCrae-I.d.mts.map +0 -1
  329. package/dist/index-Fliv2Z-w.d.mts.map +0 -1
  330. package/dist/index-gOVtTm-P.d.mts.map +0 -1
  331. package/dist/preview-BUtt481A.mjs.map +0 -1
  332. package/dist/preview-engine/chunk-5SLBE2FX.mjs +0 -1
  333. package/dist/preview-engine/chunk-74J4DJQA.mjs +0 -1
  334. package/dist/preview-engine/chunk-KIPXBOYG.mjs +0 -1974
  335. package/dist/preview-engine/chunk-P4Y3PMJF.mjs +0 -1
  336. package/dist/preview-engine/chunk-SE2C623Z.mjs +0 -5
  337. package/dist/preview-engine/chunk-UKZVUYB6.mjs +0 -483
  338. package/dist/preview-engine/renderers-PSBTV2DO.mjs +0 -228
  339. package/dist/preview-engine/renderers-TEKHQHCL.mjs +0 -1
  340. package/dist/preview-engine/renderers-U3RLYFCN.mjs +0 -1
  341. package/dist/preview-engine/renderers-V5HM6PZ2.mjs +0 -1
  342. package/dist/preview-engine/renderers-ZGX3A3QZ.mjs +0 -1
  343. package/dist/program-Cvv_nb9T.mjs.map +0 -1
  344. package/dist/renderer--RJepuOy.mjs +0 -5
  345. package/dist/renderer-B1U6YRRV.d.mts +0 -117
  346. package/dist/renderer-B1U6YRRV.d.mts.map +0 -1
  347. package/dist/renderer-B4NFnaty.mjs +0 -5
  348. package/dist/renderer-B6g4ts0e.mjs +0 -5
  349. package/dist/renderer-BGoAr-tl.mjs +0 -5
  350. package/dist/renderer-BSOdBgdE.mjs +0 -5
  351. package/dist/renderer-BU6O0fpM.mjs +0 -5
  352. package/dist/renderer-BZ97iidG.mjs +0 -5
  353. package/dist/renderer-B_Klh1VT.mjs +0 -5
  354. package/dist/renderer-BaWQM1y-.mjs +0 -5
  355. package/dist/renderer-Bc0jvAj0.mjs +0 -5
  356. package/dist/renderer-Bd-NuU3M.mjs +0 -3
  357. package/dist/renderer-Bm077kZ6.mjs +0 -5
  358. package/dist/renderer-BtzE_e_Y.mjs +0 -5
  359. package/dist/renderer-C225eCAo.mjs +0 -5
  360. package/dist/renderer-CC4fhNup.mjs +0 -3
  361. package/dist/renderer-CLXdR4vz.mjs +0 -5
  362. package/dist/renderer-CszM8B3C.mjs +0 -5
  363. package/dist/renderer-Ctp8ZYfk.mjs +0 -5
  364. package/dist/renderer-CxQdSp8I.mjs +0 -5
  365. package/dist/renderer-D3YbHjRG.mjs.map +0 -1
  366. package/dist/renderer-D4GMRtDd.mjs +0 -6
  367. package/dist/renderer-DEsGIvTZ.mjs +0 -5
  368. package/dist/renderer-DIaUQ0EP.mjs +0 -5
  369. package/dist/renderer-DLjqcNzQ.mjs +0 -5
  370. package/dist/renderer-DMuQZa51.mjs +0 -5
  371. package/dist/renderer-DOgi2aF2.mjs +0 -5
  372. package/dist/renderer-DSh7cvi4.mjs +0 -5
  373. package/dist/renderer-DV1LVBBP.mjs +0 -5
  374. package/dist/renderer-DaLy1dFA.mjs.map +0 -1
  375. package/dist/renderer-Dhrj2bJz.mjs +0 -5
  376. package/dist/renderer-DoFUu1R4.mjs +0 -5
  377. package/dist/renderer-DsydX3cx.mjs +0 -5
  378. package/dist/renderer-DxVSoeYi.mjs +0 -5
  379. package/dist/renderer-Nc9bHb0n.mjs +0 -5
  380. package/dist/renderer-TFaSD2Db.mjs +0 -5
  381. package/dist/renderer-Z61ctppe.mjs +0 -5
  382. package/dist/renderer-awXf3sNS.mjs +0 -5
  383. package/dist/renderer-cHT28oYI.mjs +0 -5
  384. package/dist/renderer-g7Y3bFot.mjs +0 -5
  385. package/dist/renderer-qVv0OzVc.mjs +0 -5
  386. /package/dist/{chunk-W71TSjRM.mjs → chunk-DOL2i2sR.mjs} +0 -0
  387. /package/dist/{renderer-B6rZUBwE.mjs → renderer-Co2YqWX0.mjs} +0 -0
@@ -1,6 +1,6 @@
1
- import { Bt as getMediaType, It as getActiveMediaMetadata, Rn as updateClockSignals, Xt as isSignal, bn as resolveMediaMimeType, en as mediaSourceIsHold, p as DEFAULT_DURATION_MS, rn as mediaSourceTime, tn as mediaSourceRange } from "./dist-Bf2_efYP.mjs";
2
- import { f as webgpuRegistry, t as audioRegistry } from "./renderer-BOg8i8eF.mjs";
3
- import { A as emojiGraphemes, Bn as signalRegistry, C as drawGifNode, D as drawSignalNode, E as drawParagraphNode, I as getRegisteredFontSource, O as drawSvgNode, P as getHeadlessFontPath, S as drawCaptionNode, T as drawLottieNode, dt as resolveMediaSourceUrl, et as registerHeadlessFont, it as shaderStore, k as drawVideoNode, m as SlugGeometry, p as SlugFontCache, ut as GetFontAssetUrl, w as drawImageNode, z as inputStore } from "./dist-B-OPY7Cs.mjs";
1
+ import { Bt as getMediaType, It as getActiveMediaMetadata, Rn as updateClockSignals, Xt as isSignal, bn as resolveMediaMimeType, en as mediaSourceIsHold, p as DEFAULT_DURATION_MS, rn as mediaSourceTime, tn as mediaSourceRange } from "./dist-C8XSqfTx.mjs";
2
+ import { f as webgpuRegistry, t as audioRegistry } from "./renderer-BuvKGwk3.mjs";
3
+ import { A as emojiGraphemes, C as drawGifNode, D as drawSignalNode, E as drawParagraphNode, Hn as signalRegistry, I as getRegisteredFontSource, O as drawSvgNode, P as getHeadlessFontPath, S as drawCaptionNode, T as drawLottieNode, ft as GetFontAssetUrl, g as WebGPUAudioProcessor, k as drawVideoNode, m as SlugGeometry, nt as resolveInputUrl, ot as shaderStore, p as SlugFontCache, pt as resolveMediaSourceUrl, tt as registerHeadlessFont, w as drawImageNode, z as inputStore } from "./dist-DtPPPsZV.mjs";
4
4
  import { AudioSampleSink } from "mediabunny";
5
5
 
6
6
  //#region ../renderers/dist/index.mjs
@@ -1082,42 +1082,54 @@ async function decodeAudioSource(url) {
1082
1082
  */
1083
1083
  const DECODE_PREROLL_SEC = .5;
1084
1084
  /**
1085
+ * A source this runtime can't decode at all (a codec WebCodecs lacks, in a
1086
+ * worker without AudioContext). Thrown, not mixed as silence, so the caller
1087
+ * can mix where it can be decoded.
1088
+ */
1089
+ var AudioDecodeUnavailable = class extends Error {
1090
+ name = "AudioDecodeUnavailable";
1091
+ };
1092
+ /**
1093
+ * The browser's whole-file decoder, for codecs WebCodecs can't decode
1094
+ * (mediabunny reads byte ranges and decodes with WebCodecs first).
1095
+ */
1096
+ async function decodeWithAudioContext(url) {
1097
+ const AudioContextClass = window.AudioContext || window.webkitAudioContext;
1098
+ if (!AudioContextClass) throw new AudioDecodeUnavailable(`No decoder here for ${url}: WebCodecs can't decode it and there is no AudioContext (a worker).`);
1099
+ const audioCtx = new AudioContextClass();
1100
+ try {
1101
+ const response = await fetch(resolveInputUrl(url, false));
1102
+ mediaLogger.debug(`[AudioExtractor] Fetch response status for ${url}: ${response.status} (${response.statusText})`);
1103
+ if (!response.ok) throw new Error(`Failed to fetch audio source: ${response.statusText}`);
1104
+ const arrayBuffer = await response.arrayBuffer();
1105
+ mediaLogger.debug(`[AudioExtractor] Fetched ${arrayBuffer.byteLength} bytes. Decoding audio data...`);
1106
+ const audioBuffer = await audioCtx.decodeAudioData(arrayBuffer);
1107
+ mediaLogger.debug(`[AudioExtractor] Decoded successfully: ${audioBuffer.numberOfChannels} channels, sampleRate: ${audioBuffer.sampleRate}, duration: ${audioBuffer.duration}s`);
1108
+ const channels = [];
1109
+ for (let c = 0; c < audioBuffer.numberOfChannels; c++) channels.push(new Float32Array(audioBuffer.getChannelData(c)));
1110
+ return {
1111
+ channels,
1112
+ sampleRate: audioBuffer.sampleRate,
1113
+ startIndex: 0,
1114
+ validFromSec: 0,
1115
+ validToSec: Number.POSITIVE_INFINITY
1116
+ };
1117
+ } finally {
1118
+ audioCtx.close();
1119
+ mediaLogger.debug(`[AudioExtractor] AudioContext closed for ${url}`);
1120
+ }
1121
+ }
1122
+ /**
1085
1123
  * Decodes [range.startSec, range.endSec) of a source (the whole file without
1086
1124
  * a range), so a short clip from a long file decodes only what it plays.
1087
1125
  */
1088
1126
  async function decodeAudioRange(url, range) {
1089
1127
  mediaLogger.debug(`[AudioExtractor] decodeAudioSource started for url: ${url}`);
1090
1128
  try {
1091
- if (typeof window !== "undefined" && typeof window.document !== "undefined" && !(typeof process !== "undefined" && process.versions && process.versions.node)) {
1092
- mediaLogger.debug(`[AudioExtractor] Browser detected. Fetching arrayBuffer for ${url}...`);
1093
- const AudioContextClass = window.AudioContext || window.webkitAudioContext;
1094
- if (!AudioContextClass) throw new Error("AudioContext is not supported in this browser");
1095
- const audioCtx = new AudioContextClass();
1096
- try {
1097
- const response = await fetch(url);
1098
- mediaLogger.debug(`[AudioExtractor] Fetch response status for ${url}: ${response.status} (${response.statusText})`);
1099
- if (!response.ok) throw new Error(`Failed to fetch audio source: ${response.statusText}`);
1100
- const arrayBuffer = await response.arrayBuffer();
1101
- mediaLogger.debug(`[AudioExtractor] Fetched ${arrayBuffer.byteLength} bytes. Decoding audio data...`);
1102
- const audioBuffer = await audioCtx.decodeAudioData(arrayBuffer);
1103
- mediaLogger.debug(`[AudioExtractor] Decoded successfully: ${audioBuffer.numberOfChannels} channels, sampleRate: ${audioBuffer.sampleRate}, duration: ${audioBuffer.duration}s`);
1104
- const channels = [];
1105
- for (let c = 0; c < audioBuffer.numberOfChannels; c++) channels.push(new Float32Array(audioBuffer.getChannelData(c)));
1106
- return {
1107
- channels,
1108
- sampleRate: audioBuffer.sampleRate,
1109
- startIndex: 0,
1110
- validFromSec: 0,
1111
- validToSec: Number.POSITIVE_INFINITY
1112
- };
1113
- } finally {
1114
- audioCtx.close();
1115
- mediaLogger.debug(`[AudioExtractor] AudioContext closed for ${url}`);
1116
- }
1117
- }
1129
+ const isBrowser = !(typeof process !== "undefined" && process.versions?.node);
1118
1130
  let inputAcquired = false;
1119
1131
  try {
1120
- mediaLogger.debug(`[AudioExtractor] Server / Node.js detected. Acquiring from inputStore for ${url}...`);
1132
+ mediaLogger.debug(`[AudioExtractor] Acquiring from inputStore for ${url}...`);
1121
1133
  const input = await inputStore.acquire(url);
1122
1134
  inputAcquired = true;
1123
1135
  mediaLogger.debug(`[AudioExtractor] inputStore acquired. Retrieving primary audio track...`);
@@ -1208,6 +1220,7 @@ async function decodeAudioRange(url, range) {
1208
1220
  };
1209
1221
  } catch (err) {
1210
1222
  if (err instanceof Error && err.message.includes("Cannot open local media file")) throw err;
1223
+ if (isBrowser) return decodeWithAudioContext(url);
1211
1224
  if (typeof process !== "undefined" && process.versions?.node) try {
1212
1225
  const { execFileSync } = await import("node:child_process");
1213
1226
  const ffStartIndex = range ? Math.round(Math.max(0, range.startSec) * 48e3) : 0;
@@ -1253,7 +1266,7 @@ async function decodeAudioRange(url, range) {
1253
1266
  if (inputAcquired) inputStore.release(url);
1254
1267
  }
1255
1268
  } catch (err) {
1256
- if (err instanceof Error && err.message.includes("Cannot open local media file")) throw err;
1269
+ if (err instanceof AudioDecodeUnavailable || err instanceof Error && err.message.includes("Cannot open local media file")) throw err;
1257
1270
  mediaLogger.error({ err }, `[AudioExtractor] Failed to decode source ${url}`);
1258
1271
  return null;
1259
1272
  }
@@ -1278,13 +1291,13 @@ async function resampleMappedPCM(input, sourceRate, outputRate, length, inputSta
1278
1291
  * `trimOffsetSamples` is a whole-file index; `inputStartIndex` is the
1279
1292
  * whole-file index of `inputChannel[0]` when it holds only a range.
1280
1293
  */
1281
- async function resampleAndStretchPCM(inputChannel, sourceSampleRate, targetSampleRate, speed, outputLength, trimOffsetSamples, inputStartIndex = 0) {
1294
+ async function resampleAndStretchPCM(inputChannel, sourceSampleRate, targetSampleRate, speed, outputLength, trimOffsetSamples, inputStartIndex = 0, firstOutputSample = 0) {
1282
1295
  const output = new Float32Array(outputLength);
1283
1296
  const factor = sourceSampleRate / targetSampleRate * speed;
1284
1297
  const YIELD_INTERVAL = 1e5;
1285
1298
  for (let i = 0; i < outputLength; i++) {
1286
1299
  if (i > 0 && i % YIELD_INTERVAL === 0) await yieldToMain();
1287
- const srcIndex = trimOffsetSamples + i * factor - inputStartIndex;
1300
+ const srcIndex = trimOffsetSamples + (firstOutputSample + i) * factor - inputStartIndex;
1288
1301
  const indexFloor = Math.floor(srcIndex);
1289
1302
  const indexCeil = Math.ceil(srcIndex);
1290
1303
  if (indexFloor < 0) {
@@ -1304,6 +1317,19 @@ const RANGE_MARGIN_SEC = .05;
1304
1317
  /** Processors that only scale what is already there, so silence stays silence. */
1305
1318
  const GAIN_ONLY_PROCESSORS = new Set(["Compositor", "CompositorLayer"]);
1306
1319
  /** Adds `src` into `dest` starting at `destStart` (which may be negative). */
1320
+ /**
1321
+ * Which of a layer's gain props (`volume`, `muted`) it keys. Those the mix
1322
+ * leaves to the layer's audio processor, which reads them per sample; the
1323
+ * rest are applied as constants. Shared so both sides agree on the split.
1324
+ */
1325
+ function keyedGain(operation) {
1326
+ const tracks = operation?.animation?.tracks ?? [];
1327
+ const keys = (prop) => tracks.some((t) => t.prop === prop && (t.keyframes?.length ?? 0) > 0);
1328
+ return {
1329
+ volume: keys("volume"),
1330
+ muted: keys("muted")
1331
+ };
1332
+ }
1307
1333
  function addInto(dest, src, destStart) {
1308
1334
  const from = Math.max(0, -destStart);
1309
1335
  const to = Math.min(src.length, dest.length - destStart);
@@ -1339,6 +1365,22 @@ var MixBus = class {
1339
1365
  for (let c = 0; c < 2; c++) addInto(dest[c], src[c], start);
1340
1366
  }
1341
1367
  };
1368
+ /**
1369
+ * The master stage, in place: `gain` (the automatic ceiling: a mix whose
1370
+ * summed tracks exceed -0.5 dB, 0.95, is scaled down smoothly), then soft
1371
+ * limiting and non-finite sanitation (transparent saturation instead of
1372
+ * harsh square-wave clipping).
1373
+ */
1374
+ function applyMaster(channels, gain) {
1375
+ for (const channel of channels) for (let i = 0; i < channel.length; i++) {
1376
+ const v = (channel[i] ?? 0) * gain;
1377
+ channel[i] = Number.isFinite(v) ? Math.tanh(v) : 0;
1378
+ }
1379
+ }
1380
+ /** The master stage's gain for a mix whose loudest sample is `peak`. */
1381
+ function masterGain(peak) {
1382
+ return peak > .95 ? .92 / peak : 1;
1383
+ }
1342
1384
  /** A clip's file name for progress, without paths or signed-URL queries. */
1343
1385
  function sourceLabel(url) {
1344
1386
  if (url.startsWith("data:")) return "inline audio";
@@ -1359,10 +1401,19 @@ function decodeURIComponentSafe(s) {
1359
1401
  async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device, renderId, options = {}) {
1360
1402
  mediaLogger.debug(`[AudioExtractor] mixAudioTracks started. FPS: ${fps}, targetSampleRate: ${targetSampleRate}`);
1361
1403
  await waitForDelayRender();
1404
+ if (device && !options.continue) WebGPUAudioProcessor.resetState(renderId ?? "global", device);
1362
1405
  shaderStore.registerSignalsFromComposition(renderId, virtualMedia);
1363
1406
  const durationMs = getActiveMediaMetadata(virtualMedia)?.durationMs || 1e3;
1364
1407
  const totalDurationSec = durationMs / 1e3;
1365
1408
  const totalTargetSamples = Math.ceil(totalDurationSec * targetSampleRate);
1409
+ const winStart = options.window ? Math.max(0, Math.round(options.window.startSec * targetSampleRate)) : 0;
1410
+ const winEnd = options.window ? Math.min(totalTargetSamples, Math.round(options.window.endSec * targetSampleRate)) : Number.POSITIVE_INFINITY;
1411
+ const outputSamples = options.window ? Math.max(0, winEnd - winStart) : totalTargetSamples;
1412
+ /** The part [lo, hi) of a node's local samples that the window covers. */
1413
+ const visible = (absStart, length) => ({
1414
+ lo: Math.max(0, winStart - absStart),
1415
+ hi: Math.min(length, winEnd - absStart)
1416
+ });
1366
1417
  mediaLogger.debug(`[AudioExtractor] Composition total duration: ${durationMs}ms (${totalDurationSec}s). Total mixed samples to allocate: ${totalTargetSamples}`);
1367
1418
  const decodedCache = /* @__PURE__ */ new Map();
1368
1419
  const undecodable = /* @__PURE__ */ new Set();
@@ -1387,11 +1438,11 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1387
1438
  ranges.push(decoded);
1388
1439
  return decoded;
1389
1440
  }
1390
- async function mappedChannels(url, length, map, startFrame) {
1441
+ async function mappedChannels(url, length, map, startFrame, skip = 0) {
1391
1442
  const left = new Float32Array(length), right = new Float32Array(length);
1392
1443
  for (let offset = 0; offset < length;) {
1393
1444
  let count = Math.min(length - offset, targetSampleRate * 2);
1394
- const first = startFrame + offset / targetSampleRate * fps;
1445
+ const first = startFrame + (skip + offset) / targetSampleRate * fps;
1395
1446
  let range = mediaSourceRange(map, first, first + (count - 1) / targetSampleRate * fps, fps);
1396
1447
  while (range.max - range.min > 3 && count > 1) {
1397
1448
  count = Math.max(1, Math.floor(count / 2));
@@ -1421,7 +1472,7 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1421
1472
  audibleCache.set(node, audible);
1422
1473
  return audible;
1423
1474
  }
1424
- async function traverse(node, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, inheritedDurationFrames, inheritedRemap) {
1475
+ async function traverse(node, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, inheritedDurationFrames, inheritedRemap, absStart = 0) {
1425
1476
  if (!node || !isAudible(node)) return null;
1426
1477
  const op = node.operation;
1427
1478
  if (!op) {
@@ -1430,19 +1481,20 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1430
1481
  const actualDurationFrames = inheritedRemap && inheritedDurationFrames !== null ? inheritedDurationFrames : inheritedDurationFrames !== null ? durationFrames > 0 ? Math.min(inheritedDurationFrames, durationFrames) : inheritedDurationFrames : durationFrames;
1431
1482
  const localSamplesCount$1 = Math.ceil(actualDurationFrames / fps * targetSampleRate);
1432
1483
  if (localSamplesCount$1 <= 0) return null;
1433
- const bus$1 = new MixBus(localSamplesCount$1);
1484
+ const { lo: lo$1, hi: hi$1 } = visible(absStart, localSamplesCount$1);
1485
+ if (hi$1 <= lo$1) return null;
1486
+ const bus$1 = new MixBus(hi$1 - lo$1);
1434
1487
  for (const child of node.children) {
1435
- const childChannels = await traverse(child, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, actualDurationFrames, inheritedRemap);
1436
- if (childChannels) {
1437
- const childOp = child.operation;
1438
- const childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;
1439
- const childStartSample = Math.round(childStartFrame / fps * targetSampleRate);
1440
- bus$1.add(childChannels, childStartSample);
1441
- }
1488
+ const childOp = child.operation;
1489
+ const childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;
1490
+ const childStartSample = Math.round(childStartFrame / fps * targetSampleRate);
1491
+ const childChannels = await traverse(child, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, actualDurationFrames, inheritedRemap, absStart + childStartSample);
1492
+ if (childChannels) bus$1.add(childChannels, Math.max(childStartSample, lo$1) - lo$1);
1442
1493
  }
1443
1494
  return bus$1.channels;
1444
1495
  }
1445
- const volume = inheritedVolume * (op.volume ?? 1) * (op.opacity === 0 ? 0 : 1) * (op.muted ? 0 : 1);
1496
+ const keyed = keyedGain(op);
1497
+ const volume = inheritedVolume * (keyed.volume ? 1 : op.volume ?? 1) * (op.opacity === 0 ? 0 : 1) * (!keyed.muted && op.muted ? 0 : 1);
1446
1498
  const speedMultiplier = inheritedSpeed;
1447
1499
  const nodeStartFrame = op.startFrame ?? op.timeline?.startFrame ?? 0;
1448
1500
  const ownRemap = op.timeRemap;
@@ -1462,7 +1514,9 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1462
1514
  const nodeActualDurationFrames = inheritedRemap && !ownRemap && inheritedDurationFrames !== null ? inheritedDurationFrames : inheritedDurationFrames !== null ? nodeDurationFrames > 0 ? Math.min(inheritedDurationFrames, nodeDurationFrames) : inheritedDurationFrames : nodeDurationFrames;
1463
1515
  const localSamplesCount = Math.ceil(nodeActualDurationFrames / fps * targetSampleRate);
1464
1516
  if (localSamplesCount <= 0) return null;
1465
- const bus = new MixBus(localSamplesCount);
1517
+ const { lo, hi } = visible(absStart, localSamplesCount);
1518
+ if (hi <= lo) return null;
1519
+ const bus = new MixBus(hi - lo);
1466
1520
  const processSegment = async (seg, windowStartFrameOffset) => {
1467
1521
  const segSeekSec = seg ? seg.startSec : 0;
1468
1522
  const totalSeekSec = inheritedSeekSec + layerTrimSec + segSeekSec;
@@ -1480,28 +1534,32 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1480
1534
  const effectiveTrimSec = Math.max(0, (Number(params.trimStartSec) || 0) + totalSeekSec);
1481
1535
  const clipDurationSec = actualDurationFrames / fps;
1482
1536
  const clipSamplesCount = Math.min(localSamplesCount - segmentStartSample, Math.ceil(clipDurationSec * targetSampleRate));
1483
- const mapped = remap && clipSamplesCount > 0 ? await mappedChannels(params.sourceUrl, clipSamplesCount, remap.map, remap.offsetFrames + windowStartFrameOffset) : null;
1484
- const decoded = !remap && clipSamplesCount > 0 && segmentStartSample < localSamplesCount ? await getDecodedRange(params.sourceUrl, effectiveTrimSec, effectiveTrimSec + clipSamplesCount / targetSampleRate * finalSpeed + RANGE_MARGIN_SEC) : null;
1537
+ const clipFrom = Math.max(segmentStartSample, lo);
1538
+ const count = Math.min(segmentStartSample + clipSamplesCount, hi) - clipFrom;
1539
+ const skip = clipFrom - segmentStartSample;
1540
+ const writeAt = clipFrom - lo;
1541
+ const mapped = remap && count > 0 ? await mappedChannels(params.sourceUrl, count, remap.map, remap.offsetFrames + windowStartFrameOffset, skip) : null;
1542
+ const decoded = !remap && count > 0 && segmentStartSample < localSamplesCount ? await getDecodedRange(params.sourceUrl, effectiveTrimSec + skip / targetSampleRate * finalSpeed, effectiveTrimSec + (skip + count) / targetSampleRate * finalSpeed + RANGE_MARGIN_SEC) : null;
1485
1543
  if (mapped || decoded) {
1486
1544
  let stretchedLeft;
1487
1545
  let stretchedRight;
1488
1546
  if (mapped) [stretchedLeft, stretchedRight] = mapped;
1489
1547
  else if (decoded) {
1490
1548
  const trimOffsetSamples = Math.round(effectiveTrimSec * decoded.sampleRate);
1491
- stretchedLeft = await resampleAndStretchPCM(decoded.channels[0], decoded.sampleRate, targetSampleRate, finalSpeed, clipSamplesCount, trimOffsetSamples, decoded.startIndex);
1492
- stretchedRight = decoded.channels.length > 1 ? await resampleAndStretchPCM(decoded.channels[1], decoded.sampleRate, targetSampleRate, finalSpeed, clipSamplesCount, trimOffsetSamples, decoded.startIndex) : stretchedLeft;
1549
+ stretchedLeft = await resampleAndStretchPCM(decoded.channels[0], decoded.sampleRate, targetSampleRate, finalSpeed, count, trimOffsetSamples, decoded.startIndex, skip);
1550
+ stretchedRight = decoded.channels.length > 1 ? await resampleAndStretchPCM(decoded.channels[1], decoded.sampleRate, targetSampleRate, finalSpeed, count, trimOffsetSamples, decoded.startIndex, skip) : stretchedLeft;
1493
1551
  } else throw new Error("No decoded audio");
1494
1552
  const stretched = [stretchedLeft, stretchedRight];
1495
- if (bus.canAdopt(stretched, segmentStartSample)) {
1553
+ if (bus.canAdopt(stretched, writeAt)) {
1496
1554
  if (volume !== 1) {
1497
- for (let i = 0; i < clipSamplesCount; i++) stretchedLeft[i] *= volume;
1498
- if (stretchedRight !== stretchedLeft) for (let i = 0; i < clipSamplesCount; i++) stretchedRight[i] *= volume;
1555
+ for (let i = 0; i < count; i++) stretchedLeft[i] *= volume;
1556
+ if (stretchedRight !== stretchedLeft) for (let i = 0; i < count; i++) stretchedRight[i] *= volume;
1499
1557
  }
1500
1558
  bus.channels = [stretchedLeft, stretchedRight === stretchedLeft ? stretchedLeft.slice() : stretchedRight];
1501
1559
  } else {
1502
1560
  const [localLeft, localRight] = bus.get();
1503
- for (let i = 0; i < clipSamplesCount; i++) {
1504
- const outIndex = segmentStartSample + i;
1561
+ for (let i = 0; i < count; i++) {
1562
+ const outIndex = writeAt + i;
1505
1563
  localLeft[outIndex] += stretchedLeft[i] * volume;
1506
1564
  localRight[outIndex] += stretchedRight[i] * volume;
1507
1565
  }
@@ -1519,27 +1577,35 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1519
1577
  }
1520
1578
  }
1521
1579
  if (node.children) for (const child of node.children) {
1522
- const childChannels = await traverse(child, totalSeekSec, totalClockFrames, volume, speedMultiplier, actualDurationFrames, remap);
1523
- if (childChannels) {
1524
- const childOp = child.operation;
1525
- const childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;
1526
- const relativeStartFrame = op.op === "CompositorLayer" && childOp?.op === "CompositorLayer" ? childStartFrame - nodeStartFrame : childStartFrame;
1527
- const childStartSample = Math.round(relativeStartFrame / fps * targetSampleRate);
1528
- bus.add(childChannels, segmentStartSample + childStartSample);
1529
- }
1580
+ const childOp = child.operation;
1581
+ const childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;
1582
+ const relativeStartFrame = op.op === "CompositorLayer" && childOp?.op === "CompositorLayer" ? childStartFrame - nodeStartFrame : childStartFrame;
1583
+ const childStart = segmentStartSample + Math.round(relativeStartFrame / fps * targetSampleRate);
1584
+ const childChannels = await traverse(child, totalSeekSec, totalClockFrames, volume, speedMultiplier, actualDurationFrames, remap, absStart + childStart);
1585
+ if (childChannels) bus.add(childChannels, Math.max(childStart, lo) - lo);
1530
1586
  }
1531
1587
  const pluginProcessor = audioRegistry.get(op.op);
1532
1588
  if (pluginProcessor) try {
1533
1589
  const clipDurationSec = actualDurationFrames / fps;
1534
1590
  const clipSamplesCount = Math.min(localSamplesCount - segmentStartSample, Math.ceil(clipDurationSec * targetSampleRate));
1535
- if (clipSamplesCount > 0 && segmentStartSample < localSamplesCount && segmentStartSample >= 0) await pluginProcessor(bus.get().map((ch) => ch.subarray(segmentStartSample, segmentStartSample + clipSamplesCount)), targetSampleRate, node, {
1536
- device,
1537
- frame: totalClockFrames,
1538
- fps,
1539
- renderId,
1540
- elapsedMs: ((totalClockFrames - (op.op === "CompositorLayer" ? localClockFrames : 0)) / fps + totalSeekSec - layerTrimSec) * 1e3,
1541
- durationMs: getActiveMediaMetadata(node)?.durationMs ?? void 0
1542
- });
1591
+ const from = Math.max(segmentStartSample, lo);
1592
+ const to = Math.min(segmentStartSample + clipSamplesCount, hi);
1593
+ const skip = from - segmentStartSample;
1594
+ if (to > from && segmentStartSample < localSamplesCount && segmentStartSample >= 0) {
1595
+ const slicedChannels = bus.get().map((ch) => ch.subarray(from - lo, to - lo));
1596
+ const layerClockFrames = op.op === "CompositorLayer" ? localClockFrames : 0;
1597
+ const skipSec = skip / targetSampleRate;
1598
+ const elapsedMs = ((totalClockFrames - layerClockFrames) / fps + totalSeekSec - layerTrimSec + skipSec) * 1e3;
1599
+ const durationMs$1 = getActiveMediaMetadata(node)?.durationMs ?? void 0;
1600
+ await pluginProcessor(slicedChannels, targetSampleRate, node, {
1601
+ device,
1602
+ frame: totalClockFrames + skipSec * fps,
1603
+ fps,
1604
+ renderId,
1605
+ elapsedMs,
1606
+ durationMs: durationMs$1
1607
+ });
1608
+ }
1543
1609
  } catch (pluginErr) {
1544
1610
  mediaLogger.error({ err: pluginErr }, `[AudioExtractor] Custom plugin for operation '${op.op}' failed`);
1545
1611
  }
@@ -1575,7 +1641,7 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1575
1641
  });
1576
1642
  }
1577
1643
  const rootChannels = await traverse(normalized, 0, 0, 1, 1, null);
1578
- const mixedChannels = rootChannels?.every((ch) => ch.length === totalTargetSamples) && rootChannels[0] !== rootChannels[1] ? rootChannels : [new Float32Array(totalTargetSamples), new Float32Array(totalTargetSamples)];
1644
+ const mixedChannels = rootChannels?.every((ch) => ch.length === outputSamples) && rootChannels[0] !== rootChannels[1] ? rootChannels : [new Float32Array(outputSamples), new Float32Array(outputSamples)];
1579
1645
  const [outputLeft, outputRight] = mixedChannels;
1580
1646
  if (rootChannels && mixedChannels !== rootChannels) for (let c = 0; c < 2; c++) {
1581
1647
  const dest = mixedChannels[c];
@@ -1585,22 +1651,17 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
1585
1651
  }
1586
1652
  decodedCache.clear();
1587
1653
  let mixPeak = 0;
1588
- for (let i = 0; i < totalTargetSamples; i++) {
1654
+ for (let i = 0; i < outputSamples; i++) {
1589
1655
  const l = Math.abs(outputLeft[i] ?? 0);
1590
1656
  const r = Math.abs(outputRight[i] ?? 0);
1591
1657
  if (l > mixPeak) mixPeak = l;
1592
1658
  if (r > mixPeak) mixPeak = r;
1593
1659
  }
1594
- const autoGain = mixPeak > .95 ? .92 / mixPeak : 1;
1595
- for (let i = 0; i < totalTargetSamples; i++) {
1596
- const l = (outputLeft[i] ?? 0) * autoGain;
1597
- const r = (outputRight[i] ?? 0) * autoGain;
1598
- outputLeft[i] = Number.isFinite(l) ? Math.tanh(l) : 0;
1599
- outputRight[i] = Number.isFinite(r) ? Math.tanh(r) : 0;
1600
- }
1660
+ if (options.master !== false) applyMaster(mixedChannels, masterGain(mixPeak));
1601
1661
  return {
1602
1662
  channels: mixedChannels,
1603
- sampleRate: targetSampleRate
1663
+ sampleRate: targetSampleRate,
1664
+ peak: mixPeak
1604
1665
  };
1605
1666
  }
1606
1667
  /** Resolve the source bound to a compositor layer, including effect wrappers. */
@@ -1647,5 +1708,5 @@ async function preflightMediaTime(root, fps) {
1647
1708
  }
1648
1709
 
1649
1710
  //#endregion
1650
- export { requiresIsolation as _, preflightMediaTime as a, bezier as c, mapBlendModeToSkia as d, measureSpring as f, preloadFont as g, preloadCompositionFonts as h, mixAudioTracks as i, computeStrokeRect as l, measureTextAsync as m, decodeAudioSource as n, resolveLayerDuration as o, measureText as p, drawCompositionTree as r, Easing as s, compositionStateStore as t, interpolate as u, spring as v, springCalculation as y };
1651
- //# sourceMappingURL=dist-BSqeChht.mjs.map
1711
+ export { preloadFont as _, mixAudioTracks as a, springCalculation as b, Easing as c, interpolate as d, mapBlendModeToSkia as f, preloadCompositionFonts as g, measureTextAsync as h, keyedGain as i, bezier as l, measureText as m, decodeAudioSource as n, preflightMediaTime as o, measureSpring as p, drawCompositionTree as r, resolveLayerDuration as s, compositionStateStore as t, computeStrokeRect as u, requiresIsolation as v, spring as y };
1712
+ //# sourceMappingURL=dist-CCrYOkcc.mjs.map