@babylonjs/core 7.51.2 → 7.52.0

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 (195) hide show
  1. package/Audio/Interfaces/IAudioEngineOptions.d.ts +2 -0
  2. package/Audio/Interfaces/IAudioEngineOptions.js.map +1 -1
  3. package/AudioV2/abstractAudio/abstractAudioBus.d.ts +22 -0
  4. package/AudioV2/abstractAudio/abstractAudioBus.js +35 -0
  5. package/AudioV2/abstractAudio/abstractAudioBus.js.map +1 -0
  6. package/AudioV2/abstractAudio/abstractAudioNode.d.ts +99 -0
  7. package/AudioV2/abstractAudio/abstractAudioNode.js +149 -0
  8. package/AudioV2/abstractAudio/abstractAudioNode.js.map +1 -0
  9. package/AudioV2/abstractAudio/abstractSound.d.ts +152 -0
  10. package/AudioV2/abstractAudio/abstractSound.js +202 -0
  11. package/AudioV2/abstractAudio/abstractSound.js.map +1 -0
  12. package/AudioV2/abstractAudio/abstractSoundInstance.d.ts +34 -0
  13. package/AudioV2/abstractAudio/abstractSoundInstance.js +35 -0
  14. package/AudioV2/abstractAudio/abstractSoundInstance.js.map +1 -0
  15. package/AudioV2/abstractAudio/audioBus.d.ts +48 -0
  16. package/AudioV2/abstractAudio/audioBus.js +53 -0
  17. package/AudioV2/abstractAudio/audioBus.js.map +1 -0
  18. package/AudioV2/abstractAudio/audioEngineV2.d.ts +193 -0
  19. package/AudioV2/abstractAudio/audioEngineV2.js +155 -0
  20. package/AudioV2/abstractAudio/audioEngineV2.js.map +1 -0
  21. package/AudioV2/abstractAudio/index.d.ts +10 -0
  22. package/AudioV2/abstractAudio/index.js +12 -0
  23. package/AudioV2/abstractAudio/index.js.map +1 -0
  24. package/AudioV2/abstractAudio/mainAudioBus.d.ts +22 -0
  25. package/AudioV2/abstractAudio/mainAudioBus.js +18 -0
  26. package/AudioV2/abstractAudio/mainAudioBus.js.map +1 -0
  27. package/AudioV2/abstractAudio/mainAudioOut.d.ts +13 -0
  28. package/AudioV2/abstractAudio/mainAudioOut.js +15 -0
  29. package/AudioV2/abstractAudio/mainAudioOut.js.map +1 -0
  30. package/AudioV2/abstractAudio/staticSound.d.ts +134 -0
  31. package/AudioV2/abstractAudio/staticSound.js +113 -0
  32. package/AudioV2/abstractAudio/staticSound.js.map +1 -0
  33. package/AudioV2/abstractAudio/staticSoundBuffer.d.ts +46 -0
  34. package/AudioV2/abstractAudio/staticSoundBuffer.js +17 -0
  35. package/AudioV2/abstractAudio/staticSoundBuffer.js.map +1 -0
  36. package/AudioV2/abstractAudio/staticSoundInstance.d.ts +15 -0
  37. package/AudioV2/abstractAudio/staticSoundInstance.js +5 -0
  38. package/AudioV2/abstractAudio/staticSoundInstance.js.map +1 -0
  39. package/AudioV2/abstractAudio/streamingSound.d.ts +77 -0
  40. package/AudioV2/abstractAudio/streamingSound.js +109 -0
  41. package/AudioV2/abstractAudio/streamingSound.js.map +1 -0
  42. package/AudioV2/abstractAudio/streamingSoundInstance.d.ts +25 -0
  43. package/AudioV2/abstractAudio/streamingSoundInstance.js +29 -0
  44. package/AudioV2/abstractAudio/streamingSoundInstance.js.map +1 -0
  45. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.d.ts +53 -0
  46. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js +97 -0
  47. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js.map +1 -0
  48. package/AudioV2/abstractAudio/subNodes/abstractAudioSubNode.d.ts +13 -0
  49. package/AudioV2/abstractAudio/subNodes/abstractAudioSubNode.js +33 -0
  50. package/AudioV2/abstractAudio/subNodes/abstractAudioSubNode.js.map +1 -0
  51. package/AudioV2/abstractAudio/subNodes/audioSubNode.d.ts +6 -0
  52. package/AudioV2/abstractAudio/subNodes/audioSubNode.js +8 -0
  53. package/AudioV2/abstractAudio/subNodes/audioSubNode.js.map +1 -0
  54. package/AudioV2/abstractAudio/subNodes/spatialAudioSubNode.d.ts +31 -0
  55. package/AudioV2/abstractAudio/subNodes/spatialAudioSubNode.js +46 -0
  56. package/AudioV2/abstractAudio/subNodes/spatialAudioSubNode.js.map +1 -0
  57. package/AudioV2/abstractAudio/subNodes/stereoAudioSubNode.d.ts +19 -0
  58. package/AudioV2/abstractAudio/subNodes/stereoAudioSubNode.js +27 -0
  59. package/AudioV2/abstractAudio/subNodes/stereoAudioSubNode.js.map +1 -0
  60. package/AudioV2/abstractAudio/subNodes/volumeAudioSubNode.d.ts +28 -0
  61. package/AudioV2/abstractAudio/subNodes/volumeAudioSubNode.js +24 -0
  62. package/AudioV2/abstractAudio/subNodes/volumeAudioSubNode.js.map +1 -0
  63. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudio.d.ts +187 -0
  64. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudio.js +41 -0
  65. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudio.js.map +1 -0
  66. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudioListener.d.ts +59 -0
  67. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudioListener.js +21 -0
  68. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudioListener.js.map +1 -0
  69. package/AudioV2/abstractAudio/subProperties/abstractStereoAudio.d.ts +38 -0
  70. package/AudioV2/abstractAudio/subProperties/abstractStereoAudio.js +18 -0
  71. package/AudioV2/abstractAudio/subProperties/abstractStereoAudio.js.map +1 -0
  72. package/AudioV2/abstractAudio/subProperties/index.d.ts +3 -0
  73. package/AudioV2/abstractAudio/subProperties/index.js +4 -0
  74. package/AudioV2/abstractAudio/subProperties/index.js.map +1 -0
  75. package/AudioV2/abstractAudio/subProperties/spatialAudio.d.ts +49 -0
  76. package/AudioV2/abstractAudio/subProperties/spatialAudio.js +129 -0
  77. package/AudioV2/abstractAudio/subProperties/spatialAudio.js.map +1 -0
  78. package/AudioV2/abstractAudio/subProperties/spatialAudioListener.d.ts +9 -0
  79. package/AudioV2/abstractAudio/subProperties/spatialAudioListener.js +22 -0
  80. package/AudioV2/abstractAudio/subProperties/spatialAudioListener.js.map +1 -0
  81. package/AudioV2/abstractAudio/subProperties/stereoAudio.d.ts +11 -0
  82. package/AudioV2/abstractAudio/subProperties/stereoAudio.js +18 -0
  83. package/AudioV2/abstractAudio/subProperties/stereoAudio.js.map +1 -0
  84. package/AudioV2/audioUtils.d.ts +3 -0
  85. package/AudioV2/audioUtils.js +6 -0
  86. package/AudioV2/audioUtils.js.map +1 -0
  87. package/AudioV2/index.d.ts +3 -0
  88. package/AudioV2/index.js +5 -0
  89. package/AudioV2/index.js.map +1 -0
  90. package/AudioV2/soundState.d.ts +29 -0
  91. package/AudioV2/soundState.js +31 -0
  92. package/AudioV2/soundState.js.map +1 -0
  93. package/AudioV2/webAudio/index.d.ts +5 -0
  94. package/AudioV2/webAudio/index.js +6 -0
  95. package/AudioV2/webAudio/index.js.map +1 -0
  96. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.d.ts +59 -0
  97. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js +156 -0
  98. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js.map +1 -0
  99. package/AudioV2/webAudio/subNodes/stereoWebAudioSubNode.d.ts +24 -0
  100. package/AudioV2/webAudio/subNodes/stereoWebAudioSubNode.js +55 -0
  101. package/AudioV2/webAudio/subNodes/stereoWebAudioSubNode.js.map +1 -0
  102. package/AudioV2/webAudio/subNodes/volumeWebAudioSubNode.d.ts +24 -0
  103. package/AudioV2/webAudio/subNodes/volumeWebAudioSubNode.js +55 -0
  104. package/AudioV2/webAudio/subNodes/volumeWebAudioSubNode.js.map +1 -0
  105. package/AudioV2/webAudio/subNodes/webAudioBaseSubGraph.d.ts +26 -0
  106. package/AudioV2/webAudio/subNodes/webAudioBaseSubGraph.js +54 -0
  107. package/AudioV2/webAudio/subNodes/webAudioBaseSubGraph.js.map +1 -0
  108. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.d.ts +21 -0
  109. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js +112 -0
  110. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js.map +1 -0
  111. package/AudioV2/webAudio/subProperties/spatialWebAudio.d.ts +10 -0
  112. package/AudioV2/webAudio/subProperties/spatialWebAudio.js +26 -0
  113. package/AudioV2/webAudio/subProperties/spatialWebAudio.js.map +1 -0
  114. package/AudioV2/webAudio/subProperties/spatialWebAudioListener.d.ts +4 -0
  115. package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js +108 -0
  116. package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js.map +1 -0
  117. package/AudioV2/webAudio/webAudioBus.d.ts +35 -0
  118. package/AudioV2/webAudio/webAudioBus.js +63 -0
  119. package/AudioV2/webAudio/webAudioBus.js.map +1 -0
  120. package/AudioV2/webAudio/webAudioEngine.d.ts +110 -0
  121. package/AudioV2/webAudio/webAudioEngine.js +227 -0
  122. package/AudioV2/webAudio/webAudioEngine.js.map +1 -0
  123. package/AudioV2/webAudio/webAudioMainBus.d.ts +29 -0
  124. package/AudioV2/webAudio/webAudioMainBus.js +64 -0
  125. package/AudioV2/webAudio/webAudioMainBus.js.map +1 -0
  126. package/AudioV2/webAudio/webAudioMainOut.d.ts +20 -0
  127. package/AudioV2/webAudio/webAudioMainOut.js +35 -0
  128. package/AudioV2/webAudio/webAudioMainOut.js.map +1 -0
  129. package/AudioV2/webAudio/webAudioNode.d.ts +24 -0
  130. package/AudioV2/webAudio/webAudioNode.js +2 -0
  131. package/AudioV2/webAudio/webAudioNode.js.map +1 -0
  132. package/AudioV2/webAudio/webAudioStaticSound.d.ts +106 -0
  133. package/AudioV2/webAudio/webAudioStaticSound.js +368 -0
  134. package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -0
  135. package/AudioV2/webAudio/webAudioStreamingSound.d.ts +94 -0
  136. package/AudioV2/webAudio/webAudioStreamingSound.js +358 -0
  137. package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -0
  138. package/Engines/ICanvas.d.ts +96 -1
  139. package/Engines/ICanvas.js.map +1 -1
  140. package/Engines/Native/nativeInterfaces.d.ts +7 -1
  141. package/Engines/Native/nativeInterfaces.js.map +1 -1
  142. package/Engines/WebGPU/webgpuTextureManager.js +3 -3
  143. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  144. package/Engines/abstractEngine.d.ts +11 -1
  145. package/Engines/abstractEngine.js +12 -2
  146. package/Engines/abstractEngine.js.map +1 -1
  147. package/Engines/engine.common.js +0 -4
  148. package/Engines/engine.common.js.map +1 -1
  149. package/Engines/engine.d.ts +0 -1
  150. package/Engines/engine.js +0 -1
  151. package/Engines/engine.js.map +1 -1
  152. package/Engines/nativeEngine.d.ts +7 -1
  153. package/Engines/nativeEngine.js +12 -0
  154. package/Engines/nativeEngine.js.map +1 -1
  155. package/FlowGraph/Blocks/Data/Math/flowGraphMatrixMathBlocks.d.ts +5 -1
  156. package/FlowGraph/Blocks/Data/Math/flowGraphMatrixMathBlocks.js +16 -5
  157. package/FlowGraph/Blocks/Data/Math/flowGraphMatrixMathBlocks.js.map +1 -1
  158. package/Layers/effectLayer.d.ts +5 -0
  159. package/Layers/effectLayer.js +7 -0
  160. package/Layers/effectLayer.js.map +1 -1
  161. package/Lights/Shadows/cascadedShadowGenerator.js +33 -20
  162. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  163. package/Loading/sceneLoader.d.ts +25 -11
  164. package/Loading/sceneLoader.js +28 -11
  165. package/Loading/sceneLoader.js.map +1 -1
  166. package/Materials/Textures/hdrCubeTexture.js +4 -1
  167. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  168. package/Materials/material.js +1 -0
  169. package/Materials/material.js.map +1 -1
  170. package/Meshes/csg2.d.ts +2 -2
  171. package/Meshes/csg2.js +2 -2
  172. package/Meshes/csg2.js.map +1 -1
  173. package/Meshes/geometry.js +7 -15
  174. package/Meshes/geometry.js.map +1 -1
  175. package/Meshes/instancedMesh.d.ts +5 -0
  176. package/Meshes/instancedMesh.js +6 -0
  177. package/Meshes/instancedMesh.js.map +1 -1
  178. package/Misc/environmentTextureTools.js +2 -2
  179. package/Misc/environmentTextureTools.js.map +1 -1
  180. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +26 -18
  181. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
  182. package/Shaders/ShadersInclude/shadowMapFragment.js +1 -0
  183. package/Shaders/ShadersInclude/shadowMapFragment.js.map +1 -1
  184. package/Shaders/iblCdfDebug.fragment.js +2 -2
  185. package/Shaders/iblCdfDebug.fragment.js.map +1 -1
  186. package/ShadersWGSL/ShadersInclude/shadowMapFragment.js +1 -0
  187. package/ShadersWGSL/ShadersInclude/shadowMapFragment.js.map +1 -1
  188. package/ShadersWGSL/iblCdfDebug.fragment.js +2 -2
  189. package/ShadersWGSL/iblCdfDebug.fragment.js.map +1 -1
  190. package/index.d.ts +1 -0
  191. package/index.js +1 -0
  192. package/index.js.map +1 -1
  193. package/package.json +1 -1
  194. package/scene.js +8 -0
  195. package/scene.js.map +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webAudioNode.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/webAudio/webAudioNode.ts"],"names":[],"mappings":"","sourcesContent":["import type { Nullable } from \"../../types\";\nimport type { AbstractAudioNode } from \"../abstractAudio/abstractAudioNode\";\nimport type { _AbstractAudioSubNode } from \"../abstractAudio/subNodes/abstractAudioSubNode\";\nimport type { _WebAudioEngine } from \"./webAudioEngine\";\n\n/** @internal */\nexport interface IWebAudioInNode extends AbstractAudioNode {\n /** @internal */\n inNode: Nullable<AudioNode>;\n}\n\n/** @internal */\nexport interface IWebAudioOutNode extends AbstractAudioNode {\n /** @internal */\n outNode: Nullable<AudioNode>;\n}\n\n/** @internal */\nexport interface IWebAudioSubNode extends _AbstractAudioSubNode {\n /** @internal */\n node: AudioNode;\n}\n\n/** @internal */\nexport interface IWebAudioSuperNode extends IWebAudioInNode, IWebAudioOutNode {\n /** @internal */\n engine: _WebAudioEngine;\n}\n"]}
@@ -0,0 +1,106 @@
1
+ import type { Nullable } from "../../types";
2
+ import type { AbstractAudioNode } from "../abstractAudio/abstractAudioNode";
3
+ import type { IStaticSoundOptions, IStaticSoundPlayOptions, IStaticSoundStopOptions, IStaticSoundStoredOptions } from "../abstractAudio/staticSound";
4
+ import { StaticSound } from "../abstractAudio/staticSound";
5
+ import type { IStaticSoundBufferOptions } from "../abstractAudio/staticSoundBuffer";
6
+ import { StaticSoundBuffer } from "../abstractAudio/staticSoundBuffer";
7
+ import type { IStaticSoundInstanceOptions } from "../abstractAudio/staticSoundInstance";
8
+ import { _StaticSoundInstance } from "../abstractAudio/staticSoundInstance";
9
+ import type { _SpatialAudio } from "../abstractAudio/subProperties/spatialAudio";
10
+ import { _StereoAudio } from "../abstractAudio/subProperties/stereoAudio";
11
+ import { _WebAudioBusAndSoundSubGraph } from "./subNodes/webAudioBusAndSoundSubGraph";
12
+ import type { _WebAudioEngine } from "./webAudioEngine";
13
+ import type { IWebAudioInNode, IWebAudioOutNode, IWebAudioSuperNode } from "./webAudioNode";
14
+ type StaticSoundSourceType = ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[];
15
+ /** @internal */
16
+ export declare class _WebAudioStaticSound extends StaticSound implements IWebAudioSuperNode {
17
+ private _buffer;
18
+ private _spatial;
19
+ private _stereo;
20
+ protected readonly _options: IStaticSoundStoredOptions;
21
+ protected _subGraph: _WebAudioBusAndSoundSubGraph;
22
+ /** @internal */
23
+ audioContext: AudioContext | OfflineAudioContext;
24
+ /** @internal */
25
+ readonly engine: _WebAudioEngine;
26
+ /** @internal */
27
+ constructor(name: string, engine: _WebAudioEngine, options: Partial<IStaticSoundOptions>);
28
+ /** @internal */
29
+ init(source: StaticSoundSourceType, options: Partial<IStaticSoundOptions>): Promise<void>;
30
+ /** @internal */
31
+ get buffer(): _WebAudioStaticSoundBuffer;
32
+ /** @internal */
33
+ get inNode(): Nullable<AudioNode>;
34
+ /** @internal */
35
+ get outNode(): Nullable<AudioNode>;
36
+ /** @internal */
37
+ get spatial(): _SpatialAudio;
38
+ /** @internal */
39
+ get stereo(): _StereoAudio;
40
+ /** @internal */
41
+ dispose(): void;
42
+ /** @internal */
43
+ getClassName(): string;
44
+ protected _createInstance(): _WebAudioStaticSoundInstance;
45
+ protected _connect(node: IWebAudioInNode): boolean;
46
+ protected _disconnect(node: IWebAudioInNode): boolean;
47
+ private static _SubGraph;
48
+ }
49
+ /** @internal */
50
+ export declare class _WebAudioStaticSoundBuffer extends StaticSoundBuffer {
51
+ /** @internal */
52
+ audioBuffer: AudioBuffer;
53
+ /** @internal */
54
+ readonly engine: _WebAudioEngine;
55
+ /** @internal */
56
+ constructor(engine: _WebAudioEngine);
57
+ init(source: StaticSoundSourceType, options: Partial<IStaticSoundBufferOptions>): Promise<void>;
58
+ /** @internal */
59
+ get channelCount(): number;
60
+ /** @internal */
61
+ get duration(): number;
62
+ /** @internal */
63
+ get length(): number;
64
+ /** @internal */
65
+ get sampleRate(): number;
66
+ private _initFromArrayBuffer;
67
+ private _initFromUrl;
68
+ private _initFromUrls;
69
+ }
70
+ /** @internal */
71
+ declare class _WebAudioStaticSoundInstance extends _StaticSoundInstance implements IWebAudioOutNode {
72
+ private _enginePlayTime;
73
+ private _enginePauseTime;
74
+ private _sourceNode;
75
+ private _volumeNode;
76
+ protected readonly _options: IStaticSoundInstanceOptions;
77
+ protected _sound: _WebAudioStaticSound;
78
+ /** @internal */
79
+ readonly engine: _WebAudioEngine;
80
+ constructor(sound: _WebAudioStaticSound, options: IStaticSoundInstanceOptions);
81
+ /** @internal */
82
+ get currentTime(): number;
83
+ set currentTime(value: number);
84
+ get outNode(): Nullable<AudioNode>;
85
+ /** @internal */
86
+ get startTime(): number;
87
+ /** @internal */
88
+ dispose(): void;
89
+ /** @internal */
90
+ getClassName(): string;
91
+ /** @internal */
92
+ play(options?: Partial<IStaticSoundPlayOptions>): void;
93
+ /** @internal */
94
+ pause(): void;
95
+ /** @internal */
96
+ resume(): void;
97
+ /** @internal */
98
+ stop(options?: Partial<IStaticSoundStopOptions>): void;
99
+ protected _connect(node: AbstractAudioNode): boolean;
100
+ protected _disconnect(node: AbstractAudioNode): boolean;
101
+ protected _onEnded: () => void;
102
+ private _deinitSourceNode;
103
+ private _initSourceNode;
104
+ private _onEngineStateChanged;
105
+ }
106
+ export {};
@@ -0,0 +1,368 @@
1
+ import { StaticSound } from "../abstractAudio/staticSound.js";
2
+ import { StaticSoundBuffer } from "../abstractAudio/staticSoundBuffer.js";
3
+ import { _StaticSoundInstance } from "../abstractAudio/staticSoundInstance.js";
4
+ import { _StereoAudio } from "../abstractAudio/subProperties/stereoAudio.js";
5
+ import { _CleanUrl, _FileExtensionRegex } from "../audioUtils.js";
6
+ import { _WebAudioBusAndSoundSubGraph } from "./subNodes/webAudioBusAndSoundSubGraph.js";
7
+ import { _SpatialWebAudio } from "./subProperties/spatialWebAudio.js";
8
+ /** @internal */
9
+ export class _WebAudioStaticSound extends StaticSound {
10
+ /** @internal */
11
+ constructor(name, engine, options) {
12
+ super(name, engine, options);
13
+ this._spatial = null;
14
+ this._stereo = null;
15
+ this._options = {
16
+ autoplay: options.autoplay ?? false,
17
+ duration: options.duration ?? 0,
18
+ loop: options.loop ?? false,
19
+ loopEnd: options.loopEnd ?? 0,
20
+ loopStart: options.loopStart ?? 0,
21
+ maxInstances: options.maxInstances ?? Infinity,
22
+ pitch: options.pitch ?? 0,
23
+ playbackRate: options.playbackRate ?? 1,
24
+ startOffset: options.startOffset ?? 0,
25
+ };
26
+ this._subGraph = new _WebAudioStaticSound._SubGraph(this);
27
+ }
28
+ /** @internal */
29
+ async init(source, options) {
30
+ this.audioContext = this.engine.audioContext;
31
+ if (source instanceof _WebAudioStaticSoundBuffer) {
32
+ this._buffer = source;
33
+ }
34
+ else if (typeof source === "string" || Array.isArray(source) || source instanceof ArrayBuffer || source instanceof AudioBuffer) {
35
+ this._buffer = (await this.engine.createSoundBufferAsync(source, options));
36
+ }
37
+ if (options.outBus) {
38
+ this.outBus = options.outBus;
39
+ }
40
+ else {
41
+ await this.engine.isReadyPromise;
42
+ this.outBus = this.engine.defaultMainBus;
43
+ }
44
+ await this._subGraph.init(options);
45
+ if (options.autoplay) {
46
+ this.play();
47
+ }
48
+ this.engine.addNode(this);
49
+ }
50
+ /** @internal */
51
+ get buffer() {
52
+ return this._buffer;
53
+ }
54
+ /** @internal */
55
+ get inNode() {
56
+ return this._subGraph.inNode;
57
+ }
58
+ /** @internal */
59
+ get outNode() {
60
+ return this._subGraph.outNode;
61
+ }
62
+ /** @internal */
63
+ get spatial() {
64
+ return this._spatial ?? (this._spatial = new _SpatialWebAudio(this._subGraph, this._spatialAutoUpdate));
65
+ }
66
+ /** @internal */
67
+ get stereo() {
68
+ return this._stereo ?? (this._stereo = new _StereoAudio(this._subGraph));
69
+ }
70
+ /** @internal */
71
+ dispose() {
72
+ super.dispose();
73
+ this._spatial?.dispose();
74
+ this._spatial = null;
75
+ this._stereo = null;
76
+ this._subGraph.dispose();
77
+ this.engine.removeNode(this);
78
+ }
79
+ /** @internal */
80
+ getClassName() {
81
+ return "_WebAudioStaticSound";
82
+ }
83
+ _createInstance() {
84
+ return new _WebAudioStaticSoundInstance(this, this._options);
85
+ }
86
+ _connect(node) {
87
+ const connected = super._connect(node);
88
+ if (!connected) {
89
+ return false;
90
+ }
91
+ // If the wrapped node is not available now, it will be connected later by the subgraph.
92
+ if (node.inNode) {
93
+ this.outNode?.connect(node.inNode);
94
+ }
95
+ return true;
96
+ }
97
+ _disconnect(node) {
98
+ const disconnected = super._disconnect(node);
99
+ if (!disconnected) {
100
+ return false;
101
+ }
102
+ if (node.inNode) {
103
+ this.outNode?.disconnect(node.inNode);
104
+ }
105
+ return true;
106
+ }
107
+ }
108
+ _WebAudioStaticSound._SubGraph = class extends _WebAudioBusAndSoundSubGraph {
109
+ get _downstreamNodes() {
110
+ return this._owner._downstreamNodes ?? null;
111
+ }
112
+ get _upstreamNodes() {
113
+ return this._owner._upstreamNodes ?? null;
114
+ }
115
+ };
116
+ /** @internal */
117
+ export class _WebAudioStaticSoundBuffer extends StaticSoundBuffer {
118
+ /** @internal */
119
+ constructor(engine) {
120
+ super(engine);
121
+ }
122
+ async init(source, options) {
123
+ if (source instanceof AudioBuffer) {
124
+ this.audioBuffer = source;
125
+ }
126
+ else if (typeof source === "string") {
127
+ await this._initFromUrl(source);
128
+ }
129
+ else if (Array.isArray(source)) {
130
+ await this._initFromUrls(source, options.skipCodecCheck ?? false);
131
+ }
132
+ else if (source instanceof ArrayBuffer) {
133
+ await this._initFromArrayBuffer(source);
134
+ }
135
+ }
136
+ /** @internal */
137
+ get channelCount() {
138
+ return this.audioBuffer.numberOfChannels;
139
+ }
140
+ /** @internal */
141
+ get duration() {
142
+ return this.audioBuffer.duration;
143
+ }
144
+ /** @internal */
145
+ get length() {
146
+ return this.audioBuffer.length;
147
+ }
148
+ /** @internal */
149
+ get sampleRate() {
150
+ return this.audioBuffer.sampleRate;
151
+ }
152
+ async _initFromArrayBuffer(arrayBuffer) {
153
+ this.audioBuffer = await this.engine.audioContext.decodeAudioData(arrayBuffer);
154
+ }
155
+ async _initFromUrl(url) {
156
+ url = _CleanUrl(url);
157
+ await this._initFromArrayBuffer(await (await fetch(url)).arrayBuffer());
158
+ }
159
+ async _initFromUrls(urls, skipCodecCheck) {
160
+ for (const url of urls) {
161
+ if (skipCodecCheck) {
162
+ await this._initFromUrl(url);
163
+ }
164
+ else {
165
+ const matches = url.match(_FileExtensionRegex);
166
+ const format = matches?.at(1);
167
+ if (format && this.engine.isFormatValid(format)) {
168
+ try {
169
+ await this._initFromUrl(url);
170
+ }
171
+ catch (e) {
172
+ if (format && 0 < format.length) {
173
+ this.engine.flagInvalidFormat(format);
174
+ }
175
+ }
176
+ }
177
+ }
178
+ if (this.audioBuffer) {
179
+ break;
180
+ }
181
+ }
182
+ }
183
+ }
184
+ /** @internal */
185
+ class _WebAudioStaticSoundInstance extends _StaticSoundInstance {
186
+ constructor(sound, options) {
187
+ super(sound);
188
+ this._enginePlayTime = 0;
189
+ this._enginePauseTime = 0;
190
+ this._sourceNode = null;
191
+ this._onEnded = () => {
192
+ this._enginePlayTime = 0;
193
+ this.onEndedObservable.notifyObservers(this);
194
+ this._deinitSourceNode();
195
+ };
196
+ this._onEngineStateChanged = () => {
197
+ if (this.engine.state !== "running") {
198
+ return;
199
+ }
200
+ if (this._options.loop && this.state === 2 /* SoundState.Starting */) {
201
+ this.play();
202
+ }
203
+ this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged);
204
+ };
205
+ this._options = options;
206
+ this._volumeNode = new GainNode(sound.audioContext);
207
+ this._initSourceNode();
208
+ }
209
+ /** @internal */
210
+ get currentTime() {
211
+ if (this._state === 1 /* SoundState.Stopped */) {
212
+ return 0;
213
+ }
214
+ const timeSinceLastStart = this._state === 5 /* SoundState.Paused */ ? 0 : this.engine.currentTime - this._enginePlayTime;
215
+ return this._enginePauseTime + timeSinceLastStart + this._options.startOffset;
216
+ }
217
+ set currentTime(value) {
218
+ const restart = this._state === 2 /* SoundState.Starting */ || this._state === 3 /* SoundState.Started */;
219
+ if (restart) {
220
+ this.stop();
221
+ this._deinitSourceNode();
222
+ }
223
+ this._options.startOffset = value;
224
+ if (restart) {
225
+ this.play();
226
+ }
227
+ }
228
+ get outNode() {
229
+ return this._volumeNode;
230
+ }
231
+ /** @internal */
232
+ get startTime() {
233
+ if (this._state === 1 /* SoundState.Stopped */) {
234
+ return 0;
235
+ }
236
+ return this._enginePlayTime;
237
+ }
238
+ /** @internal */
239
+ dispose() {
240
+ super.dispose();
241
+ this._sourceNode = null;
242
+ this.stop();
243
+ this._deinitSourceNode();
244
+ this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged);
245
+ }
246
+ /** @internal */
247
+ getClassName() {
248
+ return "_WebAudioStaticSoundInstance";
249
+ }
250
+ /** @internal */
251
+ play(options = {}) {
252
+ if (this._state === 3 /* SoundState.Started */) {
253
+ return;
254
+ }
255
+ if (options.duration !== undefined) {
256
+ this._options.duration = options.duration;
257
+ }
258
+ if (options.loop !== undefined) {
259
+ this._options.loop = options.loop;
260
+ }
261
+ if (options.loopStart !== undefined) {
262
+ this._options.loopStart = options.loopStart;
263
+ }
264
+ if (options.loopEnd !== undefined) {
265
+ this._options.loopEnd = options.loopEnd;
266
+ }
267
+ if (options.pitch !== undefined) {
268
+ this._options.pitch = options.pitch;
269
+ }
270
+ if (options.playbackRate !== undefined) {
271
+ this._options.playbackRate = options.playbackRate;
272
+ }
273
+ if (options.startOffset !== undefined) {
274
+ this._options.startOffset = options.startOffset;
275
+ }
276
+ let startOffset = this._options.startOffset;
277
+ if (this._state === 5 /* SoundState.Paused */) {
278
+ startOffset += this.currentTime;
279
+ startOffset %= this._sound.buffer.duration;
280
+ }
281
+ this._enginePlayTime = this.engine.currentTime + (options.waitTime ?? 0);
282
+ this._volumeNode.gain.value = options.volume ?? 1;
283
+ this._initSourceNode();
284
+ if (this.engine.state === "running") {
285
+ this._setState(3 /* SoundState.Started */);
286
+ this._sourceNode?.start(this._enginePlayTime, startOffset, this._options.duration > 0 ? this._options.duration : undefined);
287
+ }
288
+ else if (this._options.loop) {
289
+ this._setState(2 /* SoundState.Starting */);
290
+ this.engine.stateChangedObservable.add(this._onEngineStateChanged);
291
+ }
292
+ }
293
+ /** @internal */
294
+ pause() {
295
+ if (this._state === 5 /* SoundState.Paused */) {
296
+ return;
297
+ }
298
+ this._setState(5 /* SoundState.Paused */);
299
+ this._enginePauseTime += this.engine.currentTime - this._enginePlayTime;
300
+ this._sourceNode?.stop();
301
+ this._deinitSourceNode();
302
+ }
303
+ /** @internal */
304
+ resume() {
305
+ if (this._state === 5 /* SoundState.Paused */) {
306
+ this.play();
307
+ }
308
+ }
309
+ /** @internal */
310
+ stop(options = {}) {
311
+ if (this._state === 1 /* SoundState.Stopped */) {
312
+ return;
313
+ }
314
+ this._setState(1 /* SoundState.Stopped */);
315
+ const engineStopTime = this.engine.currentTime + (options.waitTime ?? 0);
316
+ this._sourceNode?.stop(engineStopTime);
317
+ this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged);
318
+ }
319
+ _connect(node) {
320
+ const connected = super._connect(node);
321
+ if (!connected) {
322
+ return false;
323
+ }
324
+ // If the wrapped node is not available now, it will be connected later by the sound's subgraph.
325
+ if (node instanceof _WebAudioStaticSound && node.inNode) {
326
+ this.outNode?.connect(node.inNode);
327
+ }
328
+ return true;
329
+ }
330
+ _disconnect(node) {
331
+ const disconnected = super._disconnect(node);
332
+ if (!disconnected) {
333
+ return false;
334
+ }
335
+ if (node instanceof _WebAudioStaticSound && node.inNode) {
336
+ this.outNode?.disconnect(node.inNode);
337
+ }
338
+ return true;
339
+ }
340
+ _deinitSourceNode() {
341
+ if (!this._sourceNode) {
342
+ return;
343
+ }
344
+ if (!this._disconnect(this._sound)) {
345
+ throw new Error("Disconnect failed");
346
+ }
347
+ this._sourceNode.disconnect(this._volumeNode);
348
+ this._sourceNode.removeEventListener("ended", this._onEnded);
349
+ this._sourceNode = null;
350
+ }
351
+ _initSourceNode() {
352
+ if (!this._sourceNode) {
353
+ this._sourceNode = new AudioBufferSourceNode(this._sound.audioContext, { buffer: this._sound.buffer.audioBuffer });
354
+ this._sourceNode.addEventListener("ended", this._onEnded, { once: true });
355
+ this._sourceNode.connect(this._volumeNode);
356
+ if (!this._connect(this._sound)) {
357
+ throw new Error("Connect failed");
358
+ }
359
+ }
360
+ const node = this._sourceNode;
361
+ node.detune.value = this._options.pitch;
362
+ node.loop = this._options.loop;
363
+ node.loopEnd = this._options.loopEnd;
364
+ node.loopStart = this._options.loopStart;
365
+ node.playbackRate.value = this._options.playbackRate;
366
+ }
367
+ }
368
+ //# sourceMappingURL=webAudioStaticSound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webAudioStaticSound.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/webAudio/webAudioStaticSound.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\nimport type { AbstractAudioNode } from \"../abstractAudio/abstractAudioNode\";\nimport type { IStaticSoundOptions, IStaticSoundPlayOptions, IStaticSoundStopOptions, IStaticSoundStoredOptions } from \"../abstractAudio/staticSound\";\nimport { StaticSound } from \"../abstractAudio/staticSound\";\nimport type { IStaticSoundBufferOptions } from \"../abstractAudio/staticSoundBuffer\";\nimport { StaticSoundBuffer } from \"../abstractAudio/staticSoundBuffer\";\nimport type { IStaticSoundInstanceOptions } from \"../abstractAudio/staticSoundInstance\";\nimport { _StaticSoundInstance } from \"../abstractAudio/staticSoundInstance\";\nimport type { _SpatialAudio } from \"../abstractAudio/subProperties/spatialAudio\";\nimport { _StereoAudio } from \"../abstractAudio/subProperties/stereoAudio\";\nimport { _CleanUrl, _FileExtensionRegex } from \"../audioUtils\";\nimport { SoundState } from \"../soundState\";\nimport { _WebAudioBusAndSoundSubGraph } from \"./subNodes/webAudioBusAndSoundSubGraph\";\nimport { _SpatialWebAudio } from \"./subProperties/spatialWebAudio\";\nimport type { _WebAudioEngine } from \"./webAudioEngine\";\nimport type { IWebAudioInNode, IWebAudioOutNode, IWebAudioSuperNode } from \"./webAudioNode\";\n\ntype StaticSoundSourceType = ArrayBuffer | AudioBuffer | StaticSoundBuffer | string | string[];\n\n/** @internal */\nexport class _WebAudioStaticSound extends StaticSound implements IWebAudioSuperNode {\n private _buffer: _WebAudioStaticSoundBuffer;\n private _spatial: Nullable<_SpatialWebAudio> = null;\n private _stereo: Nullable<_StereoAudio> = null;\n\n protected override readonly _options: IStaticSoundStoredOptions;\n protected _subGraph: _WebAudioBusAndSoundSubGraph;\n\n /** @internal */\n public audioContext: AudioContext | OfflineAudioContext;\n\n /** @internal */\n public override readonly engine: _WebAudioEngine;\n\n /** @internal */\n public constructor(name: string, engine: _WebAudioEngine, options: Partial<IStaticSoundOptions>) {\n super(name, engine, options);\n\n this._options = {\n autoplay: options.autoplay ?? false,\n duration: options.duration ?? 0,\n loop: options.loop ?? false,\n loopEnd: options.loopEnd ?? 0,\n loopStart: options.loopStart ?? 0,\n maxInstances: options.maxInstances ?? Infinity,\n pitch: options.pitch ?? 0,\n playbackRate: options.playbackRate ?? 1,\n startOffset: options.startOffset ?? 0,\n };\n\n this._subGraph = new _WebAudioStaticSound._SubGraph(this);\n }\n\n /** @internal */\n public async init(source: StaticSoundSourceType, options: Partial<IStaticSoundOptions>): Promise<void> {\n this.audioContext = this.engine.audioContext;\n\n if (source instanceof _WebAudioStaticSoundBuffer) {\n this._buffer = source as _WebAudioStaticSoundBuffer;\n } else if (typeof source === \"string\" || Array.isArray(source) || source instanceof ArrayBuffer || source instanceof AudioBuffer) {\n this._buffer = (await this.engine.createSoundBufferAsync(source, options)) as _WebAudioStaticSoundBuffer;\n }\n\n if (options.outBus) {\n this.outBus = options.outBus;\n } else {\n await this.engine.isReadyPromise;\n this.outBus = this.engine.defaultMainBus;\n }\n\n await this._subGraph.init(options);\n\n if (options.autoplay) {\n this.play();\n }\n\n this.engine.addNode(this);\n }\n\n /** @internal */\n public get buffer(): _WebAudioStaticSoundBuffer {\n return this._buffer;\n }\n\n /** @internal */\n public get inNode() {\n return this._subGraph.inNode;\n }\n\n /** @internal */\n public get outNode() {\n return this._subGraph.outNode;\n }\n\n /** @internal */\n public override get spatial(): _SpatialAudio {\n return this._spatial ?? (this._spatial = new _SpatialWebAudio(this._subGraph, this._spatialAutoUpdate));\n }\n\n /** @internal */\n public override get stereo(): _StereoAudio {\n return this._stereo ?? (this._stereo = new _StereoAudio(this._subGraph));\n }\n\n /** @internal */\n public override dispose(): void {\n super.dispose();\n\n this._spatial?.dispose();\n this._spatial = null;\n\n this._stereo = null;\n\n this._subGraph.dispose();\n\n this.engine.removeNode(this);\n }\n\n /** @internal */\n public getClassName(): string {\n return \"_WebAudioStaticSound\";\n }\n\n protected _createInstance(): _WebAudioStaticSoundInstance {\n return new _WebAudioStaticSoundInstance(this, this._options);\n }\n\n protected override _connect(node: IWebAudioInNode): boolean {\n const connected = super._connect(node);\n\n if (!connected) {\n return false;\n }\n\n // If the wrapped node is not available now, it will be connected later by the subgraph.\n if (node.inNode) {\n this.outNode?.connect(node.inNode);\n }\n\n return true;\n }\n\n protected override _disconnect(node: IWebAudioInNode): boolean {\n const disconnected = super._disconnect(node);\n\n if (!disconnected) {\n return false;\n }\n\n if (node.inNode) {\n this.outNode?.disconnect(node.inNode);\n }\n\n return true;\n }\n\n private static _SubGraph = class extends _WebAudioBusAndSoundSubGraph {\n protected override _owner: _WebAudioStaticSound;\n\n protected get _downstreamNodes(): Nullable<Set<AbstractAudioNode>> {\n return this._owner._downstreamNodes ?? null;\n }\n\n protected get _upstreamNodes(): Nullable<Set<AbstractAudioNode>> {\n return this._owner._upstreamNodes ?? null;\n }\n };\n}\n\n/** @internal */\nexport class _WebAudioStaticSoundBuffer extends StaticSoundBuffer {\n /** @internal */\n public audioBuffer: AudioBuffer;\n\n /** @internal */\n public override readonly engine: _WebAudioEngine;\n\n /** @internal */\n public constructor(engine: _WebAudioEngine) {\n super(engine);\n }\n\n public async init(source: StaticSoundSourceType, options: Partial<IStaticSoundBufferOptions>): Promise<void> {\n if (source instanceof AudioBuffer) {\n this.audioBuffer = source;\n } else if (typeof source === \"string\") {\n await this._initFromUrl(source);\n } else if (Array.isArray(source)) {\n await this._initFromUrls(source, options.skipCodecCheck ?? false);\n } else if (source instanceof ArrayBuffer) {\n await this._initFromArrayBuffer(source);\n }\n }\n\n /** @internal */\n public get channelCount(): number {\n return this.audioBuffer.numberOfChannels;\n }\n\n /** @internal */\n public get duration(): number {\n return this.audioBuffer.duration;\n }\n\n /** @internal */\n public get length(): number {\n return this.audioBuffer.length;\n }\n\n /** @internal */\n public get sampleRate(): number {\n return this.audioBuffer.sampleRate;\n }\n\n private async _initFromArrayBuffer(arrayBuffer: ArrayBuffer): Promise<void> {\n this.audioBuffer = await this.engine.audioContext.decodeAudioData(arrayBuffer);\n }\n\n private async _initFromUrl(url: string): Promise<void> {\n url = _CleanUrl(url);\n await this._initFromArrayBuffer(await (await fetch(url)).arrayBuffer());\n }\n\n private async _initFromUrls(urls: string[], skipCodecCheck: boolean): Promise<void> {\n for (const url of urls) {\n if (skipCodecCheck) {\n await this._initFromUrl(url);\n } else {\n const matches = url.match(_FileExtensionRegex);\n const format = matches?.at(1);\n if (format && this.engine.isFormatValid(format)) {\n try {\n await this._initFromUrl(url);\n } catch (e) {\n if (format && 0 < format.length) {\n this.engine.flagInvalidFormat(format);\n }\n }\n }\n }\n\n if (this.audioBuffer) {\n break;\n }\n }\n }\n}\n\n/** @internal */\nclass _WebAudioStaticSoundInstance extends _StaticSoundInstance implements IWebAudioOutNode {\n private _enginePlayTime: number = 0;\n private _enginePauseTime: number = 0;\n private _sourceNode: Nullable<AudioBufferSourceNode> = null;\n private _volumeNode: GainNode;\n\n protected override readonly _options: IStaticSoundInstanceOptions;\n protected override _sound: _WebAudioStaticSound;\n\n /** @internal */\n public override readonly engine: _WebAudioEngine;\n\n public constructor(sound: _WebAudioStaticSound, options: IStaticSoundInstanceOptions) {\n super(sound);\n\n this._options = options;\n\n this._volumeNode = new GainNode(sound.audioContext);\n this._initSourceNode();\n }\n\n /** @internal */\n public get currentTime(): number {\n if (this._state === SoundState.Stopped) {\n return 0;\n }\n\n const timeSinceLastStart = this._state === SoundState.Paused ? 0 : this.engine.currentTime - this._enginePlayTime;\n return this._enginePauseTime + timeSinceLastStart + this._options.startOffset;\n }\n\n public set currentTime(value: number) {\n const restart = this._state === SoundState.Starting || this._state === SoundState.Started;\n\n if (restart) {\n this.stop();\n this._deinitSourceNode();\n }\n\n this._options.startOffset = value;\n\n if (restart) {\n this.play();\n }\n }\n\n public get outNode(): Nullable<AudioNode> {\n return this._volumeNode;\n }\n\n /** @internal */\n public get startTime(): number {\n if (this._state === SoundState.Stopped) {\n return 0;\n }\n\n return this._enginePlayTime;\n }\n\n /** @internal */\n public override dispose(): void {\n super.dispose();\n\n this._sourceNode = null;\n\n this.stop();\n\n this._deinitSourceNode();\n\n this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged);\n }\n\n /** @internal */\n public getClassName(): string {\n return \"_WebAudioStaticSoundInstance\";\n }\n\n /** @internal */\n public play(options: Partial<IStaticSoundPlayOptions> = {}): void {\n if (this._state === SoundState.Started) {\n return;\n }\n\n if (options.duration !== undefined) {\n this._options.duration = options.duration;\n }\n if (options.loop !== undefined) {\n this._options.loop = options.loop;\n }\n if (options.loopStart !== undefined) {\n this._options.loopStart = options.loopStart;\n }\n if (options.loopEnd !== undefined) {\n this._options.loopEnd = options.loopEnd;\n }\n if (options.pitch !== undefined) {\n this._options.pitch = options.pitch;\n }\n if (options.playbackRate !== undefined) {\n this._options.playbackRate = options.playbackRate;\n }\n if (options.startOffset !== undefined) {\n this._options.startOffset = options.startOffset;\n }\n\n let startOffset = this._options.startOffset;\n\n if (this._state === SoundState.Paused) {\n startOffset += this.currentTime;\n startOffset %= this._sound.buffer.duration;\n }\n\n this._enginePlayTime = this.engine.currentTime + (options.waitTime ?? 0);\n\n this._volumeNode.gain.value = options.volume ?? 1;\n\n this._initSourceNode();\n\n if (this.engine.state === \"running\") {\n this._setState(SoundState.Started);\n this._sourceNode?.start(this._enginePlayTime, startOffset, this._options.duration > 0 ? this._options.duration : undefined);\n } else if (this._options.loop) {\n this._setState(SoundState.Starting);\n this.engine.stateChangedObservable.add(this._onEngineStateChanged);\n }\n }\n\n /** @internal */\n public pause(): void {\n if (this._state === SoundState.Paused) {\n return;\n }\n\n this._setState(SoundState.Paused);\n this._enginePauseTime += this.engine.currentTime - this._enginePlayTime;\n\n this._sourceNode?.stop();\n this._deinitSourceNode();\n }\n\n /** @internal */\n public resume(): void {\n if (this._state === SoundState.Paused) {\n this.play();\n }\n }\n\n /** @internal */\n public stop(options: Partial<IStaticSoundStopOptions> = {}): void {\n if (this._state === SoundState.Stopped) {\n return;\n }\n\n this._setState(SoundState.Stopped);\n\n const engineStopTime = this.engine.currentTime + (options.waitTime ?? 0);\n this._sourceNode?.stop(engineStopTime);\n\n this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged);\n }\n\n protected override _connect(node: AbstractAudioNode): boolean {\n const connected = super._connect(node);\n\n if (!connected) {\n return false;\n }\n\n // If the wrapped node is not available now, it will be connected later by the sound's subgraph.\n if (node instanceof _WebAudioStaticSound && node.inNode) {\n this.outNode?.connect(node.inNode);\n }\n\n return true;\n }\n\n protected override _disconnect(node: AbstractAudioNode): boolean {\n const disconnected = super._disconnect(node);\n\n if (!disconnected) {\n return false;\n }\n\n if (node instanceof _WebAudioStaticSound && node.inNode) {\n this.outNode?.disconnect(node.inNode);\n }\n\n return true;\n }\n\n protected _onEnded = () => {\n this._enginePlayTime = 0;\n\n this.onEndedObservable.notifyObservers(this);\n this._deinitSourceNode();\n };\n\n private _deinitSourceNode(): void {\n if (!this._sourceNode) {\n return;\n }\n\n if (!this._disconnect(this._sound)) {\n throw new Error(\"Disconnect failed\");\n }\n\n this._sourceNode.disconnect(this._volumeNode);\n this._sourceNode.removeEventListener(\"ended\", this._onEnded);\n\n this._sourceNode = null;\n }\n\n private _initSourceNode(): void {\n if (!this._sourceNode) {\n this._sourceNode = new AudioBufferSourceNode(this._sound.audioContext, { buffer: this._sound.buffer.audioBuffer });\n\n this._sourceNode.addEventListener(\"ended\", this._onEnded, { once: true });\n this._sourceNode.connect(this._volumeNode);\n\n if (!this._connect(this._sound)) {\n throw new Error(\"Connect failed\");\n }\n }\n\n const node = this._sourceNode;\n node.detune.value = this._options.pitch;\n node.loop = this._options.loop;\n node.loopEnd = this._options.loopEnd;\n node.loopStart = this._options.loopStart;\n node.playbackRate.value = this._options.playbackRate;\n }\n\n private _onEngineStateChanged = () => {\n if (this.engine.state !== \"running\") {\n return;\n }\n\n if (this._options.loop && this.state === SoundState.Starting) {\n this.play();\n }\n\n this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged);\n };\n}\n"]}
@@ -0,0 +1,94 @@
1
+ import type { Nullable } from "../../types";
2
+ import type { AbstractAudioNode } from "../abstractAudio/abstractAudioNode";
3
+ import type { IStreamingSoundOptions, IStreamingSoundPlayOptions, IStreamingSoundStoredOptions } from "../abstractAudio/streamingSound";
4
+ import { StreamingSound } from "../abstractAudio/streamingSound";
5
+ import { _StreamingSoundInstance } from "../abstractAudio/streamingSoundInstance";
6
+ import type { _SpatialAudio } from "../abstractAudio/subProperties/spatialAudio";
7
+ import { _StereoAudio } from "../abstractAudio/subProperties/stereoAudio";
8
+ import { _WebAudioBusAndSoundSubGraph } from "./subNodes/webAudioBusAndSoundSubGraph";
9
+ import type { _WebAudioEngine } from "./webAudioEngine";
10
+ import type { IWebAudioInNode, IWebAudioOutNode, IWebAudioSuperNode } from "./webAudioNode";
11
+ type StreamingSoundSourceType = HTMLMediaElement | string | string[];
12
+ /** @internal */
13
+ export declare class _WebAudioStreamingSound extends StreamingSound implements IWebAudioSuperNode {
14
+ private _spatial;
15
+ private _stereo;
16
+ protected readonly _options: IStreamingSoundStoredOptions;
17
+ protected _subGraph: _WebAudioBusAndSoundSubGraph;
18
+ /** @internal */
19
+ audioContext: AudioContext;
20
+ /** @internal */
21
+ readonly engine: _WebAudioEngine;
22
+ /** @internal */
23
+ source: StreamingSoundSourceType;
24
+ /** @internal */
25
+ constructor(name: string, engine: _WebAudioEngine, options: Partial<IStreamingSoundOptions>);
26
+ /** @internal */
27
+ init(source: StreamingSoundSourceType, options: Partial<IStreamingSoundOptions>): Promise<void>;
28
+ /** @internal */
29
+ get inNode(): Nullable<AudioNode>;
30
+ /** @internal */
31
+ get outNode(): Nullable<AudioNode>;
32
+ /** @internal */
33
+ get spatial(): _SpatialAudio;
34
+ /** @internal */
35
+ get stereo(): _StereoAudio;
36
+ /** @internal */
37
+ dispose(): void;
38
+ /** @internal */
39
+ getClassName(): string;
40
+ protected _createInstance(): _WebAudioStreamingSoundInstance;
41
+ protected _connect(node: IWebAudioInNode): boolean;
42
+ protected _disconnect(node: IWebAudioInNode): boolean;
43
+ private static _SubGraph;
44
+ }
45
+ /** @internal */
46
+ declare class _WebAudioStreamingSoundInstance extends _StreamingSoundInstance implements IWebAudioOutNode {
47
+ private _currentTimeChangedWhilePaused;
48
+ private _enginePlayTime;
49
+ private _enginePauseTime;
50
+ private _isReady;
51
+ private _isReadyPromise;
52
+ private _mediaElement;
53
+ private _sourceNode;
54
+ private _volumeNode;
55
+ protected readonly _options: IStreamingSoundStoredOptions;
56
+ protected _sound: _WebAudioStreamingSound;
57
+ /** @internal */
58
+ readonly engine: _WebAudioEngine;
59
+ constructor(sound: _WebAudioStreamingSound, options: IStreamingSoundStoredOptions);
60
+ /** @internal */
61
+ get currentTime(): number;
62
+ set currentTime(value: number);
63
+ get outNode(): Nullable<AudioNode>;
64
+ /** @internal */
65
+ get startTime(): number;
66
+ /** @internal */
67
+ dispose(): void;
68
+ /** @internal */
69
+ play(options?: Partial<IStreamingSoundPlayOptions>): void;
70
+ /** @internal */
71
+ pause(): void;
72
+ /** @internal */
73
+ resume(): void;
74
+ /** @internal */
75
+ stop(): void;
76
+ /** @internal */
77
+ getClassName(): string;
78
+ protected _connect(node: AbstractAudioNode): boolean;
79
+ protected _disconnect(node: AbstractAudioNode): boolean;
80
+ private _initFromMediaElement;
81
+ private _initFromUrl;
82
+ private _initFromUrls;
83
+ private _onCanPlayThrough;
84
+ private _onEnded;
85
+ private _onError;
86
+ private _onEngineStateChanged;
87
+ private _onUserGesture;
88
+ private _play;
89
+ private _playWhenReady;
90
+ private _rejectIsReadyPromise;
91
+ private _resolveIsReadyPromise;
92
+ private _stop;
93
+ }
94
+ export {};