diff --git a/android/src/main/java/com/livekit/reactnative/LivekitReactNativeModule.kt b/android/src/main/java/com/livekit/reactnative/LivekitReactNativeModule.kt index 9b22f152..177299d8 100644 --- a/android/src/main/java/com/livekit/reactnative/LivekitReactNativeModule.kt +++ b/android/src/main/java/com/livekit/reactnative/LivekitReactNativeModule.kt @@ -14,6 +14,7 @@ import com.livekit.reactnative.audio.AudioSwitchManager import com.livekit.reactnative.audio.processing.AudioSinkManager import com.livekit.reactnative.audio.processing.MultibandVolumeProcessor import com.livekit.reactnative.audio.processing.VolumeProcessor +import com.oney.WebRTCModule.WebRTCModuleOptions import org.webrtc.audio.WebRtcAudioTrackHelper import kotlin.time.Duration.Companion.milliseconds @@ -194,6 +195,11 @@ class LivekitReactNativeModule(reactContext: ReactApplicationContext) : ReactCon // Keep: Required for RN built in Event Emitter Calls. } + @ReactMethod + fun setDefaultAudioTrackVolume(volume: Double) { + WebRTCModuleOptions.getInstance().defaultTrackVolume = volume + } + override fun invalidate() { LiveKitReactNative.invalidate(reactApplicationContext) } diff --git a/ci/ios/Podfile.lock b/ci/ios/Podfile.lock index 84e3c967..e31e20f7 100644 --- a/ci/ios/Podfile.lock +++ b/ci/ios/Podfile.lock @@ -7,10 +7,29 @@ PODS: - hermes-engine (0.74.2): - hermes-engine/Pre-built (= 0.74.2) - hermes-engine/Pre-built (0.74.2) - - livekit-react-native (2.5.1): + - livekit-react-native (2.7.5): + - DoubleConversion + - glog + - hermes-engine - livekit-react-native-webrtc + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen - React-Core - - livekit-react-native-webrtc (125.0.8): + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - livekit-react-native-webrtc (125.0.10): - React-Core - WebRTC-SDK (~> 125.6422.07) - RCT-Folly (2024.01.01.00): @@ -1361,8 +1380,8 @@ SPEC CHECKSUMS: fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 hermes-engine: 01d3e052018c2a13937aca1860fbedbccd4a41b7 - livekit-react-native: 08264d81497fe9d18eb513e1db05d0539ddb9417 - livekit-react-native-webrtc: c456181c7c6f9f2b0a79ea14d0d3c97215266ba0 + livekit-react-native: dddab6768c9f3a823299c2a041676d966ad737b5 + livekit-react-native-webrtc: eadea4c155d858c41ee25a44ef91b5788d074b4b RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47 RCTDeprecation: b03c35057846b685b3ccadc9bfe43e349989cdb2 RCTRequired: 194626909cfa8d39ca6663138c417bc6c431648c @@ -1416,4 +1435,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 7e787510e5e3fbe259a5a7507ea2e7e1b1ff65ef -COCOAPODS: 1.13.0 +COCOAPODS: 1.16.2 diff --git a/ci/package.json b/ci/package.json index 832fad15..22fd5082 100644 --- a/ci/package.json +++ b/ci/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@livekit/react-native": "*", - "@livekit/react-native-webrtc": "^125.0.9", + "@livekit/react-native-webrtc": "^125.0.10", "livekit-client": "^2.9.8", "react": "18.2.0", "react-native": "0.74.2" diff --git a/ci/yarn.lock b/ci/yarn.lock index 7d650fd5..e4117e76 100644 --- a/ci/yarn.lock +++ b/ci/yarn.lock @@ -2174,16 +2174,16 @@ __metadata: languageName: node linkType: hard -"@livekit/react-native-webrtc@npm:^125.0.9": - version: 125.0.9 - resolution: "@livekit/react-native-webrtc@npm:125.0.9" +"@livekit/react-native-webrtc@npm:^125.0.10": + version: 125.0.10 + resolution: "@livekit/react-native-webrtc@npm:125.0.10" dependencies: base64-js: 1.5.1 debug: 4.3.4 event-target-shim: 6.0.2 peerDependencies: react-native: ">=0.60.0" - checksum: bcc67353c6887c059e555957d35bf470b3f5daae45a7ce4039369ced9c8d9beaf23d115ad30ae339606f49170e866caa0f88a4a2813d1e2b8d3eead0c7ce321a + checksum: e40d4742e8b2819653b96979309b167c753f77b953b6ca29b0c48a5aa3169706e36981e95da78c90ec5c1c9b22f225c31fb1d5ed531295e6c996bbbdb64a9a72 languageName: node linkType: hard @@ -3872,7 +3872,7 @@ __metadata: "@babel/preset-env": ^7.20.0 "@babel/runtime": ^7.20.0 "@livekit/react-native": "*" - "@livekit/react-native-webrtc": ^125.0.9 + "@livekit/react-native-webrtc": ^125.0.10 "@react-native/babel-preset": 0.74.84 "@react-native/eslint-config": 0.74.84 "@react-native/metro-config": 0.74.84 diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index e61d68e2..6629c41f 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -29,7 +29,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - livekit-react-native-webrtc (125.0.9): + - livekit-react-native-webrtc (125.0.10): - React-Core - WebRTC-SDK (~> 125.6422.07) - RCT-Folly (2024.01.01.00): @@ -1426,7 +1426,7 @@ SPEC CHECKSUMS: glog: fdfdfe5479092de0c4bdbebedd9056951f092c4f hermes-engine: 01d3e052018c2a13937aca1860fbedbccd4a41b7 livekit-react-native: dddab6768c9f3a823299c2a041676d966ad737b5 - livekit-react-native-webrtc: 8f554b78de521a0f4e919a1180bc993775aed93a + livekit-react-native-webrtc: eadea4c155d858c41ee25a44ef91b5788d074b4b RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47 RCTDeprecation: b03c35057846b685b3ccadc9bfe43e349989cdb2 RCTRequired: 194626909cfa8d39ca6663138c417bc6c431648c diff --git a/example/package.json b/example/package.json index 70d39c70..5bc7498d 100644 --- a/example/package.json +++ b/example/package.json @@ -10,7 +10,7 @@ "postinstall": "patch-package" }, "dependencies": { - "@livekit/react-native-webrtc": "^125.0.9", + "@livekit/react-native-webrtc": "^125.0.10", "@react-native-async-storage/async-storage": "^1.17.10", "@react-navigation/native": "^6.0.8", "@react-navigation/native-stack": "^6.5.0", diff --git a/example/src/RoomPage.tsx b/example/src/RoomPage.tsx index edebaadb..a4b14b0e 100644 --- a/example/src/RoomPage.tsx +++ b/example/src/RoomPage.tsx @@ -39,7 +39,7 @@ import { import { startCallService, stopCallService } from './callservice/CallService'; import Toast from 'react-native-toast-message'; -import { LocalVideoTrack, Track } from 'livekit-client'; +import { Track } from 'livekit-client'; export const RoomPage = ({ navigation, @@ -219,13 +219,7 @@ const RoomView = ({ navigation, e2ee }: RoomViewProps) => { return; } - const localCameraTrack = cameraTrack.videoTrack; - if (localCameraTrack instanceof LocalVideoTrack) { - localCameraTrack.restartTrack({ - deviceId: newDevice.deviceId, - facingMode: facingModeStr, - }); - } + await room.switchActiveDevice('videoinput', newDevice.deviceId); }} screenShareEnabled={isScreenShareEnabled} setScreenShareEnabled={(enabled: boolean) => { diff --git a/example/yarn.lock b/example/yarn.lock index 522c59d1..e5b0dd49 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -2172,16 +2172,16 @@ __metadata: languageName: node linkType: hard -"@livekit/react-native-webrtc@npm:^125.0.9": - version: 125.0.9 - resolution: "@livekit/react-native-webrtc@npm:125.0.9" +"@livekit/react-native-webrtc@npm:^125.0.10": + version: 125.0.10 + resolution: "@livekit/react-native-webrtc@npm:125.0.10" dependencies: base64-js: 1.5.1 debug: 4.3.4 event-target-shim: 6.0.2 peerDependencies: react-native: ">=0.60.0" - checksum: bcc67353c6887c059e555957d35bf470b3f5daae45a7ce4039369ced9c8d9beaf23d115ad30ae339606f49170e866caa0f88a4a2813d1e2b8d3eead0c7ce321a + checksum: e40d4742e8b2819653b96979309b167c753f77b953b6ca29b0c48a5aa3169706e36981e95da78c90ec5c1c9b22f225c31fb1d5ed531295e6c996bbbdb64a9a72 languageName: node linkType: hard @@ -6128,7 +6128,7 @@ __metadata: "@babel/core": ^7.20.0 "@babel/preset-env": ^7.20.0 "@babel/runtime": ^7.20.0 - "@livekit/react-native-webrtc": ^125.0.9 + "@livekit/react-native-webrtc": ^125.0.10 "@react-native-async-storage/async-storage": ^1.17.10 "@react-native/babel-preset": 0.74.84 "@react-native/eslint-config": 0.74.84 diff --git a/ios/LiveKitReactNativeModule.swift b/ios/LiveKitReactNativeModule.swift index 8a52e06b..4f055d28 100644 --- a/ios/LiveKitReactNativeModule.swift +++ b/ios/LiveKitReactNativeModule.swift @@ -225,6 +225,14 @@ public class LivekitReactNativeModule: RCTEventEmitter { return nil } + @objc(setDefaultAudioTrackVolume:) + public func setDefaultAudioTrackVolume(_ volume: NSNumber) -> Any? { + let options = WebRTCModuleOptions.sharedInstance() + options.defaultTrackVolume = volume.doubleValue + + return nil + } + override public func supportedEvents() -> [String]! { return [ LKEvents.kEventVolumeProcessed, diff --git a/ios/LivekitReactNativeModule.m b/ios/LivekitReactNativeModule.m index ead86e87..014f4dc7 100644 --- a/ios/LivekitReactNativeModule.m +++ b/ios/LivekitReactNativeModule.m @@ -8,6 +8,8 @@ @interface RCT_EXTERN_MODULE(LivekitReactNativeModule, RCTEventEmitter) RCT_EXTERN_METHOD(startAudioSession) RCT_EXTERN_METHOD(stopAudioSession) +RCT_EXTERN_METHOD(setDefaultAudioTrackVolume:(nonnull NSNumber *) volume) + RCT_EXTERN_METHOD(showAudioRoutePicker) RCT_EXTERN_METHOD(getAudioOutputsWithResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject) diff --git a/package.json b/package.json index 1d405fad..b1e19ec2 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "@babel/preset-env": "^7.20.0", "@babel/runtime": "^7.20.0", "@commitlint/config-conventional": "^16.2.1", - "@livekit/react-native-webrtc": "^125.0.8", + "@livekit/react-native-webrtc": "^125.0.10", "@react-native/babel-preset": "0.74.84", "@react-native/eslint-config": "0.74.84", "@react-native/metro-config": "0.74.84", @@ -84,7 +84,7 @@ "typescript": "5.0.4" }, "peerDependencies": { - "@livekit/react-native-webrtc": "^125.0.9", + "@livekit/react-native-webrtc": "^125.0.10", "livekit-client": "^2.9.0", "react": "*", "react-native": "*" diff --git a/src/audio/AudioSession.ts b/src/audio/AudioSession.ts index 76431ebe..ed3b9a9c 100644 --- a/src/audio/AudioSession.ts +++ b/src/audio/AudioSession.ts @@ -254,6 +254,17 @@ export default class AudioSession { await LiveKitModule.stopAudioSession(); }; + /** + * Set default audio track volume when new tracks are subscribed. + * Does **not** affect any existing tracks. + * + * @param volume A number between 0.0 and 1.0, where 0.0 represents 0% volume and + * 1.0 represents full volume. + */ + static setDefaultRemoteAudioTrackVolume = async (volume: number) => { + await LiveKitModule.setDefaultAudioTrackVolume(volume); + }; + /** * Gets the available audio outputs for use with {@link selectAudioOutput}. * diff --git a/yarn.lock b/yarn.lock index a8a06f08..06aefa20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2433,16 +2433,16 @@ __metadata: languageName: node linkType: hard -"@livekit/react-native-webrtc@npm:^125.0.8": - version: 125.0.8 - resolution: "@livekit/react-native-webrtc@npm:125.0.8" +"@livekit/react-native-webrtc@npm:^125.0.10": + version: 125.0.10 + resolution: "@livekit/react-native-webrtc@npm:125.0.10" dependencies: base64-js: 1.5.1 debug: 4.3.4 event-target-shim: 6.0.2 peerDependencies: react-native: ">=0.60.0" - checksum: addf528f9d5fdc18b5f03134cec9d0adc1f0837d727af3117c9da04c56a709875be8d1e360fb65409297a8137bb2c6933fc8aaf527da49fc86764f4ab55e5cb6 + checksum: e40d4742e8b2819653b96979309b167c753f77b953b6ca29b0c48a5aa3169706e36981e95da78c90ec5c1c9b22f225c31fb1d5ed531295e6c996bbbdb64a9a72 languageName: node linkType: hard @@ -2455,7 +2455,7 @@ __metadata: "@babel/runtime": ^7.20.0 "@commitlint/config-conventional": ^16.2.1 "@livekit/components-react": ^2.8.1 - "@livekit/react-native-webrtc": ^125.0.8 + "@livekit/react-native-webrtc": ^125.0.10 "@react-native/babel-preset": 0.74.84 "@react-native/eslint-config": 0.74.84 "@react-native/metro-config": 0.74.84 @@ -2489,7 +2489,7 @@ __metadata: web-streams-polyfill: ^4.1.0 well-known-symbols: ^4.1.0 peerDependencies: - "@livekit/react-native-webrtc": ^125.0.9 + "@livekit/react-native-webrtc": ^125.0.10 livekit-client: ^2.9.0 react: "*" react-native: "*"