@siteed/expo-audio-studio 2.8.6 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"AudioAnalysis.types.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/AudioAnalysis.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AudioAnalysis.types.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/AudioAnalysis.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoAudioStream.web.d.ts","sourceRoot":"","sources":["../../src/ExpoAudioStream.web.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExpoAudioStream.web.d.ts","sourceRoot":"","sources":["../../src/ExpoAudioStream.web.ts"],"names":[],"mappings":"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"}
@@ -20,15 +20,15 @@ export declare class WebRecorder {
20
20
  private bitDepth;
21
21
  private exportBitDepth;
22
22
  private audioAnalysisData;
23
- private logger?;
23
+ private readonly logger?;
24
24
  private compressedMediaRecorder;
25
25
  private compressedChunks;
26
26
  private compressedSize;
27
27
  private pendingCompressedChunk;
28
28
  private dataPointIdCounter;
29
29
  private deviceDisconnectionHandler;
30
- private mediaStream;
31
- private onInterruptionCallback?;
30
+ private readonly mediaStream;
31
+ private readonly onInterruptionCallback?;
32
32
  private _isDeviceDisconnected;
33
33
  private pcmData;
34
34
  private totalSampleCount;
@@ -85,6 +85,22 @@ export declare class WebRecorder {
85
85
  * @param event - The event containing audio analysis results
86
86
  */
87
87
  handleFeatureExtractorMessage(event: AudioFeaturesEvent): void;
88
+ /**
89
+ * Filters out data points with duplicate IDs
90
+ */
91
+ private filterUniqueDataPoints;
92
+ /**
93
+ * Updates the counter based on the highest ID in datapoints
94
+ */
95
+ private updateDataPointCounter;
96
+ /**
97
+ * Updates audio analysis data with segment results
98
+ */
99
+ private updateAudioAnalysisData;
100
+ /**
101
+ * Merges value ranges
102
+ */
103
+ private mergeRange;
88
104
  /**
89
105
  * Reset the data point counter to a specific value or zero
90
106
  * @param startCounterFrom Optional value to start the counter from (for continuing from previous recordings)
@@ -1 +1 @@
1
- {"version":3,"file":"WebRecorder.web.d.ts","sourceRoot":"","sources":["../../src/WebRecorder.web.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACtE,OAAO,EACH,yBAAyB,EACzB,sBAAsB,EACzB,MAAM,uBAAuB,CAAA;AAgB9B,UAAU,kBAAkB;IACxB,IAAI,EAAE;QACF,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,aAAa,CAAA;KACxB,CAAA;CACJ;AASD,qBAAa,WAAW;IACb,YAAY,EAAE,YAAY,CAAA;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,sBAAsB,CAAC,CAAQ;IACvC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,sBAAsB,CAAwB;IACtD,OAAO,CAAC,yBAAyB,CAA2B;IAC5D,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,uBAAuB,CAA6B;IAC5D,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,cAAc,CAAY;IAClC,OAAO,CAAC,sBAAsB,CAAoB;IAClD,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,0BAA0B,CAA4B;IAC9D,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,sBAAsB,CAAC,CAIrB;IACV,OAAO,CAAC,qBAAqB,CAAiB;IAC9C,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,gBAAgB,CAAY;IAEpC;;;OAGG;IACI,uBAAuB,EAAE,OAAO,CAAQ;IAE/C;;OAEG;IACH,IAAI,oBAAoB,IAAI,OAAO,CAElC;IAED;;;;;;;;;OASG;gBACS,EACR,YAAY,EACZ,MAAM,EACN,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,cAAc,EACd,MAAM,GACT,EAAE;QACC,YAAY,EAAE,YAAY,CAAA;QAC1B,MAAM,EAAE,0BAA0B,CAAA;QAClC,eAAe,EAAE,eAAe,CAAA;QAChC,sBAAsB,EAAE,sBAAsB,CAAA;QAC9C,yBAAyB,EAAE,yBAAyB,CAAA;QACpD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;YACrB,MAAM,EAAE,MAAM,CAAA;YACd,QAAQ,EAAE,OAAO,CAAA;YACjB,SAAS,EAAE,MAAM,CAAA;SACpB,KAAK,IAAI,CAAA;QACV,MAAM,CAAC,EAAE,WAAW,CAAA;KACvB;IAyDD;;;OAGG;IACG,IAAI;IAoKV;;;OAGG;IACH,OAAO,CAAC,aAAa;IAyBrB;;;OAGG;IACH,0BAA0B;IAmC1B;;;;OAIG;IACH,6BAA6B,CAAC,KAAK,EAAE,kBAAkB;IAkGvD;;;OAGG;IACH,qBAAqB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBtD;;;OAGG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;;OAGG;IACH,sBAAsB,IAAI,IAAI;IAO9B;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,UAAQ;IA0B9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyC5B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,cAAc,CAAC,EAAE,IAAI,CAAC;QAAC,gBAAgB,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IA8CzE;;;OAGG;IACI,OAAO;IAyCd;;;OAGG;IACH,KAAK;IAmBL;;;OAGG;IACI,qBAAqB;IAW5B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;;OAGG;IACH,MAAM;IAiBN;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IAkCpC;;OAEG;IACH,eAAe,CACX,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM;IAsBnB;;OAEG;IACH,OAAO,CAAC,iCAAiC;IA+CzC;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASnC;;;OAGG;IACH,WAAW,IAAI,MAAM;IAIrB;;;OAGG;IACH,mBAAmB,IAAI,IAAI,EAAE;IAI7B;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI;CAa5C"}
1
+ {"version":3,"file":"WebRecorder.web.d.ts","sourceRoot":"","sources":["../../src/WebRecorder.web.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACtE,OAAO,EACH,yBAAyB,EACzB,sBAAsB,EACzB,MAAM,uBAAuB,CAAA;AAgB9B,UAAU,kBAAkB;IACxB,IAAI,EAAE;QACF,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,aAAa,CAAA;KACxB,CAAA;CACJ;AASD,qBAAa,WAAW;IACb,YAAY,EAAE,YAAY,CAAA;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,sBAAsB,CAAC,CAAQ;IACvC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,sBAAsB,CAAwB;IACtD,OAAO,CAAC,yBAAyB,CAA2B;IAC5D,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAa;IACrC,OAAO,CAAC,uBAAuB,CAA6B;IAC5D,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,cAAc,CAAY;IAClC,OAAO,CAAC,sBAAsB,CAAoB;IAClD,OAAO,CAAC,kBAAkB,CAAY;IACtC,OAAO,CAAC,0BAA0B,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2B;IACvD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAI9B;IACV,OAAO,CAAC,qBAAqB,CAAiB;IAC9C,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,gBAAgB,CAAY;IAEpC;;;OAGG;IACI,uBAAuB,EAAE,OAAO,CAAQ;IAE/C;;OAEG;IACH,IAAI,oBAAoB,IAAI,OAAO,CAElC;IAED;;;;;;;;;OASG;gBACS,EACR,YAAY,EACZ,MAAM,EACN,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,cAAc,EACd,MAAM,GACT,EAAE;QACC,YAAY,EAAE,YAAY,CAAA;QAC1B,MAAM,EAAE,0BAA0B,CAAA;QAClC,eAAe,EAAE,eAAe,CAAA;QAChC,sBAAsB,EAAE,sBAAsB,CAAA;QAC9C,yBAAyB,EAAE,yBAAyB,CAAA;QACpD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;YACrB,MAAM,EAAE,MAAM,CAAA;YACd,QAAQ,EAAE,OAAO,CAAA;YACjB,SAAS,EAAE,MAAM,CAAA;SACpB,KAAK,IAAI,CAAA;QACV,MAAM,CAAC,EAAE,WAAW,CAAA;KACvB;IAyDD;;;OAGG;IACG,IAAI;IA6KV;;;OAGG;IACH,OAAO,CAAC,aAAa;IAyBrB;;;OAGG;IACH,0BAA0B;IAmC1B;;;;OAIG;IACH,6BAA6B,CAAC,KAAK,EAAE,kBAAkB;IAuBvD;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA0B/B;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;;OAGG;IACH,qBAAqB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI;IAoBtD;;;OAGG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;;OAGG;IACH,sBAAsB,IAAI,IAAI;IAO9B;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,UAAQ;IA0B9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyC5B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,cAAc,CAAC,EAAE,IAAI,CAAC;QAAC,gBAAgB,CAAC,EAAE,IAAI,CAAA;KAAE,CAAC;IA8CzE;;;OAGG;IACI,OAAO;IA0Cd;;;OAGG;IACH,KAAK;IAmBL;;;OAGG;IACI,qBAAqB;IAW5B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;;OAGG;IACH,MAAM;IAqBN;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IAuCpC;;OAEG;IACH,eAAe,CACX,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM;IAsBnB;;OAEG;IACH,OAAO,CAAC,iCAAiC;IAmDzC;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASnC;;;OAGG;IACH,WAAW,IAAI,MAAM;IAIrB;;;OAGG;IACH,mBAAmB,IAAI,IAAI,EAAE;IAI7B;;;OAGG;IACH,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI;CAa5C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@siteed/expo-audio-studio",
3
- "version": "2.8.6",
3
+ "version": "2.9.0",
4
4
  "description": "Comprehensive audio processing library for React Native and Expo with recording, analysis, visualization, and streaming capabilities across iOS, Android, and web",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",
@@ -55,12 +55,17 @@ export interface AudioFeatures {
55
55
 
56
56
  /**
57
57
  * Options to specify which audio features to extract.
58
+ * Note: Advanced features (spectral features, chromagram, pitch, etc.) are experimental,
59
+ * especially during live recording, due to high processing requirements.
58
60
  */
59
61
  export interface AudioFeaturesOptions {
62
+ // Basic features - well optimized
60
63
  energy?: boolean
61
- mfcc?: boolean
62
64
  rms?: boolean
63
65
  zcr?: boolean
66
+
67
+ // Advanced features - experimental, may impact performance in live recording
68
+ mfcc?: boolean
64
69
  spectralCentroid?: boolean
65
70
  spectralFlatness?: boolean
66
71
  spectralRolloff?: boolean
@@ -72,6 +77,8 @@ export interface AudioFeaturesOptions {
72
77
  spectralContrast?: boolean
73
78
  tonnetz?: boolean
74
79
  pitch?: boolean
80
+
81
+ // Utility
75
82
  crc32?: boolean
76
83
  }
77
84
 
@@ -850,7 +850,8 @@ export class ExpoAudioStreamWeb extends LegacyEventEmitter {
850
850
  }
851
851
  } catch (err) {
852
852
  this.logger?.warn(
853
- 'Error determining current device, using default'
853
+ 'Error determining current device, using default',
854
+ err
854
855
  )
855
856
  }
856
857
  }
@@ -48,15 +48,15 @@ export class WebRecorder {
48
48
  private bitDepth: number // Bit depth of the audio
49
49
  private exportBitDepth: number // Bit depth of the audio
50
50
  private audioAnalysisData: AudioAnalysis // Keep updating the full audio analysis data with latest events
51
- private logger?: ConsoleLike
51
+ private readonly logger?: ConsoleLike
52
52
  private compressedMediaRecorder: MediaRecorder | null = null
53
53
  private compressedChunks: Blob[] = []
54
54
  private compressedSize: number = 0
55
55
  private pendingCompressedChunk: Blob | null = null
56
56
  private dataPointIdCounter: number = 0 // Add this property to track the counter
57
57
  private deviceDisconnectionHandler: (() => void) | null = null
58
- private mediaStream: MediaStream | null = null
59
- private onInterruptionCallback?: (event: {
58
+ private readonly mediaStream: MediaStream | null = null
59
+ private readonly onInterruptionCallback?: (event: {
60
60
  reason: string
61
61
  isPaused: boolean
62
62
  timestamp: number
@@ -214,6 +214,11 @@ export class WebRecorder {
214
214
  ? event.data.position
215
215
  : this.position
216
216
 
217
+ // Simple position tracking for logging (no duplicate filtering)
218
+ this.logger?.debug(
219
+ `Audio chunk: position=${incomingPosition.toFixed(3)}s, size=${pcmBufferFloat.length}`
220
+ )
221
+
217
222
  // Calculate bytes per sample based on bit depth
218
223
  const bytesPerSample = this.bitDepth / 8
219
224
 
@@ -229,6 +234,17 @@ export class WebRecorder {
229
234
  )
230
235
  const samples = chunk.length // Number of samples in this chunk
231
236
 
237
+ // Only store PCM data if web.storeUncompressedAudio is not explicitly false
238
+ const shouldStoreUncompressed =
239
+ this.config.web?.storeUncompressedAudio !== false
240
+
241
+ // Store PCM chunks when needed - this is for the final WAV file
242
+ if (shouldStoreUncompressed) {
243
+ // Store the original Float32Array data for later WAV creation
244
+ this.appendPcmData(chunk)
245
+ this.totalSampleCount += chunk.length
246
+ }
247
+
232
248
  // Process features if enabled
233
249
  if (
234
250
  this.config.enableProcessing &&
@@ -252,39 +268,32 @@ export class WebRecorder {
252
268
  })
253
269
  }
254
270
 
255
- // Only store PCM data if web.storeUncompressedAudio is not explicitly false
256
- const shouldStoreUncompressed =
257
- this.config.web?.storeUncompressedAudio !== false
258
-
259
- // Store PCM chunks when needed
260
- if (shouldStoreUncompressed) {
261
- // Store the original Float32Array data for later WAV creation
262
- this.appendPcmData(chunk)
263
- this.totalSampleCount += chunk.length
264
- }
265
-
266
- // Emit chunk immediately
271
+ // Prepare compression data if available
272
+ const compression = this.pendingCompressedChunk
273
+ ? {
274
+ data: this.pendingCompressedChunk,
275
+ size: this.pendingCompressedChunk.size,
276
+ totalSize: this.compressedSize,
277
+ mimeType: 'audio/webm',
278
+ format: 'opus',
279
+ bitrate:
280
+ this.config.compression?.bitrate ?? 128000,
281
+ }
282
+ : undefined
283
+
284
+ // Emit chunk immediately - whether compressed or not
267
285
  this.emitAudioEventCallback({
268
286
  data: chunk,
269
287
  position: chunkPosition,
270
- compression: this.pendingCompressedChunk
271
- ? {
272
- data: this.pendingCompressedChunk,
273
- size: this.pendingCompressedChunk.size,
274
- totalSize: this.compressedSize,
275
- mimeType: 'audio/webm',
276
- format: 'opus',
277
- bitrate:
278
- this.config.compression?.bitrate ??
279
- 128000,
280
- }
281
- : undefined,
288
+ compression,
282
289
  })
290
+
291
+ // Reset pending compressed chunk after we've used it
292
+ this.pendingCompressedChunk = null
283
293
  }
284
294
 
285
295
  // Update our position based on the worklet's position if provided
286
296
  this.position = incomingPosition + duration
287
- this.pendingCompressedChunk = null
288
297
  }
289
298
 
290
299
  // Ensure we use all relevant settings from config
@@ -302,7 +311,7 @@ export class WebRecorder {
302
311
  channels,
303
312
  interval,
304
313
  position: this.position,
305
- deviceId: this.config.deviceId || 'default',
314
+ deviceId: this.config.deviceId ?? 'default',
306
315
  compression: this.config.compression
307
316
  ? {
308
317
  enabled: this.config.compression.enabled,
@@ -407,100 +416,109 @@ export class WebRecorder {
407
416
  * @param event - The event containing audio analysis results
408
417
  */
409
418
  handleFeatureExtractorMessage(event: AudioFeaturesEvent) {
410
- if (event.data.command === 'features') {
411
- const segmentResult = event.data.result
419
+ if (event.data.command !== 'features') return
412
420
 
413
- // Track existing IDs to prevent duplicates
414
- const existingIds = new Set(
415
- this.audioAnalysisData.dataPoints.map((dp) => dp.id)
416
- )
421
+ const segmentResult = event.data.result
422
+ const uniqueNewDataPoints = this.filterUniqueDataPoints(
423
+ segmentResult.dataPoints
424
+ )
417
425
 
418
- // Filter out datapoints with duplicate IDs
419
- const uniqueNewDataPoints = segmentResult.dataPoints.filter(
420
- (dp) => {
421
- return !existingIds.has(dp.id)
422
- }
423
- )
426
+ // Update counter based on the highest ID seen
427
+ this.updateDataPointCounter(uniqueNewDataPoints)
424
428
 
425
- // Log filtered duplicates if any
426
- if (
427
- uniqueNewDataPoints.length < segmentResult.dataPoints.length &&
428
- this.logger?.warn
429
- ) {
430
- this.logger.warn(
431
- `Filtered ${segmentResult.dataPoints.length - uniqueNewDataPoints.length} duplicate datapoints`
432
- )
433
- }
429
+ // Update analysis data with the new results
430
+ this.updateAudioAnalysisData(segmentResult, uniqueNewDataPoints)
434
431
 
435
- // Update counter based on the highest ID seen
436
- if (uniqueNewDataPoints.length > 0) {
437
- const lastDataPoint =
438
- uniqueNewDataPoints[uniqueNewDataPoints.length - 1]
432
+ // Send filtered result to avoid duplicate IDs
433
+ const filteredSegmentResult = {
434
+ ...segmentResult,
435
+ dataPoints: uniqueNewDataPoints,
436
+ }
439
437
 
440
- if (lastDataPoint && typeof lastDataPoint.id === 'number') {
441
- const nextIdValue = lastDataPoint.id + 1
438
+ this.emitAudioAnalysisCallback(filteredSegmentResult)
439
+ }
442
440
 
443
- if (nextIdValue > this.dataPointIdCounter) {
444
- this.dataPointIdCounter = nextIdValue
445
- this.logger?.debug(
446
- `Counter updated to ${this.dataPointIdCounter}`
447
- )
448
- }
449
- }
450
- }
441
+ /**
442
+ * Filters out data points with duplicate IDs
443
+ */
444
+ private filterUniqueDataPoints(dataPoints: any[]): any[] {
445
+ // Track existing IDs to prevent duplicates
446
+ const existingIds = new Set(
447
+ this.audioAnalysisData.dataPoints.map((dp) => dp.id)
448
+ )
451
449
 
452
- // Add unique data points to our analysis data
453
- this.audioAnalysisData.dataPoints.push(...uniqueNewDataPoints)
454
- this.audioAnalysisData.durationMs += segmentResult.durationMs
455
- this.audioAnalysisData.sampleRate = segmentResult.sampleRate
450
+ // Filter out datapoints with duplicate IDs
451
+ const uniquePoints = dataPoints.filter((dp) => !existingIds.has(dp.id))
456
452
 
457
- // Merge amplitude ranges
458
- if (segmentResult.amplitudeRange) {
459
- if (!this.audioAnalysisData.amplitudeRange) {
460
- this.audioAnalysisData.amplitudeRange = {
461
- ...segmentResult.amplitudeRange,
462
- }
463
- } else {
464
- this.audioAnalysisData.amplitudeRange = {
465
- min: Math.min(
466
- this.audioAnalysisData.amplitudeRange.min,
467
- segmentResult.amplitudeRange.min
468
- ),
469
- max: Math.max(
470
- this.audioAnalysisData.amplitudeRange.max,
471
- segmentResult.amplitudeRange.max
472
- ),
473
- }
474
- }
475
- }
453
+ // Log filtered duplicates if any
454
+ if (uniquePoints.length < dataPoints.length && this.logger?.warn) {
455
+ this.logger.warn(
456
+ `Filtered ${dataPoints.length - uniquePoints.length} duplicate datapoints`
457
+ )
458
+ }
476
459
 
477
- // Merge RMS ranges
478
- if (segmentResult.rmsRange) {
479
- if (!this.audioAnalysisData.rmsRange) {
480
- this.audioAnalysisData.rmsRange = {
481
- ...segmentResult.rmsRange,
482
- }
483
- } else {
484
- this.audioAnalysisData.rmsRange = {
485
- min: Math.min(
486
- this.audioAnalysisData.rmsRange.min,
487
- segmentResult.rmsRange.min
488
- ),
489
- max: Math.max(
490
- this.audioAnalysisData.rmsRange.max,
491
- segmentResult.rmsRange.max
492
- ),
493
- }
494
- }
495
- }
460
+ return uniquePoints
461
+ }
496
462
 
497
- // Send filtered result to avoid duplicate IDs
498
- const filteredSegmentResult = {
499
- ...segmentResult,
500
- dataPoints: uniqueNewDataPoints,
463
+ /**
464
+ * Updates the counter based on the highest ID in datapoints
465
+ */
466
+ private updateDataPointCounter(dataPoints: any[]): void {
467
+ if (dataPoints.length === 0) return
468
+
469
+ const lastDataPoint = dataPoints[dataPoints.length - 1]
470
+ if (lastDataPoint && typeof lastDataPoint.id === 'number') {
471
+ const nextIdValue = lastDataPoint.id + 1
472
+ if (nextIdValue > this.dataPointIdCounter) {
473
+ this.dataPointIdCounter = nextIdValue
474
+ this.logger?.debug(
475
+ `Counter updated to ${this.dataPointIdCounter}`
476
+ )
501
477
  }
478
+ }
479
+ }
502
480
 
503
- this.emitAudioAnalysisCallback(filteredSegmentResult)
481
+ /**
482
+ * Updates audio analysis data with segment results
483
+ */
484
+ private updateAudioAnalysisData(
485
+ segmentResult: AudioAnalysis,
486
+ uniqueDataPoints: any[]
487
+ ): void {
488
+ // Add unique data points to our analysis data
489
+ this.audioAnalysisData.dataPoints.push(...uniqueDataPoints)
490
+ this.audioAnalysisData.durationMs += segmentResult.durationMs
491
+ this.audioAnalysisData.sampleRate = segmentResult.sampleRate
492
+
493
+ // Update amplitude range if present
494
+ if (segmentResult.amplitudeRange) {
495
+ this.audioAnalysisData.amplitudeRange = this.mergeRange(
496
+ this.audioAnalysisData.amplitudeRange,
497
+ segmentResult.amplitudeRange
498
+ )
499
+ }
500
+
501
+ // Update RMS range if present
502
+ if (segmentResult.rmsRange) {
503
+ this.audioAnalysisData.rmsRange = this.mergeRange(
504
+ this.audioAnalysisData.rmsRange,
505
+ segmentResult.rmsRange
506
+ )
507
+ }
508
+ }
509
+
510
+ /**
511
+ * Merges value ranges
512
+ */
513
+ private mergeRange(
514
+ existing: { min: number; max: number } | undefined,
515
+ newRange: { min: number; max: number }
516
+ ): { min: number; max: number } {
517
+ if (!existing) return { ...newRange }
518
+
519
+ return {
520
+ min: Math.min(existing.min, newRange.min),
521
+ max: Math.max(existing.max, newRange.max),
504
522
  }
505
523
  }
506
524
 
@@ -510,8 +528,7 @@ export class WebRecorder {
510
528
  */
511
529
  resetDataPointCounter(startCounterFrom?: number): void {
512
530
  // Set the counter with the passed value or 0
513
- this.dataPointIdCounter =
514
- startCounterFrom !== undefined ? startCounterFrom : 0
531
+ this.dataPointIdCounter = startCounterFrom ?? 0
515
532
  this.logger?.debug(
516
533
  `Reset data point counter to ${this.dataPointIdCounter}`
517
534
  )
@@ -591,7 +608,7 @@ export class WebRecorder {
591
608
  }
592
609
 
593
610
  const sampleRate =
594
- this.config.sampleRate || this.audioContext.sampleRate
611
+ this.config.sampleRate ?? this.audioContext.sampleRate
595
612
  const channels = this.numberOfChannels || 1
596
613
 
597
614
  // Convert float32 PCM data to 16-bit PCM for WAV
@@ -648,8 +665,7 @@ export class WebRecorder {
648
665
 
649
666
  // Only create WAV if we have PCM data
650
667
  if (this.pcmData && this.pcmData.length > 0) {
651
- uncompressedBlob =
652
- (await this.createWavFromPcmData()) || undefined
668
+ uncompressedBlob = this.createWavFromPcmData() || undefined
653
669
  }
654
670
 
655
671
  // Return the compressed and/or uncompressed blobs if available
@@ -670,6 +686,7 @@ export class WebRecorder {
670
686
  this.pendingCompressedChunk = null
671
687
  this.pcmData = null
672
688
  this.totalSampleCount = 0
689
+ this.dataPointIdCounter = 0 // Reset counter
673
690
  }
674
691
  }
675
692
 
@@ -686,11 +703,10 @@ export class WebRecorder {
686
703
 
687
704
  // Check if AudioContext is already closed before attempting to close it
688
705
  if (this.audioContext && this.audioContext.state !== 'closed') {
689
- try {
690
- this.audioContext.close()
691
- } catch (e) {
692
- // Ignore closure errors - this happens if already closed
693
- }
706
+ this.audioContext.close().catch((e) => {
707
+ // Log closure errors but continue cleanup
708
+ this.logger?.warn('Error closing AudioContext:', e)
709
+ })
694
710
  }
695
711
 
696
712
  // Safely disconnect audioWorkletNode if it exists
@@ -698,7 +714,8 @@ export class WebRecorder {
698
714
  try {
699
715
  this.audioWorkletNode.disconnect()
700
716
  } catch (e) {
701
- // Ignore disconnection errors - node might be already disconnected
717
+ // Log disconnection errors but continue cleanup
718
+ this.logger?.warn('Error disconnecting audioWorkletNode:', e)
702
719
  }
703
720
  }
704
721
 
@@ -707,7 +724,8 @@ export class WebRecorder {
707
724
  try {
708
725
  this.source.disconnect()
709
726
  } catch (e) {
710
- // Ignore disconnection errors - source might be already disconnected
727
+ // Log disconnection errors but continue cleanup
728
+ this.logger?.warn('Error disconnecting source:', e)
711
729
  }
712
730
  }
713
731
 
@@ -797,8 +815,12 @@ export class WebRecorder {
797
815
  this.audioWorkletNode.connect(this.audioContext.destination)
798
816
  this.audioWorkletNode.port.postMessage({ command: 'resume' })
799
817
  this.compressedMediaRecorder?.resume()
800
- } catch (error) {
818
+ } catch (error: unknown) {
801
819
  this.logger?.error('Error in resume(): ', error)
820
+ // Rethrow the error to inform callers
821
+ throw new Error(
822
+ `Failed to resume recording: ${error instanceof Error ? error.message : 'unknown error'}`
823
+ )
802
824
  }
803
825
  }
804
826
 
@@ -827,8 +849,11 @@ export class WebRecorder {
827
849
 
828
850
  this.compressedMediaRecorder.ondataavailable = (event) => {
829
851
  if (event.data.size > 0) {
852
+ // Store the compressed chunk for final blob creation
830
853
  this.compressedChunks.push(event.data)
831
854
  this.compressedSize += event.data.size
855
+
856
+ // Store the pending compressed chunk for the next PCM chunk to use
832
857
  this.pendingCompressedChunk = event.data
833
858
  }
834
859
  }
@@ -837,6 +862,8 @@ export class WebRecorder {
837
862
  'Failed to initialize compressed recorder:',
838
863
  error
839
864
  )
865
+ // Setting to null to indicate initialization failed
866
+ this.compressedMediaRecorder = null
840
867
  }
841
868
  }
842
869
 
@@ -903,6 +930,10 @@ export class WebRecorder {
903
930
  this.audioWorkletNode.disconnect()
904
931
  } catch (e) {
905
932
  // Ignore disconnection errors as the track might already be gone
933
+ this.logger?.warn(
934
+ 'Error disconnecting audioWorkletNode:',
935
+ e
936
+ )
906
937
  }
907
938
  }
908
939
  }