@edkimmel/expo-audio-stream 0.3.3 → 0.4.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/android/src/main/java/expo/modules/audiostream/Constants.kt +0 -2
- package/android/src/main/java/expo/modules/audiostream/ExpoPlayAudioStreamModule.kt +3 -61
- package/build/events.d.ts +0 -6
- package/build/events.d.ts.map +1 -1
- package/build/events.js +0 -5
- package/build/events.js.map +1 -1
- package/build/index.d.ts +4 -52
- package/build/index.d.ts.map +1 -1
- package/build/index.js +4 -86
- package/build/index.js.map +1 -1
- package/build/types.d.ts +0 -29
- package/build/types.d.ts.map +1 -1
- package/build/types.js.map +1 -1
- package/ios/AudioUtils.swift +0 -7
- package/ios/ExpoPlayAudioStreamModule.swift +8 -138
- package/ios/SharedAudioEngine.swift +90 -60
- package/ios/SoundConfig.swift +2 -36
- package/package.json +1 -1
- package/src/events.ts +0 -12
- package/src/index.ts +2 -102
- package/src/types.ts +0 -35
- package/android/src/main/java/expo/modules/audiostream/AudioPlaybackManager.kt +0 -651
- package/android/src/main/java/expo/modules/audiostream/SoundConfig.kt +0 -46
- package/ios/SoundPlayer.swift +0 -408
- package/ios/SoundPlayerDelegate.swift +0 -7
|
@@ -3,8 +3,6 @@ package expo.modules.audiostream
|
|
|
3
3
|
object Constants {
|
|
4
4
|
const val AUDIO_EVENT_NAME = "AudioData"
|
|
5
5
|
const val AUDIO_ANALYSIS_EVENT_NAME = "AudioAnalysis"
|
|
6
|
-
const val SOUND_CHUNK_PLAYED_EVENT_NAME = "SoundChunkPlayed"
|
|
7
|
-
const val SOUND_STARTED_EVENT_NAME = "SoundStarted"
|
|
8
6
|
const val DEVICE_RECONNECTED_EVENT_NAME = "DeviceReconnected"
|
|
9
7
|
const val DEFAULT_SAMPLE_RATE = 16000 // Default sample rate for audio recording
|
|
10
8
|
const val DEFAULT_CHANNEL_CONFIG = 1 // Mono
|
|
@@ -24,7 +24,6 @@ import expo.modules.audiostream.pipeline.PipelineIntegration
|
|
|
24
24
|
|
|
25
25
|
class ExpoPlayAudioStreamModule : Module(), EventSender {
|
|
26
26
|
private lateinit var audioRecorderManager: AudioRecorderManager
|
|
27
|
-
private lateinit var audioPlaybackManager: AudioPlaybackManager
|
|
28
27
|
private lateinit var audioManager: AudioManager
|
|
29
28
|
private lateinit var pipelineIntegration: PipelineIntegration
|
|
30
29
|
|
|
@@ -81,7 +80,6 @@ class ExpoPlayAudioStreamModule : Module(), EventSender {
|
|
|
81
80
|
val matched = lastOfGroup.map { "${it.productName} (type=${it.type})" }
|
|
82
81
|
Log.d("ExpoAudioCallback", "AudioDeviceCallback ➜ REMOVED (interesting): $matched")
|
|
83
82
|
pipelineIntegration.logAudioTrackHealth("device_removed")
|
|
84
|
-
audioPlaybackManager.stopPlayback(null)
|
|
85
83
|
val params = Bundle()
|
|
86
84
|
params.putString("reason", "oldDeviceUnavailable")
|
|
87
85
|
sendExpoEvent(Constants.DEVICE_RECONNECTED_EVENT_NAME, params)
|
|
@@ -96,8 +94,6 @@ class ExpoPlayAudioStreamModule : Module(), EventSender {
|
|
|
96
94
|
|
|
97
95
|
Events(
|
|
98
96
|
Constants.AUDIO_EVENT_NAME,
|
|
99
|
-
Constants.SOUND_CHUNK_PLAYED_EVENT_NAME,
|
|
100
|
-
Constants.SOUND_STARTED_EVENT_NAME,
|
|
101
97
|
Constants.DEVICE_RECONNECTED_EVENT_NAME,
|
|
102
98
|
PipelineIntegration.EVENT_STATE_CHANGED,
|
|
103
99
|
PipelineIntegration.EVENT_PLAYBACK_STARTED,
|
|
@@ -110,9 +106,8 @@ class ExpoPlayAudioStreamModule : Module(), EventSender {
|
|
|
110
106
|
PipelineIntegration.EVENT_FREQUENCY_BANDS
|
|
111
107
|
)
|
|
112
108
|
|
|
113
|
-
// Initialize managers
|
|
109
|
+
// Initialize managers
|
|
114
110
|
initializeManager()
|
|
115
|
-
initializePlaybackManager()
|
|
116
111
|
initializePipeline()
|
|
117
112
|
|
|
118
113
|
OnCreate {
|
|
@@ -126,20 +121,18 @@ class ExpoPlayAudioStreamModule : Module(), EventSender {
|
|
|
126
121
|
// Module is being destroyed (app shutdown)
|
|
127
122
|
// Just clean up resources without reinitialization
|
|
128
123
|
pipelineIntegration.destroy()
|
|
129
|
-
audioPlaybackManager.runOnDispose()
|
|
130
124
|
audioRecorderManager.release()
|
|
131
125
|
}
|
|
132
126
|
|
|
133
|
-
|
|
127
|
+
AsyncFunction("destroy") { promise: Promise ->
|
|
134
128
|
// User explicitly called destroy - clean up and reinitialize for reuse
|
|
135
129
|
pipelineIntegration.destroy()
|
|
136
|
-
audioPlaybackManager.runOnDispose()
|
|
137
130
|
audioRecorderManager.release()
|
|
138
131
|
|
|
139
132
|
// Reinitialize all managers so the module can be used again
|
|
140
133
|
initializeManager()
|
|
141
|
-
initializePlaybackManager()
|
|
142
134
|
initializePipeline()
|
|
135
|
+
promise.resolve(null)
|
|
143
136
|
}
|
|
144
137
|
|
|
145
138
|
AsyncFunction("requestPermissionsAsync") { promise: Promise ->
|
|
@@ -158,25 +151,6 @@ class ExpoPlayAudioStreamModule : Module(), EventSender {
|
|
|
158
151
|
)
|
|
159
152
|
}
|
|
160
153
|
|
|
161
|
-
AsyncFunction("playSound") { chunk: String, turnId: String, encoding: String?, promise: Promise ->
|
|
162
|
-
val pcmEncoding = when (encoding) {
|
|
163
|
-
"pcm_f32le" -> PCMEncoding.PCM_F32LE
|
|
164
|
-
"pcm_s16le", null -> PCMEncoding.PCM_S16LE
|
|
165
|
-
else -> {
|
|
166
|
-
Log.d(Constants.TAG, "Unsupported encoding: $encoding, defaulting to PCM_S16LE")
|
|
167
|
-
PCMEncoding.PCM_S16LE
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
audioPlaybackManager.playAudio(chunk, turnId, promise, pcmEncoding)
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
AsyncFunction("stopSound") { promise: Promise -> audioPlaybackManager.stopPlayback(promise) }
|
|
174
|
-
|
|
175
|
-
AsyncFunction("clearSoundQueueByTurnId") { turnId: String, promise: Promise ->
|
|
176
|
-
audioPlaybackManager.setCurrentTurnId(turnId)
|
|
177
|
-
promise.resolve(null)
|
|
178
|
-
}
|
|
179
|
-
|
|
180
154
|
AsyncFunction("startMicrophone") { options: Map<String, Any?>, promise: Promise ->
|
|
181
155
|
audioRecorderManager.startRecording(options, promise)
|
|
182
156
|
}
|
|
@@ -190,34 +164,6 @@ class ExpoPlayAudioStreamModule : Module(), EventSender {
|
|
|
190
164
|
audioRecorderManager.toggleSilence(isSilent)
|
|
191
165
|
}
|
|
192
166
|
|
|
193
|
-
AsyncFunction("setSoundConfig") { config: Map<String, Any?>, promise: Promise ->
|
|
194
|
-
val useDefault = config["useDefault"] as? Boolean ?: false
|
|
195
|
-
|
|
196
|
-
if (useDefault) {
|
|
197
|
-
// Reset to default configuration
|
|
198
|
-
Log.d(Constants.TAG, "Resetting sound configuration to default values")
|
|
199
|
-
audioPlaybackManager.resetConfigToDefault(promise)
|
|
200
|
-
} else {
|
|
201
|
-
// Extract configuration values
|
|
202
|
-
val sampleRate = (config["sampleRate"] as? Number)?.toInt() ?: 16000
|
|
203
|
-
val playbackModeString = config["playbackMode"] as? String ?: "regular"
|
|
204
|
-
|
|
205
|
-
// Convert string playback mode to enum
|
|
206
|
-
val playbackMode = when (playbackModeString) {
|
|
207
|
-
"voiceProcessing" -> PlaybackMode.VOICE_PROCESSING
|
|
208
|
-
"conversation" -> PlaybackMode.CONVERSATION
|
|
209
|
-
else -> PlaybackMode.REGULAR
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// Create a new SoundConfig object
|
|
213
|
-
val soundConfig = SoundConfig(sampleRate = sampleRate, playbackMode = playbackMode)
|
|
214
|
-
|
|
215
|
-
// Update the sound player configuration
|
|
216
|
-
Log.d(Constants.TAG, "Setting sound configuration - sampleRate: $sampleRate, playbackMode: $playbackModeString")
|
|
217
|
-
audioPlaybackManager.updateConfig(soundConfig, promise)
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
167
|
// ── Native Audio Pipeline V3 ────────────────────────────────────
|
|
222
168
|
|
|
223
169
|
AsyncFunction("connectPipeline") { options: Map<String, Any?>, promise: Promise ->
|
|
@@ -264,10 +210,6 @@ class ExpoPlayAudioStreamModule : Module(), EventSender {
|
|
|
264
210
|
)
|
|
265
211
|
}
|
|
266
212
|
|
|
267
|
-
private fun initializePlaybackManager() {
|
|
268
|
-
audioPlaybackManager = AudioPlaybackManager(this)
|
|
269
|
-
}
|
|
270
|
-
|
|
271
213
|
private fun initializePipeline() {
|
|
272
214
|
val ctx = appContext.reactContext
|
|
273
215
|
?: throw IllegalStateException("Android context not available")
|
package/build/events.d.ts
CHANGED
|
@@ -17,9 +17,6 @@ export interface AudioEventPayload {
|
|
|
17
17
|
high: number;
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
-
export type SoundChunkPlayedEventPayload = {
|
|
21
|
-
isFinal: boolean;
|
|
22
|
-
};
|
|
23
20
|
export declare const DeviceReconnectedReasons: {
|
|
24
21
|
readonly newDeviceAvailable: "newDeviceAvailable";
|
|
25
22
|
readonly oldDeviceUnavailable: "oldDeviceUnavailable";
|
|
@@ -31,11 +28,8 @@ export type DeviceReconnectedEventPayload = {
|
|
|
31
28
|
};
|
|
32
29
|
export declare const AudioEvents: {
|
|
33
30
|
AudioData: string;
|
|
34
|
-
SoundChunkPlayed: string;
|
|
35
|
-
SoundStarted: string;
|
|
36
31
|
DeviceReconnected: string;
|
|
37
32
|
};
|
|
38
33
|
export declare function addAudioEventListener(listener: (event: AudioEventPayload) => Promise<void>): EventSubscription;
|
|
39
|
-
export declare function addSoundChunkPlayedListener(listener: (event: SoundChunkPlayedEventPayload) => Promise<void>): EventSubscription;
|
|
40
34
|
export declare function subscribeToEvent<T extends unknown>(eventName: string, listener: (event: T | undefined) => Promise<void>): EventSubscription;
|
|
41
35
|
//# sourceMappingURL=events.d.ts.map
|
package/build/events.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAM7C,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAM7C,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,eAAO,MAAM,wBAAwB;;;;CAI3B,CAAC;AAEX,MAAM,MAAM,uBAAuB,GACjC,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,OAAO,wBAAwB,CAAC,CAAC;AAE3E,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,uBAAuB,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,WAAW;;;CAGvB,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,GACpD,iBAAiB,CAEnB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAChD,iBAAiB,CAEnB"}
|
package/build/events.js
CHANGED
|
@@ -9,16 +9,11 @@ export const DeviceReconnectedReasons = {
|
|
|
9
9
|
};
|
|
10
10
|
export const AudioEvents = {
|
|
11
11
|
AudioData: "AudioData",
|
|
12
|
-
SoundChunkPlayed: "SoundChunkPlayed",
|
|
13
|
-
SoundStarted: "SoundStarted",
|
|
14
12
|
DeviceReconnected: "DeviceReconnected",
|
|
15
13
|
};
|
|
16
14
|
export function addAudioEventListener(listener) {
|
|
17
15
|
return emitter.addListener("AudioData", listener);
|
|
18
16
|
}
|
|
19
|
-
export function addSoundChunkPlayedListener(listener) {
|
|
20
|
-
return emitter.addListener("SoundChunkPlayed", listener);
|
|
21
|
-
}
|
|
22
17
|
export function subscribeToEvent(eventName, listener) {
|
|
23
18
|
return emitter.addListener(eventName, listener);
|
|
24
19
|
}
|
package/build/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAC;AAKzE,OAAO,yBAAyB,MAAM,6BAA6B,CAAC;AAEpE,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,yBAAyB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAC;AAKzE,OAAO,yBAAyB,MAAM,6BAA6B,CAAC;AAEpE,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,yBAAyB,CAAC,CAAC;AAgB5D,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,OAAO,EAAE,SAAS;CACV,CAAC;AASX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS,EAAE,WAAW;IACtB,iBAAiB,EAAE,mBAAmB;CACvC,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,QAAqD;IAErD,OAAQ,OAAe,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,QAAiD;IAEjD,OAAQ,OAAe,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC","sourcesContent":["// packages/expo-audio-stream/src/events.ts\n\nimport { EventEmitter, type EventSubscription } from \"expo-modules-core\";\n\n// Type alias for backwards compatibility\nexport type Subscription = EventSubscription;\n\nimport ExpoPlayAudioStreamModule from \"./ExpoPlayAudioStreamModule\";\n\nconst emitter = new EventEmitter(ExpoPlayAudioStreamModule);\n\nexport interface AudioEventPayload {\n encoded?: string;\n buffer?: Float32Array;\n fileUri: string;\n lastEmittedSize: number;\n position: number;\n deltaSize: number;\n totalSize: number;\n mimeType: string;\n streamUuid: string;\n soundLevel?: number;\n frequencyBands?: { low: number; mid: number; high: number };\n}\n\nexport const DeviceReconnectedReasons = {\n newDeviceAvailable: \"newDeviceAvailable\",\n oldDeviceUnavailable: \"oldDeviceUnavailable\",\n unknown: \"unknown\",\n} as const;\n\nexport type DeviceReconnectedReason =\n (typeof DeviceReconnectedReasons)[keyof typeof DeviceReconnectedReasons];\n\nexport type DeviceReconnectedEventPayload = {\n reason: DeviceReconnectedReason;\n};\n\nexport const AudioEvents = {\n AudioData: \"AudioData\",\n DeviceReconnected: \"DeviceReconnected\",\n};\n\nexport function addAudioEventListener(\n listener: (event: AudioEventPayload) => Promise<void>\n): EventSubscription {\n return (emitter as any).addListener(\"AudioData\", listener);\n}\n\nexport function subscribeToEvent<T extends unknown>(\n eventName: string,\n listener: (event: T | undefined) => Promise<void>\n): EventSubscription {\n return (emitter as any).addListener(eventName, listener);\n}\n"]}
|
package/build/index.d.ts
CHANGED
|
@@ -1,40 +1,14 @@
|
|
|
1
1
|
import type { EventSubscription } from "expo-modules-core";
|
|
2
2
|
type Subscription = EventSubscription;
|
|
3
|
-
import { AudioDataEvent, AudioRecording, RecordingConfig, StartRecordingResult,
|
|
4
|
-
import {
|
|
5
|
-
declare const SuspendSoundEventTurnId = "suspend-sound-events";
|
|
3
|
+
import { AudioDataEvent, AudioRecording, RecordingConfig, StartRecordingResult, PlaybackMode, Encoding, EncodingTypes, FrequencyBands, PlaybackModes, IAudioBufferConfig, IAudioPlayPayload, IAudioFrame, BufferHealthState, IBufferHealthMetrics, IAudioBufferManager, IFrameProcessor, IQualityMonitor, BufferedStreamConfig, SmartBufferConfig, SmartBufferMode, NetworkConditions } from "./types";
|
|
4
|
+
import { AudioEvents, DeviceReconnectedReason, DeviceReconnectedEventPayload } from "./events";
|
|
6
5
|
export declare class ExpoPlayAudioStream {
|
|
7
6
|
/**
|
|
8
7
|
* Destroys the audio stream module, cleaning up all resources.
|
|
9
8
|
* This should be called when the module is no longer needed.
|
|
10
9
|
* It will reset all internal state and release audio resources.
|
|
11
10
|
*/
|
|
12
|
-
static destroy(): void
|
|
13
|
-
/**
|
|
14
|
-
* @deprecated Use the `Pipeline` class for more efficient audio streaming with better error handling and telemetry.
|
|
15
|
-
* Plays a sound.
|
|
16
|
-
* @param {string} audio - The audio to play.
|
|
17
|
-
* @param {string} turnId - The turn ID.
|
|
18
|
-
* @param {string} [encoding] - The encoding format of the audio data ('pcm_f32le' or 'pcm_s16le').
|
|
19
|
-
* @returns {Promise<void>}
|
|
20
|
-
* @throws {Error} If the sound fails to play.
|
|
21
|
-
*/
|
|
22
|
-
static playSound(audio: string, turnId: string, encoding?: Encoding): Promise<void>;
|
|
23
|
-
/**
|
|
24
|
-
* @deprecated Use the `Pipeline` class for more efficient audio streaming with better error handling and telemetry.
|
|
25
|
-
* Stops the currently playing sound.
|
|
26
|
-
* @returns {Promise<void>}
|
|
27
|
-
* @throws {Error} If the sound fails to stop.
|
|
28
|
-
*/
|
|
29
|
-
static stopSound(): Promise<void>;
|
|
30
|
-
/**
|
|
31
|
-
* @deprecated Use the `Pipeline` class for more efficient audio streaming with better error handling and telemetry.
|
|
32
|
-
* Clears the sound queue by turn ID.
|
|
33
|
-
* @param {string} turnId - The turn ID.
|
|
34
|
-
* @returns {Promise<void>}
|
|
35
|
-
* @throws {Error} If the sound queue fails to clear.
|
|
36
|
-
*/
|
|
37
|
-
static clearSoundQueueByTurnId(turnId: string): Promise<void>;
|
|
11
|
+
static destroy(): Promise<void>;
|
|
38
12
|
/**
|
|
39
13
|
* Starts microphone streaming.
|
|
40
14
|
* @param {RecordingConfig} recordingConfig - The recording configuration.
|
|
@@ -54,24 +28,9 @@ export declare class ExpoPlayAudioStream {
|
|
|
54
28
|
/**
|
|
55
29
|
* Subscribes to audio events emitted during recording/streaming.
|
|
56
30
|
* @param onMicrophoneStream - Callback function that will be called when audio data is received.
|
|
57
|
-
* The callback receives an AudioDataEvent containing:
|
|
58
|
-
* - data: Base64 encoded audio data at original sample rate
|
|
59
|
-
* - data16kHz: Optional base64 encoded audio data resampled to 16kHz
|
|
60
|
-
* - position: Current position in the audio stream
|
|
61
|
-
* - fileUri: URI of the recording file
|
|
62
|
-
* - eventDataSize: Size of the current audio data chunk
|
|
63
|
-
* - totalSize: Total size of recorded audio so far
|
|
64
31
|
* @returns {Subscription} A subscription object that can be used to unsubscribe from the events
|
|
65
|
-
* @throws {Error} If encoded audio data is missing from the event
|
|
66
32
|
*/
|
|
67
33
|
static subscribeToAudioEvents(onMicrophoneStream: (event: AudioDataEvent) => Promise<void>): Subscription;
|
|
68
|
-
/**
|
|
69
|
-
* Subscribes to events emitted when a sound chunk has finished playing.
|
|
70
|
-
* @param onSoundChunkPlayed - Callback function that will be called when a sound chunk is played.
|
|
71
|
-
* The callback receives a SoundChunkPlayedEventPayload indicating if this was the final chunk.
|
|
72
|
-
* @returns {Subscription} A subscription object that can be used to unsubscribe from the events.
|
|
73
|
-
*/
|
|
74
|
-
static subscribeToSoundChunkPlayed(onSoundChunkPlayed: (event: SoundChunkPlayedEventPayload) => Promise<void>): Subscription;
|
|
75
34
|
/**
|
|
76
35
|
* Subscribes to events emitted by the audio stream module, for advanced use cases.
|
|
77
36
|
* @param eventName - The name of the event to subscribe to.
|
|
@@ -79,13 +38,6 @@ export declare class ExpoPlayAudioStream {
|
|
|
79
38
|
* @returns {Subscription} A subscription object that can be used to unsubscribe from the events.
|
|
80
39
|
*/
|
|
81
40
|
static subscribe<T extends unknown>(eventName: string, onEvent: (event: T | undefined) => Promise<void>): Subscription;
|
|
82
|
-
/**
|
|
83
|
-
* Sets the sound player configuration.
|
|
84
|
-
* @param {SoundConfig} config - Configuration options for the sound player.
|
|
85
|
-
* @returns {Promise<void>}
|
|
86
|
-
* @throws {Error} If the configuration fails to update.
|
|
87
|
-
*/
|
|
88
|
-
static setSoundConfig(config: SoundConfig): Promise<void>;
|
|
89
41
|
/**
|
|
90
42
|
* Prompts the user to select the microphone mode.
|
|
91
43
|
* @returns {Promise<void>}
|
|
@@ -117,7 +69,7 @@ export declare class ExpoPlayAudioStream {
|
|
|
117
69
|
status?: string;
|
|
118
70
|
}>;
|
|
119
71
|
}
|
|
120
|
-
export { AudioDataEvent,
|
|
72
|
+
export { AudioDataEvent, DeviceReconnectedReason, DeviceReconnectedEventPayload, AudioRecording, RecordingConfig, StartRecordingResult, AudioEvents, PlaybackMode, Encoding, EncodingTypes, FrequencyBands, PlaybackModes, IAudioBufferConfig, IAudioPlayPayload, IAudioFrame, BufferHealthState, IBufferHealthMetrics, IAudioBufferManager, IFrameProcessor, IQualityMonitor, BufferedStreamConfig, SmartBufferConfig, SmartBufferMode, NetworkConditions, };
|
|
121
73
|
export type { EventSubscription } from "expo-modules-core";
|
|
122
74
|
export type { Subscription } from "./events";
|
|
123
75
|
export { Pipeline } from "./pipeline";
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D,KAAK,YAAY,GAAG,iBAAiB,CAAC;AACtC,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D,KAAK,YAAY,GAAG,iBAAiB,CAAC;AACtC,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,EAEb,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAGL,WAAW,EAEX,uBAAuB,EACvB,6BAA6B,EAC9B,MAAM,UAAU,CAAC;AAElB,qBAAa,mBAAmB;IAC9B;;;;OAIG;WACU,OAAO;IAIpB;;;;;OAKG;WACU,eAAe,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC;QACtE,eAAe,EAAE,oBAAoB,CAAC;QACtC,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,CAAC;IA8CF;;;;OAIG;WACU,cAAc,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAS7D;;;;OAIG;IACH,MAAM,CAAC,sBAAsB,CAC3B,kBAAkB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAC3D,YAAY;IAoBf;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,OAAO,EAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAC/C,YAAY;IAIf;;;;OAIG;IACH,MAAM,CAAC,qBAAqB;IAI5B;;;;OAIG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO;IAItC;;;OAGG;WACU,uBAAuB,IAAI,OAAO,CAAC;QAC9C,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IASF;;;OAGG;WACU,mBAAmB,IAAI,OAAO,CAAC;QAC1C,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CAQH;AAED,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,6BAA6B,EAC7B,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,EAEb,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,CAAC;AAGF,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,6BAA6B,EAC7B,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,yBAAyB,EACzB,4BAA4B,EAC5B,kBAAkB,EAClB,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,YAAY,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -1,64 +1,14 @@
|
|
|
1
1
|
import ExpoPlayAudioStreamModule from "./ExpoPlayAudioStreamModule";
|
|
2
2
|
import { EncodingTypes, PlaybackModes, } from "./types";
|
|
3
|
-
import { addAudioEventListener,
|
|
4
|
-
const SuspendSoundEventTurnId = "suspend-sound-events";
|
|
3
|
+
import { addAudioEventListener, AudioEvents, subscribeToEvent, } from "./events";
|
|
5
4
|
export class ExpoPlayAudioStream {
|
|
6
5
|
/**
|
|
7
6
|
* Destroys the audio stream module, cleaning up all resources.
|
|
8
7
|
* This should be called when the module is no longer needed.
|
|
9
8
|
* It will reset all internal state and release audio resources.
|
|
10
9
|
*/
|
|
11
|
-
static destroy() {
|
|
12
|
-
ExpoPlayAudioStreamModule.destroy();
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* @deprecated Use the `Pipeline` class for more efficient audio streaming with better error handling and telemetry.
|
|
16
|
-
* Plays a sound.
|
|
17
|
-
* @param {string} audio - The audio to play.
|
|
18
|
-
* @param {string} turnId - The turn ID.
|
|
19
|
-
* @param {string} [encoding] - The encoding format of the audio data ('pcm_f32le' or 'pcm_s16le').
|
|
20
|
-
* @returns {Promise<void>}
|
|
21
|
-
* @throws {Error} If the sound fails to play.
|
|
22
|
-
*/
|
|
23
|
-
static async playSound(audio, turnId, encoding) {
|
|
24
|
-
try {
|
|
25
|
-
await ExpoPlayAudioStreamModule.playSound(audio, turnId, encoding ?? EncodingTypes.PCM_S16LE);
|
|
26
|
-
}
|
|
27
|
-
catch (error) {
|
|
28
|
-
console.error(error);
|
|
29
|
-
throw new Error(`Failed to enqueue audio: ${error}`);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* @deprecated Use the `Pipeline` class for more efficient audio streaming with better error handling and telemetry.
|
|
34
|
-
* Stops the currently playing sound.
|
|
35
|
-
* @returns {Promise<void>}
|
|
36
|
-
* @throws {Error} If the sound fails to stop.
|
|
37
|
-
*/
|
|
38
|
-
static async stopSound() {
|
|
39
|
-
try {
|
|
40
|
-
await ExpoPlayAudioStreamModule.stopSound();
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
console.error(error);
|
|
44
|
-
throw new Error(`Failed to stop enqueued audio: ${error}`);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* @deprecated Use the `Pipeline` class for more efficient audio streaming with better error handling and telemetry.
|
|
49
|
-
* Clears the sound queue by turn ID.
|
|
50
|
-
* @param {string} turnId - The turn ID.
|
|
51
|
-
* @returns {Promise<void>}
|
|
52
|
-
* @throws {Error} If the sound queue fails to clear.
|
|
53
|
-
*/
|
|
54
|
-
static async clearSoundQueueByTurnId(turnId) {
|
|
55
|
-
try {
|
|
56
|
-
await ExpoPlayAudioStreamModule.clearSoundQueueByTurnId(turnId);
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
console.error(error);
|
|
60
|
-
throw new Error(`Failed to clear sound queue: ${error}`);
|
|
61
|
-
}
|
|
10
|
+
static async destroy() {
|
|
11
|
+
await ExpoPlayAudioStreamModule.destroy();
|
|
62
12
|
}
|
|
63
13
|
/**
|
|
64
14
|
* Starts microphone streaming.
|
|
@@ -114,15 +64,7 @@ export class ExpoPlayAudioStream {
|
|
|
114
64
|
/**
|
|
115
65
|
* Subscribes to audio events emitted during recording/streaming.
|
|
116
66
|
* @param onMicrophoneStream - Callback function that will be called when audio data is received.
|
|
117
|
-
* The callback receives an AudioDataEvent containing:
|
|
118
|
-
* - data: Base64 encoded audio data at original sample rate
|
|
119
|
-
* - data16kHz: Optional base64 encoded audio data resampled to 16kHz
|
|
120
|
-
* - position: Current position in the audio stream
|
|
121
|
-
* - fileUri: URI of the recording file
|
|
122
|
-
* - eventDataSize: Size of the current audio data chunk
|
|
123
|
-
* - totalSize: Total size of recorded audio so far
|
|
124
67
|
* @returns {Subscription} A subscription object that can be used to unsubscribe from the events
|
|
125
|
-
* @throws {Error} If encoded audio data is missing from the event
|
|
126
68
|
*/
|
|
127
69
|
static subscribeToAudioEvents(onMicrophoneStream) {
|
|
128
70
|
return addAudioEventListener(async (event) => {
|
|
@@ -142,15 +84,6 @@ export class ExpoPlayAudioStream {
|
|
|
142
84
|
});
|
|
143
85
|
});
|
|
144
86
|
}
|
|
145
|
-
/**
|
|
146
|
-
* Subscribes to events emitted when a sound chunk has finished playing.
|
|
147
|
-
* @param onSoundChunkPlayed - Callback function that will be called when a sound chunk is played.
|
|
148
|
-
* The callback receives a SoundChunkPlayedEventPayload indicating if this was the final chunk.
|
|
149
|
-
* @returns {Subscription} A subscription object that can be used to unsubscribe from the events.
|
|
150
|
-
*/
|
|
151
|
-
static subscribeToSoundChunkPlayed(onSoundChunkPlayed) {
|
|
152
|
-
return addSoundChunkPlayedListener(onSoundChunkPlayed);
|
|
153
|
-
}
|
|
154
87
|
/**
|
|
155
88
|
* Subscribes to events emitted by the audio stream module, for advanced use cases.
|
|
156
89
|
* @param eventName - The name of the event to subscribe to.
|
|
@@ -160,21 +93,6 @@ export class ExpoPlayAudioStream {
|
|
|
160
93
|
static subscribe(eventName, onEvent) {
|
|
161
94
|
return subscribeToEvent(eventName, onEvent);
|
|
162
95
|
}
|
|
163
|
-
/**
|
|
164
|
-
* Sets the sound player configuration.
|
|
165
|
-
* @param {SoundConfig} config - Configuration options for the sound player.
|
|
166
|
-
* @returns {Promise<void>}
|
|
167
|
-
* @throws {Error} If the configuration fails to update.
|
|
168
|
-
*/
|
|
169
|
-
static async setSoundConfig(config) {
|
|
170
|
-
try {
|
|
171
|
-
await ExpoPlayAudioStreamModule.setSoundConfig(config);
|
|
172
|
-
}
|
|
173
|
-
catch (error) {
|
|
174
|
-
console.error(error);
|
|
175
|
-
throw new Error(`Failed to set sound configuration: ${error}`);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
96
|
/**
|
|
179
97
|
* Prompts the user to select the microphone mode.
|
|
180
98
|
* @returns {Promise<void>}
|
|
@@ -218,7 +136,7 @@ export class ExpoPlayAudioStream {
|
|
|
218
136
|
}
|
|
219
137
|
}
|
|
220
138
|
}
|
|
221
|
-
export { AudioEvents,
|
|
139
|
+
export { AudioEvents, EncodingTypes, PlaybackModes, };
|
|
222
140
|
// Export native audio pipeline V3
|
|
223
141
|
export { Pipeline } from "./pipeline";
|
|
224
142
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EventSubscription } from \"expo-modules-core\";\nimport ExpoPlayAudioStreamModule from \"./ExpoPlayAudioStreamModule\";\n\n// Type alias for backwards compatibility\ntype Subscription = EventSubscription;\nimport {\n AudioDataEvent,\n AudioRecording,\n RecordingConfig,\n StartRecordingResult,\n SoundConfig,\n PlaybackMode,\n Encoding,\n EncodingTypes,\n FrequencyBands,\n PlaybackModes,\n // Audio jitter buffer types\n IAudioBufferConfig,\n IAudioPlayPayload,\n IAudioFrame,\n BufferHealthState,\n IBufferHealthMetrics,\n IAudioBufferManager,\n IFrameProcessor,\n IQualityMonitor,\n BufferedStreamConfig,\n SmartBufferConfig,\n SmartBufferMode,\n NetworkConditions,\n} from \"./types\";\n\nimport {\n addAudioEventListener,\n addSoundChunkPlayedListener,\n AudioEventPayload,\n SoundChunkPlayedEventPayload,\n AudioEvents,\n subscribeToEvent,\n DeviceReconnectedReason,\n DeviceReconnectedEventPayload,\n} from \"./events\";\n\nconst SuspendSoundEventTurnId = \"suspend-sound-events\";\n\nexport class ExpoPlayAudioStream {\n /**\n * Destroys the audio stream module, cleaning up all resources.\n * This should be called when the module is no longer needed.\n * It will reset all internal state and release audio resources.\n */\n static destroy() {\n ExpoPlayAudioStreamModule.destroy();\n }\n\n /**\n * @deprecated Use the `Pipeline` class for more efficient audio streaming with better error handling and telemetry.\n * Plays a sound.\n * @param {string} audio - The audio to play.\n * @param {string} turnId - The turn ID.\n * @param {string} [encoding] - The encoding format of the audio data ('pcm_f32le' or 'pcm_s16le').\n * @returns {Promise<void>}\n * @throws {Error} If the sound fails to play.\n */\n static async playSound(\n audio: string,\n turnId: string,\n encoding?: Encoding\n ): Promise<void> {\n try {\n await ExpoPlayAudioStreamModule.playSound(\n audio,\n turnId,\n encoding ?? EncodingTypes.PCM_S16LE\n );\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to enqueue audio: ${error}`);\n }\n }\n\n /**\n * @deprecated Use the `Pipeline` class for more efficient audio streaming with better error handling and telemetry.\n * Stops the currently playing sound.\n * @returns {Promise<void>}\n * @throws {Error} If the sound fails to stop.\n */\n static async stopSound(): Promise<void> {\n try {\n await ExpoPlayAudioStreamModule.stopSound();\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to stop enqueued audio: ${error}`);\n }\n }\n\n /**\n * @deprecated Use the `Pipeline` class for more efficient audio streaming with better error handling and telemetry.\n * Clears the sound queue by turn ID.\n * @param {string} turnId - The turn ID.\n * @returns {Promise<void>}\n * @throws {Error} If the sound queue fails to clear.\n */\n static async clearSoundQueueByTurnId(turnId: string): Promise<void> {\n try {\n await ExpoPlayAudioStreamModule.clearSoundQueueByTurnId(turnId);\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to clear sound queue: ${error}`);\n }\n }\n\n /**\n * Starts microphone streaming.\n * @param {RecordingConfig} recordingConfig - The recording configuration.\n * @returns {Promise<{recordingResult: StartRecordingResult, subscription: Subscription}>} A promise that resolves to an object containing the recording result and a subscription to audio events.\n * @throws {Error} If the recording fails to start.\n */\n static async startMicrophone(recordingConfig: RecordingConfig): Promise<{\n recordingResult: StartRecordingResult;\n subscription?: Subscription;\n }> {\n let subscription: Subscription | undefined;\n try {\n const { onAudioStream, ...options } = recordingConfig;\n\n if (onAudioStream && typeof onAudioStream == \"function\") {\n subscription = addAudioEventListener(\n async (event: AudioEventPayload) => {\n const {\n fileUri,\n deltaSize,\n totalSize,\n position,\n encoded,\n soundLevel,\n frequencyBands,\n } = event;\n if (!encoded) {\n console.error(\n `[ExpoPlayAudioStream] Encoded audio data is missing`\n );\n throw new Error(\"Encoded audio data is missing\");\n }\n onAudioStream?.({\n data: encoded,\n position,\n fileUri,\n eventDataSize: deltaSize,\n totalSize,\n soundLevel,\n frequencyBands,\n });\n }\n );\n }\n\n const result = await ExpoPlayAudioStreamModule.startMicrophone(options);\n\n return { recordingResult: result, subscription };\n } catch (error) {\n console.error(error);\n subscription?.remove();\n throw new Error(`Failed to start recording: ${error}`);\n }\n }\n\n /**\n * Stops the current microphone streaming.\n * @returns {Promise<void>}\n * @throws {Error} If the microphone streaming fails to stop.\n */\n static async stopMicrophone(): Promise<AudioRecording | null> {\n try {\n return await ExpoPlayAudioStreamModule.stopMicrophone();\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to stop mic stream: ${error}`);\n }\n }\n\n /**\n * Subscribes to audio events emitted during recording/streaming.\n * @param onMicrophoneStream - Callback function that will be called when audio data is received.\n * The callback receives an AudioDataEvent containing:\n * - data: Base64 encoded audio data at original sample rate\n * - data16kHz: Optional base64 encoded audio data resampled to 16kHz\n * - position: Current position in the audio stream\n * - fileUri: URI of the recording file\n * - eventDataSize: Size of the current audio data chunk\n * - totalSize: Total size of recorded audio so far\n * @returns {Subscription} A subscription object that can be used to unsubscribe from the events\n * @throws {Error} If encoded audio data is missing from the event\n */\n static subscribeToAudioEvents(\n onMicrophoneStream: (event: AudioDataEvent) => Promise<void>\n ): Subscription {\n return addAudioEventListener(async (event: AudioEventPayload) => {\n const { fileUri, deltaSize, totalSize, position, encoded, soundLevel, frequencyBands } =\n event;\n if (!encoded) {\n console.error(`[ExpoPlayAudioStream] Encoded audio data is missing`);\n throw new Error(\"Encoded audio data is missing\");\n }\n onMicrophoneStream?.({\n data: encoded,\n position,\n fileUri,\n eventDataSize: deltaSize,\n totalSize,\n soundLevel,\n frequencyBands,\n });\n });\n }\n\n /**\n * Subscribes to events emitted when a sound chunk has finished playing.\n * @param onSoundChunkPlayed - Callback function that will be called when a sound chunk is played.\n * The callback receives a SoundChunkPlayedEventPayload indicating if this was the final chunk.\n * @returns {Subscription} A subscription object that can be used to unsubscribe from the events.\n */\n static subscribeToSoundChunkPlayed(\n onSoundChunkPlayed: (event: SoundChunkPlayedEventPayload) => Promise<void>\n ): Subscription {\n return addSoundChunkPlayedListener(onSoundChunkPlayed);\n }\n\n /**\n * Subscribes to events emitted by the audio stream module, for advanced use cases.\n * @param eventName - The name of the event to subscribe to.\n * @param onEvent - Callback function that will be called when the event is emitted.\n * @returns {Subscription} A subscription object that can be used to unsubscribe from the events.\n */\n static subscribe<T extends unknown>(\n eventName: string,\n onEvent: (event: T | undefined) => Promise<void>\n ): Subscription {\n return subscribeToEvent(eventName, onEvent);\n }\n\n /**\n * Sets the sound player configuration.\n * @param {SoundConfig} config - Configuration options for the sound player.\n * @returns {Promise<void>}\n * @throws {Error} If the configuration fails to update.\n */\n static async setSoundConfig(config: SoundConfig): Promise<void> {\n try {\n await ExpoPlayAudioStreamModule.setSoundConfig(config);\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to set sound configuration: ${error}`);\n }\n }\n\n /**\n * Prompts the user to select the microphone mode.\n * @returns {Promise<void>}\n * @throws {Error} If the microphone mode fails to prompt.\n */\n static promptMicrophoneModes() {\n ExpoPlayAudioStreamModule.promptMicrophoneModes();\n }\n\n /**\n * Toggles the silence state of the microphone.\n * @returns {Promise<void>}\n * @throws {Error} If the microphone fails to toggle silence.\n */\n static toggleSilence(isSilent: boolean) {\n ExpoPlayAudioStreamModule.toggleSilence(isSilent);\n }\n\n /**\n * Requests microphone permission from the user.\n * @returns {Promise<{granted: boolean, canAskAgain?: boolean, status?: string}>} A promise that resolves to the permission result.\n */\n static async requestPermissionsAsync(): Promise<{\n granted: boolean;\n canAskAgain?: boolean;\n status?: string;\n }> {\n try {\n return await ExpoPlayAudioStreamModule.requestPermissionsAsync();\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to request permissions: ${error}`);\n }\n }\n\n /**\n * Gets the current microphone permission status.\n * @returns {Promise<{granted: boolean, canAskAgain?: boolean, status?: string}>} A promise that resolves to the permission status.\n */\n static async getPermissionsAsync(): Promise<{\n granted: boolean;\n canAskAgain?: boolean;\n status?: string;\n }> {\n try {\n return await ExpoPlayAudioStreamModule.getPermissionsAsync();\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to get permissions: ${error}`);\n }\n }\n}\n\nexport {\n AudioDataEvent,\n SoundChunkPlayedEventPayload,\n DeviceReconnectedReason,\n DeviceReconnectedEventPayload,\n AudioRecording,\n RecordingConfig,\n StartRecordingResult,\n AudioEvents,\n SuspendSoundEventTurnId,\n SoundConfig,\n PlaybackMode,\n Encoding,\n EncodingTypes,\n FrequencyBands,\n PlaybackModes,\n // Audio jitter buffer types\n IAudioBufferConfig,\n IAudioPlayPayload,\n IAudioFrame,\n BufferHealthState,\n IBufferHealthMetrics,\n IAudioBufferManager,\n IFrameProcessor,\n IQualityMonitor,\n BufferedStreamConfig,\n SmartBufferConfig,\n SmartBufferMode,\n NetworkConditions,\n};\n\n// Re-export Subscription type for backwards compatibility\nexport type { EventSubscription } from \"expo-modules-core\";\nexport type { Subscription } from \"./events\";\n\n// Export native audio pipeline V3\nexport { Pipeline } from \"./pipeline\";\nexport type {\n ConnectPipelineOptions,\n ConnectPipelineResult,\n PushPipelineAudioOptions,\n InvalidatePipelineTurnOptions,\n PipelineState,\n PipelineEventMap,\n PipelineEventName,\n PipelineBufferTelemetry,\n PipelineTelemetry,\n PipelineStateChangedEvent,\n PipelinePlaybackStartedEvent,\n PipelineErrorEvent,\n PipelineZombieDetectedEvent,\n PipelineUnderrunEvent,\n PipelineDrainedEvent,\n PipelineAudioFocusLostEvent,\n PipelineAudioFocusResumedEvent,\n} from \"./pipeline\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EventSubscription } from \"expo-modules-core\";\nimport ExpoPlayAudioStreamModule from \"./ExpoPlayAudioStreamModule\";\n\n// Type alias for backwards compatibility\ntype Subscription = EventSubscription;\nimport {\n AudioDataEvent,\n AudioRecording,\n RecordingConfig,\n StartRecordingResult,\n PlaybackMode,\n Encoding,\n EncodingTypes,\n FrequencyBands,\n PlaybackModes,\n // Audio jitter buffer types\n IAudioBufferConfig,\n IAudioPlayPayload,\n IAudioFrame,\n BufferHealthState,\n IBufferHealthMetrics,\n IAudioBufferManager,\n IFrameProcessor,\n IQualityMonitor,\n BufferedStreamConfig,\n SmartBufferConfig,\n SmartBufferMode,\n NetworkConditions,\n} from \"./types\";\n\nimport {\n addAudioEventListener,\n AudioEventPayload,\n AudioEvents,\n subscribeToEvent,\n DeviceReconnectedReason,\n DeviceReconnectedEventPayload,\n} from \"./events\";\n\nexport class ExpoPlayAudioStream {\n /**\n * Destroys the audio stream module, cleaning up all resources.\n * This should be called when the module is no longer needed.\n * It will reset all internal state and release audio resources.\n */\n static async destroy() {\n await ExpoPlayAudioStreamModule.destroy();\n }\n\n /**\n * Starts microphone streaming.\n * @param {RecordingConfig} recordingConfig - The recording configuration.\n * @returns {Promise<{recordingResult: StartRecordingResult, subscription: Subscription}>} A promise that resolves to an object containing the recording result and a subscription to audio events.\n * @throws {Error} If the recording fails to start.\n */\n static async startMicrophone(recordingConfig: RecordingConfig): Promise<{\n recordingResult: StartRecordingResult;\n subscription?: Subscription;\n }> {\n let subscription: Subscription | undefined;\n try {\n const { onAudioStream, ...options } = recordingConfig;\n\n if (onAudioStream && typeof onAudioStream == \"function\") {\n subscription = addAudioEventListener(\n async (event: AudioEventPayload) => {\n const {\n fileUri,\n deltaSize,\n totalSize,\n position,\n encoded,\n soundLevel,\n frequencyBands,\n } = event;\n if (!encoded) {\n console.error(\n `[ExpoPlayAudioStream] Encoded audio data is missing`\n );\n throw new Error(\"Encoded audio data is missing\");\n }\n onAudioStream?.({\n data: encoded,\n position,\n fileUri,\n eventDataSize: deltaSize,\n totalSize,\n soundLevel,\n frequencyBands,\n });\n }\n );\n }\n\n const result = await ExpoPlayAudioStreamModule.startMicrophone(options);\n\n return { recordingResult: result, subscription };\n } catch (error) {\n console.error(error);\n subscription?.remove();\n throw new Error(`Failed to start recording: ${error}`);\n }\n }\n\n /**\n * Stops the current microphone streaming.\n * @returns {Promise<void>}\n * @throws {Error} If the microphone streaming fails to stop.\n */\n static async stopMicrophone(): Promise<AudioRecording | null> {\n try {\n return await ExpoPlayAudioStreamModule.stopMicrophone();\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to stop mic stream: ${error}`);\n }\n }\n\n /**\n * Subscribes to audio events emitted during recording/streaming.\n * @param onMicrophoneStream - Callback function that will be called when audio data is received.\n * @returns {Subscription} A subscription object that can be used to unsubscribe from the events\n */\n static subscribeToAudioEvents(\n onMicrophoneStream: (event: AudioDataEvent) => Promise<void>\n ): Subscription {\n return addAudioEventListener(async (event: AudioEventPayload) => {\n const { fileUri, deltaSize, totalSize, position, encoded, soundLevel, frequencyBands } =\n event;\n if (!encoded) {\n console.error(`[ExpoPlayAudioStream] Encoded audio data is missing`);\n throw new Error(\"Encoded audio data is missing\");\n }\n onMicrophoneStream?.({\n data: encoded,\n position,\n fileUri,\n eventDataSize: deltaSize,\n totalSize,\n soundLevel,\n frequencyBands,\n });\n });\n }\n\n /**\n * Subscribes to events emitted by the audio stream module, for advanced use cases.\n * @param eventName - The name of the event to subscribe to.\n * @param onEvent - Callback function that will be called when the event is emitted.\n * @returns {Subscription} A subscription object that can be used to unsubscribe from the events.\n */\n static subscribe<T extends unknown>(\n eventName: string,\n onEvent: (event: T | undefined) => Promise<void>\n ): Subscription {\n return subscribeToEvent(eventName, onEvent);\n }\n\n /**\n * Prompts the user to select the microphone mode.\n * @returns {Promise<void>}\n * @throws {Error} If the microphone mode fails to prompt.\n */\n static promptMicrophoneModes() {\n ExpoPlayAudioStreamModule.promptMicrophoneModes();\n }\n\n /**\n * Toggles the silence state of the microphone.\n * @returns {Promise<void>}\n * @throws {Error} If the microphone fails to toggle silence.\n */\n static toggleSilence(isSilent: boolean) {\n ExpoPlayAudioStreamModule.toggleSilence(isSilent);\n }\n\n /**\n * Requests microphone permission from the user.\n * @returns {Promise<{granted: boolean, canAskAgain?: boolean, status?: string}>} A promise that resolves to the permission result.\n */\n static async requestPermissionsAsync(): Promise<{\n granted: boolean;\n canAskAgain?: boolean;\n status?: string;\n }> {\n try {\n return await ExpoPlayAudioStreamModule.requestPermissionsAsync();\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to request permissions: ${error}`);\n }\n }\n\n /**\n * Gets the current microphone permission status.\n * @returns {Promise<{granted: boolean, canAskAgain?: boolean, status?: string}>} A promise that resolves to the permission status.\n */\n static async getPermissionsAsync(): Promise<{\n granted: boolean;\n canAskAgain?: boolean;\n status?: string;\n }> {\n try {\n return await ExpoPlayAudioStreamModule.getPermissionsAsync();\n } catch (error) {\n console.error(error);\n throw new Error(`Failed to get permissions: ${error}`);\n }\n }\n}\n\nexport {\n AudioDataEvent,\n DeviceReconnectedReason,\n DeviceReconnectedEventPayload,\n AudioRecording,\n RecordingConfig,\n StartRecordingResult,\n AudioEvents,\n PlaybackMode,\n Encoding,\n EncodingTypes,\n FrequencyBands,\n PlaybackModes,\n // Audio jitter buffer types\n IAudioBufferConfig,\n IAudioPlayPayload,\n IAudioFrame,\n BufferHealthState,\n IBufferHealthMetrics,\n IAudioBufferManager,\n IFrameProcessor,\n IQualityMonitor,\n BufferedStreamConfig,\n SmartBufferConfig,\n SmartBufferMode,\n NetworkConditions,\n};\n\n// Re-export Subscription type for backwards compatibility\nexport type { EventSubscription } from \"expo-modules-core\";\nexport type { Subscription } from \"./events\";\n\n// Export native audio pipeline V3\nexport { Pipeline } from \"./pipeline\";\nexport type {\n ConnectPipelineOptions,\n ConnectPipelineResult,\n PushPipelineAudioOptions,\n InvalidatePipelineTurnOptions,\n PipelineState,\n PipelineEventMap,\n PipelineEventName,\n PipelineBufferTelemetry,\n PipelineTelemetry,\n PipelineStateChangedEvent,\n PipelinePlaybackStartedEvent,\n PipelineErrorEvent,\n PipelineZombieDetectedEvent,\n PipelineUnderrunEvent,\n PipelineDrainedEvent,\n PipelineAudioFocusLostEvent,\n PipelineAudioFocusResumedEvent,\n} from \"./pipeline\";\n"]}
|
package/build/types.d.ts
CHANGED
|
@@ -10,35 +10,6 @@ export declare const PlaybackModes: {
|
|
|
10
10
|
* Defines different playback modes for audio processing
|
|
11
11
|
*/
|
|
12
12
|
export type PlaybackMode = (typeof PlaybackModes)[keyof typeof PlaybackModes];
|
|
13
|
-
/**
|
|
14
|
-
* Configuration for audio playback settings
|
|
15
|
-
*/
|
|
16
|
-
export interface SoundConfig {
|
|
17
|
-
/**
|
|
18
|
-
* The sample rate for audio playback in Hz
|
|
19
|
-
*/
|
|
20
|
-
sampleRate?: SampleRate;
|
|
21
|
-
/**
|
|
22
|
-
* The playback mode (regular, voiceProcessing, or conversation)
|
|
23
|
-
*/
|
|
24
|
-
playbackMode?: PlaybackMode;
|
|
25
|
-
/**
|
|
26
|
-
* When true, resets to default configuration regardless of other parameters
|
|
27
|
-
*/
|
|
28
|
-
useDefault?: boolean;
|
|
29
|
-
/**
|
|
30
|
-
* Enable jitter buffering for audio streams
|
|
31
|
-
*/
|
|
32
|
-
enableBuffering?: boolean;
|
|
33
|
-
/**
|
|
34
|
-
* Automatically enable buffering based on network conditions
|
|
35
|
-
*/
|
|
36
|
-
autoBuffer?: boolean;
|
|
37
|
-
/**
|
|
38
|
-
* Configuration for the jitter buffer when enableBuffering is true
|
|
39
|
-
*/
|
|
40
|
-
bufferConfig?: Partial<IAudioBufferConfig>;
|
|
41
|
-
}
|
|
42
13
|
/**
|
|
43
14
|
* Configuration for buffered audio streaming
|
|
44
15
|
*/
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,WAAW,GACX,UAAU,CAAC;AACf,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACvD,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AAEnC,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AACX;;GAEG;AACH,MAAM,MAAM,YAAY,GACtB,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/build/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,iBAAiB;IACnC,YAAY,EAAE,cAAc;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,iBAAiB;IACnC,YAAY,EAAE,cAAc;CACpB,CAAC;AAgCX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,WAAW;IACtB,SAAS,EAAE,WAAW;CACd,CAAC","sourcesContent":["export type RecordingEncodingType =\n | 'pcm_32bit'\n | 'pcm_16bit'\n | 'pcm_8bit';\nexport type SampleRate = 16000 | 24000 | 44100 | 48000;\nexport type BitDepth = 8 | 16 | 32;\n\nexport const PlaybackModes = {\n REGULAR: 'regular',\n VOICE_PROCESSING: 'voiceProcessing',\n CONVERSATION: 'conversation',\n} as const;\n/**\n * Defines different playback modes for audio processing\n */\nexport type PlaybackMode =\n (typeof PlaybackModes)[keyof typeof PlaybackModes];\n\n/**\n * Configuration for buffered audio streaming\n */\nexport interface BufferedStreamConfig {\n /**\n * Turn ID for queue management\n */\n turnId: string;\n\n /**\n * Audio encoding format\n */\n encoding?: Encoding;\n\n /**\n * Buffer configuration options\n */\n bufferConfig?: Partial<IAudioBufferConfig>;\n\n /**\n * Callback for buffer health updates\n */\n onBufferHealth?: (metrics: IBufferHealthMetrics) => void;\n}\n\nexport const EncodingTypes = {\n PCM_F32LE: 'pcm_f32le',\n PCM_S16LE: 'pcm_s16le',\n} as const;\n\n/**\n * Defines different encoding formats for audio data\n */\nexport type Encoding =\n (typeof EncodingTypes)[keyof typeof EncodingTypes];\n\n/** RMS energy per frequency band, range [0, 1]. */\nexport interface FrequencyBands {\n low: number;\n mid: number;\n high: number;\n}\n\n/** Crossover frequency configuration for band analysis. */\nexport interface FrequencyBandConfig {\n /** Low/mid crossover in Hz (default 300). */\n lowCrossoverHz?: number;\n /** Mid/high crossover in Hz (default 2000). */\n highCrossoverHz?: number;\n}\n\n/**\n * Smart buffering mode options\n */\nexport type SmartBufferMode =\n | 'conservative'\n | 'balanced'\n | 'aggressive'\n | 'adaptive';\n\n/**\n * Network condition indicators for smart buffering\n */\nexport interface NetworkConditions {\n latency?: number; // Round-trip time in ms\n jitter?: number; // Network jitter in ms\n packetLoss?: number; // Packet loss percentage (0-100)\n bandwidth?: number; // Available bandwidth estimate\n}\n\n/**\n * Smart buffering configuration\n */\nexport interface SmartBufferConfig {\n mode: SmartBufferMode;\n networkConditions?: NetworkConditions;\n adaptiveThresholds?: {\n highLatencyMs?: number; // Threshold to enable aggressive buffering\n highJitterMs?: number; // Threshold to increase buffer size\n packetLossPercent?: number; // Threshold to enable buffering\n };\n}\n\nexport interface StartRecordingResult {\n fileUri: string;\n mimeType: string;\n channels?: number;\n bitDepth?: BitDepth;\n sampleRate?: SampleRate;\n}\n\nexport interface AudioDataEvent {\n data: string | Float32Array;\n data16kHz?: string | Float32Array;\n position: number;\n fileUri: string;\n eventDataSize: number;\n totalSize: number;\n soundLevel?: number;\n /** Frequency band RMS energy, present when recording is active. */\n frequencyBands?: FrequencyBands;\n}\n\nexport interface RecordingConfig {\n sampleRate?: SampleRate; // Sample rate for recording\n channels?: 1 | 2; // 1 or 2 (MONO or STEREO)\n encoding?: RecordingEncodingType; // Encoding type for the recording\n interval?: number; // Interval in milliseconds at which to emit recording data\n\n // Optional parameters for audio processing\n enableProcessing?: boolean; // Boolean to enable/disable audio processing (default is false)\n pointsPerSecond?: number; // Number of data points to extract per second of audio (default is 1000)\n onAudioStream?: (event: AudioDataEvent) => Promise<void>; // Callback function to handle audio stream\n /** Optional frequency band crossover configuration. */\n frequencyBandConfig?: FrequencyBandConfig;\n}\n\nexport interface Chunk {\n text: string;\n timestamp: [number, number | null];\n}\n\nexport interface TranscriberData {\n id: string;\n isBusy: boolean;\n text: string;\n startTime: number;\n endTime: number;\n chunks: Chunk[];\n}\n\nexport interface AudioRecording {\n fileUri: string;\n filename: string;\n durationMs: number;\n size: number;\n channels: number;\n bitDepth: BitDepth;\n sampleRate: SampleRate;\n mimeType: string;\n transcripts?: TranscriberData[];\n wavPCMData?: Float32Array; // Full PCM data for the recording in WAV format (only on web, for native use the fileUri)\n}\n\n// Audio Jitter Buffer Types\n\n/**\n * Configuration for audio buffer management\n */\nexport interface IAudioBufferConfig {\n targetBufferMs: number; // Target buffer size in milliseconds\n minBufferMs: number; // Minimum buffer size before underrun handling\n maxBufferMs: number; // Maximum buffer size before overrun handling\n frameIntervalMs: number; // Expected frame interval in milliseconds\n}\n\n/**\n * Audio payload for playback containing base64 encoded audio data\n */\nexport interface IAudioPlayPayload {\n audioData: string; // Base64 encoded PCM audio data\n isFirst?: boolean; // True if this is the first chunk in a stream\n isFinal?: boolean; // True if this is the final chunk in a stream\n}\n\n/**\n * Processed audio frame with metadata\n */\nexport interface IAudioFrame {\n sequenceNumber: number; // Sequential frame number\n data: IAudioPlayPayload; // Original audio payload\n duration: number; // Estimated frame duration in milliseconds\n timestamp: number; // Frame timestamp when processed\n}\n\n/**\n * Buffer health states for quality monitoring\n */\nexport type BufferHealthState =\n | 'idle'\n | 'healthy'\n | 'degraded'\n | 'critical';\n\n/**\n * Comprehensive buffer health and quality metrics\n */\nexport interface IBufferHealthMetrics {\n currentBufferMs: number; // Current buffer level in milliseconds\n targetBufferMs: number; // Target buffer level in milliseconds\n underrunCount: number; // Total number of buffer underruns\n overrunCount: number; // Total number of buffer overruns\n averageJitter: number; // Average network jitter in milliseconds\n bufferHealthState: BufferHealthState; // Current buffer health assessment\n adaptiveAdjustmentsCount: number; // Number of adaptive adjustments made\n}\n\n/**\n * Interface for audio buffer management\n */\nexport interface IAudioBufferManager {\n enqueueFrames(audioData: IAudioPlayPayload): void;\n startPlayback(): void;\n stopPlayback(): void;\n isPlaying(): boolean;\n getHealthMetrics(): IBufferHealthMetrics;\n updateConfig(config: Partial<IAudioBufferConfig>): void;\n applyAdaptiveAdjustments(): void;\n destroy(): void;\n getCurrentBufferMs(): number;\n}\n\n/**\n * Interface for frame processing\n */\nexport interface IFrameProcessor {\n parseChunk(payload: IAudioPlayPayload): IAudioFrame[];\n reset(): void;\n}\n\n/**\n * Interface for quality monitoring\n */\nexport interface IQualityMonitor {\n recordFrameArrival(timestamp: number): void;\n recordUnderrun(): void;\n recordOverrun(): void;\n updateBufferLevel(bufferMs: number): void;\n getMetrics(): IBufferHealthMetrics;\n getBufferHealthState(\n isPlaying: boolean,\n currentLatencyMs: number\n ): BufferHealthState;\n getRecommendedAdjustment(): number;\n reset(): void;\n}\n"]}
|
package/ios/AudioUtils.swift
CHANGED
|
@@ -2,13 +2,6 @@ import AVFoundation
|
|
|
2
2
|
import ExpoModulesCore
|
|
3
3
|
import Accelerate
|
|
4
4
|
|
|
5
|
-
public enum SoundPlayerError: Error {
|
|
6
|
-
case invalidBase64String
|
|
7
|
-
case couldNotPlayAudio
|
|
8
|
-
case decodeError(details: String)
|
|
9
|
-
case unsupportedFormat
|
|
10
|
-
}
|
|
11
|
-
|
|
12
5
|
enum AudioProcessingError: Error {
|
|
13
6
|
case invalidBase64
|
|
14
7
|
}
|