Skip to content

Commit a2b51c1

Browse files
authored
feat(llc): option to set android audio configuration to WebRTC (#1046)
* option to set android audio configuration to WebRTC * changelog * tweaks * bumped webrtc version * fix tests * conditional webrtc initialization
1 parent b21cc8d commit a2b51c1

File tree

13 files changed

+72
-6
lines changed

13 files changed

+72
-6
lines changed

melos.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ command:
2222
device_info_plus: ">=10.1.2 <12.0.0"
2323
share_plus: ^11.0.0
2424
stream_chat_flutter: ^9.8.0
25-
stream_webrtc_flutter: ^1.0.10
25+
stream_webrtc_flutter: ^1.0.11
2626
stream_video: ^0.10.2
2727
stream_video_flutter: ^0.10.2
2828
stream_video_noise_cancellation: ^0.10.2

packages/stream_video/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## Unregistered
2+
3+
✅ Added
4+
* Added option to configure android audio configuration when initializing `StreamVideo` instance by providing `androidAudioConfiguration` to `StreamVideoOptions`.
5+
16
## 0.10.2
27

38
✅ Added

packages/stream_video/lib/src/call/call.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2640,6 +2640,21 @@ class Call {
26402640
await setAudioInputDevice(_connectOptions.audioInputDevice!);
26412641
}
26422642

2643+
if (enabled && CurrentPlatform.isAndroid) {
2644+
try {
2645+
if (_streamVideo.options.androidAudioConfiguration != null) {
2646+
await rtc.Helper.setAndroidAudioConfiguration(
2647+
_streamVideo.options.androidAudioConfiguration!,
2648+
);
2649+
}
2650+
} catch (e) {
2651+
_logger.w(
2652+
() =>
2653+
'[setMicrophoneEnabled] Failed to set Android audio configuration: $e',
2654+
);
2655+
}
2656+
}
2657+
26432658
_sfuStatsTimers.add(
26442659
Future<void>.delayed(const Duration(seconds: 3)).then((_) {
26452660
if (result.getDataOrNull()!.mediaTrack.enabled) {

packages/stream_video/lib/src/call/session/call_session.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class CallSession extends Disposable {
7373
this.clientPublishOptions,
7474
this.joinResponseTimeout = const Duration(seconds: 5),
7575
}) : _tracer = tracer,
76+
_streamVideo = streamVideo,
7677
sfuClient = SfuClient(
7778
baseUrl: config.sfuUrl,
7879
sfuToken: config.sfuToken,
@@ -115,6 +116,7 @@ class CallSession extends Disposable {
115116
final InternetConnection networkMonitor;
116117
final StatsOptions statsOptions;
117118
final Tracer _tracer;
119+
final StreamVideo _streamVideo;
118120

119121
final Duration joinResponseTimeout;
120122

@@ -889,6 +891,21 @@ class CallSession extends Disposable {
889891
) async {
890892
_logger.d(() => '[onRemoteTrackReceived] remoteTrack: $remoteTrack');
891893

894+
if (CurrentPlatform.isAndroid &&
895+
remoteTrack.isAudioTrack &&
896+
_streamVideo.options.androidAudioConfiguration != null) {
897+
try {
898+
await rtc.Helper.setAndroidAudioConfiguration(
899+
_streamVideo.options.androidAudioConfiguration!,
900+
);
901+
} catch (e) {
902+
_logger.w(
903+
() =>
904+
'[onRemoteTrackReceived] Failed to apply Android audio configuration: $e',
905+
);
906+
}
907+
}
908+
892909
// Start the track.
893910
await remoteTrack.start();
894911

packages/stream_video/lib/src/stream_video.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:internet_connection_checker_plus/internet_connection_checker_plu
77
import 'package:meta/meta.dart';
88
import 'package:package_info_plus/package_info_plus.dart';
99
import 'package:rxdart/rxdart.dart';
10+
import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' as rtc;
1011
import 'package:uuid/uuid.dart';
1112

1213
import '../globals.dart';
@@ -175,6 +176,18 @@ class StreamVideo extends Disposable {
175176

176177
_state.user.value = user;
177178

179+
if (CurrentPlatform.isAndroid || CurrentPlatform.isIos) {
180+
unawaited(
181+
rtc.WebRTC.initialize(
182+
options: {
183+
if (CurrentPlatform.isAndroid)
184+
'androidAudioConfiguration':
185+
options.androidAudioConfiguration!.toMap(),
186+
},
187+
),
188+
);
189+
}
190+
178191
final tokenProvider = switch (user.type) {
179192
UserType.authenticated => TokenProvider.from(
180193
userToken?.let(UserToken.jwt),
@@ -1195,6 +1208,7 @@ class StreamVideoOptions {
11951208
this.keepConnectionsAliveWhenInBackground = false,
11961209
this.networkMonitorSettings = const NetworkMonitorSettings(),
11971210
this.allowMultipleActiveCalls = false,
1211+
this.androidAudioConfiguration,
11981212
});
11991213

12001214
final String coordinatorRpcUrl;
@@ -1222,4 +1236,6 @@ class StreamVideoOptions {
12221236

12231237
/// Returns the current [NetworkMonitorSettings].
12241238
final NetworkMonitorSettings networkMonitorSettings;
1239+
1240+
final rtc.AndroidAudioConfiguration? androidAudioConfiguration;
12251241
}

packages/stream_video/lib/src/webrtc/rtc_media_device/rtc_media_device_notifier.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class RtcMediaDeviceNotifier {
3232
/// [onInterruptionStart] is called when the call interruption begins.
3333
/// [onInterruptionEnd] is called when the call interruption ends.
3434
/// [androidInterruptionSource] specifies the source of the interruption on Android.
35+
/// [androidAudioAttributesUsageType] and [androidAudioAttributesContentType] allow you to specify
36+
/// the audio attributes that will be used when requesting audio focus.
3537
///
3638
/// On iOS, interruptions can occur due to:
3739
/// - Incoming phone calls
@@ -57,11 +59,15 @@ class RtcMediaDeviceNotifier {
5759
void Function()? onInterruptionEnd,
5860
rtc.AndroidInterruptionSource androidInterruptionSource =
5961
rtc.AndroidInterruptionSource.audioFocusAndTelephony,
62+
rtc.AndroidAudioAttributesUsageType? androidAudioAttributesUsageType,
63+
rtc.AndroidAudioAttributesContentType? androidAudioAttributesContentType,
6064
}) {
6165
return rtc.handleCallInterruptionCallbacks(
6266
onInterruptionStart,
6367
onInterruptionEnd,
6468
androidInterruptionSource: androidInterruptionSource,
69+
androidAudioAttributesUsageType: androidAudioAttributesUsageType,
70+
androidAudioAttributesContentType: androidAudioAttributesContentType,
6571
);
6672
}
6773

packages/stream_video/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ dependencies:
3131
rxdart: ^0.28.0
3232
sdp_transform: ^0.3.2
3333
state_notifier: ^1.0.0
34-
stream_webrtc_flutter: ^1.0.10
34+
stream_webrtc_flutter: ^1.0.11
3535
synchronized: ^3.1.0
3636
system_info2: ^4.0.0
3737
tart: ^0.5.1

packages/stream_video/test/src/core/client_state_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ void main() {
1515
late MockCall mockCall3;
1616

1717
setUp(() {
18+
TestWidgetsFlutterBinding.ensureInitialized();
19+
1820
user = User.regular(
1921
userId: 'test-user',
2022
name: 'Test User',

packages/stream_video_flutter/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## Unregistered
2+
3+
✅ Added
4+
* Added option to configure android audio configuration when initializing `StreamVideo` instance by providing `androidAudioConfiguration` to `StreamVideoOptions`.
5+
16
## 0.10.2
27

38
✅ Added

packages/stream_video_flutter/example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ dependencies:
3030
stream_video: ^0.10.2
3131
stream_video_flutter: ^0.10.2
3232
stream_video_push_notification: ^0.10.2
33-
stream_webrtc_flutter: ^1.0.10
33+
stream_webrtc_flutter: ^1.0.11
3434

3535
dependency_overrides:
3636
stream_video:

0 commit comments

Comments
 (0)