@aura3d/audio 4.0.3 → 4.0.5

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.
@@ -0,0 +1,42 @@
1
+ import type { AudioContextLike } from "./AudioContextManager.js";
2
+ export interface AudioAnalyserOptions {
3
+ /**
4
+ * Context to build the `AnalyserNode` on. Defaults to `source.context`,
5
+ * which every real `AudioNode` exposes; pass it explicitly for minimal
6
+ * fakes whose nodes do not carry a context reference.
7
+ */
8
+ readonly context?: AudioContextLike;
9
+ /** FFT window size — power of two in [32, 32768]. three.js default is 2048. */
10
+ readonly fftSize?: number;
11
+ readonly minDecibels?: number;
12
+ readonly maxDecibels?: number;
13
+ readonly smoothingTimeConstant?: number;
14
+ }
15
+ /**
16
+ * AU-03 — spectrum/level tap on a live node, the `AudioAnalyser` parity class.
17
+ * Wraps a real `AnalyserNode`: `source` is connected into it (the analyser is a
18
+ * tap — it does not need to reach the destination to analyse), and the byte
19
+ * buffers are allocated once per `fftSize` and reused across reads.
20
+ */
21
+ export declare class AudioAnalyser {
22
+ readonly analyser: AnalyserNode;
23
+ private frequencyBins;
24
+ private timeDomainBins;
25
+ constructor(source: AudioNode, options?: AudioAnalyserOptions);
26
+ get fftSize(): number;
27
+ get frequencyBinCount(): number;
28
+ /** Latest byte spectrum (0–255 per bin, dB-mapped); the same array is returned every call. */
29
+ getFrequencyData(): Uint8Array;
30
+ /** Mean of the byte spectrum — three.js `getAverageFrequency` parity. */
31
+ getAverageFrequency(): number;
32
+ /** Latest byte waveform (128 = zero); the same array is returned every call. */
33
+ getTimeDomainData(): Uint8Array;
34
+ disconnect(): void;
35
+ }
36
+ /**
37
+ * `createAnalyser(source, fftSize?, context?)` — the AU-03 factory spelling.
38
+ * `context` (or `{ context }` in options) is only needed when the source node
39
+ * does not expose `.context` itself (fakes); real `AudioNode`s resolve it.
40
+ */
41
+ export declare function createAudioAnalyser(source: AudioNode, options?: AudioAnalyserOptions | number, context?: AudioContextLike): AudioAnalyser;
42
+ //# sourceMappingURL=AudioAnalyser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnalyser.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioAnalyser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CACzC;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,cAAc,CAA0B;gBAEpC,MAAM,EAAE,SAAS,EAAE,OAAO,GAAE,oBAAyB;IAuBjE,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,8FAA8F;IAC9F,gBAAgB,IAAI,UAAU;IAK9B,yEAAyE;IACzE,mBAAmB,IAAI,MAAM;IAQ7B,gFAAgF;IAChF,iBAAiB,IAAI,UAAU;IAK/B,UAAU,IAAI,IAAI;CAGnB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE,oBAAoB,GAAG,MAAW,EAC3C,OAAO,CAAC,EAAE,gBAAgB,GACzB,aAAa,CAEf"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * AU-03 — spectrum/level tap on a live node, the `AudioAnalyser` parity class.
3
+ * Wraps a real `AnalyserNode`: `source` is connected into it (the analyser is a
4
+ * tap — it does not need to reach the destination to analyse), and the byte
5
+ * buffers are allocated once per `fftSize` and reused across reads.
6
+ */
7
+ export class AudioAnalyser {
8
+ analyser;
9
+ frequencyBins;
10
+ timeDomainBins;
11
+ constructor(source, options = {}) {
12
+ const context = options.context ?? contextOfNode(source);
13
+ const create = context?.createAnalyser;
14
+ if (!context || typeof create !== "function") {
15
+ throw new Error("AudioAnalyser requires a context with createAnalyser — real AudioContext/OfflineAudioContext provide it; pass { context } when the source node does not expose one");
16
+ }
17
+ const fftSize = options.fftSize ?? 2048;
18
+ if (!Number.isInteger(fftSize) || fftSize < 32 || fftSize > 32_768 || (fftSize & (fftSize - 1)) !== 0) {
19
+ throw new RangeError("AudioAnalyser fftSize must be a power of two between 32 and 32768");
20
+ }
21
+ const analyser = create.call(context);
22
+ analyser.fftSize = fftSize;
23
+ if (options.minDecibels !== undefined)
24
+ analyser.minDecibels = options.minDecibels;
25
+ if (options.maxDecibels !== undefined)
26
+ analyser.maxDecibels = options.maxDecibels;
27
+ if (options.smoothingTimeConstant !== undefined)
28
+ analyser.smoothingTimeConstant = options.smoothingTimeConstant;
29
+ source.connect(analyser);
30
+ this.analyser = analyser;
31
+ this.frequencyBins = new Uint8Array(analyser.frequencyBinCount || fftSize / 2);
32
+ this.timeDomainBins = new Uint8Array(analyser.fftSize || fftSize);
33
+ }
34
+ get fftSize() {
35
+ return this.analyser.fftSize;
36
+ }
37
+ get frequencyBinCount() {
38
+ return this.analyser.frequencyBinCount;
39
+ }
40
+ /** Latest byte spectrum (0–255 per bin, dB-mapped); the same array is returned every call. */
41
+ getFrequencyData() {
42
+ this.analyser.getByteFrequencyData(this.frequencyBins);
43
+ return this.frequencyBins;
44
+ }
45
+ /** Mean of the byte spectrum — three.js `getAverageFrequency` parity. */
46
+ getAverageFrequency() {
47
+ const data = this.getFrequencyData();
48
+ if (data.length === 0)
49
+ return 0;
50
+ let sum = 0;
51
+ for (const value of data)
52
+ sum += value;
53
+ return sum / data.length;
54
+ }
55
+ /** Latest byte waveform (128 = zero); the same array is returned every call. */
56
+ getTimeDomainData() {
57
+ this.analyser.getByteTimeDomainData(this.timeDomainBins);
58
+ return this.timeDomainBins;
59
+ }
60
+ disconnect() {
61
+ this.analyser.disconnect();
62
+ }
63
+ }
64
+ /**
65
+ * `createAnalyser(source, fftSize?, context?)` — the AU-03 factory spelling.
66
+ * `context` (or `{ context }` in options) is only needed when the source node
67
+ * does not expose `.context` itself (fakes); real `AudioNode`s resolve it.
68
+ */
69
+ export function createAudioAnalyser(source, options = {}, context) {
70
+ return new AudioAnalyser(source, typeof options === "number" ? { fftSize: options, context } : options);
71
+ }
72
+ function contextOfNode(source) {
73
+ return source.context;
74
+ }
75
+ //# sourceMappingURL=AudioAnalyser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioAnalyser.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioAnalyser.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,12 @@ export interface AudioContextLike {
11
11
  createPanner(): PannerNode;
12
12
  createBiquadFilter(): BiquadFilterNode;
13
13
  createConvolver(): ConvolverNode;
14
+ /**
15
+ * Optional like the other non-essential factories on the package's wider
16
+ * `SoundGraphContext`: real contexts provide it; minimal fakes may not.
17
+ * `AudioAnalyser` throws a clear error when it is absent.
18
+ */
19
+ createAnalyser?(): AnalyserNode;
14
20
  }
15
21
  export interface AudioContextManagerOptions {
16
22
  readonly context?: AudioContextLike;
@@ -1 +1 @@
1
- {"version":3,"file":"AudioContextManager.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioContextManager.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE9E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,UAAU,IAAI,QAAQ,CAAC;IACvB,kBAAkB,IAAI,qBAAqB,CAAC;IAC5C,YAAY,IAAI,UAAU,CAAC;IAC3B,kBAAkB,IAAI,gBAAgB,CAAC;IACvC,eAAe,IAAI,aAAa,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,gBAAgB,CAAC;CACjD;AAED,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,UAAU,CAAC,CAAmB;IACtC,OAAO,CAAC,QAAQ,CAAS;gBAEI,OAAO,GAAE,0BAA+B;IAIrE,IAAI,OAAO,IAAI,gBAAgB,CAM9B;IAED,IAAI,KAAK,IAAI,iBAAiB,CAW7B;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
1
+ {"version":3,"file":"AudioContextManager.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioContextManager.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE9E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,UAAU,IAAI,QAAQ,CAAC;IACvB,kBAAkB,IAAI,qBAAqB,CAAC;IAC5C,YAAY,IAAI,UAAU,CAAC;IAC3B,kBAAkB,IAAI,gBAAgB,CAAC;IACvC,eAAe,IAAI,aAAa,CAAC;IACjC;;;;OAIG;IACH,cAAc,CAAC,IAAI,YAAY,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,gBAAgB,CAAC;CACjD;AAED,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,UAAU,CAAC,CAAmB;IACtC,OAAO,CAAC,QAAQ,CAAS;gBAEI,OAAO,GAAE,0BAA+B;IAIrE,IAAI,OAAO,IAAI,gBAAgB,CAM9B;IAED,IAAI,KAAK,IAAI,iBAAiB,CAW7B;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"AudioContextManager.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioContextManager.ts"],"names":[],"mappings":"AAqBA,MAAM,OAAO,mBAAmB;IAID;IAHrB,UAAU,CAAoB;IAC9B,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAA6B,UAAsC,EAAE;QAAxC,YAAO,GAAP,OAAO,CAAiC;QACnE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IACpC,CAAC;IAED,IAAI,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,EAAiC,CAAC,CAAC;YAC9G,IAAI,CAAC,UAAU,GAAG,aAAa,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,KAAK;QACP,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"AudioContextManager.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioContextManager.ts"],"names":[],"mappings":"AA2BA,MAAM,OAAO,mBAAmB;IAID;IAHrB,UAAU,CAAoB;IAC9B,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAA6B,UAAsC,EAAE;QAAxC,YAAO,GAAP,OAAO,CAAiC;QACnE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IACpC,CAAC;IAED,IAAI,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,EAAiC,CAAC,CAAC;YAC9G,IAAI,CAAC,UAAU,GAAG,aAAa,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,KAAK;QACP,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;CACF"}
@@ -1,12 +1,39 @@
1
+ import type { AudioContextLike } from "./AudioContextManager.js";
2
+ import { type ListenerLike } from "./game-sound/listenerSync.js";
1
3
  export interface Vec3Like {
2
4
  readonly x: number;
3
5
  readonly y: number;
4
6
  readonly z: number;
5
7
  }
8
+ export interface AudioListenerOptions {
9
+ /**
10
+ * Bind a live context so `setTransform` also writes into `context.listener`
11
+ * (the native Web Audio listener) through `syncListener` — the shared frame
12
+ * driver. Without a context the pose is stored only (headless-safe).
13
+ */
14
+ readonly context?: AudioContextLike;
15
+ }
16
+ /**
17
+ * AU-01: the listener pose owner. `setTransform` stores the pose and, when a
18
+ * context is bound, pushes it into `ctx.listener` via `syncListener`
19
+ * (`positionX…upZ` AudioParams where they exist, `setPosition`/`setOrientation`
20
+ * legacy fallback otherwise). `SceneAudioBridge.update()` keeps calling
21
+ * `setTransform` per frame, so the native listener follows the bound node.
22
+ */
6
23
  export declare class AudioListener {
7
24
  position: Vec3Like;
8
25
  forward: Vec3Like;
9
26
  up: Vec3Like;
27
+ private readonly context?;
28
+ constructor(options?: AudioListenerOptions);
29
+ /** The native `ctx.listener` this pose writes into, when a context is bound. */
30
+ get nativeListener(): ListenerLike | undefined;
10
31
  setTransform(position: Vec3Like, forward?: Vec3Like, up?: Vec3Like): void;
32
+ /**
33
+ * Push the stored pose into `ctx.listener`. Returns the path taken —
34
+ * "audioparam", "legacy", or "none" when no context/listener is bound.
35
+ * Safe to call every frame; `syncListener` ramps with τ = 20 ms.
36
+ */
37
+ sync(): "audioparam" | "legacy" | "none";
11
38
  }
12
39
  //# sourceMappingURL=AudioListener.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioListener.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioListener.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,QAAQ,EAAE,QAAQ,CAAwB;IAC1C,OAAO,EAAE,QAAQ,CAAyB;IAC1C,EAAE,EAAE,QAAQ,CAAwB;IAEpC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,QAAuB,EAAE,EAAE,GAAE,QAAkB,GAAG,IAAI;CAKjG"}
1
+ {"version":3,"file":"AudioListener.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/AudioListener.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE5E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,QAAQ,EAAE,QAAQ,CAAwB;IAC1C,OAAO,EAAE,QAAQ,CAAyB;IAC1C,EAAE,EAAE,QAAQ,CAAwB;IAEpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAmB;gBAEhC,OAAO,GAAE,oBAAyB;IAI9C,gFAAgF;IAChF,IAAI,cAAc,IAAI,YAAY,GAAG,SAAS,CAI7C;IAED,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,QAAuB,EAAE,EAAE,GAAE,QAAkB,GAAG,IAAI;IAOhG;;;;OAIG;IACH,IAAI,IAAI,YAAY,GAAG,QAAQ,GAAG,MAAM;CASzC"}
@@ -1,11 +1,45 @@
1
+ import { syncListener } from "./game-sound/listenerSync.js";
2
+ /**
3
+ * AU-01: the listener pose owner. `setTransform` stores the pose and, when a
4
+ * context is bound, pushes it into `ctx.listener` via `syncListener`
5
+ * (`positionX…upZ` AudioParams where they exist, `setPosition`/`setOrientation`
6
+ * legacy fallback otherwise). `SceneAudioBridge.update()` keeps calling
7
+ * `setTransform` per frame, so the native listener follows the bound node.
8
+ */
1
9
  export class AudioListener {
2
10
  position = { x: 0, y: 0, z: 0 };
3
11
  forward = { x: 0, y: 0, z: -1 };
4
12
  up = { x: 0, y: 1, z: 0 };
13
+ context;
14
+ constructor(options = {}) {
15
+ this.context = options.context;
16
+ }
17
+ /** The native `ctx.listener` this pose writes into, when a context is bound. */
18
+ get nativeListener() {
19
+ // Same access pattern as `GameSoundEngine.setListener` — `AudioContextLike`
20
+ // stays minimal, so the real-context `listener` is reached through a cast.
21
+ return this.context?.listener;
22
+ }
5
23
  setTransform(position, forward = this.forward, up = this.up) {
6
24
  this.position = { ...position };
7
25
  this.forward = { ...forward };
8
26
  this.up = { ...up };
27
+ this.sync();
28
+ }
29
+ /**
30
+ * Push the stored pose into `ctx.listener`. Returns the path taken —
31
+ * "audioparam", "legacy", or "none" when no context/listener is bound.
32
+ * Safe to call every frame; `syncListener` ramps with τ = 20 ms.
33
+ */
34
+ sync() {
35
+ const listener = this.nativeListener;
36
+ if (!listener)
37
+ return "none";
38
+ return syncListener(listener, this.context?.currentTime ?? 0, {
39
+ position: this.position,
40
+ forward: this.forward,
41
+ up: this.up
42
+ });
9
43
  }
10
44
  }
11
45
  //# sourceMappingURL=AudioListener.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioListener.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioListener.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,aAAa;IACxB,QAAQ,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1C,OAAO,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC1C,EAAE,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAEpC,YAAY,CAAC,QAAkB,EAAE,UAAoB,IAAI,CAAC,OAAO,EAAE,KAAe,IAAI,CAAC,EAAE;QACvF,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IACtB,CAAC;CACF"}
1
+ {"version":3,"file":"AudioListener.js","sourceRoot":"","sources":["../../../../packages/audio/src/AudioListener.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAqB,MAAM,2BAA2B,CAAC;AAiB5E;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACxB,QAAQ,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1C,OAAO,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC1C,EAAE,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAEnB,OAAO,CAAoB;IAE5C,YAAY,UAAgC,EAAE;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,gFAAgF;IAChF,IAAI,cAAc;QAChB,4EAA4E;QAC5E,2EAA2E;QAC3E,OAAQ,IAAI,CAAC,OAA8D,EAAE,QAAQ,CAAC;IACxF,CAAC;IAED,YAAY,CAAC,QAAkB,EAAE,UAAoB,IAAI,CAAC,OAAO,EAAE,KAAe,IAAI,CAAC,EAAE;QACvF,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,IAAI;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC;QACrC,IAAI,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC;QAC7B,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC,EAAE;YAC5D,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,EAAE,EAAE,IAAI,CAAC,EAAE;SACZ,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -19,8 +19,31 @@ export type OcclusionHook = (emitter: Vec3Like, listener: Vec3Like) => number;
19
19
  /**
20
20
  * Pure distance-attenuation gain in [0, 1], mirroring the PannerNode models so
21
21
  * evidence stays meaningful even when no WebAudio context exists (headless runs).
22
+ *
23
+ * Web Audio spec §6.4 (verified against Blink `DistanceEffect::Gain`):
24
+ * - `inverse`: `d` is clamped to `[ref, ∞)`; `maxDistance` is ignored.
25
+ * - `exponential`: `d` is clamped to `[ref, ∞)`; `maxDistance` is ignored.
26
+ * - `linear`: `d` is clamped to `[min(ref,max), max(ref,max)]` and rolloff is
27
+ * clamped to `[0, 1]` — the only model that uses `maxDistance`.
28
+ * (The previous implementation forced gain 0 for `d ≥ maxDistance` on every
29
+ * model, which no panner does — evidence lied past `maxDistance`.)
22
30
  */
23
31
  export declare function computeDistanceAttenuation(distance: number, options?: DistanceAttenuationOptions): number;
32
+ export interface ConeOptions {
33
+ /** Degrees of full gain around `orientation`. Spec default 360 (omni). */
34
+ readonly innerAngle?: number;
35
+ /** Degrees at which gain reaches `outerGain`. Spec default 360. */
36
+ readonly outerAngle?: number;
37
+ /** Linear gain outside the outer cone, [0, 1]. Spec default 0. */
38
+ readonly outerGain?: number;
39
+ }
40
+ /**
41
+ * Pure cone gain in [0, 1], mirroring PannerNode §6.5 (Blink `ConeEffect::Gain`):
42
+ * the angle between the *source→listener* vector and the source `orientation`.
43
+ * Inside `innerAngle` → 1; outside `outerAngle` → `outerGain`; between → linear
44
+ * interpolation. Zero orientation or a 360°/360° cone → omni (gain 1).
45
+ */
46
+ export declare function computeConeGain(emitterPosition: Vec3Like, orientation: Vec3Like, listenerPosition: Vec3Like, cone?: ConeOptions): number;
24
47
  /**
25
48
  * Pure doppler playback-rate ratio for an emitter/listener pair. Returns 1 when
26
49
  * both are stationary relative to each other; clamped to [0.25, 4].
@@ -39,8 +62,13 @@ export interface PositionalEmitterOptions {
39
62
  readonly volume?: number;
40
63
  readonly loop?: boolean;
41
64
  readonly position?: Vec3Like;
65
+ /** Direction the emitter's cone axis points (panner `orientationX/Y/Z`). */
66
+ readonly orientation?: Vec3Like;
42
67
  readonly velocity?: Vec3Like;
43
68
  readonly attenuation?: DistanceAttenuationOptions;
69
+ readonly cone?: ConeOptions;
70
+ /** Panner `panningModel` — "HRTF" (default) or "equalpower". */
71
+ readonly panningModel?: PanningModelType;
44
72
  readonly doppler?: DopplerOptions & {
45
73
  readonly enabled?: boolean;
46
74
  };
@@ -49,6 +77,10 @@ export interface PositionalEmitterEvidence {
49
77
  readonly kind: "positional-emitter-evidence";
50
78
  readonly position: Vec3Like;
51
79
  readonly attenuationGain: number;
80
+ /** Cone gain the panner applies (or software applies when headless). */
81
+ readonly coneGain: number;
82
+ /** Effective panner/software distance model for this emitter. */
83
+ readonly distanceModel: DistanceAttenuationModel;
52
84
  readonly dopplerShift: number;
53
85
  readonly occlusion: number;
54
86
  readonly state: AudioSourceState;
@@ -68,11 +100,15 @@ export declare class PositionalEmitter {
68
100
  private readonly baseVolume;
69
101
  private positionRef;
70
102
  private velocityRef;
103
+ private orientationRef;
104
+ private lastListenerPosition;
71
105
  private readonly attenuationOptions;
106
+ private coneOptions;
72
107
  private readonly dopplerOptions;
73
108
  private readonly dopplerEnabled;
74
109
  private occlusionRef;
75
110
  private lastAttenuation;
111
+ private lastCone;
76
112
  private lastDoppler;
77
113
  constructor(options: PositionalEmitterOptions);
78
114
  get position(): Vec3Like;
@@ -80,16 +116,36 @@ export declare class PositionalEmitter {
80
116
  get connected(): boolean;
81
117
  setPosition(position: Vec3Like): void;
82
118
  setVelocity(velocity: Vec3Like): void;
119
+ /** Repoint the cone axis; recomputes the cached cone gain against the last listener pose. */
120
+ setOrientation(orientation: Vec3Like): void;
121
+ /** Change the cone shape; recomputes the cached cone gain. */
122
+ setCone(cone: ConeOptions): void;
83
123
  setOcclusion(amount: number): void;
84
124
  /**
85
- * Recompute attenuation + doppler against the listener and push them into the
86
- * live graph (gain, playback rate, filter). Pure math runs even when headless.
125
+ * Recompute attenuation + cone + doppler against the listener and push them
126
+ * into the live graph (gain, playback rate, filter). Pure math runs even when
127
+ * headless.
87
128
  */
88
129
  update(listenerPosition: Vec3Like, listenerVelocity?: Vec3Like): PositionalEmitterEvidence;
89
130
  play(when?: number): void;
90
131
  stop(when?: number): void;
91
132
  evidence(): PositionalEmitterEvidence;
92
133
  dispose(): void;
134
+ private refreshConeGain;
135
+ /**
136
+ * AU-02 / C10 — distance and cone attenuation are applied EXACTLY ONCE.
137
+ *
138
+ * Connected: the `PannerNode` owns them — `SpatialAudio` mirrors
139
+ * `distanceModel`/`refDistance`/`maxDistance`/`rolloffFactor` and the cone
140
+ * params onto the panner, so the software gain carries only
141
+ * `volume × occlusion` (occlusion is ours; the panner cannot do it).
142
+ * Previously the software gain multiplied `attenuationGain` on top of the
143
+ * panner's own inverse-model gain — the C10 double attenuation.
144
+ *
145
+ * Headless (no panner/filter could be built): the software gain applies the
146
+ * same formulas itself, so the emitter still attenuates rather than playing
147
+ * full volume with `connected: false`.
148
+ */
93
149
  private applyGain;
94
150
  }
95
151
  //# sourceMappingURL=PositionalEmitter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PositionalEmitter.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/PositionalEmitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PositionalEmitter.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/PositionalEmitter.ts"],"names":[],"mappings":"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"}
@@ -6,25 +6,68 @@ const DOPPLER_MAX = 4;
6
6
  /**
7
7
  * Pure distance-attenuation gain in [0, 1], mirroring the PannerNode models so
8
8
  * evidence stays meaningful even when no WebAudio context exists (headless runs).
9
+ *
10
+ * Web Audio spec §6.4 (verified against Blink `DistanceEffect::Gain`):
11
+ * - `inverse`: `d` is clamped to `[ref, ∞)`; `maxDistance` is ignored.
12
+ * - `exponential`: `d` is clamped to `[ref, ∞)`; `maxDistance` is ignored.
13
+ * - `linear`: `d` is clamped to `[min(ref,max), max(ref,max)]` and rolloff is
14
+ * clamped to `[0, 1]` — the only model that uses `maxDistance`.
15
+ * (The previous implementation forced gain 0 for `d ≥ maxDistance` on every
16
+ * model, which no panner does — evidence lied past `maxDistance`.)
9
17
  */
10
18
  export function computeDistanceAttenuation(distance, options = {}) {
11
19
  if (!Number.isFinite(distance) || distance < 0)
12
20
  return 1;
13
21
  const refDistance = Math.max(Number.EPSILON, options.refDistance ?? 1);
14
- const maxDistance = Math.max(refDistance, options.maxDistance ?? 10_000);
22
+ const maxDistance = options.maxDistance ?? 10_000;
15
23
  const rolloff = Math.max(0, options.rolloffFactor ?? 1);
16
24
  const model = options.model ?? "inverse";
17
- if (distance <= refDistance)
18
- return 1;
19
- if (distance >= maxDistance)
20
- return 0;
25
+ const d = Math.max(distance, refDistance);
21
26
  if (model === "linear") {
22
- return Math.max(0, 1 - rolloff * ((distance - refDistance) / (maxDistance - refDistance)));
27
+ const dRef = Math.min(refDistance, maxDistance);
28
+ const dMax = Math.max(refDistance, maxDistance);
29
+ const clamped = Math.min(Math.max(d, dRef), dMax);
30
+ if (dRef === dMax)
31
+ return 1 - rolloff;
32
+ const f = Math.min(1, rolloff);
33
+ return Math.max(0, 1 - f * ((clamped - dRef) / (dMax - dRef)));
23
34
  }
24
35
  if (model === "exponential") {
25
- return Math.pow(distance / refDistance, -rolloff);
36
+ return Math.pow(d / refDistance, -rolloff);
26
37
  }
27
- return refDistance / (refDistance + rolloff * (distance - refDistance));
38
+ return refDistance / (refDistance + rolloff * (d - refDistance));
39
+ }
40
+ /**
41
+ * Pure cone gain in [0, 1], mirroring PannerNode §6.5 (Blink `ConeEffect::Gain`):
42
+ * the angle between the *source→listener* vector and the source `orientation`.
43
+ * Inside `innerAngle` → 1; outside `outerAngle` → `outerGain`; between → linear
44
+ * interpolation. Zero orientation or a 360°/360° cone → omni (gain 1).
45
+ */
46
+ export function computeConeGain(emitterPosition, orientation, listenerPosition, cone = {}) {
47
+ const inner = cone.innerAngle ?? 360;
48
+ const outer = cone.outerAngle ?? 360;
49
+ const outerGain = Math.min(1, Math.max(0, cone.outerGain ?? 0));
50
+ const orientationLength = Math.hypot(orientation.x, orientation.y, orientation.z);
51
+ if (orientationLength < Number.EPSILON || (inner === 360 && outer === 360))
52
+ return 1;
53
+ const toListener = {
54
+ x: listenerPosition.x - emitterPosition.x,
55
+ y: listenerPosition.y - emitterPosition.y,
56
+ z: listenerPosition.z - emitterPosition.z
57
+ };
58
+ const listenerDistance = Math.hypot(toListener.x, toListener.y, toListener.z);
59
+ if (listenerDistance < Number.EPSILON)
60
+ return 1;
61
+ const cosAngle = Math.min(1, Math.max(-1, dot(toListener, orientation) / (listenerDistance * orientationLength)));
62
+ const absAngle = (Math.acos(cosAngle) * 180) / Math.PI;
63
+ const absInner = Math.abs(inner) / 2;
64
+ const absOuter = Math.abs(outer) / 2;
65
+ if (absAngle <= absInner)
66
+ return 1;
67
+ if (absAngle >= absOuter)
68
+ return outerGain;
69
+ const x = (absAngle - absInner) / (absOuter - absInner);
70
+ return 1 - x + outerGain * x;
28
71
  }
29
72
  function dot(a, b) {
30
73
  return a.x * b.x + a.y * b.y + a.z * b.z;
@@ -89,18 +132,24 @@ export class PositionalEmitter {
89
132
  baseVolume;
90
133
  positionRef;
91
134
  velocityRef;
135
+ orientationRef;
136
+ lastListenerPosition = { x: 0, y: 0, z: 0 };
92
137
  attenuationOptions;
138
+ coneOptions;
93
139
  dopplerOptions;
94
140
  dopplerEnabled;
95
141
  occlusionRef = 0;
96
142
  lastAttenuation = 1;
143
+ lastCone = 1;
97
144
  lastDoppler = 1;
98
145
  constructor(options) {
99
146
  this.options = options;
100
147
  this.baseVolume = options.volume ?? 1;
101
148
  this.positionRef = { ...(options.position ?? { x: 0, y: 0, z: 0 }) };
102
149
  this.velocityRef = { ...(options.velocity ?? ZERO_VELOCITY) };
150
+ this.orientationRef = { ...(options.orientation ?? { x: 1, y: 0, z: 0 }) };
103
151
  this.attenuationOptions = { ...(options.attenuation ?? {}) };
152
+ this.coneOptions = { ...(options.cone ?? {}) };
104
153
  this.dopplerOptions = { ...(options.doppler ?? {}) };
105
154
  this.dopplerEnabled = options.doppler?.enabled ?? true;
106
155
  let spatial;
@@ -110,9 +159,15 @@ export class PositionalEmitter {
110
159
  context: options.context,
111
160
  destination: options.destination,
112
161
  position: this.positionRef,
162
+ orientation: this.orientationRef,
163
+ panningModel: options.panningModel,
164
+ distanceModel: this.attenuationOptions.model,
113
165
  maxDistance: this.attenuationOptions.maxDistance,
114
166
  refDistance: this.attenuationOptions.refDistance,
115
- rolloffFactor: this.attenuationOptions.rolloffFactor
167
+ rolloffFactor: this.attenuationOptions.rolloffFactor,
168
+ coneInnerAngle: this.coneOptions.innerAngle,
169
+ coneOuterAngle: this.coneOptions.outerAngle,
170
+ coneOuterGain: this.coneOptions.outerGain
116
171
  });
117
172
  filter = options.context.createBiquadFilter();
118
173
  filter.type = "lowpass";
@@ -149,6 +204,25 @@ export class PositionalEmitter {
149
204
  setVelocity(velocity) {
150
205
  this.velocityRef = { ...velocity };
151
206
  }
207
+ /** Repoint the cone axis; recomputes the cached cone gain against the last listener pose. */
208
+ setOrientation(orientation) {
209
+ this.orientationRef = { ...orientation };
210
+ this.spatial?.setOrientation(orientation);
211
+ this.refreshConeGain();
212
+ }
213
+ /** Change the cone shape; recomputes the cached cone gain. */
214
+ setCone(cone) {
215
+ this.coneOptions = { ...cone };
216
+ if (this.spatial) {
217
+ if (cone.innerAngle !== undefined)
218
+ this.spatial.panner.coneInnerAngle = cone.innerAngle;
219
+ if (cone.outerAngle !== undefined)
220
+ this.spatial.panner.coneOuterAngle = cone.outerAngle;
221
+ if (cone.outerGain !== undefined)
222
+ this.spatial.panner.coneOuterGain = cone.outerGain;
223
+ }
224
+ this.refreshConeGain();
225
+ }
152
226
  setOcclusion(amount) {
153
227
  this.occlusionRef = Math.min(1, Math.max(0, amount));
154
228
  if (this.filter) {
@@ -157,12 +231,15 @@ export class PositionalEmitter {
157
231
  this.applyGain();
158
232
  }
159
233
  /**
160
- * Recompute attenuation + doppler against the listener and push them into the
161
- * live graph (gain, playback rate, filter). Pure math runs even when headless.
234
+ * Recompute attenuation + cone + doppler against the listener and push them
235
+ * into the live graph (gain, playback rate, filter). Pure math runs even when
236
+ * headless.
162
237
  */
163
238
  update(listenerPosition, listenerVelocity = ZERO_VELOCITY) {
239
+ this.lastListenerPosition = { ...listenerPosition };
164
240
  const distance = Math.hypot(this.positionRef.x - listenerPosition.x, this.positionRef.y - listenerPosition.y, this.positionRef.z - listenerPosition.z);
165
241
  this.lastAttenuation = computeDistanceAttenuation(distance, this.attenuationOptions);
242
+ this.lastCone = computeConeGain(this.positionRef, this.orientationRef, listenerPosition, this.coneOptions);
166
243
  this.lastDoppler = this.dopplerEnabled
167
244
  ? computeDopplerShift(this.positionRef, this.velocityRef, listenerPosition, listenerVelocity, this.dopplerOptions)
168
245
  : 1;
@@ -181,6 +258,8 @@ export class PositionalEmitter {
181
258
  kind: "positional-emitter-evidence",
182
259
  position: { ...this.positionRef },
183
260
  attenuationGain: this.lastAttenuation,
261
+ coneGain: this.lastCone,
262
+ distanceModel: this.attenuationOptions.model ?? "inverse",
184
263
  dopplerShift: this.lastDoppler,
185
264
  occlusion: this.occlusionRef,
186
265
  state: this.source.state,
@@ -192,8 +271,28 @@ export class PositionalEmitter {
192
271
  this.filter?.disconnect();
193
272
  this.spatial?.dispose();
194
273
  }
274
+ refreshConeGain() {
275
+ this.lastCone = computeConeGain(this.positionRef, this.orientationRef, this.lastListenerPosition, this.coneOptions);
276
+ this.applyGain();
277
+ }
278
+ /**
279
+ * AU-02 / C10 — distance and cone attenuation are applied EXACTLY ONCE.
280
+ *
281
+ * Connected: the `PannerNode` owns them — `SpatialAudio` mirrors
282
+ * `distanceModel`/`refDistance`/`maxDistance`/`rolloffFactor` and the cone
283
+ * params onto the panner, so the software gain carries only
284
+ * `volume × occlusion` (occlusion is ours; the panner cannot do it).
285
+ * Previously the software gain multiplied `attenuationGain` on top of the
286
+ * panner's own inverse-model gain — the C10 double attenuation.
287
+ *
288
+ * Headless (no panner/filter could be built): the software gain applies the
289
+ * same formulas itself, so the emitter still attenuates rather than playing
290
+ * full volume with `connected: false`.
291
+ */
195
292
  applyGain() {
196
- this.source.setVolume(this.baseVolume * this.lastAttenuation * applyOcclusionToGain(this.occlusionRef));
293
+ const occlusionGain = applyOcclusionToGain(this.occlusionRef);
294
+ const spatialGain = this.connected ? 1 : this.lastAttenuation * this.lastCone;
295
+ this.source.setVolume(this.baseVolume * spatialGain * occlusionGain);
197
296
  }
198
297
  }
199
298
  //# sourceMappingURL=PositionalEmitter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PositionalEmitter.js","sourceRoot":"","sources":["../../../../packages/audio/src/PositionalEmitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PositionalEmitter.js","sourceRoot":"","sources":["../../../../packages/audio/src/PositionalEmitter.ts"],"names":[],"mappings":"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"}
@@ -4,14 +4,38 @@ export interface SpatialAudioOptions {
4
4
  readonly context: AudioContextLike;
5
5
  readonly destination?: AudioNode;
6
6
  readonly position?: Vec3Like;
7
+ /**
8
+ * Direction the source's cone axis points (unit vector is not required).
9
+ * Panner semantics: a listener located along this vector from the source
10
+ * hears `coneInnerAngle` gain; behind the outer cone, `coneOuterGain`.
11
+ */
12
+ readonly orientation?: Vec3Like;
7
13
  readonly maxDistance?: number;
8
14
  readonly refDistance?: number;
9
15
  readonly rolloffFactor?: number;
16
+ /** AU-02: was hard-wired to "inverse"; now authored per emitter (three.js parity). */
17
+ readonly distanceModel?: DistanceModelType;
18
+ readonly panningModel?: PanningModelType;
19
+ /** Degrees. Inside this cone: no attenuation. Spec default 360 (omni). */
20
+ readonly coneInnerAngle?: number;
21
+ /** Degrees. Outside this cone: `coneOuterGain`. Spec default 360. */
22
+ readonly coneOuterAngle?: number;
23
+ /** Linear gain applied outside the outer cone, [0, 1]. Spec default 0. */
24
+ readonly coneOuterGain?: number;
10
25
  }
11
26
  export declare class SpatialAudio {
12
27
  readonly panner: PannerNode;
28
+ private orientationRef;
13
29
  constructor(options: SpatialAudioOptions);
30
+ get orientation(): Vec3Like;
14
31
  setPosition(position: Vec3Like): void;
32
+ /**
33
+ * Point the emitter's cone axis. Prefers the `orientationX/Y/Z` AudioParams;
34
+ * falls back to the legacy `setOrientation` for contexts (or minimal fakes)
35
+ * that predate the AudioParam surface — the same dual path `syncListener`
36
+ * uses for the listener.
37
+ */
38
+ setOrientation(orientation: Vec3Like): void;
15
39
  dispose(): void;
16
40
  }
17
41
  //# sourceMappingURL=SpatialAudio.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SpatialAudio.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/SpatialAudio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;gBAEhB,OAAO,EAAE,mBAAmB;IAWxC,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAMrC,OAAO,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"SpatialAudio.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/SpatialAudio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAKhD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,sFAAsF;IACtF,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IACzC,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,qEAAqE;IACrE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,OAAO,CAAC,cAAc,CAAwC;gBAElD,OAAO,EAAE,mBAAmB;IAiBxC,IAAI,WAAW,IAAI,QAAQ,CAE1B;IAED,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAMrC;;;;;OAKG;IACH,cAAc,CAAC,WAAW,EAAE,QAAQ,GAAG,IAAI;IAc3C,OAAO,IAAI,IAAI;CAGhB"}
@@ -1,20 +1,49 @@
1
+ /** The Web Audio PannerNode default orientation (unit +X) when none is authored. */
2
+ const DEFAULT_ORIENTATION = { x: 1, y: 0, z: 0 };
1
3
  export class SpatialAudio {
2
4
  panner;
5
+ orientationRef = { ...DEFAULT_ORIENTATION };
3
6
  constructor(options) {
4
7
  this.panner = options.context.createPanner();
5
- this.panner.panningModel = "HRTF";
6
- this.panner.distanceModel = "inverse";
8
+ this.panner.panningModel = options.panningModel ?? "HRTF";
9
+ this.panner.distanceModel = options.distanceModel ?? "inverse";
7
10
  this.panner.maxDistance = options.maxDistance ?? 10_000;
8
11
  this.panner.refDistance = options.refDistance ?? 1;
9
12
  this.panner.rolloffFactor = options.rolloffFactor ?? 1;
13
+ this.panner.coneInnerAngle = options.coneInnerAngle ?? 360;
14
+ this.panner.coneOuterAngle = options.coneOuterAngle ?? 360;
15
+ this.panner.coneOuterGain = options.coneOuterGain ?? 0;
10
16
  this.panner.connect(options.destination ?? options.context.destination);
11
17
  this.setPosition(options.position ?? { x: 0, y: 0, z: 0 });
18
+ if (options.orientation) {
19
+ this.setOrientation(options.orientation);
20
+ }
21
+ }
22
+ get orientation() {
23
+ return { ...this.orientationRef };
12
24
  }
13
25
  setPosition(position) {
14
26
  this.panner.positionX.value = position.x;
15
27
  this.panner.positionY.value = position.y;
16
28
  this.panner.positionZ.value = position.z;
17
29
  }
30
+ /**
31
+ * Point the emitter's cone axis. Prefers the `orientationX/Y/Z` AudioParams;
32
+ * falls back to the legacy `setOrientation` for contexts (or minimal fakes)
33
+ * that predate the AudioParam surface — the same dual path `syncListener`
34
+ * uses for the listener.
35
+ */
36
+ setOrientation(orientation) {
37
+ this.orientationRef = { ...orientation };
38
+ const panner = this.panner;
39
+ if (panner.orientationX && panner.orientationY && panner.orientationZ) {
40
+ panner.orientationX.value = orientation.x;
41
+ panner.orientationY.value = orientation.y;
42
+ panner.orientationZ.value = orientation.z;
43
+ return;
44
+ }
45
+ panner.setOrientation?.(orientation.x, orientation.y, orientation.z);
46
+ }
18
47
  dispose() {
19
48
  this.panner.disconnect();
20
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SpatialAudio.js","sourceRoot":"","sources":["../../../../packages/audio/src/SpatialAudio.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,YAAY;IACd,MAAM,CAAa;IAE5B,YAAY,OAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,SAAS,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACxE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,WAAW,CAAC,QAAkB;QAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;CACF"}
1
+ {"version":3,"file":"SpatialAudio.js","sourceRoot":"","sources":["../../../../packages/audio/src/SpatialAudio.ts"],"names":[],"mappings":"AAGA,oFAAoF;AACpF,MAAM,mBAAmB,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AA0B3D,MAAM,OAAO,YAAY;IACd,MAAM,CAAa;IACpB,cAAc,GAAa,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAE9D,YAAY,OAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,SAAS,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,GAAG,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,GAAG,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACxE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,WAAW;QACb,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED,WAAW,CAAC,QAAkB;QAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,WAAqB;QAClC,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAEnB,CAAC;QACF,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACtE,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,MAAM,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Voice → PannerNode (HRTF on high/ultra, equalpower otherwise; inverse
5
5
  * distance, refDistance 1, maxDistance 60, rolloff 1) → occlusion lowpass
6
- * (BiquadFilterNode, 20 kHz open → 900 Hz occluded, exponential map) → cue
6
+ * (BiquadFilterNode, ~20 kHz open → 400 Hz occluded, quadratic map) → cue
7
7
  * gain → bus.
8
8
  */
9
9
  import type { SoundBiquadLike, SoundGraphContext, SoundNodeLike, SoundPannerLike, Vec3 } from "./types.js";
@@ -21,7 +21,7 @@ export interface SpatialNode {
21
21
  readonly occlusionFilter: SoundBiquadLike;
22
22
  setPosition(p: Vec3): void;
23
23
  setVelocity(v: Vec3): void;
24
- /** 0 = open (20 kHz), 1 = fully occluded (900 Hz). */
24
+ /** 0 = open (~20 kHz), 1 = fully occluded (400 Hz). */
25
25
  setOcclusion(amount01: number): void;
26
26
  dispose(): void;
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SpatialVoice.d.ts","sourceRoot":"","sources":["../../../../../packages/audio/src/game-sound/SpatialVoice.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,IAAI,EACL,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,sDAAsD;IACtD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAMD,eAAO,MAAM,WAAW,GAAI,UAAU,MAAM,KAAG,MACmC,CAAC;AAEnF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAuF1E"}
1
+ {"version":3,"file":"SpatialVoice.d.ts","sourceRoot":"","sources":["../../../../../packages/audio/src/game-sound/SpatialVoice.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,IAAI,EACL,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,uDAAuD;IACvD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAMD,eAAO,MAAM,WAAW,GAAI,UAAU,MAAM,KAAG,MACmC,CAAC;AAEnF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAuF1E"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Voice → PannerNode (HRTF on high/ultra, equalpower otherwise; inverse
5
5
  * distance, refDistance 1, maxDistance 60, rolloff 1) → occlusion lowpass
6
- * (BiquadFilterNode, 20 kHz open → 900 Hz occluded, exponential map) → cue
6
+ * (BiquadFilterNode, ~20 kHz open → 400 Hz occluded, quadratic map) → cue
7
7
  * gain → bus.
8
8
  */
9
9
  import { clamp, vec3 } from "./types.js";
package/dist/index.d.ts CHANGED
@@ -11,13 +11,15 @@ export { AudioContextManager } from "./AudioContextManager.js";
11
11
  export type { AudioContextLike, AudioContextManagerOptions, AudioContextState } from "./AudioContextManager.js";
12
12
  export type { AudioEffect } from "./AudioEffect.js";
13
13
  export { AudioListener } from "./AudioListener.js";
14
- export type { Vec3Like } from "./AudioListener.js";
14
+ export type { AudioListenerOptions, Vec3Like } from "./AudioListener.js";
15
+ export { AudioAnalyser, createAudioAnalyser } from "./AudioAnalyser.js";
16
+ export type { AudioAnalyserOptions } from "./AudioAnalyser.js";
15
17
  export { AudioMixer, createAudioMixerEvidence, createAnimationAudioMixer } from "./AudioMixer.js";
16
18
  export type { AudioMixerBusEvidence, AudioMixerEvidence, AnimationAudioMixer, AnimationAudioMixerOptions } from "./AudioMixer.js";
17
19
  export { AudioSource } from "./AudioSource.js";
18
20
  export type { AudioSourceOptions, AudioSourceState } from "./AudioSource.js";
19
- export { PositionalEmitter, applyOcclusionToGain, computeDistanceAttenuation, computeDopplerShift, occlusionLowpassFrequency, resolveOcclusion } from "./PositionalEmitter.js";
20
- export type { DistanceAttenuationModel, DistanceAttenuationOptions, DopplerOptions, OcclusionHook, PositionalEmitterEvidence, PositionalEmitterOptions } from "./PositionalEmitter.js";
21
+ export { PositionalEmitter, applyOcclusionToGain, computeConeGain, computeDistanceAttenuation, computeDopplerShift, occlusionLowpassFrequency, resolveOcclusion } from "./PositionalEmitter.js";
22
+ export type { ConeOptions, DistanceAttenuationModel, DistanceAttenuationOptions, DopplerOptions, OcclusionHook, PositionalEmitterEvidence, PositionalEmitterOptions } from "./PositionalEmitter.js";
21
23
  export { attachFocusPolicy, createGameMixer, focusHandlersForMixer } from "./GameMixer.js";
22
24
  export type { FocusEventTargetLike, FocusMutePolicy, FocusPolicyHandlers, GameMixer, GameMixerBusLevel, GameMixerEvidence, GameMixerOptions } from "./GameMixer.js";
23
25
  export { FootstepPlayer } from "./Footsteps.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -5,9 +5,10 @@ export { createAudioTimelineMixSnapshot, defaultAudioTimelineBusForRole, validat
5
5
  export { audioWaveformPeakRange, createAudioWaveform, createAudioWaveformPath, createAudioWaveformReviewData, sampleAudioWaveformAtTime } from "./AudioWaveform.js";
6
6
  export { AudioContextManager } from "./AudioContextManager.js";
7
7
  export { AudioListener } from "./AudioListener.js";
8
+ export { AudioAnalyser, createAudioAnalyser } from "./AudioAnalyser.js";
8
9
  export { AudioMixer, createAudioMixerEvidence, createAnimationAudioMixer } from "./AudioMixer.js";
9
10
  export { AudioSource } from "./AudioSource.js";
10
- export { PositionalEmitter, applyOcclusionToGain, computeDistanceAttenuation, computeDopplerShift, occlusionLowpassFrequency, resolveOcclusion } from "./PositionalEmitter.js";
11
+ export { PositionalEmitter, applyOcclusionToGain, computeConeGain, computeDistanceAttenuation, computeDopplerShift, occlusionLowpassFrequency, resolveOcclusion } from "./PositionalEmitter.js";
11
12
  export { attachFocusPolicy, createGameMixer, focusHandlersForMixer } from "./GameMixer.js";
12
13
  export { FootstepPlayer } from "./Footsteps.js";
13
14
  export { AudioSystem } from "./AudioSystem.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAclF,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAepJ,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAYjK,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAUxF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,+EAA+E;AAC/E,2EAA2E;AAC3E,OAAO,EAAE,qBAAqB,IAAI,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAG3F,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/audio/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAclF,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAepJ,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAYjK,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAU7B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAUxF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,+EAA+E;AAC/E,2EAA2E;AAC3E,OAAO,EAAE,qBAAqB,IAAI,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAG3F,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1F,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aura3d/audio",
3
- "version": "4.0.3",
3
+ "version": "4.0.5",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -11,7 +11,7 @@
11
11
  "main": "./dist/index.js",
12
12
  "types": "./dist/index.d.ts",
13
13
  "dependencies": {
14
- "@aura3d/scene": "4.0.3"
14
+ "@aura3d/scene": "4.0.5"
15
15
  },
16
16
  "description": "Browser audio lifecycle, clips, sources, buses, mixing, listener transforms, spatial attenuation, effects, and scene audio bridges for Aura3D.",
17
17
  "keywords": [