@babylonjs/core 8.8.0 → 8.8.2

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 (409) hide show
  1. package/Actions/actionManager.js +2 -0
  2. package/Actions/actionManager.js.map +1 -1
  3. package/Animations/animatable.core.js +1 -1
  4. package/Animations/animatable.core.js.map +1 -1
  5. package/Animations/animation.js +4 -2
  6. package/Animations/animation.js.map +1 -1
  7. package/Audio/audioEngine.d.ts +1 -1
  8. package/Audio/audioEngine.js +20 -10
  9. package/Audio/audioEngine.js.map +1 -1
  10. package/Audio/audioSceneComponent.js +2 -0
  11. package/Audio/audioSceneComponent.js.map +1 -1
  12. package/Audio/sound.js +2 -0
  13. package/Audio/sound.js.map +1 -1
  14. package/AudioV2/abstractAudio/audioEngineV2.js +8 -1
  15. package/AudioV2/abstractAudio/audioEngineV2.js.map +1 -1
  16. package/AudioV2/abstractAudio/streamingSound.js +3 -1
  17. package/AudioV2/abstractAudio/streamingSound.js.map +1 -1
  18. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js +6 -2
  19. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js.map +1 -1
  20. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js +3 -0
  21. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js.map +1 -1
  22. package/AudioV2/abstractAudio/subProperties/spatialAudio.js +1 -0
  23. package/AudioV2/abstractAudio/subProperties/spatialAudio.js.map +1 -1
  24. package/AudioV2/webAudio/webAudioEngine.js +5 -1
  25. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  26. package/AudioV2/webAudio/webAudioStaticSound.js +2 -0
  27. package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
  28. package/AudioV2/webAudio/webAudioStreamingSound.js +3 -0
  29. package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
  30. package/AudioV2/webAudio/webAudioUnmuteUI.js +1 -0
  31. package/AudioV2/webAudio/webAudioUnmuteUI.js.map +1 -1
  32. package/BakedVertexAnimation/vertexAnimationBaker.d.ts +1 -0
  33. package/BakedVertexAnimation/vertexAnimationBaker.js +3 -1
  34. package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -1
  35. package/Buffers/buffer.nonFloatVertexBuffers.js +1 -0
  36. package/Buffers/buffer.nonFloatVertexBuffers.js.map +1 -1
  37. package/Buffers/storageBuffer.js +1 -1
  38. package/Buffers/storageBuffer.js.map +1 -1
  39. package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js +2 -0
  40. package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js.map +1 -1
  41. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js +6 -1
  42. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js.map +1 -1
  43. package/Cameras/VR/vrExperienceHelper.js +2 -0
  44. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  45. package/Collisions/gpuPicker.js +9 -6
  46. package/Collisions/gpuPicker.js.map +1 -1
  47. package/Compute/computeShader.js +1 -1
  48. package/Compute/computeShader.js.map +1 -1
  49. package/Culling/Helper/boundingInfoHelper.js +3 -3
  50. package/Culling/Helper/boundingInfoHelper.js.map +1 -1
  51. package/Culling/Helper/computeShaderBoundingHelper.js +3 -1
  52. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
  53. package/Culling/Helper/transformFeedbackBoundingHelper.js +3 -0
  54. package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
  55. package/Debug/debugLayer.js +1 -1
  56. package/Debug/debugLayer.js.map +1 -1
  57. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js +1 -0
  58. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js.map +1 -1
  59. package/Engines/Extensions/engine.prefilteredCubeTexture.js +1 -0
  60. package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -1
  61. package/Engines/Extensions/engine.readTexture.js +1 -0
  62. package/Engines/Extensions/engine.readTexture.js.map +1 -1
  63. package/Engines/WebGPU/Extensions/engine.computeShader.js +1 -0
  64. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  65. package/Engines/WebGPU/Extensions/engine.readTexture.js +1 -0
  66. package/Engines/WebGPU/Extensions/engine.readTexture.js.map +1 -1
  67. package/Engines/WebGPU/Extensions/engine.videoTexture.js +2 -0
  68. package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
  69. package/Engines/WebGPU/webgpuBufferManager.js +3 -1
  70. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  71. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -0
  72. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  73. package/Engines/WebGPU/webgpuQuerySet.js +15 -9
  74. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  75. package/Engines/WebGPU/webgpuTextureManager.js +1 -0
  76. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  77. package/Engines/WebGPU/webgpuTimestampQuery.js +4 -2
  78. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  79. package/Engines/WebGPU/webgpuTintWASM.js +1 -0
  80. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  81. package/Engines/abstractEngine.js +5 -2
  82. package/Engines/abstractEngine.js.map +1 -1
  83. package/Engines/constants.d.ts +23 -0
  84. package/Engines/constants.js +23 -0
  85. package/Engines/constants.js.map +1 -1
  86. package/Engines/engine.common.js +7 -1
  87. package/Engines/engine.common.js.map +1 -1
  88. package/Engines/engine.js +5 -3
  89. package/Engines/engine.js.map +1 -1
  90. package/Engines/engineFactory.js +1 -1
  91. package/Engines/engineFactory.js.map +1 -1
  92. package/Engines/nativeEngine.js +19 -11
  93. package/Engines/nativeEngine.js.map +1 -1
  94. package/Engines/thinEngine.d.ts +1 -0
  95. package/Engines/thinEngine.js +22 -18
  96. package/Engines/thinEngine.js.map +1 -1
  97. package/Engines/webgpuEngine.js +30 -11
  98. package/Engines/webgpuEngine.js.map +1 -1
  99. package/FlowGraph/flowGraphParser.js +2 -2
  100. package/FlowGraph/flowGraphParser.js.map +1 -1
  101. package/FrameGraph/Node/nodeRenderGraph.js +5 -1
  102. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  103. package/FrameGraph/Node/nodeRenderGraphBlock.js +1 -1
  104. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  105. package/FrameGraph/frameGraph.js +1 -1
  106. package/FrameGraph/frameGraph.js.map +1 -1
  107. package/Helpers/sceneHelpers.js +1 -3
  108. package/Helpers/sceneHelpers.js.map +1 -1
  109. package/Helpers/videoDome.js +1 -0
  110. package/Helpers/videoDome.js.map +1 -1
  111. package/Layers/thinEffectLayer.js +1 -0
  112. package/Layers/thinEffectLayer.js.map +1 -1
  113. package/LensFlares/lensFlareSystem.js +1 -0
  114. package/LensFlares/lensFlareSystem.js.map +1 -1
  115. package/Lights/Shadows/shadowGenerator.js +3 -2
  116. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  117. package/Lights/areaLight.js +2 -0
  118. package/Lights/areaLight.js.map +1 -1
  119. package/Loading/sceneLoader.js +56 -22
  120. package/Loading/sceneLoader.js.map +1 -1
  121. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +15 -1
  122. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +34 -7
  123. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  124. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js +1 -0
  125. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
  126. package/Materials/Node/Blocks/Dual/fogBlock.js +1 -0
  127. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  128. package/Materials/Node/Blocks/Dual/lightBlock.js +1 -0
  129. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  130. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +1 -0
  131. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +1 -0
  133. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  134. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +1 -0
  135. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  136. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js +1 -0
  137. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js.map +1 -1
  138. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +9 -11
  139. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  140. package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -1
  141. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  142. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +6 -2
  143. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  144. package/Materials/Node/Blocks/Vertex/bonesBlock.js +1 -0
  145. package/Materials/Node/Blocks/Vertex/bonesBlock.js.map +1 -1
  146. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +1 -0
  147. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  148. package/Materials/Node/nodeMaterial.js +11 -3
  149. package/Materials/Node/nodeMaterial.js.map +1 -1
  150. package/Materials/Node/nodeMaterialBuildState.js +1 -0
  151. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  152. package/Materials/PBR/pbrBRDFConfiguration.d.ts +11 -0
  153. package/Materials/PBR/pbrBRDFConfiguration.js +16 -0
  154. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  155. package/Materials/PBR/pbrBaseMaterial.d.ts +4 -0
  156. package/Materials/PBR/pbrBaseMaterial.js +12 -8
  157. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  158. package/Materials/PBR/pbrMaterial.d.ts +8 -0
  159. package/Materials/PBR/pbrMaterial.js +16 -0
  160. package/Materials/PBR/pbrMaterial.js.map +1 -1
  161. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +1 -0
  162. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
  163. package/Materials/Textures/Loaders/basisTextureLoader.js +4 -0
  164. package/Materials/Textures/Loaders/basisTextureLoader.js.map +1 -1
  165. package/Materials/Textures/Loaders/envTextureLoader.js +1 -0
  166. package/Materials/Textures/Loaders/envTextureLoader.js.map +1 -1
  167. package/Materials/Textures/Loaders/exrTextureLoader.js +2 -0
  168. package/Materials/Textures/Loaders/exrTextureLoader.js.map +1 -1
  169. package/Materials/Textures/Loaders/ktxTextureLoader.js +1 -0
  170. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  171. package/Materials/Textures/Loaders/textureLoaderManager.js +9 -9
  172. package/Materials/Textures/Loaders/textureLoaderManager.js.map +1 -1
  173. package/Materials/Textures/Packer/packer.js +3 -1
  174. package/Materials/Textures/Packer/packer.js.map +1 -1
  175. package/Materials/Textures/Procedurals/proceduralTexture.js +1 -0
  176. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  177. package/Materials/Textures/baseTexture.polynomial.js +1 -0
  178. package/Materials/Textures/baseTexture.polynomial.js.map +1 -1
  179. package/Materials/Textures/hdrCubeTexture.js +1 -0
  180. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  181. package/Materials/Textures/internalTexture.js +1 -0
  182. package/Materials/Textures/internalTexture.js.map +1 -1
  183. package/Materials/Textures/rawCubeTexture.js +3 -0
  184. package/Materials/Textures/rawCubeTexture.js.map +1 -1
  185. package/Materials/Textures/renderTargetTexture.js +2 -0
  186. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  187. package/Materials/Textures/videoTexture.js +6 -0
  188. package/Materials/Textures/videoTexture.js.map +1 -1
  189. package/Materials/effect.js +2 -1
  190. package/Materials/effect.js.map +1 -1
  191. package/Materials/effect.webgl.functions.js +3 -1
  192. package/Materials/effect.webgl.functions.js.map +1 -1
  193. package/Materials/effectRenderer.js +1 -0
  194. package/Materials/effectRenderer.js.map +1 -1
  195. package/Materials/material.js +2 -1
  196. package/Materials/material.js.map +1 -1
  197. package/Materials/shaderMaterial.js +4 -2
  198. package/Materials/shaderMaterial.js.map +1 -1
  199. package/Meshes/Compression/dracoCodec.js +5 -1
  200. package/Meshes/Compression/dracoCodec.js.map +1 -1
  201. package/Meshes/Compression/dracoCompression.js +4 -3
  202. package/Meshes/Compression/dracoCompression.js.map +1 -1
  203. package/Meshes/Compression/dracoCompressionWorker.js +5 -2
  204. package/Meshes/Compression/dracoCompressionWorker.js.map +1 -1
  205. package/Meshes/Compression/dracoDecoder.js +5 -1
  206. package/Meshes/Compression/dracoDecoder.js.map +1 -1
  207. package/Meshes/Compression/dracoEncoder.js +3 -2
  208. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  209. package/Meshes/Compression/meshoptCompression.js +18 -18
  210. package/Meshes/Compression/meshoptCompression.js.map +1 -1
  211. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +14 -15
  212. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  213. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js +20 -10
  214. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js.map +1 -1
  215. package/Meshes/Node/Blocks/booleanGeometryBlock.js +1 -0
  216. package/Meshes/Node/Blocks/booleanGeometryBlock.js.map +1 -1
  217. package/Meshes/Node/nodeGeometry.js +5 -1
  218. package/Meshes/Node/nodeGeometry.js.map +1 -1
  219. package/Meshes/mesh.js +2 -2
  220. package/Meshes/mesh.js.map +1 -1
  221. package/Meshes/meshUVSpaceRenderer.js +1 -0
  222. package/Meshes/meshUVSpaceRenderer.js.map +1 -1
  223. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +1 -0
  224. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
  225. package/Misc/assetsManager.js +2 -1
  226. package/Misc/assetsManager.js.map +1 -1
  227. package/Misc/asyncLock.js +5 -2
  228. package/Misc/asyncLock.js.map +1 -1
  229. package/Misc/basis.js +9 -2
  230. package/Misc/basis.js.map +1 -1
  231. package/Misc/basisWorker.js +3 -1
  232. package/Misc/basisWorker.js.map +1 -1
  233. package/Misc/copyTextureToTexture.js +1 -0
  234. package/Misc/copyTextureToTexture.js.map +1 -1
  235. package/Misc/coroutine.js +2 -1
  236. package/Misc/coroutine.js.map +1 -1
  237. package/Misc/dataReader.js +3 -4
  238. package/Misc/dataReader.js.map +1 -1
  239. package/Misc/dumpTools.js +7 -1
  240. package/Misc/dumpTools.js.map +1 -1
  241. package/Misc/environmentTextureTools.d.ts +0 -2
  242. package/Misc/environmentTextureTools.js +20 -7
  243. package/Misc/environmentTextureTools.js.map +1 -1
  244. package/Misc/equirectangularCapture.js +2 -1
  245. package/Misc/equirectangularCapture.js.map +1 -1
  246. package/Misc/fileTools.js +2 -0
  247. package/Misc/fileTools.js.map +1 -1
  248. package/Misc/filesInput.js +5 -1
  249. package/Misc/filesInput.js.map +1 -1
  250. package/Misc/khronosTextureContainer2.js +10 -3
  251. package/Misc/khronosTextureContainer2.js.map +1 -1
  252. package/Misc/khronosTextureContainer2Worker.js +4 -1
  253. package/Misc/khronosTextureContainer2Worker.js.map +1 -1
  254. package/Misc/minMaxReducer.js +1 -0
  255. package/Misc/minMaxReducer.js.map +1 -1
  256. package/Misc/observable.extensions.js +3 -1
  257. package/Misc/observable.extensions.js.map +1 -1
  258. package/Misc/observable.js +2 -0
  259. package/Misc/observable.js.map +1 -1
  260. package/Misc/observableCoroutine.js +1 -0
  261. package/Misc/observableCoroutine.js.map +1 -1
  262. package/Misc/reflector.js +1 -0
  263. package/Misc/reflector.js.map +1 -1
  264. package/Misc/rgbdTextureTools.js +2 -1
  265. package/Misc/rgbdTextureTools.js.map +1 -1
  266. package/Misc/sceneSerializer.js +2 -2
  267. package/Misc/sceneSerializer.js.map +1 -1
  268. package/Misc/screenshotTools.js +9 -4
  269. package/Misc/screenshotTools.js.map +1 -1
  270. package/Misc/textureTools.js +2 -0
  271. package/Misc/textureTools.js.map +1 -1
  272. package/Misc/tools.internals.js +2 -1
  273. package/Misc/tools.internals.js.map +1 -1
  274. package/Misc/tools.js +9 -3
  275. package/Misc/tools.js.map +1 -1
  276. package/Misc/videoRecorder.js +1 -0
  277. package/Misc/videoRecorder.js.map +1 -1
  278. package/Misc/webRequest.fetch.js +2 -1
  279. package/Misc/webRequest.fetch.js.map +1 -1
  280. package/Misc/workerPool.js +3 -0
  281. package/Misc/workerPool.js.map +1 -1
  282. package/Particles/flowMap.js +1 -1
  283. package/Particles/flowMap.js.map +1 -1
  284. package/Particles/particleHelper.js +7 -0
  285. package/Particles/particleHelper.js.map +1 -1
  286. package/Particles/pointsCloudSystem.js +7 -7
  287. package/Particles/pointsCloudSystem.js.map +1 -1
  288. package/Particles/thinParticleSystem.js +2 -0
  289. package/Particles/thinParticleSystem.js.map +1 -1
  290. package/Physics/physicsHelper.js +2 -2
  291. package/Physics/physicsHelper.js.map +1 -1
  292. package/Physics/v1/Plugins/oimoJSPlugin.js +1 -1
  293. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  294. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
  295. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  296. package/Rendering/GlobalIllumination/giRSMManager.js +1 -0
  297. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  298. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +1 -0
  299. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  300. package/Rendering/depthRenderer.js +1 -0
  301. package/Rendering/depthRenderer.js.map +1 -1
  302. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -1
  303. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  304. package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
  305. package/Rendering/geometryBufferRenderer.js +1 -0
  306. package/Rendering/geometryBufferRenderer.js.map +1 -1
  307. package/Rendering/iblCdfGenerator.js +4 -1
  308. package/Rendering/iblCdfGenerator.js.map +1 -1
  309. package/Shaders/ShadersInclude/lightFragment.js +5 -1
  310. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  311. package/Shaders/ShadersInclude/pbrBRDFFunctions.js +12 -5
  312. package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  313. package/Shaders/ShadersInclude/pbrBlockDirectLighting.js +3 -0
  314. package/Shaders/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
  315. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +21 -8
  316. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  317. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js +3 -0
  318. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  319. package/Shaders/ShadersInclude/pbrBlockReflectance.js +6 -6
  320. package/Shaders/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  321. package/Shaders/ShadersInclude/pbrBlockReflectance0.js +2 -7
  322. package/Shaders/ShadersInclude/pbrBlockReflectance0.js.map +1 -1
  323. package/Shaders/ShadersInclude/pbrBlockReflectivity.js +20 -16
  324. package/Shaders/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  325. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +6 -8
  326. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  327. package/Shaders/ShadersInclude/pbrDebug.js +2 -2
  328. package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
  329. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +1 -5
  330. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  331. package/Shaders/pbr.fragment.js +7 -3
  332. package/Shaders/pbr.fragment.js.map +1 -1
  333. package/ShadersWGSL/ShadersInclude/lightFragment.js +5 -1
  334. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  335. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +5 -5
  336. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  337. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js +3 -0
  338. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
  339. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +21 -8
  340. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  341. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js +3 -0
  342. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  343. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +6 -6
  344. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  345. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js +2 -7
  346. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js.map +1 -1
  347. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js +22 -15
  348. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  349. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +6 -8
  350. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  351. package/ShadersWGSL/ShadersInclude/pbrDebug.js +2 -2
  352. package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
  353. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +1 -7
  354. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  355. package/ShadersWGSL/pbr.fragment.js +7 -3
  356. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  357. package/Sprites/spriteManager.js +5 -1
  358. package/Sprites/spriteManager.js.map +1 -1
  359. package/Sprites/spriteRenderer.js +1 -0
  360. package/Sprites/spriteRenderer.js.map +1 -1
  361. package/XR/features/WebXRAnchorSystem.js +4 -3
  362. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  363. package/XR/features/WebXRDepthSensing.js +1 -1
  364. package/XR/features/WebXRDepthSensing.js.map +1 -1
  365. package/XR/features/WebXRHandTracking.js +4 -1
  366. package/XR/features/WebXRHandTracking.js.map +1 -1
  367. package/XR/features/WebXRHitTest.js +4 -1
  368. package/XR/features/WebXRHitTest.js.map +1 -1
  369. package/XR/features/WebXRHitTestLegacy.js +6 -5
  370. package/XR/features/WebXRHitTestLegacy.js.map +1 -1
  371. package/XR/features/WebXRImageTracking.js +2 -1
  372. package/XR/features/WebXRImageTracking.js.map +1 -1
  373. package/XR/features/WebXRLightEstimation.js +3 -0
  374. package/XR/features/WebXRLightEstimation.js.map +1 -1
  375. package/XR/features/WebXRNearInteraction.js +2 -0
  376. package/XR/features/WebXRNearInteraction.js.map +1 -1
  377. package/XR/features/WebXRPlaneDetector.js +2 -2
  378. package/XR/features/WebXRPlaneDetector.js.map +1 -1
  379. package/XR/motionController/webXRAbstractMotionController.js +3 -2
  380. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  381. package/XR/motionController/webXRMicrosoftMixedRealityController.js +6 -6
  382. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  383. package/XR/motionController/webXRMotionControllerManager.js +15 -9
  384. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  385. package/XR/motionController/webXRProfiledMotionController.js +1 -1
  386. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  387. package/XR/native/nativeXRFrame.js +1 -0
  388. package/XR/native/nativeXRFrame.js.map +1 -1
  389. package/XR/webXRDefaultExperience.js +10 -12
  390. package/XR/webXRDefaultExperience.js.map +1 -1
  391. package/XR/webXREnterExitUI.js +2 -1
  392. package/XR/webXREnterExitUI.js.map +1 -1
  393. package/XR/webXRExperienceHelper.js +5 -2
  394. package/XR/webXRExperienceHelper.js.map +1 -1
  395. package/XR/webXRFeaturesManager.js +1 -0
  396. package/XR/webXRFeaturesManager.js.map +1 -1
  397. package/XR/webXRInput.js +1 -0
  398. package/XR/webXRInput.js.map +1 -1
  399. package/XR/webXRInputSource.js +2 -0
  400. package/XR/webXRInputSource.js.map +1 -1
  401. package/XR/webXRManagedOutputCanvas.js +5 -1
  402. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  403. package/XR/webXRSessionManager.js +56 -60
  404. package/XR/webXRSessionManager.js.map +1 -1
  405. package/assetContainer.js +28 -28
  406. package/assetContainer.js.map +1 -1
  407. package/package.json +1 -1
  408. package/scene.js +5 -4
  409. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"audioEngineV2.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/abstractAudio/audioEngineV2.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\nimport type { AbstractAudioNode, AbstractNamedAudioNode } from \"./abstractAudioNode\";\nimport type { AbstractSoundSource, ISoundSourceOptions } from \"./abstractSoundSource\";\nimport type { AudioBus, IAudioBusOptions } from \"./audioBus\";\nimport type { IMainAudioBusOptions, MainAudioBus } from \"./mainAudioBus\";\nimport type { IStaticSoundOptions, StaticSound } from \"./staticSound\";\nimport type { IStaticSoundBufferOptions, StaticSoundBuffer } from \"./staticSoundBuffer\";\nimport type { IStreamingSoundOptions, StreamingSound } from \"./streamingSound\";\nimport type { AbstractSpatialAudioListener, ISpatialAudioListenerOptions } from \"./subProperties/abstractSpatialAudioListener\";\n\nconst Instances: AudioEngineV2[] = [];\n\n/**\n * Gets the most recently created v2 audio engine.\n * @returns The most recently created v2 audio engine.\n */\nexport function LastCreatedAudioEngine(): Nullable<AudioEngineV2> {\n if (Instances.length === 0) {\n return null;\n }\n\n return Instances[Instances.length - 1];\n}\n\n/**\n * Options for creating a v2 audio engine.\n */\nexport interface IAudioEngineV2Options extends ISpatialAudioListenerOptions {\n /**\n * The smoothing duration to use when changing audio parameters, in seconds. Defaults to `0.01` (10 milliseconds).\n */\n parameterRampDuration: number;\n /**\n * The initial output volume of the audio engine. Defaults to `1`.\n */\n volume: number;\n}\n\n/**\n * The state of a v2 audio engine.\n * @see {@link AudioEngineV2.state}\n */\nexport type AudioEngineV2State = \"closed\" | \"interrupted\" | \"running\" | \"suspended\";\n\n/**\n * Abstract base class for v2 audio engines.\n *\n * A v2 audio engine based on the WebAudio API can be created with the {@link CreateAudioEngineAsync} function.\n */\nexport abstract class AudioEngineV2 {\n /** Not owned, but all items should be in `_nodes` container, too, which is owned. */\n private readonly _mainBuses = new Set<MainAudioBus>();\n\n /** Owned top-level sound and bus nodes. */\n private readonly _nodes = new Set<AbstractNamedAudioNode>();\n\n private _defaultMainBus: Nullable<MainAudioBus> = null;\n\n private _parameterRampDuration: number = 0.01;\n\n protected constructor(options: Partial<IAudioEngineV2Options>) {\n Instances.push(this);\n\n if (typeof options.parameterRampDuration === \"number\") {\n this.parameterRampDuration = options.parameterRampDuration;\n }\n }\n\n /**\n * The elapsed time since the audio engine was started, in seconds.\n */\n public abstract readonly currentTime: number;\n\n /**\n * The default main bus that will be used for audio buses and sounds if their `outBus` option is not set.\n * @see {@link IAudioBusOptions.outBus}\n * @see {@link IAbstractSoundOptions.outBus}\n */\n public get defaultMainBus(): Nullable<MainAudioBus> {\n if (this._mainBuses.size === 0) {\n return null;\n }\n\n if (!this._defaultMainBus) {\n this._defaultMainBus = Array.from(this._mainBuses)[0];\n }\n\n return this._defaultMainBus;\n }\n\n /**\n * The spatial audio listener properties for the audio engine.\n * - Each audio engine has exactly one listener.\n */\n public abstract readonly listener: AbstractSpatialAudioListener;\n\n /**\n * The main output node.\n * - This is the last node in the audio graph before the audio is sent to the speakers.\n */\n public abstract readonly mainOut: AbstractAudioNode;\n\n /**\n * The current state of the audio engine.\n *\n * Possible values are:\n * - `\"closed\"`: The audio engine has been closed.\n * - `\"interrupted\"`: The audio engine has been interrupted and is not running.\n * - `\"running\"`: The audio engine is running normally.\n * - `\"suspended\"`: The audio engine is suspended and is not running.\n */\n public abstract readonly state: AudioEngineV2State;\n\n /**\n * The output volume of the audio engine.\n */\n public abstract volume: number;\n\n /**\n * The smoothing duration to use when changing audio parameters, in seconds. Defaults to `0.01` (10 milliseconds).\n */\n public get parameterRampDuration(): number {\n return this._parameterRampDuration;\n }\n\n public set parameterRampDuration(value: number) {\n this._parameterRampDuration = Math.max(0, value);\n }\n\n /**\n * Creates a new audio bus.\n * @param name - The name of the audio bus.\n * @param options - The options to use when creating the audio bus.\n * @param engine - The audio engine.\n * @returns A promise that resolves with the created audio bus.\n */\n public abstract createBusAsync(name: string, options?: Partial<IAudioBusOptions>): Promise<AudioBus>;\n\n /**\n * Creates a new main audio bus.\n * @param name - The name of the main audio bus.\n * @param options - The options to use when creating the main audio bus.\n * @returns A promise that resolves with the created main audio bus.\n */\n public abstract createMainBusAsync(name: string, options?: Partial<IMainAudioBusOptions>): Promise<MainAudioBus>;\n\n /**\n * Creates a new microphone sound source.\n * @param name - The name of the sound.\n * @param options - The options for the sound source.\n * @returns A promise that resolves to the created sound source.\n */\n public abstract createMicrophoneSoundSourceAsync(name: string, options?: Partial<ISoundSourceOptions>): Promise<AbstractSoundSource>;\n\n /**\n * Creates a new static sound.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the static sound.\n * @returns A promise that resolves to the created static sound.\n */\n public abstract createSoundAsync(\n name: string,\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options?: Partial<IStaticSoundOptions>\n ): Promise<StaticSound>;\n\n /**\n * Creates a new static sound buffer.\n * @param source - The source of the sound buffer.\n * @param options - The options for the static sound buffer.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created static sound buffer.\n */\n public abstract createSoundBufferAsync(\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options?: Partial<IStaticSoundBufferOptions>\n ): Promise<StaticSoundBuffer>;\n\n /**\n * Creates a new sound source.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the sound source.\n * @returns A promise that resolves to the created sound source.\n */\n public abstract createSoundSourceAsync(name: string, source: AudioNode, options?: Partial<ISoundSourceOptions>): Promise<AbstractSoundSource>;\n\n /**\n * Creates a new streaming sound.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the streaming sound.\n * @returns A promise that resolves to the created streaming sound.\n */\n public abstract createStreamingSoundAsync(name: string, source: HTMLMediaElement | string | string[], options?: Partial<IStreamingSoundOptions>): Promise<StreamingSound>;\n\n /**\n * Releases associated resources.\n */\n public dispose(): void {\n if (Instances.includes(this)) {\n Instances.splice(Instances.indexOf(this), 1);\n }\n\n const nodeIt = this._nodes.values();\n for (let next = nodeIt.next(); !next.done; next = nodeIt.next()) {\n next.value.dispose();\n }\n\n this._mainBuses.clear();\n this._nodes.clear();\n\n this._defaultMainBus = null;\n }\n\n /**\n * Checks if the specified format is valid.\n * @param format The format to check as an audio file extension like \"mp3\" or \"wav\".\n * @returns `true` if the format is valid; otherwise `false`.\n */\n public abstract isFormatValid(format: string): boolean;\n\n /**\n * Pauses the audio engine if it is running.\n * @returns A promise that resolves when the audio engine is paused.\n */\n public abstract pauseAsync(): Promise<void>;\n\n /**\n * Resumes the audio engine if it is not running.\n * @returns A promise that resolves when the audio engine is running.\n */\n public abstract resumeAsync(): Promise<void>;\n\n /**\n * Unlocks the audio engine if it is locked.\n * - Note that the returned promise may already be resolved if the audio engine is already unlocked.\n * @returns A promise that is resolved when the audio engine is unlocked.\n */\n public unlockAsync(): Promise<void> {\n return this.resumeAsync();\n }\n\n protected _addMainBus(mainBus: MainAudioBus): void {\n this._mainBuses.add(mainBus);\n\n this._addNode(mainBus);\n }\n\n protected _removeMainBus(mainBus: MainAudioBus): void {\n this._mainBuses.delete(mainBus);\n this._defaultMainBus = null;\n\n this._removeNode(mainBus);\n }\n\n protected _addNode(node: AbstractNamedAudioNode): void {\n this._nodes.add(node);\n }\n\n protected _removeNode(node: AbstractNamedAudioNode): void {\n this._nodes.delete(node);\n }\n}\n\n/**\n * @internal\n * @param engine - The given audio engine. If `null` then the last created audio engine is used.\n * @returns the given audio engine or the last created audio engine.\n * @throws An error if the resulting engine is `null`.\n */\nexport function _GetAudioEngine(engine: Nullable<AudioEngineV2>): AudioEngineV2 {\n if (!engine) {\n engine = LastCreatedAudioEngine();\n }\n\n if (engine) {\n return engine;\n }\n\n throw new Error(\"No audio engine.\");\n}\n\n/**\n * Creates a new audio bus.\n * @param name - The name of the audio bus.\n * @param options - The options to use when creating the audio bus.\n * @param engine - The audio engine.\n * @returns A promise that resolves with the created audio bus.\n */\nexport function CreateAudioBusAsync(name: string, options: Partial<IAudioBusOptions> = {}, engine: Nullable<AudioEngineV2> = null): Promise<AudioBus> {\n engine = _GetAudioEngine(engine);\n return engine.createBusAsync(name, options);\n}\n\n/**\n * Creates a new main audio bus.\n * @param name - The name of the main audio bus.\n * @param options - The options to use when creating the main audio bus.\n * @param engine - The audio engine.\n * @returns A promise that resolves with the created main audio bus.\n */\nexport function CreateMainAudioBusAsync(name: string, options: Partial<IMainAudioBusOptions> = {}, engine: Nullable<AudioEngineV2> = null): Promise<MainAudioBus> {\n engine = _GetAudioEngine(engine);\n return engine.createMainBusAsync(name, options);\n}\n\n/**\n * Creates a new microphone sound source.\n * @param name - The name of the sound.\n * @param options - The options for the sound source.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created sound source.\n */\nexport function CreateMicrophoneSoundSourceAsync(name: string, options: Partial<ISoundSourceOptions> = {}, engine: Nullable<AudioEngineV2> = null): Promise<AbstractSoundSource> {\n engine = _GetAudioEngine(engine);\n return engine.createMicrophoneSoundSourceAsync(name, options);\n}\n\n/**\n * Creates a new static sound.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the static sound.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created static sound.\n */\nexport function CreateSoundAsync(\n name: string,\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options: Partial<IStaticSoundOptions> = {},\n engine: Nullable<AudioEngineV2> = null\n): Promise<StaticSound> {\n engine = _GetAudioEngine(engine);\n return engine.createSoundAsync(name, source, options);\n}\n\n/**\n * Creates a new static sound buffer.\n * @param source - The source of the sound buffer.\n * @param options - The options for the static sound buffer.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created static sound buffer.\n */\nexport async function CreateSoundBufferAsync(\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options: Partial<IStaticSoundBufferOptions> = {},\n engine: Nullable<AudioEngineV2> = null\n): Promise<StaticSoundBuffer> {\n engine = _GetAudioEngine(engine);\n return engine.createSoundBufferAsync(source, options);\n}\n\n/**\n * Creates a new sound source.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the sound source.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created sound source.\n */\nexport function CreateSoundSourceAsync(\n name: string,\n source: AudioNode,\n options: Partial<ISoundSourceOptions> = {},\n engine: Nullable<AudioEngineV2> = null\n): Promise<AbstractSoundSource> {\n engine = _GetAudioEngine(engine);\n return engine.createSoundSourceAsync(name, source, options);\n}\n\n/**\n * Creates a new streaming sound.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the streaming sound.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created streaming sound.\n */\nexport function CreateStreamingSoundAsync(\n name: string,\n source: HTMLMediaElement | string | string[],\n options: Partial<IStreamingSoundOptions> = {},\n engine: Nullable<AudioEngineV2> = null\n): Promise<StreamingSound> {\n engine = _GetAudioEngine(engine);\n return engine.createStreamingSoundAsync(name, source, options);\n}\n"]}
1
+ {"version":3,"file":"audioEngineV2.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/abstractAudio/audioEngineV2.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\nimport type { AbstractAudioNode, AbstractNamedAudioNode } from \"./abstractAudioNode\";\nimport type { AbstractSoundSource, ISoundSourceOptions } from \"./abstractSoundSource\";\nimport type { AudioBus, IAudioBusOptions } from \"./audioBus\";\nimport type { IMainAudioBusOptions, MainAudioBus } from \"./mainAudioBus\";\nimport type { IStaticSoundOptions, StaticSound } from \"./staticSound\";\nimport type { IStaticSoundBufferOptions, StaticSoundBuffer } from \"./staticSoundBuffer\";\nimport type { IStreamingSoundOptions, StreamingSound } from \"./streamingSound\";\nimport type { AbstractSpatialAudioListener, ISpatialAudioListenerOptions } from \"./subProperties/abstractSpatialAudioListener\";\n\nconst Instances: AudioEngineV2[] = [];\n\n/**\n * Gets the most recently created v2 audio engine.\n * @returns The most recently created v2 audio engine.\n */\nexport function LastCreatedAudioEngine(): Nullable<AudioEngineV2> {\n if (Instances.length === 0) {\n return null;\n }\n\n return Instances[Instances.length - 1];\n}\n\n/**\n * Options for creating a v2 audio engine.\n */\nexport interface IAudioEngineV2Options extends ISpatialAudioListenerOptions {\n /**\n * The smoothing duration to use when changing audio parameters, in seconds. Defaults to `0.01` (10 milliseconds).\n */\n parameterRampDuration: number;\n /**\n * The initial output volume of the audio engine. Defaults to `1`.\n */\n volume: number;\n}\n\n/**\n * The state of a v2 audio engine.\n * @see {@link AudioEngineV2.state}\n */\nexport type AudioEngineV2State = \"closed\" | \"interrupted\" | \"running\" | \"suspended\";\n\n/**\n * Abstract base class for v2 audio engines.\n *\n * A v2 audio engine based on the WebAudio API can be created with the {@link CreateAudioEngineAsync} function.\n */\nexport abstract class AudioEngineV2 {\n /** Not owned, but all items should be in `_nodes` container, too, which is owned. */\n private readonly _mainBuses = new Set<MainAudioBus>();\n\n /** Owned top-level sound and bus nodes. */\n private readonly _nodes = new Set<AbstractNamedAudioNode>();\n\n private _defaultMainBus: Nullable<MainAudioBus> = null;\n\n private _parameterRampDuration: number = 0.01;\n\n protected constructor(options: Partial<IAudioEngineV2Options>) {\n Instances.push(this);\n\n if (typeof options.parameterRampDuration === \"number\") {\n this.parameterRampDuration = options.parameterRampDuration;\n }\n }\n\n /**\n * The elapsed time since the audio engine was started, in seconds.\n */\n public abstract readonly currentTime: number;\n\n /**\n * The default main bus that will be used for audio buses and sounds if their `outBus` option is not set.\n * @see {@link IAudioBusOptions.outBus}\n * @see {@link IAbstractSoundOptions.outBus}\n */\n public get defaultMainBus(): Nullable<MainAudioBus> {\n if (this._mainBuses.size === 0) {\n return null;\n }\n\n if (!this._defaultMainBus) {\n this._defaultMainBus = Array.from(this._mainBuses)[0];\n }\n\n return this._defaultMainBus;\n }\n\n /**\n * The spatial audio listener properties for the audio engine.\n * - Each audio engine has exactly one listener.\n */\n public abstract readonly listener: AbstractSpatialAudioListener;\n\n /**\n * The main output node.\n * - This is the last node in the audio graph before the audio is sent to the speakers.\n */\n public abstract readonly mainOut: AbstractAudioNode;\n\n /**\n * The current state of the audio engine.\n *\n * Possible values are:\n * - `\"closed\"`: The audio engine has been closed.\n * - `\"interrupted\"`: The audio engine has been interrupted and is not running.\n * - `\"running\"`: The audio engine is running normally.\n * - `\"suspended\"`: The audio engine is suspended and is not running.\n */\n public abstract readonly state: AudioEngineV2State;\n\n /**\n * The output volume of the audio engine.\n */\n public abstract volume: number;\n\n /**\n * The smoothing duration to use when changing audio parameters, in seconds. Defaults to `0.01` (10 milliseconds).\n */\n public get parameterRampDuration(): number {\n return this._parameterRampDuration;\n }\n\n public set parameterRampDuration(value: number) {\n this._parameterRampDuration = Math.max(0, value);\n }\n\n /**\n * Creates a new audio bus.\n * @param name - The name of the audio bus.\n * @param options - The options to use when creating the audio bus.\n * @param engine - The audio engine.\n * @returns A promise that resolves with the created audio bus.\n */\n public abstract createBusAsync(name: string, options?: Partial<IAudioBusOptions>): Promise<AudioBus>;\n\n /**\n * Creates a new main audio bus.\n * @param name - The name of the main audio bus.\n * @param options - The options to use when creating the main audio bus.\n * @returns A promise that resolves with the created main audio bus.\n */\n public abstract createMainBusAsync(name: string, options?: Partial<IMainAudioBusOptions>): Promise<MainAudioBus>;\n\n /**\n * Creates a new microphone sound source.\n * @param name - The name of the sound.\n * @param options - The options for the sound source.\n * @returns A promise that resolves to the created sound source.\n */\n public abstract createMicrophoneSoundSourceAsync(name: string, options?: Partial<ISoundSourceOptions>): Promise<AbstractSoundSource>;\n\n /**\n * Creates a new static sound.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the static sound.\n * @returns A promise that resolves to the created static sound.\n */\n public abstract createSoundAsync(\n name: string,\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options?: Partial<IStaticSoundOptions>\n ): Promise<StaticSound>;\n\n /**\n * Creates a new static sound buffer.\n * @param source - The source of the sound buffer.\n * @param options - The options for the static sound buffer.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created static sound buffer.\n */\n public abstract createSoundBufferAsync(\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options?: Partial<IStaticSoundBufferOptions>\n ): Promise<StaticSoundBuffer>;\n\n /**\n * Creates a new sound source.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the sound source.\n * @returns A promise that resolves to the created sound source.\n */\n public abstract createSoundSourceAsync(name: string, source: AudioNode, options?: Partial<ISoundSourceOptions>): Promise<AbstractSoundSource>;\n\n /**\n * Creates a new streaming sound.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the streaming sound.\n * @returns A promise that resolves to the created streaming sound.\n */\n public abstract createStreamingSoundAsync(name: string, source: HTMLMediaElement | string | string[], options?: Partial<IStreamingSoundOptions>): Promise<StreamingSound>;\n\n /**\n * Releases associated resources.\n */\n public dispose(): void {\n if (Instances.includes(this)) {\n Instances.splice(Instances.indexOf(this), 1);\n }\n\n const nodeIt = this._nodes.values();\n for (let next = nodeIt.next(); !next.done; next = nodeIt.next()) {\n next.value.dispose();\n }\n\n this._mainBuses.clear();\n this._nodes.clear();\n\n this._defaultMainBus = null;\n }\n\n /**\n * Checks if the specified format is valid.\n * @param format The format to check as an audio file extension like \"mp3\" or \"wav\".\n * @returns `true` if the format is valid; otherwise `false`.\n */\n public abstract isFormatValid(format: string): boolean;\n\n /**\n * Pauses the audio engine if it is running.\n * @returns A promise that resolves when the audio engine is paused.\n */\n public abstract pauseAsync(): Promise<void>;\n\n /**\n * Resumes the audio engine if it is not running.\n * @returns A promise that resolves when the audio engine is running.\n */\n public abstract resumeAsync(): Promise<void>;\n\n /**\n * Unlocks the audio engine if it is locked.\n * - Note that the returned promise may already be resolved if the audio engine is already unlocked.\n * @returns A promise that is resolved when the audio engine is unlocked.\n */\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\n public unlockAsync(): Promise<void> {\n return this.resumeAsync();\n }\n\n protected _addMainBus(mainBus: MainAudioBus): void {\n this._mainBuses.add(mainBus);\n\n this._addNode(mainBus);\n }\n\n protected _removeMainBus(mainBus: MainAudioBus): void {\n this._mainBuses.delete(mainBus);\n this._defaultMainBus = null;\n\n this._removeNode(mainBus);\n }\n\n protected _addNode(node: AbstractNamedAudioNode): void {\n this._nodes.add(node);\n }\n\n protected _removeNode(node: AbstractNamedAudioNode): void {\n this._nodes.delete(node);\n }\n}\n\n/**\n * @internal\n * @param engine - The given audio engine. If `null` then the last created audio engine is used.\n * @returns the given audio engine or the last created audio engine.\n * @throws An error if the resulting engine is `null`.\n */\nexport function _GetAudioEngine(engine: Nullable<AudioEngineV2>): AudioEngineV2 {\n if (!engine) {\n engine = LastCreatedAudioEngine();\n }\n\n if (engine) {\n return engine;\n }\n\n throw new Error(\"No audio engine.\");\n}\n\n/**\n * Creates a new audio bus.\n * @param name - The name of the audio bus.\n * @param options - The options to use when creating the audio bus.\n * @param engine - The audio engine.\n * @returns A promise that resolves with the created audio bus.\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\nexport function CreateAudioBusAsync(name: string, options: Partial<IAudioBusOptions> = {}, engine: Nullable<AudioEngineV2> = null): Promise<AudioBus> {\n engine = _GetAudioEngine(engine);\n return engine.createBusAsync(name, options);\n}\n\n/**\n * Creates a new main audio bus.\n * @param name - The name of the main audio bus.\n * @param options - The options to use when creating the main audio bus.\n * @param engine - The audio engine.\n * @returns A promise that resolves with the created main audio bus.\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\nexport function CreateMainAudioBusAsync(name: string, options: Partial<IMainAudioBusOptions> = {}, engine: Nullable<AudioEngineV2> = null): Promise<MainAudioBus> {\n engine = _GetAudioEngine(engine);\n return engine.createMainBusAsync(name, options);\n}\n\n/**\n * Creates a new microphone sound source.\n * @param name - The name of the sound.\n * @param options - The options for the sound source.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created sound source.\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\nexport function CreateMicrophoneSoundSourceAsync(name: string, options: Partial<ISoundSourceOptions> = {}, engine: Nullable<AudioEngineV2> = null): Promise<AbstractSoundSource> {\n engine = _GetAudioEngine(engine);\n return engine.createMicrophoneSoundSourceAsync(name, options);\n}\n\n/**\n * Creates a new static sound.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the static sound.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created static sound.\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\nexport function CreateSoundAsync(\n name: string,\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options: Partial<IStaticSoundOptions> = {},\n engine: Nullable<AudioEngineV2> = null\n): Promise<StaticSound> {\n engine = _GetAudioEngine(engine);\n return engine.createSoundAsync(name, source, options);\n}\n\n/**\n * Creates a new static sound buffer.\n * @param source - The source of the sound buffer.\n * @param options - The options for the static sound buffer.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created static sound buffer.\n */\nexport async function CreateSoundBufferAsync(\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options: Partial<IStaticSoundBufferOptions> = {},\n engine: Nullable<AudioEngineV2> = null\n): Promise<StaticSoundBuffer> {\n engine = _GetAudioEngine(engine);\n return await engine.createSoundBufferAsync(source, options);\n}\n\n/**\n * Creates a new sound source.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the sound source.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created sound source.\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\nexport function CreateSoundSourceAsync(\n name: string,\n source: AudioNode,\n options: Partial<ISoundSourceOptions> = {},\n engine: Nullable<AudioEngineV2> = null\n): Promise<AbstractSoundSource> {\n engine = _GetAudioEngine(engine);\n return engine.createSoundSourceAsync(name, source, options);\n}\n\n/**\n * Creates a new streaming sound.\n * @param name - The name of the sound.\n * @param source - The source of the sound.\n * @param options - The options for the streaming sound.\n * @param engine - The audio engine.\n * @returns A promise that resolves to the created streaming sound.\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\nexport function CreateStreamingSoundAsync(\n name: string,\n source: HTMLMediaElement | string | string[],\n options: Partial<IStreamingSoundOptions> = {},\n engine: Nullable<AudioEngineV2> = null\n): Promise<StreamingSound> {\n engine = _GetAudioEngine(engine);\n return engine.createStreamingSoundAsync(name, source, options);\n}\n"]}
@@ -33,6 +33,7 @@ export class StreamingSound extends AbstractSound {
33
33
  * Preloads an instance of the sound.
34
34
  * @returns A promise that resolves when the instance is preloaded.
35
35
  */
36
+ // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax
36
37
  preloadInstanceAsync() {
37
38
  const instance = this._createInstance();
38
39
  this._addPreloadedInstance(instance);
@@ -45,9 +46,10 @@ export class StreamingSound extends AbstractSound {
45
46
  */
46
47
  async preloadInstancesAsync(count) {
47
48
  for (let i = 0; i < count; i++) {
49
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
48
50
  this.preloadInstanceAsync();
49
51
  }
50
- await Promise.all(this._preloadedInstances.map((instance) => instance.preloadedPromise));
52
+ await Promise.all(this._preloadedInstances.map(async (instance) => await instance.preloadedPromise));
51
53
  }
52
54
  /**
53
55
  * Plays the sound.
@@ -1 +1 @@
1
- {"version":3,"file":"streamingSound.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/abstractAudio/streamingSound.ts"],"names":[],"mappings":"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","sourcesContent":["import { SoundState } from \"../soundState\";\nimport type { IAbstractSoundOptions, IAbstractSoundPlayOptions, IAbstractSoundStoredOptions } from \"./abstractSound\";\nimport { AbstractSound } from \"./abstractSound\";\nimport type { AudioEngineV2 } from \"./audioEngineV2\";\nimport type { _StreamingSoundInstance } from \"./streamingSoundInstance\";\n\n/** @internal */\nexport interface IStreamingSoundOptionsBase {\n /**\n * The number of instances to preload. Defaults to 1.\n * */\n preloadCount: number;\n}\n\n/**\n * Options for creating a streaming sound.\n */\nexport interface IStreamingSoundOptions extends IAbstractSoundOptions, IStreamingSoundOptionsBase {}\n\n/**\n * Options for playing a streaming sound.\n */\nexport interface IStreamingSoundPlayOptions extends IAbstractSoundPlayOptions {}\n\n/**\n * Options stored in a streaming sound.\n * @internal\n */\nexport interface IStreamingSoundStoredOptions extends IAbstractSoundStoredOptions, IStreamingSoundOptionsBase {}\n\n/**\n * Abstract class representing a streaming sound.\n *\n * A streaming sound has a sound buffer that is loaded into memory in chunks as it is played. This allows it to be played\n * more quickly than a static sound, but it also means that it cannot have loop points or playback rate changes.\n *\n * Due to the way streaming sounds are typically implemented, there can be a significant delay when attempting to play\n * a streaming sound for the first time. To prevent this delay, it is recommended to preload instances of the sound\n * using the {@link IStreamingSoundStoredOptions.preloadCount} options, or the {@link preloadInstanceAsync} and\n * {@link preloadInstancesAsync} methods before calling the `play` method.\n *\n * Streaming sounds are created by the {@link CreateStreamingSoundAsync} function.\n */\nexport abstract class StreamingSound extends AbstractSound {\n private _preloadedInstances = new Array<_StreamingSoundInstance>();\n\n protected abstract override readonly _options: IStreamingSoundStoredOptions;\n\n protected constructor(name: string, engine: AudioEngineV2) {\n super(name, engine);\n }\n\n /**\n * The number of instances to preload. Defaults to `1`.\n */\n public get preloadCount(): number {\n return this._options.preloadCount ?? 1;\n }\n\n /**\n * Returns the number of instances that have been preloaded.\n */\n public get preloadCompletedCount(): number {\n return this._preloadedInstances.length;\n }\n\n /**\n * Preloads an instance of the sound.\n * @returns A promise that resolves when the instance is preloaded.\n */\n public preloadInstanceAsync(): Promise<void> {\n const instance = this._createInstance();\n\n this._addPreloadedInstance(instance);\n\n return instance.preloadedPromise;\n }\n\n /**\n * Preloads the given number of instances of the sound.\n * @param count - The number of instances to preload.\n * @returns A promise that resolves when all instances are preloaded.\n */\n public async preloadInstancesAsync(count: number): Promise<void> {\n for (let i = 0; i < count; i++) {\n this.preloadInstanceAsync();\n }\n\n await Promise.all(this._preloadedInstances.map((instance) => instance.preloadedPromise));\n }\n\n /**\n * Plays the sound.\n * - Triggers `onEndedObservable` if played for the full duration and the `loop` option is not set.\n * @param options The options to use when playing the sound. Options set here override the sound's options.\n */\n public play(options: Partial<IStreamingSoundPlayOptions> = {}): void {\n if (this.state === SoundState.Paused) {\n this.resume();\n return;\n }\n\n let instance: _StreamingSoundInstance;\n\n if (this.preloadCompletedCount > 0) {\n instance = this._preloadedInstances[0];\n instance.startOffset = this.startOffset;\n this._removePreloadedInstance(instance);\n } else {\n instance = this._createInstance();\n }\n\n const onInstanceStateChanged = () => {\n if (instance.state === SoundState.Started) {\n this._stopExcessInstances();\n instance.onStateChangedObservable.removeCallback(onInstanceStateChanged);\n }\n };\n instance.onStateChangedObservable.add(onInstanceStateChanged);\n\n options.startOffset ??= this.startOffset;\n options.loop ??= this.loop;\n options.volume ??= 1;\n\n this._beforePlay(instance);\n instance.play(options);\n this._afterPlay(instance);\n }\n\n /**\n * Stops the sound.\n */\n public stop(): void {\n this._setState(SoundState.Stopped);\n\n if (!this._instances) {\n return;\n }\n\n for (const instance of Array.from(this._instances)) {\n instance.stop();\n }\n }\n\n protected abstract override _createInstance(): _StreamingSoundInstance;\n\n private _addPreloadedInstance(instance: _StreamingSoundInstance): void {\n if (!this._preloadedInstances.includes(instance)) {\n this._preloadedInstances.push(instance);\n }\n }\n\n private _removePreloadedInstance(instance: _StreamingSoundInstance): void {\n const index = this._preloadedInstances.indexOf(instance);\n if (index !== -1) {\n this._preloadedInstances.splice(index, 1);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"streamingSound.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/abstractAudio/streamingSound.ts"],"names":[],"mappings":"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","sourcesContent":["import { SoundState } from \"../soundState\";\nimport type { IAbstractSoundOptions, IAbstractSoundPlayOptions, IAbstractSoundStoredOptions } from \"./abstractSound\";\nimport { AbstractSound } from \"./abstractSound\";\nimport type { AudioEngineV2 } from \"./audioEngineV2\";\nimport type { _StreamingSoundInstance } from \"./streamingSoundInstance\";\n\n/** @internal */\nexport interface IStreamingSoundOptionsBase {\n /**\n * The number of instances to preload. Defaults to 1.\n * */\n preloadCount: number;\n}\n\n/**\n * Options for creating a streaming sound.\n */\nexport interface IStreamingSoundOptions extends IAbstractSoundOptions, IStreamingSoundOptionsBase {}\n\n/**\n * Options for playing a streaming sound.\n */\nexport interface IStreamingSoundPlayOptions extends IAbstractSoundPlayOptions {}\n\n/**\n * Options stored in a streaming sound.\n * @internal\n */\nexport interface IStreamingSoundStoredOptions extends IAbstractSoundStoredOptions, IStreamingSoundOptionsBase {}\n\n/**\n * Abstract class representing a streaming sound.\n *\n * A streaming sound has a sound buffer that is loaded into memory in chunks as it is played. This allows it to be played\n * more quickly than a static sound, but it also means that it cannot have loop points or playback rate changes.\n *\n * Due to the way streaming sounds are typically implemented, there can be a significant delay when attempting to play\n * a streaming sound for the first time. To prevent this delay, it is recommended to preload instances of the sound\n * using the {@link IStreamingSoundStoredOptions.preloadCount} options, or the {@link preloadInstanceAsync} and\n * {@link preloadInstancesAsync} methods before calling the `play` method.\n *\n * Streaming sounds are created by the {@link CreateStreamingSoundAsync} function.\n */\nexport abstract class StreamingSound extends AbstractSound {\n private _preloadedInstances = new Array<_StreamingSoundInstance>();\n\n protected abstract override readonly _options: IStreamingSoundStoredOptions;\n\n protected constructor(name: string, engine: AudioEngineV2) {\n super(name, engine);\n }\n\n /**\n * The number of instances to preload. Defaults to `1`.\n */\n public get preloadCount(): number {\n return this._options.preloadCount ?? 1;\n }\n\n /**\n * Returns the number of instances that have been preloaded.\n */\n public get preloadCompletedCount(): number {\n return this._preloadedInstances.length;\n }\n\n /**\n * Preloads an instance of the sound.\n * @returns A promise that resolves when the instance is preloaded.\n */\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\n public preloadInstanceAsync(): Promise<void> {\n const instance = this._createInstance();\n\n this._addPreloadedInstance(instance);\n\n return instance.preloadedPromise;\n }\n\n /**\n * Preloads the given number of instances of the sound.\n * @param count - The number of instances to preload.\n * @returns A promise that resolves when all instances are preloaded.\n */\n public async preloadInstancesAsync(count: number): Promise<void> {\n for (let i = 0; i < count; i++) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.preloadInstanceAsync();\n }\n\n await Promise.all(this._preloadedInstances.map(async (instance) => await instance.preloadedPromise));\n }\n\n /**\n * Plays the sound.\n * - Triggers `onEndedObservable` if played for the full duration and the `loop` option is not set.\n * @param options The options to use when playing the sound. Options set here override the sound's options.\n */\n public play(options: Partial<IStreamingSoundPlayOptions> = {}): void {\n if (this.state === SoundState.Paused) {\n this.resume();\n return;\n }\n\n let instance: _StreamingSoundInstance;\n\n if (this.preloadCompletedCount > 0) {\n instance = this._preloadedInstances[0];\n instance.startOffset = this.startOffset;\n this._removePreloadedInstance(instance);\n } else {\n instance = this._createInstance();\n }\n\n const onInstanceStateChanged = () => {\n if (instance.state === SoundState.Started) {\n this._stopExcessInstances();\n instance.onStateChangedObservable.removeCallback(onInstanceStateChanged);\n }\n };\n instance.onStateChangedObservable.add(onInstanceStateChanged);\n\n options.startOffset ??= this.startOffset;\n options.loop ??= this.loop;\n options.volume ??= 1;\n\n this._beforePlay(instance);\n instance.play(options);\n this._afterPlay(instance);\n }\n\n /**\n * Stops the sound.\n */\n public stop(): void {\n this._setState(SoundState.Stopped);\n\n if (!this._instances) {\n return;\n }\n\n for (const instance of Array.from(this._instances)) {\n instance.stop();\n }\n }\n\n protected abstract override _createInstance(): _StreamingSoundInstance;\n\n private _addPreloadedInstance(instance: _StreamingSoundInstance): void {\n if (!this._preloadedInstances.includes(instance)) {\n this._preloadedInstances.push(instance);\n }\n }\n\n private _removePreloadedInstance(instance: _StreamingSoundInstance): void {\n const index = this._preloadedInstances.indexOf(instance);\n if (index !== -1) {\n this._preloadedInstances.splice(index, 1);\n }\n }\n}\n"]}
@@ -38,12 +38,14 @@ export class _AbstractAudioSubGraph {
38
38
  callback(node);
39
39
  return;
40
40
  }
41
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then
41
42
  this._createSubNodePromisesResolvedAsync().then(() => {
42
43
  const node = this.getSubNode(name);
43
44
  if (node) {
44
45
  callback(node);
45
46
  return;
46
47
  }
48
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then
47
49
  this.createAndAddSubNodeAsync(name).then((node) => {
48
50
  callback(node);
49
51
  });
@@ -57,8 +59,10 @@ export class _AbstractAudioSubGraph {
57
59
  *
58
60
  * @internal
59
61
  */
62
+ // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax
60
63
  createAndAddSubNodeAsync(name) {
61
64
  var _a;
65
+ // eslint-disable-next-line github/no-then
62
66
  (_a = this._createSubNodePromises)[name] || (_a[name] = this._createSubNode(name).then((node) => {
63
67
  this._addSubNode(node);
64
68
  return node;
@@ -107,8 +111,8 @@ export class _AbstractAudioSubGraph {
107
111
  delete this._createSubNodePromises[name];
108
112
  this._onSubNodesChanged();
109
113
  }
110
- _createSubNodePromisesResolvedAsync() {
111
- return Promise.all(Object.values(this._createSubNodePromises));
114
+ async _createSubNodePromisesResolvedAsync() {
115
+ return await Promise.all(Object.values(this._createSubNodePromises));
112
116
  }
113
117
  _addSubNode(node) {
114
118
  if (this._isDisposed) {
@@ -1 +1 @@
1
- {"version":3,"file":"abstractAudioSubGraph.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAgB,sBAAsB;IAA5C;QACY,2BAAsB,GAAsD,EAAE,CAAC;QAC/E,gBAAW,GAAG,KAAK,CAAC;QACpB,cAAS,GAA6C,EAAE,CAAC;QA0HzD,uBAAkB,GAAG,CAAC,IAAuB,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,IAA8B,CAAC;YAE/C,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC,CAAC;IACN,CAAC;IA/HG;;;;;;;OAOG;IACI,aAAa,CAAkC,IAAkB,EAAE,QAA2B;QACjG,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,EAAE,CAAC;YACP,QAAQ,CAAC,IAAS,CAAC,CAAC;YACpB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,mCAAmC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,IAAI,EAAE,CAAC;gBACP,QAAQ,CAAC,IAAS,CAAC,CAAC;gBACpB,OAAO;YACX,CAAC;YAED,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC9C,QAAQ,CAAC,IAAS,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;OAOG;IACI,wBAAwB,CAAC,IAAkB;;QAC9C,MAAA,IAAI,CAAC,sBAAsB,EAAC,IAAI,SAAJ,IAAI,IAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1E,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,EAAC;QAEH,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACI,OAAO;QACV,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;IACrC,CAAC;IAED;;;;;;;SAOK;IACE,UAAU,CAAkC,IAAY;QAC3D,OAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAO,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,kBAAkB,CAAC,OAA8B;QAC1D,MAAM,IAAI,CAAC,mCAAmC,EAAE,CAAC;QAEjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAEzC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAUS,mCAAmC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,WAAW,CAAC,IAA2B;QAC3C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACX,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAEjC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAE1D,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;CASJ","sourcesContent":["import type { Nullable } from \"../../../types\";\nimport type { AbstractAudioNode, AbstractNamedAudioNode } from \"../abstractAudioNode\";\nimport type { _AbstractAudioSubNode } from \"./abstractAudioSubNode\";\nimport type { AudioSubNode } from \"./audioSubNode\";\n\n/**\n * Adds common sub graph functionality to an audio node.\n *\n * Audio nodes such as static sounds, streaming sounds, and buses can use audio sub graphs to process audio internally\n * before sending it to connected downstream audio nodes. This is useful for applying effects, spatial audio, and other\n * audio processing tasks common to multiple audio node classes.\n *\n * A key feature of audio sub graphs is their audio sub nodes are created asynchronously on demand so the minimum set\n * of sub nodes are used at all times to save memory and CPU resources. The tradeoff is a small delay when first\n * setting a property backed by a sub node. This delay is avoided by using the appropriate options to initialize the\n * sub node on creation, e.g. `spatialEnabled` and `stereoEnabled`, or by setting any creation option backed by the\n * sub node, e.g. `spatialPosition` and `stereoPan`.\n *\n * @internal\n */\nexport abstract class _AbstractAudioSubGraph {\n private _createSubNodePromises: { [key: string]: Promise<_AbstractAudioSubNode> } = {};\n private _isDisposed = false;\n private _subNodes: { [key: string]: _AbstractAudioSubNode } = {};\n\n /**\n * Executes the given callback with the named sub node, creating the sub node if needed.\n *\n * @param name The name of the sub node\n * @param callback The function to call with the named sub node\n *\n * @internal\n */\n public callOnSubNode<T extends _AbstractAudioSubNode>(name: AudioSubNode, callback: (node: T) => void): void {\n const node = this.getSubNode(name);\n if (node) {\n callback(node as T);\n return;\n }\n\n this._createSubNodePromisesResolvedAsync().then(() => {\n const node = this.getSubNode(name);\n if (node) {\n callback(node as T);\n return;\n }\n\n this.createAndAddSubNodeAsync(name).then((node) => {\n callback(node as T);\n });\n });\n }\n\n /**\n * Creates the named subnode and adds it to the sub graph.\n *\n * @param name The name of the sub node.\n * @returns A promise that resolves to the created sub node.\n *\n * @internal\n */\n public createAndAddSubNodeAsync(name: AudioSubNode): Promise<_AbstractAudioSubNode> {\n this._createSubNodePromises[name] ||= this._createSubNode(name).then((node) => {\n this._addSubNode(node);\n return node;\n });\n\n return this._createSubNodePromises[name];\n }\n\n /**\n * Releases associated resources.\n *\n * @internal\n */\n public dispose() {\n this._isDisposed = true;\n\n const subNodes = Object.values(this._subNodes);\n for (const subNode of subNodes) {\n subNode.dispose();\n }\n\n this._subNodes = {};\n this._createSubNodePromises = {};\n }\n\n /**\n * Gets a previously created sub node.\n *\n * @param name - The name of the sub node\n * @returns The named sub node, or `null` if it has not been created, yet\n *\n * @internal\n * */\n public getSubNode<T extends _AbstractAudioSubNode>(name: string): Nullable<T> {\n return (this._subNodes[name] as T) ?? null;\n }\n\n /**\n * Removes a sub node from the sub graph.\n *\n * @param subNode - The sub node to remove\n * @returns A promise that resolves when the sub node is removed\n *\n * @internal\n */\n public async removeSubNodeAsync(subNode: _AbstractAudioSubNode): Promise<void> {\n await this._createSubNodePromisesResolvedAsync();\n\n const name = subNode.name;\n if (this._subNodes[name]) {\n delete this._subNodes[name];\n }\n\n delete this._createSubNodePromises[name];\n\n this._onSubNodesChanged();\n }\n\n protected abstract _createSubNode(name: string): Promise<_AbstractAudioSubNode>;\n\n /**\n * Called when sub-nodes are added or removed.\n * - Override this to connect and reconnect sub-nodes as needed.\n */\n protected abstract _onSubNodesChanged(): void;\n\n protected _createSubNodePromisesResolvedAsync(): Promise<_AbstractAudioSubNode[]> {\n return Promise.all(Object.values(this._createSubNodePromises));\n }\n\n private _addSubNode(node: _AbstractAudioSubNode): void {\n if (this._isDisposed) {\n node.dispose();\n return;\n }\n\n this._subNodes[node.name] = node;\n\n node.onDisposeObservable.addOnce(this._onSubNodeDisposed);\n\n this._onSubNodesChanged();\n }\n\n private _onSubNodeDisposed = (node: AbstractAudioNode) => {\n const subNode = node as AbstractNamedAudioNode;\n\n delete this._subNodes[subNode.name];\n\n this._onSubNodesChanged();\n };\n}\n"]}
1
+ {"version":3,"file":"abstractAudioSubGraph.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../../types\";\nimport type { AbstractAudioNode, AbstractNamedAudioNode } from \"../abstractAudioNode\";\nimport type { _AbstractAudioSubNode } from \"./abstractAudioSubNode\";\nimport type { AudioSubNode } from \"./audioSubNode\";\n\n/**\n * Adds common sub graph functionality to an audio node.\n *\n * Audio nodes such as static sounds, streaming sounds, and buses can use audio sub graphs to process audio internally\n * before sending it to connected downstream audio nodes. This is useful for applying effects, spatial audio, and other\n * audio processing tasks common to multiple audio node classes.\n *\n * A key feature of audio sub graphs is their audio sub nodes are created asynchronously on demand so the minimum set\n * of sub nodes are used at all times to save memory and CPU resources. The tradeoff is a small delay when first\n * setting a property backed by a sub node. This delay is avoided by using the appropriate options to initialize the\n * sub node on creation, e.g. `spatialEnabled` and `stereoEnabled`, or by setting any creation option backed by the\n * sub node, e.g. `spatialPosition` and `stereoPan`.\n *\n * @internal\n */\nexport abstract class _AbstractAudioSubGraph {\n private _createSubNodePromises: { [key: string]: Promise<_AbstractAudioSubNode> } = {};\n private _isDisposed = false;\n private _subNodes: { [key: string]: _AbstractAudioSubNode } = {};\n\n /**\n * Executes the given callback with the named sub node, creating the sub node if needed.\n *\n * @param name The name of the sub node\n * @param callback The function to call with the named sub node\n *\n * @internal\n */\n public callOnSubNode<T extends _AbstractAudioSubNode>(name: AudioSubNode, callback: (node: T) => void): void {\n const node = this.getSubNode(name);\n if (node) {\n callback(node as T);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\n this._createSubNodePromisesResolvedAsync().then(() => {\n const node = this.getSubNode(name);\n if (node) {\n callback(node as T);\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\n this.createAndAddSubNodeAsync(name).then((node) => {\n callback(node as T);\n });\n });\n }\n\n /**\n * Creates the named subnode and adds it to the sub graph.\n *\n * @param name The name of the sub node.\n * @returns A promise that resolves to the created sub node.\n *\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\n public createAndAddSubNodeAsync(name: AudioSubNode): Promise<_AbstractAudioSubNode> {\n // eslint-disable-next-line github/no-then\n this._createSubNodePromises[name] ||= this._createSubNode(name).then((node) => {\n this._addSubNode(node);\n return node;\n });\n\n return this._createSubNodePromises[name];\n }\n\n /**\n * Releases associated resources.\n *\n * @internal\n */\n public dispose() {\n this._isDisposed = true;\n\n const subNodes = Object.values(this._subNodes);\n for (const subNode of subNodes) {\n subNode.dispose();\n }\n\n this._subNodes = {};\n this._createSubNodePromises = {};\n }\n\n /**\n * Gets a previously created sub node.\n *\n * @param name - The name of the sub node\n * @returns The named sub node, or `null` if it has not been created, yet\n *\n * @internal\n * */\n public getSubNode<T extends _AbstractAudioSubNode>(name: string): Nullable<T> {\n return (this._subNodes[name] as T) ?? null;\n }\n\n /**\n * Removes a sub node from the sub graph.\n *\n * @param subNode - The sub node to remove\n * @returns A promise that resolves when the sub node is removed\n *\n * @internal\n */\n public async removeSubNodeAsync(subNode: _AbstractAudioSubNode): Promise<void> {\n await this._createSubNodePromisesResolvedAsync();\n\n const name = subNode.name;\n if (this._subNodes[name]) {\n delete this._subNodes[name];\n }\n\n delete this._createSubNodePromises[name];\n\n this._onSubNodesChanged();\n }\n\n protected abstract _createSubNode(name: string): Promise<_AbstractAudioSubNode>;\n\n /**\n * Called when sub-nodes are added or removed.\n * - Override this to connect and reconnect sub-nodes as needed.\n */\n protected abstract _onSubNodesChanged(): void;\n\n protected async _createSubNodePromisesResolvedAsync(): Promise<_AbstractAudioSubNode[]> {\n return await Promise.all(Object.values(this._createSubNodePromises));\n }\n\n private _addSubNode(node: _AbstractAudioSubNode): void {\n if (this._isDisposed) {\n node.dispose();\n return;\n }\n\n this._subNodes[node.name] = node;\n\n node.onDisposeObservable.addOnce(this._onSubNodeDisposed);\n\n this._onSubNodesChanged();\n }\n\n private _onSubNodeDisposed = (node: AbstractAudioNode) => {\n const subNode = node as AbstractNamedAudioNode;\n\n delete this._subNodes[subNode.name];\n\n this._onSubNodesChanged();\n };\n}\n"]}
@@ -68,6 +68,7 @@ export class _AudioAnalyzer extends AbstractAudioAnalyzer {
68
68
  dispose() {
69
69
  const subNode = _GetAudioAnalyzerSubNode(this._subGraph);
70
70
  if (subNode) {
71
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
71
72
  this._subGraph.removeSubNodeAsync(subNode);
72
73
  subNode.dispose();
73
74
  }
@@ -84,6 +85,7 @@ export class _AudioAnalyzer extends AbstractAudioAnalyzer {
84
85
  const subNode = _GetAudioAnalyzerSubNode(this._subGraph);
85
86
  if (!subNode) {
86
87
  Logger.Warn("AudioAnalyzer not enabled");
88
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
87
89
  this.enableAsync();
88
90
  return _GetEmptyByteFrequencyData();
89
91
  }
@@ -94,6 +96,7 @@ export class _AudioAnalyzer extends AbstractAudioAnalyzer {
94
96
  const subNode = _GetAudioAnalyzerSubNode(this._subGraph);
95
97
  if (!subNode) {
96
98
  Logger.Warn("AudioAnalyzer not enabled");
99
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
97
100
  this.enableAsync();
98
101
  return _GetEmptyFloatFrequencyData();
99
102
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audioAnalyzer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subProperties/audioAnalyzer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../../../Misc/logger\";\nimport type { Nullable } from \"../../../types\";\nimport type { AudioAnalyzerFFTSizeType } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport { _AudioAnalyzerDefaults, AbstractAudioAnalyzer } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport type { _AbstractAudioSubGraph } from \"../subNodes/abstractAudioSubGraph\";\nimport { _GetAudioAnalyzerSubNode, _SetAudioAnalyzerProperty } from \"../subNodes/audioAnalyzerSubNode\";\nimport { AudioSubNode } from \"../subNodes/audioSubNode\";\n\nlet EmptyByteFrequencyData: Nullable<Uint8Array> = null;\nlet EmptyFloatFrequencyData: Nullable<Float32Array> = null;\n\n/** @internal */\nexport function _GetEmptyByteFrequencyData(): Uint8Array {\n if (!EmptyByteFrequencyData) {\n EmptyByteFrequencyData = new Uint8Array();\n }\n return EmptyByteFrequencyData;\n}\n\n/** @internal */\nexport function _GetEmptyFloatFrequencyData(): Float32Array {\n if (!EmptyFloatFrequencyData) {\n EmptyFloatFrequencyData = new Float32Array();\n }\n return EmptyFloatFrequencyData;\n}\n\n/** @internal */\nexport class _AudioAnalyzer extends AbstractAudioAnalyzer {\n private _fftSize: AudioAnalyzerFFTSizeType = _AudioAnalyzerDefaults.fftSize;\n private _maxDecibels: number = _AudioAnalyzerDefaults.maxDecibels;\n private _minDecibels: number = _AudioAnalyzerDefaults.minDecibels;\n private _smoothing: number = _AudioAnalyzerDefaults.smoothing;\n private _subGraph: _AbstractAudioSubGraph;\n\n /** @internal */\n public constructor(subGraph: _AbstractAudioSubGraph) {\n super();\n this._subGraph = subGraph;\n }\n\n /** @internal */\n public get fftSize(): AudioAnalyzerFFTSizeType {\n return this._fftSize;\n }\n\n public set fftSize(value: AudioAnalyzerFFTSizeType) {\n this._fftSize = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"fftSize\", value);\n }\n\n /** @internal */\n public get isEnabled(): boolean {\n return _GetAudioAnalyzerSubNode(this._subGraph) !== null;\n }\n\n /** @internal */\n public get minDecibels(): number {\n return this._minDecibels;\n }\n\n public set minDecibels(value: number) {\n this._minDecibels = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"minDecibels\", value);\n }\n\n /** @internal */\n public get maxDecibels(): number {\n return this._maxDecibels;\n }\n\n public set maxDecibels(value: number) {\n this._maxDecibels = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"maxDecibels\", value);\n }\n\n /** @internal */\n public get smoothing(): number {\n return this._smoothing;\n }\n\n public set smoothing(value: number) {\n this._smoothing = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"smoothing\", value);\n }\n\n /** @internal */\n public dispose(): void {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (subNode) {\n this._subGraph.removeSubNodeAsync(subNode);\n subNode.dispose();\n }\n }\n\n /** @internal */\n public async enableAsync(): Promise<void> {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n await this._subGraph.createAndAddSubNodeAsync(AudioSubNode.ANALYZER);\n }\n }\n\n /** @internal */\n public getByteFrequencyData(): Uint8Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n this.enableAsync();\n return _GetEmptyByteFrequencyData();\n }\n return subNode.getByteFrequencyData();\n }\n\n /** @internal */\n public getFloatFrequencyData(): Float32Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n this.enableAsync();\n return _GetEmptyFloatFrequencyData();\n }\n return subNode.getFloatFrequencyData();\n }\n}\n"]}
1
+ {"version":3,"file":"audioAnalyzer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subProperties/audioAnalyzer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../../../Misc/logger\";\nimport type { Nullable } from \"../../../types\";\nimport type { AudioAnalyzerFFTSizeType } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport { _AudioAnalyzerDefaults, AbstractAudioAnalyzer } from \"../../abstractAudio/subProperties/abstractAudioAnalyzer\";\nimport type { _AbstractAudioSubGraph } from \"../subNodes/abstractAudioSubGraph\";\nimport { _GetAudioAnalyzerSubNode, _SetAudioAnalyzerProperty } from \"../subNodes/audioAnalyzerSubNode\";\nimport { AudioSubNode } from \"../subNodes/audioSubNode\";\n\nlet EmptyByteFrequencyData: Nullable<Uint8Array> = null;\nlet EmptyFloatFrequencyData: Nullable<Float32Array> = null;\n\n/** @internal */\nexport function _GetEmptyByteFrequencyData(): Uint8Array {\n if (!EmptyByteFrequencyData) {\n EmptyByteFrequencyData = new Uint8Array();\n }\n return EmptyByteFrequencyData;\n}\n\n/** @internal */\nexport function _GetEmptyFloatFrequencyData(): Float32Array {\n if (!EmptyFloatFrequencyData) {\n EmptyFloatFrequencyData = new Float32Array();\n }\n return EmptyFloatFrequencyData;\n}\n\n/** @internal */\nexport class _AudioAnalyzer extends AbstractAudioAnalyzer {\n private _fftSize: AudioAnalyzerFFTSizeType = _AudioAnalyzerDefaults.fftSize;\n private _maxDecibels: number = _AudioAnalyzerDefaults.maxDecibels;\n private _minDecibels: number = _AudioAnalyzerDefaults.minDecibels;\n private _smoothing: number = _AudioAnalyzerDefaults.smoothing;\n private _subGraph: _AbstractAudioSubGraph;\n\n /** @internal */\n public constructor(subGraph: _AbstractAudioSubGraph) {\n super();\n this._subGraph = subGraph;\n }\n\n /** @internal */\n public get fftSize(): AudioAnalyzerFFTSizeType {\n return this._fftSize;\n }\n\n public set fftSize(value: AudioAnalyzerFFTSizeType) {\n this._fftSize = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"fftSize\", value);\n }\n\n /** @internal */\n public get isEnabled(): boolean {\n return _GetAudioAnalyzerSubNode(this._subGraph) !== null;\n }\n\n /** @internal */\n public get minDecibels(): number {\n return this._minDecibels;\n }\n\n public set minDecibels(value: number) {\n this._minDecibels = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"minDecibels\", value);\n }\n\n /** @internal */\n public get maxDecibels(): number {\n return this._maxDecibels;\n }\n\n public set maxDecibels(value: number) {\n this._maxDecibels = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"maxDecibels\", value);\n }\n\n /** @internal */\n public get smoothing(): number {\n return this._smoothing;\n }\n\n public set smoothing(value: number) {\n this._smoothing = value;\n _SetAudioAnalyzerProperty(this._subGraph, \"smoothing\", value);\n }\n\n /** @internal */\n public dispose(): void {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (subNode) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._subGraph.removeSubNodeAsync(subNode);\n subNode.dispose();\n }\n }\n\n /** @internal */\n public async enableAsync(): Promise<void> {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n await this._subGraph.createAndAddSubNodeAsync(AudioSubNode.ANALYZER);\n }\n }\n\n /** @internal */\n public getByteFrequencyData(): Uint8Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enableAsync();\n return _GetEmptyByteFrequencyData();\n }\n return subNode.getByteFrequencyData();\n }\n\n /** @internal */\n public getFloatFrequencyData(): Float32Array {\n const subNode = _GetAudioAnalyzerSubNode(this._subGraph);\n if (!subNode) {\n Logger.Warn(\"AudioAnalyzer not enabled\");\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enableAsync();\n return _GetEmptyFloatFrequencyData();\n }\n return subNode.getFloatFrequencyData();\n }\n}\n"]}
@@ -23,6 +23,7 @@ export class _SpatialAudio extends AbstractSpatialAudio {
23
23
  this._position = _SpatialAudioDefaults.position.clone();
24
24
  this._rotation = _SpatialAudioDefaults.rotation.clone();
25
25
  this._rotationQuaternion = _SpatialAudioDefaults.rotationQuaternion.clone();
26
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
26
27
  subGraph.createAndAddSubNodeAsync("Spatial" /* AudioSubNode.SPATIAL */);
27
28
  }
28
29
  this._subGraph = subGraph;
@@ -1 +1 @@
1
- {"version":3,"file":"spatialAudio.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subProperties/spatialAudio.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Quaternion, Vector3 } from \"../../../Maths/math.vector\";\nimport type { Node } from \"../../../node\";\nimport type { Nullable } from \"../../../types\";\nimport { SpatialAudioAttachmentType } from \"../../spatialAudioAttachmentType\";\nimport type { _AbstractAudioSubGraph } from \"../subNodes/abstractAudioSubGraph\";\nimport { AudioSubNode } from \"../subNodes/audioSubNode\";\nimport type { _SpatialAudioSubNode } from \"../subNodes/spatialAudioSubNode\";\nimport { _GetSpatialAudioSubNode, _SetSpatialAudioProperty } from \"../subNodes/spatialAudioSubNode\";\nimport { _SpatialAudioDefaults, AbstractSpatialAudio } from \"./abstractSpatialAudio\";\n\n/** @internal */\nexport abstract class _SpatialAudio extends AbstractSpatialAudio {\n private _coneInnerAngle: number = _SpatialAudioDefaults.coneInnerAngle;\n private _coneOuterAngle: number = _SpatialAudioDefaults.coneOuterAngle;\n private _coneOuterVolume: number = _SpatialAudioDefaults.coneOuterVolume;\n private _distanceModel: DistanceModelType = _SpatialAudioDefaults.distanceModel;\n private _maxDistance: number = _SpatialAudioDefaults.maxDistance;\n private _minDistance: number = _SpatialAudioDefaults.minDistance;\n private _panningModel: PanningModelType = _SpatialAudioDefaults.panningModel;\n private _position: Vector3;\n private _rolloffFactor: number = _SpatialAudioDefaults.rolloffFactor;\n private _rotation: Vector3;\n private _rotationQuaternion: Quaternion;\n private _subGraph: _AbstractAudioSubGraph;\n\n /** @internal */\n public constructor(subGraph: _AbstractAudioSubGraph) {\n super();\n\n const subNode = _GetSpatialAudioSubNode(subGraph);\n if (subNode) {\n this._position = subNode.position.clone();\n this._rotation = subNode.rotation.clone();\n this._rotationQuaternion = subNode.rotationQuaternion.clone();\n } else {\n this._position = _SpatialAudioDefaults.position.clone();\n this._rotation = _SpatialAudioDefaults.rotation.clone();\n this._rotationQuaternion = _SpatialAudioDefaults.rotationQuaternion.clone();\n\n subGraph.createAndAddSubNodeAsync(AudioSubNode.SPATIAL);\n }\n\n this._subGraph = subGraph;\n }\n\n /** @internal */\n public get coneInnerAngle(): number {\n return this._coneInnerAngle;\n }\n\n public set coneInnerAngle(value: number) {\n this._coneInnerAngle = value;\n _SetSpatialAudioProperty(this._subGraph, \"coneInnerAngle\", value);\n }\n\n /** @internal */\n public get coneOuterAngle(): number {\n return this._coneOuterAngle;\n }\n\n public set coneOuterAngle(value: number) {\n this._coneOuterAngle = value;\n _SetSpatialAudioProperty(this._subGraph, \"coneOuterAngle\", value);\n }\n\n /** @internal */\n public get coneOuterVolume(): number {\n return this._coneOuterVolume;\n }\n\n public set coneOuterVolume(value: number) {\n this._coneOuterVolume = value;\n _SetSpatialAudioProperty(this._subGraph, \"coneOuterVolume\", value);\n }\n\n /** @internal */\n public get distanceModel(): DistanceModelType {\n return this._distanceModel;\n }\n\n public set distanceModel(value: DistanceModelType) {\n this._distanceModel = value;\n _SetSpatialAudioProperty(this._subGraph, \"distanceModel\", value);\n }\n\n /** @internal */\n public get isAttached(): boolean {\n return this._subGraph.getSubNode<_SpatialAudioSubNode>(AudioSubNode.SPATIAL)?.isAttached ?? false;\n }\n\n /** @internal */\n public get maxDistance(): number {\n return this._maxDistance;\n }\n\n public set maxDistance(value: number) {\n if (value <= 0) {\n value = 0.000001;\n }\n\n this._maxDistance = value;\n _SetSpatialAudioProperty(this._subGraph, \"maxDistance\", value);\n }\n\n /** @internal */\n public get minDistance(): number {\n return this._minDistance;\n }\n\n public set minDistance(value: number) {\n this._minDistance = value;\n _SetSpatialAudioProperty(this._subGraph, \"minDistance\", value);\n }\n\n /** @internal */\n public get panningModel(): PanningModelType {\n return this._panningModel;\n }\n\n public set panningModel(value: PanningModelType) {\n this._panningModel = value;\n _SetSpatialAudioProperty(this._subGraph, \"panningModel\", value);\n }\n\n /** @internal */\n public get position(): Vector3 {\n return this._position;\n }\n\n public set position(value: Vector3) {\n this._position = value;\n this._updatePosition();\n }\n\n /** @internal */\n public get rolloffFactor(): number {\n return this._rolloffFactor;\n }\n\n public set rolloffFactor(value: number) {\n this._rolloffFactor = value;\n _SetSpatialAudioProperty(this._subGraph, \"rolloffFactor\", value);\n }\n\n /** @internal */\n public get rotation(): Vector3 {\n return this._rotation;\n }\n\n public set rotation(value: Vector3) {\n this._rotation = value;\n this._updateRotation();\n }\n\n /** @internal */\n public get rotationQuaternion(): Quaternion {\n return this._rotationQuaternion;\n }\n\n public set rotationQuaternion(value: Quaternion) {\n this._rotationQuaternion = value;\n this._updateRotation();\n }\n\n /**\n * Attaches to a scene node.\n *\n * Detaches automatically before attaching to the given scene node.\n * If `sceneNode` is `null` it is the same as calling `detach()`.\n *\n * @param sceneNode The scene node to attach to, or `null` to detach.\n * @param useBoundingBox Whether to use the bounding box of the node for positioning. Defaults to `false`.\n * @param attachmentType Whether to attach to the node's position and/or rotation. Defaults to `PositionAndRotation`.\n */\n public attach(sceneNode: Nullable<Node>, useBoundingBox: boolean = false, attachmentType: SpatialAudioAttachmentType = SpatialAudioAttachmentType.PositionAndRotation): void {\n _GetSpatialAudioSubNode(this._subGraph)?.attach(sceneNode, useBoundingBox, attachmentType);\n }\n\n /**\n * Detaches from the scene node if attached.\n */\n public detach(): void {\n _GetSpatialAudioSubNode(this._subGraph)?.detach();\n }\n\n /** @internal */\n public update(): void {\n const subNode = _GetSpatialAudioSubNode(this._subGraph);\n\n if (!subNode) {\n return;\n }\n\n if (subNode.isAttached) {\n subNode.update();\n } else {\n this._updatePosition(subNode);\n this._updateRotation(subNode);\n }\n }\n\n private _updatePosition(subNode: Nullable<_SpatialAudioSubNode> = null): void {\n if (!subNode) {\n subNode = _GetSpatialAudioSubNode(this._subGraph);\n\n if (!subNode) {\n return;\n }\n }\n\n const position = subNode.position;\n if (!position.equalsWithEpsilon(this._position)) {\n subNode.position.copyFrom(this._position);\n subNode._updatePosition();\n }\n }\n\n private _updateRotation(subNode: Nullable<_SpatialAudioSubNode> = null): void {\n if (!subNode) {\n subNode = _GetSpatialAudioSubNode(this._subGraph);\n\n if (!subNode) {\n return;\n }\n }\n\n if (!subNode.rotationQuaternion.equalsWithEpsilon(this._rotationQuaternion)) {\n subNode.rotationQuaternion.copyFrom(this._rotationQuaternion);\n subNode._updateRotation();\n } else if (!subNode.rotation.equalsWithEpsilon(this._rotation)) {\n subNode.rotation.copyFrom(this._rotation);\n subNode._updateRotation();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"spatialAudio.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subProperties/spatialAudio.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Quaternion, Vector3 } from \"../../../Maths/math.vector\";\nimport type { Node } from \"../../../node\";\nimport type { Nullable } from \"../../../types\";\nimport { SpatialAudioAttachmentType } from \"../../spatialAudioAttachmentType\";\nimport type { _AbstractAudioSubGraph } from \"../subNodes/abstractAudioSubGraph\";\nimport { AudioSubNode } from \"../subNodes/audioSubNode\";\nimport type { _SpatialAudioSubNode } from \"../subNodes/spatialAudioSubNode\";\nimport { _GetSpatialAudioSubNode, _SetSpatialAudioProperty } from \"../subNodes/spatialAudioSubNode\";\nimport { _SpatialAudioDefaults, AbstractSpatialAudio } from \"./abstractSpatialAudio\";\n\n/** @internal */\nexport abstract class _SpatialAudio extends AbstractSpatialAudio {\n private _coneInnerAngle: number = _SpatialAudioDefaults.coneInnerAngle;\n private _coneOuterAngle: number = _SpatialAudioDefaults.coneOuterAngle;\n private _coneOuterVolume: number = _SpatialAudioDefaults.coneOuterVolume;\n private _distanceModel: DistanceModelType = _SpatialAudioDefaults.distanceModel;\n private _maxDistance: number = _SpatialAudioDefaults.maxDistance;\n private _minDistance: number = _SpatialAudioDefaults.minDistance;\n private _panningModel: PanningModelType = _SpatialAudioDefaults.panningModel;\n private _position: Vector3;\n private _rolloffFactor: number = _SpatialAudioDefaults.rolloffFactor;\n private _rotation: Vector3;\n private _rotationQuaternion: Quaternion;\n private _subGraph: _AbstractAudioSubGraph;\n\n /** @internal */\n public constructor(subGraph: _AbstractAudioSubGraph) {\n super();\n\n const subNode = _GetSpatialAudioSubNode(subGraph);\n if (subNode) {\n this._position = subNode.position.clone();\n this._rotation = subNode.rotation.clone();\n this._rotationQuaternion = subNode.rotationQuaternion.clone();\n } else {\n this._position = _SpatialAudioDefaults.position.clone();\n this._rotation = _SpatialAudioDefaults.rotation.clone();\n this._rotationQuaternion = _SpatialAudioDefaults.rotationQuaternion.clone();\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n subGraph.createAndAddSubNodeAsync(AudioSubNode.SPATIAL);\n }\n\n this._subGraph = subGraph;\n }\n\n /** @internal */\n public get coneInnerAngle(): number {\n return this._coneInnerAngle;\n }\n\n public set coneInnerAngle(value: number) {\n this._coneInnerAngle = value;\n _SetSpatialAudioProperty(this._subGraph, \"coneInnerAngle\", value);\n }\n\n /** @internal */\n public get coneOuterAngle(): number {\n return this._coneOuterAngle;\n }\n\n public set coneOuterAngle(value: number) {\n this._coneOuterAngle = value;\n _SetSpatialAudioProperty(this._subGraph, \"coneOuterAngle\", value);\n }\n\n /** @internal */\n public get coneOuterVolume(): number {\n return this._coneOuterVolume;\n }\n\n public set coneOuterVolume(value: number) {\n this._coneOuterVolume = value;\n _SetSpatialAudioProperty(this._subGraph, \"coneOuterVolume\", value);\n }\n\n /** @internal */\n public get distanceModel(): DistanceModelType {\n return this._distanceModel;\n }\n\n public set distanceModel(value: DistanceModelType) {\n this._distanceModel = value;\n _SetSpatialAudioProperty(this._subGraph, \"distanceModel\", value);\n }\n\n /** @internal */\n public get isAttached(): boolean {\n return this._subGraph.getSubNode<_SpatialAudioSubNode>(AudioSubNode.SPATIAL)?.isAttached ?? false;\n }\n\n /** @internal */\n public get maxDistance(): number {\n return this._maxDistance;\n }\n\n public set maxDistance(value: number) {\n if (value <= 0) {\n value = 0.000001;\n }\n\n this._maxDistance = value;\n _SetSpatialAudioProperty(this._subGraph, \"maxDistance\", value);\n }\n\n /** @internal */\n public get minDistance(): number {\n return this._minDistance;\n }\n\n public set minDistance(value: number) {\n this._minDistance = value;\n _SetSpatialAudioProperty(this._subGraph, \"minDistance\", value);\n }\n\n /** @internal */\n public get panningModel(): PanningModelType {\n return this._panningModel;\n }\n\n public set panningModel(value: PanningModelType) {\n this._panningModel = value;\n _SetSpatialAudioProperty(this._subGraph, \"panningModel\", value);\n }\n\n /** @internal */\n public get position(): Vector3 {\n return this._position;\n }\n\n public set position(value: Vector3) {\n this._position = value;\n this._updatePosition();\n }\n\n /** @internal */\n public get rolloffFactor(): number {\n return this._rolloffFactor;\n }\n\n public set rolloffFactor(value: number) {\n this._rolloffFactor = value;\n _SetSpatialAudioProperty(this._subGraph, \"rolloffFactor\", value);\n }\n\n /** @internal */\n public get rotation(): Vector3 {\n return this._rotation;\n }\n\n public set rotation(value: Vector3) {\n this._rotation = value;\n this._updateRotation();\n }\n\n /** @internal */\n public get rotationQuaternion(): Quaternion {\n return this._rotationQuaternion;\n }\n\n public set rotationQuaternion(value: Quaternion) {\n this._rotationQuaternion = value;\n this._updateRotation();\n }\n\n /**\n * Attaches to a scene node.\n *\n * Detaches automatically before attaching to the given scene node.\n * If `sceneNode` is `null` it is the same as calling `detach()`.\n *\n * @param sceneNode The scene node to attach to, or `null` to detach.\n * @param useBoundingBox Whether to use the bounding box of the node for positioning. Defaults to `false`.\n * @param attachmentType Whether to attach to the node's position and/or rotation. Defaults to `PositionAndRotation`.\n */\n public attach(sceneNode: Nullable<Node>, useBoundingBox: boolean = false, attachmentType: SpatialAudioAttachmentType = SpatialAudioAttachmentType.PositionAndRotation): void {\n _GetSpatialAudioSubNode(this._subGraph)?.attach(sceneNode, useBoundingBox, attachmentType);\n }\n\n /**\n * Detaches from the scene node if attached.\n */\n public detach(): void {\n _GetSpatialAudioSubNode(this._subGraph)?.detach();\n }\n\n /** @internal */\n public update(): void {\n const subNode = _GetSpatialAudioSubNode(this._subGraph);\n\n if (!subNode) {\n return;\n }\n\n if (subNode.isAttached) {\n subNode.update();\n } else {\n this._updatePosition(subNode);\n this._updateRotation(subNode);\n }\n }\n\n private _updatePosition(subNode: Nullable<_SpatialAudioSubNode> = null): void {\n if (!subNode) {\n subNode = _GetSpatialAudioSubNode(this._subGraph);\n\n if (!subNode) {\n return;\n }\n }\n\n const position = subNode.position;\n if (!position.equalsWithEpsilon(this._position)) {\n subNode.position.copyFrom(this._position);\n subNode._updatePosition();\n }\n }\n\n private _updateRotation(subNode: Nullable<_SpatialAudioSubNode> = null): void {\n if (!subNode) {\n subNode = _GetSpatialAudioSubNode(this._subGraph);\n\n if (!subNode) {\n return;\n }\n }\n\n if (!subNode.rotationQuaternion.equalsWithEpsilon(this._rotationQuaternion)) {\n subNode.rotationQuaternion.copyFrom(this._rotationQuaternion);\n subNode._updateRotation();\n } else if (!subNode.rotation.equalsWithEpsilon(this._rotation)) {\n subNode.rotation.copyFrom(this._rotation);\n subNode._updateRotation();\n }\n }\n}\n"]}
@@ -70,6 +70,7 @@ export class _WebAudioEngine extends AudioEngineV2 {
70
70
  if (this._audioContextStarted && this._resumeOnPause && !this._pauseCalled) {
71
71
  clearInterval(this._resumeOnPauseTimerId);
72
72
  this._resumeOnPauseTimerId = setInterval(() => {
73
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
73
74
  this.resumeAsync();
74
75
  }, this._resumeOnPauseRetryInterval);
75
76
  }
@@ -90,6 +91,7 @@ export class _WebAudioEngine extends AudioEngineV2 {
90
91
  audio.loop = true;
91
92
  // Wave data for 0.0001 seconds of silence.
92
93
  audio.src = "data:audio/wav;base64,UklGRjAAAABXQVZFZm10IBAAAAABAAEAgLsAAAB3AQACABAAZGF0YQwAAAAAAAEA/v8CAP//AQA=";
94
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
93
95
  audio.play();
94
96
  }
95
97
  this.userGestureObservable.notifyObservers();
@@ -183,7 +185,7 @@ export class _WebAudioEngine extends AudioEngineV2 {
183
185
  catch (e) {
184
186
  throw new Error("Unable to access microphone: " + e);
185
187
  }
186
- return this.createSoundSourceAsync(name, new MediaStreamAudioSourceNode(this._audioContext, { mediaStream }), options);
188
+ return await this.createSoundSourceAsync(name, new MediaStreamAudioSourceNode(this._audioContext, { mediaStream }), options);
187
189
  }
188
190
  /** @internal */
189
191
  async createSoundAsync(name, source, options = {}) {
@@ -220,6 +222,7 @@ export class _WebAudioEngine extends AudioEngineV2 {
220
222
  this._listener = null;
221
223
  // Note that OfflineAudioContext does not have a `close` method.
222
224
  if (this._audioContext.state !== "closed" && !this._isUsingOfflineAudioContext) {
225
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
223
226
  this._audioContext.close();
224
227
  }
225
228
  document.removeEventListener("click", this._onUserGestureAsync);
@@ -258,6 +261,7 @@ export class _WebAudioEngine extends AudioEngineV2 {
258
261
  this._pauseCalled = true;
259
262
  }
260
263
  /** @internal */
264
+ // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax
261
265
  resumeAsync() {
262
266
  this._pauseCalled = false;
263
267
  if (this._resumePromise) {
@@ -1 +1 @@
1
- {"version":3,"file":"webAudioEngine.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/webAudio/webAudioEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMnD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAM/D,OAAO,EAAE,+BAA+B,EAAE,MAAM,6DAA6D,CAAC;AAE9G,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAgCvD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,UAA2C,EAAE;IACtF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,eAAe,GAA8B;IAC/C,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,0BAA0B;IAC/B,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,4BAA4B;IACjC,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,6BAA6B;CACtC,CAAC;AAEF,gBAAgB;AAChB,MAAM,OAAO,eAAgB,SAAQ,aAAa;IAiC9C,gBAAgB;IAChB,YAAmB,UAA2C,EAAE;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QAlCX,yBAAoB,GAAG,KAAK,CAAC;QAC7B,oBAAe,GAAG,IAAI,GAAG,EAAU,CAAC;QAC3B,gCAA2B,GAAY,KAAK,CAAC;QACtD,cAAS,GAAoC,IAAI,CAAC;QACzC,wBAAmB,GAAY,IAAI,CAAC;QACpC,2BAAsB,GAAW,CAAC,CAAC;QAE5C,iBAAY,GAAG,KAAK,CAAC;QACrB,yBAAoB,GAAG,IAAI,CAAC;QAC5B,mBAAc,GAAG,IAAI,CAAC;QACtB,gCAA2B,GAAG,IAAI,CAAC;QACnC,0BAAqB,GAAQ,IAAI,CAAC;QAClC,mBAAc,GAA4B,IAAI,CAAC;QAC/C,qBAAgB,GAA+B,IAAI,CAAC;QACpD,cAAS,GAAgC,IAAI,CAAC;QACrC,kBAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAC3C,YAAO,GAAG,CAAC,CAAC;QAKpB,gBAAgB;QACA,mBAAc,GAAkB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACpE,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,gBAAgB;QACT,2BAAsB,GAAuB,IAAI,UAAU,EAAE,CAAC;QAErE,gBAAgB;QACT,0BAAqB,GAAqB,IAAI,UAAU,EAAE,CAAC;QA0Q1D,2BAAsB,GAAwB,KAAK,IAAI,EAAE;YAC7D,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAEpF,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;YAEpC,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEM,+BAA0B,GAAG,GAAG,EAAE;YACtC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC3B,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBAC1C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC/B,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACzE,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBAE1C,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC,GAAG,EAAE;wBAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;oBACvB,CAAC,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC;QAEM,wBAAmB,GAAe,KAAK,IAAI,EAAE;YACjD,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YACtC,CAAC;YAED,mEAAmE;YACnE,+FAA+F;YAC/F,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACzB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAExD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACpC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACvB,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;gBACvB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;gBAElB,2CAA2C;gBAC3C,KAAK,CAAC,GAAG,GAAG,oGAAoG,CAAC;gBAEjH,KAAK,CAAC,IAAI,EAAE,CAAC;YACjB,CAAC;YAED,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE,CAAC;QACjD,CAAC,CAAC;QAtTE,IAAI,OAAO,OAAO,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAClD,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QAC1D,CAAC;QAED,IAAI,OAAO,OAAO,CAAC,qBAAqB,KAAK,QAAQ,EAAE,CAAC;YACpD,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QAEnC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,2BAA2B,GAAG,OAAO,CAAC,YAAY,YAAY,mBAAmB,CAAC;YACvF,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;QAC9C,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;QACjF,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,UAAU,CAAC,OAAwC;QAC5D,IAAI,CAAC,oBAAoB,GAAG,OAAO,OAAO,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;QAClH,IAAI,CAAC,cAAc,GAAG,OAAO,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QAChG,IAAI,CAAC,2BAA2B,GAAG,OAAO,CAAC,0BAA0B,IAAI,IAAI,CAAC;QAE9E,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAE7D,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAEpC,IAAI,+BAA+B,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,SAAS,GAAG,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC1G,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAClC,CAAC;IAED,gBAAgB;IAChB,IAAW,WAAW;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;IAC1C,CAAC;IAED,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,gBAAgB;IAChB,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACzI,CAAC;IAED,gBAAgB;IAChB,IAAW,KAAK;QACZ,6GAA6G;QAC7G,OAAO,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;IACnF,CAAC;IAED,gBAAgB;IAChB,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,gBAAgB;IAChB,IAAW,MAAM,CAAC,KAAa;QAC3B,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;QACjC,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,UAAqC,EAAE;QAC7E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE9B,OAAO,GAAG,CAAC;IACf,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,kBAAkB,CAAC,IAAY,EAAE,UAAyC,EAAE;QACrF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAEjD,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE9B,OAAO,GAAG,CAAC;IACf,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,gCAAgC,CAAC,IAAY,EAAE,OAAsC;QAC9F,IAAI,WAAwB,CAAC;QAE7B,IAAI,CAAC;YACD,WAAW,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,IAAI,0BAA0B,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3H,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,gBAAgB,CACzB,IAAY,EACZ,MAAyE,EACzE,UAAwC,EAAE;QAE1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAErD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAExC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,sBAAsB,CAC/B,MAAyE,EACzE,UAA8C,EAAE;QAEhD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAErD,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE9C,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,sBAAsB,CAAC,IAAY,EAAE,MAAiB,EAAE,UAAwC,EAAE;QAC3G,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAErD,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACjF,MAAM,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEtC,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,yBAAyB,CAAC,IAAY,EAAE,MAA4C,EAAE,UAA2C,EAAE;QAC5I,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAExD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAExC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,gBAAgB;IACA,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhB,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,gEAAgE;QAChE,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;YAC7E,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;QAED,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAEvF,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAEhC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,gBAAgB;IACT,iBAAiB,CAAC,MAAc;QACnC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,gBAAgB;IACT,aAAa,CAAC,MAAc;QAC/B,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjC,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,gBAAgB;IACA,KAAK,CAAC,UAAU;QAC5B,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAEnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,gBAAgB;IACA,WAAW;QACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAE1B,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,gBAAgB;IACA,WAAW,CAAC,OAAqB;QAC7C,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,gBAAgB;IACA,cAAc,CAAC,OAAqB;QAChD,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,gBAAgB;IACA,QAAQ,CAAC,IAA4B;QACjD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,gBAAgB;IACA,WAAW,CAAC,IAA4B;QACpD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,gBAAgB;IACT,cAAc,CAAC,UAAsB,EAAE,KAAa;QACvD,UAAU,CAAC,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC7F,CAAC;CAuDJ","sourcesContent":["import { Observable } from \"../../Misc/observable\";\nimport type { Nullable } from \"../../types\";\nimport type { AbstractNamedAudioNode } from \"../abstractAudio/abstractAudioNode\";\nimport type { AbstractSoundSource, ISoundSourceOptions } from \"../abstractAudio/abstractSoundSource\";\nimport type { AudioBus, IAudioBusOptions } from \"../abstractAudio/audioBus\";\nimport type { AudioEngineV2State, IAudioEngineV2Options } from \"../abstractAudio/audioEngineV2\";\nimport { AudioEngineV2 } from \"../abstractAudio/audioEngineV2\";\nimport type { IMainAudioBusOptions, MainAudioBus } from \"../abstractAudio/mainAudioBus\";\nimport type { IStaticSoundOptions, StaticSound } from \"../abstractAudio/staticSound\";\nimport type { IStaticSoundBufferOptions, StaticSoundBuffer } from \"../abstractAudio/staticSoundBuffer\";\nimport type { IStreamingSoundOptions, StreamingSound } from \"../abstractAudio/streamingSound\";\nimport type { AbstractSpatialAudioListener } from \"../abstractAudio/subProperties/abstractSpatialAudioListener\";\nimport { _HasSpatialAudioListenerOptions } from \"../abstractAudio/subProperties/abstractSpatialAudioListener\";\nimport type { _SpatialAudioListener } from \"../abstractAudio/subProperties/spatialAudioListener\";\nimport { _CreateSpatialAudioListener } from \"./subProperties/spatialWebAudioListener\";\nimport { _WebAudioMainOut } from \"./webAudioMainOut\";\nimport { _WebAudioUnmuteUI } from \"./webAudioUnmuteUI\";\n\n/**\n * Options for creating a v2 audio engine that uses the WebAudio API.\n */\nexport interface IWebAudioEngineOptions extends IAudioEngineV2Options {\n /**\n * The audio context to be used by the engine.\n */\n audioContext: AudioContext;\n /**\n * The default UI's parent element. Defaults to the last created graphics engine's canvas if it exists; otherwise the HTML document's body.\n */\n defaultUIParentElement?: HTMLElement;\n /**\n * Set to `true` to disable the default UI. Defaults to `false`.\n */\n disableDefaultUI?: boolean;\n /**\n * Set to `true` to automatically resume the audio context when the user interacts with the page. Defaults to `true`.\n */\n resumeOnInteraction: boolean;\n /**\n * Set to `true` to automatically resume the audio context when the browser pauses audio playback. Defaults to `true`.\n */\n resumeOnPause: boolean;\n /**\n * The interval in milliseconds to try resuming audio playback when `resumeOnPause` is `true`. Defaults to `1000`.\n */\n resumeOnPauseRetryInterval: number;\n}\n\n/**\n * Creates a new v2 audio engine that uses the WebAudio API.\n * @param options - The options for creating the audio engine.\n * @returns A promise that resolves with the created audio engine.\n */\nexport async function CreateAudioEngineAsync(options: Partial<IWebAudioEngineOptions> = {}): Promise<AudioEngineV2> {\n const engine = new _WebAudioEngine(options);\n await engine._initAsync(options);\n return engine;\n}\n\nconst FormatMimeTypes: { [key: string]: string } = {\n aac: \"audio/aac\",\n ac3: \"audio/ac3\",\n flac: \"audio/flac\",\n m4a: \"audio/mp4\",\n mp3: 'audio/mpeg; codecs=\"mp3\"',\n mp4: \"audio/mp4\",\n ogg: 'audio/ogg; codecs=\"vorbis\"',\n wav: \"audio/wav\",\n webm: 'audio/webm; codecs=\"vorbis\"',\n};\n\n/** @internal */\nexport class _WebAudioEngine extends AudioEngineV2 {\n private _audioContextStarted = false;\n private _invalidFormats = new Set<string>();\n private readonly _isUsingOfflineAudioContext: boolean = false;\n private _listener: Nullable<_SpatialAudioListener> = null;\n private readonly _listenerAutoUpdate: boolean = true;\n private readonly _listenerMinUpdateTime: number = 0;\n private _mainOut: _WebAudioMainOut;\n private _pauseCalled = false;\n private _resumeOnInteraction = true;\n private _resumeOnPause = true;\n private _resumeOnPauseRetryInterval = 1000;\n private _resumeOnPauseTimerId: any = null;\n private _resumePromise: Nullable<Promise<void>> = null;\n private _silentHtmlAudio: Nullable<HTMLAudioElement> = null;\n private _unmuteUI: Nullable<_WebAudioUnmuteUI> = null;\n private readonly _validFormats = new Set<string>();\n private _volume = 1;\n\n /** @internal */\n public readonly _audioContext: AudioContext;\n\n /** @internal */\n public readonly isReadyPromise: Promise<void> = new Promise((resolve) => {\n this._resolveIsReadyPromise = resolve;\n });\n\n /** @internal */\n public stateChangedObservable: Observable<string> = new Observable();\n\n /** @internal */\n public userGestureObservable: Observable<void> = new Observable();\n\n /** @internal */\n public constructor(options: Partial<IWebAudioEngineOptions> = {}) {\n super(options);\n\n if (typeof options.listenerAutoUpdate === \"boolean\") {\n this._listenerAutoUpdate = options.listenerAutoUpdate;\n }\n\n if (typeof options.listenerMinUpdateTime === \"number\") {\n this._listenerMinUpdateTime = options.listenerMinUpdateTime;\n }\n\n this._volume = options.volume ?? 1;\n\n if (options.audioContext) {\n this._isUsingOfflineAudioContext = options.audioContext instanceof OfflineAudioContext;\n this._audioContext = options.audioContext;\n } else {\n this._audioContext = new AudioContext();\n }\n\n if (!options.disableDefaultUI) {\n this._unmuteUI = new _WebAudioUnmuteUI(this, options.defaultUIParentElement);\n }\n }\n\n /** @internal */\n public async _initAsync(options: Partial<IWebAudioEngineOptions>): Promise<void> {\n this._resumeOnInteraction = typeof options.resumeOnInteraction === \"boolean\" ? options.resumeOnInteraction : true;\n this._resumeOnPause = typeof options.resumeOnPause === \"boolean\" ? options.resumeOnPause : true;\n this._resumeOnPauseRetryInterval = options.resumeOnPauseRetryInterval ?? 1000;\n\n document.addEventListener(\"click\", this._onUserGestureAsync);\n\n await this._initAudioContextAsync();\n\n if (_HasSpatialAudioListenerOptions(options)) {\n this._listener = _CreateSpatialAudioListener(this, this._listenerAutoUpdate, this._listenerMinUpdateTime);\n this._listener.setOptions(options);\n }\n\n this._resolveIsReadyPromise();\n }\n\n /** @internal */\n public get currentTime(): number {\n return this._audioContext.currentTime ?? 0;\n }\n\n /** @internal */\n public get _inNode(): AudioNode {\n return this._audioContext.destination;\n }\n\n /** @internal */\n public get mainOut(): _WebAudioMainOut {\n return this._mainOut;\n }\n\n /** @internal */\n public get listener(): AbstractSpatialAudioListener {\n return this._listener ?? (this._listener = _CreateSpatialAudioListener(this, this._listenerAutoUpdate, this._listenerMinUpdateTime));\n }\n\n /** @internal */\n public get state(): AudioEngineV2State {\n // Always return \"running\" for OfflineAudioContext so sound `play` calls work while the context is suspended.\n return this._isUsingOfflineAudioContext ? \"running\" : this._audioContext.state;\n }\n\n /** @internal */\n public get volume(): number {\n return this._volume;\n }\n\n /** @internal */\n public set volume(value: number) {\n if (this._volume === value) {\n return;\n }\n\n this._volume = value;\n\n if (this._mainOut) {\n this._mainOut.volume = value;\n }\n }\n\n /** @internal */\n public async createBusAsync(name: string, options: Partial<IAudioBusOptions> = {}): Promise<AudioBus> {\n const module = await import(\"./webAudioBus\");\n\n const bus = new module._WebAudioBus(name, this, options);\n await bus._initAsync(options);\n\n return bus;\n }\n\n /** @internal */\n public async createMainBusAsync(name: string, options: Partial<IMainAudioBusOptions> = {}): Promise<MainAudioBus> {\n const module = await import(\"./webAudioMainBus\");\n\n const bus = new module._WebAudioMainBus(name, this);\n await bus._initAsync(options);\n\n return bus;\n }\n\n /** @internal */\n public async createMicrophoneSoundSourceAsync(name: string, options?: Partial<ISoundSourceOptions>): Promise<AbstractSoundSource> {\n let mediaStream: MediaStream;\n\n try {\n mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (e) {\n throw new Error(\"Unable to access microphone: \" + e);\n }\n\n return this.createSoundSourceAsync(name, new MediaStreamAudioSourceNode(this._audioContext, { mediaStream }), options);\n }\n\n /** @internal */\n public async createSoundAsync(\n name: string,\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options: Partial<IStaticSoundOptions> = {}\n ): Promise<StaticSound> {\n const module = await import(\"./webAudioStaticSound\");\n\n const sound = new module._WebAudioStaticSound(name, this, options);\n await sound._initAsync(source, options);\n\n return sound;\n }\n\n /** @internal */\n public async createSoundBufferAsync(\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options: Partial<IStaticSoundBufferOptions> = {}\n ): Promise<StaticSoundBuffer> {\n const module = await import(\"./webAudioStaticSound\");\n\n const soundBuffer = new module._WebAudioStaticSoundBuffer(this);\n await soundBuffer._initAsync(source, options);\n\n return soundBuffer;\n }\n\n /** @internal */\n public async createSoundSourceAsync(name: string, source: AudioNode, options: Partial<ISoundSourceOptions> = {}): Promise<AbstractSoundSource> {\n const module = await import(\"./webAudioSoundSource\");\n\n const soundSource = new module._WebAudioSoundSource(name, source, this, options);\n await soundSource._initAsync(options);\n\n return soundSource;\n }\n\n /** @internal */\n public async createStreamingSoundAsync(name: string, source: HTMLMediaElement | string | string[], options: Partial<IStreamingSoundOptions> = {}): Promise<StreamingSound> {\n const module = await import(\"./webAudioStreamingSound\");\n\n const sound = new module._WebAudioStreamingSound(name, this, options);\n await sound._initAsync(source, options);\n\n return sound;\n }\n\n /** @internal */\n public override dispose(): void {\n super.dispose();\n\n this._listener?.dispose();\n this._listener = null;\n\n // Note that OfflineAudioContext does not have a `close` method.\n if (this._audioContext.state !== \"closed\" && !this._isUsingOfflineAudioContext) {\n this._audioContext.close();\n }\n\n document.removeEventListener(\"click\", this._onUserGestureAsync);\n this._audioContext.removeEventListener(\"statechange\", this._onAudioContextStateChange);\n\n this._silentHtmlAudio?.remove();\n\n this._unmuteUI?.dispose();\n this._unmuteUI = null;\n }\n\n /** @internal */\n public flagInvalidFormat(format: string): void {\n this._invalidFormats.add(format);\n }\n\n /** @internal */\n public isFormatValid(format: string): boolean {\n if (this._validFormats.has(format)) {\n return true;\n }\n\n if (this._invalidFormats.has(format)) {\n return false;\n }\n\n const mimeType = FormatMimeTypes[format];\n if (mimeType === undefined) {\n return false;\n }\n\n const audio = new Audio();\n if (audio.canPlayType(mimeType) === \"\") {\n this._invalidFormats.add(format);\n return false;\n }\n\n this._validFormats.add(format);\n\n return true;\n }\n\n /** @internal */\n public override async pauseAsync(): Promise<void> {\n await this._audioContext.suspend();\n\n this._pauseCalled = true;\n }\n\n /** @internal */\n public override resumeAsync(): Promise<void> {\n this._pauseCalled = false;\n\n if (this._resumePromise) {\n return this._resumePromise;\n }\n\n this._resumePromise = this._audioContext.resume();\n return this._resumePromise;\n }\n\n /** @internal */\n public override _addMainBus(mainBus: MainAudioBus): void {\n super._addMainBus(mainBus);\n }\n\n /** @internal */\n public override _removeMainBus(mainBus: MainAudioBus): void {\n super._removeMainBus(mainBus);\n }\n\n /** @internal */\n public override _addNode(node: AbstractNamedAudioNode): void {\n super._addNode(node);\n }\n\n /** @internal */\n public override _removeNode(node: AbstractNamedAudioNode): void {\n super._removeNode(node);\n }\n\n /** @internal */\n public _setAudioParam(audioParam: AudioParam, value: number) {\n audioParam.linearRampToValueAtTime(value, this.currentTime + this.parameterRampDuration);\n }\n\n private _initAudioContextAsync: () => Promise<void> = async () => {\n this._audioContext.addEventListener(\"statechange\", this._onAudioContextStateChange);\n\n this._mainOut = new _WebAudioMainOut(this);\n this._mainOut.volume = this._volume;\n\n await this.createMainBusAsync(\"default\");\n };\n\n private _onAudioContextStateChange = () => {\n if (this.state === \"running\") {\n clearInterval(this._resumeOnPauseTimerId);\n this._audioContextStarted = true;\n this._resumePromise = null;\n }\n if (this.state === \"suspended\" || this.state === \"interrupted\") {\n if (this._audioContextStarted && this._resumeOnPause && !this._pauseCalled) {\n clearInterval(this._resumeOnPauseTimerId);\n\n this._resumeOnPauseTimerId = setInterval(() => {\n this.resumeAsync();\n }, this._resumeOnPauseRetryInterval);\n }\n }\n\n this.stateChangedObservable.notifyObservers(this.state);\n };\n\n private _onUserGestureAsync: () => void = async () => {\n if (this._resumeOnInteraction) {\n await this._audioContext.resume();\n }\n\n // On iOS the ringer switch must be turned on for WebAudio to play.\n // This gets WebAudio to play with the ringer switch turned off by playing an HTMLAudioElement.\n if (!this._silentHtmlAudio) {\n this._silentHtmlAudio = document.createElement(\"audio\");\n\n const audio = this._silentHtmlAudio;\n audio.controls = false;\n audio.preload = \"auto\";\n audio.loop = true;\n\n // Wave data for 0.0001 seconds of silence.\n audio.src = \"data:audio/wav;base64,UklGRjAAAABXQVZFZm10IBAAAAABAAEAgLsAAAB3AQACABAAZGF0YQwAAAAAAAEA/v8CAP//AQA=\";\n\n audio.play();\n }\n\n this.userGestureObservable.notifyObservers();\n };\n\n private _resolveIsReadyPromise: () => void;\n}\n"]}
1
+ {"version":3,"file":"webAudioEngine.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/webAudio/webAudioEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import { Observable } from \"../../Misc/observable\";\nimport type { Nullable } from \"../../types\";\nimport type { AbstractNamedAudioNode } from \"../abstractAudio/abstractAudioNode\";\nimport type { AbstractSoundSource, ISoundSourceOptions } from \"../abstractAudio/abstractSoundSource\";\nimport type { AudioBus, IAudioBusOptions } from \"../abstractAudio/audioBus\";\nimport type { AudioEngineV2State, IAudioEngineV2Options } from \"../abstractAudio/audioEngineV2\";\nimport { AudioEngineV2 } from \"../abstractAudio/audioEngineV2\";\nimport type { IMainAudioBusOptions, MainAudioBus } from \"../abstractAudio/mainAudioBus\";\nimport type { IStaticSoundOptions, StaticSound } from \"../abstractAudio/staticSound\";\nimport type { IStaticSoundBufferOptions, StaticSoundBuffer } from \"../abstractAudio/staticSoundBuffer\";\nimport type { IStreamingSoundOptions, StreamingSound } from \"../abstractAudio/streamingSound\";\nimport type { AbstractSpatialAudioListener } from \"../abstractAudio/subProperties/abstractSpatialAudioListener\";\nimport { _HasSpatialAudioListenerOptions } from \"../abstractAudio/subProperties/abstractSpatialAudioListener\";\nimport type { _SpatialAudioListener } from \"../abstractAudio/subProperties/spatialAudioListener\";\nimport { _CreateSpatialAudioListener } from \"./subProperties/spatialWebAudioListener\";\nimport { _WebAudioMainOut } from \"./webAudioMainOut\";\nimport { _WebAudioUnmuteUI } from \"./webAudioUnmuteUI\";\n\n/**\n * Options for creating a v2 audio engine that uses the WebAudio API.\n */\nexport interface IWebAudioEngineOptions extends IAudioEngineV2Options {\n /**\n * The audio context to be used by the engine.\n */\n audioContext: AudioContext;\n /**\n * The default UI's parent element. Defaults to the last created graphics engine's canvas if it exists; otherwise the HTML document's body.\n */\n defaultUIParentElement?: HTMLElement;\n /**\n * Set to `true` to disable the default UI. Defaults to `false`.\n */\n disableDefaultUI?: boolean;\n /**\n * Set to `true` to automatically resume the audio context when the user interacts with the page. Defaults to `true`.\n */\n resumeOnInteraction: boolean;\n /**\n * Set to `true` to automatically resume the audio context when the browser pauses audio playback. Defaults to `true`.\n */\n resumeOnPause: boolean;\n /**\n * The interval in milliseconds to try resuming audio playback when `resumeOnPause` is `true`. Defaults to `1000`.\n */\n resumeOnPauseRetryInterval: number;\n}\n\n/**\n * Creates a new v2 audio engine that uses the WebAudio API.\n * @param options - The options for creating the audio engine.\n * @returns A promise that resolves with the created audio engine.\n */\nexport async function CreateAudioEngineAsync(options: Partial<IWebAudioEngineOptions> = {}): Promise<AudioEngineV2> {\n const engine = new _WebAudioEngine(options);\n await engine._initAsync(options);\n return engine;\n}\n\nconst FormatMimeTypes: { [key: string]: string } = {\n aac: \"audio/aac\",\n ac3: \"audio/ac3\",\n flac: \"audio/flac\",\n m4a: \"audio/mp4\",\n mp3: 'audio/mpeg; codecs=\"mp3\"',\n mp4: \"audio/mp4\",\n ogg: 'audio/ogg; codecs=\"vorbis\"',\n wav: \"audio/wav\",\n webm: 'audio/webm; codecs=\"vorbis\"',\n};\n\n/** @internal */\nexport class _WebAudioEngine extends AudioEngineV2 {\n private _audioContextStarted = false;\n private _invalidFormats = new Set<string>();\n private readonly _isUsingOfflineAudioContext: boolean = false;\n private _listener: Nullable<_SpatialAudioListener> = null;\n private readonly _listenerAutoUpdate: boolean = true;\n private readonly _listenerMinUpdateTime: number = 0;\n private _mainOut: _WebAudioMainOut;\n private _pauseCalled = false;\n private _resumeOnInteraction = true;\n private _resumeOnPause = true;\n private _resumeOnPauseRetryInterval = 1000;\n private _resumeOnPauseTimerId: any = null;\n private _resumePromise: Nullable<Promise<void>> = null;\n private _silentHtmlAudio: Nullable<HTMLAudioElement> = null;\n private _unmuteUI: Nullable<_WebAudioUnmuteUI> = null;\n private readonly _validFormats = new Set<string>();\n private _volume = 1;\n\n /** @internal */\n public readonly _audioContext: AudioContext;\n\n /** @internal */\n public readonly isReadyPromise: Promise<void> = new Promise((resolve) => {\n this._resolveIsReadyPromise = resolve;\n });\n\n /** @internal */\n public stateChangedObservable: Observable<string> = new Observable();\n\n /** @internal */\n public userGestureObservable: Observable<void> = new Observable();\n\n /** @internal */\n public constructor(options: Partial<IWebAudioEngineOptions> = {}) {\n super(options);\n\n if (typeof options.listenerAutoUpdate === \"boolean\") {\n this._listenerAutoUpdate = options.listenerAutoUpdate;\n }\n\n if (typeof options.listenerMinUpdateTime === \"number\") {\n this._listenerMinUpdateTime = options.listenerMinUpdateTime;\n }\n\n this._volume = options.volume ?? 1;\n\n if (options.audioContext) {\n this._isUsingOfflineAudioContext = options.audioContext instanceof OfflineAudioContext;\n this._audioContext = options.audioContext;\n } else {\n this._audioContext = new AudioContext();\n }\n\n if (!options.disableDefaultUI) {\n this._unmuteUI = new _WebAudioUnmuteUI(this, options.defaultUIParentElement);\n }\n }\n\n /** @internal */\n public async _initAsync(options: Partial<IWebAudioEngineOptions>): Promise<void> {\n this._resumeOnInteraction = typeof options.resumeOnInteraction === \"boolean\" ? options.resumeOnInteraction : true;\n this._resumeOnPause = typeof options.resumeOnPause === \"boolean\" ? options.resumeOnPause : true;\n this._resumeOnPauseRetryInterval = options.resumeOnPauseRetryInterval ?? 1000;\n\n document.addEventListener(\"click\", this._onUserGestureAsync);\n\n await this._initAudioContextAsync();\n\n if (_HasSpatialAudioListenerOptions(options)) {\n this._listener = _CreateSpatialAudioListener(this, this._listenerAutoUpdate, this._listenerMinUpdateTime);\n this._listener.setOptions(options);\n }\n\n this._resolveIsReadyPromise();\n }\n\n /** @internal */\n public get currentTime(): number {\n return this._audioContext.currentTime ?? 0;\n }\n\n /** @internal */\n public get _inNode(): AudioNode {\n return this._audioContext.destination;\n }\n\n /** @internal */\n public get mainOut(): _WebAudioMainOut {\n return this._mainOut;\n }\n\n /** @internal */\n public get listener(): AbstractSpatialAudioListener {\n return this._listener ?? (this._listener = _CreateSpatialAudioListener(this, this._listenerAutoUpdate, this._listenerMinUpdateTime));\n }\n\n /** @internal */\n public get state(): AudioEngineV2State {\n // Always return \"running\" for OfflineAudioContext so sound `play` calls work while the context is suspended.\n return this._isUsingOfflineAudioContext ? \"running\" : this._audioContext.state;\n }\n\n /** @internal */\n public get volume(): number {\n return this._volume;\n }\n\n /** @internal */\n public set volume(value: number) {\n if (this._volume === value) {\n return;\n }\n\n this._volume = value;\n\n if (this._mainOut) {\n this._mainOut.volume = value;\n }\n }\n\n /** @internal */\n public async createBusAsync(name: string, options: Partial<IAudioBusOptions> = {}): Promise<AudioBus> {\n const module = await import(\"./webAudioBus\");\n\n const bus = new module._WebAudioBus(name, this, options);\n await bus._initAsync(options);\n\n return bus;\n }\n\n /** @internal */\n public async createMainBusAsync(name: string, options: Partial<IMainAudioBusOptions> = {}): Promise<MainAudioBus> {\n const module = await import(\"./webAudioMainBus\");\n\n const bus = new module._WebAudioMainBus(name, this);\n await bus._initAsync(options);\n\n return bus;\n }\n\n /** @internal */\n public async createMicrophoneSoundSourceAsync(name: string, options?: Partial<ISoundSourceOptions>): Promise<AbstractSoundSource> {\n let mediaStream: MediaStream;\n\n try {\n mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (e) {\n throw new Error(\"Unable to access microphone: \" + e);\n }\n\n return await this.createSoundSourceAsync(name, new MediaStreamAudioSourceNode(this._audioContext, { mediaStream }), options);\n }\n\n /** @internal */\n public async createSoundAsync(\n name: string,\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options: Partial<IStaticSoundOptions> = {}\n ): Promise<StaticSound> {\n const module = await import(\"./webAudioStaticSound\");\n\n const sound = new module._WebAudioStaticSound(name, this, options);\n await sound._initAsync(source, options);\n\n return sound;\n }\n\n /** @internal */\n public async createSoundBufferAsync(\n source: ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[],\n options: Partial<IStaticSoundBufferOptions> = {}\n ): Promise<StaticSoundBuffer> {\n const module = await import(\"./webAudioStaticSound\");\n\n const soundBuffer = new module._WebAudioStaticSoundBuffer(this);\n await soundBuffer._initAsync(source, options);\n\n return soundBuffer;\n }\n\n /** @internal */\n public async createSoundSourceAsync(name: string, source: AudioNode, options: Partial<ISoundSourceOptions> = {}): Promise<AbstractSoundSource> {\n const module = await import(\"./webAudioSoundSource\");\n\n const soundSource = new module._WebAudioSoundSource(name, source, this, options);\n await soundSource._initAsync(options);\n\n return soundSource;\n }\n\n /** @internal */\n public async createStreamingSoundAsync(name: string, source: HTMLMediaElement | string | string[], options: Partial<IStreamingSoundOptions> = {}): Promise<StreamingSound> {\n const module = await import(\"./webAudioStreamingSound\");\n\n const sound = new module._WebAudioStreamingSound(name, this, options);\n await sound._initAsync(source, options);\n\n return sound;\n }\n\n /** @internal */\n public override dispose(): void {\n super.dispose();\n\n this._listener?.dispose();\n this._listener = null;\n\n // Note that OfflineAudioContext does not have a `close` method.\n if (this._audioContext.state !== \"closed\" && !this._isUsingOfflineAudioContext) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._audioContext.close();\n }\n\n document.removeEventListener(\"click\", this._onUserGestureAsync);\n this._audioContext.removeEventListener(\"statechange\", this._onAudioContextStateChange);\n\n this._silentHtmlAudio?.remove();\n\n this._unmuteUI?.dispose();\n this._unmuteUI = null;\n }\n\n /** @internal */\n public flagInvalidFormat(format: string): void {\n this._invalidFormats.add(format);\n }\n\n /** @internal */\n public isFormatValid(format: string): boolean {\n if (this._validFormats.has(format)) {\n return true;\n }\n\n if (this._invalidFormats.has(format)) {\n return false;\n }\n\n const mimeType = FormatMimeTypes[format];\n if (mimeType === undefined) {\n return false;\n }\n\n const audio = new Audio();\n if (audio.canPlayType(mimeType) === \"\") {\n this._invalidFormats.add(format);\n return false;\n }\n\n this._validFormats.add(format);\n\n return true;\n }\n\n /** @internal */\n public override async pauseAsync(): Promise<void> {\n await this._audioContext.suspend();\n\n this._pauseCalled = true;\n }\n\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\n public override resumeAsync(): Promise<void> {\n this._pauseCalled = false;\n\n if (this._resumePromise) {\n return this._resumePromise;\n }\n\n this._resumePromise = this._audioContext.resume();\n return this._resumePromise;\n }\n\n /** @internal */\n public override _addMainBus(mainBus: MainAudioBus): void {\n super._addMainBus(mainBus);\n }\n\n /** @internal */\n public override _removeMainBus(mainBus: MainAudioBus): void {\n super._removeMainBus(mainBus);\n }\n\n /** @internal */\n public override _addNode(node: AbstractNamedAudioNode): void {\n super._addNode(node);\n }\n\n /** @internal */\n public override _removeNode(node: AbstractNamedAudioNode): void {\n super._removeNode(node);\n }\n\n /** @internal */\n public _setAudioParam(audioParam: AudioParam, value: number) {\n audioParam.linearRampToValueAtTime(value, this.currentTime + this.parameterRampDuration);\n }\n\n private _initAudioContextAsync: () => Promise<void> = async () => {\n this._audioContext.addEventListener(\"statechange\", this._onAudioContextStateChange);\n\n this._mainOut = new _WebAudioMainOut(this);\n this._mainOut.volume = this._volume;\n\n await this.createMainBusAsync(\"default\");\n };\n\n private _onAudioContextStateChange = () => {\n if (this.state === \"running\") {\n clearInterval(this._resumeOnPauseTimerId);\n this._audioContextStarted = true;\n this._resumePromise = null;\n }\n if (this.state === \"suspended\" || this.state === \"interrupted\") {\n if (this._audioContextStarted && this._resumeOnPause && !this._pauseCalled) {\n clearInterval(this._resumeOnPauseTimerId);\n\n this._resumeOnPauseTimerId = setInterval(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.resumeAsync();\n }, this._resumeOnPauseRetryInterval);\n }\n }\n\n this.stateChangedObservable.notifyObservers(this.state);\n };\n\n private _onUserGestureAsync: () => void = async () => {\n if (this._resumeOnInteraction) {\n await this._audioContext.resume();\n }\n\n // On iOS the ringer switch must be turned on for WebAudio to play.\n // This gets WebAudio to play with the ringer switch turned off by playing an HTMLAudioElement.\n if (!this._silentHtmlAudio) {\n this._silentHtmlAudio = document.createElement(\"audio\");\n\n const audio = this._silentHtmlAudio;\n audio.controls = false;\n audio.preload = \"auto\";\n audio.loop = true;\n\n // Wave data for 0.0001 seconds of silence.\n audio.src = \"data:audio/wav;base64,UklGRjAAAABXQVZFZm10IBAAAAABAAEAgLsAAAB3AQACABAAZGF0YQwAAAAAAAEA/v8CAP//AQA=\";\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n audio.play();\n }\n\n this.userGestureObservable.notifyObservers();\n };\n\n private _resolveIsReadyPromise: () => void;\n}\n"]}
@@ -180,6 +180,7 @@ export class _WebAudioStaticSoundBuffer extends StaticSoundBuffer {
180
180
  async _initFromUrlsAsync(urls, skipCodecCheck) {
181
181
  for (const url of urls) {
182
182
  if (skipCodecCheck) {
183
+ // eslint-disable-next-line no-await-in-loop
183
184
  await this._initFromUrlAsync(url);
184
185
  }
185
186
  else {
@@ -187,6 +188,7 @@ export class _WebAudioStaticSoundBuffer extends StaticSoundBuffer {
187
188
  const format = matches?.at(1);
188
189
  if (format && this.engine.isFormatValid(format)) {
189
190
  try {
191
+ // eslint-disable-next-line no-await-in-loop
190
192
  await this._initFromUrlAsync(url);
191
193
  }
192
194
  catch {