@babylonjs/core 7.51.3 → 7.52.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) 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/abstractEngine.d.ts +6 -1
  139. package/Engines/abstractEngine.js +8 -5
  140. package/Engines/abstractEngine.js.map +1 -1
  141. package/Engines/engine.common.js +0 -4
  142. package/Engines/engine.common.js.map +1 -1
  143. package/Engines/engine.d.ts +0 -1
  144. package/Engines/engine.js +0 -1
  145. package/Engines/engine.js.map +1 -1
  146. package/Lights/Shadows/cascadedShadowGenerator.js +33 -20
  147. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  148. package/Materials/Textures/hdrCubeTexture.js +4 -1
  149. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  150. package/Meshes/geometry.js +7 -15
  151. package/Meshes/geometry.js.map +1 -1
  152. package/Misc/fileTools.d.ts +3 -1
  153. package/Misc/fileTools.js +2 -2
  154. package/Misc/fileTools.js.map +1 -1
  155. package/Shaders/ShadersInclude/shadowMapFragment.js +1 -0
  156. package/Shaders/ShadersInclude/shadowMapFragment.js.map +1 -1
  157. package/Shaders/iblCdfDebug.fragment.js +2 -2
  158. package/Shaders/iblCdfDebug.fragment.js.map +1 -1
  159. package/ShadersWGSL/ShadersInclude/shadowMapFragment.js +1 -0
  160. package/ShadersWGSL/ShadersInclude/shadowMapFragment.js.map +1 -1
  161. package/ShadersWGSL/iblCdfDebug.fragment.js +2 -2
  162. package/ShadersWGSL/iblCdfDebug.fragment.js.map +1 -1
  163. package/index.d.ts +1 -0
  164. package/index.js +1 -0
  165. package/index.js.map +1 -1
  166. package/package.json +1 -1
@@ -0,0 +1,15 @@
1
+ import type { IAbstractSoundInstanceOptions } from "./abstractSoundInstance";
2
+ import { _AbstractSoundInstance } from "./abstractSoundInstance";
3
+ import type { IStaticSoundOptionsBase, IStaticSoundPlayOptions, IStaticSoundStopOptions } from "./staticSound";
4
+ /**
5
+ * Options for creating a static sound instance.
6
+ * @internal
7
+ */
8
+ export interface IStaticSoundInstanceOptions extends IAbstractSoundInstanceOptions, IStaticSoundOptionsBase {
9
+ }
10
+ /** @internal */
11
+ export declare abstract class _StaticSoundInstance extends _AbstractSoundInstance {
12
+ protected abstract readonly _options: IStaticSoundInstanceOptions;
13
+ abstract play(options: Partial<IStaticSoundPlayOptions>): void;
14
+ abstract stop(options?: Partial<IStaticSoundStopOptions>): void;
15
+ }
@@ -0,0 +1,5 @@
1
+ import { _AbstractSoundInstance } from "./abstractSoundInstance.js";
2
+ /** @internal */
3
+ export class _StaticSoundInstance extends _AbstractSoundInstance {
4
+ }
5
+ //# sourceMappingURL=staticSoundInstance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticSoundInstance.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/abstractAudio/staticSoundInstance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AASjE,gBAAgB;AAChB,MAAM,OAAgB,oBAAqB,SAAQ,sBAAsB;CAKxE","sourcesContent":["import type { IAbstractSoundInstanceOptions } from \"./abstractSoundInstance\";\nimport { _AbstractSoundInstance } from \"./abstractSoundInstance\";\nimport type { IStaticSoundOptionsBase, IStaticSoundPlayOptions, IStaticSoundStopOptions } from \"./staticSound\";\n\n/**\n * Options for creating a static sound instance.\n * @internal\n */\nexport interface IStaticSoundInstanceOptions extends IAbstractSoundInstanceOptions, IStaticSoundOptionsBase {}\n\n/** @internal */\nexport abstract class _StaticSoundInstance extends _AbstractSoundInstance {\n protected abstract override readonly _options: IStaticSoundInstanceOptions;\n\n public abstract override play(options: Partial<IStaticSoundPlayOptions>): void;\n public abstract override stop(options?: Partial<IStaticSoundStopOptions>): void;\n}\n"]}
@@ -0,0 +1,77 @@
1
+ import type { IAbstractSoundOptions, IAbstractSoundPlayOptions, IAbstractSoundStoredOptions } from "./abstractSound";
2
+ import { AbstractSound } from "./abstractSound";
3
+ import type { AudioEngineV2 } from "./audioEngineV2";
4
+ import type { _StreamingSoundInstance } from "./streamingSoundInstance";
5
+ /** @internal */
6
+ export interface IStreamingSoundOptionsBase {
7
+ /**
8
+ * The number of instances to preload. Defaults to 1.
9
+ * */
10
+ preloadCount: number;
11
+ }
12
+ /**
13
+ * Options for creating a streaming sound.
14
+ */
15
+ export interface IStreamingSoundOptions extends IAbstractSoundOptions, IStreamingSoundOptionsBase {
16
+ }
17
+ /**
18
+ * Options for playing a streaming sound.
19
+ */
20
+ export interface IStreamingSoundPlayOptions extends IAbstractSoundPlayOptions {
21
+ }
22
+ /**
23
+ * Options stored in a streaming sound.
24
+ * @internal
25
+ */
26
+ export interface IStreamingSoundStoredOptions extends IAbstractSoundStoredOptions, IStreamingSoundOptionsBase {
27
+ }
28
+ /**
29
+ * Abstract class representing a streaming sound.
30
+ *
31
+ * A streaming sound has a sound buffer that is loaded into memory in chunks as it is played. This allows it to be played
32
+ * more quickly than a static sound, but it also means that it cannot have loop points or playback rate changes.
33
+ *
34
+ * Due to the way streaming sounds are typically implemented, there can be a significant delay when attempting to play
35
+ * a streaming sound for the first time. To prevent this delay, it is recommended to preload instances of the sound
36
+ * using the {@link IStreamingSoundStoredOptions.preloadCount} options, or the {@link preloadInstance} and
37
+ * {@link preloadInstances} methods before calling the `play` method.
38
+ *
39
+ * Streaming sounds are created by the {@link CreateStreamingSoundAsync} function.
40
+ */
41
+ export declare abstract class StreamingSound extends AbstractSound {
42
+ private _preloadedInstances;
43
+ protected abstract readonly _options: IStreamingSoundStoredOptions;
44
+ protected constructor(name: string, engine: AudioEngineV2, options: Partial<IStreamingSoundOptions>);
45
+ /**
46
+ * The number of instances to preload.
47
+ */
48
+ get preloadCount(): number;
49
+ /**
50
+ * Returns the number of instances that have been preloaded.
51
+ */
52
+ get preloadCompletedCount(): number;
53
+ /**
54
+ * Preloads an instance of the sound.
55
+ * @returns A promise that resolves when the instance is preloaded.
56
+ */
57
+ preloadInstance(): Promise<void>;
58
+ /**
59
+ * Preloads the given number of instances of the sound.
60
+ * @param count - The number of instances to preload.
61
+ * @returns A promise that resolves when all instances are preloaded.
62
+ */
63
+ preloadInstances(count: number): Promise<void>;
64
+ /**
65
+ * Plays the sound.
66
+ * - Triggers `onEndedObservable` if played for the full duration and the `loop` option is not set.
67
+ * @param options The options to use when playing the sound. Options set here override the sound's options.
68
+ */
69
+ play(options?: Partial<IStreamingSoundPlayOptions>): void;
70
+ /**
71
+ * Stops the sound.
72
+ */
73
+ stop(): void;
74
+ protected abstract _createInstance(): _StreamingSoundInstance;
75
+ private _addPreloadedInstance;
76
+ private _removePreloadedInstance;
77
+ }
@@ -0,0 +1,109 @@
1
+ import { AbstractSound } from "./abstractSound.js";
2
+ /**
3
+ * Abstract class representing a streaming sound.
4
+ *
5
+ * A streaming sound has a sound buffer that is loaded into memory in chunks as it is played. This allows it to be played
6
+ * more quickly than a static sound, but it also means that it cannot have loop points or playback rate changes.
7
+ *
8
+ * Due to the way streaming sounds are typically implemented, there can be a significant delay when attempting to play
9
+ * a streaming sound for the first time. To prevent this delay, it is recommended to preload instances of the sound
10
+ * using the {@link IStreamingSoundStoredOptions.preloadCount} options, or the {@link preloadInstance} and
11
+ * {@link preloadInstances} methods before calling the `play` method.
12
+ *
13
+ * Streaming sounds are created by the {@link CreateStreamingSoundAsync} function.
14
+ */
15
+ export class StreamingSound extends AbstractSound {
16
+ constructor(name, engine, options) {
17
+ super(name, engine, options);
18
+ this._preloadedInstances = new Array();
19
+ }
20
+ /**
21
+ * The number of instances to preload.
22
+ */
23
+ get preloadCount() {
24
+ return this._options.preloadCount ?? 1;
25
+ }
26
+ /**
27
+ * Returns the number of instances that have been preloaded.
28
+ */
29
+ get preloadCompletedCount() {
30
+ return this._preloadedInstances.length;
31
+ }
32
+ /**
33
+ * Preloads an instance of the sound.
34
+ * @returns A promise that resolves when the instance is preloaded.
35
+ */
36
+ preloadInstance() {
37
+ const instance = this._createInstance();
38
+ this._addPreloadedInstance(instance);
39
+ return instance.preloadedPromise;
40
+ }
41
+ /**
42
+ * Preloads the given number of instances of the sound.
43
+ * @param count - The number of instances to preload.
44
+ * @returns A promise that resolves when all instances are preloaded.
45
+ */
46
+ async preloadInstances(count) {
47
+ for (let i = 0; i < count; i++) {
48
+ this.preloadInstance();
49
+ }
50
+ await Promise.all(this._preloadedInstances.map((instance) => instance.preloadedPromise));
51
+ }
52
+ /**
53
+ * Plays the sound.
54
+ * - Triggers `onEndedObservable` if played for the full duration and the `loop` option is not set.
55
+ * @param options The options to use when playing the sound. Options set here override the sound's options.
56
+ */
57
+ play(options = {}) {
58
+ if (this.state === 5 /* SoundState.Paused */) {
59
+ this.resume();
60
+ return;
61
+ }
62
+ let instance;
63
+ if (this.preloadCompletedCount > 0) {
64
+ instance = this._preloadedInstances[0];
65
+ instance.startOffset = this.startOffset;
66
+ this._removePreloadedInstance(instance);
67
+ }
68
+ else {
69
+ instance = this._createInstance();
70
+ }
71
+ const onInstanceStateChanged = () => {
72
+ if (instance.state === 3 /* SoundState.Started */) {
73
+ this._stopExcessInstances();
74
+ instance.onStateChangedObservable.removeCallback(onInstanceStateChanged);
75
+ }
76
+ };
77
+ instance.onStateChangedObservable.add(onInstanceStateChanged);
78
+ options.startOffset ?? (options.startOffset = this.startOffset);
79
+ options.loop ?? (options.loop = this.loop);
80
+ options.volume ?? (options.volume = 1);
81
+ this._beforePlay(instance);
82
+ instance.play(options);
83
+ this._afterPlay(instance);
84
+ }
85
+ /**
86
+ * Stops the sound.
87
+ */
88
+ stop() {
89
+ this._setState(1 /* SoundState.Stopped */);
90
+ if (!this._instances) {
91
+ return;
92
+ }
93
+ for (const instance of Array.from(this._instances)) {
94
+ instance.stop();
95
+ }
96
+ }
97
+ _addPreloadedInstance(instance) {
98
+ if (!this._preloadedInstances.includes(instance)) {
99
+ this._preloadedInstances.push(instance);
100
+ }
101
+ }
102
+ _removePreloadedInstance(instance) {
103
+ const index = this._preloadedInstances.indexOf(instance);
104
+ if (index !== -1) {
105
+ this._preloadedInstances.splice(index, 1);
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=streamingSound.js.map
@@ -0,0 +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 preloadInstance} and\n * {@link preloadInstances} 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, options: Partial<IStreamingSoundOptions>) {\n super(name, engine, options);\n }\n\n /**\n * The number of instances to preload.\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 preloadInstance(): 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 preloadInstances(count: number): Promise<void> {\n for (let i = 0; i < count; i++) {\n this.preloadInstance();\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"]}
@@ -0,0 +1,25 @@
1
+ import { Observable } from "../../Misc/observable";
2
+ import type { IAbstractSoundInstanceOptions } from "./abstractSoundInstance";
3
+ import { _AbstractSoundInstance } from "./abstractSoundInstance";
4
+ import type { IStreamingSoundOptionsBase, StreamingSound } from "./streamingSound";
5
+ /**
6
+ * Options for creating streaming sound instance.
7
+ * @internal
8
+ */
9
+ export interface IStreamingSoundInstanceOptions extends IAbstractSoundInstanceOptions, IStreamingSoundOptionsBase {
10
+ }
11
+ /** @internal */
12
+ export declare abstract class _StreamingSoundInstance extends _AbstractSoundInstance {
13
+ private _rejectPreloadedProimse;
14
+ private _resolvePreloadedPromise;
15
+ protected abstract readonly _options: IStreamingSoundInstanceOptions;
16
+ /** @internal */
17
+ readonly onReadyObservable: Observable<_StreamingSoundInstance>;
18
+ /** @internal */
19
+ readonly preloadedPromise: Promise<void>;
20
+ protected constructor(sound: StreamingSound);
21
+ /** @internal */
22
+ set startOffset(value: number);
23
+ /** @internal */
24
+ dispose(): void;
25
+ }
@@ -0,0 +1,29 @@
1
+ import { Observable } from "../../Misc/observable.js";
2
+ import { _AbstractSoundInstance } from "./abstractSoundInstance.js";
3
+ /** @internal */
4
+ export class _StreamingSoundInstance extends _AbstractSoundInstance {
5
+ constructor(sound) {
6
+ super(sound);
7
+ /** @internal */
8
+ this.onReadyObservable = new Observable();
9
+ /** @internal */
10
+ this.preloadedPromise = new Promise((resolve, reject) => {
11
+ this._rejectPreloadedProimse = reject;
12
+ this._resolvePreloadedPromise = resolve;
13
+ });
14
+ this.onErrorObservable.add(this._rejectPreloadedProimse);
15
+ this.onReadyObservable.add(this._resolvePreloadedPromise);
16
+ }
17
+ /** @internal */
18
+ set startOffset(value) {
19
+ this._options.startOffset = value;
20
+ }
21
+ /** @internal */
22
+ dispose() {
23
+ super.dispose();
24
+ this.onErrorObservable.clear();
25
+ this.onReadyObservable.clear();
26
+ this._resolvePreloadedPromise();
27
+ }
28
+ }
29
+ //# sourceMappingURL=streamingSoundInstance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamingSoundInstance.js","sourceRoot":"","sources":["../../../../../dev/core/src/AudioV2/abstractAudio/streamingSoundInstance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AASjE,gBAAgB;AAChB,MAAM,OAAgB,uBAAwB,SAAQ,sBAAsB;IAexE,YAAsB,KAAqB;QACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QAVjB,gBAAgB;QACA,sBAAiB,GAAG,IAAI,UAAU,EAA2B,CAAC;QAE9E,gBAAgB;QACA,qBAAgB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrE,IAAI,CAAC,uBAAuB,GAAG,MAAM,CAAC;YACtC,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC;QAC5C,CAAC,CAAC,CAAC;QAKC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACzD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC9D,CAAC;IAED,gBAAgB;IAChB,IAAW,WAAW,CAAC,KAAa;QAChC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC;IACtC,CAAC;IAED,gBAAgB;IACA,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAE/B,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACpC,CAAC;CACJ","sourcesContent":["import { Observable } from \"../../Misc/observable\";\nimport type { IAbstractSoundInstanceOptions } from \"./abstractSoundInstance\";\nimport { _AbstractSoundInstance } from \"./abstractSoundInstance\";\nimport type { IStreamingSoundOptionsBase, StreamingSound } from \"./streamingSound\";\n\n/**\n * Options for creating streaming sound instance.\n * @internal\n */\nexport interface IStreamingSoundInstanceOptions extends IAbstractSoundInstanceOptions, IStreamingSoundOptionsBase {}\n\n/** @internal */\nexport abstract class _StreamingSoundInstance extends _AbstractSoundInstance {\n private _rejectPreloadedProimse: (reason?: any) => void;\n private _resolvePreloadedPromise: () => void;\n\n protected abstract override readonly _options: IStreamingSoundInstanceOptions;\n\n /** @internal */\n public readonly onReadyObservable = new Observable<_StreamingSoundInstance>();\n\n /** @internal */\n public readonly preloadedPromise = new Promise<void>((resolve, reject) => {\n this._rejectPreloadedProimse = reject;\n this._resolvePreloadedPromise = resolve;\n });\n\n protected constructor(sound: StreamingSound) {\n super(sound);\n\n this.onErrorObservable.add(this._rejectPreloadedProimse);\n this.onReadyObservable.add(this._resolvePreloadedPromise);\n }\n\n /** @internal */\n public set startOffset(value: number) {\n this._options.startOffset = value;\n }\n\n /** @internal */\n public override dispose(): void {\n super.dispose();\n\n this.onErrorObservable.clear();\n this.onReadyObservable.clear();\n\n this._resolvePreloadedPromise();\n }\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import type { Nullable } from "../../../types";
2
+ import type { AbstractNamedAudioNode } from "../abstractAudioNode";
3
+ import type { _AbstractAudioSubNode } from "./abstractAudioSubNode";
4
+ /**
5
+ * Adds common sub graph functionality to an audio node.
6
+ *
7
+ * Audio nodes such as static sounds, streaming sounds, and buses can use audio sub graphs to process audio internally
8
+ * before sending it to connected downstream audio nodes. This is useful for applying effects, spatial audio, and other
9
+ * audio processing tasks common to multiple audio node classes.
10
+ *
11
+ * A key feature of audio sub graphs is their audio sub nodes are created asynchronously on demand so the minimum set
12
+ * of sub nodes are used at all times to save memory and CPU resources. The tradeoff is a small delay when first
13
+ * setting a property backed by a sub node. This delay is avoided by using the appropriate options to initialize the
14
+ * sub node on creation, e.g. `spatialEnabled` and `stereoEnabled`, or by setting any creation option backed by the
15
+ * sub node, e.g. `spatialPosition` and `stereoPan`.
16
+ *
17
+ * @internal
18
+ */
19
+ export declare abstract class _AbstractAudioSubGraph {
20
+ private _createSubNodePromises;
21
+ private _subNodes;
22
+ /**
23
+ * Executes the given callback with the named sub node, creating the sub node if needed.
24
+ *
25
+ * Note that `callback` is executed synchronously if the sub node already exists, otherwise the sub node is created
26
+ * asynchronously before `callback` is executed.
27
+ *
28
+ * @param name The name of the sub node
29
+ * @param callback The function to call with the named sub node
30
+ */
31
+ callOnSubNode<T extends _AbstractAudioSubNode>(name: string, callback: (node: T) => void): void;
32
+ /**
33
+ * Releases associated resources.
34
+ */
35
+ dispose(): void;
36
+ /**
37
+ * Gets a previously created sub node.
38
+ * @param name - The name of the sub node
39
+ * @returns The named sub node, or `null` if it has not been created, yet
40
+ * @internal
41
+ * */
42
+ getSubNode<T extends AbstractNamedAudioNode>(name: string): Nullable<T>;
43
+ protected abstract _createSubNode(name: string): Nullable<Promise<_AbstractAudioSubNode>>;
44
+ /**
45
+ * Called when sub-nodes are added or removed.
46
+ * - Override this to connect and reconnect sub-nodes as needed.
47
+ */
48
+ protected _onSubNodesChanged(): void;
49
+ protected _createSubNodePromisesResolved(): Promise<_AbstractAudioSubNode[]>;
50
+ private _addSubNode;
51
+ protected _createAndAddSubNode(name: string): Promise<_AbstractAudioSubNode>;
52
+ private _onSubNodeDisposed;
53
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Adds common sub graph functionality to an audio node.
3
+ *
4
+ * Audio nodes such as static sounds, streaming sounds, and buses can use audio sub graphs to process audio internally
5
+ * before sending it to connected downstream audio nodes. This is useful for applying effects, spatial audio, and other
6
+ * audio processing tasks common to multiple audio node classes.
7
+ *
8
+ * A key feature of audio sub graphs is their audio sub nodes are created asynchronously on demand so the minimum set
9
+ * of sub nodes are used at all times to save memory and CPU resources. The tradeoff is a small delay when first
10
+ * setting a property backed by a sub node. This delay is avoided by using the appropriate options to initialize the
11
+ * sub node on creation, e.g. `spatialEnabled` and `stereoEnabled`, or by setting any creation option backed by the
12
+ * sub node, e.g. `spatialPosition` and `stereoPan`.
13
+ *
14
+ * @internal
15
+ */
16
+ export class _AbstractAudioSubGraph {
17
+ constructor() {
18
+ this._createSubNodePromises = {};
19
+ this._subNodes = {};
20
+ this._onSubNodeDisposed = (node) => {
21
+ const subNode = node;
22
+ delete this._subNodes[subNode.name];
23
+ this._onSubNodesChanged();
24
+ };
25
+ }
26
+ /**
27
+ * Executes the given callback with the named sub node, creating the sub node if needed.
28
+ *
29
+ * Note that `callback` is executed synchronously if the sub node already exists, otherwise the sub node is created
30
+ * asynchronously before `callback` is executed.
31
+ *
32
+ * @param name The name of the sub node
33
+ * @param callback The function to call with the named sub node
34
+ */
35
+ callOnSubNode(name, callback) {
36
+ const node = this.getSubNode(name);
37
+ if (node) {
38
+ callback(node);
39
+ return;
40
+ }
41
+ const promise = this._createSubNodePromises[name] ?? this._createAndAddSubNode(name);
42
+ promise.then((node) => {
43
+ callback(node);
44
+ });
45
+ }
46
+ /**
47
+ * Releases associated resources.
48
+ */
49
+ dispose() {
50
+ const subNodes = Object.values(this._subNodes);
51
+ for (const subNode of subNodes) {
52
+ subNode.dispose();
53
+ }
54
+ this._subNodes = {};
55
+ this._createSubNodePromises = {};
56
+ }
57
+ /**
58
+ * Gets a previously created sub node.
59
+ * @param name - The name of the sub node
60
+ * @returns The named sub node, or `null` if it has not been created, yet
61
+ * @internal
62
+ * */
63
+ getSubNode(name) {
64
+ return this._subNodes[name] ?? null;
65
+ }
66
+ /**
67
+ * Called when sub-nodes are added or removed.
68
+ * - Override this to connect and reconnect sub-nodes as needed.
69
+ */
70
+ _onSubNodesChanged() { }
71
+ _createSubNodePromisesResolved() {
72
+ return Promise.all(Object.values(this._createSubNodePromises));
73
+ }
74
+ _addSubNode(node) {
75
+ this._subNodes[node.name] = node;
76
+ node.onDisposeObservable.addOnce(this._onSubNodeDisposed);
77
+ this._onSubNodesChanged();
78
+ }
79
+ _createAndAddSubNode(name) {
80
+ const promise = this._createSubNode(name);
81
+ if (!promise) {
82
+ return Promise.reject(`Failed to create subnode "${name}"`);
83
+ }
84
+ this._createSubNodePromises[name] = new Promise((resolve, reject) => {
85
+ promise
86
+ .then((node) => {
87
+ this._addSubNode(node);
88
+ resolve(node);
89
+ })
90
+ .catch((error) => {
91
+ reject(error);
92
+ });
93
+ });
94
+ return promise;
95
+ }
96
+ }
97
+ //# sourceMappingURL=abstractAudioSubGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractAudioSubGraph.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAgB,sBAAsB;IAA5C;QACY,2BAAsB,GAAsD,EAAE,CAAC;QAC/E,cAAS,GAA8C,EAAE,CAAC;QAyF1D,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;IA9FG;;;;;;;;OAQG;IACI,aAAa,CAAkC,IAAY,EAAE,QAA2B;QAC3F,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,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAErF,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,QAAQ,CAAC,IAAS,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,OAAO;QACV,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;;;;;SAKK;IACE,UAAU,CAAmC,IAAY;QAC5D,OAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAO,IAAI,IAAI,CAAC;IAC/C,CAAC;IAID;;;OAGG;IACO,kBAAkB,KAAU,CAAC;IAE7B,8BAA8B;QACpC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,WAAW,CAAC,IAA4B;QAC5C,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;IAES,oBAAoB,CAAC,IAAY;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,OAAO,CAAC,MAAM,CAAC,6BAA6B,IAAI,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChE,OAAO;iBACF,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBACX,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACb,MAAM,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACnB,CAAC;CASJ","sourcesContent":["import type { Nullable } from \"../../../types\";\nimport type { AbstractAudioNode, AbstractNamedAudioNode } from \"../abstractAudioNode\";\nimport type { _AbstractAudioSubNode } from \"./abstractAudioSubNode\";\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 _subNodes: { [key: string]: AbstractNamedAudioNode } = {};\n\n /**\n * Executes the given callback with the named sub node, creating the sub node if needed.\n *\n * Note that `callback` is executed synchronously if the sub node already exists, otherwise the sub node is created\n * asynchronously before `callback` is executed.\n *\n * @param name The name of the sub node\n * @param callback The function to call with the named sub node\n */\n public callOnSubNode<T extends _AbstractAudioSubNode>(name: string, callback: (node: T) => void): void {\n const node = this.getSubNode(name);\n if (node) {\n callback(node as T);\n return;\n }\n\n const promise = this._createSubNodePromises[name] ?? this._createAndAddSubNode(name);\n\n promise.then((node) => {\n callback(node as T);\n });\n }\n\n /**\n * Releases associated resources.\n */\n public dispose() {\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 * @param name - The name of the sub node\n * @returns The named sub node, or `null` if it has not been created, yet\n * @internal\n * */\n public getSubNode<T extends AbstractNamedAudioNode>(name: string): Nullable<T> {\n return (this._subNodes[name] as T) ?? null;\n }\n\n protected abstract _createSubNode(name: string): Nullable<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 _onSubNodesChanged(): void {}\n\n protected _createSubNodePromisesResolved(): Promise<_AbstractAudioSubNode[]> {\n return Promise.all(Object.values(this._createSubNodePromises));\n }\n\n private _addSubNode(node: AbstractNamedAudioNode): void {\n this._subNodes[node.name] = node;\n\n node.onDisposeObservable.addOnce(this._onSubNodeDisposed);\n\n this._onSubNodesChanged();\n }\n\n protected _createAndAddSubNode(name: string): Promise<_AbstractAudioSubNode> {\n const promise = this._createSubNode(name);\n\n if (!promise) {\n return Promise.reject(`Failed to create subnode \"${name}\"`);\n }\n\n this._createSubNodePromises[name] = new Promise((resolve, reject) => {\n promise\n .then((node) => {\n this._addSubNode(node);\n resolve(node);\n })\n .catch((error) => {\n reject(error);\n });\n });\n\n return promise;\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"]}
@@ -0,0 +1,13 @@
1
+ import { AbstractNamedAudioNode } from "../abstractAudioNode";
2
+ import type { AudioEngineV2 } from "../audioEngineV2";
3
+ /** @internal */
4
+ export declare abstract class _AbstractAudioSubNode extends AbstractNamedAudioNode {
5
+ /** @internal */
6
+ protected constructor(name: string, engine: AudioEngineV2);
7
+ /** @internal */
8
+ connect(node: _AbstractAudioSubNode): void;
9
+ /** @internal */
10
+ disconnect(node: _AbstractAudioSubNode): void;
11
+ /** @internal */
12
+ disconnectAll(): void;
13
+ }
@@ -0,0 +1,33 @@
1
+ import { AbstractNamedAudioNode } from "../abstractAudioNode.js";
2
+ /** @internal */
3
+ export class _AbstractAudioSubNode extends AbstractNamedAudioNode {
4
+ /** @internal */
5
+ constructor(name, engine) {
6
+ super(name, engine, 3 /* AudioNodeType.HAS_INPUTS_AND_OUTPUTS */);
7
+ }
8
+ /** @internal */
9
+ connect(node) {
10
+ if (!this._connect(node)) {
11
+ throw new Error("Connect failed");
12
+ }
13
+ }
14
+ /** @internal */
15
+ disconnect(node) {
16
+ if (!this._disconnect(node)) {
17
+ throw new Error("Disconnect failed");
18
+ }
19
+ }
20
+ /** @internal */
21
+ disconnectAll() {
22
+ if (!this._downstreamNodes) {
23
+ throw new Error("Disconnect failed");
24
+ }
25
+ const it = this._downstreamNodes.values();
26
+ for (let next = it.next(); !next.done; next = it.next()) {
27
+ if (!this._disconnect(next.value)) {
28
+ throw new Error("Disconnect failed");
29
+ }
30
+ }
31
+ }
32
+ }
33
+ //# sourceMappingURL=abstractAudioSubNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractAudioSubNode.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subNodes/abstractAudioSubNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG7E,gBAAgB;AAChB,MAAM,OAAgB,qBAAsB,SAAQ,sBAAsB;IACtE,gBAAgB;IAChB,YAAsB,IAAY,EAAE,MAAqB;QACrD,KAAK,CAAC,IAAI,EAAE,MAAM,+CAAuC,CAAC;IAC9D,CAAC;IAED,gBAAgB;IACT,OAAO,CAAC,IAA2B;QACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,UAAU,CAAC,IAA2B;QACzC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;IACL,CAAC;IAED,gBAAgB;IACT,aAAa;QAChB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAE1C,KAAK,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACzC,CAAC;QACL,CAAC;IACL,CAAC;CACJ","sourcesContent":["import { AudioNodeType, AbstractNamedAudioNode } from \"../abstractAudioNode\";\nimport type { AudioEngineV2 } from \"../audioEngineV2\";\n\n/** @internal */\nexport abstract class _AbstractAudioSubNode extends AbstractNamedAudioNode {\n /** @internal */\n protected constructor(name: string, engine: AudioEngineV2) {\n super(name, engine, AudioNodeType.HAS_INPUTS_AND_OUTPUTS);\n }\n\n /** @internal */\n public connect(node: _AbstractAudioSubNode): void {\n if (!this._connect(node)) {\n throw new Error(\"Connect failed\");\n }\n }\n\n /** @internal */\n public disconnect(node: _AbstractAudioSubNode): void {\n if (!this._disconnect(node)) {\n throw new Error(\"Disconnect failed\");\n }\n }\n\n /** @internal */\n public disconnectAll(): void {\n if (!this._downstreamNodes) {\n throw new Error(\"Disconnect failed\");\n }\n\n const it = this._downstreamNodes.values();\n\n for (let next = it.next(); !next.done; next = it.next()) {\n if (!this._disconnect(next.value)) {\n throw new Error(\"Disconnect failed\");\n }\n }\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ /** @internal */
2
+ export declare enum AudioSubNode {
3
+ STEREO = "Stereo",
4
+ SPATIAL = "Spatial",
5
+ VOLUME = "Volume"
6
+ }
@@ -0,0 +1,8 @@
1
+ /** @internal */
2
+ export var AudioSubNode;
3
+ (function (AudioSubNode) {
4
+ AudioSubNode["STEREO"] = "Stereo";
5
+ AudioSubNode["SPATIAL"] = "Spatial";
6
+ AudioSubNode["VOLUME"] = "Volume";
7
+ })(AudioSubNode || (AudioSubNode = {}));
8
+ //# sourceMappingURL=audioSubNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioSubNode.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subNodes/audioSubNode.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,MAAM,CAAN,IAAkB,YAIjB;AAJD,WAAkB,YAAY;IAC1B,iCAAiB,CAAA;IACjB,mCAAmB,CAAA;IACnB,iCAAiB,CAAA;AACrB,CAAC,EAJiB,YAAY,KAAZ,YAAY,QAI7B","sourcesContent":["/** @internal */\nexport const enum AudioSubNode {\n STEREO = \"Stereo\",\n SPATIAL = \"Spatial\",\n VOLUME = \"Volume\",\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import type { Quaternion, Vector3 } from "../../../Maths/math.vector";
2
+ import type { Nullable } from "../../../types";
3
+ import type { AudioEngineV2 } from "../audioEngineV2";
4
+ import type { ISpatialAudioOptions } from "../subProperties/abstractSpatialAudio";
5
+ import { _SpatialAudioDefaults } from "../subProperties/abstractSpatialAudio";
6
+ import type { _AbstractAudioSubGraph } from "./abstractAudioSubGraph";
7
+ import { _AbstractAudioSubNode } from "./abstractAudioSubNode";
8
+ /** @internal */
9
+ export declare abstract class _SpatialAudioSubNode extends _AbstractAudioSubNode {
10
+ protected constructor(engine: AudioEngineV2);
11
+ abstract coneInnerAngle: number;
12
+ abstract coneOuterAngle: number;
13
+ abstract coneOuterVolume: number;
14
+ abstract distanceModel: DistanceModelType;
15
+ abstract maxDistance: number;
16
+ abstract panningModel: PanningModelType;
17
+ abstract position: Vector3;
18
+ abstract referenceDistance: number;
19
+ abstract rolloffFactor: number;
20
+ abstract rotation: Vector3;
21
+ abstract rotationQuaternion: Quaternion;
22
+ abstract inNode: AudioNode;
23
+ /** @internal */
24
+ setOptions(options: Partial<ISpatialAudioOptions>): void;
25
+ }
26
+ /** @internal */
27
+ export declare function _GetSpatialAudioSubNode(subGraph: _AbstractAudioSubGraph): Nullable<_SpatialAudioSubNode>;
28
+ /** @internal */
29
+ export declare function _GetSpatialAudioProperty<K extends keyof typeof _SpatialAudioDefaults>(subGraph: _AbstractAudioSubGraph, property: K): (typeof _SpatialAudioDefaults)[K];
30
+ /** @internal */
31
+ export declare function _SetSpatialAudioProperty<K extends keyof typeof _SpatialAudioDefaults>(subGraph: _AbstractAudioSubGraph, property: K, value: _SpatialAudioSubNode[K]): void;
@@ -0,0 +1,46 @@
1
+ import { _SpatialAudioDefaults } from "../subProperties/abstractSpatialAudio.js";
2
+ import { _AbstractAudioSubNode } from "./abstractAudioSubNode.js";
3
+ /** @internal */
4
+ export class _SpatialAudioSubNode extends _AbstractAudioSubNode {
5
+ constructor(engine) {
6
+ super("Spatial" /* AudioSubNode.SPATIAL */, engine);
7
+ }
8
+ /** @internal */
9
+ setOptions(options) {
10
+ this.coneInnerAngle = options.spatialConeInnerAngle ?? _SpatialAudioDefaults.coneInnerAngle;
11
+ this.coneOuterAngle = options.spatialConeOuterAngle ?? _SpatialAudioDefaults.coneOuterAngle;
12
+ this.coneOuterVolume = options.spatialConeOuterVolume ?? _SpatialAudioDefaults.coneOuterVolume;
13
+ this.distanceModel = options.spatialDistanceModel ?? _SpatialAudioDefaults.distanceModel;
14
+ this.maxDistance = options.spatialMaxDistance ?? _SpatialAudioDefaults.maxDistance;
15
+ this.panningModel = options.spatialPanningModel ?? _SpatialAudioDefaults.panningModel;
16
+ this.referenceDistance = options.spatialReferenceDistance ?? _SpatialAudioDefaults.referenceDistance;
17
+ this.rolloffFactor = options.spatialRolloffFactor ?? _SpatialAudioDefaults.rolloffFactor;
18
+ if (options.spatialPosition !== undefined) {
19
+ this.position = options.spatialPosition.clone();
20
+ }
21
+ if (options.spatialRotationQuaternion !== undefined) {
22
+ this.rotationQuaternion = options.spatialRotationQuaternion.clone();
23
+ }
24
+ else if (options.spatialRotation !== undefined) {
25
+ this.rotation = options.spatialRotation.clone();
26
+ }
27
+ else {
28
+ this.rotationQuaternion = _SpatialAudioDefaults.rotationQuaternion.clone();
29
+ }
30
+ }
31
+ }
32
+ /** @internal */
33
+ export function _GetSpatialAudioSubNode(subGraph) {
34
+ return subGraph.getSubNode("Spatial" /* AudioSubNode.SPATIAL */);
35
+ }
36
+ /** @internal */
37
+ export function _GetSpatialAudioProperty(subGraph, property) {
38
+ return _GetSpatialAudioSubNode(subGraph)?.[property] ?? _SpatialAudioDefaults[property];
39
+ }
40
+ /** @internal */
41
+ export function _SetSpatialAudioProperty(subGraph, property, value) {
42
+ subGraph.callOnSubNode("Spatial" /* AudioSubNode.SPATIAL */, (node) => {
43
+ node[property] = value;
44
+ });
45
+ }
46
+ //# sourceMappingURL=spatialAudioSubNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatialAudioSubNode.js","sourceRoot":"","sources":["../../../../../../dev/core/src/AudioV2/abstractAudio/subNodes/spatialAudioSubNode.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,gBAAgB;AAChB,MAAM,OAAgB,oBAAqB,SAAQ,qBAAqB;IACpE,YAAsB,MAAqB;QACvC,KAAK,uCAAuB,MAAM,CAAC,CAAC;IACxC,CAAC;IAeD,gBAAgB;IACT,UAAU,CAAC,OAAsC;QACpD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,qBAAqB,IAAI,qBAAqB,CAAC,cAAc,CAAC;QAC5F,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,qBAAqB,IAAI,qBAAqB,CAAC,cAAc,CAAC;QAC5F,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,sBAAsB,IAAI,qBAAqB,CAAC,eAAe,CAAC;QAC/F,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,oBAAoB,IAAI,qBAAqB,CAAC,aAAa,CAAC;QACzF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,kBAAkB,IAAI,qBAAqB,CAAC,WAAW,CAAC;QACnF,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,mBAAmB,IAAI,qBAAqB,CAAC,YAAY,CAAC;QACtF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,IAAI,qBAAqB,CAAC,iBAAiB,CAAC;QACrG,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,oBAAoB,IAAI,qBAAqB,CAAC,aAAa,CAAC;QAEzF,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QACpD,CAAC;QAED,IAAI,OAAO,CAAC,yBAAyB,KAAK,SAAS,EAAE,CAAC;YAClD,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;QACxE,CAAC;aAAM,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC/C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QACpD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,kBAAkB,GAAG,qBAAqB,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAC/E,CAAC;IACL,CAAC;CACJ;AAED,gBAAgB;AAChB,MAAM,UAAU,uBAAuB,CAAC,QAAgC;IACpE,OAAO,QAAQ,CAAC,UAAU,sCAA4C,CAAC;AAC3E,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,wBAAwB,CAA+C,QAAgC,EAAE,QAAW;IAChI,OAAO,uBAAuB,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AAC5F,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,wBAAwB,CAA+C,QAAgC,EAAE,QAAW,EAAE,KAA8B;IAChK,QAAQ,CAAC,aAAa,uCAA6C,CAAC,IAAI,EAAE,EAAE;QACxE,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Quaternion, Vector3 } from \"../../../Maths/math.vector\";\nimport type { Nullable } from \"../../../types\";\nimport type { AudioEngineV2 } from \"../audioEngineV2\";\nimport type { ISpatialAudioOptions } from \"../subProperties/abstractSpatialAudio\";\nimport { _SpatialAudioDefaults } from \"../subProperties/abstractSpatialAudio\";\nimport type { _AbstractAudioSubGraph } from \"./abstractAudioSubGraph\";\nimport { _AbstractAudioSubNode } from \"./abstractAudioSubNode\";\nimport { AudioSubNode } from \"./audioSubNode\";\n\n/** @internal */\nexport abstract class _SpatialAudioSubNode extends _AbstractAudioSubNode {\n protected constructor(engine: AudioEngineV2) {\n super(AudioSubNode.SPATIAL, engine);\n }\n\n public abstract coneInnerAngle: number;\n public abstract coneOuterAngle: number;\n public abstract coneOuterVolume: number;\n public abstract distanceModel: DistanceModelType;\n public abstract maxDistance: number;\n public abstract panningModel: PanningModelType;\n public abstract position: Vector3;\n public abstract referenceDistance: number;\n public abstract rolloffFactor: number;\n public abstract rotation: Vector3;\n public abstract rotationQuaternion: Quaternion;\n public abstract inNode: AudioNode;\n\n /** @internal */\n public setOptions(options: Partial<ISpatialAudioOptions>): void {\n this.coneInnerAngle = options.spatialConeInnerAngle ?? _SpatialAudioDefaults.coneInnerAngle;\n this.coneOuterAngle = options.spatialConeOuterAngle ?? _SpatialAudioDefaults.coneOuterAngle;\n this.coneOuterVolume = options.spatialConeOuterVolume ?? _SpatialAudioDefaults.coneOuterVolume;\n this.distanceModel = options.spatialDistanceModel ?? _SpatialAudioDefaults.distanceModel;\n this.maxDistance = options.spatialMaxDistance ?? _SpatialAudioDefaults.maxDistance;\n this.panningModel = options.spatialPanningModel ?? _SpatialAudioDefaults.panningModel;\n this.referenceDistance = options.spatialReferenceDistance ?? _SpatialAudioDefaults.referenceDistance;\n this.rolloffFactor = options.spatialRolloffFactor ?? _SpatialAudioDefaults.rolloffFactor;\n\n if (options.spatialPosition !== undefined) {\n this.position = options.spatialPosition.clone();\n }\n\n if (options.spatialRotationQuaternion !== undefined) {\n this.rotationQuaternion = options.spatialRotationQuaternion.clone();\n } else if (options.spatialRotation !== undefined) {\n this.rotation = options.spatialRotation.clone();\n } else {\n this.rotationQuaternion = _SpatialAudioDefaults.rotationQuaternion.clone();\n }\n }\n}\n\n/** @internal */\nexport function _GetSpatialAudioSubNode(subGraph: _AbstractAudioSubGraph): Nullable<_SpatialAudioSubNode> {\n return subGraph.getSubNode<_SpatialAudioSubNode>(AudioSubNode.SPATIAL);\n}\n\n/** @internal */\nexport function _GetSpatialAudioProperty<K extends keyof typeof _SpatialAudioDefaults>(subGraph: _AbstractAudioSubGraph, property: K): (typeof _SpatialAudioDefaults)[K] {\n return _GetSpatialAudioSubNode(subGraph)?.[property] ?? _SpatialAudioDefaults[property];\n}\n\n/** @internal */\nexport function _SetSpatialAudioProperty<K extends keyof typeof _SpatialAudioDefaults>(subGraph: _AbstractAudioSubGraph, property: K, value: _SpatialAudioSubNode[K]): void {\n subGraph.callOnSubNode<_SpatialAudioSubNode>(AudioSubNode.SPATIAL, (node) => {\n node[property] = value;\n });\n}\n"]}