Skip to content

Commit 2086ca8

Browse files
authored
Merge branch 'main' into release/v0.12.12+1
2 parents 3d02198 + 9ea4b39 commit 2086ca8

13 files changed

+76
-47
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
[0.12.12+1] - 2025-03-11
44
* [web] downgrade dart_webrtc dependency
55

6+
[0.2.0] - 2025-03-11
7+
8+
* [Android/iOS] Now using Stream's native WebRTC builds for improved performance and compatibility.
9+
* [Android] Introduced `AudioProcessingFactoryProvider` and updated `AudioProcessingController` to implement it, enabling enhanced customization of audio processing.
10+
611
[0.12.12] - 2025-03-09
712

813
* [Android] feat: Migrate to the new Surface API. (#1726)

android/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ group 'io.getstream.webrtc.flutter'
22
version '1.0-SNAPSHOT'
33

44
buildscript {
5-
ext.kotlin_version = '1.7.10'
5+
ext.kotlin_version = '1.9.10'
66
repositories {
77
google()
88
mavenCentral()
@@ -52,7 +52,7 @@ android {
5252
}
5353

5454
dependencies {
55-
implementation 'io.github.webrtc-sdk:android:125.6422.03'
55+
implementation 'io.getstream:stream-webrtc-android:1.3.8'
5656
implementation 'com.github.davidliu:audioswitch:89582c47c9a04c62f90aa5e57251af4800a62c9a'
5757
implementation 'androidx.annotation:annotation:1.1.0'
5858
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

android/src/main/java/io/getstream/webrtc/flutter/FlutterWebRTCPlugin.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import androidx.lifecycle.Lifecycle;
1212
import androidx.lifecycle.LifecycleOwner;
1313

14+
import io.getstream.webrtc.flutter.audio.AudioProcessingFactoryProvider;
1415
import io.getstream.webrtc.flutter.audio.AudioProcessingController;
1516
import io.getstream.webrtc.flutter.audio.AudioSwitchManager;
1617
import io.getstream.webrtc.flutter.utils.AnyThreadSink;
@@ -49,8 +50,12 @@ public FlutterWebRTCPlugin() {
4950

5051
public static FlutterWebRTCPlugin sharedSingleton;
5152

52-
public AudioProcessingController getAudioProcessingController() {
53-
return methodCallHandler.audioProcessingController;
53+
public void setAudioProcessingFactoryProvider(AudioProcessingFactoryProvider provider) {
54+
methodCallHandler.audioProcessingFactoryProvider = provider;
55+
}
56+
57+
public AudioProcessingFactoryProvider getAudioProcessingFactoryProvider() {
58+
return methodCallHandler.audioProcessingFactoryProvider;
5459
}
5560

5661
public MediaStreamTrack getTrackForId(String trackId, String peerConnectionId) {

android/src/main/java/io/getstream/webrtc/flutter/MethodCallHandlerImpl.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@
2121
import androidx.annotation.RequiresApi;
2222

2323
import io.getstream.webrtc.flutter.audio.AudioDeviceKind;
24+
import io.getstream.webrtc.flutter.audio.AudioProcessingFactoryProvider;
2425
import io.getstream.webrtc.flutter.audio.AudioProcessingController;
2526
import io.getstream.webrtc.flutter.audio.AudioSwitchManager;
2627
import io.getstream.webrtc.flutter.audio.AudioUtils;
2728
import io.getstream.webrtc.flutter.audio.LocalAudioTrack;
28-
import io.getstream.webrtc.flutter.audio.PlaybackSamplesReadyCallbackAdapter;
29+
// import io.getstream.webrtc.flutter.audio.PlaybackSamplesReadyCallbackAdapter;
2930
import io.getstream.webrtc.flutter.audio.RecordSamplesReadyCallbackAdapter;
3031
import io.getstream.webrtc.flutter.record.AudioChannel;
3132
import io.getstream.webrtc.flutter.record.FrameCapturer;
@@ -111,7 +112,7 @@ public class MethodCallHandlerImpl implements MethodCallHandler, StateProvider {
111112

112113
public RecordSamplesReadyCallbackAdapter recordSamplesReadyCallbackAdapter;
113114

114-
public PlaybackSamplesReadyCallbackAdapter playbackSamplesReadyCallbackAdapter;
115+
// public PlaybackSamplesReadyCallbackAdapter playbackSamplesReadyCallbackAdapter;
115116

116117
/**
117118
* The implementation of {@code getUserMedia} extracted into a separate file in order to reduce
@@ -131,7 +132,7 @@ public class MethodCallHandlerImpl implements MethodCallHandler, StateProvider {
131132

132133
private CustomVideoDecoderFactory videoDecoderFactory;
133134

134-
public AudioProcessingController audioProcessingController;
135+
public AudioProcessingFactoryProvider audioProcessingFactoryProvider;
135136

136137
MethodCallHandlerImpl(Context context, BinaryMessenger messenger, TextureRegistry textureRegistry) {
137138
this.context = context;
@@ -199,7 +200,7 @@ private void initialize(boolean bypassVoiceProcessing, int networkIgnoreMask, bo
199200
JavaAudioDeviceModule.Builder audioDeviceModuleBuilder = JavaAudioDeviceModule.builder(context);
200201

201202
recordSamplesReadyCallbackAdapter = new RecordSamplesReadyCallbackAdapter();
202-
playbackSamplesReadyCallbackAdapter = new PlaybackSamplesReadyCallbackAdapter();
203+
// playbackSamplesReadyCallbackAdapter = new PlaybackSamplesReadyCallbackAdapter();
203204

204205
if(bypassVoiceProcessing) {
205206
audioDeviceModuleBuilder.setUseHardwareAcousticEchoCanceler(false)
@@ -216,7 +217,7 @@ private void initialize(boolean bypassVoiceProcessing, int networkIgnoreMask, bo
216217
}
217218

218219
audioDeviceModuleBuilder.setSamplesReadyCallback(recordSamplesReadyCallbackAdapter);
219-
audioDeviceModuleBuilder.setPlaybackSamplesReadyCallback(playbackSamplesReadyCallbackAdapter);
220+
// audioDeviceModuleBuilder.setPlaybackSamplesReadyCallback(playbackSamplesReadyCallbackAdapter);
220221

221222
recordSamplesReadyCallbackAdapter.addCallback(getUserMediaImpl.inputSamplesInterceptor);
222223

@@ -267,9 +268,12 @@ public void onWebRtcAudioRecordSamplesReady(JavaAudioDeviceModule.AudioSamples a
267268
videoEncoderFactory.setForceSWCodec(forceSWCodec);
268269
videoEncoderFactory.setForceSWCodecList(forceSWCodecList);
269270

270-
audioProcessingController = new AudioProcessingController();
271271

272-
factoryBuilder.setAudioProcessingFactory(audioProcessingController.externalAudioProcessingFactory);
272+
if(audioProcessingFactoryProvider == null) {
273+
audioProcessingFactoryProvider = new AudioProcessingController();
274+
}
275+
276+
factoryBuilder.setAudioProcessingFactory(audioProcessingFactoryProvider.getFactory());
273277

274278
mFactory = factoryBuilder
275279
.setAudioDeviceModule(audioDeviceModule)

android/src/main/java/io/getstream/webrtc/flutter/audio/AudioProcessingController.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package io.getstream.webrtc.flutter.audio;
22

3+
import org.webrtc.AudioProcessingFactory;
34
import org.webrtc.ExternalAudioProcessingFactory;
5+
import io.getstream.webrtc.flutter.audio.AudioProcessingFactoryProvider;
46

5-
public class AudioProcessingController {
7+
public class AudioProcessingController implements AudioProcessingFactoryProvider {
68
/**
79
* This is the audio processing module that will be applied to the audio stream after it is captured from the microphone.
810
* This is useful for adding echo cancellation, noise suppression, etc.
@@ -20,5 +22,9 @@ public AudioProcessingController() {
2022
this.externalAudioProcessingFactory.setCapturePostProcessing(capturePostProcessing);
2123
this.externalAudioProcessingFactory.setRenderPreProcessing(renderPreProcessing);
2224
}
23-
24-
}
25+
26+
@Override
27+
public AudioProcessingFactory getFactory() {
28+
return this.externalAudioProcessingFactory;
29+
}
30+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.getstream.webrtc.flutter.audio;
2+
3+
import org.webrtc.AudioProcessingFactory;
4+
5+
// Define the common interface
6+
public interface AudioProcessingFactoryProvider {
7+
AudioProcessingFactory getFactory();
8+
}
Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
package io.getstream.webrtc.flutter.audio;
1+
// package io.getstream.webrtc.flutter.audio;
22

3-
import org.webrtc.audio.JavaAudioDeviceModule;
3+
// import org.webrtc.audio.JavaAudioDeviceModule;
44

5-
import java.util.ArrayList;
6-
import java.util.List;
5+
// import java.util.ArrayList;
6+
// import java.util.List;
77

8-
public class PlaybackSamplesReadyCallbackAdapter
9-
implements JavaAudioDeviceModule.PlaybackSamplesReadyCallback {
10-
public PlaybackSamplesReadyCallbackAdapter() {}
8+
// public class PlaybackSamplesReadyCallbackAdapter
9+
// implements JavaAudioDeviceModule.PlaybackSamplesReadyCallback {
10+
// public PlaybackSamplesReadyCallbackAdapter() {}
1111

12-
List<JavaAudioDeviceModule.PlaybackSamplesReadyCallback> callbacks = new ArrayList<>();
12+
// List<JavaAudioDeviceModule.PlaybackSamplesReadyCallback> callbacks = new ArrayList<>();
1313

14-
public void addCallback(JavaAudioDeviceModule.PlaybackSamplesReadyCallback callback) {
15-
synchronized (callbacks) {
16-
callbacks.add(callback);
17-
}
18-
}
14+
// public void addCallback(JavaAudioDeviceModule.PlaybackSamplesReadyCallback callback) {
15+
// synchronized (callbacks) {
16+
// callbacks.add(callback);
17+
// }
18+
// }
1919

20-
public void removeCallback(JavaAudioDeviceModule.PlaybackSamplesReadyCallback callback) {
21-
synchronized (callbacks) {
22-
callbacks.remove(callback);
23-
}
24-
}
20+
// public void removeCallback(JavaAudioDeviceModule.PlaybackSamplesReadyCallback callback) {
21+
// synchronized (callbacks) {
22+
// callbacks.remove(callback);
23+
// }
24+
// }
2525

26-
@Override
27-
public void onWebRtcAudioTrackSamplesReady(JavaAudioDeviceModule.AudioSamples audioSamples) {
28-
for (JavaAudioDeviceModule.PlaybackSamplesReadyCallback callback : callbacks) {
29-
callback.onWebRtcAudioTrackSamplesReady(audioSamples);
30-
}
31-
}
32-
}
26+
// @Override
27+
// public void onWebRtcAudioTrackSamplesReady(JavaAudioDeviceModule.AudioSamples audioSamples) {
28+
// for (JavaAudioDeviceModule.PlaybackSamplesReadyCallback callback : callbacks) {
29+
// callback.onWebRtcAudioTrackSamplesReady(audioSamples);
30+
// }
31+
// }
32+
// }

common/darwin/Classes/FlutterRTCMediaStream.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
@interface FlutterWebRTCPlugin (RTCMediaStream)
99

10-
- (RTCVideoTrack*)cloneTrack:(nonnull NSString*)trackId;
10+
- (RTCVideoTrack* _Nullable)cloneTrack:(nonnull NSString*)trackId;
1111

1212
- (void)getUserMedia:(nonnull NSDictionary*)constraints result:(nonnull FlutterResult)result;
1313

common/darwin/Classes/FlutterRTCMediaStream.m

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,10 @@ - (RTCMediaStreamTrack*)cloneTrack:(nonnull NSString*)trackId {
341341
LocalVideoTrack* originalLocalTrack = self.localTracks[trackId];
342342

343343
if (originalTrack != nil && [originalTrack.kind isEqualToString:@"audio"]) {
344-
RTCAudioTrack *originalAudioTrack = (RTCAudioTrack *)originalTrack;
344+
RTCAudioTrack* originalAudioTrack = (RTCAudioTrack *)originalTrack;
345+
RTCAudioSource* originalAudioSource = originalAudioTrack.source;
345346

346-
RTCAudioTrack* audioTrack = [self.peerConnectionFactory audioTrackWithTrackId:trackId];
347+
RTCAudioTrack* audioTrack = [self.peerConnectionFactory audioTrackWithSource:originalAudioSource trackId:newTrackId];
347348
LocalAudioTrack *localAudioTrack = [[LocalAudioTrack alloc] initWithTrack:audioTrack];
348349

349350
audioTrack.settings = originalAudioTrack.settings;

common/darwin/Classes/FlutterWebRTCPlugin.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ typedef void (^CapturerStopHandler)(CompletionHandler _Nonnull handler);
4949
@property(nonatomic, strong) RTCCameraVideoCapturer* _Nullable videoCapturer;
5050
@property(nonatomic, strong) FlutterRTCFrameCapturer* _Nullable frameCapturer;
5151
@property(nonatomic, strong) AVAudioSessionPort _Nullable preferredInput;
52-
@property (nonatomic, strong) VideoEffectProcessor* videoEffectProcessor;
52+
@property (nonatomic, strong) VideoEffectProcessor* _Nullable videoEffectProcessor;
5353

5454
@property(nonatomic, strong) NSString * _Nonnull focusMode;
5555
@property(nonatomic, strong) NSString * _Nonnull exposureMode;

0 commit comments

Comments
 (0)