Skip to content

Commit 922346a

Browse files
authored
Merge pull request #10 from GetStream/feature/noise-cancellation-support
Internal webRTC builds used + noise cancellation support on Android
2 parents 84b2d7f + 43b7448 commit 922346a

File tree

11 files changed

+69
-45
lines changed

11 files changed

+69
-45
lines changed

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
@@ -20,11 +20,12 @@
2020
import androidx.annotation.RequiresApi;
2121

2222
import io.getstream.webrtc.flutter.audio.AudioDeviceKind;
23+
import io.getstream.webrtc.flutter.audio.AudioProcessingFactoryProvider;
2324
import io.getstream.webrtc.flutter.audio.AudioProcessingController;
2425
import io.getstream.webrtc.flutter.audio.AudioSwitchManager;
2526
import io.getstream.webrtc.flutter.audio.AudioUtils;
2627
import io.getstream.webrtc.flutter.audio.LocalAudioTrack;
27-
import io.getstream.webrtc.flutter.audio.PlaybackSamplesReadyCallbackAdapter;
28+
// import io.getstream.webrtc.flutter.audio.PlaybackSamplesReadyCallbackAdapter;
2829
import io.getstream.webrtc.flutter.audio.RecordSamplesReadyCallbackAdapter;
2930
import io.getstream.webrtc.flutter.record.AudioChannel;
3031
import io.getstream.webrtc.flutter.record.FrameCapturer;
@@ -110,7 +111,7 @@ public class MethodCallHandlerImpl implements MethodCallHandler, StateProvider {
110111

111112
public RecordSamplesReadyCallbackAdapter recordSamplesReadyCallbackAdapter;
112113

113-
public PlaybackSamplesReadyCallbackAdapter playbackSamplesReadyCallbackAdapter;
114+
// public PlaybackSamplesReadyCallbackAdapter playbackSamplesReadyCallbackAdapter;
114115

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

131132
private CustomVideoDecoderFactory videoDecoderFactory;
132133

133-
public AudioProcessingController audioProcessingController;
134+
public AudioProcessingFactoryProvider audioProcessingFactoryProvider;
134135

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

200201
recordSamplesReadyCallbackAdapter = new RecordSamplesReadyCallbackAdapter();
201-
playbackSamplesReadyCallbackAdapter = new PlaybackSamplesReadyCallbackAdapter();
202+
// playbackSamplesReadyCallbackAdapter = new PlaybackSamplesReadyCallbackAdapter();
202203

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

217218
audioDeviceModuleBuilder.setSamplesReadyCallback(recordSamplesReadyCallbackAdapter);
218-
audioDeviceModuleBuilder.setPlaybackSamplesReadyCallback(playbackSamplesReadyCallbackAdapter);
219+
// audioDeviceModuleBuilder.setPlaybackSamplesReadyCallback(playbackSamplesReadyCallbackAdapter);
219220

220221
recordSamplesReadyCallbackAdapter.addCallback(getUserMediaImpl.inputSamplesInterceptor);
221222

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

269-
audioProcessingController = new AudioProcessingController();
270270

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

273277
mFactory = factoryBuilder
274278
.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;

example/android/settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pluginManagement {
1919
plugins {
2020
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
2121
id "com.android.application" version "8.3.0" apply false
22-
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
22+
id "org.jetbrains.kotlin.android" version "1.9.10" apply false
2323
}
2424

2525
include ":app"

0 commit comments

Comments
 (0)