@aura3d/audio 1.4.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,226 +0,0 @@
1
- import type { AudioClip } from "./AudioClip";
2
-
3
- export interface AudioWaveformOptions {
4
- readonly peakCount?: number;
5
- readonly samplesPerPeak?: number;
6
- readonly channel?: number | "mix";
7
- readonly normalize?: boolean;
8
- }
9
-
10
- export interface AudioWaveformPeak {
11
- readonly min: number;
12
- readonly max: number;
13
- readonly rms: number;
14
- }
15
-
16
- export interface AudioWaveformData {
17
- readonly duration: number;
18
- readonly sampleRate: number;
19
- readonly channels: number;
20
- readonly peakCount: number;
21
- readonly samplesPerPeak: number;
22
- readonly normalized: boolean;
23
- readonly peaks: readonly AudioWaveformPeak[];
24
- }
25
-
26
- export interface AudioWaveformPathPoint {
27
- readonly x: number;
28
- readonly yMin: number;
29
- readonly yMax: number;
30
- readonly rmsHeight: number;
31
- }
32
-
33
- export interface AudioWaveformPathOptions {
34
- readonly width: number;
35
- readonly height: number;
36
- readonly padding?: number;
37
- }
38
-
39
- export interface AudioWaveformReviewStem {
40
- readonly id: string;
41
- readonly label?: string;
42
- readonly startTime: number;
43
- readonly waveform: AudioWaveformData;
44
- }
45
-
46
- export interface AudioWaveformReviewStemView {
47
- readonly id: string;
48
- readonly label: string;
49
- readonly startTime: number;
50
- readonly duration: number;
51
- readonly peakCount: number;
52
- readonly path: readonly AudioWaveformPathPoint[];
53
- }
54
-
55
- export interface AudioWaveformReviewData {
56
- readonly kind: "audio-waveform-review-data";
57
- readonly stemCount: number;
58
- readonly width: number;
59
- readonly height: number;
60
- readonly stems: readonly AudioWaveformReviewStemView[];
61
- }
62
-
63
- export type AudioWaveformInput = AudioBuffer | AudioClip;
64
-
65
- export function createAudioWaveform(input: AudioWaveformInput, options: AudioWaveformOptions = {}): AudioWaveformData {
66
- const buffer = audioBufferFromInput(input);
67
- const channels = buffer.numberOfChannels;
68
- const sampleRate = finitePositive(buffer.sampleRate, "sampleRate");
69
- const duration = Math.max(0, buffer.duration);
70
- const totalSamples = Math.max(0, Math.round(duration * sampleRate));
71
- const samplesPerPeak = resolveSamplesPerPeak(totalSamples, options);
72
- const peakCount = totalSamples === 0 ? 0 : Math.ceil(totalSamples / samplesPerPeak);
73
- const peaks: AudioWaveformPeak[] = [];
74
- const sourceChannels = collectWaveformChannels(buffer, options.channel ?? "mix");
75
-
76
- for (let peakIndex = 0; peakIndex < peakCount; peakIndex++) {
77
- const start = peakIndex * samplesPerPeak;
78
- const end = Math.min(totalSamples, start + samplesPerPeak);
79
- let min = 0;
80
- let max = 0;
81
- let sumSquares = 0;
82
- let sampleCount = 0;
83
-
84
- for (let sampleIndex = start; sampleIndex < end; sampleIndex++) {
85
- let value = 0;
86
- for (const channel of sourceChannels) {
87
- value += channel[sampleIndex] ?? 0;
88
- }
89
- value /= sourceChannels.length;
90
- min = Math.min(min, value);
91
- max = Math.max(max, value);
92
- sumSquares += value * value;
93
- sampleCount++;
94
- }
95
-
96
- peaks.push({
97
- min,
98
- max,
99
- rms: sampleCount === 0 ? 0 : Math.sqrt(sumSquares / sampleCount)
100
- });
101
- }
102
-
103
- const normalize = options.normalize ?? false;
104
- const outputPeaks = normalize ? normalizePeaks(peaks) : peaks;
105
- return {
106
- duration,
107
- sampleRate,
108
- channels,
109
- peakCount: outputPeaks.length,
110
- samplesPerPeak,
111
- normalized: normalize,
112
- peaks: outputPeaks
113
- };
114
- }
115
-
116
- export function sampleAudioWaveformAtTime(waveform: AudioWaveformData, timeSeconds: number): AudioWaveformPeak {
117
- if (waveform.peaks.length === 0 || waveform.duration <= 0) {
118
- return { min: 0, max: 0, rms: 0 };
119
- }
120
- const normalizedTime = clamp(timeSeconds / waveform.duration, 0, 1);
121
- const index = Math.min(waveform.peaks.length - 1, Math.floor(normalizedTime * waveform.peaks.length));
122
- return waveform.peaks[index] ?? { min: 0, max: 0, rms: 0 };
123
- }
124
-
125
- export function createAudioWaveformPath(waveform: AudioWaveformData, options: AudioWaveformPathOptions): readonly AudioWaveformPathPoint[] {
126
- const width = finitePositive(options.width, "width");
127
- const height = finitePositive(options.height, "height");
128
- const padding = Math.max(0, options.padding ?? 0);
129
- const drawableHeight = Math.max(1, height - padding * 2);
130
- const centerY = padding + drawableHeight / 2;
131
- const halfHeight = drawableHeight / 2;
132
- const denominator = Math.max(1, waveform.peaks.length - 1);
133
-
134
- return waveform.peaks.map((peak, index) => ({
135
- x: waveform.peaks.length === 1 ? width / 2 : index / denominator * width,
136
- yMin: centerY - clamp(peak.max, -1, 1) * halfHeight,
137
- yMax: centerY - clamp(peak.min, -1, 1) * halfHeight,
138
- rmsHeight: clamp(peak.rms, 0, 1) * halfHeight
139
- }));
140
- }
141
-
142
- export function createAudioWaveformReviewData(
143
- stems: readonly AudioWaveformReviewStem[],
144
- options: AudioWaveformPathOptions
145
- ): AudioWaveformReviewData {
146
- const width = finitePositive(options.width, "width");
147
- const height = finitePositive(options.height, "height");
148
- return {
149
- kind: "audio-waveform-review-data",
150
- stemCount: stems.length,
151
- width,
152
- height,
153
- stems: stems.map((stem) => ({
154
- id: stem.id,
155
- label: stem.label ?? stem.id,
156
- startTime: Math.max(0, stem.startTime),
157
- duration: stem.waveform.duration,
158
- peakCount: stem.waveform.peakCount,
159
- path: createAudioWaveformPath(stem.waveform, { ...options, width, height })
160
- }))
161
- };
162
- }
163
-
164
- export function audioWaveformPeakRange(waveform: AudioWaveformData): { readonly min: number; readonly max: number; readonly rmsMax: number } {
165
- let min = 0;
166
- let max = 0;
167
- let rmsMax = 0;
168
- for (const peak of waveform.peaks) {
169
- min = Math.min(min, peak.min);
170
- max = Math.max(max, peak.max);
171
- rmsMax = Math.max(rmsMax, peak.rms);
172
- }
173
- return { min, max, rmsMax };
174
- }
175
-
176
- function audioBufferFromInput(input: AudioWaveformInput): AudioBuffer {
177
- return "buffer" in input ? input.buffer : input;
178
- }
179
-
180
- function resolveSamplesPerPeak(totalSamples: number, options: AudioWaveformOptions): number {
181
- if (options.samplesPerPeak !== undefined) {
182
- return Math.max(1, Math.floor(finitePositive(options.samplesPerPeak, "samplesPerPeak")));
183
- }
184
- if (options.peakCount !== undefined) {
185
- const peakCount = Math.max(1, Math.floor(finitePositive(options.peakCount, "peakCount")));
186
- return Math.max(1, Math.ceil(totalSamples / peakCount));
187
- }
188
- return Math.max(1, Math.ceil(totalSamples / 1024));
189
- }
190
-
191
- function collectWaveformChannels(buffer: AudioBuffer, channel: number | "mix"): readonly Float32Array[] {
192
- if (buffer.numberOfChannels <= 0) {
193
- throw new Error("Audio waveform requires at least one channel");
194
- }
195
- if (channel === "mix") {
196
- return Array.from({ length: buffer.numberOfChannels }, (_, index) => buffer.getChannelData(index));
197
- }
198
- if (!Number.isInteger(channel) || channel < 0 || channel >= buffer.numberOfChannels) {
199
- throw new Error(`Audio waveform channel ${channel} is outside the buffer channel range`);
200
- }
201
- return [buffer.getChannelData(channel)];
202
- }
203
-
204
- function normalizePeaks(peaks: readonly AudioWaveformPeak[]): readonly AudioWaveformPeak[] {
205
- let maxAbs = 0;
206
- for (const peak of peaks) {
207
- maxAbs = Math.max(maxAbs, Math.abs(peak.min), Math.abs(peak.max), peak.rms);
208
- }
209
- if (maxAbs <= 0) return peaks;
210
- return peaks.map((peak) => ({
211
- min: peak.min / maxAbs,
212
- max: peak.max / maxAbs,
213
- rms: peak.rms / maxAbs
214
- }));
215
- }
216
-
217
- function finitePositive(value: number, label: string): number {
218
- if (!Number.isFinite(value) || value <= 0) {
219
- throw new Error(`Audio waveform ${label} must be a positive finite number`);
220
- }
221
- return value;
222
- }
223
-
224
- function clamp(value: number, min: number, max: number): number {
225
- return Math.min(max, Math.max(min, value));
226
- }
@@ -1,49 +0,0 @@
1
- import type { Scene, SceneNode } from "@aura3d/scene";
2
- import type { AudioListener } from "./AudioListener";
3
- import type { SpatialAudio } from "./SpatialAudio";
4
-
5
- export interface SceneAudioSourceBinding {
6
- readonly node: SceneNode;
7
- readonly spatial: SpatialAudio;
8
- }
9
-
10
- export class SceneAudioBridge {
11
- private listenerBinding?: { readonly node: SceneNode; readonly listener: AudioListener };
12
- private readonly sources = new Set<SceneAudioSourceBinding>();
13
-
14
- constructor(private readonly scene?: Scene) {}
15
-
16
- bindListener(node: SceneNode, listener: AudioListener): void {
17
- this.listenerBinding = { node, listener };
18
- }
19
-
20
- unbindListener(): void {
21
- this.listenerBinding = undefined;
22
- }
23
-
24
- bindSource(node: SceneNode, spatial: SpatialAudio): SceneAudioSourceBinding {
25
- const binding = { node, spatial };
26
- this.sources.add(binding);
27
- return binding;
28
- }
29
-
30
- unbindSource(binding: SceneAudioSourceBinding): void {
31
- this.sources.delete(binding);
32
- }
33
-
34
- update(): void {
35
- this.scene?.updateWorldTransforms();
36
- if (this.listenerBinding) {
37
- this.listenerBinding.listener.setTransform(worldPosition(this.listenerBinding.node));
38
- }
39
- for (const binding of this.sources) {
40
- binding.spatial.setPosition(worldPosition(binding.node));
41
- }
42
- }
43
- }
44
-
45
- function worldPosition(node: SceneNode): { readonly x: number; readonly y: number; readonly z: number } {
46
- node.updateWorldTransform();
47
- const matrix = node.transform.worldMatrix as readonly number[];
48
- return { x: matrix[12], y: matrix[13], z: matrix[14] };
49
- }
@@ -1,36 +0,0 @@
1
- import type { AudioContextLike } from "./AudioContextManager";
2
- import type { Vec3Like } from "./AudioListener";
3
-
4
- export interface SpatialAudioOptions {
5
- readonly context: AudioContextLike;
6
- readonly destination?: AudioNode;
7
- readonly position?: Vec3Like;
8
- readonly maxDistance?: number;
9
- readonly refDistance?: number;
10
- readonly rolloffFactor?: number;
11
- }
12
-
13
- export class SpatialAudio {
14
- readonly panner: PannerNode;
15
-
16
- constructor(options: SpatialAudioOptions) {
17
- this.panner = options.context.createPanner();
18
- this.panner.panningModel = "HRTF";
19
- this.panner.distanceModel = "inverse";
20
- this.panner.maxDistance = options.maxDistance ?? 10_000;
21
- this.panner.refDistance = options.refDistance ?? 1;
22
- this.panner.rolloffFactor = options.rolloffFactor ?? 1;
23
- this.panner.connect(options.destination ?? options.context.destination);
24
- this.setPosition(options.position ?? { x: 0, y: 0, z: 0 });
25
- }
26
-
27
- setPosition(position: Vec3Like): void {
28
- this.panner.positionX.value = position.x;
29
- this.panner.positionY.value = position.y;
30
- this.panner.positionZ.value = position.z;
31
- }
32
-
33
- dispose(): void {
34
- this.panner.disconnect();
35
- }
36
- }
@@ -1,137 +0,0 @@
1
- export type AudioOcclusionLevel = "none" | "light" | "medium" | "heavy" | "complete";
2
-
3
- export interface AudioEnvironmentFixtureOptions {
4
- readonly sourcePosition?: readonly [number, number, number];
5
- readonly listenerPosition?: readonly [number, number, number];
6
- readonly sourceVelocity?: readonly [number, number, number];
7
- readonly listenerVelocity?: readonly [number, number, number];
8
- readonly obstacleCount?: number;
9
- readonly reverbZoneRadius?: number;
10
- readonly reverbZoneDistance?: number;
11
- readonly baseFrequencyHz?: number;
12
- }
13
-
14
- export interface AudioEnvironmentFixture {
15
- readonly source: "origin-master-spatial-audio-environment-adapted";
16
- readonly distance: number;
17
- readonly occlusion: {
18
- readonly level: AudioOcclusionLevel;
19
- readonly obstacleCount: number;
20
- readonly lowpassHz: number;
21
- readonly volume: number;
22
- };
23
- readonly doppler: {
24
- readonly relativeVelocity: number;
25
- readonly approaching: boolean;
26
- readonly pitchFactor: number;
27
- readonly frequencyShiftHz: number;
28
- };
29
- readonly reverb: {
30
- readonly zoneRadius: number;
31
- readonly zoneDistance: number;
32
- readonly blend: number;
33
- readonly wetLevel: number;
34
- readonly dryLevel: number;
35
- };
36
- readonly hash: string;
37
- readonly claimBoundary: string;
38
- }
39
-
40
- const OCCLUSION: Record<AudioOcclusionLevel, { readonly lowpassHz: number; readonly volume: number }> = {
41
- none: { lowpassHz: 20_000, volume: 1 },
42
- light: { lowpassHz: 8_000, volume: 0.9 },
43
- medium: { lowpassHz: 3_000, volume: 0.7 },
44
- heavy: { lowpassHz: 800, volume: 0.4 },
45
- complete: { lowpassHz: 200, volume: 0.1 }
46
- };
47
-
48
- export function sampleAudioEnvironmentFixture(options: AudioEnvironmentFixtureOptions = {}): AudioEnvironmentFixture {
49
- const sourcePosition = options.sourcePosition ?? [0.85, 0.15, 0] as const;
50
- const listenerPosition = options.listenerPosition ?? [0, 0, 3] as const;
51
- const sourceVelocity = options.sourceVelocity ?? [-2.5, 0.2, 0] as const;
52
- const listenerVelocity = options.listenerVelocity ?? [0.7, 0, 0] as const;
53
- const obstacleCount = Math.max(0, Math.floor(options.obstacleCount ?? 2));
54
- const distance = vectorLength(sub(sourcePosition, listenerPosition));
55
- const direction = normalize(sub(listenerPosition, sourcePosition));
56
- const relativeVelocity = dot(sub(sourceVelocity, listenerVelocity), direction);
57
- const approaching = relativeVelocity > 0;
58
- const speedOfSound = 343;
59
- const pitchFactor = clamp(speedOfSound / Math.max(1, speedOfSound - relativeVelocity), 0.5, 2);
60
- const baseFrequencyHz = options.baseFrequencyHz ?? 440;
61
- const level = occlusionLevel(obstacleCount);
62
- const occlusion = OCCLUSION[level];
63
- const zoneRadius = Math.max(0.001, options.reverbZoneRadius ?? 8);
64
- const zoneDistance = Math.max(0, options.reverbZoneDistance ?? distance);
65
- const blend = clamp(1 - zoneDistance / zoneRadius, 0, 1);
66
- const fixture = {
67
- source: "origin-master-spatial-audio-environment-adapted" as const,
68
- distance: round(distance),
69
- occlusion: {
70
- level,
71
- obstacleCount,
72
- lowpassHz: occlusion.lowpassHz,
73
- volume: occlusion.volume
74
- },
75
- doppler: {
76
- relativeVelocity: round(relativeVelocity),
77
- approaching,
78
- pitchFactor: round(pitchFactor),
79
- frequencyShiftHz: round(baseFrequencyHz * (pitchFactor - 1))
80
- },
81
- reverb: {
82
- zoneRadius: round(zoneRadius),
83
- zoneDistance: round(zoneDistance),
84
- blend: round(blend),
85
- wetLevel: round(0.55 * blend),
86
- dryLevel: round(0.85 * (1 - blend * 0.5))
87
- },
88
- hash: "",
89
- claimBoundary: "Spatial audio environment fixture adapts old occlusion, doppler, and reverb-zone math for deterministic telemetry; it does not implement authored audio middleware or Unity/Unreal acoustic parity."
90
- };
91
- return {
92
- ...fixture,
93
- hash: stableHash(`${fixture.distance}|${fixture.occlusion.level}|${fixture.occlusion.obstacleCount}|${fixture.doppler.pitchFactor}|${fixture.reverb.blend}`)
94
- };
95
- }
96
-
97
- function occlusionLevel(obstacleCount: number): AudioOcclusionLevel {
98
- if (obstacleCount <= 0) return "none";
99
- if (obstacleCount === 1) return "light";
100
- if (obstacleCount === 2) return "medium";
101
- if (obstacleCount === 3) return "heavy";
102
- return "complete";
103
- }
104
-
105
- function sub(left: readonly [number, number, number], right: readonly [number, number, number]): [number, number, number] {
106
- return [left[0] - right[0], left[1] - right[1], left[2] - right[2]];
107
- }
108
-
109
- function dot(left: readonly [number, number, number], right: readonly [number, number, number]): number {
110
- return left[0] * right[0] + left[1] * right[1] + left[2] * right[2];
111
- }
112
-
113
- function normalize(value: readonly [number, number, number]): [number, number, number] {
114
- const length = vectorLength(value);
115
- return length > 0 ? [value[0] / length, value[1] / length, value[2] / length] : [0, 0, 0];
116
- }
117
-
118
- function vectorLength(value: readonly [number, number, number]): number {
119
- return Math.hypot(value[0], value[1], value[2]);
120
- }
121
-
122
- function clamp(value: number, min: number, max: number): number {
123
- return Math.max(min, Math.min(max, Number.isFinite(value) ? value : min));
124
- }
125
-
126
- function round(value: number): number {
127
- return Number(value.toFixed(4));
128
- }
129
-
130
- function stableHash(value: string): string {
131
- let hash = 0x811c9dc5;
132
- for (let index = 0; index < value.length; index += 1) {
133
- hash ^= value.charCodeAt(index);
134
- hash = Math.imul(hash, 0x01000193);
135
- }
136
- return (hash >>> 0).toString(16).padStart(8, "0");
137
- }
@@ -1,39 +0,0 @@
1
- import type { AudioContextLike } from "../AudioContextManager";
2
- import type { AudioEffect } from "../AudioEffect";
3
-
4
- export class FilterEffect implements AudioEffect {
5
- readonly input: BiquadFilterNode;
6
- readonly output: BiquadFilterNode;
7
-
8
- constructor(context: AudioContextLike, type: BiquadFilterType = "lowpass") {
9
- this.input = context.createBiquadFilter();
10
- this.input.type = type;
11
- this.output = this.input;
12
- }
13
-
14
- setFrequency(value: number): void {
15
- if (!Number.isFinite(value) || value <= 0) {
16
- throw new Error("Filter frequency must be positive");
17
- }
18
- this.input.frequency.value = value;
19
- }
20
-
21
- setQ(value: number): void {
22
- if (!Number.isFinite(value) || value < 0) {
23
- throw new Error("Filter Q must be non-negative");
24
- }
25
- this.input.Q.value = value;
26
- }
27
-
28
- connect(destination: AudioNode): AudioNode {
29
- return this.output.connect(destination);
30
- }
31
-
32
- disconnect(): void {
33
- this.output.disconnect();
34
- }
35
-
36
- dispose(): void {
37
- this.disconnect();
38
- }
39
- }
@@ -1,30 +0,0 @@
1
- import type { AudioContextLike } from "../AudioContextManager";
2
- import type { AudioEffect } from "../AudioEffect";
3
-
4
- export class ReverbEffect implements AudioEffect {
5
- readonly input: ConvolverNode;
6
- readonly output: ConvolverNode;
7
-
8
- constructor(context: AudioContextLike, impulse?: AudioBuffer) {
9
- this.input = context.createConvolver();
10
- this.input.buffer = impulse ?? null;
11
- this.output = this.input;
12
- }
13
-
14
- setImpulse(buffer: AudioBuffer): void {
15
- this.input.buffer = buffer;
16
- }
17
-
18
- connect(destination: AudioNode): AudioNode {
19
- return this.output.connect(destination);
20
- }
21
-
22
- disconnect(): void {
23
- this.output.disconnect();
24
- }
25
-
26
- dispose(): void {
27
- this.input.buffer = null;
28
- this.disconnect();
29
- }
30
- }
package/src/index.ts DELETED
@@ -1,74 +0,0 @@
1
- export { AudioBus } from "./AudioBus";
2
- export { AudioClip } from "./AudioClip";
3
- export type { AudioClipOptions } from "./AudioClip";
4
- export { AudioFileManager, validateEpisodeAudioAssets } from "./AudioFileManager";
5
- export type {
6
- AudioDecodeContextLike,
7
- EpisodeAudioAssetDiagnostic,
8
- EpisodeAudioAssetReadiness,
9
- EpisodeAudioAssetRequirement,
10
- AudioFileAssetLike,
11
- AudioFileFetchResponseLike,
12
- AudioFileInput,
13
- AudioFileManagerOptions,
14
- AudioFileRequest,
15
- ResolvedAudioFileRequest
16
- } from "./AudioFileManager";
17
- export { createAudioTimelineMixSnapshot, defaultAudioTimelineBusForRole, validateAudioCaptionSync, AudioTimelineTrack } from "./AudioTimelineTrack";
18
- export type {
19
- AudioCaptionCue,
20
- AudioCaptionSyncIssue,
21
- AudioCaptionSyncReport,
22
- AudioTimelineBusMix,
23
- AudioTimelineClip,
24
- AudioTimelineClipOptions,
25
- AudioTimelineEnvelopePoint,
26
- AudioTimelineMixOptions,
27
- AudioTimelineMixSnapshot,
28
- AudioTimelineSample,
29
- AudioTimelineTrackOptions,
30
- AudioTimelineTrackRole
31
- } from "./AudioTimelineTrack";
32
- export { audioWaveformPeakRange, createAudioWaveform, createAudioWaveformPath, createAudioWaveformReviewData, sampleAudioWaveformAtTime } from "./AudioWaveform";
33
- export type {
34
- AudioWaveformData,
35
- AudioWaveformInput,
36
- AudioWaveformOptions,
37
- AudioWaveformPathOptions,
38
- AudioWaveformPathPoint,
39
- AudioWaveformPeak,
40
- AudioWaveformReviewData,
41
- AudioWaveformReviewStem,
42
- AudioWaveformReviewStemView
43
- } from "./AudioWaveform";
44
- export { sampleAudioEffectsAnalysisFixture } from "./AudioEffectsAnalysisFixtures";
45
- export type {
46
- AudioChorusPreset,
47
- AudioCompressorPreset,
48
- AudioDelayPreset,
49
- AudioDistortionCurve,
50
- AudioEffectsAnalysisFixture,
51
- AudioEffectsAnalysisFixtureOptions,
52
- AudioEqBandFixture,
53
- AudioSpectrumBandFixture
54
- } from "./AudioEffectsAnalysisFixtures";
55
- export { sampleAdaptiveMusicFixture } from "./AdaptiveMusicFixtures";
56
- export type { AdaptiveMusicCrossfadeCurve, AdaptiveMusicFixture, AdaptiveMusicFixtureOptions, AdaptiveMusicFixtureState, AdaptiveMusicLayerMix } from "./AdaptiveMusicFixtures";
57
- export { sampleAudioEnvironmentFixture } from "./SpatialAudioFixtures";
58
- export type { AudioEnvironmentFixture, AudioEnvironmentFixtureOptions, AudioOcclusionLevel } from "./SpatialAudioFixtures";
59
- export { AudioContextManager } from "./AudioContextManager";
60
- export type { AudioContextLike, AudioContextManagerOptions, AudioContextState } from "./AudioContextManager";
61
- export type { AudioEffect } from "./AudioEffect";
62
- export { AudioListener } from "./AudioListener";
63
- export type { Vec3Like } from "./AudioListener";
64
- export { AudioMixer, createAudioMixerEvidence, createAnimationAudioMixer } from "./AudioMixer";
65
- export type { AudioMixerBusEvidence, AudioMixerEvidence, AnimationAudioMixer, AnimationAudioMixerOptions } from "./AudioMixer";
66
- export { AudioSource } from "./AudioSource";
67
- export type { AudioSourceOptions, AudioSourceState } from "./AudioSource";
68
- export { AudioSystem } from "./AudioSystem";
69
- export { SceneAudioBridge } from "./SceneAudioBridge";
70
- export type { SceneAudioSourceBinding } from "./SceneAudioBridge";
71
- export { SpatialAudio } from "./SpatialAudio";
72
- export type { SpatialAudioOptions } from "./SpatialAudio";
73
- export { FilterEffect } from "./effects/Filter";
74
- export { ReverbEffect } from "./effects/Reverb";