diff --git a/android/build.gradle b/android/build.gradle index 3b2a25feb..9a845dc9a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -70,6 +70,7 @@ android { targetSdkVersion safeExtGet('targetSdkVersion', 24) versionCode 1 versionName "1.0" + consumerProguardFiles 'consumer-rules.pro' } // WebRTC requires Java 8 features @@ -85,8 +86,8 @@ def kotlin_version = getExtOrDefault('kotlinVersion', '1.8.10') println "Building Stream WebRTC React Native module with Kotlin version: $kotlin_version" dependencies { - api 'io.getstream:stream-webrtc-android:1.3.10' - implementation 'com.facebook.react:react-native:+' + api 'io.getstream:stream-video-webrtc-android:137.0.1' + implementation "com.facebook.react:react-android:+" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "androidx.core:core:1.7.0" } diff --git a/android/consumer-rules.pro b/android/consumer-rules.pro new file mode 100644 index 000000000..daa84a255 --- /dev/null +++ b/android/consumer-rules.pro @@ -0,0 +1,3 @@ +# WebRTC +-keep class org.webrtc.** { *; } +-keep class org.jni_zero.** { *; } diff --git a/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java b/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java index ede36d2ac..861919513 100644 --- a/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java +++ b/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java @@ -111,6 +111,24 @@ private AudioTrack createAudioTrack(ReadableMap constraints) { PeerConnectionFactory pcFactory = webRTCModule.mFactory; MediaConstraints peerConstraints = webRTCModule.constraintsForOptions(audioConstraintsMap); + // Convert given constraints into the internal webrtc media constraints. + peerConstraints.optional.add(new MediaConstraints.KeyValuePair("googAutoGainControl", + audioConstraintsMap.hasKey("autoGainControl") + ? ReactBridgeUtil.getMapStrValue(audioConstraintsMap, "autoGainControl") + : "true")); + peerConstraints.optional.add(new MediaConstraints.KeyValuePair("googNoiseSuppression", + audioConstraintsMap.hasKey("noiseSuppression") + ? ReactBridgeUtil.getMapStrValue(audioConstraintsMap, "noiseSuppression") + : "true")); + peerConstraints.optional.add(new MediaConstraints.KeyValuePair("googEchoCancellation", + audioConstraintsMap.hasKey("echoCancellation") + ? ReactBridgeUtil.getMapStrValue(audioConstraintsMap, "echoCancellation") + : "true")); + peerConstraints.optional.add(new MediaConstraints.KeyValuePair("googHighpassFilter", + audioConstraintsMap.hasKey("highpassFilter") + ? ReactBridgeUtil.getMapStrValue(audioConstraintsMap, "highpassFilter") + : "true")); + // PeerConnectionFactory.createAudioSource will throw an error when mandatory constraints contain nulls. // so, let's check for nulls checkMandatoryConstraints(peerConstraints); diff --git a/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m b/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m index 3d730a83f..e3e52ab3a 100644 --- a/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m +++ b/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m @@ -32,6 +32,10 @@ - (void)setVideoEffectProcessor:(VideoEffectProcessor *)videoEffectProcessor #pragma mark - getUserMedia +- (NSString *)convertBoolToString:(id)value { + return value ? @"true" : @"false"; +} + /** * Initializes a new {@link RTCAudioTrack} which satisfies the given constraints. * @@ -40,7 +44,26 @@ - (void)setVideoEffectProcessor:(VideoEffectProcessor *)videoEffectProcessor */ - (RTCAudioTrack *)createAudioTrack:(NSDictionary *)constraints { NSString *trackId = [[NSUUID UUID] UUIDString]; - RTCAudioTrack *audioTrack = [self.peerConnectionFactory audioTrackWithTrackId:trackId]; + NSDictionary *audioConstraints = constraints[@"audio"]; + NSMutableDictionary *optionalConstraints = [NSMutableDictionary dictionary]; + optionalConstraints[@"googAutoGainControl"] = audioConstraints[@"autoGainControl"] != nil + ? [self convertBoolToString:audioConstraints[@"autoGainControl"]] + : @"true"; + optionalConstraints[@"googNoiseSuppression"] = + audioConstraints[@"noiseSuppression"] != nil ? [self convertBoolToString:audioConstraints[@"noiseSuppression"]] + : @"true"; + optionalConstraints[@"googEchoCancellation"] = + audioConstraints[@"echoCancellation"] != nil ? [self convertBoolToString:audioConstraints[@"echoCancellation"]] + : @"true"; + optionalConstraints[@"googHighpassFilter"] = audioConstraints[@"highpassFilter"] != nil + ? [self convertBoolToString:audioConstraints[@"highpassFilter"]] + : @"true"; + + RTCMediaConstraints *mediaConstraints = + [[RTCMediaConstraints alloc] initWithMandatoryConstraints:nil optionalConstraints:optionalConstraints]; + + RTCAudioSource *audioSource = [self.peerConnectionFactory audioSourceWithConstraints:mediaConstraints]; + RTCAudioTrack *audioTrack = [self.peerConnectionFactory audioTrackWithSource:audioSource trackId:trackId]; return audioTrack; } /** diff --git a/ios/RCTWebRTC/WebRTCModule.m b/ios/RCTWebRTC/WebRTCModule.m index c025b3bd6..bef9e5c17 100644 --- a/ios/RCTWebRTC/WebRTCModule.m +++ b/ios/RCTWebRTC/WebRTCModule.m @@ -77,15 +77,24 @@ - (instancetype)init { NSLog(@"Both audioProcessingModule and audioDevice are provided, but only one can be used. Ignoring audioDevice."); } RCTLogInfo(@"Using audio processing module: %@", NSStringFromClass([audioProcessingModule class])); - _peerConnectionFactory = [[RTCPeerConnectionFactory alloc] initWithBypassVoiceProcessing:NO - encoderFactory:encoderFactory - decoderFactory:decoderFactory - audioProcessingModule:audioProcessingModule]; - } else { - RCTLogInfo(@"Using audio device: %@", NSStringFromClass([audioDevice class])); + _peerConnectionFactory = + [[RTCPeerConnectionFactory alloc] initWithAudioDeviceModuleType:RTCAudioDeviceModuleTypePlatformDefault + bypassVoiceProcessing:NO + encoderFactory:encoderFactory + decoderFactory:decoderFactory + audioProcessingModule:audioProcessingModule]; + } else if (audioDevice != nil) { + RCTLogInfo(@"Using custom audio device: %@", NSStringFromClass([audioDevice class])); _peerConnectionFactory = [[RTCPeerConnectionFactory alloc] initWithEncoderFactory:encoderFactory decoderFactory:decoderFactory audioDevice:audioDevice]; + } else { + _peerConnectionFactory = + [[RTCPeerConnectionFactory alloc] initWithAudioDeviceModuleType:RTCAudioDeviceModuleTypePlatformDefault + bypassVoiceProcessing:NO + encoderFactory:encoderFactory + decoderFactory:decoderFactory + audioProcessingModule:nil]; } _peerConnections = [NSMutableDictionary new]; diff --git a/package-lock.json b/package-lock.json index 9853d0aca..1fd7a8ff2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@stream-io/react-native-webrtc", - "version": "125.4.5", + "version": "137.0.0-alpha.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@stream-io/react-native-webrtc", - "version": "125.4.5", + "version": "137.0.0-alpha.6", "license": "MIT", "dependencies": { "base64-js": "1.5.1", diff --git a/package.json b/package.json index bd2f8a1e5..3638fe7b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@stream-io/react-native-webrtc", - "version": "125.4.5", + "version": "137.0.0-alpha.6", "repository": { "type": "git", "url": "git+https://github.com/GetStream/react-native-webrtc.git" diff --git a/stream-react-native-webrtc.podspec b/stream-react-native-webrtc.podspec index b182fe609..8c5605ed6 100644 --- a/stream-react-native-webrtc.podspec +++ b/stream-react-native-webrtc.podspec @@ -2,6 +2,9 @@ require 'json' package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) +# WebRTC version from stream-video-swift-webrtc releases +webrtc_version = '137.0.42' + Pod::Spec.new do |s| s.name = 'stream-react-native-webrtc' s.version = package['version'] @@ -19,7 +22,12 @@ Pod::Spec.new do |s| s.libraries = 'c', 'sqlite3', 'stdc++' s.framework = 'AudioToolbox','AVFoundation', 'CoreAudio', 'CoreGraphics', 'CoreVideo', 'GLKit', 'VideoToolbox' s.dependency 'React-Core' - s.dependency 'StreamWebRTC', '~>125.6422.070' + + s.prepare_command = <<-CMD + curl -sL "https://github.com/GetStream/stream-video-swift-webrtc/releases/download/#{webrtc_version}/WebRTC.xcframework.zip" -o w.zip && unzip -oq w.zip && rm w.zip + CMD + + s.vendored_frameworks = 'WebRTC.xcframework' # Swift/Objective-C compatibility #https://blog.cocoapods.org/CocoaPods-1.5.0/ s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES'