@newgameplusinc/odyssey-audio-video-sdk-dev 1.0.257 → 1.0.259

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 (83) hide show
  1. package/README.md +45 -1
  2. package/dist/audio/AudioNodeFactory.d.ts +130 -0
  3. package/dist/audio/AudioNodeFactory.js +158 -0
  4. package/dist/audio/AudioPipeline.d.ts +89 -0
  5. package/dist/audio/AudioPipeline.js +138 -0
  6. package/dist/{MLNoiseSuppressor.d.ts → audio/MLNoiseSuppressor.d.ts} +7 -7
  7. package/dist/{MLNoiseSuppressor.js → audio/MLNoiseSuppressor.js} +13 -41
  8. package/dist/audio/index.d.ts +6 -0
  9. package/dist/audio/index.js +22 -0
  10. package/dist/channels/huddle/HuddleChannel.d.ts +87 -0
  11. package/dist/channels/huddle/HuddleChannel.js +152 -0
  12. package/dist/channels/huddle/HuddleTypes.d.ts +85 -0
  13. package/dist/channels/huddle/HuddleTypes.js +25 -0
  14. package/dist/channels/huddle/index.d.ts +5 -0
  15. package/dist/channels/huddle/index.js +21 -0
  16. package/dist/channels/index.d.ts +5 -0
  17. package/dist/channels/index.js +21 -0
  18. package/dist/channels/spatial/SpatialAudioChannel.d.ts +144 -0
  19. package/dist/channels/spatial/SpatialAudioChannel.js +455 -0
  20. package/dist/channels/spatial/SpatialAudioTypes.d.ts +85 -0
  21. package/dist/channels/spatial/SpatialAudioTypes.js +42 -0
  22. package/dist/channels/spatial/index.d.ts +5 -0
  23. package/dist/channels/spatial/index.js +21 -0
  24. package/dist/{EventManager.d.ts → core/EventManager.d.ts} +4 -2
  25. package/dist/{EventManager.js → core/EventManager.js} +5 -3
  26. package/dist/{MediasoupManager.d.ts → core/MediasoupManager.d.ts} +10 -4
  27. package/dist/{MediasoupManager.js → core/MediasoupManager.js} +31 -42
  28. package/dist/core/index.d.ts +5 -0
  29. package/dist/core/index.js +21 -0
  30. package/dist/index.d.ts +2 -2
  31. package/dist/index.js +30 -4
  32. package/dist/sdk/index.d.ts +36 -0
  33. package/dist/sdk/index.js +121 -0
  34. package/dist/types/events.d.ts +154 -0
  35. package/dist/{types.js → types/events.js} +3 -0
  36. package/dist/types/index.d.ts +7 -0
  37. package/dist/types/index.js +23 -0
  38. package/dist/types/participant.d.ts +65 -0
  39. package/dist/types/participant.js +5 -0
  40. package/dist/types/position.d.ts +47 -0
  41. package/dist/types/position.js +9 -0
  42. package/dist/types/room.d.ts +82 -0
  43. package/dist/types/room.js +5 -0
  44. package/dist/utils/audio/clarity-score.d.ts +33 -0
  45. package/dist/utils/audio/clarity-score.js +81 -0
  46. package/dist/utils/audio/index.d.ts +5 -0
  47. package/dist/utils/audio/index.js +21 -0
  48. package/dist/utils/audio/voice-filter.d.ts +30 -0
  49. package/dist/utils/audio/voice-filter.js +70 -0
  50. package/dist/utils/index.d.ts +7 -0
  51. package/dist/utils/index.js +23 -0
  52. package/dist/utils/position/coordinates.d.ts +37 -0
  53. package/dist/utils/position/coordinates.js +61 -0
  54. package/dist/utils/position/index.d.ts +6 -0
  55. package/dist/utils/position/index.js +22 -0
  56. package/dist/utils/position/normalize.d.ts +37 -0
  57. package/dist/utils/position/normalize.js +78 -0
  58. package/dist/utils/position/snap.d.ts +51 -0
  59. package/dist/utils/position/snap.js +81 -0
  60. package/dist/utils/smoothing/gain-smoothing.d.ts +45 -0
  61. package/dist/utils/smoothing/gain-smoothing.js +77 -0
  62. package/dist/utils/smoothing/index.d.ts +5 -0
  63. package/dist/utils/smoothing/index.js +21 -0
  64. package/dist/utils/smoothing/pan-smoothing.d.ts +43 -0
  65. package/dist/utils/smoothing/pan-smoothing.js +85 -0
  66. package/dist/utils/spatial/angle-calc.d.ts +24 -0
  67. package/dist/utils/spatial/angle-calc.js +69 -0
  68. package/dist/utils/spatial/distance-calc.d.ts +33 -0
  69. package/dist/utils/spatial/distance-calc.js +48 -0
  70. package/dist/utils/spatial/gain-calc.d.ts +37 -0
  71. package/dist/utils/spatial/gain-calc.js +52 -0
  72. package/dist/utils/spatial/head-position.d.ts +32 -0
  73. package/dist/utils/spatial/head-position.js +76 -0
  74. package/dist/utils/spatial/index.d.ts +9 -0
  75. package/dist/utils/spatial/index.js +25 -0
  76. package/dist/utils/spatial/listener-calc.d.ts +28 -0
  77. package/dist/utils/spatial/listener-calc.js +74 -0
  78. package/dist/utils/spatial/pan-calc.d.ts +48 -0
  79. package/dist/utils/spatial/pan-calc.js +80 -0
  80. package/package.json +1 -1
  81. package/dist/SpatialAudioManager.d.ts +0 -272
  82. package/dist/SpatialAudioManager.js +0 -1537
  83. package/dist/types.d.ts +0 -73
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * Spatial Audio Types
4
+ *
5
+ * Type definitions for spatial audio processing
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DEFAULT_DENOISER_OPTIONS = exports.DEFAULT_SPATIAL_CONFIG = void 0;
9
+ /**
10
+ * Default spatial distance configuration
11
+ */
12
+ exports.DEFAULT_SPATIAL_CONFIG = {
13
+ refDistance: 1.2,
14
+ maxDistance: 15,
15
+ rolloffFactor: 1.35,
16
+ unit: 'auto',
17
+ };
18
+ /**
19
+ * Default denoiser configuration
20
+ */
21
+ exports.DEFAULT_DENOISER_OPTIONS = {
22
+ enabled: false,
23
+ threshold: 0.002,
24
+ noiseFloor: 0.0005,
25
+ release: 0.4,
26
+ attack: 0.1,
27
+ holdMs: 200,
28
+ maxReduction: 0.15,
29
+ hissCut: 0.15,
30
+ expansionRatio: 1.05,
31
+ learnRate: 0.03,
32
+ voiceBoost: 0.35,
33
+ voiceSensitivity: 0.1,
34
+ voiceEnhancement: false,
35
+ silenceFloor: 0.0002,
36
+ silenceHoldMs: 400,
37
+ silenceReleaseMs: 200,
38
+ speechBoost: 0.25,
39
+ highBandGate: 0.15,
40
+ highBandAttack: 0.08,
41
+ highBandRelease: 0.03,
42
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Spatial module - Re-exports spatial audio channel functionality
3
+ */
4
+ export * from './SpatialAudioTypes';
5
+ export * from './SpatialAudioChannel';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Spatial module - Re-exports spatial audio channel functionality
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./SpatialAudioTypes"), exports);
21
+ __exportStar(require("./SpatialAudioChannel"), exports);
@@ -1,10 +1,12 @@
1
- import { EventEmitter } from "events";
2
- import { OdysseyEvent } from "./types";
3
1
  /**
2
+ * Event Manager
3
+ *
4
4
  * A clean, standalone event bus for the SDK, completely decoupled from the socket.
5
5
  * This ensures that only processed, structured SDK events are emitted to the application.
6
6
  * It extends the Node.js EventEmitter to provide a standard and reliable event API.
7
7
  */
8
+ import { EventEmitter } from 'events';
9
+ import { OdysseyEvent } from '../types/events';
8
10
  export declare class EventManager extends EventEmitter {
9
11
  constructor();
10
12
  on(event: OdysseyEvent, listener: (...args: any[]) => void): this;
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventManager = void 0;
4
- const events_1 = require("events");
5
2
  /**
3
+ * Event Manager
4
+ *
6
5
  * A clean, standalone event bus for the SDK, completely decoupled from the socket.
7
6
  * This ensures that only processed, structured SDK events are emitted to the application.
8
7
  * It extends the Node.js EventEmitter to provide a standard and reliable event API.
9
8
  */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.EventManager = void 0;
11
+ const events_1 = require("events");
10
12
  class EventManager extends events_1.EventEmitter {
11
13
  constructor() {
12
14
  super();
@@ -1,6 +1,12 @@
1
- import * as mediasoupClient from "mediasoup-client";
2
- import { types } from "mediasoup-client";
3
- import { Socket } from "socket.io-client";
1
+ /**
2
+ * Mediasoup Manager
3
+ *
4
+ * Handles WebRTC transport, producer, and consumer management
5
+ * using the mediasoup-client library
6
+ */
7
+ import * as mediasoupClient from 'mediasoup-client';
8
+ import { types } from 'mediasoup-client';
9
+ import { Socket } from 'socket.io-client';
4
10
  export declare class MediasoupManager {
5
11
  private device;
6
12
  private socket;
@@ -20,7 +26,7 @@ export declare class MediasoupManager {
20
26
  consume(data: {
21
27
  consumerId: string;
22
28
  producerId: string;
23
- kind: "audio" | "video";
29
+ kind: 'audio' | 'video';
24
30
  rtpParameters: any;
25
31
  participantId: string;
26
32
  }): Promise<{
@@ -1,4 +1,10 @@
1
1
  "use strict";
2
+ /**
3
+ * Mediasoup Manager
4
+ *
5
+ * Handles WebRTC transport, producer, and consumer management
6
+ * using the mediasoup-client library
7
+ */
2
8
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
9
  if (k2 === undefined) k2 = k;
4
10
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -53,32 +59,32 @@ class MediasoupManager {
53
59
  }
54
60
  sendDeviceRtpCapabilities(participantId) {
55
61
  this.participantId = participantId;
56
- this.socket.emit("device-rtp-capabilities", {
62
+ this.socket.emit('device-rtp-capabilities', {
57
63
  participantId,
58
64
  rtpCapabilities: this.device.rtpCapabilities,
59
65
  });
60
66
  }
61
67
  async createSendTransport(participantId) {
62
- const params = await this.createWebRtcTransport("send", participantId);
68
+ const params = await this.createWebRtcTransport('send', participantId);
63
69
  this.sendTransport = this.device.createSendTransport(params);
64
70
  this.connectSendTransport();
65
71
  }
66
72
  async createRecvTransport(participantId) {
67
- const params = await this.createWebRtcTransport("recv", participantId);
73
+ const params = await this.createWebRtcTransport('recv', participantId);
68
74
  this.recvTransport = this.device.createRecvTransport(params);
69
75
  this.connectRecvTransport();
70
76
  }
71
77
  connectSendTransport() {
72
- this.sendTransport?.on("connect", async ({ dtlsParameters }, callback, errback) => {
73
- this.socket.emit("connect-transport", { transportId: this.sendTransport.id, dtlsParameters }, (response) => {
78
+ this.sendTransport?.on('connect', async ({ dtlsParameters }, callback, errback) => {
79
+ this.socket.emit('connect-transport', { transportId: this.sendTransport.id, dtlsParameters }, (response) => {
74
80
  if (response.error)
75
81
  errback(new Error(response.error));
76
82
  else
77
83
  callback();
78
84
  });
79
85
  });
80
- this.sendTransport?.on("produce", async ({ kind, rtpParameters, appData, }, callback, errback) => {
81
- this.socket.emit("produce", {
86
+ this.sendTransport?.on('produce', async ({ kind, rtpParameters, appData, }, callback, errback) => {
87
+ this.socket.emit('produce', {
82
88
  transportId: this.sendTransport.id,
83
89
  kind,
84
90
  rtpParameters,
@@ -90,59 +96,48 @@ class MediasoupManager {
90
96
  callback({ id: response.producerId });
91
97
  });
92
98
  });
93
- // Handle transport connection state changes
94
- this.sendTransport?.on("connectionstatechange", (state) => {
95
- if (state === "failed" || state === "closed") {
96
- // Clear all producers since transport is dead
99
+ this.sendTransport?.on('connectionstatechange', (state) => {
100
+ if (state === 'failed' || state === 'closed') {
97
101
  this.producers.clear();
98
- // Emit event so parent SDK can recreate producers
99
- this.socket.emit("transport-failed", {
102
+ this.socket.emit('transport-failed', {
100
103
  participantId: this.participantId,
101
- direction: "send"
104
+ direction: 'send',
102
105
  });
103
106
  }
104
107
  });
105
108
  }
106
109
  connectRecvTransport() {
107
- this.recvTransport?.on("connect", async ({ dtlsParameters }, callback, errback) => {
108
- this.socket.emit("connect-transport", { transportId: this.recvTransport.id, dtlsParameters }, (response) => {
110
+ this.recvTransport?.on('connect', async ({ dtlsParameters }, callback, errback) => {
111
+ this.socket.emit('connect-transport', { transportId: this.recvTransport.id, dtlsParameters }, (response) => {
109
112
  if (response.error)
110
113
  errback(new Error(response.error));
111
114
  else
112
115
  callback();
113
116
  });
114
117
  });
115
- // Handle transport connection state changes
116
- this.recvTransport?.on("connectionstatechange", (state) => {
117
- if (state === "failed" || state === "closed") {
118
- // Consumers will be closed by server, SDK will handle via consumer.on('transportclose')
118
+ this.recvTransport?.on('connectionstatechange', (state) => {
119
+ if (state === 'failed' || state === 'closed') {
120
+ // Consumers will be closed by server
119
121
  }
120
122
  });
121
123
  }
122
124
  async produce(track, appData) {
123
125
  if (!this.sendTransport)
124
- throw new Error("Send transport not initialized");
125
- // Configure simulcast for video tracks for adaptive bitrate
126
+ throw new Error('Send transport not initialized');
126
127
  const produceOptions = { track, appData };
127
128
  if (track.kind === 'video') {
128
129
  produceOptions.encodings = [
129
- // Low quality layer - 100 kbps, good for poor connections
130
130
  { rid: 'r0', active: true, maxBitrate: 100000, scaleResolutionDownBy: 4 },
131
- // Medium quality layer - 300 kbps, balanced
132
131
  { rid: 'r1', active: true, maxBitrate: 300000, scaleResolutionDownBy: 2 },
133
- // High quality layer - 900 kbps, full resolution
134
- { rid: 'r2', active: true, maxBitrate: 900000, scaleResolutionDownBy: 1 }
132
+ { rid: 'r2', active: true, maxBitrate: 900000, scaleResolutionDownBy: 1 },
135
133
  ];
136
- // VP8 codec for simulcast support
137
134
  produceOptions.codecOptions = {
138
- videoGoogleStartBitrate: 1000
135
+ videoGoogleStartBitrate: 1000,
139
136
  };
140
137
  }
141
138
  const producer = await this.sendTransport.produce(produceOptions);
142
- // Handle producer events
143
139
  producer.on('transportclose', () => {
144
140
  this.producers.delete(producer.id);
145
- // The main SDK (index.ts) should handle recreation
146
141
  });
147
142
  producer.on('trackended', () => {
148
143
  producer.close();
@@ -153,17 +148,15 @@ class MediasoupManager {
153
148
  }
154
149
  async consume(data) {
155
150
  if (!this.recvTransport)
156
- throw new Error("Receive transport not set up");
151
+ throw new Error('Receive transport not set up');
157
152
  const consumer = await this.recvTransport.consume({
158
153
  id: data.consumerId,
159
154
  producerId: data.producerId,
160
155
  kind: data.kind,
161
156
  rtpParameters: data.rtpParameters,
162
157
  });
163
- // Handle consumer events
164
158
  consumer.on('transportclose', () => {
165
159
  this.consumers.delete(consumer.id);
166
- // The main SDK (index.ts) should handle recreation
167
160
  });
168
161
  consumer.on('trackended', () => {
169
162
  consumer.close();
@@ -174,7 +167,7 @@ class MediasoupManager {
174
167
  }
175
168
  async resumeConsumer(consumerId) {
176
169
  return new Promise((resolve, reject) => {
177
- this.socket.emit("resume-consumer", { consumerId, participantId: this.participantId }, (response) => {
170
+ this.socket.emit('resume-consumer', { consumerId, participantId: this.participantId }, (response) => {
178
171
  if (response.error) {
179
172
  reject(new Error(response.error));
180
173
  }
@@ -186,23 +179,19 @@ class MediasoupManager {
186
179
  }
187
180
  async createWebRtcTransport(direction, participantId) {
188
181
  return new Promise((resolve, reject) => {
189
- // Set up listener for transport-created event
190
182
  const handleTransportCreated = (data) => {
191
183
  if (data.type === direction) {
192
- // Remove listener to prevent memory leaks
193
- this.socket.off("transport-created", handleTransportCreated);
184
+ this.socket.off('transport-created', handleTransportCreated);
194
185
  if (data.error) {
195
186
  return reject(new Error(data.error));
196
187
  }
197
188
  resolve(data.params);
198
189
  }
199
190
  };
200
- this.socket.on("transport-created", handleTransportCreated);
201
- // Emit the request
202
- this.socket.emit("create-transport", { direction, participantId });
203
- // Add timeout to prevent hanging forever
191
+ this.socket.on('transport-created', handleTransportCreated);
192
+ this.socket.emit('create-transport', { direction, participantId });
204
193
  setTimeout(() => {
205
- this.socket.off("transport-created", handleTransportCreated);
194
+ this.socket.off('transport-created', handleTransportCreated);
206
195
  reject(new Error(`Timeout waiting for ${direction} transport`));
207
196
  }, 10000);
208
197
  });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core module - Re-exports core SDK components
3
+ */
4
+ export * from './EventManager';
5
+ export * from './MediasoupManager';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Core module - Re-exports core SDK components
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./EventManager"), exports);
21
+ __exportStar(require("./MediasoupManager"), exports);
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { EventManager } from "./EventManager";
2
- import { SpatialAudioOptions } from "./SpatialAudioManager";
1
+ import { EventManager } from "./core/EventManager";
2
+ import { SpatialAudioOptions } from "./channels/spatial/SpatialAudioChannel";
3
3
  import { Direction, MediaState, OdysseyEvent, Participant, Position, RoomJoinedData } from "./types";
4
4
  export declare class OdysseySpatialComms extends EventManager {
5
5
  private socket;
package/dist/index.js CHANGED
@@ -2,9 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OdysseySpatialComms = void 0;
4
4
  const socket_io_client_1 = require("socket.io-client");
5
- const EventManager_1 = require("./EventManager");
6
- const MediasoupManager_1 = require("./MediasoupManager");
7
- const SpatialAudioManager_1 = require("./SpatialAudioManager");
5
+ const EventManager_1 = require("./core/EventManager");
6
+ const MediasoupManager_1 = require("./core/MediasoupManager");
7
+ const SpatialAudioChannel_1 = require("./channels/spatial/SpatialAudioChannel");
8
8
  class OdysseySpatialComms extends EventManager_1.EventManager {
9
9
  constructor(serverUrl, spatialOptions) {
10
10
  super(); // Initialize the EventEmitter base class
@@ -14,7 +14,7 @@ class OdysseySpatialComms extends EventManager_1.EventManager {
14
14
  transports: ["websocket"],
15
15
  });
16
16
  this.mediasoupManager = new MediasoupManager_1.MediasoupManager(this.socket);
17
- this.spatialAudioManager = new SpatialAudioManager_1.SpatialAudioManager(spatialOptions);
17
+ this.spatialAudioManager = new SpatialAudioChannel_1.SpatialAudioManager(spatialOptions);
18
18
  // Set max listeners to prevent warning
19
19
  this.setMaxListeners(50);
20
20
  this.listenForEvents();
@@ -211,6 +211,15 @@ class OdysseySpatialComms extends EventManager_1.EventManager {
211
211
  pan: spatialData?.pan,
212
212
  dxLocal: spatialData?.dxLocal,
213
213
  };
214
+ // ========== DEBUG: SDK SENDING TO SERVER ==========
215
+ console.log("📤 [SDK->Server] updatePosition:", {
216
+ participantId: updateData.participantId,
217
+ position: updateData.position,
218
+ direction: updateData.direction,
219
+ rot: updateData.rot,
220
+ pan: updateData.pan,
221
+ dxLocal: updateData.dxLocal,
222
+ });
214
223
  this.socket.emit("update-position", updateData);
215
224
  }
216
225
  }
@@ -229,6 +238,13 @@ class OdysseySpatialComms extends EventManager_1.EventManager {
229
238
  this.spatialAudioManager.setListenerPosition(position, orientation);
230
239
  }
231
240
  setListenerFromLSD(listenerPos, cameraPos, lookAtPos, rot) {
241
+ // ========== DEBUG: LISTENER POSITION UPDATE ==========
242
+ console.log("🎧 [SDK] setListenerFromLSD:", {
243
+ listenerPos,
244
+ cameraPos,
245
+ lookAtPos,
246
+ rot,
247
+ });
232
248
  this.spatialAudioManager.setListenerFromLSD(listenerPos, cameraPos, lookAtPos, rot);
233
249
  }
234
250
  listenForEvents() {
@@ -436,6 +452,16 @@ class OdysseySpatialComms extends EventManager_1.EventManager {
436
452
  }
437
453
  });
438
454
  this.socket.on("participant-position-updated", (data) => {
455
+ // ========== DEBUG: SDK RECEIVED FROM SERVER ==========
456
+ console.log("📥 [SDK<-Server] participant-position-updated:", {
457
+ participantId: data.participantId,
458
+ position: data.position,
459
+ direction: data.direction,
460
+ rot: data.rot,
461
+ pan: data.pan,
462
+ dxLocal: data.dxLocal,
463
+ currentChannel: data.currentChannel,
464
+ });
439
465
  const participant = this.room?.participants.get(data.participantId);
440
466
  if (participant) {
441
467
  participant.position = data.position;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Odyssey Mediasoup SDK - Main Entry Point
3
+ *
4
+ * A comprehensive WebRTC SDK for real-time audio/video communication
5
+ * with spatial audio and ML-powered noise suppression.
6
+ *
7
+ * @module @odyssey/mediasoup-sdk
8
+ */
9
+ export type { Position, Direction, Rotation, ListenerRight, UnrealPosition, StandardPosition, } from '../types/position';
10
+ export type { Participant, MediaState, ParticipantSnapshot, } from '../types/participant';
11
+ export type { RoomJoinedEvent, ConsumerCreatedEvent, ConsumerClosedEvent, ConsumerPausedEvent, ConsumerResumedEvent, ParticipantJoinedEvent, ParticipantLeftEvent, ParticipantPositionEvent, MuteStateChangedEvent, HuddleInviteReceivedEvent, HuddleResponseEvent, OdysseyEvent, OdysseyEventMap, } from '../types/events';
12
+ export type { Room, RoomJoinedData, JoinRoomData, ConsumerCreatedData, TransportOptions, ProducerOptions, } from '../types/room';
13
+ export { getDistanceBetween, getHorizontalDistance, isWithinRange, } from '../utils/spatial/distance-calc';
14
+ export { calculateLogarithmicGain, DEFAULT_GAIN_CONFIG, type GainConfig, } from '../utils/spatial/gain-calc';
15
+ export { calculateListenerRight, calculatePanFromPositions, panValueToPanning, type Panning, } from '../utils/spatial/pan-calc';
16
+ export { computeHeadPosition, parseBodyHeight, getVectorFromListener, } from '../utils/spatial/head-position';
17
+ export { getListenerRightFromRotation, calculateListenerOrientation, type ListenerOrientation, } from '../utils/spatial/listener-calc';
18
+ export { computeAzimuthFromPositions, calculateAngleToSource, } from '../utils/spatial/angle-calc';
19
+ export { normalizePositionUnits, metersToCentimeters, centimetersToMeters, isLikelyCentimeters, } from '../utils/position/normalize';
20
+ export { PositionSnapCache, snapPositionSimple, SNAP_CONFIG, type SnapConfig, } from '../utils/position/snap';
21
+ export { unrealToStandard, standardToUnreal, autoConvertToStandard, } from '../utils/position/coordinates';
22
+ export { PanSmoother, DEFAULT_PAN_SMOOTHER_OPTIONS, type PanSmootherOptions, } from '../utils/smoothing/pan-smoothing';
23
+ export { applyGainSmooth, applyStereoPanSmooth, GainTracker, } from '../utils/smoothing/gain-smoothing';
24
+ export { calculateClarityScore, calculateProximityWeight, normalizeVector, } from '../utils/audio/clarity-score';
25
+ export { calculateAdaptiveHighpass, createVoiceFilterChain, } from '../utils/audio/voice-filter';
26
+ export { HuddleChannel, type HuddleChannelConfig, } from '../channels/huddle/HuddleChannel';
27
+ export { SPATIAL_CHANNEL_ID, isHuddleChannel, type HuddleInvite, type HuddleResponse, type HuddleAcceptResponse, type HuddleRejectResponse, } from '../channels/huddle/HuddleTypes';
28
+ export { SpatialAudioChannel, type SpatialAudioConfig, } from '../channels/spatial/SpatialAudioChannel';
29
+ export { DEFAULT_SPATIAL_CONFIG, DEFAULT_DENOISER_OPTIONS, type SpatialDistanceConfig, type DenoiserOptions, type ParticipantAudioNodes, type ListenerState, } from '../channels/spatial/SpatialAudioTypes';
30
+ export { createMasterChain, createFilterChain, connectFilterChain, createLimiter, createMonoDownmixChain, connectMonoDownmixChain, DEFAULT_PIPELINE_CONFIG, type AudioPipelineConfig, type MasterAudioChain, type ParticipantFilterChain, type MonoDownmixChain, } from '../audio/AudioPipeline';
31
+ export { createPanner, createStereoPanner, createGain, createAnalyser, createHighpassFilter, createLowpassFilter, createPeakingFilter, createCompressor, createMediaStreamSource, DEFAULT_PANNER_CONFIG, type PannerConfig, type HighpassConfig, type LowpassConfig, type PeakingConfig, type CompressorConfig, } from '../audio/AudioNodeFactory';
32
+ export { MLNoiseSuppressor } from '../audio/MLNoiseSuppressor';
33
+ export { EventManager } from '../core/EventManager';
34
+ export { MediasoupManager } from '../core/MediasoupManager';
35
+ export declare const SDK_VERSION = "2.0.0";
36
+ export declare const SDK_NAME = "Odyssey Mediasoup SDK";
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Odyssey Mediasoup SDK - Main Entry Point
4
+ *
5
+ * A comprehensive WebRTC SDK for real-time audio/video communication
6
+ * with spatial audio and ML-powered noise suppression.
7
+ *
8
+ * @module @odyssey/mediasoup-sdk
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.createStereoPanner = exports.createPanner = exports.DEFAULT_PIPELINE_CONFIG = exports.connectMonoDownmixChain = exports.createMonoDownmixChain = exports.createLimiter = exports.connectFilterChain = exports.createFilterChain = exports.createMasterChain = exports.DEFAULT_DENOISER_OPTIONS = exports.DEFAULT_SPATIAL_CONFIG = exports.SpatialAudioChannel = exports.isHuddleChannel = exports.SPATIAL_CHANNEL_ID = exports.HuddleChannel = exports.createVoiceFilterChain = exports.calculateAdaptiveHighpass = exports.normalizeVector = exports.calculateProximityWeight = exports.calculateClarityScore = exports.GainTracker = exports.applyStereoPanSmooth = exports.applyGainSmooth = exports.DEFAULT_PAN_SMOOTHER_OPTIONS = exports.PanSmoother = exports.autoConvertToStandard = exports.standardToUnreal = exports.unrealToStandard = exports.SNAP_CONFIG = exports.snapPositionSimple = exports.PositionSnapCache = exports.isLikelyCentimeters = exports.centimetersToMeters = exports.metersToCentimeters = exports.normalizePositionUnits = exports.calculateAngleToSource = exports.computeAzimuthFromPositions = exports.calculateListenerOrientation = exports.getListenerRightFromRotation = exports.getVectorFromListener = exports.parseBodyHeight = exports.computeHeadPosition = exports.panValueToPanning = exports.calculatePanFromPositions = exports.calculateListenerRight = exports.DEFAULT_GAIN_CONFIG = exports.calculateLogarithmicGain = exports.isWithinRange = exports.getHorizontalDistance = exports.getDistanceBetween = void 0;
12
+ exports.SDK_NAME = exports.SDK_VERSION = exports.MediasoupManager = exports.EventManager = exports.MLNoiseSuppressor = exports.DEFAULT_PANNER_CONFIG = exports.createMediaStreamSource = exports.createCompressor = exports.createPeakingFilter = exports.createLowpassFilter = exports.createHighpassFilter = exports.createAnalyser = exports.createGain = void 0;
13
+ // ============================================================================
14
+ // Utils - Spatial Audio Calculations
15
+ // ============================================================================
16
+ var distance_calc_1 = require("../utils/spatial/distance-calc");
17
+ Object.defineProperty(exports, "getDistanceBetween", { enumerable: true, get: function () { return distance_calc_1.getDistanceBetween; } });
18
+ Object.defineProperty(exports, "getHorizontalDistance", { enumerable: true, get: function () { return distance_calc_1.getHorizontalDistance; } });
19
+ Object.defineProperty(exports, "isWithinRange", { enumerable: true, get: function () { return distance_calc_1.isWithinRange; } });
20
+ var gain_calc_1 = require("../utils/spatial/gain-calc");
21
+ Object.defineProperty(exports, "calculateLogarithmicGain", { enumerable: true, get: function () { return gain_calc_1.calculateLogarithmicGain; } });
22
+ Object.defineProperty(exports, "DEFAULT_GAIN_CONFIG", { enumerable: true, get: function () { return gain_calc_1.DEFAULT_GAIN_CONFIG; } });
23
+ var pan_calc_1 = require("../utils/spatial/pan-calc");
24
+ Object.defineProperty(exports, "calculateListenerRight", { enumerable: true, get: function () { return pan_calc_1.calculateListenerRight; } });
25
+ Object.defineProperty(exports, "calculatePanFromPositions", { enumerable: true, get: function () { return pan_calc_1.calculatePanFromPositions; } });
26
+ Object.defineProperty(exports, "panValueToPanning", { enumerable: true, get: function () { return pan_calc_1.panValueToPanning; } });
27
+ var head_position_1 = require("../utils/spatial/head-position");
28
+ Object.defineProperty(exports, "computeHeadPosition", { enumerable: true, get: function () { return head_position_1.computeHeadPosition; } });
29
+ Object.defineProperty(exports, "parseBodyHeight", { enumerable: true, get: function () { return head_position_1.parseBodyHeight; } });
30
+ Object.defineProperty(exports, "getVectorFromListener", { enumerable: true, get: function () { return head_position_1.getVectorFromListener; } });
31
+ var listener_calc_1 = require("../utils/spatial/listener-calc");
32
+ Object.defineProperty(exports, "getListenerRightFromRotation", { enumerable: true, get: function () { return listener_calc_1.getListenerRightFromRotation; } });
33
+ Object.defineProperty(exports, "calculateListenerOrientation", { enumerable: true, get: function () { return listener_calc_1.calculateListenerOrientation; } });
34
+ var angle_calc_1 = require("../utils/spatial/angle-calc");
35
+ Object.defineProperty(exports, "computeAzimuthFromPositions", { enumerable: true, get: function () { return angle_calc_1.computeAzimuthFromPositions; } });
36
+ Object.defineProperty(exports, "calculateAngleToSource", { enumerable: true, get: function () { return angle_calc_1.calculateAngleToSource; } });
37
+ // ============================================================================
38
+ // Utils - Position Processing
39
+ // ============================================================================
40
+ var normalize_1 = require("../utils/position/normalize");
41
+ Object.defineProperty(exports, "normalizePositionUnits", { enumerable: true, get: function () { return normalize_1.normalizePositionUnits; } });
42
+ Object.defineProperty(exports, "metersToCentimeters", { enumerable: true, get: function () { return normalize_1.metersToCentimeters; } });
43
+ Object.defineProperty(exports, "centimetersToMeters", { enumerable: true, get: function () { return normalize_1.centimetersToMeters; } });
44
+ Object.defineProperty(exports, "isLikelyCentimeters", { enumerable: true, get: function () { return normalize_1.isLikelyCentimeters; } });
45
+ var snap_1 = require("../utils/position/snap");
46
+ Object.defineProperty(exports, "PositionSnapCache", { enumerable: true, get: function () { return snap_1.PositionSnapCache; } });
47
+ Object.defineProperty(exports, "snapPositionSimple", { enumerable: true, get: function () { return snap_1.snapPositionSimple; } });
48
+ Object.defineProperty(exports, "SNAP_CONFIG", { enumerable: true, get: function () { return snap_1.SNAP_CONFIG; } });
49
+ var coordinates_1 = require("../utils/position/coordinates");
50
+ Object.defineProperty(exports, "unrealToStandard", { enumerable: true, get: function () { return coordinates_1.unrealToStandard; } });
51
+ Object.defineProperty(exports, "standardToUnreal", { enumerable: true, get: function () { return coordinates_1.standardToUnreal; } });
52
+ Object.defineProperty(exports, "autoConvertToStandard", { enumerable: true, get: function () { return coordinates_1.autoConvertToStandard; } });
53
+ // ============================================================================
54
+ // Utils - Audio Smoothing
55
+ // ============================================================================
56
+ var pan_smoothing_1 = require("../utils/smoothing/pan-smoothing");
57
+ Object.defineProperty(exports, "PanSmoother", { enumerable: true, get: function () { return pan_smoothing_1.PanSmoother; } });
58
+ Object.defineProperty(exports, "DEFAULT_PAN_SMOOTHER_OPTIONS", { enumerable: true, get: function () { return pan_smoothing_1.DEFAULT_PAN_SMOOTHER_OPTIONS; } });
59
+ var gain_smoothing_1 = require("../utils/smoothing/gain-smoothing");
60
+ Object.defineProperty(exports, "applyGainSmooth", { enumerable: true, get: function () { return gain_smoothing_1.applyGainSmooth; } });
61
+ Object.defineProperty(exports, "applyStereoPanSmooth", { enumerable: true, get: function () { return gain_smoothing_1.applyStereoPanSmooth; } });
62
+ Object.defineProperty(exports, "GainTracker", { enumerable: true, get: function () { return gain_smoothing_1.GainTracker; } });
63
+ // ============================================================================
64
+ // Utils - Audio Quality
65
+ // ============================================================================
66
+ var clarity_score_1 = require("../utils/audio/clarity-score");
67
+ Object.defineProperty(exports, "calculateClarityScore", { enumerable: true, get: function () { return clarity_score_1.calculateClarityScore; } });
68
+ Object.defineProperty(exports, "calculateProximityWeight", { enumerable: true, get: function () { return clarity_score_1.calculateProximityWeight; } });
69
+ Object.defineProperty(exports, "normalizeVector", { enumerable: true, get: function () { return clarity_score_1.normalizeVector; } });
70
+ var voice_filter_1 = require("../utils/audio/voice-filter");
71
+ Object.defineProperty(exports, "calculateAdaptiveHighpass", { enumerable: true, get: function () { return voice_filter_1.calculateAdaptiveHighpass; } });
72
+ Object.defineProperty(exports, "createVoiceFilterChain", { enumerable: true, get: function () { return voice_filter_1.createVoiceFilterChain; } });
73
+ // ============================================================================
74
+ // Channels
75
+ // ============================================================================
76
+ var HuddleChannel_1 = require("../channels/huddle/HuddleChannel");
77
+ Object.defineProperty(exports, "HuddleChannel", { enumerable: true, get: function () { return HuddleChannel_1.HuddleChannel; } });
78
+ var HuddleTypes_1 = require("../channels/huddle/HuddleTypes");
79
+ Object.defineProperty(exports, "SPATIAL_CHANNEL_ID", { enumerable: true, get: function () { return HuddleTypes_1.SPATIAL_CHANNEL_ID; } });
80
+ Object.defineProperty(exports, "isHuddleChannel", { enumerable: true, get: function () { return HuddleTypes_1.isHuddleChannel; } });
81
+ var SpatialAudioChannel_1 = require("../channels/spatial/SpatialAudioChannel");
82
+ Object.defineProperty(exports, "SpatialAudioChannel", { enumerable: true, get: function () { return SpatialAudioChannel_1.SpatialAudioChannel; } });
83
+ var SpatialAudioTypes_1 = require("../channels/spatial/SpatialAudioTypes");
84
+ Object.defineProperty(exports, "DEFAULT_SPATIAL_CONFIG", { enumerable: true, get: function () { return SpatialAudioTypes_1.DEFAULT_SPATIAL_CONFIG; } });
85
+ Object.defineProperty(exports, "DEFAULT_DENOISER_OPTIONS", { enumerable: true, get: function () { return SpatialAudioTypes_1.DEFAULT_DENOISER_OPTIONS; } });
86
+ // ============================================================================
87
+ // Audio Processing
88
+ // ============================================================================
89
+ var AudioPipeline_1 = require("../audio/AudioPipeline");
90
+ Object.defineProperty(exports, "createMasterChain", { enumerable: true, get: function () { return AudioPipeline_1.createMasterChain; } });
91
+ Object.defineProperty(exports, "createFilterChain", { enumerable: true, get: function () { return AudioPipeline_1.createFilterChain; } });
92
+ Object.defineProperty(exports, "connectFilterChain", { enumerable: true, get: function () { return AudioPipeline_1.connectFilterChain; } });
93
+ Object.defineProperty(exports, "createLimiter", { enumerable: true, get: function () { return AudioPipeline_1.createLimiter; } });
94
+ Object.defineProperty(exports, "createMonoDownmixChain", { enumerable: true, get: function () { return AudioPipeline_1.createMonoDownmixChain; } });
95
+ Object.defineProperty(exports, "connectMonoDownmixChain", { enumerable: true, get: function () { return AudioPipeline_1.connectMonoDownmixChain; } });
96
+ Object.defineProperty(exports, "DEFAULT_PIPELINE_CONFIG", { enumerable: true, get: function () { return AudioPipeline_1.DEFAULT_PIPELINE_CONFIG; } });
97
+ var AudioNodeFactory_1 = require("../audio/AudioNodeFactory");
98
+ Object.defineProperty(exports, "createPanner", { enumerable: true, get: function () { return AudioNodeFactory_1.createPanner; } });
99
+ Object.defineProperty(exports, "createStereoPanner", { enumerable: true, get: function () { return AudioNodeFactory_1.createStereoPanner; } });
100
+ Object.defineProperty(exports, "createGain", { enumerable: true, get: function () { return AudioNodeFactory_1.createGain; } });
101
+ Object.defineProperty(exports, "createAnalyser", { enumerable: true, get: function () { return AudioNodeFactory_1.createAnalyser; } });
102
+ Object.defineProperty(exports, "createHighpassFilter", { enumerable: true, get: function () { return AudioNodeFactory_1.createHighpassFilter; } });
103
+ Object.defineProperty(exports, "createLowpassFilter", { enumerable: true, get: function () { return AudioNodeFactory_1.createLowpassFilter; } });
104
+ Object.defineProperty(exports, "createPeakingFilter", { enumerable: true, get: function () { return AudioNodeFactory_1.createPeakingFilter; } });
105
+ Object.defineProperty(exports, "createCompressor", { enumerable: true, get: function () { return AudioNodeFactory_1.createCompressor; } });
106
+ Object.defineProperty(exports, "createMediaStreamSource", { enumerable: true, get: function () { return AudioNodeFactory_1.createMediaStreamSource; } });
107
+ Object.defineProperty(exports, "DEFAULT_PANNER_CONFIG", { enumerable: true, get: function () { return AudioNodeFactory_1.DEFAULT_PANNER_CONFIG; } });
108
+ var MLNoiseSuppressor_1 = require("../audio/MLNoiseSuppressor");
109
+ Object.defineProperty(exports, "MLNoiseSuppressor", { enumerable: true, get: function () { return MLNoiseSuppressor_1.MLNoiseSuppressor; } });
110
+ // ============================================================================
111
+ // Core
112
+ // ============================================================================
113
+ var EventManager_1 = require("../core/EventManager");
114
+ Object.defineProperty(exports, "EventManager", { enumerable: true, get: function () { return EventManager_1.EventManager; } });
115
+ var MediasoupManager_1 = require("../core/MediasoupManager");
116
+ Object.defineProperty(exports, "MediasoupManager", { enumerable: true, get: function () { return MediasoupManager_1.MediasoupManager; } });
117
+ // ============================================================================
118
+ // SDK Version
119
+ // ============================================================================
120
+ exports.SDK_VERSION = '2.0.0';
121
+ exports.SDK_NAME = 'Odyssey Mediasoup SDK';