@stream-io/video-react-native-sdk 1.41.0 → 1.42.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 +26 -0
- package/android/src/main/java/com/streamvideo/reactnative/audio/AudioDeviceManager.kt +79 -54
- package/android/src/main/java/com/streamvideo/reactnative/audio/utils/AudioManagerUtil.kt +6 -2
- package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt +3 -3
- package/dist/commonjs/hooks/index.js +11 -0
- package/dist/commonjs/hooks/index.js.map +1 -1
- package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js +73 -0
- package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -1
- package/dist/commonjs/hooks/useAudioDeviceStatus.js +76 -0
- package/dist/commonjs/hooks/useAudioDeviceStatus.js.map +1 -0
- package/dist/commonjs/modules/call-manager/CallManager.js +94 -47
- package/dist/commonjs/modules/call-manager/CallManager.js.map +1 -1
- package/dist/commonjs/utils/internal/callingx/callingx.js +0 -7
- package/dist/commonjs/utils/internal/callingx/callingx.js.map +1 -1
- package/dist/commonjs/utils/push/setupCallingExpEvents.js +0 -2
- package/dist/commonjs/utils/push/setupCallingExpEvents.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/module/hooks/index.js +1 -0
- package/dist/module/hooks/index.js.map +1 -1
- package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js +73 -0
- package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -1
- package/dist/module/hooks/useAudioDeviceStatus.js +71 -0
- package/dist/module/hooks/useAudioDeviceStatus.js.map +1 -0
- package/dist/module/modules/call-manager/CallManager.js +94 -47
- package/dist/module/modules/call-manager/CallManager.js.map +1 -1
- package/dist/module/utils/internal/callingx/callingx.js +0 -7
- package/dist/module/utils/internal/callingx/callingx.js.map +1 -1
- package/dist/module/utils/push/setupCallingExpEvents.js +0 -2
- package/dist/module/utils/push/setupCallingExpEvents.js.map +1 -1
- package/dist/module/version.js +1 -1
- package/dist/typescript/hooks/index.d.ts +1 -0
- package/dist/typescript/hooks/index.d.ts.map +1 -1
- package/dist/typescript/hooks/push/useCallingExpWithCallingStateEffect.d.ts.map +1 -1
- package/dist/typescript/hooks/useAudioDeviceStatus.d.ts +21 -0
- package/dist/typescript/hooks/useAudioDeviceStatus.d.ts.map +1 -0
- package/dist/typescript/modules/call-manager/CallManager.d.ts +25 -11
- package/dist/typescript/modules/call-manager/CallManager.d.ts.map +1 -1
- package/dist/typescript/modules/call-manager/types.d.ts +29 -3
- package/dist/typescript/modules/call-manager/types.d.ts.map +1 -1
- package/dist/typescript/utils/internal/callingx/callingx.d.ts.map +1 -1
- package/dist/typescript/utils/push/setupCallingExpEvents.d.ts.map +1 -1
- package/dist/typescript/version.d.ts +1 -1
- package/expo-config-plugin/dist/index.js +2 -0
- package/expo-config-plugin/dist/withAndroidMessagingService.js +287 -0
- package/ios/StreamInCallManager.m +7 -0
- package/ios/StreamInCallManager.swift +257 -14
- package/package.json +8 -8
- package/src/hooks/index.ts +1 -0
- package/src/hooks/push/useCallingExpWithCallingStateEffect.ts +95 -0
- package/src/hooks/useAudioDeviceStatus.ts +90 -0
- package/src/modules/call-manager/CallManager.ts +122 -64
- package/src/modules/call-manager/native-module.d.ts +14 -7
- package/src/modules/call-manager/types.ts +30 -3
- package/src/utils/internal/callingx/callingx.ts +0 -8
- package/src/utils/push/setupCallingExpEvents.ts +0 -2
- package/src/version.ts +1 -1
- package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js +0 -68
- package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js.map +0 -1
- package/dist/module/utils/internal/callingx/audioSessionPromise.js +0 -63
- package/dist/module/utils/internal/callingx/audioSessionPromise.js.map +0 -1
- package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts +0 -16
- package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts.map +0 -1
- package/src/utils/internal/callingx/audioSessionPromise.ts +0 -65
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
4
|
|
|
5
|
+
## [1.42.0](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.41.0...@stream-io/video-react-native-sdk-1.42.0) (2026-07-30)
|
|
6
|
+
|
|
7
|
+
### Dependency Updates
|
|
8
|
+
|
|
9
|
+
- `@stream-io/noise-cancellation-react-native` updated to version `0.9.5`
|
|
10
|
+
- `@stream-io/react-native-callingx` updated to version `0.8.1`
|
|
11
|
+
- `@stream-io/video-filters-react-native` updated to version `0.14.5`
|
|
12
|
+
- `@stream-io/typescript-config` updated to version `0.1.0`
|
|
13
|
+
- `@stream-io/video-client` updated to version `1.56.0`
|
|
14
|
+
- **Features**
|
|
15
|
+
- **react-sdk:** show blocked audio overlay per participant ([#2341](https://github.com/GetStream/stream-video-js/issues/2341)) ([4fe5c40](https://github.com/GetStream/stream-video-js/commit/4fe5c40aaed1829125bff49deec39a008c7abec5))
|
|
16
|
+
- **Bug Fixes**
|
|
17
|
+
- **client:** fix stale mid in SetPublisher after PeerConnection rollback ([#2344](https://github.com/GetStream/stream-video-js/issues/2344)) ([9c3e201](https://github.com/GetStream/stream-video-js/commit/9c3e201c9a1cf129e182da961b1d73652508b9f2))
|
|
18
|
+
- **client:** never announce two tracks for the same publish option ([#2352](https://github.com/GetStream/stream-video-js/issues/2352)) ([b9a0c6e](https://github.com/GetStream/stream-video-js/commit/b9a0c6e709805e8658e74a68dc6e84459353db37))
|
|
19
|
+
- **client:** preserve ICE state in peer connection failure reports ([#2340](https://github.com/GetStream/stream-video-js/issues/2340)) ([2ce42a2](https://github.com/GetStream/stream-video-js/commit/2ce42a229eecfc60ae8f6783672c517b94b6ab42))
|
|
20
|
+
- `@stream-io/video-react-bindings` updated to version `1.19.1`
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
|
|
24
|
+
- add iOS audio output selection methods ([#2334](https://github.com/GetStream/stream-video-js/issues/2334)) ([e858efe](https://github.com/GetStream/stream-video-js/commit/e858efee6f8741a7f0e469789c64b2780dbcb5ce))
|
|
25
|
+
- added expo plugin for resolving fcm conflicts issue ([#2350](https://github.com/GetStream/stream-video-js/issues/2350)) ([b083873](https://github.com/GetStream/stream-video-js/commit/b0838731e3a040ab87866621f66f36e6827fd0cc))
|
|
26
|
+
|
|
27
|
+
### Bug Fixes
|
|
28
|
+
|
|
29
|
+
- wait for callkit audio activation and then start audio engine, remove the previous timeout ([#2328](https://github.com/GetStream/stream-video-js/issues/2328)) ([64d6cff](https://github.com/GetStream/stream-video-js/commit/64d6cff02112fa7f9b2ed273f27006675f1d798d))
|
|
30
|
+
|
|
5
31
|
## [1.41.0](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.40.2...@stream-io/video-react-native-sdk-1.41.0) (2026-07-17)
|
|
6
32
|
|
|
7
33
|
### Dependency Updates
|
|
@@ -58,7 +58,7 @@ class AudioDeviceManager(
|
|
|
58
58
|
val nonBluetoothEndpoints = HashMap<@EndpointType Int, AudioDeviceEndpoint>()
|
|
59
59
|
for (device in initialEndpoints) {
|
|
60
60
|
if (device.isBluetoothType()) {
|
|
61
|
-
bluetoothEndpoints[device.
|
|
61
|
+
bluetoothEndpoints[device.deviceId.toString()] = device
|
|
62
62
|
} else {
|
|
63
63
|
nonBluetoothEndpoints[device.type] = device
|
|
64
64
|
}
|
|
@@ -66,7 +66,7 @@ class AudioDeviceManager(
|
|
|
66
66
|
EndpointMaps(bluetoothEndpoints, nonBluetoothEndpoints)
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
private var
|
|
69
|
+
private var cachedAvailableEndpointIdsSet = setOf<String>()
|
|
70
70
|
|
|
71
71
|
/** Returns the currently selected audio device. */
|
|
72
72
|
private var _selectedAudioDeviceEndpoint: AudioDeviceEndpoint? = null
|
|
@@ -85,10 +85,6 @@ class AudioDeviceManager(
|
|
|
85
85
|
@EndpointType
|
|
86
86
|
var defaultAudioDevice = AudioDeviceEndpoint.TYPE_SPEAKER
|
|
87
87
|
|
|
88
|
-
/** Contains the user-selected audio device which overrides the predefined selection scheme */
|
|
89
|
-
@EndpointType
|
|
90
|
-
private var userSelectedAudioDevice: Int? = null
|
|
91
|
-
|
|
92
88
|
var enableStereo: Boolean = false
|
|
93
89
|
|
|
94
90
|
private val mAudioManager =
|
|
@@ -137,7 +133,6 @@ class AudioDeviceManager(
|
|
|
137
133
|
fun start(activity: Activity) {
|
|
138
134
|
runInAudioThread {
|
|
139
135
|
setup()
|
|
140
|
-
userSelectedAudioDevice = null
|
|
141
136
|
selectedAudioDeviceEndpoint = null
|
|
142
137
|
if (callAudioRole == CallAudioRole.Communicator) {
|
|
143
138
|
// Audio routing is manually controlled by the SDK in communication media mode
|
|
@@ -190,13 +185,28 @@ class AudioDeviceManager(
|
|
|
190
185
|
}
|
|
191
186
|
}
|
|
192
187
|
|
|
193
|
-
private fun
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
188
|
+
private fun bluetoothEndpointByName(name: String?): AudioDeviceEndpoint? {
|
|
189
|
+
if (name == null) return null
|
|
190
|
+
return mEndpointMaps.bluetoothEndpoints.values.firstOrNull { it.name == name }
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Resolves the currently-active Bluetooth endpoint.
|
|
195
|
+
*/
|
|
196
|
+
private fun activeBluetoothEndpoint(): AudioDeviceEndpoint? {
|
|
197
|
+
if (Build.VERSION.SDK_INT >= 31) {
|
|
198
|
+
mAudioManager.communicationDevice?.id?.toString()?.let { id ->
|
|
199
|
+
mEndpointMaps.bluetoothEndpoints[id]?.let { return it }
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return bluetoothEndpointByName(bluetoothManager.getDeviceName())
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** Resolves a non-Bluetooth endpoint by its stable device id. */
|
|
206
|
+
private fun nonBluetoothEndpointById(deviceId: String): AudioDeviceEndpoint? {
|
|
207
|
+
return mEndpointMaps.nonBluetoothEndpoints.values.firstOrNull {
|
|
208
|
+
it.deviceId.toString() == deviceId
|
|
198
209
|
}
|
|
199
|
-
return endpoint
|
|
200
210
|
}
|
|
201
211
|
|
|
202
212
|
fun setSpeakerphoneOn(enable: Boolean) {
|
|
@@ -227,16 +237,12 @@ class AudioDeviceManager(
|
|
|
227
237
|
this.selectedAudioDeviceEndpoint = newDevice
|
|
228
238
|
}
|
|
229
239
|
|
|
230
|
-
fun
|
|
231
|
-
|
|
240
|
+
fun switchDeviceById(
|
|
241
|
+
deviceId: String
|
|
232
242
|
) {
|
|
233
|
-
Log.d(TAG, "
|
|
234
|
-
Log.d(
|
|
235
|
-
TAG,
|
|
236
|
-
"switchDeviceFromDeviceName: mEndpointMaps.bluetoothEndpoints = ${mEndpointMaps.bluetoothEndpoints}"
|
|
237
|
-
)
|
|
243
|
+
Log.d(TAG, "switchDeviceById: deviceId = $deviceId")
|
|
238
244
|
runInAudioThread {
|
|
239
|
-
val btDevice = mEndpointMaps.bluetoothEndpoints[
|
|
245
|
+
val btDevice = mEndpointMaps.bluetoothEndpoints[deviceId]
|
|
240
246
|
if (btDevice != null) {
|
|
241
247
|
if (Build.VERSION.SDK_INT >= 31) {
|
|
242
248
|
mAudioManager.setCommunicationDevice(btDevice.deviceInfo)
|
|
@@ -248,10 +254,12 @@ class AudioDeviceManager(
|
|
|
248
254
|
)
|
|
249
255
|
}
|
|
250
256
|
} else {
|
|
251
|
-
val
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
257
|
+
val endpoint = nonBluetoothEndpointById(deviceId)
|
|
258
|
+
if (endpoint != null) {
|
|
259
|
+
switchDeviceEndpointType(endpoint.type)
|
|
260
|
+
} else {
|
|
261
|
+
Log.e(TAG, "switchDeviceById: no endpoint found for id $deviceId")
|
|
262
|
+
}
|
|
255
263
|
}
|
|
256
264
|
}
|
|
257
265
|
}
|
|
@@ -308,25 +316,39 @@ class AudioDeviceManager(
|
|
|
308
316
|
}
|
|
309
317
|
|
|
310
318
|
private fun getCurrentDeviceEndpoints(): List<AudioDeviceEndpoint> {
|
|
311
|
-
if (Build.VERSION.SDK_INT >= 31) {
|
|
312
|
-
|
|
319
|
+
val endpoints = if (Build.VERSION.SDK_INT >= 31) {
|
|
320
|
+
(mEndpointMaps.bluetoothEndpoints.values + mEndpointMaps.nonBluetoothEndpoints.values).sorted()
|
|
313
321
|
} else {
|
|
314
|
-
val btEndpoint =
|
|
322
|
+
val btEndpoint = bluetoothEndpointByName(bluetoothManager.getDeviceName())
|
|
315
323
|
if (btEndpoint != null) {
|
|
316
324
|
val list = mutableListOf(btEndpoint)
|
|
317
325
|
list.addAll(mEndpointMaps.nonBluetoothEndpoints.values)
|
|
318
|
-
|
|
326
|
+
list.sorted()
|
|
319
327
|
} else {
|
|
320
|
-
|
|
328
|
+
mEndpointMaps.nonBluetoothEndpoints.values.sorted()
|
|
321
329
|
}
|
|
330
|
+
}
|
|
331
|
+
return maybeRemoveEarpieceIfWiredPresent(endpoints)
|
|
332
|
+
}
|
|
322
333
|
|
|
334
|
+
/**
|
|
335
|
+
* When a wired headset is connected the built-in earpiece is not separately
|
|
336
|
+
* routable — the wired plug physically occupies the receiver path
|
|
337
|
+
*/
|
|
338
|
+
private fun maybeRemoveEarpieceIfWiredPresent(
|
|
339
|
+
endpoints: List<AudioDeviceEndpoint>
|
|
340
|
+
): List<AudioDeviceEndpoint> {
|
|
341
|
+
if (endpoints.any { it.isWiredHeadsetType() }) {
|
|
342
|
+
return endpoints.filterNot { it.type == AudioDeviceEndpoint.TYPE_EARPIECE }
|
|
323
343
|
}
|
|
344
|
+
return endpoints
|
|
324
345
|
}
|
|
325
346
|
|
|
326
347
|
private fun maybeAddCallEndpoint(endpoint: AudioDeviceEndpoint): Int {
|
|
327
348
|
if (endpoint.isBluetoothType()) {
|
|
328
|
-
|
|
329
|
-
|
|
349
|
+
val key = endpoint.deviceId.toString()
|
|
350
|
+
if (!mEndpointMaps.bluetoothEndpoints.containsKey(key)) {
|
|
351
|
+
mEndpointMaps.bluetoothEndpoints[key] = endpoint
|
|
330
352
|
Log.d(TAG, "maybeAddCallEndpoint: bluetooth endpoint added: " + endpoint.name)
|
|
331
353
|
return 1
|
|
332
354
|
}
|
|
@@ -343,8 +365,9 @@ class AudioDeviceManager(
|
|
|
343
365
|
private fun maybeRemoveCallEndpoint(endpoint: AudioDeviceEndpoint): Int {
|
|
344
366
|
// TODO:: determine if it is necessary to cleanup listeners here
|
|
345
367
|
if (endpoint.isBluetoothType()) {
|
|
346
|
-
|
|
347
|
-
|
|
368
|
+
val key = endpoint.deviceId.toString()
|
|
369
|
+
if (mEndpointMaps.bluetoothEndpoints.containsKey(key)) {
|
|
370
|
+
mEndpointMaps.bluetoothEndpoints.remove(key)
|
|
348
371
|
Log.d(TAG, "maybeRemoveCallEndpoint: bluetooth endpoint removed: " + endpoint.name)
|
|
349
372
|
return 1
|
|
350
373
|
}
|
|
@@ -405,18 +428,17 @@ class AudioDeviceManager(
|
|
|
405
428
|
return@runInAudioThread
|
|
406
429
|
}
|
|
407
430
|
val audioDevices = getCurrentDeviceEndpoints()
|
|
408
|
-
|
|
409
|
-
val
|
|
431
|
+
// Compare by stable device id, not name
|
|
432
|
+
val audioDeviceIdsSet = audioDevices.map { it.deviceId.toString() }.toSet()
|
|
433
|
+
val devicesChanged = if (cachedAvailableEndpointIdsSet.size != audioDevices.size) {
|
|
410
434
|
true
|
|
411
435
|
} else {
|
|
412
|
-
|
|
436
|
+
cachedAvailableEndpointIdsSet != audioDeviceIdsSet
|
|
413
437
|
}
|
|
414
|
-
|
|
438
|
+
cachedAvailableEndpointIdsSet = audioDeviceIdsSet
|
|
415
439
|
Log.d(
|
|
416
440
|
TAG,
|
|
417
|
-
("updateAudioDeviceState() Device status: available=$audioDevices, selected=$selectedAudioDeviceEndpoint
|
|
418
|
-
userSelectedAudioDevice
|
|
419
|
-
))
|
|
441
|
+
("updateAudioDeviceState() Device status: available=$audioDevices, selected=$selectedAudioDeviceEndpoint")
|
|
420
442
|
)
|
|
421
443
|
|
|
422
444
|
if (devicesChanged) {
|
|
@@ -437,10 +459,6 @@ class AudioDeviceManager(
|
|
|
437
459
|
newAudioDevice = it.type
|
|
438
460
|
}
|
|
439
461
|
var deviceSwitched = false
|
|
440
|
-
val userSelectedAudioDevice = this.userSelectedAudioDevice
|
|
441
|
-
if (userSelectedAudioDevice !== null && userSelectedAudioDevice != AudioDeviceEndpoint.TYPE_UNKNOWN) {
|
|
442
|
-
newAudioDevice = userSelectedAudioDevice
|
|
443
|
-
}
|
|
444
462
|
Log.d(
|
|
445
463
|
TAG, ("Decided newAudioDevice: ${endpointTypeDebug(newAudioDevice)}")
|
|
446
464
|
)
|
|
@@ -452,10 +470,6 @@ class AudioDeviceManager(
|
|
|
452
470
|
* */
|
|
453
471
|
fun revertBTSelection() {
|
|
454
472
|
val selectedAudioDeviceEndpoint = this.selectedAudioDeviceEndpoint
|
|
455
|
-
// BT connection, so revert user selection if needed
|
|
456
|
-
if (userSelectedAudioDevice == AudioDeviceEndpoint.TYPE_BLUETOOTH) {
|
|
457
|
-
this.userSelectedAudioDevice = null
|
|
458
|
-
}
|
|
459
473
|
// prev selection was not BT, but new was BT
|
|
460
474
|
// new can now be WiredHeadset or default if there was no selection before
|
|
461
475
|
if (selectedAudioDeviceEndpoint != null && selectedAudioDeviceEndpoint.type != AudioDeviceEndpoint.TYPE_UNKNOWN && selectedAudioDeviceEndpoint.type != AudioDeviceEndpoint.TYPE_BLUETOOTH) {
|
|
@@ -492,8 +506,7 @@ class AudioDeviceManager(
|
|
|
492
506
|
|
|
493
507
|
// already selected BT device
|
|
494
508
|
if (bluetoothManager.bluetoothState == BluetoothManager.State.SCO_CONNECTED) {
|
|
495
|
-
selectedAudioDeviceEndpoint =
|
|
496
|
-
getEndpointFromName(bluetoothManager.getDeviceName()!!)
|
|
509
|
+
selectedAudioDeviceEndpoint = activeBluetoothEndpoint()
|
|
497
510
|
this.selectedAudioDeviceEndpoint = selectedAudioDeviceEndpoint
|
|
498
511
|
deviceSwitched = true
|
|
499
512
|
} else if (
|
|
@@ -566,12 +579,24 @@ class AudioDeviceManager(
|
|
|
566
579
|
|
|
567
580
|
fun audioStatusMap(): WritableMap {
|
|
568
581
|
val endpoint = this.selectedAudioDeviceEndpoint
|
|
569
|
-
val
|
|
582
|
+
val devices = Arguments.createArray()
|
|
583
|
+
for (device in getCurrentDeviceEndpoints()) {
|
|
584
|
+
val deviceMap = Arguments.createMap()
|
|
585
|
+
deviceMap.putString("id", device.deviceId.toString())
|
|
586
|
+
deviceMap.putString("name", device.name)
|
|
587
|
+
deviceMap.putString(
|
|
588
|
+
"type",
|
|
589
|
+
AudioDeviceEndpointUtils.endpointTypeToString(device.type)
|
|
590
|
+
)
|
|
591
|
+
devices.pushMap(deviceMap)
|
|
592
|
+
}
|
|
570
593
|
|
|
571
594
|
val data = Arguments.createMap()
|
|
572
|
-
data.putArray("devices",
|
|
595
|
+
data.putArray("devices", devices)
|
|
573
596
|
data.putString("currentEndpointType", endpointTypeDebug(endpoint?.type))
|
|
574
|
-
|
|
597
|
+
if (endpoint != null) {
|
|
598
|
+
data.putString("selectedDeviceId", endpoint.deviceId.toString())
|
|
599
|
+
}
|
|
575
600
|
return data
|
|
576
601
|
}
|
|
577
602
|
|
|
@@ -108,7 +108,9 @@ internal class AudioManagerUtil {
|
|
|
108
108
|
AudioDeviceEndpoint.TYPE_BLUETOOTH -> {
|
|
109
109
|
val didSwitch = bluetoothManager.startScoAudio()
|
|
110
110
|
if (didSwitch) {
|
|
111
|
-
|
|
111
|
+
val activeId = audioManager.communicationDevice?.id?.toString()
|
|
112
|
+
?: return null
|
|
113
|
+
return endpointMaps.bluetoothEndpoints[activeId]
|
|
112
114
|
}
|
|
113
115
|
return null
|
|
114
116
|
}
|
|
@@ -166,7 +168,9 @@ internal class AudioManagerUtil {
|
|
|
166
168
|
val didSwitch = bluetoothManager.startScoAudio()
|
|
167
169
|
if (didSwitch) {
|
|
168
170
|
// NOTE: SCO connection may fail after timeout, how to catch that on older platforms?
|
|
169
|
-
return endpointMaps.bluetoothEndpoints
|
|
171
|
+
return endpointMaps.bluetoothEndpoints.values.firstOrNull {
|
|
172
|
+
it.name == bluetoothManager.getDeviceName()
|
|
173
|
+
}
|
|
170
174
|
}
|
|
171
175
|
return null
|
|
172
176
|
}
|
package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt
CHANGED
|
@@ -190,7 +190,7 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
|
|
|
190
190
|
|
|
191
191
|
@Suppress("unused")
|
|
192
192
|
@ReactMethod
|
|
193
|
-
fun chooseAudioDeviceEndpoint(
|
|
193
|
+
fun chooseAudioDeviceEndpoint(deviceId: String) {
|
|
194
194
|
AudioDeviceManager.runInAudioThread {
|
|
195
195
|
if (mAudioDeviceManager.callAudioRole !== CallAudioRole.Communicator) {
|
|
196
196
|
Log.e(
|
|
@@ -199,8 +199,8 @@ class StreamInCallManagerModule(reactContext: ReactApplicationContext) :
|
|
|
199
199
|
)
|
|
200
200
|
return@runInAudioThread
|
|
201
201
|
}
|
|
202
|
-
mAudioDeviceManager.
|
|
203
|
-
|
|
202
|
+
mAudioDeviceManager.switchDeviceById(
|
|
203
|
+
deviceId
|
|
204
204
|
)
|
|
205
205
|
}
|
|
206
206
|
}
|
|
@@ -146,4 +146,15 @@ Object.keys(_useModeration).forEach(function (key) {
|
|
|
146
146
|
}
|
|
147
147
|
});
|
|
148
148
|
});
|
|
149
|
+
var _useAudioDeviceStatus = require("./useAudioDeviceStatus");
|
|
150
|
+
Object.keys(_useAudioDeviceStatus).forEach(function (key) {
|
|
151
|
+
if (key === "default" || key === "__esModule") return;
|
|
152
|
+
if (key in exports && exports[key] === _useAudioDeviceStatus[key]) return;
|
|
153
|
+
Object.defineProperty(exports, key, {
|
|
154
|
+
enumerable: true,
|
|
155
|
+
get: function () {
|
|
156
|
+
return _useAudioDeviceStatus[key];
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
});
|
|
149
160
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_usePermissionRequest","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_usePermissionNotification","_push","_useAndroidKeepCallAliveEffect","_useIsIosScreenshareBroadcastStarted","_useIsInPiPMode","_useAutoEnterPiPEffect","_useScreenShareButton","_useScreenShareAudioMixing","_useLoopbackRecording","_useTrackDimensions","_useScreenshot","_useModeration"],"sourceRoot":"../../../src","sources":["hooks/index.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_usePermissionRequest","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_usePermissionNotification","_push","_useAndroidKeepCallAliveEffect","_useIsIosScreenshareBroadcastStarted","_useIsInPiPMode","_useAutoEnterPiPEffect","_useScreenShareButton","_useScreenShareAudioMixing","_useLoopbackRecording","_useTrackDimensions","_useScreenshot","_useModeration","_useAudioDeviceStatus"],"sourceRoot":"../../../src","sources":["hooks/index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,6 +7,8 @@ exports.useCallingExpWithCallingStateEffect = void 0;
|
|
|
7
7
|
var _videoClient = require("@stream-io/video-client");
|
|
8
8
|
var _videoReactBindings = require("@stream-io/video-react-bindings");
|
|
9
9
|
var _react = require("react");
|
|
10
|
+
var _reactNative = require("react-native");
|
|
11
|
+
var _reactNativeWebrtc = require("@stream-io/react-native-webrtc");
|
|
10
12
|
var _operators = require("rxjs/operators");
|
|
11
13
|
var _callingx = require("../../utils/internal/callingx/callingx");
|
|
12
14
|
var _callingx2 = require("../../utils/push/libs/callingx");
|
|
@@ -141,6 +143,77 @@ const useCallingExpWithCallingStateEffect = () => {
|
|
|
141
143
|
subscription.remove();
|
|
142
144
|
};
|
|
143
145
|
}, [activeCallCid, microphone]);
|
|
146
|
+
|
|
147
|
+
// Trace CallKit audio session activation/deactivation onto the call's tracer.
|
|
148
|
+
(0, _react.useEffect)(() => {
|
|
149
|
+
const callingx = (0, _callingx2.getCallingxLibIfAvailable)();
|
|
150
|
+
if (!callingx?.isSetup || !activeCall) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const activateSubscription = callingx.addEventListener('didActivateAudioSession', () => {
|
|
154
|
+
activeCall.tracer.trace('callingx.didActivateAudioSession', null);
|
|
155
|
+
});
|
|
156
|
+
const deactivateSubscription = callingx.addEventListener('didDeactivateAudioSession', () => {
|
|
157
|
+
activeCall.tracer.trace('callingx.didDeactivateAudioSession', null);
|
|
158
|
+
});
|
|
159
|
+
return () => {
|
|
160
|
+
activateSubscription.remove();
|
|
161
|
+
deactivateSubscription.remove();
|
|
162
|
+
};
|
|
163
|
+
}, [activeCall]);
|
|
164
|
+
|
|
165
|
+
// Trace the iOS ADM recording state to detect silent-mic calls: the engine's
|
|
166
|
+
// input bring-up racing the CallKit audio-session activation could leave
|
|
167
|
+
// recording silently never started (mic track live, zero audio RTP sent).
|
|
168
|
+
// Samples shortly after JOINED and after every didActivateAudioSession, and
|
|
169
|
+
// traces healthy calls too so the failure rate is measurable. Detection only;
|
|
170
|
+
// the engine-availability gate in callingx owns prevention.
|
|
171
|
+
(0, _react.useEffect)(() => {
|
|
172
|
+
const callingx = (0, _callingx2.getCallingxLibIfAvailable)();
|
|
173
|
+
if (_reactNative.Platform.OS !== 'ios' || !callingx?.isSetup || !activeCall) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const timeouts = new Set();
|
|
177
|
+
const traceRecordingState = trigger => {
|
|
178
|
+
if (activeCall.state.callingState !== _videoClient.CallingState.JOINED) return;
|
|
179
|
+
if (activeCall.microphone.state.status !== 'enabled') return;
|
|
180
|
+
let state;
|
|
181
|
+
try {
|
|
182
|
+
state = {
|
|
183
|
+
trigger,
|
|
184
|
+
isRecording: _reactNativeWebrtc.AudioDeviceModule.isRecording(),
|
|
185
|
+
isEngineRunning: _reactNativeWebrtc.AudioDeviceModule.isEngineRunning(),
|
|
186
|
+
isMicrophoneMuted: _reactNativeWebrtc.AudioDeviceModule.isMicrophoneMuted()
|
|
187
|
+
};
|
|
188
|
+
} catch (error) {
|
|
189
|
+
logger.warn('failed to read the ADM recording state', error);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
activeCall.tracer.trace('ios.audioRecording.state', state);
|
|
193
|
+
if (!state.isRecording) {
|
|
194
|
+
logger.warn('mic is enabled but ADM is not recording', state);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
const scheduleCheck = (trigger, delayMs) => {
|
|
198
|
+
const timeout = setTimeout(() => {
|
|
199
|
+
timeouts.delete(timeout);
|
|
200
|
+
traceRecordingState(trigger);
|
|
201
|
+
}, delayMs);
|
|
202
|
+
timeouts.add(timeout);
|
|
203
|
+
};
|
|
204
|
+
const joinedSubscription = activeCall.state.callingState$.pipe((0, _operators.filter)(callingState => callingState === _videoClient.CallingState.JOINED), (0, _operators.take)(1))
|
|
205
|
+
// delayed so the normal engine bring-up can complete on its own
|
|
206
|
+
.subscribe(() => scheduleCheck('joined', 3000));
|
|
207
|
+
const activationSubscription = callingx.addEventListener('didActivateAudioSession',
|
|
208
|
+
// delayed so the activation-driven engine start can run first
|
|
209
|
+
() => scheduleCheck('audioSessionActivated', 1000));
|
|
210
|
+
return () => {
|
|
211
|
+
joinedSubscription.unsubscribe();
|
|
212
|
+
activationSubscription.remove();
|
|
213
|
+
timeouts.forEach(clearTimeout);
|
|
214
|
+
timeouts.clear();
|
|
215
|
+
};
|
|
216
|
+
}, [activeCall]);
|
|
144
217
|
};
|
|
145
218
|
exports.useCallingExpWithCallingStateEffect = useCallingExpWithCallingStateEffect;
|
|
146
219
|
//# sourceMappingURL=useCallingExpWithCallingStateEffect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_videoClient","require","_videoReactBindings","_react","_operators","_callingx","_callingx2","logger","videoLoggerSystem","getLogger","useCallingExpWithCallingStateEffect","useMicrophoneState","useParticipants","useCallMembers","useCallStateHooks","activeCall","useCall","isMute","microphone","callMembers","participants","activeCallCid","cid","createdByUserId","state","createdBy","id","callCustomDisplayName","custom","display_name","currentUserId","isIncoming","ringing","isCreatedByMe","callDisplayName","useMemo","getCallDisplayName","useEffect","callingx","getCallingxLibIfAvailable","isSetup","shouldMakeCallActive","call","isOngoingCallsEnabled","subscription","callingState$","pipe","filter","callingState","CallingState","JOINED","isCallTracked","take","subscribe","setCurrentCallActive","unsubscribe","debug","endCallWithReason","catch","error","updateDisplay","setMutedCall","addEventListener","event","callId","muted","isCurrentlyMuted","status","disable","enable","remove","exports"],"sourceRoot":"../../../../src","sources":["hooks/push/useCallingExpWithCallingStateEffect.ts"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,
|
|
1
|
+
{"version":3,"names":["_videoClient","require","_videoReactBindings","_react","_reactNative","_reactNativeWebrtc","_operators","_callingx","_callingx2","logger","videoLoggerSystem","getLogger","useCallingExpWithCallingStateEffect","useMicrophoneState","useParticipants","useCallMembers","useCallStateHooks","activeCall","useCall","isMute","microphone","callMembers","participants","activeCallCid","cid","createdByUserId","state","createdBy","id","callCustomDisplayName","custom","display_name","currentUserId","isIncoming","ringing","isCreatedByMe","callDisplayName","useMemo","getCallDisplayName","useEffect","callingx","getCallingxLibIfAvailable","isSetup","shouldMakeCallActive","call","isOngoingCallsEnabled","subscription","callingState$","pipe","filter","callingState","CallingState","JOINED","isCallTracked","take","subscribe","setCurrentCallActive","unsubscribe","debug","endCallWithReason","catch","error","updateDisplay","setMutedCall","addEventListener","event","callId","muted","isCurrentlyMuted","status","disable","enable","remove","activateSubscription","tracer","trace","deactivateSubscription","Platform","OS","timeouts","Set","traceRecordingState","trigger","isRecording","AudioDeviceModule","isEngineRunning","isMicrophoneMuted","warn","scheduleCheck","delayMs","timeout","setTimeout","delete","add","joinedSubscription","activationSubscription","forEach","clearTimeout","clear","exports"],"sourceRoot":"../../../../src","sources":["hooks/push/useCallingExpWithCallingStateEffect.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useAudioDeviceStatus = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _callManager = require("../modules/call-manager");
|
|
9
|
+
/**
|
|
10
|
+
* Structural equality for two audio device states to avoid redundant re-renders.
|
|
11
|
+
*/
|
|
12
|
+
const areStatesEqual = (a, b) => {
|
|
13
|
+
if (!a) return false;
|
|
14
|
+
if (a.selectedDeviceId !== b.selectedDeviceId || a.currentEndpointType !== b.currentEndpointType || a.devices.length !== b.devices.length) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
return a.devices.every((device, i) => {
|
|
18
|
+
const other = b.devices[i];
|
|
19
|
+
return other !== undefined && device.id === other.id && device.name === other.name && device.type === other.type;
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Subscribes to the current audio output device state and keeps it in sync.
|
|
25
|
+
*
|
|
26
|
+
* Works on Android, iOS, and iOS with CallKit
|
|
27
|
+
* (`@stream-io/react-native-callingx`) — the underlying source is selected
|
|
28
|
+
* automatically. Pair with `callManager.audioDevices.select(device.id)` to
|
|
29
|
+
* build a custom audio route picker.
|
|
30
|
+
*
|
|
31
|
+
* @returns the latest {@link AudioDevicesState}, or `undefined` until the
|
|
32
|
+
* initial status resolves.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* const status = useAudioDeviceStatus();
|
|
37
|
+
* const { devices, selectedDeviceId } = status ?? {};
|
|
38
|
+
* // callManager.audioDevices.select(devices[0].id);
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
const useAudioDeviceStatus = () => {
|
|
42
|
+
const [state, setState] = (0, _react.useState)();
|
|
43
|
+
(0, _react.useEffect)(() => {
|
|
44
|
+
let active = true;
|
|
45
|
+
let receivedUpdate = false;
|
|
46
|
+
let unsubscribe = () => {};
|
|
47
|
+
const applyIfChanged = next => {
|
|
48
|
+
setState(prev => areStatesEqual(prev, next) ? prev : next);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// Live change events take precedence over the initial fetch.
|
|
52
|
+
const onChange = next => {
|
|
53
|
+
if (!active) return;
|
|
54
|
+
receivedUpdate = true;
|
|
55
|
+
applyIfChanged(next);
|
|
56
|
+
};
|
|
57
|
+
try {
|
|
58
|
+
// Subscribe before fetching so no change between the two is missed.
|
|
59
|
+
unsubscribe = _callManager.callManager.audioDevices.addChangeListener(onChange);
|
|
60
|
+
_callManager.callManager.audioDevices.getStatus().then(initial => {
|
|
61
|
+
// Don't let the initial snapshot clobber newer event-driven state,
|
|
62
|
+
// and ignore it entirely after unmount.
|
|
63
|
+
if (active && !receivedUpdate) applyIfChanged(initial);
|
|
64
|
+
}).catch(() => {});
|
|
65
|
+
} catch {
|
|
66
|
+
// Native/bridge error during setup — leave state undefined.
|
|
67
|
+
}
|
|
68
|
+
return () => {
|
|
69
|
+
active = false;
|
|
70
|
+
unsubscribe();
|
|
71
|
+
};
|
|
72
|
+
}, []);
|
|
73
|
+
return state;
|
|
74
|
+
};
|
|
75
|
+
exports.useAudioDeviceStatus = useAudioDeviceStatus;
|
|
76
|
+
//# sourceMappingURL=useAudioDeviceStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_callManager","areStatesEqual","a","b","selectedDeviceId","currentEndpointType","devices","length","every","device","i","other","undefined","id","name","type","useAudioDeviceStatus","state","setState","useState","useEffect","active","receivedUpdate","unsubscribe","applyIfChanged","next","prev","onChange","callManager","audioDevices","addChangeListener","getStatus","then","initial","catch","exports"],"sourceRoot":"../../../src","sources":["hooks/useAudioDeviceStatus.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAGA;AACA;AACA;AACA,MAAME,cAAc,GAAGA,CACrBC,CAAgC,EAChCC,CAAoB,KACR;EACZ,IAAI,CAACD,CAAC,EAAE,OAAO,KAAK;EACpB,IACEA,CAAC,CAACE,gBAAgB,KAAKD,CAAC,CAACC,gBAAgB,IACzCF,CAAC,CAACG,mBAAmB,KAAKF,CAAC,CAACE,mBAAmB,IAC/CH,CAAC,CAACI,OAAO,CAACC,MAAM,KAAKJ,CAAC,CAACG,OAAO,CAACC,MAAM,EACrC;IACA,OAAO,KAAK;EACd;EACA,OAAOL,CAAC,CAACI,OAAO,CAACE,KAAK,CAAC,CAACC,MAAM,EAAEC,CAAC,KAAK;IACpC,MAAMC,KAAK,GAAGR,CAAC,CAACG,OAAO,CAACI,CAAC,CAAC;IAC1B,OACEC,KAAK,KAAKC,SAAS,IACnBH,MAAM,CAACI,EAAE,KAAKF,KAAK,CAACE,EAAE,IACtBJ,MAAM,CAACK,IAAI,KAAKH,KAAK,CAACG,IAAI,IAC1BL,MAAM,CAACM,IAAI,KAAKJ,KAAK,CAACI,IAAI;EAE9B,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,oBAAoB,GAAGA,CAAA,KAAqC;EACvE,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAG,IAAAC,eAAQ,EAAoB,CAAC;EAEvD,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAIC,MAAM,GAAG,IAAI;IACjB,IAAIC,cAAc,GAAG,KAAK;IAC1B,IAAIC,WAAW,GAAGA,CAAA,KAAM,CAAC,CAAC;IAE1B,MAAMC,cAAc,GAAIC,IAAuB,IAAK;MAClDP,QAAQ,CAAEQ,IAAI,IAAMzB,cAAc,CAACyB,IAAI,EAAED,IAAI,CAAC,GAAGC,IAAI,GAAGD,IAAK,CAAC;IAChE,CAAC;;IAED;IACA,MAAME,QAAQ,GAAIF,IAAuB,IAAK;MAC5C,IAAI,CAACJ,MAAM,EAAE;MACbC,cAAc,GAAG,IAAI;MACrBE,cAAc,CAACC,IAAI,CAAC;IACtB,CAAC;IAED,IAAI;MACF;MACAF,WAAW,GAAGK,wBAAW,CAACC,YAAY,CAACC,iBAAiB,CAACH,QAAQ,CAAC;MAClEC,wBAAW,CAACC,YAAY,CACrBE,SAAS,CAAC,CAAC,CACXC,IAAI,CAAEC,OAAO,IAAK;QACjB;QACA;QACA,IAAIZ,MAAM,IAAI,CAACC,cAAc,EAAEE,cAAc,CAACS,OAAO,CAAC;MACxD,CAAC,CAAC,CACDC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,MAAM;MACN;IAAA;IAGF,OAAO,MAAM;MACXb,MAAM,GAAG,KAAK;MACdE,WAAW,CAAC,CAAC;IACf,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,OAAON,KAAK;AACd,CAAC;AAACkB,OAAA,CAAAnB,oBAAA,GAAAA,oBAAA","ignoreList":[]}
|