@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.
- package/CHANGELOG.md +9 -1
- package/android/src/main/java/net/siteed/audiostream/AudioProcessor.kt +0 -2
- package/build/cjs/AudioAnalysis/AudioAnalysis.types.js.map +1 -1
- package/build/cjs/ExpoAudioStream.web.js +1 -1
- package/build/cjs/ExpoAudioStream.web.js.map +1 -1
- package/build/cjs/WebRecorder.web.js +114 -96
- package/build/cjs/WebRecorder.web.js.map +1 -1
- package/build/esm/AudioAnalysis/AudioAnalysis.types.js.map +1 -1
- package/build/esm/ExpoAudioStream.web.js +1 -1
- package/build/esm/ExpoAudioStream.web.js.map +1 -1
- package/build/esm/WebRecorder.web.js +114 -96
- package/build/esm/WebRecorder.web.js.map +1 -1
- package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts +3 -1
- package/build/types/AudioAnalysis/AudioAnalysis.types.d.ts.map +1 -1
- package/build/types/ExpoAudioStream.web.d.ts.map +1 -1
- package/build/types/WebRecorder.web.d.ts +19 -3
- package/build/types/WebRecorder.web.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/AudioAnalysis/AudioAnalysis.types.ts +8 -1
- package/src/ExpoAudioStream.web.ts +2 -1
- package/src/WebRecorder.web.ts +155 -124
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioAnalysis.types.d.ts","sourceRoot":"","sources":["../../../src/AudioAnalysis/AudioAnalysis.types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEhE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,yCAAyC;IACzC,cAAc,CAAC,EAAE,QAAQ,CAAA;IACzB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CAMrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED
|
|
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;
|
|
1
|
+
{"version":3,"file":"WebRecorder.web.d.ts","sourceRoot":"","sources":["../../src/WebRecorder.web.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@siteed/expo-audio-studio",
|
|
3
|
-
"version": "2.
|
|
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
|
|
package/src/WebRecorder.web.ts
CHANGED
|
@@ -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
|
-
//
|
|
256
|
-
const
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
|
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
|
|
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
|
|
411
|
-
const segmentResult = event.data.result
|
|
419
|
+
if (event.data.command !== 'features') return
|
|
412
420
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
421
|
+
const segmentResult = event.data.result
|
|
422
|
+
const uniqueNewDataPoints = this.filterUniqueDataPoints(
|
|
423
|
+
segmentResult.dataPoints
|
|
424
|
+
)
|
|
417
425
|
|
|
418
|
-
|
|
419
|
-
|
|
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
|
-
|
|
426
|
-
|
|
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
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
432
|
+
// Send filtered result to avoid duplicate IDs
|
|
433
|
+
const filteredSegmentResult = {
|
|
434
|
+
...segmentResult,
|
|
435
|
+
dataPoints: uniqueNewDataPoints,
|
|
436
|
+
}
|
|
439
437
|
|
|
440
|
-
|
|
441
|
-
|
|
438
|
+
this.emitAudioAnalysisCallback(filteredSegmentResult)
|
|
439
|
+
}
|
|
442
440
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
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
|
-
|
|
453
|
-
|
|
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
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
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
|
-
|
|
478
|
-
|
|
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
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
}
|