Skip to content

Commit 1c11daf

Browse files
authored
android,ios: expose needed apis for audio processing (#27)
* Add AudioProcessingFactory to WebRTCModuleOptions * Expose media stream tracks for ios * Swift compatibility * Fix boost checksum error
1 parent 546ba4f commit 1c11daf

File tree

5 files changed

+55
-6
lines changed

5 files changed

+55
-6
lines changed

android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.oney.WebRTCModule.webrtcutils.H264AndSoftwareVideoEncoderFactory;
2626

2727
import org.webrtc.AddIceObserver;
28+
import org.webrtc.AudioProcessingFactory;
2829
import org.webrtc.AudioTrack;
2930
import org.webrtc.CryptoOptions;
3031
import org.webrtc.EglBase;
@@ -90,7 +91,8 @@ public WebRTCModule(ReactApplicationContext reactContext) {
9091
String fieldTrials = options.fieldTrials;
9192

9293
PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions.builder(reactContext)
93-
.setFieldTrials(fieldTrials)
94+
95+
.setFieldTrials(fieldTrials)
9496
.setNativeLibraryLoader(new LibraryLoader())
9597
.setInjectableLogger(injectableLogger, loggingSeverity)
9698
.createInitializationOptions());
@@ -115,15 +117,29 @@ public WebRTCModule(ReactApplicationContext reactContext) {
115117
if (adm == null) {
116118
adm = JavaAudioDeviceModule.builder(reactContext).createAudioDeviceModule();
117119
}
120+
121+
AudioProcessingFactory audioProcessingFactory = null;
122+
try {
123+
if (options.audioProcessingFactoryFactory != null) {
124+
audioProcessingFactory = options.audioProcessingFactoryFactory.call();
125+
}
126+
} catch (Exception e) {
127+
// do nothing.
128+
}
118129

119130
Log.d(TAG, "Using video encoder factory: " + encoderFactory.getClass().getCanonicalName());
120131
Log.d(TAG, "Using video decoder factory: " + decoderFactory.getClass().getCanonicalName());
121132

122-
mFactory = PeerConnectionFactory.builder()
123-
.setAudioDeviceModule(adm)
124-
.setVideoEncoderFactory(encoderFactory)
125-
.setVideoDecoderFactory(decoderFactory)
126-
.createPeerConnectionFactory();
133+
PeerConnectionFactory.Builder pcFactoryBuilder = PeerConnectionFactory.builder()
134+
.setAudioDeviceModule(adm)
135+
.setVideoEncoderFactory(encoderFactory)
136+
.setVideoDecoderFactory(decoderFactory);
137+
138+
if (audioProcessingFactory != null) {
139+
pcFactoryBuilder.setAudioProcessingFactory(audioProcessingFactory);
140+
}
141+
142+
mFactory = pcFactoryBuilder.createPeerConnectionFactory();
127143

128144
// PeerConnectionFactory now owns the adm native pointer, and we don't need it anymore.
129145
adm.release();

android/src/main/java/com/oney/WebRTCModule/WebRTCModuleOptions.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
package com.oney.WebRTCModule;
22

3+
import org.webrtc.AudioProcessingFactory;
34
import org.webrtc.Loggable;
45
import org.webrtc.Logging;
56
import org.webrtc.VideoDecoderFactory;
67
import org.webrtc.VideoEncoderFactory;
78
import org.webrtc.audio.AudioDeviceModule;
89

10+
import java.util.concurrent.Callable;
11+
912
public class WebRTCModuleOptions {
1013
private static WebRTCModuleOptions instance;
1114

1215
public VideoEncoderFactory videoEncoderFactory;
1316
public VideoDecoderFactory videoDecoderFactory;
1417
public AudioDeviceModule audioDeviceModule;
18+
public Callable<AudioProcessingFactory> audioProcessingFactoryFactory;
19+
1520
public Loggable injectableLogger;
1621
public Logging.Severity loggingSeverity;
1722
public String fieldTrials;

examples/GumTestApp/ios/Podfile

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
# Fixes boost checksum error
2+
# From: https://github.com/boostorg/boost/issues/996#issuecomment-2574671532
3+
def find_and_replace_boost_url
4+
pod_spec = "../node_modules/react-native/third-party-podspecs/boost.podspec"
5+
puts "Debug: Starting boost URL replacement"
6+
if File.exist?(pod_spec)
7+
puts "Debug: Found boost.podspec"
8+
spec_content = File.read(pod_spec)
9+
spec_content.gsub!(
10+
'https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.bz2',
11+
'https://archives.boost.io/release/1.76.0/source/boost_1_76_0.tar.bz2'
12+
)
13+
File.write(pod_spec, spec_content)
14+
puts "Debug: Updated boost.podspec"
15+
end
16+
end
17+
18+
# Let the magic happen!
19+
find_and_replace_boost_url
20+
121
require_relative '../node_modules/react-native/scripts/react_native_pods'
222
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
323

ios/RCTWebRTC/WebRTCModule+RTCMediaStream.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@
55
- (RTCVideoTrack *)createVideoTrackWithCaptureController:
66
(CaptureController * (^)(RTCVideoSource *))captureControllerCreator;
77
- (NSArray *)createMediaStream:(NSArray<RTCMediaStreamTrack *> *)tracks;
8+
9+
- (RTCMediaStreamTrack *)trackForId:(nonnull NSString *)trackId pcId:(nonnull NSNumber *)pcId;
810
@end

livekit-react-native-webrtc.podspec

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,10 @@ Pod::Spec.new do |s|
2020
s.framework = 'AudioToolbox','AVFoundation', 'CoreAudio', 'CoreGraphics', 'CoreVideo', 'GLKit', 'VideoToolbox'
2121
s.dependency 'React-Core'
2222
s.dependency 'WebRTC-SDK', '~>125.6422.06'
23+
24+
# Swift/Objective-C compatibility
25+
s.pod_target_xcconfig = {
26+
'DEFINES_MODULE' => 'YES'
27+
}
28+
2329
end

0 commit comments

Comments
 (0)