From c888095b016ad1ca73da0c3c8c7590aa82fa074f Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 24 Sep 2021 23:47:01 +0900 Subject: [PATCH 01/50] add audio_session package --- example/pubspec.lock | 14 ++++++++++++++ pubspec.lock | 26 ++++++++++++++++++++++++++ pubspec.yaml | 7 ++++--- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index 68cbe27f1..4f94beced 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -8,6 +8,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.8.1" + audio_session: + dependency: transitive + description: + name: audio_session + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.6+1" boolean_selector: dependency: transitive description: @@ -270,6 +277,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "5.0.0" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.2" shared_preferences: dependency: "direct main" description: diff --git a/pubspec.lock b/pubspec.lock index 0d7a85544..9efa8b042 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -8,6 +8,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.8.1" + audio_session: + dependency: "direct main" + description: + name: audio_session + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.6+1" boolean_selector: dependency: transitive description: @@ -95,6 +102,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_webrtc: dependency: "direct main" description: @@ -118,6 +130,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" lints: dependency: transitive description: @@ -223,6 +242,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.2" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 5eb9b4a14..547c9521e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,16 +16,17 @@ dependencies: uuid: ^3.0.4 synchronized: ^3.0.0 protobuf: ^2.0.0 + audio_session: ^0.1.6+1 - flutter_webrtc: + flutter_webrtc: + # This will use custom webrtc build from + # https://github.com/webrtc-sdk/Specs/releases git: url: https://github.com/livekit/flutter-webrtc ref: use-custom-webrtc-build # ^0.6.7 # path: ../../repos_livekit/flutter-webrtc/ - # This will use custom webrtc build from - # https://github.com/webrtc-sdk/Specs/releases # protobuf: # git: From 50647441e87afa79639821030f465b08204b3d0a Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sat, 25 Sep 2021 00:13:15 +0900 Subject: [PATCH 02/50] `AudioManager` initial design --- lib/src/managers/audio.dart | 80 +++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 lib/src/managers/audio.dart diff --git a/lib/src/managers/audio.dart b/lib/src/managers/audio.dart new file mode 100644 index 000000000..c2132679b --- /dev/null +++ b/lib/src/managers/audio.dart @@ -0,0 +1,80 @@ +import 'package:livekit_client/livekit_client.dart'; +import 'package:livekit_client/src/logger.dart'; + +import '../events.dart'; + +enum AudioRecommendationType { + listenOnly, + publishOnly, + listenAndPublish, +} + +abstract class AudioManagerEvent implements LiveKitEvent {} + +class AudioManagerUpdatedRecommendationEvent with AudioManagerEvent { + final AudioRecommendationType type; + const AudioManagerUpdatedRecommendationEvent({ + required this.type, + }); +} + +class AudioManager { + static AudioManager? _instance; + // Initial state is listen + AudioRecommendationType currentRecommendation = AudioRecommendationType.listenOnly; + int _subscribeCounter = 0; + int _publishCounter = 0; + + final events = EventsEmitter(); + + // Singleton + factory AudioManager() { + _instance ??= AudioManager(); + return _instance!; + } + + Future dispose() async { + await events.dispose(); + } + + void incrementListen() { + _subscribeCounter++; + _onUpdate(); + } + + void decrementListen() { + if (_subscribeCounter <= 0) return; + _subscribeCounter--; + _onUpdate(); + } + + void incrementPublish() { + _publishCounter++; + _onUpdate(); + } + + void decrementPublish() { + if (_publishCounter <= 0) return; + _publishCounter--; + _onUpdate(); + } + + AudioRecommendationType _calculateRecommendation() { + if (_publishCounter > 0 && _subscribeCounter == 0) { + return AudioRecommendationType.publishOnly; + } else if (_publishCounter > 0 && _subscribeCounter > 0) { + return AudioRecommendationType.listenAndPublish; + } + // Default + return AudioRecommendationType.listenOnly; + } + + void _onUpdate() { + final newRecommendation = _calculateRecommendation(); + if (currentRecommendation != newRecommendation) { + currentRecommendation = newRecommendation; + events.emit(AudioManagerUpdatedRecommendationEvent(type: currentRecommendation)); + logger.fine('[$runtimeType] updated recommendation ${currentRecommendation}'); + } + } +} From e66c06db2a34c112cb4f23266cbf66e854d2c0f8 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sat, 25 Sep 2021 00:43:08 +0900 Subject: [PATCH 03/50] try to integrate audio manager --- lib/src/managers/audio.dart | 4 +- lib/src/participant/local_participant.dart | 58 +++++++++++++-------- lib/src/participant/remote_participant.dart | 8 +++ lib/src/track/local_track_publication.dart | 1 - 4 files changed, 46 insertions(+), 25 deletions(-) diff --git a/lib/src/managers/audio.dart b/lib/src/managers/audio.dart index c2132679b..816a07eb6 100644 --- a/lib/src/managers/audio.dart +++ b/lib/src/managers/audio.dart @@ -27,9 +27,11 @@ class AudioManager { final events = EventsEmitter(); + AudioManager._(); + // Singleton factory AudioManager() { - _instance ??= AudioManager(); + _instance ??= AudioManager._(); return _instance!; } diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index 86896de11..65d66c142 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -1,5 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:livekit_client/src/managers/audio.dart'; +import 'package:livekit_client/src/track/audio_track.dart'; import '../errors.dart'; import '../events.dart'; @@ -46,29 +48,35 @@ class LocalParticipant extends Participant { throw TrackPublishException('track already exists'); } - // try { - final trackInfo = await _engine.addTrack( - cid: track.getCid(), - name: track.name, - kind: track.kind, - ); - - final transceiverInit = rtc.RTCRtpTransceiverInit( - direction: rtc.TransceiverDirection.SendOnly, - ); - // addTransceiver cannot pass in a kind parameter due to a bug in flutter-webrtc (web) - track.transceiver = await _engine.publisher?.pc.addTransceiver( - track: track.mediaStreamTrack, - kind: rtc.RTCRtpMediaType.RTCRtpMediaTypeAudio, - init: transceiverInit, - ); - await _engine.negotiate(); - - final pub = LocalTrackPublication(trackInfo, track, this); - addTrackPublication(pub); - notifyListeners(); - - return pub; + AudioManager().incrementPublish(); + + try { + final trackInfo = await _engine.addTrack( + cid: track.getCid(), + name: track.name, + kind: track.kind, + ); + + final transceiverInit = rtc.RTCRtpTransceiverInit( + direction: rtc.TransceiverDirection.SendOnly, + ); + // addTransceiver cannot pass in a kind parameter due to a bug in flutter-webrtc (web) + track.transceiver = await _engine.publisher?.pc.addTransceiver( + track: track.mediaStreamTrack, + kind: rtc.RTCRtpMediaType.RTCRtpMediaTypeAudio, + init: transceiverInit, + ); + await _engine.negotiate(); + + final pub = LocalTrackPublication(trackInfo, track, this); + addTrackPublication(pub); + notifyListeners(); + return pub; + } catch (e) { + // In any case there was an exception, revert the count. + AudioManager().decrementPublish(); + rethrow; + } } /// Publish a video track to the room @@ -159,6 +167,10 @@ class LocalParticipant extends Participant { await engine.publisher?.pc.removeTrack(sender); await engine.negotiate(); } + + if (track is AudioTrack) { + AudioManager().decrementPublish(); + } } } diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index fdcf8a158..1ddd8ae30 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -1,4 +1,5 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:livekit_client/src/managers/audio.dart'; import 'package:meta/meta.dart'; import '../constants.dart'; @@ -90,6 +91,8 @@ class RemoteParticipant extends Participant { final Track track; if (pub.kind == lk_models.TrackType.AUDIO) { // audio track + AudioManager().incrementListen(); + final audioTrack = AudioTrack(pub.name, mediaTrack, stream); audioTrack.start(); track = audioTrack; @@ -145,6 +148,7 @@ class RemoteParticipant extends Participant { final validSids = info.tracks.map((e) => e.sid); final removeSids = trackPublications.values.where((e) => !validSids.contains(e.sid)).map((e) => e.sid); + for (final sid in removeSids) { await unpublishTrack(sid, notify: true); } @@ -165,6 +169,10 @@ class RemoteParticipant extends Participant { track: track, publication: pub, )); + + if (track is AudioTrack) { + AudioManager().decrementListen(); + } } if (notify) { diff --git a/lib/src/track/local_track_publication.dart b/lib/src/track/local_track_publication.dart index fc2fb6fb5..629f5a6c7 100644 --- a/lib/src/track/local_track_publication.dart +++ b/lib/src/track/local_track_publication.dart @@ -1,7 +1,6 @@ import '../events.dart'; import '../extensions.dart'; import '../logger.dart'; -import '../managers/event.dart'; import '../participant/local_participant.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import 'track.dart'; From 57e86d45a62b8dcaa49890473a76f29bf181b84c Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sat, 25 Sep 2021 02:55:27 +0900 Subject: [PATCH 04/50] configure audio session --- example/ios/Podfile.lock | 6 ++ example/ios/Runner/Info.plist | 2 + lib/src/events.dart | 8 -- lib/src/managers/audio.dart | 99 +++++++++++++++++---- lib/src/participant/local_participant.dart | 6 +- lib/src/participant/remote_participant.dart | 4 +- lib/src/room.dart | 2 - lib/src/signal_client.dart | 1 - 8 files changed, 93 insertions(+), 35 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 416537a67..83b052434 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,4 +1,6 @@ PODS: + - audio_session (0.0.1): + - Flutter - Flutter (1.0.0) - flutter_webrtc (0.2.2): - Flutter @@ -12,6 +14,7 @@ PODS: - WebRTC-SDK (92.4515.05) DEPENDENCIES: + - audio_session (from `.symlinks/plugins/audio_session/ios`) - Flutter (from `Flutter`) - flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`) - path_provider (from `.symlinks/plugins/path_provider/ios`) @@ -23,6 +26,8 @@ SPEC REPOS: - WebRTC-SDK EXTERNAL SOURCES: + audio_session: + :path: ".symlinks/plugins/audio_session/ios" Flutter: :path: Flutter flutter_webrtc: @@ -33,6 +38,7 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/shared_preferences/ios" SPEC CHECKSUMS: + audio_session: 4f3e461722055d21515cf3261b64c973c062f345 Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a flutter_webrtc: c0cb88c7cbd057e6e667ab1560e10c74e2ceb65b Libyuv: 5f79ced0ee66e60a612ca97de1e6ccacd187a437 diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index 626df2f53..350733461 100644 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -29,6 +29,8 @@ UIBackgroundModes audio + fetch + processing UILaunchStoryboardName LaunchScreen diff --git a/lib/src/events.dart b/lib/src/events.dart index 835f60c7f..34211970c 100644 --- a/lib/src/events.dart +++ b/lib/src/events.dart @@ -110,14 +110,6 @@ class TrackSubscribedEvent with RoomEvent, ParticipantEvent { }); } -@internal -class ParticipantInfoUpdatedEvent with ParticipantEvent { - final RemoteParticipant participant; - const ParticipantInfoUpdatedEvent({ - required this.participant, - }); -} - /// An error has occured during track subscription. /// Emitted by [Room] and [RemoteParticipant]. class TrackSubscriptionExceptionEvent with RoomEvent, ParticipantEvent { diff --git a/lib/src/managers/audio.dart b/lib/src/managers/audio.dart index 816a07eb6..8c1ea5a4d 100644 --- a/lib/src/managers/audio.dart +++ b/lib/src/managers/audio.dart @@ -1,12 +1,52 @@ -import 'package:livekit_client/livekit_client.dart'; import 'package:livekit_client/src/logger.dart'; +import 'package:audio_session/audio_session.dart' as _as; import '../events.dart'; +import 'event.dart'; enum AudioRecommendationType { - listenOnly, - publishOnly, - listenAndPublish, + playOnly, + recordOnly, + playAndRecord, +} + +extension AudioRecommendationTypeExt on AudioRecommendationType { + _as.AudioSessionConfiguration configuration() { + // + final playOnlyConfiguration = _as.AudioSessionConfiguration( + avAudioSessionCategory: _as.AVAudioSessionCategory.playback, + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers & + _as.AVAudioSessionCategoryOptions.allowBluetooth & + _as.AVAudioSessionCategoryOptions.allowAirPlay & + _as.AVAudioSessionCategoryOptions.defaultToSpeaker, + avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, + avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.longFormAudio, + avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + ); + + if (this == AudioRecommendationType.recordOnly) { + return playOnlyConfiguration.copyWith( + avAudioSessionCategory: _as.AVAudioSessionCategory.record, + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.allowBluetooth, + avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, + avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, + avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + ); + } else if (this == AudioRecommendationType.playAndRecord) { + return playOnlyConfiguration.copyWith( + avAudioSessionCategory: _as.AVAudioSessionCategory.playAndRecord, + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers & + _as.AVAudioSessionCategoryOptions.allowBluetooth & + _as.AVAudioSessionCategoryOptions.allowAirPlay & + _as.AVAudioSessionCategoryOptions.defaultToSpeaker, + avAudioSessionMode: _as.AVAudioSessionMode.voiceChat, + avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, + avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + ); + } + + return playOnlyConfiguration; + } } abstract class AudioManagerEvent implements LiveKitEvent {} @@ -18,16 +58,23 @@ class AudioManagerUpdatedRecommendationEvent with AudioManagerEvent { }); } +final x = AudioManager(); + class AudioManager { static AudioManager? _instance; - // Initial state is listen - AudioRecommendationType currentRecommendation = AudioRecommendationType.listenOnly; + bool automaticManagementEnabled = true; +// Initial state is listen + AudioRecommendationType currentRecommendation = AudioRecommendationType.playOnly; int _subscribeCounter = 0; int _publishCounter = 0; final events = EventsEmitter(); - AudioManager._(); + AudioManager._() { + (() async { + await _configureCurrentRecommendation(); + })(); + } // Singleton factory AudioManager() { @@ -39,44 +86,58 @@ class AudioManager { await events.dispose(); } - void incrementListen() { + Future incrementSubscriptionCounter() async { _subscribeCounter++; - _onUpdate(); + await _onUpdate(); } - void decrementListen() { + Future decrementSubscriptionCounter() async { if (_subscribeCounter <= 0) return; _subscribeCounter--; - _onUpdate(); + await _onUpdate(); } - void incrementPublish() { + Future incrementPublishCounter() async { _publishCounter++; - _onUpdate(); + await _onUpdate(); } - void decrementPublish() { + Future decrementPublishCounter() async { if (_publishCounter <= 0) return; _publishCounter--; - _onUpdate(); + await _onUpdate(); } AudioRecommendationType _calculateRecommendation() { if (_publishCounter > 0 && _subscribeCounter == 0) { - return AudioRecommendationType.publishOnly; + return AudioRecommendationType.recordOnly; } else if (_publishCounter > 0 && _subscribeCounter > 0) { - return AudioRecommendationType.listenAndPublish; + return AudioRecommendationType.playAndRecord; } // Default - return AudioRecommendationType.listenOnly; + return AudioRecommendationType.playOnly; } - void _onUpdate() { + Future _onUpdate() async { final newRecommendation = _calculateRecommendation(); if (currentRecommendation != newRecommendation) { currentRecommendation = newRecommendation; events.emit(AudioManagerUpdatedRecommendationEvent(type: currentRecommendation)); logger.fine('[$runtimeType] updated recommendation ${currentRecommendation}'); + if (automaticManagementEnabled) { + await _configureCurrentRecommendation(); + } + } + } + + Future _configureCurrentRecommendation() async { + logger.fine('[$runtimeType] configuring for ${currentRecommendation}...'); + try { + final _audioSession = await _as.AudioSession.instance; + await _audioSession.configure(currentRecommendation.configuration()); + await _audioSession.setActive(true); + } catch (error) { + logger.warning('[$runtimeType] Failed to configure ${error}'); } } } diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index 65d66c142..6eb8590db 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -48,7 +48,7 @@ class LocalParticipant extends Participant { throw TrackPublishException('track already exists'); } - AudioManager().incrementPublish(); + await AudioManager().incrementPublishCounter(); try { final trackInfo = await _engine.addTrack( @@ -74,7 +74,7 @@ class LocalParticipant extends Participant { return pub; } catch (e) { // In any case there was an exception, revert the count. - AudioManager().decrementPublish(); + await AudioManager().decrementPublishCounter(); rethrow; } } @@ -169,7 +169,7 @@ class LocalParticipant extends Participant { } if (track is AudioTrack) { - AudioManager().decrementPublish(); + await AudioManager().decrementPublishCounter(); } } } diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index 1ddd8ae30..577318200 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -91,7 +91,7 @@ class RemoteParticipant extends Participant { final Track track; if (pub.kind == lk_models.TrackType.AUDIO) { // audio track - AudioManager().incrementListen(); + await AudioManager().incrementSubscriptionCounter(); final audioTrack = AudioTrack(pub.name, mediaTrack, stream); audioTrack.start(); @@ -171,7 +171,7 @@ class RemoteParticipant extends Participant { )); if (track is AudioTrack) { - AudioManager().decrementListen(); + await AudioManager().decrementSubscriptionCounter(); } } diff --git a/lib/src/room.dart b/lib/src/room.dart index 59abc16ef..8366b3263 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -1,8 +1,6 @@ import 'dart:async'; import 'dart:collection'; -import 'package:flutter/foundation.dart'; - import 'classes/change_notifier.dart'; import 'constants.dart'; import 'errors.dart'; diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index bb2a27d89..8051d136a 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; -import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:http/http.dart' as http; From e76d6a5c9895d433da0b69447d11e5e93c598141 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 26 Sep 2021 03:41:13 +0900 Subject: [PATCH 05/50] `DisposeAware` disposing if already published causes exception. --- lib/src/events.dart | 3 +- lib/src/managers/audio.dart | 14 ++++----- lib/src/managers/event.dart | 9 ++++-- lib/src/participant/local_participant.dart | 14 ++++++--- lib/src/participant/participant.dart | 29 ++++++++++++------- lib/src/participant/remote_participant.dart | 16 ++++++---- lib/src/room.dart | 23 +++++++-------- lib/src/rtc_engine.dart | 4 ++- .../{classes => support}/change_notifier.dart | 23 ++++++++++----- lib/src/support/disposable.dart | 22 ++++++++++++++ lib/src/track/remote_track_publication.dart | 6 ++-- lib/src/track/track.dart | 4 +-- lib/src/track/track_publication.dart | 5 ++-- lib/src/track/video_track.dart | 1 + 14 files changed, 111 insertions(+), 62 deletions(-) rename lib/src/{classes => support}/change_notifier.dart (55%) create mode 100644 lib/src/support/disposable.dart diff --git a/lib/src/events.dart b/lib/src/events.dart index 34211970c..e9f934ab6 100644 --- a/lib/src/events.dart +++ b/lib/src/events.dart @@ -1,6 +1,4 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import 'package:livekit_client/livekit_client.dart'; -import 'package:meta/meta.dart'; import 'participant/participant.dart'; import 'participant/remote_participant.dart'; @@ -8,6 +6,7 @@ import 'proto/livekit_models.pb.dart' as lk_models; import 'proto/livekit_rtc.pb.dart' as lk_rtc; import 'track/remote_track_publication.dart'; import 'track/track.dart'; +import 'track/track_publication.dart'; import 'types.dart'; abstract class LiveKitEvent {} diff --git a/lib/src/managers/audio.dart b/lib/src/managers/audio.dart index 8c1ea5a4d..20ed01b20 100644 --- a/lib/src/managers/audio.dart +++ b/lib/src/managers/audio.dart @@ -1,7 +1,7 @@ -import 'package:livekit_client/src/logger.dart'; import 'package:audio_session/audio_session.dart' as _as; import '../events.dart'; +import '../logger.dart'; import 'event.dart'; enum AudioRecommendationType { @@ -58,8 +58,6 @@ class AudioManagerUpdatedRecommendationEvent with AudioManagerEvent { }); } -final x = AudioManager(); - class AudioManager { static AudioManager? _instance; bool automaticManagementEnabled = true; @@ -108,7 +106,7 @@ class AudioManager { await _onUpdate(); } - AudioRecommendationType _calculateRecommendation() { + AudioRecommendationType _computeRecommendation() { if (_publishCounter > 0 && _subscribeCounter == 0) { return AudioRecommendationType.recordOnly; } else if (_publishCounter > 0 && _subscribeCounter > 0) { @@ -119,7 +117,7 @@ class AudioManager { } Future _onUpdate() async { - final newRecommendation = _calculateRecommendation(); + final newRecommendation = _computeRecommendation(); if (currentRecommendation != newRecommendation) { currentRecommendation = newRecommendation; events.emit(AudioManagerUpdatedRecommendationEvent(type: currentRecommendation)); @@ -131,10 +129,12 @@ class AudioManager { } Future _configureCurrentRecommendation() async { - logger.fine('[$runtimeType] configuring for ${currentRecommendation}...'); + final config = currentRecommendation.configuration(); + logger.fine('[$runtimeType] configuring for ${currentRecommendation}, ' + '${config.avAudioSessionCategory}...'); try { final _audioSession = await _as.AudioSession.instance; - await _audioSession.configure(currentRecommendation.configuration()); + await _audioSession.configure(config); await _audioSession.setActive(true); } catch (error) { logger.warning('[$runtimeType] Failed to configure ${error}'); diff --git a/lib/src/managers/event.dart b/lib/src/managers/event.dart index 022a7159b..63e3d282b 100644 --- a/lib/src/managers/event.dart +++ b/lib/src/managers/event.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:synchronized/synchronized.dart' as sync; +import '../classes/disposable.dart'; import '../errors.dart'; import '../extensions.dart'; import '../logger.dart'; @@ -32,8 +33,9 @@ class EventsEmitter extends EventsListenable { @override @mustCallSuper Future dispose() async { - await streamCtrl.close(); + // mark as disposed await super.dispose(); + await streamCtrl.close(); } } @@ -51,7 +53,7 @@ class EventsListener extends EventsListenable { } // ensures all listeners will close on dispose -abstract class EventsListenable { +abstract class EventsListenable extends Disposable { // the emitter to listen to EventsEmitter get emitter; @@ -64,8 +66,11 @@ abstract class EventsListenable { required this.synchronized, }); + @override @mustCallSuper Future dispose() async { + // mark as disposed + super.dispose(); // Stop listening to all events logger.fine('${objectId} dispose() cancelling ${_listeners.length} event(s)'); for (final listener in _listeners) { diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index 6eb8590db..c4c8786ef 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -1,16 +1,17 @@ +import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import 'package:livekit_client/src/managers/audio.dart'; -import 'package:livekit_client/src/track/audio_track.dart'; import '../errors.dart'; import '../events.dart'; import '../extensions.dart'; import '../logger.dart'; +import '../managers/audio.dart'; import '../managers/event.dart'; import '../options.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../rtc_engine.dart'; +import '../track/audio_track.dart'; import '../track/local_audio_track.dart'; import '../track/local_track_publication.dart'; import '../track/local_video_track.dart'; @@ -152,9 +153,11 @@ class LocalParticipant extends Participant { @override Future unpublishTrack(String trackSid, {bool notify = false}) async { logger.finer('Unpublish track sid: $trackSid, notify: $notify'); - final pub = trackPublications.remove(trackSid); + final pub = trackPublications.firstWhereOrNull((e) => e.sid == trackSid); if (pub is! LocalTrackPublication) return; + trackPublications.remove(pub); + // final existing = tracks.values.where((element) => element.track == track); // if (existing.isEmpty) return; // final pub = existing.first; @@ -165,7 +168,10 @@ class LocalParticipant extends Participant { final sender = track.transceiver?.sender; if (sender != null) { await engine.publisher?.pc.removeTrack(sender); - await engine.negotiate(); + if (!isDisposed) { + // Doesn't make sense to negotiate when disposing + await engine.negotiate(); + } } if (track is AudioTrack) { diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index 32ed8be66..595a86043 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -21,9 +21,10 @@ import 'remote_participant.dart'; /// Base for [RemoteParticipant] and [LocalParticipant], /// can not be instantiated directly. -abstract class Participant extends LKChangeNotifier { +abstract class Participant extends DisposeAwareChangeNotifier { /// map of track sid => published track - final trackPublications = {}; + // @Deprecated('This should be a SET') + final trackPublications = {}; /// audio level between 0-1, 1 being the loudest double audioLevel = 0; @@ -68,7 +69,7 @@ abstract class Participant extends LKChangeNotifier { /// tracks that are subscribed to List get subscribedTracks => - trackPublications.values.where((e) => e.subscribed).toList(); + trackPublications.where((e) => e.subscribed).toList(); /// for internal use /// {@nodoc} @@ -91,8 +92,10 @@ abstract class Participant extends LKChangeNotifier { @mustCallSuper Future dispose() async { logger.fine('$objectId dispose()'); - await events.dispose(); + // This will mark object as disposed super.dispose(); + await unpublishAllTracks(); + await events.dispose(); } /// for internal use @@ -139,21 +142,25 @@ abstract class Participant extends LKChangeNotifier { @internal void addTrackPublication(TrackPublication pub) { pub.track?.sid = pub.sid; - trackPublications[pub.sid] = pub; + // + trackPublications.remove(pub); + trackPublications.add(pub); } // Must implement Future unpublishTrack(String trackSid, {bool notify = false}); - Future unpublishAllTracks() async { - final _ = List.from(trackPublications.values); - for (final track in _) { - await unpublishTrack(track.sid); + Future unpublishAllTracks({bool notify = false}) async { + final trackSids = trackPublications.map((e) => e.sid); + for (final trackid in trackSids) { + await unpublishTrack(trackid, notify: notify); } } + // // Equality operators // Object is considered equal when sid is equal + // @override int get hashCode => sid.hashCode; @@ -164,8 +171,8 @@ abstract class Participant extends LKChangeNotifier { // Convenience extension extension ParticipantExt on Participant { List get videoTracks => - trackPublications.values.where((e) => e.kind == lk_models.TrackType.VIDEO).toList(); + trackPublications.where((e) => e.kind == lk_models.TrackType.VIDEO).toList(); List get audioTracks => - trackPublications.values.where((e) => e.kind == lk_models.TrackType.AUDIO).toList(); + trackPublications.where((e) => e.kind == lk_models.TrackType.AUDIO).toList(); } diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index 577318200..3cb646d5d 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -1,11 +1,12 @@ +import 'package:collection/collection.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import 'package:livekit_client/src/managers/audio.dart'; import 'package:meta/meta.dart'; import '../constants.dart'; import '../events.dart'; import '../extensions.dart'; import '../logger.dart'; +import '../managers/audio.dart'; import '../managers/event.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../signal_client.dart'; @@ -46,8 +47,10 @@ class RemoteParticipant extends Participant { } RemoteTrackPublication? getTrackPublication(String sid) { - final pub = trackPublications[sid]; - if (pub is RemoteTrackPublication) return pub; + return trackPublications.firstWhereOrNull((element) => element.sid == sid) + as RemoteTrackPublication?; + // final pub = trackPublications[sid]; + // if (pub is RemoteTrackPublication) return pub; } /// for internal use @@ -146,8 +149,7 @@ class RemoteParticipant extends Participant { // unpublish any track that is not in the info final validSids = info.tracks.map((e) => e.sid); - final removeSids = - trackPublications.values.where((e) => !validSids.contains(e.sid)).map((e) => e.sid); + final removeSids = trackPublications.where((e) => !validSids.contains(e.sid)).map((e) => e.sid); for (final sid in removeSids) { await unpublishTrack(sid, notify: true); @@ -157,9 +159,11 @@ class RemoteParticipant extends Participant { @override Future unpublishTrack(String trackSid, {bool notify = false}) async { logger.finer('Unpublish track sid: $trackSid, notify: $notify'); - final pub = trackPublications.remove(trackSid); + final pub = trackPublications.firstWhereOrNull((e) => e.sid == trackSid); if (pub is! RemoteTrackPublication) return; + trackPublications.remove(pub); + final track = pub.track; // if has track if (track != null) { diff --git a/lib/src/room.dart b/lib/src/room.dart index 8366b3263..87cd6761b 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'dart:collection'; +import 'package:collection/collection.dart'; + import 'classes/change_notifier.dart'; import 'constants.dart'; import 'errors.dart'; @@ -17,7 +19,6 @@ import 'proto/livekit_rtc.pb.dart' as lk_rtc; import 'rtc_engine.dart'; import 'signal_client.dart'; import 'track/track.dart'; -import 'track/track_publication.dart'; import 'types.dart'; /// Room is the primary construct for LiveKit conferences. It contains a @@ -29,7 +30,7 @@ import 'types.dart'; /// * participant membership changes /// * active speakers are different /// {@category Room} -class Room extends LKChangeNotifier { +class Room extends DisposeAwareChangeNotifier { // Room is only instantiated if connected, so defaults to connected. ConnectionState _connectionState = ConnectionState.connected; @@ -96,6 +97,8 @@ class Room extends LKChangeNotifier { @override Future dispose() async { + // mark as disposed + super.dispose(); // dispose local participant await localParticipant.dispose(); // dispose Room's events emitter @@ -104,8 +107,6 @@ class Room extends LKChangeNotifier { await _engineListener.dispose(); // dispose the engine await engine.dispose(); - - super.dispose(); } static Future connect( @@ -179,7 +180,7 @@ class Room extends LKChangeNotifier { ..on((event) => _onSpeakerUpdateEvent(event.speakers)) ..on(_onDataMessageEvent) ..on((event) async { - final track = localParticipant.trackPublications[event.sid]; + final track = localParticipant.trackPublications.firstWhereOrNull((e) => e.sid == event.sid); track?.muted = event.muted; }) ..on((event) async { @@ -257,7 +258,6 @@ class Room extends LKChangeNotifier { // clean up RemoteParticipants for (final _ in _participants.values) { // RemoteParticipant is responsible for disposing resources - await _.unpublishAllTracks(); await _.dispose(); } _participants.clear(); @@ -279,7 +279,7 @@ class Room extends LKChangeNotifier { events.emit(const RoomDisconnectedEvent()); } - void _onParticipantUpdateEvent(List updates) async { + Future _onParticipantUpdateEvent(List updates) async { // trigger change notifier only if list of participants membership is changed var hasChanged = false; for (final info in updates) { @@ -290,7 +290,7 @@ class Room extends LKChangeNotifier { if (info.state == lk_models.ParticipantInfo_State.DISCONNECTED) { hasChanged = true; - _handleParticipantDisconnect(info.sid); + await _handleParticipantDisconnect(info.sid); continue; } @@ -368,16 +368,13 @@ class Room extends LKChangeNotifier { events.emit(event); } - void _handleParticipantDisconnect(String sid) { + Future _handleParticipantDisconnect(String sid) async { final participant = _participants.remove(sid); if (participant == null) { return; } - final toRemove = List.from(participant.trackPublications.values); - for (final track in toRemove) { - participant.unpublishTrack(track.sid, notify: true); - } + await participant.unpublishAllTracks(notify: true); events.emit(ParticipantDisconnectedEvent(participant: participant)); } diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 7626c9d80..207af8770 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'classes/disposable.dart'; import 'constants.dart'; import 'errors.dart'; @@ -18,7 +19,7 @@ import 'signal_client.dart'; import 'transport.dart'; import 'types.dart'; -class RTCEngine { +class RTCEngine extends Disposable { static const _lossyDCLabel = '_lossy'; static const _reliableDCLabel = '_reliable'; static const _maxReconnectAttempts = 5; @@ -76,6 +77,7 @@ class RTCEngine { } Future dispose() async { + super.dispose(); await events.dispose(); await _signalListener.dispose(); } diff --git a/lib/src/classes/change_notifier.dart b/lib/src/support/change_notifier.dart similarity index 55% rename from lib/src/classes/change_notifier.dart rename to lib/src/support/change_notifier.dart index b8b4f5396..f0af9c029 100644 --- a/lib/src/classes/change_notifier.dart +++ b/lib/src/support/change_notifier.dart @@ -1,20 +1,27 @@ -import 'package:flutter/material.dart'; -import 'package:livekit_client/src/logger.dart'; +import 'package:flutter/foundation.dart'; + +import '../logger.dart'; +import 'disposable.dart'; // dispose safe change notifier -abstract class LKChangeNotifier extends ChangeNotifier { - bool _disposed = false; - bool get isDisposed => _disposed; +abstract class DisposeAwareChangeNotifier extends ChangeNotifier implements DisposeAware { + // + bool _isDisposed = false; + + @override + bool get isDisposed => _isDisposed; + // must implement @override + @mustCallSuper void dispose() { - _disposed = true; + _isDisposed = true; super.dispose(); } @override void addListener(VoidCallback listener) { - if (_disposed) { + if (_isDisposed) { logger.warning('calling addListener on a disposed ChangeNotifier'); return; } @@ -23,7 +30,7 @@ abstract class LKChangeNotifier extends ChangeNotifier { @override void removeListener(VoidCallback listener) { - if (_disposed) { + if (_isDisposed) { logger.warning('calling removeListener on a disposed ChangeNotifier'); return; } diff --git a/lib/src/support/disposable.dart b/lib/src/support/disposable.dart new file mode 100644 index 000000000..3805c27c4 --- /dev/null +++ b/lib/src/support/disposable.dart @@ -0,0 +1,22 @@ +import 'package:meta/meta.dart'; + +abstract class DisposeAware { + // Should be true when is disposing or already disposed + bool get isDisposed; + @mustCallSuper + void dispose(); +} + +abstract class Disposable extends DisposeAware { + // + bool _isDisposed = false; + + @override + bool get isDisposed => _isDisposed; + + @override + @mustCallSuper + void dispose() { + _isDisposed = true; + } +} diff --git a/lib/src/track/remote_track_publication.dart b/lib/src/track/remote_track_publication.dart index bd0792e50..fef7ba69f 100644 --- a/lib/src/track/remote_track_publication.dart +++ b/lib/src/track/remote_track_publication.dart @@ -1,11 +1,9 @@ -import 'package:livekit_client/livekit_client.dart'; - +import '../events.dart'; +import '../extensions.dart'; import '../participant/remote_participant.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../proto/livekit_rtc.pb.dart' as lk_rtc; import 'track.dart'; -import '../extensions.dart'; - import 'track_publication.dart'; /// Represents a track publication from a RemoteParticipant. Provides methods to diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index af7ea5b30..b198b2274 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -1,13 +1,13 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import 'package:livekit_client/src/classes/change_notifier.dart'; import 'package:uuid/uuid.dart'; import '../proto/livekit_models.pb.dart' as lk_models; +import '../support/change_notifier.dart'; /// Wrapper around a MediaStreamTrack with additional metadata. /// Base for [AudioTrack] and [VideoTrack], /// can not be instantiated directly. -abstract class Track extends LKChangeNotifier { +abstract class Track extends DisposeAwareChangeNotifier { static const cameraName = 'camera'; static const screenShareName = 'screen'; diff --git a/lib/src/track/track_publication.dart b/lib/src/track/track_publication.dart index 4b518381d..44af1ad05 100644 --- a/lib/src/track/track_publication.dart +++ b/lib/src/track/track_publication.dart @@ -1,3 +1,4 @@ +import '../classes/disposable.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../types.dart'; import 'track.dart'; @@ -8,9 +9,9 @@ import 'track.dart'; /// Base for [RemoteTrackPublication] and [LocalTrackPublication], /// can not be instantiated directly. -abstract class TrackPublication { - final String name; +abstract class TrackPublication extends Disposable { final String sid; + final String name; final lk_models.TrackType kind; Track? track; diff --git a/lib/src/track/video_track.dart b/lib/src/track/video_track.dart index 5da706bfe..b6fa485b2 100644 --- a/lib/src/track/video_track.dart +++ b/lib/src/track/video_track.dart @@ -5,6 +5,7 @@ import 'track.dart'; /// A video track will notify when its mediaTrack has changed. class VideoTrack extends Track { + // rtc.MediaStream _mediaStream; VideoTrack( From d9cf06d946fbc2e2b875ac24d22d97c9a1466ec5 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 26 Sep 2021 04:05:23 +0900 Subject: [PATCH 06/50] organize --- lib/livekit_client.dart | 2 +- lib/src/{errors.dart => exceptions.dart} | 3 --- lib/src/managers/event.dart | 4 ++-- lib/src/participant/participant.dart | 3 +-- lib/src/room.dart | 4 ++-- lib/src/rtc_engine.dart | 4 ++-- lib/src/signal_client.dart | 8 ++++---- lib/src/support/change_notifier.dart | 1 + lib/src/support/disposable.dart | 2 ++ lib/src/{ws/platform => support/platforms}/io.dart | 8 ++++---- lib/src/{ws/platform => support/platforms}/web.dart | 8 ++++---- lib/src/{ws/interface.dart => support/websocket.dart} | 8 ++++---- lib/src/track/local_audio_track.dart | 2 +- lib/src/track/local_video_track.dart | 2 +- lib/src/track/track_publication.dart | 2 +- 15 files changed, 30 insertions(+), 31 deletions(-) rename lib/src/{errors.dart => exceptions.dart} (99%) rename lib/src/{ws/platform => support/platforms}/io.dart (89%) rename lib/src/{ws/platform => support/platforms}/web.dart (90%) rename lib/src/{ws/interface.dart => support/websocket.dart} (84%) diff --git a/lib/livekit_client.dart b/lib/livekit_client.dart index 7c53d2bc9..3f51f7bd5 100644 --- a/lib/livekit_client.dart +++ b/lib/livekit_client.dart @@ -1,7 +1,7 @@ /// Flutter Client SDK to LiveKit. library livekit_client; -export 'src/errors.dart'; +export 'src/exceptions.dart'; export 'src/events.dart'; export 'src/livekit.dart'; export 'src/managers/event.dart'; diff --git a/lib/src/errors.dart b/lib/src/exceptions.dart similarity index 99% rename from lib/src/errors.dart rename to lib/src/exceptions.dart index 382ac9ce6..ac312fb28 100644 --- a/lib/src/errors.dart +++ b/lib/src/exceptions.dart @@ -1,6 +1,3 @@ -// -// -// class LiveKitException implements Exception { final String message; const LiveKitException._(this.message); diff --git a/lib/src/managers/event.dart b/lib/src/managers/event.dart index 63e3d282b..fe25e58eb 100644 --- a/lib/src/managers/event.dart +++ b/lib/src/managers/event.dart @@ -3,8 +3,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:synchronized/synchronized.dart' as sync; -import '../classes/disposable.dart'; -import '../errors.dart'; +import '../support/disposable.dart'; +import '../exceptions.dart'; import '../extensions.dart'; import '../logger.dart'; import '../types.dart'; diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index 595a86043..aff02f65b 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -2,7 +2,7 @@ import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:meta/meta.dart'; -import '../classes/change_notifier.dart'; +import '../support/change_notifier.dart'; import '../events.dart'; import '../extensions.dart'; import '../logger.dart'; @@ -91,7 +91,6 @@ abstract class Participant extends DisposeAwareChangeNotifier { @override @mustCallSuper Future dispose() async { - logger.fine('$objectId dispose()'); // This will mark object as disposed super.dispose(); await unpublishAllTracks(); diff --git a/lib/src/room.dart b/lib/src/room.dart index 87cd6761b..b9ec55e5c 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -3,9 +3,9 @@ import 'dart:collection'; import 'package:collection/collection.dart'; -import 'classes/change_notifier.dart'; +import 'support/change_notifier.dart'; import 'constants.dart'; -import 'errors.dart'; +import 'exceptions.dart'; import 'events.dart'; import 'extensions.dart'; import 'logger.dart'; diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 207af8770..2bf396a82 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -3,10 +3,10 @@ import 'dart:async'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import 'classes/disposable.dart'; +import 'support/disposable.dart'; import 'constants.dart'; -import 'errors.dart'; +import 'exceptions.dart'; import 'events.dart'; import 'extensions.dart'; import 'logger.dart'; diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index 8051d136a..5748e21e4 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -4,7 +4,7 @@ import 'dart:convert'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:http/http.dart' as http; -import 'errors.dart'; +import 'exceptions.dart'; import 'events.dart'; import 'extensions.dart'; import 'logger.dart'; @@ -14,7 +14,7 @@ import 'proto/livekit_models.pb.dart' as lk_models; import 'proto/livekit_rtc.pb.dart' as lk_rtc; import 'types.dart'; import 'utils.dart'; -import 'ws/interface.dart'; +import 'support/websocket.dart'; class SignalClient { final events = EventsEmitter(); @@ -51,7 +51,7 @@ class SignalClient { try { _ws = await LiveKitWebSocket.connect( rtcUri, - WebSocketOptions( + WebSocketEventHandlers( onData: _onSocketData, onDispose: _onSocketDone, onError: _handleError, @@ -99,7 +99,7 @@ class SignalClient { _ws = await LiveKitWebSocket.connect( rtcUri, - WebSocketOptions( + WebSocketEventHandlers( onData: _onSocketData, onDispose: _onSocketDone, onError: _handleError, diff --git a/lib/src/support/change_notifier.dart b/lib/src/support/change_notifier.dart index f0af9c029..3de0865db 100644 --- a/lib/src/support/change_notifier.dart +++ b/lib/src/support/change_notifier.dart @@ -15,6 +15,7 @@ abstract class DisposeAwareChangeNotifier extends ChangeNotifier implements Disp @override @mustCallSuper void dispose() { + logger.fine('${runtimeType}.dispose()'); _isDisposed = true; super.dispose(); } diff --git a/lib/src/support/disposable.dart b/lib/src/support/disposable.dart index 3805c27c4..c1e6e6b54 100644 --- a/lib/src/support/disposable.dart +++ b/lib/src/support/disposable.dart @@ -1,3 +1,4 @@ +import 'package:livekit_client/src/logger.dart'; import 'package:meta/meta.dart'; abstract class DisposeAware { @@ -17,6 +18,7 @@ abstract class Disposable extends DisposeAware { @override @mustCallSuper void dispose() { + logger.fine('${runtimeType}.dispose()'); _isDisposed = true; } } diff --git a/lib/src/ws/platform/io.dart b/lib/src/support/platforms/io.dart similarity index 89% rename from lib/src/ws/platform/io.dart rename to lib/src/support/platforms/io.dart index 417569e4c..e2bbb1fac 100644 --- a/lib/src/ws/platform/io.dart +++ b/lib/src/support/platforms/io.dart @@ -2,17 +2,17 @@ import 'dart:async'; import 'dart:io' as io; import '../../logger.dart'; -import '../interface.dart'; +import '../websocket.dart'; Future lkWebSocketConnect( Uri uri, [ - WebSocketOptions? options, + WebSocketEventHandlers? options, ]) => LiveKitWebSocketIO.connect(uri, options); class LiveKitWebSocketIO implements LiveKitWebSocket { final io.WebSocket _ws; - final WebSocketOptions? options; + final WebSocketEventHandlers? options; late final StreamSubscription _subscription; LiveKitWebSocketIO._( @@ -49,7 +49,7 @@ class LiveKitWebSocketIO implements LiveKitWebSocket { static Future connect( Uri uri, [ - WebSocketOptions? options, + WebSocketEventHandlers? options, ]) async { logger.fine('WebSocketIO connect (uri: ${uri.toString()})'); try { diff --git a/lib/src/ws/platform/web.dart b/lib/src/support/platforms/web.dart similarity index 90% rename from lib/src/ws/platform/web.dart rename to lib/src/support/platforms/web.dart index b1da3d7ef..b6e838222 100644 --- a/lib/src/ws/platform/web.dart +++ b/lib/src/support/platforms/web.dart @@ -4,17 +4,17 @@ import 'dart:async'; import 'dart:html' as html; import 'dart:typed_data'; -import '../interface.dart'; +import '../websocket.dart'; Future lkWebSocketConnect( Uri uri, [ - WebSocketOptions? options, + WebSocketEventHandlers? options, ]) => LiveKitWebSocketWeb.connect(uri, options); class LiveKitWebSocketWeb implements LiveKitWebSocket { final html.WebSocket _ws; - final WebSocketOptions? options; + final WebSocketEventHandlers? options; late final StreamSubscription _messageSubscription; late final StreamSubscription _closeSubscription; @@ -43,7 +43,7 @@ class LiveKitWebSocketWeb implements LiveKitWebSocket { static Future connect( Uri uri, [ - WebSocketOptions? options, + WebSocketEventHandlers? options, ]) async { final completer = Completer(); final ws = html.WebSocket(uri.toString()); diff --git a/lib/src/ws/interface.dart b/lib/src/support/websocket.dart similarity index 84% rename from lib/src/ws/interface.dart rename to lib/src/support/websocket.dart index f82edf8c4..28955cd91 100644 --- a/lib/src/ws/interface.dart +++ b/lib/src/support/websocket.dart @@ -1,4 +1,4 @@ -import 'platform/io.dart' if (dart.library.html) 'platform/web.dart'; +import 'platforms/io.dart' if (dart.library.html) 'platforms/web.dart'; class WebSocketException implements Exception { final int code; @@ -18,11 +18,11 @@ typedef WebSocketOnData = Function(dynamic data); typedef WebSocketOnError = Function(dynamic error); typedef WebSocketOnDispose = Function(); -class WebSocketOptions { +class WebSocketEventHandlers { final WebSocketOnData? onData; final WebSocketOnError? onError; final WebSocketOnDispose? onDispose; - const WebSocketOptions({ + const WebSocketEventHandlers({ this.onData, this.onError, this.onDispose, @@ -35,7 +35,7 @@ abstract class LiveKitWebSocket { static Future connect( Uri uri, [ - WebSocketOptions? options, + WebSocketEventHandlers? options, ]) => lkWebSocketConnect(uri, options); } diff --git a/lib/src/track/local_audio_track.dart b/lib/src/track/local_audio_track.dart index 830090c47..2fa602fb2 100644 --- a/lib/src/track/local_audio_track.dart +++ b/lib/src/track/local_audio_track.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import '../errors.dart'; +import '../exceptions.dart'; import 'audio_track.dart'; import 'options.dart'; diff --git a/lib/src/track/local_video_track.dart b/lib/src/track/local_video_track.dart index ae8e10609..c7197f69d 100644 --- a/lib/src/track/local_video_track.dart +++ b/lib/src/track/local_video_track.dart @@ -1,6 +1,6 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import '../errors.dart'; +import '../exceptions.dart'; import '../logger.dart'; import 'options.dart'; import 'track.dart'; diff --git a/lib/src/track/track_publication.dart b/lib/src/track/track_publication.dart index 44af1ad05..a476aad31 100644 --- a/lib/src/track/track_publication.dart +++ b/lib/src/track/track_publication.dart @@ -1,4 +1,4 @@ -import '../classes/disposable.dart'; +import '../support/disposable.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../types.dart'; import 'track.dart'; From aa659067f784597b0494a2eae805c0a4fc55a21a Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 26 Sep 2021 14:19:24 +0900 Subject: [PATCH 07/50] guard flutter_webrtc calls --- lib/src/participant/local_participant.dart | 40 +++++++------- lib/src/room.dart | 12 ++--- lib/src/rtc_engine.dart | 62 ++++++++++++---------- lib/src/signal_client.dart | 15 +++--- lib/src/support/change_notifier.dart | 3 +- lib/src/support/disposable.dart | 4 +- lib/src/track/track.dart | 8 ++- lib/src/transport.dart | 28 ++++++++-- 8 files changed, 107 insertions(+), 65 deletions(-) diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index c4c8786ef..50aeb2122 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -1,8 +1,9 @@ import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; +import 'package:meta/meta.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import '../errors.dart'; +import '../exceptions.dart'; import '../events.dart'; import '../extensions.dart'; import '../logger.dart'; @@ -22,16 +23,17 @@ import 'participant.dart'; /// Represents the current participant in the room. class LocalParticipant extends Participant { - final RTCEngine _engine; + @internal + final RTCEngine engine; + @internal final TrackPublishOptions? defaultPublishOptions; LocalParticipant({ - required RTCEngine engine, + required this.engine, required lk_models.ParticipantInfo info, this.defaultPublishOptions, required EventsEmitter roomEvents, - }) : _engine = engine, - super( + }) : super( info.sid, info.identity, roomEvents: roomEvents, @@ -39,10 +41,6 @@ class LocalParticipant extends Participant { updateFromInfo(info); } - /// for internal use - /// {@nodoc} - RTCEngine get engine => _engine; - /// publish an audio track to the room Future publishAudioTrack(LocalAudioTrack track) async { if (audioTracks.any((e) => e.track?.mediaStreamTrack.id == track.mediaStreamTrack.id)) { @@ -52,7 +50,7 @@ class LocalParticipant extends Participant { await AudioManager().incrementPublishCounter(); try { - final trackInfo = await _engine.addTrack( + final trackInfo = await engine.addTrack( cid: track.getCid(), name: track.name, kind: track.kind, @@ -62,12 +60,12 @@ class LocalParticipant extends Participant { direction: rtc.TransceiverDirection.SendOnly, ); // addTransceiver cannot pass in a kind parameter due to a bug in flutter-webrtc (web) - track.transceiver = await _engine.publisher?.pc.addTransceiver( + track.transceiver = await engine.publisher?.pc.addTransceiver( track: track.mediaStreamTrack, kind: rtc.RTCRtpMediaType.RTCRtpMediaTypeAudio, init: transceiverInit, ); - await _engine.negotiate(); + await engine.negotiate(); final pub = LocalTrackPublication(trackInfo, track, this); addTrackPublication(pub); @@ -92,7 +90,7 @@ class LocalParticipant extends Participant { // Use default options from `ConnectOptions` if options is null options = options ?? defaultPublishOptions; - final trackInfo = await _engine.addTrack( + final trackInfo = await engine.addTrack( cid: track.getCid(), name: track.name, kind: track.kind, @@ -133,14 +131,14 @@ class LocalParticipant extends Participant { streams: [track.mediaStream], ); - logger.fine('publishVideoTrack publisher: ${_engine.publisher}'); + logger.fine('publishVideoTrack publisher: ${engine.publisher}'); - track.transceiver = await _engine.publisher?.pc.addTransceiver( + track.transceiver = await engine.publisher?.pc.addTransceiver( track: track.mediaStreamTrack, kind: rtc.RTCRtpMediaType.RTCRtpMediaTypeVideo, init: transceiverInit, ); - await _engine.negotiate(); + await engine.negotiate(); final pub = LocalTrackPublication(trackInfo, track, this); addTrackPublication(pub); @@ -167,9 +165,15 @@ class LocalParticipant extends Participant { final sender = track.transceiver?.sender; if (sender != null) { - await engine.publisher?.pc.removeTrack(sender); + try { + await engine.publisher?.pc.removeTrack(sender); + } catch (_) { + logger.warning('[$objectId] rtc.removeTrack() did throw ${_}'); + } + + // doesn't make sense to negotiate if already disposed if (!isDisposed) { - // Doesn't make sense to negotiate when disposing + // manual negotiation since track changed await engine.negotiate(); } } diff --git a/lib/src/room.dart b/lib/src/room.dart index b9ec55e5c..53e86a190 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -47,10 +47,10 @@ class Room extends DisposeAwareChangeNotifier { late final LocalParticipant localParticipant; /// name of the room - late final String name; + final String name; /// sid of the room - late final String sid; + final String sid; List _activeSpeakers = []; @@ -70,7 +70,8 @@ class Room extends DisposeAwareChangeNotifier { required this.engine, required lk_rtc.JoinResponse joinResponse, ConnectOptions? connectOptions, - }) { + }) : sid = joinResponse.room.sid, + name = joinResponse.room.name { // _setUpListeners(); @@ -81,9 +82,6 @@ class Room extends DisposeAwareChangeNotifier { roomEvents: events, ); - sid = joinResponse.room.sid; - name = joinResponse.room.name; - for (final info in joinResponse.otherParticipants) { _getOrCreateRemoteParticipant(info.sid, info); } @@ -168,12 +166,10 @@ class Room extends DisposeAwareChangeNotifier { ..on((event) async { _connectionState = ConnectionState.connected; events.emit(const RoomReconnectedEvent()); - notifyListeners(); }) ..on((event) async { _connectionState = ConnectionState.reconnecting; events.emit(const RoomReconnectingEvent()); - notifyListeners(); }) ..on((event) => _onDisconnectedEvent()) ..on((event) => _onParticipantUpdateEvent(event.participants)) diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 2bf396a82..4ebc69bcf 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -76,6 +76,7 @@ class RTCEngine extends Disposable { // _statsTimer = Timer.periodic(const Duration(seconds: 1), _onStatTimer); } + @override Future dispose() async { super.dispose(); await events.dispose(); @@ -122,10 +123,6 @@ class RTCEngine extends Disposable { // _statsTimer.cancel(); - // cancel events - await _primaryIceStateListener?.call(); - _primaryIceStateListener = null; - // cancel all ongoing delays await delays.dispose(); @@ -136,7 +133,7 @@ class RTCEngine extends Disposable { await subscriber?.dispose(); subscriber = null; - signalClient.close(); + signalClient.dispose(); } Future addTrack({ @@ -190,7 +187,7 @@ class RTCEngine extends Disposable { } if (publisher?.pc.iceConnectionState?.isConnected() == true) { - logger.warning('publisher is already connected'); + logger.warning('[$objectId] publisher is already connected'); return; } @@ -315,7 +312,7 @@ class RTCEngine extends Disposable { )); }; - _primaryIceStateListener ??= events.on((event) { + events.on((event) { // only listen to primary ice events if (!event.isPrimary) return; @@ -352,21 +349,27 @@ class RTCEngine extends Disposable { )); }; - // data channels - final lossyInit = rtc.RTCDataChannelInit() - ..binaryType = 'binary' - ..ordered = true - ..maxRetransmits = 0; - lossyDC = await publisher?.pc.createDataChannel(_lossyDCLabel, lossyInit); - - final reliableInit = rtc.RTCDataChannelInit() - ..binaryType = 'binary' - ..ordered = true; - reliableDC = await publisher?.pc.createDataChannel(_reliableDCLabel, reliableInit); - // also handle messages over the pub channel, for backwards compatibility - lossyDC?.onMessage = _onDCMessage; - reliableDC?.onMessage = _onDCMessage; + try { + final lossyInit = rtc.RTCDataChannelInit() + ..binaryType = 'binary' + ..ordered = true + ..maxRetransmits = 0; + lossyDC = await publisher?.pc.createDataChannel(_lossyDCLabel, lossyInit); + lossyDC!.onMessage = _onDCMessage; + } catch (_) { + logger.severe('[$objectId] createDataChannel() did throw $_'); + } + + try { + final reliableInit = rtc.RTCDataChannelInit() + ..binaryType = 'binary' + ..ordered = true; + reliableDC = await publisher?.pc.createDataChannel(_reliableDCLabel, reliableInit); + reliableDC!.onMessage = _onDCMessage; + } catch (_) { + logger.severe('[$objectId] createDataChannel() did throw $_'); + } } void _onDataChannel(rtc.RTCDataChannel dc) { @@ -462,19 +465,24 @@ class RTCEngine extends Disposable { }) ..on((event) async { if (subscriber == null) { + logger.warning('[$objectId] subscriber is null'); return; } - logger.fine('received server offer(type: ${event.sd.type}, ' + logger.fine('[$objectId] Received server offer(type: ${event.sd.type}, ' '${subscriber!.pc.signalingState})'); await subscriber!.setRemoteDescription(event.sd); - final answer = await subscriber!.pc.createAnswer(); - logger.fine('Created answer'); - logger.finer('sdp: ${answer.sdp}'); - await subscriber!.pc.setLocalDescription(answer); - signalClient.sendAnswer(answer); + try { + final answer = await subscriber!.pc.createAnswer(); + logger.fine('Created answer'); + logger.finer('sdp: ${answer.sdp}'); + await subscriber!.pc.setLocalDescription(answer); + signalClient.sendAnswer(answer); + } catch (_) { + logger.severe('[$objectId] Failed to createAnswer()'); + } }) ..on((event) async { if (publisher == null) { diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index 5748e21e4..cef17047b 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -4,19 +4,20 @@ import 'dart:convert'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:http/http.dart' as http; -import 'exceptions.dart'; import 'events.dart'; +import 'exceptions.dart'; import 'extensions.dart'; import 'logger.dart'; import 'managers/event.dart'; import 'options.dart'; import 'proto/livekit_models.pb.dart' as lk_models; import 'proto/livekit_rtc.pb.dart' as lk_rtc; +import 'support/disposable.dart'; +import 'support/websocket.dart'; import 'types.dart'; import 'utils.dart'; -import 'support/websocket.dart'; -class SignalClient { +class SignalClient extends Disposable { final events = EventsEmitter(); final ProtocolVersion protocol; @@ -109,7 +110,9 @@ class SignalClient { _connected = true; } - void close() { + @override + void dispose() { + super.dispose(); _connected = false; _ws?.dispose(); } @@ -181,8 +184,8 @@ class SignalClient { )); void _sendRequest(lk_rtc.SignalRequest req) { - if (_ws == null) { - logger.warning('could not send message, not connected'); + if (_ws == null || isDisposed) { + logger.warning('[$objectId] Could not send message, not connected or already disposed'); return; } diff --git a/lib/src/support/change_notifier.dart b/lib/src/support/change_notifier.dart index 3de0865db..540650026 100644 --- a/lib/src/support/change_notifier.dart +++ b/lib/src/support/change_notifier.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import '../logger.dart'; +import '../extensions.dart'; import 'disposable.dart'; // dispose safe change notifier @@ -15,7 +16,7 @@ abstract class DisposeAwareChangeNotifier extends ChangeNotifier implements Disp @override @mustCallSuper void dispose() { - logger.fine('${runtimeType}.dispose()'); + logger.fine('[${objectId}] dispose()'); _isDisposed = true; super.dispose(); } diff --git a/lib/src/support/disposable.dart b/lib/src/support/disposable.dart index c1e6e6b54..d457f4aca 100644 --- a/lib/src/support/disposable.dart +++ b/lib/src/support/disposable.dart @@ -1,6 +1,8 @@ import 'package:livekit_client/src/logger.dart'; import 'package:meta/meta.dart'; +import '../extensions.dart'; + abstract class DisposeAware { // Should be true when is disposing or already disposed bool get isDisposed; @@ -18,7 +20,7 @@ abstract class Disposable extends DisposeAware { @override @mustCallSuper void dispose() { - logger.fine('${runtimeType}.dispose()'); + logger.fine('[${objectId}] dispose()'); _isDisposed = true; } } diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index b198b2274..8aa5b6a06 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -1,6 +1,8 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:uuid/uuid.dart'; +import '../extensions.dart'; +import '../logger.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../support/change_notifier.dart'; @@ -51,6 +53,10 @@ abstract class Track extends DisposeAwareChangeNotifier { } Future stop() async { - await mediaStreamTrack.stop(); + try { + await mediaStreamTrack.stop(); + } catch (_) { + logger.warning('[$objectId] rtc.mediaStreamTrack.stop() did throw ${_}'); + } } } diff --git a/lib/src/transport.dart b/lib/src/transport.dart index e31f79d52..214c901c6 100644 --- a/lib/src/transport.dart +++ b/lib/src/transport.dart @@ -5,13 +5,14 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'constants.dart'; import 'extensions.dart'; import 'logger.dart'; +import 'support/disposable.dart'; import 'types.dart'; import 'utils.dart'; typedef PCTransportOnOffer = void Function(rtc.RTCSessionDescription offer); /// a wrapper around PeerConnection -class PCTransport { +class PCTransport extends Disposable { final rtc.RTCPeerConnection pc; final List _pendingCandidates = []; bool restartingIce = false; @@ -24,7 +25,7 @@ class PCTransport { static Future create([RTCConfiguration? rtcConfig]) async { rtcConfig ??= const RTCConfiguration(); - logger.fine('PCTransport creating ${rtcConfig.toMap()}'); + logger.fine('[PCTransport] creating ${rtcConfig.toMap()}'); final _ = await rtc.createPeerConnection(rtcConfig.toMap()); return PCTransport._(_); } @@ -35,8 +36,9 @@ class PCTransport { wait: Timeouts.debounce, ); + @override Future dispose() async { - logger.fine('${objectId} dispose()'); + super.dispose(); // Ensure debounce won't fire _cancelDebounce?.call(); _cancelDebounce = null; @@ -68,6 +70,11 @@ class PCTransport { } Future setRemoteDescription(rtc.RTCSessionDescription sd) async { + if (isDisposed) { + logger.warning('[$objectId] setRemoteDescription() already disposed'); + return; + } + await pc.setRemoteDescription(sd); for (final candidate in _pendingCandidates) { @@ -84,6 +91,11 @@ class PCTransport { } Future createAndSendOffer([RTCOfferOptions? options]) async { + if (isDisposed) { + logger.warning('[$objectId] createAndSendOffer() already disposed'); + return; + } + if (onOffer == null) { logger.warning('onOffer is null'); return; @@ -116,6 +128,11 @@ class PCTransport { } Future addIceCandidate(rtc.RTCIceCandidate candidate) async { + if (isDisposed) { + logger.warning('[$objectId] addIceCandidate() already disposed'); + return; + } + final desc = await getRemoteDescription(); if (desc != null && !restartingIce) { @@ -127,6 +144,11 @@ class PCTransport { } Future getRemoteDescription() async { + if (isDisposed) { + logger.warning('[$objectId] getRemoteDescription() already disposed'); + return null; + } + // Checking agains null doesn't work as intended // if (pc.iceConnectionState == null) return null; From 04e5721b01acc9c070aefc31ac90d9ebd5af14e1 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 26 Sep 2021 14:31:15 +0900 Subject: [PATCH 08/50] websocket async fix --- lib/src/support/platforms/io.dart | 33 +++++++++++++++--------------- lib/src/support/platforms/web.dart | 6 +++--- lib/src/support/websocket.dart | 2 +- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/lib/src/support/platforms/io.dart b/lib/src/support/platforms/io.dart index e2bbb1fac..7d6e7c946 100644 --- a/lib/src/support/platforms/io.dart +++ b/lib/src/support/platforms/io.dart @@ -3,6 +3,7 @@ import 'dart:io' as io; import '../../logger.dart'; import '../websocket.dart'; +import '../../extensions.dart'; Future lkWebSocketConnect( Uri uri, [ @@ -26,24 +27,24 @@ class LiveKitWebSocketIO implements LiveKitWebSocket { } @override - void dispose() { + Future dispose() async { + await _subscription.cancel(); + await _ws.close(); options?.onDispose?.call(); - _subscription.cancel(); - _ws.close(); } @override void send(List data) { - // 0 CONNECTING - // 1 OPEN - // 2 CLOSING - // 3 CLOSED - if (_ws.readyState == 1) { - try { - _ws.add(data); - } catch (e) { - // - } + // 0 CONNECTING, 1 OPEN, 2 CLOSING, 3 CLOSED + if (_ws.readyState != 1) { + logger.fine('[$objectId] Tried to send data (readyState: ${_ws.readyState})'); + return; + } + + try { + _ws.add(data); + } catch (_) { + logger.fine('[$objectId] send did throw ${_}'); } } @@ -51,13 +52,13 @@ class LiveKitWebSocketIO implements LiveKitWebSocket { Uri uri, [ WebSocketEventHandlers? options, ]) async { - logger.fine('WebSocketIO connect (uri: ${uri.toString()})'); + logger.fine('[WebSocketIO] Connecting(uri: ${uri.toString()})...'); try { final ws = await io.WebSocket.connect(uri.toString()); - logger.fine('WebSocketIO connected'); + logger.fine('[WebSocketIO] Connected'); return LiveKitWebSocketIO._(ws, options); } catch (_) { - logger.severe('WebSocketIO error ${_}'); + logger.severe('[WebSocketIO] did throw ${_}'); throw WebSocketException.connect(); } } diff --git a/lib/src/support/platforms/web.dart b/lib/src/support/platforms/web.dart index b6e838222..953c8e764 100644 --- a/lib/src/support/platforms/web.dart +++ b/lib/src/support/platforms/web.dart @@ -34,10 +34,10 @@ class LiveKitWebSocketWeb implements LiveKitWebSocket { void send(List data) => _ws.send(data); @override - void dispose() { + Future dispose() async { options?.onDispose?.call(); - _messageSubscription.cancel(); - _closeSubscription.cancel(); + await _messageSubscription.cancel(); + await _closeSubscription.cancel(); _ws.close(); } diff --git a/lib/src/support/websocket.dart b/lib/src/support/websocket.dart index 28955cd91..8021abf42 100644 --- a/lib/src/support/websocket.dart +++ b/lib/src/support/websocket.dart @@ -31,7 +31,7 @@ class WebSocketEventHandlers { abstract class LiveKitWebSocket { void send(List data); - void dispose(); + Future dispose(); static Future connect( Uri uri, [ From df9ea1cdfed74ac91d2dcbe90c3ec85ec667bfc9 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 26 Sep 2021 16:05:23 +0900 Subject: [PATCH 09/50] use `ConnectionState` instead of `_isClosed` and `isReconnecting` --- lib/src/managers/delay.dart | 10 ++- lib/src/room.dart | 14 ++-- lib/src/rtc_engine.dart | 135 ++++++++++++++++++++---------------- lib/src/signal_client.dart | 8 ++- 4 files changed, 97 insertions(+), 70 deletions(-) diff --git a/lib/src/managers/delay.dart b/lib/src/managers/delay.dart index 8fe30cecc..78b7d9066 100644 --- a/lib/src/managers/delay.dart +++ b/lib/src/managers/delay.dart @@ -1,6 +1,8 @@ import 'package:async/async.dart'; -class CancelableDelayManager { +import '../support/disposable.dart'; + +class CancelableDelayManager extends Disposable { // final _delays = >[]; @@ -19,7 +21,13 @@ class CancelableDelayManager { if (!op.isCanceled) ifNotCancelled?.call(); } + @override Future dispose() async { + super.dispose(); + await cancelAll(); + } + + Future cancelAll() async { // cancel all delays if (_delays.isEmpty) return; // make a copy so we don't mutate while iterating diff --git a/lib/src/room.dart b/lib/src/room.dart index 53e86a190..6ddf268b1 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -115,7 +115,6 @@ class Room extends DisposeAwareChangeNotifier { }) async { // final engine = RTCEngine( - SignalClient(), rtcConfig, ); @@ -171,7 +170,7 @@ class Room extends DisposeAwareChangeNotifier { _connectionState = ConnectionState.reconnecting; events.emit(const RoomReconnectingEvent()); }) - ..on((event) => _onDisconnectedEvent()) + ..on((event) => close()) ..on((event) => _onParticipantUpdateEvent(event.participants)) ..on((event) => _onSpeakerUpdateEvent(event.speakers)) ..on(_onDataMessageEvent) @@ -208,7 +207,7 @@ class Room extends DisposeAwareChangeNotifier { /// Disconnects from the room, notifying server of disconnection. Future disconnect() async { engine.signalClient.sendLeave(); - await _onDisconnectedEvent(); + await close(); } Future reconnect() async { @@ -241,15 +240,15 @@ class Room extends DisposeAwareChangeNotifier { return participant; } - Future _onDisconnectedEvent() async { + // there is no side-effect calling this method multiple times + Future close() async { + logger.fine('[$objectId] close()'); if (_connectionState == ConnectionState.disconnected) { - logger.fine('$objectId: _handleDisconnect() already disconnected'); - return; + logger.warning('[$objectId]: close() already disconnected'); } // we need to flag room as disconnected immediately to avoid // this method firing multiple times since the following code // is being awaited - _connectionState = ConnectionState.disconnected; // clean up RemoteParticipants for (final _ in _participants.values) { @@ -271,6 +270,7 @@ class Room extends DisposeAwareChangeNotifier { _activeSpeakers.clear(); + _connectionState = ConnectionState.disconnected; notifyListeners(); events.emit(const RoomDisconnectedEvent()); } diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 4ebc69bcf..71ea6fe23 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -3,11 +3,11 @@ import 'dart:async'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import 'support/disposable.dart'; +import 'package:meta/meta.dart'; import 'constants.dart'; -import 'exceptions.dart'; import 'events.dart'; +import 'exceptions.dart'; import 'extensions.dart'; import 'logger.dart'; import 'managers/delay.dart'; @@ -16,6 +16,7 @@ import 'options.dart'; import 'proto/livekit_models.pb.dart' as lk_models; import 'proto/livekit_rtc.pb.dart' as lk_rtc; import 'signal_client.dart'; +import 'support/disposable.dart'; import 'transport.dart'; import 'types.dart'; @@ -28,19 +29,31 @@ class RTCEngine extends Disposable { // config for RTCPeerConnection final RTCConfiguration? rtcConfig; + @internal PCTransport? publisher; + + @internal PCTransport? subscriber; + + @internal PCTransport? get primary => _subscriberPrimary ? subscriber : publisher; // used for ice state notifications CancelListenFunc? _primaryIceStateListener; // data channels for packets - rtc.RTCDataChannel? reliableDC; - rtc.RTCDataChannel? lossyDC; - bool iceConnected = false; - bool isReconnecting = false; - bool isClosed = true; + rtc.RTCDataChannel? _reliableDC; + rtc.RTCDataChannel? _lossyDC; + bool _iceConnected = false; + // bool isReconnecting = false; + + // Room is only instantiated if connected, so defaults to connected. + ConnectionState _connectionState = ConnectionState.disconnected; + + /// connection state of the room + ConnectionState get connectionState => _connectionState; + + // bool _isClosed = true; // true if publisher connection has already been established. // this is helpful to know if we need to restart ICE on the publisher connection bool _hasPublished = false; @@ -62,11 +75,12 @@ class RTCEngine extends Disposable { final delays = CancelableDelayManager(); // late final Timer _statsTimer; + // bool get isClosed => RTCEngine( - this.signalClient, - this.rtcConfig, - ) { + this.rtcConfig, { + SignalClient? signalClient, + }) : signalClient = signalClient ?? SignalClient() { if (kDebugMode) { // log all EngineEvents events.listen((event) => logger.fine('[EngineEvent] $objectId ${event.runtimeType}')); @@ -79,6 +93,7 @@ class RTCEngine extends Disposable { @override Future dispose() async { super.dispose(); + await close(); await events.dispose(); await _signalListener.dispose(); } @@ -113,18 +128,15 @@ class RTCEngine extends Disposable { return event.response; } + // there is no side-effect calling this method multiple times Future close() async { - logger.fine('${objectId} close()'); - if (isClosed) { - logger.fine('${objectId} close() already closed'); - return; + logger.fine('[$objectId] close()'); + if (_connectionState == ConnectionState.disconnected) { + logger.warning('[$objectId]: close() already disconnected'); } - isClosed = true; - // _statsTimer.cancel(); - // cancel all ongoing delays - await delays.dispose(); + await delays.cancelAll(); // PCTransport is responsible for disposing RTCPeerConnection await publisher?.dispose(); @@ -133,7 +145,10 @@ class RTCEngine extends Disposable { await subscriber?.dispose(); subscriber = null; - signalClient.dispose(); + await signalClient.close(); + + _connectionState = ConnectionState.disconnected; + // notifyListeners(); } Future addTrack({ @@ -173,10 +188,10 @@ class RTCEngine extends Disposable { final dcMessage = rtc.RTCDataChannelMessage.fromBinary(packet.writeToBuffer()); - if (packet.kind == lk_models.DataPacket_Kind.LOSSY && lossyDC != null) { - await lossyDC?.send(dcMessage); - } else if (packet.kind == lk_models.DataPacket_Kind.RELIABLE && reliableDC != null) { - await reliableDC?.send(dcMessage); + if (packet.kind == lk_models.DataPacket_Kind.LOSSY && _lossyDC != null) { + await _lossyDC?.send(dcMessage); + } else if (packet.kind == lk_models.DataPacket_Kind.RELIABLE && _reliableDC != null) { + await _reliableDC?.send(dcMessage); } } @@ -206,7 +221,7 @@ class RTCEngine extends Disposable { } Future reconnect() async { - if (isClosed) { + if (_connectionState == ConnectionState.disconnected) { logger.fine('$objectId reconnect() already closed'); return; } @@ -224,7 +239,8 @@ class RTCEngine extends Disposable { _reconnectAttempts++; try { - isReconnecting = true; + // isReconnecting = true; + _connectionState = ConnectionState.reconnecting; await signalClient.reconnect(url, token); if (publisher == null || subscriber == null) { @@ -255,7 +271,8 @@ class RTCEngine extends Disposable { // don't catch and pass up any exception } finally { // always set reconnecting to false - isReconnecting = false; + // isReconnecting = false; + _connectionState = ConnectionState.disconnected; } } @@ -295,31 +312,25 @@ class RTCEngine extends Disposable { subscriber?.pc.onDataChannel = _onDataChannel; } - // logger.fine('subscriber.pc: ${subscriber?.pc}'); - subscriber?.pc.onIceConnectionState = (state) { - // - events.emit(EngineSubscriberIceStateUpdatedEvent( - state: state, - isPrimary: _subscriberPrimary, - )); - }; + subscriber?.pc.onIceConnectionState = + (state) => events.emit(EngineSubscriberIceStateUpdatedEvent( + state: state, + isPrimary: _subscriberPrimary, + )); - publisher?.pc.onIceConnectionState = (state) { - // - events.emit(EnginePublisherIceStateUpdatedEvent( - state: state, - isPrimary: !_subscriberPrimary, - )); - }; + publisher?.pc.onIceConnectionState = (state) => events.emit(EnginePublisherIceStateUpdatedEvent( + state: state, + isPrimary: !_subscriberPrimary, + )); events.on((event) { // only listen to primary ice events if (!event.isPrimary) return; if (event.iceState == rtc.RTCIceConnectionState.RTCIceConnectionStateConnected) { - if (!iceConnected) { - iceConnected = true; - if (isReconnecting) { + if (!_iceConnected) { + _iceConnected = true; + if (_connectionState == ConnectionState.reconnecting) { events.emit(const EngineReconnectedEvent()); } else { events.emit(const EngineConnectedEvent()); @@ -327,8 +338,8 @@ class RTCEngine extends Disposable { } } else if (event.iceState == rtc.RTCIceConnectionState.RTCIceConnectionStateFailed) { // trigger reconnect sequence - if (iceConnected) { - iceConnected = false; + if (_iceConnected) { + _iceConnected = false; _onDisconnected('peerconnection'); } } @@ -355,8 +366,8 @@ class RTCEngine extends Disposable { ..binaryType = 'binary' ..ordered = true ..maxRetransmits = 0; - lossyDC = await publisher?.pc.createDataChannel(_lossyDCLabel, lossyInit); - lossyDC!.onMessage = _onDCMessage; + _lossyDC = await publisher?.pc.createDataChannel(_lossyDCLabel, lossyInit); + _lossyDC!.onMessage = _onDCMessage; } catch (_) { logger.severe('[$objectId] createDataChannel() did throw $_'); } @@ -365,8 +376,8 @@ class RTCEngine extends Disposable { final reliableInit = rtc.RTCDataChannelInit() ..binaryType = 'binary' ..ordered = true; - reliableDC = await publisher?.pc.createDataChannel(_reliableDCLabel, reliableInit); - reliableDC!.onMessage = _onDCMessage; + _reliableDC = await publisher?.pc.createDataChannel(_reliableDCLabel, reliableInit); + _reliableDC!.onMessage = _onDCMessage; } catch (_) { logger.severe('[$objectId] createDataChannel() did throw $_'); } @@ -376,13 +387,13 @@ class RTCEngine extends Disposable { switch (dc.label) { case _reliableDCLabel: logger.fine('Server opened DC label: ${dc.label}'); - reliableDC = dc; - reliableDC?.onMessage = _onDCMessage; + _reliableDC = dc; + _reliableDC?.onMessage = _onDCMessage; break; case _lossyDCLabel: logger.fine('Server opened DC label: ${dc.label}'); - lossyDC = dc; - lossyDC?.onMessage = _onDCMessage; + _lossyDC = dc; + _lossyDC?.onMessage = _onDCMessage; break; default: logger.warning('Unknown DC label: ${dc.label}'); @@ -411,11 +422,15 @@ class RTCEngine extends Disposable { } Future _onDisconnected(String reason) async { - if (isClosed) return; + if (_connectionState == ConnectionState.disconnected) { + logger.fine('[$objectId] Already disconnected $reason'); + return; + } + + logger.fine('[$objectId] Disconnected $reason'); - logger.fine('disconnected $reason'); if (_reconnectAttempts >= _maxReconnectAttempts) { - logger.info('could not connect after $_reconnectAttempts, giving up'); + logger.info('[$objectId] Could not connect after ${_reconnectAttempts} attempts, giving up'); await close(); events.emit(const EngineDisconnectedEvent()); return; @@ -437,12 +452,12 @@ class RTCEngine extends Disposable { }); } - //------------------ SignalClient Delegate methods -------------------------// - void _setUpListeners() => _signalListener ..on((event) async { // create peer connections - isClosed = false; + // _isClosed = false; + _connectionState = ConnectionState.connected; + _subscriberPrimary = event.response.subscriberPrimary; _providedIceServers = event.response.iceServers; diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index cef17047b..3a8a45c91 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -110,11 +110,15 @@ class SignalClient extends Disposable { _connected = true; } + Future close() async { + _connected = false; + await _ws?.dispose(); + } + @override void dispose() { super.dispose(); - _connected = false; - _ws?.dispose(); + close(); } void sendOffer(rtc.RTCSessionDescription offer) => _sendRequest(lk_rtc.SignalRequest( From bc0ce3c1fdf59763d0f21c38d1ae6d223c1cb34a Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 26 Sep 2021 16:23:13 +0900 Subject: [PATCH 10/50] change create audio track defaults --- lib/src/track/local_audio_track.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/src/track/local_audio_track.dart b/lib/src/track/local_audio_track.dart index 2fa602fb2..0c8e0fd74 100644 --- a/lib/src/track/local_audio_track.dart +++ b/lib/src/track/local_audio_track.dart @@ -15,9 +15,12 @@ class LocalAudioTrack extends AudioTrack { /// Creates a new audio track from the default audio input device. static Future create([LocalAudioTrackOptions? options]) async { - // try { + // TODO: have back up incase the options fail final stream = await rtc.navigator.mediaDevices.getUserMedia({ - 'audio': true, + 'audio': { + 'echoCancellation': true, + 'noiseSuppression': true, + }, 'video': false, }); From c78fd5afe939aaa634d72178e602808e72230ce6 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 26 Sep 2021 16:36:10 +0900 Subject: [PATCH 11/50] update protos --- lib/src/proto/livekit_models.pb.dart | 632 +++++------ lib/src/proto/livekit_models.pbenum.dart | 40 +- lib/src/proto/livekit_models.pbjson.dart | 70 +- lib/src/proto/livekit_models.pbserver.dart | 1 + lib/src/proto/livekit_rtc.pb.dart | 1123 ++++++++------------ lib/src/proto/livekit_rtc.pbenum.dart | 22 +- lib/src/proto/livekit_rtc.pbjson.dart | 286 +---- lib/src/proto/livekit_rtc.pbserver.dart | 1 + 8 files changed, 839 insertions(+), 1336 deletions(-) diff --git a/lib/src/proto/livekit_models.pb.dart b/lib/src/proto/livekit_models.pb.dart index 09f934cde..b3239fe25 100644 --- a/lib/src/proto/livekit_models.pb.dart +++ b/lib/src/proto/livekit_models.pb.dart @@ -15,29 +15,17 @@ import 'livekit_models.pbenum.dart'; export 'livekit_models.pbenum.dart'; class Room extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Room', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Room', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') - ..a<$core.int>( - 3, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'emptyTimeout', - $pb.PbFieldType.OU3) - ..a<$core.int>( - 4, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'maxParticipants', - $pb.PbFieldType.OU3) + ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'emptyTimeout', $pb.PbFieldType.OU3) + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'maxParticipants', $pb.PbFieldType.OU3) ..aInt64(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'creationTime') ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'turnPassword') - ..pc( - 7, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'enabledCodecs', - $pb.PbFieldType.PM, - subBuilder: Codec.create) - ..hasRequiredFields = false; + ..pc(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'enabledCodecs', $pb.PbFieldType.PM, subBuilder: Codec.create) + ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'metadata') + ..hasRequiredFields = false + ; Room._() : super(); factory Room({ @@ -48,6 +36,7 @@ class Room extends $pb.GeneratedMessage { $fixnum.Int64? creationTime, $core.String? turnPassword, $core.Iterable? enabledCodecs, + $core.String? metadata, }) { final _result = create(); if (sid != null) { @@ -71,23 +60,23 @@ class Room extends $pb.GeneratedMessage { if (enabledCodecs != null) { _result.enabledCodecs.addAll(enabledCodecs); } + if (metadata != null) { + _result.metadata = metadata; + } return _result; } - factory Room.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Room.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory Room.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Room.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') Room clone() => Room()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - Room copyWith(void Function(Room) updates) => - super.copyWith((message) => updates(message as Room)) - as Room; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Room copyWith(void Function(Room) updates) => super.copyWith((message) => updates(message as Room)) as Room; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Room create() => Room._(); @@ -100,10 +89,7 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { - $_setString(0, v); - } - + set sid($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -112,10 +98,7 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get name => $_getSZ(1); @$pb.TagNumber(2) - set name($core.String v) { - $_setString(1, v); - } - + set name($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) $core.bool hasName() => $_has(1); @$pb.TagNumber(2) @@ -124,10 +107,7 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.int get emptyTimeout => $_getIZ(2); @$pb.TagNumber(3) - set emptyTimeout($core.int v) { - $_setUnsignedInt32(2, v); - } - + set emptyTimeout($core.int v) { $_setUnsignedInt32(2, v); } @$pb.TagNumber(3) $core.bool hasEmptyTimeout() => $_has(2); @$pb.TagNumber(3) @@ -136,10 +116,7 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.int get maxParticipants => $_getIZ(3); @$pb.TagNumber(4) - set maxParticipants($core.int v) { - $_setUnsignedInt32(3, v); - } - + set maxParticipants($core.int v) { $_setUnsignedInt32(3, v); } @$pb.TagNumber(4) $core.bool hasMaxParticipants() => $_has(3); @$pb.TagNumber(4) @@ -148,10 +125,7 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(5) $fixnum.Int64 get creationTime => $_getI64(4); @$pb.TagNumber(5) - set creationTime($fixnum.Int64 v) { - $_setInt64(4, v); - } - + set creationTime($fixnum.Int64 v) { $_setInt64(4, v); } @$pb.TagNumber(5) $core.bool hasCreationTime() => $_has(4); @$pb.TagNumber(5) @@ -160,10 +134,7 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.String get turnPassword => $_getSZ(5); @$pb.TagNumber(6) - set turnPassword($core.String v) { - $_setString(5, v); - } - + set turnPassword($core.String v) { $_setString(5, v); } @$pb.TagNumber(6) $core.bool hasTurnPassword() => $_has(5); @$pb.TagNumber(6) @@ -171,17 +142,23 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(7) $core.List get enabledCodecs => $_getList(6); + + @$pb.TagNumber(8) + $core.String get metadata => $_getSZ(7); + @$pb.TagNumber(8) + set metadata($core.String v) { $_setString(7, v); } + @$pb.TagNumber(8) + $core.bool hasMetadata() => $_has(7); + @$pb.TagNumber(8) + void clearMetadata() => clearField(8); } class Codec extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Codec', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Codec', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mime') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fmtpLine') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; Codec._() : super(); factory Codec({ @@ -197,38 +174,31 @@ class Codec extends $pb.GeneratedMessage { } return _result; } - factory Codec.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory Codec.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory Codec.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory Codec.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') Codec clone() => Codec()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - Codec copyWith(void Function(Codec) updates) => - super.copyWith((message) => updates(message as Codec)) - as Codec; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Codec copyWith(void Function(Codec) updates) => super.copyWith((message) => updates(message as Codec)) as Codec; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Codec create() => Codec._(); Codec createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static Codec getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Codec getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static Codec? _defaultInstance; @$pb.TagNumber(1) $core.String get mime => $_getSZ(0); @$pb.TagNumber(1) - set mime($core.String v) { - $_setString(0, v); - } - + set mime($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasMime() => $_has(0); @$pb.TagNumber(1) @@ -237,10 +207,7 @@ class Codec extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get fmtpLine => $_getSZ(1); @$pb.TagNumber(2) - set fmtpLine($core.String v) { - $_setString(1, v); - } - + set fmtpLine($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) $core.bool hasFmtpLine() => $_has(1); @$pb.TagNumber(2) @@ -248,29 +215,16 @@ class Codec extends $pb.GeneratedMessage { } class ParticipantInfo extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ParticipantInfo', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ParticipantInfo', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'identity') - ..e( - 3, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'state', - $pb.PbFieldType.OE, - defaultOrMaker: ParticipantInfo_State.JOINING, - valueOf: ParticipantInfo_State.valueOf, - enumValues: ParticipantInfo_State.values) - ..pc( - 4, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'tracks', - $pb.PbFieldType.PM, - subBuilder: TrackInfo.create) + ..e(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'state', $pb.PbFieldType.OE, defaultOrMaker: ParticipantInfo_State.JOINING, valueOf: ParticipantInfo_State.valueOf, enumValues: ParticipantInfo_State.values) + ..pc(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'tracks', $pb.PbFieldType.PM, subBuilder: TrackInfo.create) ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'metadata') ..aInt64(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'joinedAt') ..aOB(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hidden') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; ParticipantInfo._() : super(); factory ParticipantInfo({ @@ -306,39 +260,31 @@ class ParticipantInfo extends $pb.GeneratedMessage { } return _result; } - factory ParticipantInfo.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ParticipantInfo.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory ParticipantInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ParticipantInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') ParticipantInfo clone() => ParticipantInfo()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - ParticipantInfo copyWith(void Function(ParticipantInfo) updates) => - super.copyWith((message) => updates(message as ParticipantInfo)) - as ParticipantInfo; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ParticipantInfo copyWith(void Function(ParticipantInfo) updates) => super.copyWith((message) => updates(message as ParticipantInfo)) as ParticipantInfo; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ParticipantInfo create() => ParticipantInfo._(); ParticipantInfo createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static ParticipantInfo getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ParticipantInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static ParticipantInfo? _defaultInstance; @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { - $_setString(0, v); - } - + set sid($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -347,10 +293,7 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get identity => $_getSZ(1); @$pb.TagNumber(2) - set identity($core.String v) { - $_setString(1, v); - } - + set identity($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) $core.bool hasIdentity() => $_has(1); @$pb.TagNumber(2) @@ -359,10 +302,7 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(3) ParticipantInfo_State get state => $_getN(2); @$pb.TagNumber(3) - set state(ParticipantInfo_State v) { - setField(3, v); - } - + set state(ParticipantInfo_State v) { setField(3, v); } @$pb.TagNumber(3) $core.bool hasState() => $_has(2); @$pb.TagNumber(3) @@ -374,10 +314,7 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.String get metadata => $_getSZ(4); @$pb.TagNumber(5) - set metadata($core.String v) { - $_setString(4, v); - } - + set metadata($core.String v) { $_setString(4, v); } @$pb.TagNumber(5) $core.bool hasMetadata() => $_has(4); @$pb.TagNumber(5) @@ -386,10 +323,7 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(6) $fixnum.Int64 get joinedAt => $_getI64(5); @$pb.TagNumber(6) - set joinedAt($fixnum.Int64 v) { - $_setInt64(5, v); - } - + set joinedAt($fixnum.Int64 v) { $_setInt64(5, v); } @$pb.TagNumber(6) $core.bool hasJoinedAt() => $_has(5); @$pb.TagNumber(6) @@ -398,10 +332,7 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(7) $core.bool get hidden => $_getBF(6); @$pb.TagNumber(7) - set hidden($core.bool v) { - $_setBool(6, v); - } - + set hidden($core.bool v) { $_setBool(6, v); } @$pb.TagNumber(7) $core.bool hasHidden() => $_has(6); @$pb.TagNumber(7) @@ -409,23 +340,16 @@ class ParticipantInfo extends $pb.GeneratedMessage { } class TrackInfo extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrackInfo', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrackInfo', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') - ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', - $pb.PbFieldType.OE, - defaultOrMaker: TrackType.AUDIO, valueOf: TrackType.valueOf, enumValues: TrackType.values) + ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', $pb.PbFieldType.OE, defaultOrMaker: TrackType.AUDIO, valueOf: TrackType.valueOf, enumValues: TrackType.values) ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'muted') - ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', - $pb.PbFieldType.OU3) - ..a<$core.int>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', - $pb.PbFieldType.OU3) + ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.OU3) + ..a<$core.int>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.OU3) ..aOB(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'simulcast') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; TrackInfo._() : super(); factory TrackInfo({ @@ -461,39 +385,31 @@ class TrackInfo extends $pb.GeneratedMessage { } return _result; } - factory TrackInfo.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory TrackInfo.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory TrackInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory TrackInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') TrackInfo clone() => TrackInfo()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - TrackInfo copyWith(void Function(TrackInfo) updates) => - super.copyWith((message) => updates(message as TrackInfo)) - as TrackInfo; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TrackInfo copyWith(void Function(TrackInfo) updates) => super.copyWith((message) => updates(message as TrackInfo)) as TrackInfo; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static TrackInfo create() => TrackInfo._(); TrackInfo createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static TrackInfo getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TrackInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static TrackInfo? _defaultInstance; @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { - $_setString(0, v); - } - + set sid($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -502,10 +418,7 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(2) TrackType get type => $_getN(1); @$pb.TagNumber(2) - set type(TrackType v) { - setField(2, v); - } - + set type(TrackType v) { setField(2, v); } @$pb.TagNumber(2) $core.bool hasType() => $_has(1); @$pb.TagNumber(2) @@ -514,10 +427,7 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get name => $_getSZ(2); @$pb.TagNumber(3) - set name($core.String v) { - $_setString(2, v); - } - + set name($core.String v) { $_setString(2, v); } @$pb.TagNumber(3) $core.bool hasName() => $_has(2); @$pb.TagNumber(3) @@ -526,10 +436,7 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.bool get muted => $_getBF(3); @$pb.TagNumber(4) - set muted($core.bool v) { - $_setBool(3, v); - } - + set muted($core.bool v) { $_setBool(3, v); } @$pb.TagNumber(4) $core.bool hasMuted() => $_has(3); @$pb.TagNumber(4) @@ -538,10 +445,7 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.int get width => $_getIZ(4); @$pb.TagNumber(5) - set width($core.int v) { - $_setUnsignedInt32(4, v); - } - + set width($core.int v) { $_setUnsignedInt32(4, v); } @$pb.TagNumber(5) $core.bool hasWidth() => $_has(4); @$pb.TagNumber(5) @@ -550,10 +454,7 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.int get height => $_getIZ(5); @$pb.TagNumber(6) - set height($core.int v) { - $_setUnsignedInt32(5, v); - } - + set height($core.int v) { $_setUnsignedInt32(5, v); } @$pb.TagNumber(6) $core.bool hasHeight() => $_has(5); @$pb.TagNumber(6) @@ -562,44 +463,32 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(7) $core.bool get simulcast => $_getBF(6); @$pb.TagNumber(7) - set simulcast($core.bool v) { - $_setBool(6, v); - } - + set simulcast($core.bool v) { $_setBool(6, v); } @$pb.TagNumber(7) $core.bool hasSimulcast() => $_has(6); @$pb.TagNumber(7) void clearSimulcast() => clearField(7); } -enum DataPacket_Value { user, speaker, notSet } +enum DataPacket_Value { + user, + speaker, + notSet +} class DataPacket extends $pb.GeneratedMessage { static const $core.Map<$core.int, DataPacket_Value> _DataPacket_ValueByTag = { - 2: DataPacket_Value.user, - 3: DataPacket_Value.speaker, - 0: DataPacket_Value.notSet + 2 : DataPacket_Value.user, + 3 : DataPacket_Value.speaker, + 0 : DataPacket_Value.notSet }; - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DataPacket', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DataPacket', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..oo(0, [2, 3]) - ..e( - 1, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'kind', - $pb.PbFieldType.OE, - defaultOrMaker: DataPacket_Kind.RELIABLE, - valueOf: DataPacket_Kind.valueOf, - enumValues: DataPacket_Kind.values) - ..aOM( - 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'user', - subBuilder: UserPacket.create) - ..aOM( - 3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speaker', - subBuilder: ActiveSpeakerUpdate.create) - ..hasRequiredFields = false; + ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'kind', $pb.PbFieldType.OE, defaultOrMaker: DataPacket_Kind.RELIABLE, valueOf: DataPacket_Kind.valueOf, enumValues: DataPacket_Kind.values) + ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'user', subBuilder: UserPacket.create) + ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speaker', subBuilder: ActiveSpeakerUpdate.create) + ..hasRequiredFields = false + ; DataPacket._() : super(); factory DataPacket({ @@ -619,30 +508,25 @@ class DataPacket extends $pb.GeneratedMessage { } return _result; } - factory DataPacket.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory DataPacket.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory DataPacket.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory DataPacket.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') DataPacket clone() => DataPacket()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - DataPacket copyWith(void Function(DataPacket) updates) => - super.copyWith((message) => updates(message as DataPacket)) - as DataPacket; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + DataPacket copyWith(void Function(DataPacket) updates) => super.copyWith((message) => updates(message as DataPacket)) as DataPacket; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DataPacket create() => DataPacket._(); DataPacket createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static DataPacket getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static DataPacket getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static DataPacket? _defaultInstance; DataPacket_Value whichValue() => _DataPacket_ValueByTag[$_whichOneof(0)]!; @@ -651,10 +535,7 @@ class DataPacket extends $pb.GeneratedMessage { @$pb.TagNumber(1) DataPacket_Kind get kind => $_getN(0); @$pb.TagNumber(1) - set kind(DataPacket_Kind v) { - setField(1, v); - } - + set kind(DataPacket_Kind v) { setField(1, v); } @$pb.TagNumber(1) $core.bool hasKind() => $_has(0); @$pb.TagNumber(1) @@ -663,10 +544,7 @@ class DataPacket extends $pb.GeneratedMessage { @$pb.TagNumber(2) UserPacket get user => $_getN(1); @$pb.TagNumber(2) - set user(UserPacket v) { - setField(2, v); - } - + set user(UserPacket v) { setField(2, v); } @$pb.TagNumber(2) $core.bool hasUser() => $_has(1); @$pb.TagNumber(2) @@ -677,10 +555,7 @@ class DataPacket extends $pb.GeneratedMessage { @$pb.TagNumber(3) ActiveSpeakerUpdate get speaker => $_getN(2); @$pb.TagNumber(3) - set speaker(ActiveSpeakerUpdate v) { - setField(3, v); - } - + set speaker(ActiveSpeakerUpdate v) { setField(3, v); } @$pb.TagNumber(3) $core.bool hasSpeaker() => $_has(2); @$pb.TagNumber(3) @@ -690,17 +565,10 @@ class DataPacket extends $pb.GeneratedMessage { } class ActiveSpeakerUpdate extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ActiveSpeakerUpdate', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) - ..pc( - 1, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakers', - $pb.PbFieldType.PM, - subBuilder: SpeakerInfo.create) - ..hasRequiredFields = false; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ActiveSpeakerUpdate', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakers', $pb.PbFieldType.PM, subBuilder: SpeakerInfo.create) + ..hasRequiredFields = false + ; ActiveSpeakerUpdate._() : super(); factory ActiveSpeakerUpdate({ @@ -712,30 +580,25 @@ class ActiveSpeakerUpdate extends $pb.GeneratedMessage { } return _result; } - factory ActiveSpeakerUpdate.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ActiveSpeakerUpdate.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory ActiveSpeakerUpdate.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ActiveSpeakerUpdate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') ActiveSpeakerUpdate clone() => ActiveSpeakerUpdate()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - ActiveSpeakerUpdate copyWith(void Function(ActiveSpeakerUpdate) updates) => - super.copyWith((message) => updates(message as ActiveSpeakerUpdate)) - as ActiveSpeakerUpdate; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ActiveSpeakerUpdate copyWith(void Function(ActiveSpeakerUpdate) updates) => super.copyWith((message) => updates(message as ActiveSpeakerUpdate)) as ActiveSpeakerUpdate; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ActiveSpeakerUpdate create() => ActiveSpeakerUpdate._(); ActiveSpeakerUpdate createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static ActiveSpeakerUpdate getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ActiveSpeakerUpdate getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static ActiveSpeakerUpdate? _defaultInstance; @$pb.TagNumber(1) @@ -743,18 +606,12 @@ class ActiveSpeakerUpdate extends $pb.GeneratedMessage { } class SpeakerInfo extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SpeakerInfo', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SpeakerInfo', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') - ..a<$core.double>( - 2, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'level', - $pb.PbFieldType.OF) + ..a<$core.double>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'level', $pb.PbFieldType.OF) ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'active') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; SpeakerInfo._() : super(); factory SpeakerInfo({ @@ -774,39 +631,31 @@ class SpeakerInfo extends $pb.GeneratedMessage { } return _result; } - factory SpeakerInfo.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory SpeakerInfo.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SpeakerInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SpeakerInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SpeakerInfo clone() => SpeakerInfo()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SpeakerInfo copyWith(void Function(SpeakerInfo) updates) => - super.copyWith((message) => updates(message as SpeakerInfo)) - as SpeakerInfo; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SpeakerInfo copyWith(void Function(SpeakerInfo) updates) => super.copyWith((message) => updates(message as SpeakerInfo)) as SpeakerInfo; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SpeakerInfo create() => SpeakerInfo._(); SpeakerInfo createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SpeakerInfo getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SpeakerInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SpeakerInfo? _defaultInstance; @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { - $_setString(0, v); - } - + set sid($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -815,10 +664,7 @@ class SpeakerInfo extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.double get level => $_getN(1); @$pb.TagNumber(2) - set level($core.double v) { - $_setFloat(1, v); - } - + set level($core.double v) { $_setFloat(1, v); } @$pb.TagNumber(2) $core.bool hasLevel() => $_has(1); @$pb.TagNumber(2) @@ -827,10 +673,7 @@ class SpeakerInfo extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.bool get active => $_getBF(2); @$pb.TagNumber(3) - set active($core.bool v) { - $_setBool(2, v); - } - + set active($core.bool v) { $_setBool(2, v); } @$pb.TagNumber(3) $core.bool hasActive() => $_has(2); @$pb.TagNumber(3) @@ -838,18 +681,12 @@ class SpeakerInfo extends $pb.GeneratedMessage { } class UserPacket extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UserPacket', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UserPacket', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participantSid') - ..a<$core.List<$core.int>>( - 2, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'payload', - $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'payload', $pb.PbFieldType.OY) ..pPS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'destinationSids') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; UserPacket._() : super(); factory UserPacket({ @@ -869,39 +706,31 @@ class UserPacket extends $pb.GeneratedMessage { } return _result; } - factory UserPacket.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory UserPacket.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory UserPacket.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory UserPacket.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') UserPacket clone() => UserPacket()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - UserPacket copyWith(void Function(UserPacket) updates) => - super.copyWith((message) => updates(message as UserPacket)) - as UserPacket; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + UserPacket copyWith(void Function(UserPacket) updates) => super.copyWith((message) => updates(message as UserPacket)) as UserPacket; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static UserPacket create() => UserPacket._(); UserPacket createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static UserPacket getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static UserPacket getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static UserPacket? _defaultInstance; @$pb.TagNumber(1) $core.String get participantSid => $_getSZ(0); @$pb.TagNumber(1) - set participantSid($core.String v) { - $_setString(0, v); - } - + set participantSid($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasParticipantSid() => $_has(0); @$pb.TagNumber(1) @@ -910,10 +739,7 @@ class UserPacket extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.List<$core.int> get payload => $_getN(1); @$pb.TagNumber(2) - set payload($core.List<$core.int> v) { - $_setBytes(1, v); - } - + set payload($core.List<$core.int> v) { $_setBytes(1, v); } @$pb.TagNumber(2) $core.bool hasPayload() => $_has(1); @$pb.TagNumber(2) @@ -922,3 +748,93 @@ class UserPacket extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.List<$core.String> get destinationSids => $_getList(2); } + +class RecordingResult extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RecordingResult', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error') + ..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'duration') + ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'location') + ..hasRequiredFields = false + ; + + RecordingResult._() : super(); + factory RecordingResult({ + $core.String? id, + $core.String? error, + $fixnum.Int64? duration, + $core.String? location, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (error != null) { + _result.error = error; + } + if (duration != null) { + _result.duration = duration; + } + if (location != null) { + _result.location = location; + } + return _result; + } + factory RecordingResult.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RecordingResult.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + RecordingResult clone() => RecordingResult()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RecordingResult copyWith(void Function(RecordingResult) updates) => super.copyWith((message) => updates(message as RecordingResult)) as RecordingResult; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static RecordingResult create() => RecordingResult._(); + RecordingResult createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RecordingResult getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RecordingResult? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get error => $_getSZ(1); + @$pb.TagNumber(2) + set error($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasError() => $_has(1); + @$pb.TagNumber(2) + void clearError() => clearField(2); + + @$pb.TagNumber(3) + $fixnum.Int64 get duration => $_getI64(2); + @$pb.TagNumber(3) + set duration($fixnum.Int64 v) { $_setInt64(2, v); } + @$pb.TagNumber(3) + $core.bool hasDuration() => $_has(2); + @$pb.TagNumber(3) + void clearDuration() => clearField(3); + + @$pb.TagNumber(4) + $core.String get location => $_getSZ(3); + @$pb.TagNumber(4) + set location($core.String v) { $_setString(3, v); } + @$pb.TagNumber(4) + $core.bool hasLocation() => $_has(3); + @$pb.TagNumber(4) + void clearLocation() => clearField(4); +} + diff --git a/lib/src/proto/livekit_models.pbenum.dart b/lib/src/proto/livekit_models.pbenum.dart index e4f8aea87..71141d73b 100644 --- a/lib/src/proto/livekit_models.pbenum.dart +++ b/lib/src/proto/livekit_models.pbenum.dart @@ -10,14 +10,11 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; class TrackType extends $pb.ProtobufEnum { - static const TrackType AUDIO = - TrackType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AUDIO'); - static const TrackType VIDEO = - TrackType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'VIDEO'); - static const TrackType DATA = - TrackType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DATA'); + static const TrackType AUDIO = TrackType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AUDIO'); + static const TrackType VIDEO = TrackType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'VIDEO'); + static const TrackType DATA = TrackType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DATA'); - static const $core.List values = [ + static const $core.List values = [ AUDIO, VIDEO, DATA, @@ -30,43 +27,36 @@ class TrackType extends $pb.ProtobufEnum { } class ParticipantInfo_State extends $pb.ProtobufEnum { - static const ParticipantInfo_State JOINING = ParticipantInfo_State._( - 0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'JOINING'); - static const ParticipantInfo_State JOINED = ParticipantInfo_State._( - 1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'JOINED'); - static const ParticipantInfo_State ACTIVE = ParticipantInfo_State._( - 2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ACTIVE'); - static const ParticipantInfo_State DISCONNECTED = ParticipantInfo_State._( - 3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DISCONNECTED'); + static const ParticipantInfo_State JOINING = ParticipantInfo_State._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'JOINING'); + static const ParticipantInfo_State JOINED = ParticipantInfo_State._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'JOINED'); + static const ParticipantInfo_State ACTIVE = ParticipantInfo_State._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ACTIVE'); + static const ParticipantInfo_State DISCONNECTED = ParticipantInfo_State._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DISCONNECTED'); - static const $core.List values = [ + static const $core.List values = [ JOINING, JOINED, ACTIVE, DISCONNECTED, ]; - static final $core.Map<$core.int, ParticipantInfo_State> _byValue = - $pb.ProtobufEnum.initByValue(values); + static final $core.Map<$core.int, ParticipantInfo_State> _byValue = $pb.ProtobufEnum.initByValue(values); static ParticipantInfo_State? valueOf($core.int value) => _byValue[value]; const ParticipantInfo_State._($core.int v, $core.String n) : super(v, n); } class DataPacket_Kind extends $pb.ProtobufEnum { - static const DataPacket_Kind RELIABLE = DataPacket_Kind._( - 0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RELIABLE'); - static const DataPacket_Kind LOSSY = DataPacket_Kind._( - 1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LOSSY'); + static const DataPacket_Kind RELIABLE = DataPacket_Kind._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RELIABLE'); + static const DataPacket_Kind LOSSY = DataPacket_Kind._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LOSSY'); - static const $core.List values = [ + static const $core.List values = [ RELIABLE, LOSSY, ]; - static final $core.Map<$core.int, DataPacket_Kind> _byValue = - $pb.ProtobufEnum.initByValue(values); + static final $core.Map<$core.int, DataPacket_Kind> _byValue = $pb.ProtobufEnum.initByValue(values); static DataPacket_Kind? valueOf($core.int value) => _byValue[value]; const DataPacket_Kind._($core.int v, $core.String n) : super(v, n); } + diff --git a/lib/src/proto/livekit_models.pbjson.dart b/lib/src/proto/livekit_models.pbjson.dart index c03167f61..dd358517f 100644 --- a/lib/src/proto/livekit_models.pbjson.dart +++ b/lib/src/proto/livekit_models.pbjson.dart @@ -8,7 +8,6 @@ import 'dart:core' as $core; import 'dart:convert' as $convert; import 'dart:typed_data' as $typed_data; - @$core.Deprecated('Use trackTypeDescriptor instead') const TrackType$json = const { '1': 'TrackType', @@ -20,8 +19,7 @@ const TrackType$json = const { }; /// Descriptor for `TrackType`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List trackTypeDescriptor = - $convert.base64Decode('CglUcmFja1R5cGUSCQoFQVVESU8QABIJCgVWSURFTxABEggKBERBVEEQAg=='); +final $typed_data.Uint8List trackTypeDescriptor = $convert.base64Decode('CglUcmFja1R5cGUSCQoFQVVESU8QABIJCgVWSURFTxABEggKBERBVEEQAg=='); @$core.Deprecated('Use roomDescriptor instead') const Room$json = const { '1': 'Room', @@ -32,20 +30,13 @@ const Room$json = const { const {'1': 'max_participants', '3': 4, '4': 1, '5': 13, '10': 'maxParticipants'}, const {'1': 'creation_time', '3': 5, '4': 1, '5': 3, '10': 'creationTime'}, const {'1': 'turn_password', '3': 6, '4': 1, '5': 9, '10': 'turnPassword'}, - const { - '1': 'enabled_codecs', - '3': 7, - '4': 3, - '5': 11, - '6': '.livekit.Codec', - '10': 'enabledCodecs' - }, + const {'1': 'enabled_codecs', '3': 7, '4': 3, '5': 11, '6': '.livekit.Codec', '10': 'enabledCodecs'}, + const {'1': 'metadata', '3': 8, '4': 1, '5': 9, '10': 'metadata'}, ], }; /// Descriptor for `Room`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List roomDescriptor = $convert.base64Decode( - 'CgRSb29tEhAKA3NpZBgBIAEoCVIDc2lkEhIKBG5hbWUYAiABKAlSBG5hbWUSIwoNZW1wdHlfdGltZW91dBgDIAEoDVIMZW1wdHlUaW1lb3V0EikKEG1heF9wYXJ0aWNpcGFudHMYBCABKA1SD21heFBhcnRpY2lwYW50cxIjCg1jcmVhdGlvbl90aW1lGAUgASgDUgxjcmVhdGlvblRpbWUSIwoNdHVybl9wYXNzd29yZBgGIAEoCVIMdHVyblBhc3N3b3JkEjUKDmVuYWJsZWRfY29kZWNzGAcgAygLMg4ubGl2ZWtpdC5Db2RlY1INZW5hYmxlZENvZGVjcw=='); +final $typed_data.Uint8List roomDescriptor = $convert.base64Decode('CgRSb29tEhAKA3NpZBgBIAEoCVIDc2lkEhIKBG5hbWUYAiABKAlSBG5hbWUSIwoNZW1wdHlfdGltZW91dBgDIAEoDVIMZW1wdHlUaW1lb3V0EikKEG1heF9wYXJ0aWNpcGFudHMYBCABKA1SD21heFBhcnRpY2lwYW50cxIjCg1jcmVhdGlvbl90aW1lGAUgASgDUgxjcmVhdGlvblRpbWUSIwoNdHVybl9wYXNzd29yZBgGIAEoCVIMdHVyblBhc3N3b3JkEjUKDmVuYWJsZWRfY29kZWNzGAcgAygLMg4ubGl2ZWtpdC5Db2RlY1INZW5hYmxlZENvZGVjcxIaCghtZXRhZGF0YRgIIAEoCVIIbWV0YWRhdGE='); @$core.Deprecated('Use codecDescriptor instead') const Codec$json = const { '1': 'Codec', @@ -56,22 +47,14 @@ const Codec$json = const { }; /// Descriptor for `Codec`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List codecDescriptor = $convert - .base64Decode('CgVDb2RlYxISCgRtaW1lGAEgASgJUgRtaW1lEhsKCWZtdHBfbGluZRgCIAEoCVIIZm10cExpbmU='); +final $typed_data.Uint8List codecDescriptor = $convert.base64Decode('CgVDb2RlYxISCgRtaW1lGAEgASgJUgRtaW1lEhsKCWZtdHBfbGluZRgCIAEoCVIIZm10cExpbmU='); @$core.Deprecated('Use participantInfoDescriptor instead') const ParticipantInfo$json = const { '1': 'ParticipantInfo', '2': const [ const {'1': 'sid', '3': 1, '4': 1, '5': 9, '10': 'sid'}, const {'1': 'identity', '3': 2, '4': 1, '5': 9, '10': 'identity'}, - const { - '1': 'state', - '3': 3, - '4': 1, - '5': 14, - '6': '.livekit.ParticipantInfo.State', - '10': 'state' - }, + const {'1': 'state', '3': 3, '4': 1, '5': 14, '6': '.livekit.ParticipantInfo.State', '10': 'state'}, const {'1': 'tracks', '3': 4, '4': 3, '5': 11, '6': '.livekit.TrackInfo', '10': 'tracks'}, const {'1': 'metadata', '3': 5, '4': 1, '5': 9, '10': 'metadata'}, const {'1': 'joined_at', '3': 6, '4': 1, '5': 3, '10': 'joinedAt'}, @@ -92,8 +75,7 @@ const ParticipantInfo_State$json = const { }; /// Descriptor for `ParticipantInfo`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List participantInfoDescriptor = $convert.base64Decode( - 'Cg9QYXJ0aWNpcGFudEluZm8SEAoDc2lkGAEgASgJUgNzaWQSGgoIaWRlbnRpdHkYAiABKAlSCGlkZW50aXR5EjQKBXN0YXRlGAMgASgOMh4ubGl2ZWtpdC5QYXJ0aWNpcGFudEluZm8uU3RhdGVSBXN0YXRlEioKBnRyYWNrcxgEIAMoCzISLmxpdmVraXQuVHJhY2tJbmZvUgZ0cmFja3MSGgoIbWV0YWRhdGEYBSABKAlSCG1ldGFkYXRhEhsKCWpvaW5lZF9hdBgGIAEoA1IIam9pbmVkQXQSFgoGaGlkZGVuGAcgASgIUgZoaWRkZW4iPgoFU3RhdGUSCwoHSk9JTklORxAAEgoKBkpPSU5FRBABEgoKBkFDVElWRRACEhAKDERJU0NPTk5FQ1RFRBAD'); +final $typed_data.Uint8List participantInfoDescriptor = $convert.base64Decode('Cg9QYXJ0aWNpcGFudEluZm8SEAoDc2lkGAEgASgJUgNzaWQSGgoIaWRlbnRpdHkYAiABKAlSCGlkZW50aXR5EjQKBXN0YXRlGAMgASgOMh4ubGl2ZWtpdC5QYXJ0aWNpcGFudEluZm8uU3RhdGVSBXN0YXRlEioKBnRyYWNrcxgEIAMoCzISLmxpdmVraXQuVHJhY2tJbmZvUgZ0cmFja3MSGgoIbWV0YWRhdGEYBSABKAlSCG1ldGFkYXRhEhsKCWpvaW5lZF9hdBgGIAEoA1IIam9pbmVkQXQSFgoGaGlkZGVuGAcgASgIUgZoaWRkZW4iPgoFU3RhdGUSCwoHSk9JTklORxAAEgoKBkpPSU5FRBABEgoKBkFDVElWRRACEhAKDERJU0NPTk5FQ1RFRBAD'); @$core.Deprecated('Use trackInfoDescriptor instead') const TrackInfo$json = const { '1': 'TrackInfo', @@ -109,23 +91,14 @@ const TrackInfo$json = const { }; /// Descriptor for `TrackInfo`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List trackInfoDescriptor = $convert.base64Decode( - 'CglUcmFja0luZm8SEAoDc2lkGAEgASgJUgNzaWQSJgoEdHlwZRgCIAEoDjISLmxpdmVraXQuVHJhY2tUeXBlUgR0eXBlEhIKBG5hbWUYAyABKAlSBG5hbWUSFAoFbXV0ZWQYBCABKAhSBW11dGVkEhQKBXdpZHRoGAUgASgNUgV3aWR0aBIWCgZoZWlnaHQYBiABKA1SBmhlaWdodBIcCglzaW11bGNhc3QYByABKAhSCXNpbXVsY2FzdA=='); +final $typed_data.Uint8List trackInfoDescriptor = $convert.base64Decode('CglUcmFja0luZm8SEAoDc2lkGAEgASgJUgNzaWQSJgoEdHlwZRgCIAEoDjISLmxpdmVraXQuVHJhY2tUeXBlUgR0eXBlEhIKBG5hbWUYAyABKAlSBG5hbWUSFAoFbXV0ZWQYBCABKAhSBW11dGVkEhQKBXdpZHRoGAUgASgNUgV3aWR0aBIWCgZoZWlnaHQYBiABKA1SBmhlaWdodBIcCglzaW11bGNhc3QYByABKAhSCXNpbXVsY2FzdA=='); @$core.Deprecated('Use dataPacketDescriptor instead') const DataPacket$json = const { '1': 'DataPacket', '2': const [ const {'1': 'kind', '3': 1, '4': 1, '5': 14, '6': '.livekit.DataPacket.Kind', '10': 'kind'}, const {'1': 'user', '3': 2, '4': 1, '5': 11, '6': '.livekit.UserPacket', '9': 0, '10': 'user'}, - const { - '1': 'speaker', - '3': 3, - '4': 1, - '5': 11, - '6': '.livekit.ActiveSpeakerUpdate', - '9': 0, - '10': 'speaker' - }, + const {'1': 'speaker', '3': 3, '4': 1, '5': 11, '6': '.livekit.ActiveSpeakerUpdate', '9': 0, '10': 'speaker'}, ], '4': const [DataPacket_Kind$json], '8': const [ @@ -143,8 +116,7 @@ const DataPacket_Kind$json = const { }; /// Descriptor for `DataPacket`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List dataPacketDescriptor = $convert.base64Decode( - 'CgpEYXRhUGFja2V0EiwKBGtpbmQYASABKA4yGC5saXZla2l0LkRhdGFQYWNrZXQuS2luZFIEa2luZBIpCgR1c2VyGAIgASgLMhMubGl2ZWtpdC5Vc2VyUGFja2V0SABSBHVzZXISOAoHc3BlYWtlchgDIAEoCzIcLmxpdmVraXQuQWN0aXZlU3BlYWtlclVwZGF0ZUgAUgdzcGVha2VyIh8KBEtpbmQSDAoIUkVMSUFCTEUQABIJCgVMT1NTWRABQgcKBXZhbHVl'); +final $typed_data.Uint8List dataPacketDescriptor = $convert.base64Decode('CgpEYXRhUGFja2V0EiwKBGtpbmQYASABKA4yGC5saXZla2l0LkRhdGFQYWNrZXQuS2luZFIEa2luZBIpCgR1c2VyGAIgASgLMhMubGl2ZWtpdC5Vc2VyUGFja2V0SABSBHVzZXISOAoHc3BlYWtlchgDIAEoCzIcLmxpdmVraXQuQWN0aXZlU3BlYWtlclVwZGF0ZUgAUgdzcGVha2VyIh8KBEtpbmQSDAoIUkVMSUFCTEUQABIJCgVMT1NTWRABQgcKBXZhbHVl'); @$core.Deprecated('Use activeSpeakerUpdateDescriptor instead') const ActiveSpeakerUpdate$json = const { '1': 'ActiveSpeakerUpdate', @@ -154,8 +126,7 @@ const ActiveSpeakerUpdate$json = const { }; /// Descriptor for `ActiveSpeakerUpdate`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List activeSpeakerUpdateDescriptor = $convert.base64Decode( - 'ChNBY3RpdmVTcGVha2VyVXBkYXRlEjAKCHNwZWFrZXJzGAEgAygLMhQubGl2ZWtpdC5TcGVha2VySW5mb1IIc3BlYWtlcnM='); +final $typed_data.Uint8List activeSpeakerUpdateDescriptor = $convert.base64Decode('ChNBY3RpdmVTcGVha2VyVXBkYXRlEjAKCHNwZWFrZXJzGAEgAygLMhQubGl2ZWtpdC5TcGVha2VySW5mb1IIc3BlYWtlcnM='); @$core.Deprecated('Use speakerInfoDescriptor instead') const SpeakerInfo$json = const { '1': 'SpeakerInfo', @@ -167,8 +138,7 @@ const SpeakerInfo$json = const { }; /// Descriptor for `SpeakerInfo`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List speakerInfoDescriptor = $convert.base64Decode( - 'CgtTcGVha2VySW5mbxIQCgNzaWQYASABKAlSA3NpZBIUCgVsZXZlbBgCIAEoAlIFbGV2ZWwSFgoGYWN0aXZlGAMgASgIUgZhY3RpdmU='); +final $typed_data.Uint8List speakerInfoDescriptor = $convert.base64Decode('CgtTcGVha2VySW5mbxIQCgNzaWQYASABKAlSA3NpZBIUCgVsZXZlbBgCIAEoAlIFbGV2ZWwSFgoGYWN0aXZlGAMgASgIUgZhY3RpdmU='); @$core.Deprecated('Use userPacketDescriptor instead') const UserPacket$json = const { '1': 'UserPacket', @@ -180,5 +150,17 @@ const UserPacket$json = const { }; /// Descriptor for `UserPacket`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List userPacketDescriptor = $convert.base64Decode( - 'CgpVc2VyUGFja2V0EicKD3BhcnRpY2lwYW50X3NpZBgBIAEoCVIOcGFydGljaXBhbnRTaWQSGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBIpChBkZXN0aW5hdGlvbl9zaWRzGAMgAygJUg9kZXN0aW5hdGlvblNpZHM='); +final $typed_data.Uint8List userPacketDescriptor = $convert.base64Decode('CgpVc2VyUGFja2V0EicKD3BhcnRpY2lwYW50X3NpZBgBIAEoCVIOcGFydGljaXBhbnRTaWQSGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBIpChBkZXN0aW5hdGlvbl9zaWRzGAMgAygJUg9kZXN0aW5hdGlvblNpZHM='); +@$core.Deprecated('Use recordingResultDescriptor instead') +const RecordingResult$json = const { + '1': 'RecordingResult', + '2': const [ + const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + const {'1': 'error', '3': 2, '4': 1, '5': 9, '10': 'error'}, + const {'1': 'duration', '3': 3, '4': 1, '5': 3, '10': 'duration'}, + const {'1': 'location', '3': 4, '4': 1, '5': 9, '10': 'location'}, + ], +}; + +/// Descriptor for `RecordingResult`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List recordingResultDescriptor = $convert.base64Decode('Cg9SZWNvcmRpbmdSZXN1bHQSDgoCaWQYASABKAlSAmlkEhQKBWVycm9yGAIgASgJUgVlcnJvchIaCghkdXJhdGlvbhgDIAEoA1IIZHVyYXRpb24SGgoIbG9jYXRpb24YBCABKAlSCGxvY2F0aW9u'); diff --git a/lib/src/proto/livekit_models.pbserver.dart b/lib/src/proto/livekit_models.pbserver.dart index c28eba2de..e517cbf17 100644 --- a/lib/src/proto/livekit_models.pbserver.dart +++ b/lib/src/proto/livekit_models.pbserver.dart @@ -6,3 +6,4 @@ // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_this,unused_import,unused_shown_name export 'livekit_models.pb.dart'; + diff --git a/lib/src/proto/livekit_rtc.pb.dart b/lib/src/proto/livekit_rtc.pb.dart index 42dab15bd..a797988ea 100644 --- a/lib/src/proto/livekit_rtc.pb.dart +++ b/lib/src/proto/livekit_rtc.pb.dart @@ -17,65 +17,44 @@ import 'livekit_rtc.pbenum.dart'; export 'livekit_rtc.pbenum.dart'; enum SignalRequest_Message { - offer, - answer, - trickle, - addTrack, - mute, - subscription, - trackSetting, - leave, - simulcast, + offer, + answer, + trickle, + addTrack, + mute, + subscription, + trackSetting, + leave, + simulcast, notSet } class SignalRequest extends $pb.GeneratedMessage { static const $core.Map<$core.int, SignalRequest_Message> _SignalRequest_MessageByTag = { - 1: SignalRequest_Message.offer, - 2: SignalRequest_Message.answer, - 3: SignalRequest_Message.trickle, - 4: SignalRequest_Message.addTrack, - 5: SignalRequest_Message.mute, - 6: SignalRequest_Message.subscription, - 7: SignalRequest_Message.trackSetting, - 8: SignalRequest_Message.leave, - 9: SignalRequest_Message.simulcast, - 0: SignalRequest_Message.notSet + 1 : SignalRequest_Message.offer, + 2 : SignalRequest_Message.answer, + 3 : SignalRequest_Message.trickle, + 4 : SignalRequest_Message.addTrack, + 5 : SignalRequest_Message.mute, + 6 : SignalRequest_Message.subscription, + 7 : SignalRequest_Message.trackSetting, + 8 : SignalRequest_Message.leave, + 9 : SignalRequest_Message.simulcast, + 0 : SignalRequest_Message.notSet }; - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SignalRequest', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SignalRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9]) - ..aOM( - 1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offer', - subBuilder: SessionDescription.create) - ..aOM( - 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'answer', - subBuilder: SessionDescription.create) - ..aOM( - 3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trickle', - subBuilder: TrickleRequest.create) - ..aOM( - 4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'addTrack', - subBuilder: AddTrackRequest.create) - ..aOM( - 5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mute', - subBuilder: MuteTrackRequest.create) - ..aOM( - 6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscription', - subBuilder: UpdateSubscription.create) - ..aOM( - 7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSetting', - subBuilder: UpdateTrackSettings.create) - ..aOM( - 8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'leave', - subBuilder: LeaveRequest.create) - ..aOM( - 9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'simulcast', - subBuilder: SetSimulcastLayers.create) - ..hasRequiredFields = false; + ..aOM(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offer', subBuilder: SessionDescription.create) + ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'answer', subBuilder: SessionDescription.create) + ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trickle', subBuilder: TrickleRequest.create) + ..aOM(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'addTrack', subBuilder: AddTrackRequest.create) + ..aOM(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mute', subBuilder: MuteTrackRequest.create) + ..aOM(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscription', subBuilder: UpdateSubscription.create) + ..aOM(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSetting', subBuilder: UpdateTrackSettings.create) + ..aOM(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'leave', subBuilder: LeaveRequest.create) + ..aOM(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'simulcast', subBuilder: SetSimulcastLayers.create) + ..hasRequiredFields = false + ; SignalRequest._() : super(); factory SignalRequest({ @@ -119,30 +98,25 @@ class SignalRequest extends $pb.GeneratedMessage { } return _result; } - factory SignalRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory SignalRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SignalRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SignalRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SignalRequest clone() => SignalRequest()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SignalRequest copyWith(void Function(SignalRequest) updates) => - super.copyWith((message) => updates(message as SignalRequest)) - as SignalRequest; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SignalRequest copyWith(void Function(SignalRequest) updates) => super.copyWith((message) => updates(message as SignalRequest)) as SignalRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SignalRequest create() => SignalRequest._(); SignalRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SignalRequest getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SignalRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SignalRequest? _defaultInstance; SignalRequest_Message whichMessage() => _SignalRequest_MessageByTag[$_whichOneof(0)]!; @@ -151,10 +125,7 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) SessionDescription get offer => $_getN(0); @$pb.TagNumber(1) - set offer(SessionDescription v) { - setField(1, v); - } - + set offer(SessionDescription v) { setField(1, v); } @$pb.TagNumber(1) $core.bool hasOffer() => $_has(0); @$pb.TagNumber(1) @@ -165,10 +136,7 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) SessionDescription get answer => $_getN(1); @$pb.TagNumber(2) - set answer(SessionDescription v) { - setField(2, v); - } - + set answer(SessionDescription v) { setField(2, v); } @$pb.TagNumber(2) $core.bool hasAnswer() => $_has(1); @$pb.TagNumber(2) @@ -179,10 +147,7 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) TrickleRequest get trickle => $_getN(2); @$pb.TagNumber(3) - set trickle(TrickleRequest v) { - setField(3, v); - } - + set trickle(TrickleRequest v) { setField(3, v); } @$pb.TagNumber(3) $core.bool hasTrickle() => $_has(2); @$pb.TagNumber(3) @@ -193,10 +158,7 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) AddTrackRequest get addTrack => $_getN(3); @$pb.TagNumber(4) - set addTrack(AddTrackRequest v) { - setField(4, v); - } - + set addTrack(AddTrackRequest v) { setField(4, v); } @$pb.TagNumber(4) $core.bool hasAddTrack() => $_has(3); @$pb.TagNumber(4) @@ -207,10 +169,7 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(5) MuteTrackRequest get mute => $_getN(4); @$pb.TagNumber(5) - set mute(MuteTrackRequest v) { - setField(5, v); - } - + set mute(MuteTrackRequest v) { setField(5, v); } @$pb.TagNumber(5) $core.bool hasMute() => $_has(4); @$pb.TagNumber(5) @@ -221,10 +180,7 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(6) UpdateSubscription get subscription => $_getN(5); @$pb.TagNumber(6) - set subscription(UpdateSubscription v) { - setField(6, v); - } - + set subscription(UpdateSubscription v) { setField(6, v); } @$pb.TagNumber(6) $core.bool hasSubscription() => $_has(5); @$pb.TagNumber(6) @@ -235,10 +191,7 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(7) UpdateTrackSettings get trackSetting => $_getN(6); @$pb.TagNumber(7) - set trackSetting(UpdateTrackSettings v) { - setField(7, v); - } - + set trackSetting(UpdateTrackSettings v) { setField(7, v); } @$pb.TagNumber(7) $core.bool hasTrackSetting() => $_has(6); @$pb.TagNumber(7) @@ -249,10 +202,7 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(8) LeaveRequest get leave => $_getN(7); @$pb.TagNumber(8) - set leave(LeaveRequest v) { - setField(8, v); - } - + set leave(LeaveRequest v) { setField(8, v); } @$pb.TagNumber(8) $core.bool hasLeave() => $_has(7); @$pb.TagNumber(8) @@ -263,10 +213,7 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(9) SetSimulcastLayers get simulcast => $_getN(8); @$pb.TagNumber(9) - set simulcast(SetSimulcastLayers v) { - setField(9, v); - } - + set simulcast(SetSimulcastLayers v) { setField(9, v); } @$pb.TagNumber(9) $core.bool hasSimulcast() => $_has(8); @$pb.TagNumber(9) @@ -276,65 +223,47 @@ class SignalRequest extends $pb.GeneratedMessage { } enum SignalResponse_Message { - join, - answer, - offer, - trickle, - update, - trackPublished, - speaker, - leave, - mute, + join, + answer, + offer, + trickle, + update, + trackPublished, + leave, + mute, + speakersChanged, + roomUpdate, notSet } class SignalResponse extends $pb.GeneratedMessage { static const $core.Map<$core.int, SignalResponse_Message> _SignalResponse_MessageByTag = { - 1: SignalResponse_Message.join, - 2: SignalResponse_Message.answer, - 3: SignalResponse_Message.offer, - 4: SignalResponse_Message.trickle, - 5: SignalResponse_Message.update, - 6: SignalResponse_Message.trackPublished, - 7: SignalResponse_Message.speaker, - 8: SignalResponse_Message.leave, - 9: SignalResponse_Message.mute, - 0: SignalResponse_Message.notSet + 1 : SignalResponse_Message.join, + 2 : SignalResponse_Message.answer, + 3 : SignalResponse_Message.offer, + 4 : SignalResponse_Message.trickle, + 5 : SignalResponse_Message.update, + 6 : SignalResponse_Message.trackPublished, + 8 : SignalResponse_Message.leave, + 9 : SignalResponse_Message.mute, + 10 : SignalResponse_Message.speakersChanged, + 11 : SignalResponse_Message.roomUpdate, + 0 : SignalResponse_Message.notSet }; - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SignalResponse', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) - ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9]) - ..aOM( - 1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'join', - subBuilder: JoinResponse.create) - ..aOM( - 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'answer', - subBuilder: SessionDescription.create) - ..aOM( - 3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offer', - subBuilder: SessionDescription.create) - ..aOM( - 4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trickle', - subBuilder: TrickleRequest.create) - ..aOM( - 5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'update', - subBuilder: ParticipantUpdate.create) - ..aOM( - 6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackPublished', - subBuilder: TrackPublishedResponse.create) - ..aOM<$0.ActiveSpeakerUpdate>( - 7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speaker', - subBuilder: $0.ActiveSpeakerUpdate.create) - ..aOM( - 8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'leave', - subBuilder: LeaveRequest.create) - ..aOM( - 9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mute', - subBuilder: MuteTrackRequest.create) - ..hasRequiredFields = false; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SignalResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + ..oo(0, [1, 2, 3, 4, 5, 6, 8, 9, 10, 11]) + ..aOM(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'join', subBuilder: JoinResponse.create) + ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'answer', subBuilder: SessionDescription.create) + ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offer', subBuilder: SessionDescription.create) + ..aOM(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trickle', subBuilder: TrickleRequest.create) + ..aOM(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'update', subBuilder: ParticipantUpdate.create) + ..aOM(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackPublished', subBuilder: TrackPublishedResponse.create) + ..aOM(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'leave', subBuilder: LeaveRequest.create) + ..aOM(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mute', subBuilder: MuteTrackRequest.create) + ..aOM(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakersChanged', subBuilder: SpeakersChanged.create) + ..aOM(11, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'roomUpdate', subBuilder: RoomUpdate.create) + ..hasRequiredFields = false + ; SignalResponse._() : super(); factory SignalResponse({ @@ -344,9 +273,10 @@ class SignalResponse extends $pb.GeneratedMessage { TrickleRequest? trickle, ParticipantUpdate? update, TrackPublishedResponse? trackPublished, - $0.ActiveSpeakerUpdate? speaker, LeaveRequest? leave, MuteTrackRequest? mute, + SpeakersChanged? speakersChanged, + RoomUpdate? roomUpdate, }) { final _result = create(); if (join != null) { @@ -367,41 +297,39 @@ class SignalResponse extends $pb.GeneratedMessage { if (trackPublished != null) { _result.trackPublished = trackPublished; } - if (speaker != null) { - _result.speaker = speaker; - } if (leave != null) { _result.leave = leave; } if (mute != null) { _result.mute = mute; } + if (speakersChanged != null) { + _result.speakersChanged = speakersChanged; + } + if (roomUpdate != null) { + _result.roomUpdate = roomUpdate; + } return _result; } - factory SignalResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory SignalResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SignalResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SignalResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SignalResponse clone() => SignalResponse()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SignalResponse copyWith(void Function(SignalResponse) updates) => - super.copyWith((message) => updates(message as SignalResponse)) - as SignalResponse; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SignalResponse copyWith(void Function(SignalResponse) updates) => super.copyWith((message) => updates(message as SignalResponse)) as SignalResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SignalResponse create() => SignalResponse._(); SignalResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SignalResponse getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SignalResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SignalResponse? _defaultInstance; SignalResponse_Message whichMessage() => _SignalResponse_MessageByTag[$_whichOneof(0)]!; @@ -410,10 +338,7 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(1) JoinResponse get join => $_getN(0); @$pb.TagNumber(1) - set join(JoinResponse v) { - setField(1, v); - } - + set join(JoinResponse v) { setField(1, v); } @$pb.TagNumber(1) $core.bool hasJoin() => $_has(0); @$pb.TagNumber(1) @@ -424,10 +349,7 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) SessionDescription get answer => $_getN(1); @$pb.TagNumber(2) - set answer(SessionDescription v) { - setField(2, v); - } - + set answer(SessionDescription v) { setField(2, v); } @$pb.TagNumber(2) $core.bool hasAnswer() => $_has(1); @$pb.TagNumber(2) @@ -438,10 +360,7 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(3) SessionDescription get offer => $_getN(2); @$pb.TagNumber(3) - set offer(SessionDescription v) { - setField(3, v); - } - + set offer(SessionDescription v) { setField(3, v); } @$pb.TagNumber(3) $core.bool hasOffer() => $_has(2); @$pb.TagNumber(3) @@ -452,10 +371,7 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(4) TrickleRequest get trickle => $_getN(3); @$pb.TagNumber(4) - set trickle(TrickleRequest v) { - setField(4, v); - } - + set trickle(TrickleRequest v) { setField(4, v); } @$pb.TagNumber(4) $core.bool hasTrickle() => $_has(3); @$pb.TagNumber(4) @@ -466,10 +382,7 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(5) ParticipantUpdate get update => $_getN(4); @$pb.TagNumber(5) - set update(ParticipantUpdate v) { - setField(5, v); - } - + set update(ParticipantUpdate v) { setField(5, v); } @$pb.TagNumber(5) $core.bool hasUpdate() => $_has(4); @$pb.TagNumber(5) @@ -480,10 +393,7 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(6) TrackPublishedResponse get trackPublished => $_getN(5); @$pb.TagNumber(6) - set trackPublished(TrackPublishedResponse v) { - setField(6, v); - } - + set trackPublished(TrackPublishedResponse v) { setField(6, v); } @$pb.TagNumber(6) $core.bool hasTrackPublished() => $_has(5); @$pb.TagNumber(6) @@ -491,70 +401,61 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(6) TrackPublishedResponse ensureTrackPublished() => $_ensure(5); - @$pb.TagNumber(7) - $0.ActiveSpeakerUpdate get speaker => $_getN(6); - @$pb.TagNumber(7) - set speaker($0.ActiveSpeakerUpdate v) { - setField(7, v); - } - - @$pb.TagNumber(7) - $core.bool hasSpeaker() => $_has(6); - @$pb.TagNumber(7) - void clearSpeaker() => clearField(7); - @$pb.TagNumber(7) - $0.ActiveSpeakerUpdate ensureSpeaker() => $_ensure(6); - @$pb.TagNumber(8) - LeaveRequest get leave => $_getN(7); + LeaveRequest get leave => $_getN(6); @$pb.TagNumber(8) - set leave(LeaveRequest v) { - setField(8, v); - } - + set leave(LeaveRequest v) { setField(8, v); } @$pb.TagNumber(8) - $core.bool hasLeave() => $_has(7); + $core.bool hasLeave() => $_has(6); @$pb.TagNumber(8) void clearLeave() => clearField(8); @$pb.TagNumber(8) - LeaveRequest ensureLeave() => $_ensure(7); + LeaveRequest ensureLeave() => $_ensure(6); @$pb.TagNumber(9) - MuteTrackRequest get mute => $_getN(8); + MuteTrackRequest get mute => $_getN(7); @$pb.TagNumber(9) - set mute(MuteTrackRequest v) { - setField(9, v); - } - + set mute(MuteTrackRequest v) { setField(9, v); } @$pb.TagNumber(9) - $core.bool hasMute() => $_has(8); + $core.bool hasMute() => $_has(7); @$pb.TagNumber(9) void clearMute() => clearField(9); @$pb.TagNumber(9) - MuteTrackRequest ensureMute() => $_ensure(8); + MuteTrackRequest ensureMute() => $_ensure(7); + + @$pb.TagNumber(10) + SpeakersChanged get speakersChanged => $_getN(8); + @$pb.TagNumber(10) + set speakersChanged(SpeakersChanged v) { setField(10, v); } + @$pb.TagNumber(10) + $core.bool hasSpeakersChanged() => $_has(8); + @$pb.TagNumber(10) + void clearSpeakersChanged() => clearField(10); + @$pb.TagNumber(10) + SpeakersChanged ensureSpeakersChanged() => $_ensure(8); + + @$pb.TagNumber(11) + RoomUpdate get roomUpdate => $_getN(9); + @$pb.TagNumber(11) + set roomUpdate(RoomUpdate v) { setField(11, v); } + @$pb.TagNumber(11) + $core.bool hasRoomUpdate() => $_has(9); + @$pb.TagNumber(11) + void clearRoomUpdate() => clearField(11); + @$pb.TagNumber(11) + RoomUpdate ensureRoomUpdate() => $_ensure(9); } class AddTrackRequest extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AddTrackRequest', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AddTrackRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cid') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') - ..e<$0.TrackType>( - 3, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', - $pb.PbFieldType.OE, - defaultOrMaker: $0.TrackType.AUDIO, - valueOf: $0.TrackType.valueOf, - enumValues: $0.TrackType.values) - ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', - $pb.PbFieldType.OU3) - ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', - $pb.PbFieldType.OU3) + ..e<$0.TrackType>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', $pb.PbFieldType.OE, defaultOrMaker: $0.TrackType.AUDIO, valueOf: $0.TrackType.valueOf, enumValues: $0.TrackType.values) + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.OU3) + ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.OU3) ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'muted') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; AddTrackRequest._() : super(); factory AddTrackRequest({ @@ -586,39 +487,31 @@ class AddTrackRequest extends $pb.GeneratedMessage { } return _result; } - factory AddTrackRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory AddTrackRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory AddTrackRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory AddTrackRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') AddTrackRequest clone() => AddTrackRequest()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - AddTrackRequest copyWith(void Function(AddTrackRequest) updates) => - super.copyWith((message) => updates(message as AddTrackRequest)) - as AddTrackRequest; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + AddTrackRequest copyWith(void Function(AddTrackRequest) updates) => super.copyWith((message) => updates(message as AddTrackRequest)) as AddTrackRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static AddTrackRequest create() => AddTrackRequest._(); AddTrackRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static AddTrackRequest getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static AddTrackRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static AddTrackRequest? _defaultInstance; @$pb.TagNumber(1) $core.String get cid => $_getSZ(0); @$pb.TagNumber(1) - set cid($core.String v) { - $_setString(0, v); - } - + set cid($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasCid() => $_has(0); @$pb.TagNumber(1) @@ -627,10 +520,7 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get name => $_getSZ(1); @$pb.TagNumber(2) - set name($core.String v) { - $_setString(1, v); - } - + set name($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) $core.bool hasName() => $_has(1); @$pb.TagNumber(2) @@ -639,10 +529,7 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $0.TrackType get type => $_getN(2); @$pb.TagNumber(3) - set type($0.TrackType v) { - setField(3, v); - } - + set type($0.TrackType v) { setField(3, v); } @$pb.TagNumber(3) $core.bool hasType() => $_has(2); @$pb.TagNumber(3) @@ -651,10 +538,7 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.int get width => $_getIZ(3); @$pb.TagNumber(4) - set width($core.int v) { - $_setUnsignedInt32(3, v); - } - + set width($core.int v) { $_setUnsignedInt32(3, v); } @$pb.TagNumber(4) $core.bool hasWidth() => $_has(3); @$pb.TagNumber(4) @@ -663,10 +547,7 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.int get height => $_getIZ(4); @$pb.TagNumber(5) - set height($core.int v) { - $_setUnsignedInt32(4, v); - } - + set height($core.int v) { $_setUnsignedInt32(4, v); } @$pb.TagNumber(5) $core.bool hasHeight() => $_has(4); @$pb.TagNumber(5) @@ -675,10 +556,7 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.bool get muted => $_getBF(5); @$pb.TagNumber(6) - set muted($core.bool v) { - $_setBool(5, v); - } - + set muted($core.bool v) { $_setBool(5, v); } @$pb.TagNumber(6) $core.bool hasMuted() => $_has(5); @$pb.TagNumber(6) @@ -686,21 +564,11 @@ class AddTrackRequest extends $pb.GeneratedMessage { } class TrickleRequest extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrickleRequest', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'candidateInit', - protoName: 'candidateInit') - ..e( - 2, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'target', - $pb.PbFieldType.OE, - defaultOrMaker: SignalTarget.PUBLISHER, - valueOf: SignalTarget.valueOf, - enumValues: SignalTarget.values) - ..hasRequiredFields = false; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrickleRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'candidateInit', protoName: 'candidateInit') + ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'target', $pb.PbFieldType.OE, defaultOrMaker: SignalTarget.PUBLISHER, valueOf: SignalTarget.valueOf, enumValues: SignalTarget.values) + ..hasRequiredFields = false + ; TrickleRequest._() : super(); factory TrickleRequest({ @@ -716,39 +584,31 @@ class TrickleRequest extends $pb.GeneratedMessage { } return _result; } - factory TrickleRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory TrickleRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory TrickleRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory TrickleRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') TrickleRequest clone() => TrickleRequest()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - TrickleRequest copyWith(void Function(TrickleRequest) updates) => - super.copyWith((message) => updates(message as TrickleRequest)) - as TrickleRequest; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TrickleRequest copyWith(void Function(TrickleRequest) updates) => super.copyWith((message) => updates(message as TrickleRequest)) as TrickleRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static TrickleRequest create() => TrickleRequest._(); TrickleRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static TrickleRequest getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TrickleRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static TrickleRequest? _defaultInstance; @$pb.TagNumber(1) $core.String get candidateInit => $_getSZ(0); @$pb.TagNumber(1) - set candidateInit($core.String v) { - $_setString(0, v); - } - + set candidateInit($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasCandidateInit() => $_has(0); @$pb.TagNumber(1) @@ -757,10 +617,7 @@ class TrickleRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) SignalTarget get target => $_getN(1); @$pb.TagNumber(2) - set target(SignalTarget v) { - setField(2, v); - } - + set target(SignalTarget v) { setField(2, v); } @$pb.TagNumber(2) $core.bool hasTarget() => $_has(1); @$pb.TagNumber(2) @@ -768,14 +625,11 @@ class TrickleRequest extends $pb.GeneratedMessage { } class MuteTrackRequest extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MuteTrackRequest', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MuteTrackRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'muted') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; MuteTrackRequest._() : super(); factory MuteTrackRequest({ @@ -791,39 +645,31 @@ class MuteTrackRequest extends $pb.GeneratedMessage { } return _result; } - factory MuteTrackRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory MuteTrackRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory MuteTrackRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory MuteTrackRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') MuteTrackRequest clone() => MuteTrackRequest()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - MuteTrackRequest copyWith(void Function(MuteTrackRequest) updates) => - super.copyWith((message) => updates(message as MuteTrackRequest)) - as MuteTrackRequest; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + MuteTrackRequest copyWith(void Function(MuteTrackRequest) updates) => super.copyWith((message) => updates(message as MuteTrackRequest)) as MuteTrackRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static MuteTrackRequest create() => MuteTrackRequest._(); MuteTrackRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static MuteTrackRequest getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static MuteTrackRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static MuteTrackRequest? _defaultInstance; @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { - $_setString(0, v); - } - + set sid($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -832,10 +678,7 @@ class MuteTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.bool get muted => $_getBF(1); @$pb.TagNumber(2) - set muted($core.bool v) { - $_setBool(1, v); - } - + set muted($core.bool v) { $_setBool(1, v); } @$pb.TagNumber(2) $core.bool hasMuted() => $_has(1); @$pb.TagNumber(2) @@ -843,19 +686,11 @@ class MuteTrackRequest extends $pb.GeneratedMessage { } class SetSimulcastLayers extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SetSimulcastLayers', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SetSimulcastLayers', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSid') - ..pc( - 2, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'layers', - $pb.PbFieldType.PE, - valueOf: VideoQuality.valueOf, - enumValues: VideoQuality.values) - ..hasRequiredFields = false; + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'layers', $pb.PbFieldType.PE, valueOf: VideoQuality.valueOf, enumValues: VideoQuality.values, defaultEnumValue: VideoQuality.LOW) + ..hasRequiredFields = false + ; SetSimulcastLayers._() : super(); factory SetSimulcastLayers({ @@ -871,39 +706,31 @@ class SetSimulcastLayers extends $pb.GeneratedMessage { } return _result; } - factory SetSimulcastLayers.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory SetSimulcastLayers.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SetSimulcastLayers.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SetSimulcastLayers.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SetSimulcastLayers clone() => SetSimulcastLayers()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SetSimulcastLayers copyWith(void Function(SetSimulcastLayers) updates) => - super.copyWith((message) => updates(message as SetSimulcastLayers)) - as SetSimulcastLayers; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SetSimulcastLayers copyWith(void Function(SetSimulcastLayers) updates) => super.copyWith((message) => updates(message as SetSimulcastLayers)) as SetSimulcastLayers; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SetSimulcastLayers create() => SetSimulcastLayers._(); SetSimulcastLayers createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SetSimulcastLayers getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SetSimulcastLayers getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SetSimulcastLayers? _defaultInstance; @$pb.TagNumber(1) $core.String get trackSid => $_getSZ(0); @$pb.TagNumber(1) - set trackSid($core.String v) { - $_setString(0, v); - } - + set trackSid($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasTrackSid() => $_has(0); @$pb.TagNumber(1) @@ -914,30 +741,15 @@ class SetSimulcastLayers extends $pb.GeneratedMessage { } class JoinResponse extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'JoinResponse', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) - ..aOM<$0.Room>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'room', - subBuilder: $0.Room.create) - ..aOM<$0.ParticipantInfo>( - 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participant', - subBuilder: $0.ParticipantInfo.create) - ..pc<$0.ParticipantInfo>( - 3, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'otherParticipants', - $pb.PbFieldType.PM, - subBuilder: $0.ParticipantInfo.create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'JoinResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + ..aOM<$0.Room>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'room', subBuilder: $0.Room.create) + ..aOM<$0.ParticipantInfo>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participant', subBuilder: $0.ParticipantInfo.create) + ..pc<$0.ParticipantInfo>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'otherParticipants', $pb.PbFieldType.PM, subBuilder: $0.ParticipantInfo.create) ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serverVersion') - ..pc( - 5, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'iceServers', - $pb.PbFieldType.PM, - subBuilder: ICEServer.create) - ..aOB( - 6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscriberPrimary') - ..hasRequiredFields = false; + ..pc(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'iceServers', $pb.PbFieldType.PM, subBuilder: ICEServer.create) + ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscriberPrimary') + ..hasRequiredFields = false + ; JoinResponse._() : super(); factory JoinResponse({ @@ -969,39 +781,31 @@ class JoinResponse extends $pb.GeneratedMessage { } return _result; } - factory JoinResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory JoinResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory JoinResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory JoinResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') JoinResponse clone() => JoinResponse()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - JoinResponse copyWith(void Function(JoinResponse) updates) => - super.copyWith((message) => updates(message as JoinResponse)) - as JoinResponse; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + JoinResponse copyWith(void Function(JoinResponse) updates) => super.copyWith((message) => updates(message as JoinResponse)) as JoinResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static JoinResponse create() => JoinResponse._(); JoinResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static JoinResponse getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static JoinResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static JoinResponse? _defaultInstance; @$pb.TagNumber(1) $0.Room get room => $_getN(0); @$pb.TagNumber(1) - set room($0.Room v) { - setField(1, v); - } - + set room($0.Room v) { setField(1, v); } @$pb.TagNumber(1) $core.bool hasRoom() => $_has(0); @$pb.TagNumber(1) @@ -1012,10 +816,7 @@ class JoinResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $0.ParticipantInfo get participant => $_getN(1); @$pb.TagNumber(2) - set participant($0.ParticipantInfo v) { - setField(2, v); - } - + set participant($0.ParticipantInfo v) { setField(2, v); } @$pb.TagNumber(2) $core.bool hasParticipant() => $_has(1); @$pb.TagNumber(2) @@ -1029,10 +830,7 @@ class JoinResponse extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get serverVersion => $_getSZ(3); @$pb.TagNumber(4) - set serverVersion($core.String v) { - $_setString(3, v); - } - + set serverVersion($core.String v) { $_setString(3, v); } @$pb.TagNumber(4) $core.bool hasServerVersion() => $_has(3); @$pb.TagNumber(4) @@ -1044,10 +842,7 @@ class JoinResponse extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.bool get subscriberPrimary => $_getBF(5); @$pb.TagNumber(6) - set subscriberPrimary($core.bool v) { - $_setBool(5, v); - } - + set subscriberPrimary($core.bool v) { $_setBool(5, v); } @$pb.TagNumber(6) $core.bool hasSubscriberPrimary() => $_has(5); @$pb.TagNumber(6) @@ -1055,18 +850,11 @@ class JoinResponse extends $pb.GeneratedMessage { } class TrackPublishedResponse extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') - ? '' - : 'TrackPublishedResponse', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrackPublishedResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cid') - ..aOM<$0.TrackInfo>( - 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'track', - subBuilder: $0.TrackInfo.create) - ..hasRequiredFields = false; + ..aOM<$0.TrackInfo>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'track', subBuilder: $0.TrackInfo.create) + ..hasRequiredFields = false + ; TrackPublishedResponse._() : super(); factory TrackPublishedResponse({ @@ -1082,40 +870,31 @@ class TrackPublishedResponse extends $pb.GeneratedMessage { } return _result; } - factory TrackPublishedResponse.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory TrackPublishedResponse.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory TrackPublishedResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory TrackPublishedResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') TrackPublishedResponse clone() => TrackPublishedResponse()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - TrackPublishedResponse copyWith(void Function(TrackPublishedResponse) updates) => - super.copyWith((message) => updates(message as TrackPublishedResponse)) - as TrackPublishedResponse; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TrackPublishedResponse copyWith(void Function(TrackPublishedResponse) updates) => super.copyWith((message) => updates(message as TrackPublishedResponse)) as TrackPublishedResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static TrackPublishedResponse create() => TrackPublishedResponse._(); TrackPublishedResponse createEmptyInstance() => create(); - static $pb.PbList createRepeated() => - $pb.PbList(); + static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static TrackPublishedResponse getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TrackPublishedResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static TrackPublishedResponse? _defaultInstance; @$pb.TagNumber(1) $core.String get cid => $_getSZ(0); @$pb.TagNumber(1) - set cid($core.String v) { - $_setString(0, v); - } - + set cid($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasCid() => $_has(0); @$pb.TagNumber(1) @@ -1124,10 +903,7 @@ class TrackPublishedResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $0.TrackInfo get track => $_getN(1); @$pb.TagNumber(2) - set track($0.TrackInfo v) { - setField(2, v); - } - + set track($0.TrackInfo v) { setField(2, v); } @$pb.TagNumber(2) $core.bool hasTrack() => $_has(1); @$pb.TagNumber(2) @@ -1137,14 +913,11 @@ class TrackPublishedResponse extends $pb.GeneratedMessage { } class SessionDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SessionDescription', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SessionDescription', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdp') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; SessionDescription._() : super(); factory SessionDescription({ @@ -1160,39 +933,31 @@ class SessionDescription extends $pb.GeneratedMessage { } return _result; } - factory SessionDescription.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory SessionDescription.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SessionDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SessionDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SessionDescription clone() => SessionDescription()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SessionDescription copyWith(void Function(SessionDescription) updates) => - super.copyWith((message) => updates(message as SessionDescription)) - as SessionDescription; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SessionDescription copyWith(void Function(SessionDescription) updates) => super.copyWith((message) => updates(message as SessionDescription)) as SessionDescription; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SessionDescription create() => SessionDescription._(); SessionDescription createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SessionDescription getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SessionDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SessionDescription? _defaultInstance; @$pb.TagNumber(1) $core.String get type => $_getSZ(0); @$pb.TagNumber(1) - set type($core.String v) { - $_setString(0, v); - } - + set type($core.String v) { $_setString(0, v); } @$pb.TagNumber(1) $core.bool hasType() => $_has(0); @$pb.TagNumber(1) @@ -1201,10 +966,7 @@ class SessionDescription extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get sdp => $_getSZ(1); @$pb.TagNumber(2) - set sdp($core.String v) { - $_setString(1, v); - } - + set sdp($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) $core.bool hasSdp() => $_has(1); @$pb.TagNumber(2) @@ -1212,17 +974,10 @@ class SessionDescription extends $pb.GeneratedMessage { } class ParticipantUpdate extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ParticipantUpdate', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) - ..pc<$0.ParticipantInfo>( - 1, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participants', - $pb.PbFieldType.PM, - subBuilder: $0.ParticipantInfo.create) - ..hasRequiredFields = false; + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ParticipantUpdate', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + ..pc<$0.ParticipantInfo>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participants', $pb.PbFieldType.PM, subBuilder: $0.ParticipantInfo.create) + ..hasRequiredFields = false + ; ParticipantUpdate._() : super(); factory ParticipantUpdate({ @@ -1234,30 +989,25 @@ class ParticipantUpdate extends $pb.GeneratedMessage { } return _result; } - factory ParticipantUpdate.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ParticipantUpdate.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory ParticipantUpdate.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ParticipantUpdate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') ParticipantUpdate clone() => ParticipantUpdate()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - ParticipantUpdate copyWith(void Function(ParticipantUpdate) updates) => - super.copyWith((message) => updates(message as ParticipantUpdate)) - as ParticipantUpdate; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ParticipantUpdate copyWith(void Function(ParticipantUpdate) updates) => super.copyWith((message) => updates(message as ParticipantUpdate)) as ParticipantUpdate; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ParticipantUpdate create() => ParticipantUpdate._(); ParticipantUpdate createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static ParticipantUpdate getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ParticipantUpdate getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static ParticipantUpdate? _defaultInstance; @$pb.TagNumber(1) @@ -1265,14 +1015,11 @@ class ParticipantUpdate extends $pb.GeneratedMessage { } class UpdateSubscription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateSubscription', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateSubscription', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSids') ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscribe') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; UpdateSubscription._() : super(); factory UpdateSubscription({ @@ -1288,30 +1035,25 @@ class UpdateSubscription extends $pb.GeneratedMessage { } return _result; } - factory UpdateSubscription.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory UpdateSubscription.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory UpdateSubscription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory UpdateSubscription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') UpdateSubscription clone() => UpdateSubscription()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - UpdateSubscription copyWith(void Function(UpdateSubscription) updates) => - super.copyWith((message) => updates(message as UpdateSubscription)) - as UpdateSubscription; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + UpdateSubscription copyWith(void Function(UpdateSubscription) updates) => super.copyWith((message) => updates(message as UpdateSubscription)) as UpdateSubscription; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static UpdateSubscription create() => UpdateSubscription._(); UpdateSubscription createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static UpdateSubscription getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static UpdateSubscription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static UpdateSubscription? _defaultInstance; @$pb.TagNumber(1) @@ -1320,10 +1062,7 @@ class UpdateSubscription extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.bool get subscribe => $_getBF(1); @$pb.TagNumber(2) - set subscribe($core.bool v) { - $_setBool(1, v); - } - + set subscribe($core.bool v) { $_setBool(1, v); } @$pb.TagNumber(2) $core.bool hasSubscribe() => $_has(1); @$pb.TagNumber(2) @@ -1331,21 +1070,12 @@ class UpdateSubscription extends $pb.GeneratedMessage { } class UpdateTrackSettings extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateTrackSettings', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateTrackSettings', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSids') ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disabled') - ..e( - 4, - const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'quality', - $pb.PbFieldType.OE, - defaultOrMaker: VideoQuality.LOW, - valueOf: VideoQuality.valueOf, - enumValues: VideoQuality.values) - ..hasRequiredFields = false; + ..e(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'quality', $pb.PbFieldType.OE, defaultOrMaker: VideoQuality.LOW, valueOf: VideoQuality.valueOf, enumValues: VideoQuality.values) + ..hasRequiredFields = false + ; UpdateTrackSettings._() : super(); factory UpdateTrackSettings({ @@ -1365,30 +1095,25 @@ class UpdateTrackSettings extends $pb.GeneratedMessage { } return _result; } - factory UpdateTrackSettings.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory UpdateTrackSettings.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory UpdateTrackSettings.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory UpdateTrackSettings.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') UpdateTrackSettings clone() => UpdateTrackSettings()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - UpdateTrackSettings copyWith(void Function(UpdateTrackSettings) updates) => - super.copyWith((message) => updates(message as UpdateTrackSettings)) - as UpdateTrackSettings; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + UpdateTrackSettings copyWith(void Function(UpdateTrackSettings) updates) => super.copyWith((message) => updates(message as UpdateTrackSettings)) as UpdateTrackSettings; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static UpdateTrackSettings create() => UpdateTrackSettings._(); UpdateTrackSettings createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static UpdateTrackSettings getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static UpdateTrackSettings getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static UpdateTrackSettings? _defaultInstance; @$pb.TagNumber(1) @@ -1397,10 +1122,7 @@ class UpdateTrackSettings extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.bool get disabled => $_getBF(1); @$pb.TagNumber(3) - set disabled($core.bool v) { - $_setBool(1, v); - } - + set disabled($core.bool v) { $_setBool(1, v); } @$pb.TagNumber(3) $core.bool hasDisabled() => $_has(1); @$pb.TagNumber(3) @@ -1409,10 +1131,7 @@ class UpdateTrackSettings extends $pb.GeneratedMessage { @$pb.TagNumber(4) VideoQuality get quality => $_getN(2); @$pb.TagNumber(4) - set quality(VideoQuality v) { - setField(4, v); - } - + set quality(VideoQuality v) { setField(4, v); } @$pb.TagNumber(4) $core.bool hasQuality() => $_has(2); @$pb.TagNumber(4) @@ -1420,13 +1139,10 @@ class UpdateTrackSettings extends $pb.GeneratedMessage { } class LeaveRequest extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'LeaveRequest', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'LeaveRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'canReconnect') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; LeaveRequest._() : super(); factory LeaveRequest({ @@ -1438,39 +1154,31 @@ class LeaveRequest extends $pb.GeneratedMessage { } return _result; } - factory LeaveRequest.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory LeaveRequest.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory LeaveRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory LeaveRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') LeaveRequest clone() => LeaveRequest()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - LeaveRequest copyWith(void Function(LeaveRequest) updates) => - super.copyWith((message) => updates(message as LeaveRequest)) - as LeaveRequest; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + LeaveRequest copyWith(void Function(LeaveRequest) updates) => super.copyWith((message) => updates(message as LeaveRequest)) as LeaveRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static LeaveRequest create() => LeaveRequest._(); LeaveRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static LeaveRequest getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static LeaveRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static LeaveRequest? _defaultInstance; @$pb.TagNumber(1) $core.bool get canReconnect => $_getBF(0); @$pb.TagNumber(1) - set canReconnect($core.bool v) { - $_setBool(0, v); - } - + set canReconnect($core.bool v) { $_setBool(0, v); } @$pb.TagNumber(1) $core.bool hasCanReconnect() => $_has(0); @$pb.TagNumber(1) @@ -1478,15 +1186,12 @@ class LeaveRequest extends $pb.GeneratedMessage { } class ICEServer extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ICEServer', - package: const $pb.PackageName( - const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), - createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ICEServer', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'urls') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'username') ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'credential') - ..hasRequiredFields = false; + ..hasRequiredFields = false + ; ICEServer._() : super(); factory ICEServer({ @@ -1506,30 +1211,25 @@ class ICEServer extends $pb.GeneratedMessage { } return _result; } - factory ICEServer.fromBuffer($core.List<$core.int> i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromBuffer(i, r); - factory ICEServer.fromJson($core.String i, - [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => - create()..mergeFromJson(i, r); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory ICEServer.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory ICEServer.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') ICEServer clone() => ICEServer()..mergeFromMessage(this); - @$core.Deprecated('Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - ICEServer copyWith(void Function(ICEServer) updates) => - super.copyWith((message) => updates(message as ICEServer)) - as ICEServer; // ignore: deprecated_member_use + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ICEServer copyWith(void Function(ICEServer) updates) => super.copyWith((message) => updates(message as ICEServer)) as ICEServer; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ICEServer create() => ICEServer._(); ICEServer createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static ICEServer getDefault() => - _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ICEServer getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static ICEServer? _defaultInstance; @$pb.TagNumber(1) @@ -1538,10 +1238,7 @@ class ICEServer extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get username => $_getSZ(1); @$pb.TagNumber(2) - set username($core.String v) { - $_setString(1, v); - } - + set username($core.String v) { $_setString(1, v); } @$pb.TagNumber(2) $core.bool hasUsername() => $_has(1); @$pb.TagNumber(2) @@ -1550,12 +1247,100 @@ class ICEServer extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get credential => $_getSZ(2); @$pb.TagNumber(3) - set credential($core.String v) { - $_setString(2, v); - } - + set credential($core.String v) { $_setString(2, v); } @$pb.TagNumber(3) $core.bool hasCredential() => $_has(2); @$pb.TagNumber(3) void clearCredential() => clearField(3); } + +class SpeakersChanged extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SpeakersChanged', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + ..pc<$0.SpeakerInfo>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakers', $pb.PbFieldType.PM, subBuilder: $0.SpeakerInfo.create) + ..hasRequiredFields = false + ; + + SpeakersChanged._() : super(); + factory SpeakersChanged({ + $core.Iterable<$0.SpeakerInfo>? speakers, + }) { + final _result = create(); + if (speakers != null) { + _result.speakers.addAll(speakers); + } + return _result; + } + factory SpeakersChanged.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory SpeakersChanged.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + SpeakersChanged clone() => SpeakersChanged()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SpeakersChanged copyWith(void Function(SpeakersChanged) updates) => super.copyWith((message) => updates(message as SpeakersChanged)) as SpeakersChanged; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static SpeakersChanged create() => SpeakersChanged._(); + SpeakersChanged createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static SpeakersChanged getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SpeakersChanged? _defaultInstance; + + @$pb.TagNumber(1) + $core.List<$0.SpeakerInfo> get speakers => $_getList(0); +} + +class RoomUpdate extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RoomUpdate', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + ..aOM<$0.Room>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'room', subBuilder: $0.Room.create) + ..hasRequiredFields = false + ; + + RoomUpdate._() : super(); + factory RoomUpdate({ + $0.Room? room, + }) { + final _result = create(); + if (room != null) { + _result.room = room; + } + return _result; + } + factory RoomUpdate.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory RoomUpdate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + RoomUpdate clone() => RoomUpdate()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RoomUpdate copyWith(void Function(RoomUpdate) updates) => super.copyWith((message) => updates(message as RoomUpdate)) as RoomUpdate; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static RoomUpdate create() => RoomUpdate._(); + RoomUpdate createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static RoomUpdate getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RoomUpdate? _defaultInstance; + + @$pb.TagNumber(1) + $0.Room get room => $_getN(0); + @$pb.TagNumber(1) + set room($0.Room v) { setField(1, v); } + @$pb.TagNumber(1) + $core.bool hasRoom() => $_has(0); + @$pb.TagNumber(1) + void clearRoom() => clearField(1); + @$pb.TagNumber(1) + $0.Room ensureRoom() => $_ensure(0); +} + diff --git a/lib/src/proto/livekit_rtc.pbenum.dart b/lib/src/proto/livekit_rtc.pbenum.dart index b95f930ad..5c10154fb 100644 --- a/lib/src/proto/livekit_rtc.pbenum.dart +++ b/lib/src/proto/livekit_rtc.pbenum.dart @@ -10,12 +10,10 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; class SignalTarget extends $pb.ProtobufEnum { - static const SignalTarget PUBLISHER = SignalTarget._( - 0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PUBLISHER'); - static const SignalTarget SUBSCRIBER = SignalTarget._( - 1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SUBSCRIBER'); + static const SignalTarget PUBLISHER = SignalTarget._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PUBLISHER'); + static const SignalTarget SUBSCRIBER = SignalTarget._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SUBSCRIBER'); - static const $core.List values = [ + static const $core.List values = [ PUBLISHER, SUBSCRIBER, ]; @@ -27,14 +25,11 @@ class SignalTarget extends $pb.ProtobufEnum { } class VideoQuality extends $pb.ProtobufEnum { - static const VideoQuality LOW = - VideoQuality._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LOW'); - static const VideoQuality MEDIUM = VideoQuality._( - 1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'MEDIUM'); - static const VideoQuality HIGH = - VideoQuality._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'HIGH'); - - static const $core.List values = [ + static const VideoQuality LOW = VideoQuality._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LOW'); + static const VideoQuality MEDIUM = VideoQuality._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'MEDIUM'); + static const VideoQuality HIGH = VideoQuality._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'HIGH'); + + static const $core.List values = [ LOW, MEDIUM, HIGH, @@ -45,3 +40,4 @@ class VideoQuality extends $pb.ProtobufEnum { const VideoQuality._($core.int v, $core.String n) : super(v, n); } + diff --git a/lib/src/proto/livekit_rtc.pbjson.dart b/lib/src/proto/livekit_rtc.pbjson.dart index 36b572d90..31d6dd3ac 100644 --- a/lib/src/proto/livekit_rtc.pbjson.dart +++ b/lib/src/proto/livekit_rtc.pbjson.dart @@ -8,7 +8,6 @@ import 'dart:core' as $core; import 'dart:convert' as $convert; import 'dart:typed_data' as $typed_data; - @$core.Deprecated('Use signalTargetDescriptor instead') const SignalTarget$json = const { '1': 'SignalTarget', @@ -19,8 +18,7 @@ const SignalTarget$json = const { }; /// Descriptor for `SignalTarget`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List signalTargetDescriptor = - $convert.base64Decode('CgxTaWduYWxUYXJnZXQSDQoJUFVCTElTSEVSEAASDgoKU1VCU0NSSUJFUhAB'); +final $typed_data.Uint8List signalTargetDescriptor = $convert.base64Decode('CgxTaWduYWxUYXJnZXQSDQoJUFVCTElTSEVSEAASDgoKU1VCU0NSSUJFUhAB'); @$core.Deprecated('Use videoQualityDescriptor instead') const VideoQuality$json = const { '1': 'VideoQuality', @@ -32,93 +30,20 @@ const VideoQuality$json = const { }; /// Descriptor for `VideoQuality`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List videoQualityDescriptor = - $convert.base64Decode('CgxWaWRlb1F1YWxpdHkSBwoDTE9XEAASCgoGTUVESVVNEAESCAoESElHSBAC'); +final $typed_data.Uint8List videoQualityDescriptor = $convert.base64Decode('CgxWaWRlb1F1YWxpdHkSBwoDTE9XEAASCgoGTUVESVVNEAESCAoESElHSBAC'); @$core.Deprecated('Use signalRequestDescriptor instead') const SignalRequest$json = const { '1': 'SignalRequest', '2': const [ - const { - '1': 'offer', - '3': 1, - '4': 1, - '5': 11, - '6': '.livekit.SessionDescription', - '9': 0, - '10': 'offer' - }, - const { - '1': 'answer', - '3': 2, - '4': 1, - '5': 11, - '6': '.livekit.SessionDescription', - '9': 0, - '10': 'answer' - }, - const { - '1': 'trickle', - '3': 3, - '4': 1, - '5': 11, - '6': '.livekit.TrickleRequest', - '9': 0, - '10': 'trickle' - }, - const { - '1': 'add_track', - '3': 4, - '4': 1, - '5': 11, - '6': '.livekit.AddTrackRequest', - '9': 0, - '10': 'addTrack' - }, - const { - '1': 'mute', - '3': 5, - '4': 1, - '5': 11, - '6': '.livekit.MuteTrackRequest', - '9': 0, - '10': 'mute' - }, - const { - '1': 'subscription', - '3': 6, - '4': 1, - '5': 11, - '6': '.livekit.UpdateSubscription', - '9': 0, - '10': 'subscription' - }, - const { - '1': 'track_setting', - '3': 7, - '4': 1, - '5': 11, - '6': '.livekit.UpdateTrackSettings', - '9': 0, - '10': 'trackSetting' - }, - const { - '1': 'leave', - '3': 8, - '4': 1, - '5': 11, - '6': '.livekit.LeaveRequest', - '9': 0, - '10': 'leave' - }, - const { - '1': 'simulcast', - '3': 9, - '4': 1, - '5': 11, - '6': '.livekit.SetSimulcastLayers', - '9': 0, - '10': 'simulcast' - }, + const {'1': 'offer', '3': 1, '4': 1, '5': 11, '6': '.livekit.SessionDescription', '9': 0, '10': 'offer'}, + const {'1': 'answer', '3': 2, '4': 1, '5': 11, '6': '.livekit.SessionDescription', '9': 0, '10': 'answer'}, + const {'1': 'trickle', '3': 3, '4': 1, '5': 11, '6': '.livekit.TrickleRequest', '9': 0, '10': 'trickle'}, + const {'1': 'add_track', '3': 4, '4': 1, '5': 11, '6': '.livekit.AddTrackRequest', '9': 0, '10': 'addTrack'}, + const {'1': 'mute', '3': 5, '4': 1, '5': 11, '6': '.livekit.MuteTrackRequest', '9': 0, '10': 'mute'}, + const {'1': 'subscription', '3': 6, '4': 1, '5': 11, '6': '.livekit.UpdateSubscription', '9': 0, '10': 'subscription'}, + const {'1': 'track_setting', '3': 7, '4': 1, '5': 11, '6': '.livekit.UpdateTrackSettings', '9': 0, '10': 'trackSetting'}, + const {'1': 'leave', '3': 8, '4': 1, '5': 11, '6': '.livekit.LeaveRequest', '9': 0, '10': 'leave'}, + const {'1': 'simulcast', '3': 9, '4': 1, '5': 11, '6': '.livekit.SetSimulcastLayers', '9': 0, '10': 'simulcast'}, ], '8': const [ const {'1': 'message'}, @@ -126,93 +51,21 @@ const SignalRequest$json = const { }; /// Descriptor for `SignalRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List signalRequestDescriptor = $convert.base64Decode( - 'Cg1TaWduYWxSZXF1ZXN0EjMKBW9mZmVyGAEgASgLMhsubGl2ZWtpdC5TZXNzaW9uRGVzY3JpcHRpb25IAFIFb2ZmZXISNQoGYW5zd2VyGAIgASgLMhsubGl2ZWtpdC5TZXNzaW9uRGVzY3JpcHRpb25IAFIGYW5zd2VyEjMKB3RyaWNrbGUYAyABKAsyFy5saXZla2l0LlRyaWNrbGVSZXF1ZXN0SABSB3RyaWNrbGUSNwoJYWRkX3RyYWNrGAQgASgLMhgubGl2ZWtpdC5BZGRUcmFja1JlcXVlc3RIAFIIYWRkVHJhY2sSLwoEbXV0ZRgFIAEoCzIZLmxpdmVraXQuTXV0ZVRyYWNrUmVxdWVzdEgAUgRtdXRlEkEKDHN1YnNjcmlwdGlvbhgGIAEoCzIbLmxpdmVraXQuVXBkYXRlU3Vic2NyaXB0aW9uSABSDHN1YnNjcmlwdGlvbhJDCg10cmFja19zZXR0aW5nGAcgASgLMhwubGl2ZWtpdC5VcGRhdGVUcmFja1NldHRpbmdzSABSDHRyYWNrU2V0dGluZxItCgVsZWF2ZRgIIAEoCzIVLmxpdmVraXQuTGVhdmVSZXF1ZXN0SABSBWxlYXZlEjsKCXNpbXVsY2FzdBgJIAEoCzIbLmxpdmVraXQuU2V0U2ltdWxjYXN0TGF5ZXJzSABSCXNpbXVsY2FzdEIJCgdtZXNzYWdl'); +final $typed_data.Uint8List signalRequestDescriptor = $convert.base64Decode('Cg1TaWduYWxSZXF1ZXN0EjMKBW9mZmVyGAEgASgLMhsubGl2ZWtpdC5TZXNzaW9uRGVzY3JpcHRpb25IAFIFb2ZmZXISNQoGYW5zd2VyGAIgASgLMhsubGl2ZWtpdC5TZXNzaW9uRGVzY3JpcHRpb25IAFIGYW5zd2VyEjMKB3RyaWNrbGUYAyABKAsyFy5saXZla2l0LlRyaWNrbGVSZXF1ZXN0SABSB3RyaWNrbGUSNwoJYWRkX3RyYWNrGAQgASgLMhgubGl2ZWtpdC5BZGRUcmFja1JlcXVlc3RIAFIIYWRkVHJhY2sSLwoEbXV0ZRgFIAEoCzIZLmxpdmVraXQuTXV0ZVRyYWNrUmVxdWVzdEgAUgRtdXRlEkEKDHN1YnNjcmlwdGlvbhgGIAEoCzIbLmxpdmVraXQuVXBkYXRlU3Vic2NyaXB0aW9uSABSDHN1YnNjcmlwdGlvbhJDCg10cmFja19zZXR0aW5nGAcgASgLMhwubGl2ZWtpdC5VcGRhdGVUcmFja1NldHRpbmdzSABSDHRyYWNrU2V0dGluZxItCgVsZWF2ZRgIIAEoCzIVLmxpdmVraXQuTGVhdmVSZXF1ZXN0SABSBWxlYXZlEjsKCXNpbXVsY2FzdBgJIAEoCzIbLmxpdmVraXQuU2V0U2ltdWxjYXN0TGF5ZXJzSABSCXNpbXVsY2FzdEIJCgdtZXNzYWdl'); @$core.Deprecated('Use signalResponseDescriptor instead') const SignalResponse$json = const { '1': 'SignalResponse', '2': const [ - const { - '1': 'join', - '3': 1, - '4': 1, - '5': 11, - '6': '.livekit.JoinResponse', - '9': 0, - '10': 'join' - }, - const { - '1': 'answer', - '3': 2, - '4': 1, - '5': 11, - '6': '.livekit.SessionDescription', - '9': 0, - '10': 'answer' - }, - const { - '1': 'offer', - '3': 3, - '4': 1, - '5': 11, - '6': '.livekit.SessionDescription', - '9': 0, - '10': 'offer' - }, - const { - '1': 'trickle', - '3': 4, - '4': 1, - '5': 11, - '6': '.livekit.TrickleRequest', - '9': 0, - '10': 'trickle' - }, - const { - '1': 'update', - '3': 5, - '4': 1, - '5': 11, - '6': '.livekit.ParticipantUpdate', - '9': 0, - '10': 'update' - }, - const { - '1': 'track_published', - '3': 6, - '4': 1, - '5': 11, - '6': '.livekit.TrackPublishedResponse', - '9': 0, - '10': 'trackPublished' - }, - const { - '1': 'speaker', - '3': 7, - '4': 1, - '5': 11, - '6': '.livekit.ActiveSpeakerUpdate', - '9': 0, - '10': 'speaker' - }, - const { - '1': 'leave', - '3': 8, - '4': 1, - '5': 11, - '6': '.livekit.LeaveRequest', - '9': 0, - '10': 'leave' - }, - const { - '1': 'mute', - '3': 9, - '4': 1, - '5': 11, - '6': '.livekit.MuteTrackRequest', - '9': 0, - '10': 'mute' - }, + const {'1': 'join', '3': 1, '4': 1, '5': 11, '6': '.livekit.JoinResponse', '9': 0, '10': 'join'}, + const {'1': 'answer', '3': 2, '4': 1, '5': 11, '6': '.livekit.SessionDescription', '9': 0, '10': 'answer'}, + const {'1': 'offer', '3': 3, '4': 1, '5': 11, '6': '.livekit.SessionDescription', '9': 0, '10': 'offer'}, + const {'1': 'trickle', '3': 4, '4': 1, '5': 11, '6': '.livekit.TrickleRequest', '9': 0, '10': 'trickle'}, + const {'1': 'update', '3': 5, '4': 1, '5': 11, '6': '.livekit.ParticipantUpdate', '9': 0, '10': 'update'}, + const {'1': 'track_published', '3': 6, '4': 1, '5': 11, '6': '.livekit.TrackPublishedResponse', '9': 0, '10': 'trackPublished'}, + const {'1': 'leave', '3': 8, '4': 1, '5': 11, '6': '.livekit.LeaveRequest', '9': 0, '10': 'leave'}, + const {'1': 'mute', '3': 9, '4': 1, '5': 11, '6': '.livekit.MuteTrackRequest', '9': 0, '10': 'mute'}, + const {'1': 'speakers_changed', '3': 10, '4': 1, '5': 11, '6': '.livekit.SpeakersChanged', '9': 0, '10': 'speakersChanged'}, + const {'1': 'room_update', '3': 11, '4': 1, '5': 11, '6': '.livekit.RoomUpdate', '9': 0, '10': 'roomUpdate'}, ], '8': const [ const {'1': 'message'}, @@ -220,8 +73,7 @@ const SignalResponse$json = const { }; /// Descriptor for `SignalResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List signalResponseDescriptor = $convert.base64Decode( - 'Cg5TaWduYWxSZXNwb25zZRIrCgRqb2luGAEgASgLMhUubGl2ZWtpdC5Kb2luUmVzcG9uc2VIAFIEam9pbhI1CgZhbnN3ZXIYAiABKAsyGy5saXZla2l0LlNlc3Npb25EZXNjcmlwdGlvbkgAUgZhbnN3ZXISMwoFb2ZmZXIYAyABKAsyGy5saXZla2l0LlNlc3Npb25EZXNjcmlwdGlvbkgAUgVvZmZlchIzCgd0cmlja2xlGAQgASgLMhcubGl2ZWtpdC5Ucmlja2xlUmVxdWVzdEgAUgd0cmlja2xlEjQKBnVwZGF0ZRgFIAEoCzIaLmxpdmVraXQuUGFydGljaXBhbnRVcGRhdGVIAFIGdXBkYXRlEkoKD3RyYWNrX3B1Ymxpc2hlZBgGIAEoCzIfLmxpdmVraXQuVHJhY2tQdWJsaXNoZWRSZXNwb25zZUgAUg50cmFja1B1Ymxpc2hlZBI4CgdzcGVha2VyGAcgASgLMhwubGl2ZWtpdC5BY3RpdmVTcGVha2VyVXBkYXRlSABSB3NwZWFrZXISLQoFbGVhdmUYCCABKAsyFS5saXZla2l0LkxlYXZlUmVxdWVzdEgAUgVsZWF2ZRIvCgRtdXRlGAkgASgLMhkubGl2ZWtpdC5NdXRlVHJhY2tSZXF1ZXN0SABSBG11dGVCCQoHbWVzc2FnZQ=='); +final $typed_data.Uint8List signalResponseDescriptor = $convert.base64Decode('Cg5TaWduYWxSZXNwb25zZRIrCgRqb2luGAEgASgLMhUubGl2ZWtpdC5Kb2luUmVzcG9uc2VIAFIEam9pbhI1CgZhbnN3ZXIYAiABKAsyGy5saXZla2l0LlNlc3Npb25EZXNjcmlwdGlvbkgAUgZhbnN3ZXISMwoFb2ZmZXIYAyABKAsyGy5saXZla2l0LlNlc3Npb25EZXNjcmlwdGlvbkgAUgVvZmZlchIzCgd0cmlja2xlGAQgASgLMhcubGl2ZWtpdC5Ucmlja2xlUmVxdWVzdEgAUgd0cmlja2xlEjQKBnVwZGF0ZRgFIAEoCzIaLmxpdmVraXQuUGFydGljaXBhbnRVcGRhdGVIAFIGdXBkYXRlEkoKD3RyYWNrX3B1Ymxpc2hlZBgGIAEoCzIfLmxpdmVraXQuVHJhY2tQdWJsaXNoZWRSZXNwb25zZUgAUg50cmFja1B1Ymxpc2hlZBItCgVsZWF2ZRgIIAEoCzIVLmxpdmVraXQuTGVhdmVSZXF1ZXN0SABSBWxlYXZlEi8KBG11dGUYCSABKAsyGS5saXZla2l0Lk11dGVUcmFja1JlcXVlc3RIAFIEbXV0ZRJFChBzcGVha2Vyc19jaGFuZ2VkGAogASgLMhgubGl2ZWtpdC5TcGVha2Vyc0NoYW5nZWRIAFIPc3BlYWtlcnNDaGFuZ2VkEjYKC3Jvb21fdXBkYXRlGAsgASgLMhMubGl2ZWtpdC5Sb29tVXBkYXRlSABSCnJvb21VcGRhdGVCCQoHbWVzc2FnZQ=='); @$core.Deprecated('Use addTrackRequestDescriptor instead') const AddTrackRequest$json = const { '1': 'AddTrackRequest', @@ -236,8 +88,7 @@ const AddTrackRequest$json = const { }; /// Descriptor for `AddTrackRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List addTrackRequestDescriptor = $convert.base64Decode( - 'Cg9BZGRUcmFja1JlcXVlc3QSEAoDY2lkGAEgASgJUgNjaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRImCgR0eXBlGAMgASgOMhIubGl2ZWtpdC5UcmFja1R5cGVSBHR5cGUSFAoFd2lkdGgYBCABKA1SBXdpZHRoEhYKBmhlaWdodBgFIAEoDVIGaGVpZ2h0EhQKBW11dGVkGAYgASgIUgVtdXRlZA=='); +final $typed_data.Uint8List addTrackRequestDescriptor = $convert.base64Decode('Cg9BZGRUcmFja1JlcXVlc3QSEAoDY2lkGAEgASgJUgNjaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRImCgR0eXBlGAMgASgOMhIubGl2ZWtpdC5UcmFja1R5cGVSBHR5cGUSFAoFd2lkdGgYBCABKA1SBXdpZHRoEhYKBmhlaWdodBgFIAEoDVIGaGVpZ2h0EhQKBW11dGVkGAYgASgIUgVtdXRlZA=='); @$core.Deprecated('Use trickleRequestDescriptor instead') const TrickleRequest$json = const { '1': 'TrickleRequest', @@ -248,8 +99,7 @@ const TrickleRequest$json = const { }; /// Descriptor for `TrickleRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List trickleRequestDescriptor = $convert.base64Decode( - 'Cg5Ucmlja2xlUmVxdWVzdBIkCg1jYW5kaWRhdGVJbml0GAEgASgJUg1jYW5kaWRhdGVJbml0Ei0KBnRhcmdldBgCIAEoDjIVLmxpdmVraXQuU2lnbmFsVGFyZ2V0UgZ0YXJnZXQ='); +final $typed_data.Uint8List trickleRequestDescriptor = $convert.base64Decode('Cg5Ucmlja2xlUmVxdWVzdBIkCg1jYW5kaWRhdGVJbml0GAEgASgJUg1jYW5kaWRhdGVJbml0Ei0KBnRhcmdldBgCIAEoDjIVLmxpdmVraXQuU2lnbmFsVGFyZ2V0UgZ0YXJnZXQ='); @$core.Deprecated('Use muteTrackRequestDescriptor instead') const MuteTrackRequest$json = const { '1': 'MuteTrackRequest', @@ -260,8 +110,7 @@ const MuteTrackRequest$json = const { }; /// Descriptor for `MuteTrackRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List muteTrackRequestDescriptor = $convert.base64Decode( - 'ChBNdXRlVHJhY2tSZXF1ZXN0EhAKA3NpZBgBIAEoCVIDc2lkEhQKBW11dGVkGAIgASgIUgVtdXRlZA=='); +final $typed_data.Uint8List muteTrackRequestDescriptor = $convert.base64Decode('ChBNdXRlVHJhY2tSZXF1ZXN0EhAKA3NpZBgBIAEoCVIDc2lkEhQKBW11dGVkGAIgASgIUgVtdXRlZA=='); @$core.Deprecated('Use setSimulcastLayersDescriptor instead') const SetSimulcastLayers$json = const { '1': 'SetSimulcastLayers', @@ -272,45 +121,22 @@ const SetSimulcastLayers$json = const { }; /// Descriptor for `SetSimulcastLayers`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List setSimulcastLayersDescriptor = $convert.base64Decode( - 'ChJTZXRTaW11bGNhc3RMYXllcnMSGwoJdHJhY2tfc2lkGAEgASgJUgh0cmFja1NpZBItCgZsYXllcnMYAiADKA4yFS5saXZla2l0LlZpZGVvUXVhbGl0eVIGbGF5ZXJz'); +final $typed_data.Uint8List setSimulcastLayersDescriptor = $convert.base64Decode('ChJTZXRTaW11bGNhc3RMYXllcnMSGwoJdHJhY2tfc2lkGAEgASgJUgh0cmFja1NpZBItCgZsYXllcnMYAiADKA4yFS5saXZla2l0LlZpZGVvUXVhbGl0eVIGbGF5ZXJz'); @$core.Deprecated('Use joinResponseDescriptor instead') const JoinResponse$json = const { '1': 'JoinResponse', '2': const [ const {'1': 'room', '3': 1, '4': 1, '5': 11, '6': '.livekit.Room', '10': 'room'}, - const { - '1': 'participant', - '3': 2, - '4': 1, - '5': 11, - '6': '.livekit.ParticipantInfo', - '10': 'participant' - }, - const { - '1': 'other_participants', - '3': 3, - '4': 3, - '5': 11, - '6': '.livekit.ParticipantInfo', - '10': 'otherParticipants' - }, + const {'1': 'participant', '3': 2, '4': 1, '5': 11, '6': '.livekit.ParticipantInfo', '10': 'participant'}, + const {'1': 'other_participants', '3': 3, '4': 3, '5': 11, '6': '.livekit.ParticipantInfo', '10': 'otherParticipants'}, const {'1': 'server_version', '3': 4, '4': 1, '5': 9, '10': 'serverVersion'}, - const { - '1': 'ice_servers', - '3': 5, - '4': 3, - '5': 11, - '6': '.livekit.ICEServer', - '10': 'iceServers' - }, + const {'1': 'ice_servers', '3': 5, '4': 3, '5': 11, '6': '.livekit.ICEServer', '10': 'iceServers'}, const {'1': 'subscriber_primary', '3': 6, '4': 1, '5': 8, '10': 'subscriberPrimary'}, ], }; /// Descriptor for `JoinResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List joinResponseDescriptor = $convert.base64Decode( - 'CgxKb2luUmVzcG9uc2USIQoEcm9vbRgBIAEoCzINLmxpdmVraXQuUm9vbVIEcm9vbRI6CgtwYXJ0aWNpcGFudBgCIAEoCzIYLmxpdmVraXQuUGFydGljaXBhbnRJbmZvUgtwYXJ0aWNpcGFudBJHChJvdGhlcl9wYXJ0aWNpcGFudHMYAyADKAsyGC5saXZla2l0LlBhcnRpY2lwYW50SW5mb1IRb3RoZXJQYXJ0aWNpcGFudHMSJQoOc2VydmVyX3ZlcnNpb24YBCABKAlSDXNlcnZlclZlcnNpb24SMwoLaWNlX3NlcnZlcnMYBSADKAsyEi5saXZla2l0LklDRVNlcnZlclIKaWNlU2VydmVycxItChJzdWJzY3JpYmVyX3ByaW1hcnkYBiABKAhSEXN1YnNjcmliZXJQcmltYXJ5'); +final $typed_data.Uint8List joinResponseDescriptor = $convert.base64Decode('CgxKb2luUmVzcG9uc2USIQoEcm9vbRgBIAEoCzINLmxpdmVraXQuUm9vbVIEcm9vbRI6CgtwYXJ0aWNpcGFudBgCIAEoCzIYLmxpdmVraXQuUGFydGljaXBhbnRJbmZvUgtwYXJ0aWNpcGFudBJHChJvdGhlcl9wYXJ0aWNpcGFudHMYAyADKAsyGC5saXZla2l0LlBhcnRpY2lwYW50SW5mb1IRb3RoZXJQYXJ0aWNpcGFudHMSJQoOc2VydmVyX3ZlcnNpb24YBCABKAlSDXNlcnZlclZlcnNpb24SMwoLaWNlX3NlcnZlcnMYBSADKAsyEi5saXZla2l0LklDRVNlcnZlclIKaWNlU2VydmVycxItChJzdWJzY3JpYmVyX3ByaW1hcnkYBiABKAhSEXN1YnNjcmliZXJQcmltYXJ5'); @$core.Deprecated('Use trackPublishedResponseDescriptor instead') const TrackPublishedResponse$json = const { '1': 'TrackPublishedResponse', @@ -321,8 +147,7 @@ const TrackPublishedResponse$json = const { }; /// Descriptor for `TrackPublishedResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List trackPublishedResponseDescriptor = $convert.base64Decode( - 'ChZUcmFja1B1Ymxpc2hlZFJlc3BvbnNlEhAKA2NpZBgBIAEoCVIDY2lkEigKBXRyYWNrGAIgASgLMhIubGl2ZWtpdC5UcmFja0luZm9SBXRyYWNr'); +final $typed_data.Uint8List trackPublishedResponseDescriptor = $convert.base64Decode('ChZUcmFja1B1Ymxpc2hlZFJlc3BvbnNlEhAKA2NpZBgBIAEoCVIDY2lkEigKBXRyYWNrGAIgASgLMhIubGl2ZWtpdC5UcmFja0luZm9SBXRyYWNr'); @$core.Deprecated('Use sessionDescriptionDescriptor instead') const SessionDescription$json = const { '1': 'SessionDescription', @@ -333,26 +158,17 @@ const SessionDescription$json = const { }; /// Descriptor for `SessionDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List sessionDescriptionDescriptor = $convert.base64Decode( - 'ChJTZXNzaW9uRGVzY3JpcHRpb24SEgoEdHlwZRgBIAEoCVIEdHlwZRIQCgNzZHAYAiABKAlSA3NkcA=='); +final $typed_data.Uint8List sessionDescriptionDescriptor = $convert.base64Decode('ChJTZXNzaW9uRGVzY3JpcHRpb24SEgoEdHlwZRgBIAEoCVIEdHlwZRIQCgNzZHAYAiABKAlSA3NkcA=='); @$core.Deprecated('Use participantUpdateDescriptor instead') const ParticipantUpdate$json = const { '1': 'ParticipantUpdate', '2': const [ - const { - '1': 'participants', - '3': 1, - '4': 3, - '5': 11, - '6': '.livekit.ParticipantInfo', - '10': 'participants' - }, + const {'1': 'participants', '3': 1, '4': 3, '5': 11, '6': '.livekit.ParticipantInfo', '10': 'participants'}, ], }; /// Descriptor for `ParticipantUpdate`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List participantUpdateDescriptor = $convert.base64Decode( - 'ChFQYXJ0aWNpcGFudFVwZGF0ZRI8CgxwYXJ0aWNpcGFudHMYASADKAsyGC5saXZla2l0LlBhcnRpY2lwYW50SW5mb1IMcGFydGljaXBhbnRz'); +final $typed_data.Uint8List participantUpdateDescriptor = $convert.base64Decode('ChFQYXJ0aWNpcGFudFVwZGF0ZRI8CgxwYXJ0aWNpcGFudHMYASADKAsyGC5saXZla2l0LlBhcnRpY2lwYW50SW5mb1IMcGFydGljaXBhbnRz'); @$core.Deprecated('Use updateSubscriptionDescriptor instead') const UpdateSubscription$json = const { '1': 'UpdateSubscription', @@ -363,8 +179,7 @@ const UpdateSubscription$json = const { }; /// Descriptor for `UpdateSubscription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List updateSubscriptionDescriptor = $convert.base64Decode( - 'ChJVcGRhdGVTdWJzY3JpcHRpb24SHQoKdHJhY2tfc2lkcxgBIAMoCVIJdHJhY2tTaWRzEhwKCXN1YnNjcmliZRgCIAEoCFIJc3Vic2NyaWJl'); +final $typed_data.Uint8List updateSubscriptionDescriptor = $convert.base64Decode('ChJVcGRhdGVTdWJzY3JpcHRpb24SHQoKdHJhY2tfc2lkcxgBIAMoCVIJdHJhY2tTaWRzEhwKCXN1YnNjcmliZRgCIAEoCFIJc3Vic2NyaWJl'); @$core.Deprecated('Use updateTrackSettingsDescriptor instead') const UpdateTrackSettings$json = const { '1': 'UpdateTrackSettings', @@ -376,8 +191,7 @@ const UpdateTrackSettings$json = const { }; /// Descriptor for `UpdateTrackSettings`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List updateTrackSettingsDescriptor = $convert.base64Decode( - 'ChNVcGRhdGVUcmFja1NldHRpbmdzEh0KCnRyYWNrX3NpZHMYASADKAlSCXRyYWNrU2lkcxIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSLwoHcXVhbGl0eRgEIAEoDjIVLmxpdmVraXQuVmlkZW9RdWFsaXR5UgdxdWFsaXR5'); +final $typed_data.Uint8List updateTrackSettingsDescriptor = $convert.base64Decode('ChNVcGRhdGVUcmFja1NldHRpbmdzEh0KCnRyYWNrX3NpZHMYASADKAlSCXRyYWNrU2lkcxIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSLwoHcXVhbGl0eRgEIAEoDjIVLmxpdmVraXQuVmlkZW9RdWFsaXR5UgdxdWFsaXR5'); @$core.Deprecated('Use leaveRequestDescriptor instead') const LeaveRequest$json = const { '1': 'LeaveRequest', @@ -387,8 +201,7 @@ const LeaveRequest$json = const { }; /// Descriptor for `LeaveRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List leaveRequestDescriptor = - $convert.base64Decode('CgxMZWF2ZVJlcXVlc3QSIwoNY2FuX3JlY29ubmVjdBgBIAEoCFIMY2FuUmVjb25uZWN0'); +final $typed_data.Uint8List leaveRequestDescriptor = $convert.base64Decode('CgxMZWF2ZVJlcXVlc3QSIwoNY2FuX3JlY29ubmVjdBgBIAEoCFIMY2FuUmVjb25uZWN0'); @$core.Deprecated('Use iCEServerDescriptor instead') const ICEServer$json = const { '1': 'ICEServer', @@ -400,5 +213,24 @@ const ICEServer$json = const { }; /// Descriptor for `ICEServer`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List iCEServerDescriptor = $convert.base64Decode( - 'CglJQ0VTZXJ2ZXISEgoEdXJscxgBIAMoCVIEdXJscxIaCgh1c2VybmFtZRgCIAEoCVIIdXNlcm5hbWUSHgoKY3JlZGVudGlhbBgDIAEoCVIKY3JlZGVudGlhbA=='); +final $typed_data.Uint8List iCEServerDescriptor = $convert.base64Decode('CglJQ0VTZXJ2ZXISEgoEdXJscxgBIAMoCVIEdXJscxIaCgh1c2VybmFtZRgCIAEoCVIIdXNlcm5hbWUSHgoKY3JlZGVudGlhbBgDIAEoCVIKY3JlZGVudGlhbA=='); +@$core.Deprecated('Use speakersChangedDescriptor instead') +const SpeakersChanged$json = const { + '1': 'SpeakersChanged', + '2': const [ + const {'1': 'speakers', '3': 1, '4': 3, '5': 11, '6': '.livekit.SpeakerInfo', '10': 'speakers'}, + ], +}; + +/// Descriptor for `SpeakersChanged`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List speakersChangedDescriptor = $convert.base64Decode('Cg9TcGVha2Vyc0NoYW5nZWQSMAoIc3BlYWtlcnMYASADKAsyFC5saXZla2l0LlNwZWFrZXJJbmZvUghzcGVha2Vycw=='); +@$core.Deprecated('Use roomUpdateDescriptor instead') +const RoomUpdate$json = const { + '1': 'RoomUpdate', + '2': const [ + const {'1': 'room', '3': 1, '4': 1, '5': 11, '6': '.livekit.Room', '10': 'room'}, + ], +}; + +/// Descriptor for `RoomUpdate`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List roomUpdateDescriptor = $convert.base64Decode('CgpSb29tVXBkYXRlEiEKBHJvb20YASABKAsyDS5saXZla2l0LlJvb21SBHJvb20='); diff --git a/lib/src/proto/livekit_rtc.pbserver.dart b/lib/src/proto/livekit_rtc.pbserver.dart index 904b71cfd..67167beb7 100644 --- a/lib/src/proto/livekit_rtc.pbserver.dart +++ b/lib/src/proto/livekit_rtc.pbserver.dart @@ -6,3 +6,4 @@ // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_this,unused_import,unused_shown_name export 'livekit_rtc.pb.dart'; + From ad320e93b951f59ca3a315f39511c44e49f0767d Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Sun, 26 Sep 2021 21:40:01 +0900 Subject: [PATCH 12/50] protocol 3 speaker updates --- lib/src/events.dart | 40 ++++++++++-------- lib/src/room.dart | 87 +++++++++++++++++++++++--------------- lib/src/rtc_engine.dart | 21 +++------ lib/src/signal_client.dart | 6 +-- 4 files changed, 84 insertions(+), 70 deletions(-) diff --git a/lib/src/events.dart b/lib/src/events.dart index e9f934ab6..3ea47f9bf 100644 --- a/lib/src/events.dart +++ b/lib/src/events.dart @@ -217,12 +217,12 @@ class EngineReconnectedEvent with EngineEvent { const EngineReconnectedEvent(); } -class EngineParticipantUpdateEvent with EngineEvent { - final List participants; - const EngineParticipantUpdateEvent({ - required this.participants, - }); -} +// class EngineParticipantUpdateEvent with EngineEvent { +// final List participants; +// const EngineParticipantUpdateEvent({ +// required this.participants, +// }); +// } class EngineTrackAddedEvent with EngineEvent { final rtc.MediaStreamTrack track; @@ -235,13 +235,6 @@ class EngineTrackAddedEvent with EngineEvent { }); } -class EngineSpeakersUpdateEvent with EngineEvent { - final List speakers; - const EngineSpeakersUpdateEvent({ - required this.speakers, - }); -} - class EngineDataPacketReceivedEvent with EngineEvent { final lk_models.UserPacket packet; final lk_models.DataPacket_Kind kind; @@ -354,10 +347,11 @@ class SignalTrickleEvent with SignalEvent { }); } -class SignalParticipantUpdateEvent with SignalEvent { - final List updates; +// relayed by Engine +class SignalParticipantUpdateEvent with SignalEvent, EngineEvent { + final List participants; const SignalParticipantUpdateEvent({ - required this.updates, + required this.participants, }); } @@ -370,9 +364,19 @@ class SignalLocalTrackPublishedEvent with SignalEvent { }); } -class SignalActiveSpeakersChangedEvent with SignalEvent { +// speaker update received through websocket +// relayed by Engine +class SignalSpeakersChangedEvent with SignalEvent, EngineEvent { + final List speakers; + const SignalSpeakersChangedEvent({ + required this.speakers, + }); +} + +// Event received through data channel +class EngineActiveSpeakersUpdateEvent with EngineEvent { final List speakers; - const SignalActiveSpeakersChangedEvent({ + const EngineActiveSpeakersUpdateEvent({ required this.speakers, }); } diff --git a/lib/src/room.dart b/lib/src/room.dart index 6ddf268b1..3e6fda499 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -17,7 +17,6 @@ import 'participant/remote_participant.dart'; import 'proto/livekit_models.pb.dart' as lk_models; import 'proto/livekit_rtc.pb.dart' as lk_rtc; import 'rtc_engine.dart'; -import 'signal_client.dart'; import 'track/track.dart'; import 'types.dart'; @@ -37,7 +36,7 @@ class Room extends DisposeAwareChangeNotifier { /// connection state of the room ConnectionState get connectionState => _connectionState; - final Map _participants = {}; + final _participants = {}; /// map of SID to RemoteParticipant UnmodifiableMapView get participants => @@ -171,8 +170,10 @@ class Room extends DisposeAwareChangeNotifier { events.emit(const RoomReconnectingEvent()); }) ..on((event) => close()) - ..on((event) => _onParticipantUpdateEvent(event.participants)) - ..on((event) => _onSpeakerUpdateEvent(event.speakers)) + ..on((event) => _onParticipantUpdateEvent(event.participants)) + ..on( + (event) => _onEngineActiveSpeakersUpdateEvent(event.speakers)) + ..on((event) => _onSignalSpeakersChangedEvent(event.speakers)) ..on(_onDataMessageEvent) ..on((event) async { final track = localParticipant.trackPublications.firstWhereOrNull((e) => e.sid == event.sid); @@ -306,43 +307,63 @@ class Room extends DisposeAwareChangeNotifier { } } - void _onSpeakerUpdateEvent(List speakers) { - final seenSids = {}; - List newSpeakers = []; - for (final info in speakers) { - seenSids.add(info.sid); - - if (info.sid == localParticipant.sid) { - localParticipant.audioLevel = info.level; - localParticipant.isSpeaking = true; - newSpeakers.add(localParticipant); - continue; + void _onSignalSpeakersChangedEvent(List speakers) { + // + final lastSpeakers = { + for (final p in _activeSpeakers) p.sid: p, + }; + + for (final speaker in speakers) { + Participant? p = _participants[speaker.sid]; + if (speaker.sid == localParticipant.sid) p = localParticipant; + if (p == null) continue; + + p.audioLevel = speaker.level; + p.isSpeaking = speaker.active; + if (speaker.active) { + lastSpeakers[speaker.sid] = p; + } else { + lastSpeakers.remove(speaker.sid); } + } - final participant = participants[info.sid]; - if (participant != null) { - participant.audioLevel = info.level; - participant.isSpeaking = true; - newSpeakers.add(participant); + final activeSpeakers = lastSpeakers.values.toList(); + activeSpeakers.sort((a, b) => b.audioLevel.compareTo(a.audioLevel)); + _activeSpeakers = activeSpeakers; + events.emit(ActiveSpeakersChangedEvent(speakers: activeSpeakers)); + } + + // from data channel + // updates are sent only when there's a change to speaker ordering + void _onEngineActiveSpeakersUpdateEvent(List speakers) { + List activeSpeakers = []; + + // localParticipant & remote participants + final allParticipants = { + localParticipant.sid: localParticipant, + ..._participants, + }; + + for (final speaker in speakers) { + final p = allParticipants[speaker.sid]; + if (p != null) { + p.audioLevel = speaker.level; + p.isSpeaking = true; + activeSpeakers.add(p); } } - // clear previous speakers - if (seenSids.contains(localParticipant.sid)) { - localParticipant.audioLevel = 0; - localParticipant.isSpeaking = false; - } - for (final participant in _participants.values) { - if (!seenSids.contains(participant.sid)) { - participant.audioLevel = 0; - participant.isSpeaking = false; + // clear if not in the speakers list + final speakerSids = speakers.map((e) => e.sid).toSet(); + for (final p in allParticipants.values) { + if (!speakerSids.contains(p.sid)) { + p.audioLevel = 0; + p.isSpeaking = false; } } - events.emit(ActiveSpeakersChangedEvent(speakers: newSpeakers)); - - _activeSpeakers = newSpeakers; - notifyListeners(); + _activeSpeakers = activeSpeakers; + events.emit(ActiveSpeakersChangedEvent(speakers: activeSpeakers)); } void _onDataMessageEvent(EngineDataPacketReceivedEvent dataPacketEvent) { diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 71ea6fe23..a7210d076 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -411,7 +411,7 @@ class RTCEngine extends Disposable { final dp = lk_models.DataPacket.fromBuffer(message.binary); if (dp.whichValue() == lk_models.DataPacket_Value.speaker) { // Speaker packet - events.emit(EngineSpeakersUpdateEvent(speakers: dp.speaker.speakers)); + events.emit(EngineActiveSpeakersUpdateEvent(speakers: dp.speaker.speakers)); } else if (dp.whichValue() == lk_models.DataPacket_Value.user) { // User packet events.emit(EngineDataPacketReceivedEvent( @@ -455,9 +455,7 @@ class RTCEngine extends Disposable { void _setUpListeners() => _signalListener ..on((event) async { // create peer connections - // _isClosed = false; _connectionState = ConnectionState.connected; - _subscriberPrimary = event.response.subscriberPrimary; _providedIceServers = event.response.iceServers; @@ -471,9 +469,6 @@ class RTCEngine extends Disposable { // for subscriberPrimary, we negotiate when necessary (lazy) await negotiate(); } - - // _joinCompleter?.complete(Future.value(event.response)); - // _joinCompleter = null; }) ..on((_) async { await _onDisconnected('signal'); @@ -519,16 +514,10 @@ class RTCEngine extends Disposable { await publisher!.addIceCandidate(event.candidate); } }) - ..on((event) async { - events.emit(EngineParticipantUpdateEvent(participants: event.updates)); - }) - // ..on((event) async { - // final completer = _pendingTrackResolvers.remove(event.cid); - // completer?.complete(event.track); - // }) - ..on((event) async { - events.emit(EngineSpeakersUpdateEvent(speakers: event.speakers)); - }) + // relay + ..on((event) => events.emit(event)) + // relay + ..on((event) => events.emit(event)) ..on((event) async { await close(); events.emit(const EngineDisconnectedEvent()); diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index 3a8a45c91..37a3c454b 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -221,7 +221,7 @@ class SignalClient extends Disposable { )); break; case lk_rtc.SignalResponse_Message.update: - events.emit(SignalParticipantUpdateEvent(updates: msg.update.participants)); + events.emit(SignalParticipantUpdateEvent(participants: msg.update.participants)); break; case lk_rtc.SignalResponse_Message.trackPublished: events.emit(SignalLocalTrackPublishedEvent( @@ -229,8 +229,8 @@ class SignalClient extends Disposable { track: msg.trackPublished.track, )); break; - case lk_rtc.SignalResponse_Message.speaker: - events.emit(SignalActiveSpeakersChangedEvent(speakers: msg.speaker.speakers)); + case lk_rtc.SignalResponse_Message.speakersChanged: + events.emit(SignalSpeakersChangedEvent(speakers: msg.speakersChanged.speakers)); break; case lk_rtc.SignalResponse_Message.leave: events.emit(SignalLeaveEvent(canReconnect: msg.leave.canReconnect)); From 6ad05d21e05ba11158b6ade4d204db1a48265fbf Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 27 Sep 2021 01:45:07 +0900 Subject: [PATCH 13/50] fix exception --- lib/src/participant/participant.dart | 2 +- lib/src/proto/livekit_rtc.pb.dart | 2 +- lib/src/support/change_notifier.dart | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index aff02f65b..28316226b 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -150,7 +150,7 @@ abstract class Participant extends DisposeAwareChangeNotifier { Future unpublishTrack(String trackSid, {bool notify = false}); Future unpublishAllTracks({bool notify = false}) async { - final trackSids = trackPublications.map((e) => e.sid); + final trackSids = trackPublications.map((e) => e.sid).toSet(); for (final trackid in trackSids) { await unpublishTrack(trackid, notify: notify); } diff --git a/lib/src/proto/livekit_rtc.pb.dart b/lib/src/proto/livekit_rtc.pb.dart index a797988ea..d22ef103b 100644 --- a/lib/src/proto/livekit_rtc.pb.dart +++ b/lib/src/proto/livekit_rtc.pb.dart @@ -688,7 +688,7 @@ class MuteTrackRequest extends $pb.GeneratedMessage { class SetSimulcastLayers extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SetSimulcastLayers', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSid') - ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'layers', $pb.PbFieldType.PE, valueOf: VideoQuality.valueOf, enumValues: VideoQuality.values, defaultEnumValue: VideoQuality.LOW) + ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'layers', $pb.PbFieldType.PE, valueOf: VideoQuality.valueOf, enumValues: VideoQuality.values) ..hasRequiredFields = false ; diff --git a/lib/src/support/change_notifier.dart b/lib/src/support/change_notifier.dart index 540650026..9e73b8ce1 100644 --- a/lib/src/support/change_notifier.dart +++ b/lib/src/support/change_notifier.dart @@ -17,8 +17,10 @@ abstract class DisposeAwareChangeNotifier extends ChangeNotifier implements Disp @mustCallSuper void dispose() { logger.fine('[${objectId}] dispose()'); - _isDisposed = true; - super.dispose(); + if (!_isDisposed) { + _isDisposed = true; + super.dispose(); + } } @override From 8dc453bf70b34b3748a0b6916cb4f43942f28b37 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 27 Sep 2021 02:01:58 +0900 Subject: [PATCH 14/50] emit `RoomDisconnectedEvent` only once --- example/lib/main.dart | 3 +-- lib/src/room.dart | 21 ++++++++------------- lib/src/support/change_notifier.dart | 13 +++++++++++-- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 54ba4ef55..a8f6f01b1 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -6,11 +6,10 @@ import 'package:logging/logging.dart'; import 'pages/connect.dart'; void main() { - print('This is a test for ${SignalTrickleEvent} test.'); // configure logs for debugging Logger.root.level = Level.FINE; Logger.root.onRecord.listen((record) { - print('${record.level.name}: ${record.time}: ${record.message}'); + print('${record.level.name}: ${record.message}'); }); WidgetsFlutterBinding.ensureInitialized(); diff --git a/lib/src/room.dart b/lib/src/room.dart index 3e6fda499..14d4f90b3 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -241,15 +241,12 @@ class Room extends DisposeAwareChangeNotifier { return participant; } - // there is no side-effect calling this method multiple times + // there should be no problem calling this method multiple times Future close() async { logger.fine('[$objectId] close()'); if (_connectionState == ConnectionState.disconnected) { logger.warning('[$objectId]: close() already disconnected'); } - // we need to flag room as disconnected immediately to avoid - // this method firing multiple times since the following code - // is being awaited // clean up RemoteParticipants for (final _ in _participants.values) { @@ -259,21 +256,19 @@ class Room extends DisposeAwareChangeNotifier { _participants.clear(); // clean up LocalParticipant - // for (final pub in localParticipant.tracks.values) { - // await pub.track?.stop(); - // } await localParticipant.unpublishAllTracks(); - // await localParticipant.dispose(); - // localParticipant = null; - + // clean up engine await engine.close(); _activeSpeakers.clear(); - _connectionState = ConnectionState.disconnected; - notifyListeners(); - events.emit(const RoomDisconnectedEvent()); + // only notify if was not disconnected + if (_connectionState != ConnectionState.disconnected) { + _connectionState = ConnectionState.disconnected; + notifyListeners(); + events.emit(const RoomDisconnectedEvent()); + } } Future _onParticipantUpdateEvent(List updates) async { diff --git a/lib/src/support/change_notifier.dart b/lib/src/support/change_notifier.dart index 9e73b8ce1..986cf7da3 100644 --- a/lib/src/support/change_notifier.dart +++ b/lib/src/support/change_notifier.dart @@ -26,7 +26,7 @@ abstract class DisposeAwareChangeNotifier extends ChangeNotifier implements Disp @override void addListener(VoidCallback listener) { if (_isDisposed) { - logger.warning('calling addListener on a disposed ChangeNotifier'); + logger.warning('called addListener() on a disposed ChangeNotifier'); return; } super.addListener(listener); @@ -35,9 +35,18 @@ abstract class DisposeAwareChangeNotifier extends ChangeNotifier implements Disp @override void removeListener(VoidCallback listener) { if (_isDisposed) { - logger.warning('calling removeListener on a disposed ChangeNotifier'); + logger.warning('called removeListener() on a disposed ChangeNotifier'); return; } super.removeListener(listener); } + + @override + void notifyListeners() { + if (_isDisposed) { + logger.warning('called notifyListeners() on a disposed ChangeNotifier'); + return; + } + super.notifyListeners(); + } } From 2ccc90a8c5ec05a25da76216e17e7a5a5b0f96f0 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 28 Sep 2021 00:40:11 +0900 Subject: [PATCH 15/50] fix exception --- lib/src/participant/remote_participant.dart | 4 ++-- lib/src/room.dart | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index 3cb646d5d..a90436bdc 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -149,8 +149,8 @@ class RemoteParticipant extends Participant { // unpublish any track that is not in the info final validSids = info.tracks.map((e) => e.sid); - final removeSids = trackPublications.where((e) => !validSids.contains(e.sid)).map((e) => e.sid); - + final removeSids = + trackPublications.where((e) => !validSids.contains(e.sid)).map((e) => e.sid).toSet(); for (final sid in removeSids) { await unpublishTrack(sid, notify: true); } diff --git a/lib/src/room.dart b/lib/src/room.dart index 14d4f90b3..4f1a69241 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -266,7 +266,6 @@ class Room extends DisposeAwareChangeNotifier { // only notify if was not disconnected if (_connectionState != ConnectionState.disconnected) { _connectionState = ConnectionState.disconnected; - notifyListeners(); events.emit(const RoomDisconnectedEvent()); } } From 3f4366ce60e26bb6e88fad2c4a94d191aff68c6b Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 28 Sep 2021 02:32:07 +0900 Subject: [PATCH 16/50] keep track of local / remote audio tracks --- lib/src/track/audio_track.dart | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index 057b3d6e5..ba045b8e5 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -6,16 +6,29 @@ import 'local_audio_track.dart'; import 'track.dart'; class AudioTrack extends Track { + static int localCount = 0; + static int remoteCount = 0; + rtc.MediaStream? mediaStream; - AudioTrack(String name, rtc.MediaStreamTrack track, this.mediaStream) - : super(lk_models.TrackType.AUDIO, name, track); + AudioTrack( + String name, + rtc.MediaStreamTrack track, + this.mediaStream, + ) : super( + lk_models.TrackType.AUDIO, + name, + track, + ); /// Start playing audio track. On web platform, create an audio element and /// start playback void start() { - if (this is! LocalAudioTrack) { + if (this is LocalAudioTrack) { + localCount++; + } else if (this is! LocalAudioTrack) { audio.startAudio(getCid(), mediaStreamTrack); + remoteCount++; } } @@ -24,6 +37,13 @@ class AudioTrack extends Track { await mediaStream?.dispose(); mediaStream = null; audio.stopAudio(getCid()); + + if (this is LocalAudioTrack) { + localCount--; + } else if (this is! LocalAudioTrack) { + remoteCount--; + } + await super.stop(); } } From 9bc6862cb22f76c61421421959c06b40048eda7a Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 28 Sep 2021 13:15:46 +0900 Subject: [PATCH 17/50] explicit types --- lib/src/room.dart | 2 +- lib/src/rtc_engine.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/room.dart b/lib/src/room.dart index 4f1a69241..97b3311bb 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -61,7 +61,7 @@ class Room extends DisposeAwareChangeNotifier { // suppport for multiple event listeners final events = EventsEmitter(); - late final _engineListener = EventsListener(engine.events); + late final _engineListener = EventsListener(engine.events); /// internal use /// {@nodoc} diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index a7210d076..64d36f83a 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -70,7 +70,7 @@ class RTCEngine extends Disposable { int _reconnectAttempts = 0; final events = EventsEmitter(); - late final _signalListener = EventsListener(signalClient.events, synchronized: true); + late final _signalListener = EventsListener(signalClient.events, synchronized: true); final delays = CancelableDelayManager(); From 691c33921ffce960e1308bad5110d93a91846029 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 28 Sep 2021 13:58:00 +0900 Subject: [PATCH 18/50] manage track state --- lib/src/participant/local_participant.dart | 2 + lib/src/participant/remote_participant.dart | 2 +- lib/src/rtc_engine.dart | 2 +- lib/src/signal_client.dart | 2 +- lib/src/track/audio_track.dart | 59 +++++++++++++++------ lib/src/track/track.dart | 29 +++++++++- lib/src/track/video_track.dart | 9 ++-- 7 files changed, 82 insertions(+), 23 deletions(-) diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index 50aeb2122..1c7c7c669 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -56,6 +56,8 @@ class LocalParticipant extends Participant { kind: track.kind, ); + await track.start(); + final transceiverInit = rtc.RTCRtpTransceiverInit( direction: rtc.TransceiverDirection.SendOnly, ); diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index a90436bdc..e8daf1f2c 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -97,7 +97,7 @@ class RemoteParticipant extends Participant { await AudioManager().incrementSubscriptionCounter(); final audioTrack = AudioTrack(pub.name, mediaTrack, stream); - audioTrack.start(); + await audioTrack.start(); track = audioTrack; } else { // video track diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 64d36f83a..08c411aa0 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -39,7 +39,7 @@ class RTCEngine extends Disposable { PCTransport? get primary => _subscriberPrimary ? subscriber : publisher; // used for ice state notifications - CancelListenFunc? _primaryIceStateListener; + // CancelListenFunc? _primaryIceStateListener; // data channels for packets rtc.RTCDataChannel? _reliableDC; diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index 37a3c454b..25a3c59c7 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -88,7 +88,7 @@ class SignalClient extends Disposable { String token, ) async { _connected = false; - _ws?.dispose(); + await _ws?.dispose(); _ws = null; final rtcUri = Utils.buildUri( diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index ba045b8e5..027fd62d8 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -1,11 +1,14 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import '../logger.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '_audio_api.dart' if (dart.library.html) '_audio_html.dart' as audio; import 'local_audio_track.dart'; import 'track.dart'; +import 'package:synchronized/synchronized.dart' as sync; class AudioTrack extends Track { + static final _counterLock = sync.Lock(); static int localCount = 0; static int remoteCount = 0; @@ -23,27 +26,51 @@ class AudioTrack extends Track { /// Start playing audio track. On web platform, create an audio element and /// start playback - void start() { - if (this is LocalAudioTrack) { - localCount++; - } else if (this is! LocalAudioTrack) { - audio.startAudio(getCid(), mediaStreamTrack); - remoteCount++; + @override + Future start() async { + final didStart = await super.start(); + if (didStart) { + if (this is! LocalAudioTrack) { + audio.startAudio(getCid(), mediaStreamTrack); + } + + // update counter + await _counterLock.synchronized(() { + if (this is LocalAudioTrack) { + localCount++; + } else if (this is! LocalAudioTrack) { + remoteCount++; + } + _didUpdateCounter(); + }); } + + return didStart; } @override - Future stop() async { - await mediaStream?.dispose(); - mediaStream = null; - audio.stopAudio(getCid()); - - if (this is LocalAudioTrack) { - localCount--; - } else if (this is! LocalAudioTrack) { - remoteCount--; + Future stop() async { + final didStop = await super.stop(); + if (didStop) { + await mediaStream?.dispose(); + mediaStream = null; + audio.stopAudio(getCid()); + + // update counter + await _counterLock.synchronized(() { + if (this is LocalAudioTrack) { + localCount--; + } else if (this is! LocalAudioTrack) { + remoteCount--; + } + _didUpdateCounter(); + }); } - await super.stop(); + return didStop; + } + + void _didUpdateCounter() { + logger.fine('didUpdateCounter: local: $localCount, remote: $remoteCount'); } } diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index 8aa5b6a06..2aaa6bd96 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -1,4 +1,5 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:meta/meta.dart'; import 'package:uuid/uuid.dart'; import '../extensions.dart'; @@ -21,6 +22,10 @@ abstract class Track extends DisposeAwareChangeNotifier { rtc.RTCRtpTransceiver? transceiver; String? _cid; + // started / stopped + bool _active = false; + bool get isActive => _active; + Track( this.kind, this.name, @@ -52,11 +57,33 @@ abstract class Track extends DisposeAwareChangeNotifier { return cid; } - Future stop() async { + // returns true if started, false if already started + @mustCallSuper + Future start() async { + if (_active) { + // already started + return false; + } + + _active = true; + return true; + } + + // returns true if stopped, false if already stopped + @mustCallSuper + Future stop() async { + if (!_active) { + // already stopped + return false; + } + try { await mediaStreamTrack.stop(); } catch (_) { logger.warning('[$objectId] rtc.mediaStreamTrack.stop() did throw ${_}'); } + + _active = false; + return true; } } diff --git a/lib/src/track/video_track.dart b/lib/src/track/video_track.dart index b6fa485b2..12fe00350 100644 --- a/lib/src/track/video_track.dart +++ b/lib/src/track/video_track.dart @@ -28,9 +28,12 @@ class VideoTrack extends Track { } @override - Future stop() async { - await super.stop(); - await _mediaStream.dispose(); + Future stop() async { + final didStop = await super.stop(); + if (didStop) { + await _mediaStream.dispose(); + } // _mediaStream = null; + return didStop; } } From 8f58e2c31d2c47c90c6fc9770d4440bffa36b878 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 28 Sep 2021 15:10:07 +0900 Subject: [PATCH 19/50] re-structure audio management --- lib/src/managers/audio.dart | 230 ++++++++------------ lib/src/participant/local_participant.dart | 10 +- lib/src/participant/remote_participant.dart | 8 +- lib/src/track/audio_track.dart | 131 ++++++++++- 4 files changed, 215 insertions(+), 164 deletions(-) diff --git a/lib/src/managers/audio.dart b/lib/src/managers/audio.dart index 20ed01b20..b8cc07178 100644 --- a/lib/src/managers/audio.dart +++ b/lib/src/managers/audio.dart @@ -1,143 +1,87 @@ -import 'package:audio_session/audio_session.dart' as _as; - -import '../events.dart'; -import '../logger.dart'; -import 'event.dart'; - -enum AudioRecommendationType { - playOnly, - recordOnly, - playAndRecord, -} - -extension AudioRecommendationTypeExt on AudioRecommendationType { - _as.AudioSessionConfiguration configuration() { - // - final playOnlyConfiguration = _as.AudioSessionConfiguration( - avAudioSessionCategory: _as.AVAudioSessionCategory.playback, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers & - _as.AVAudioSessionCategoryOptions.allowBluetooth & - _as.AVAudioSessionCategoryOptions.allowAirPlay & - _as.AVAudioSessionCategoryOptions.defaultToSpeaker, - avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.longFormAudio, - avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, - ); - - if (this == AudioRecommendationType.recordOnly) { - return playOnlyConfiguration.copyWith( - avAudioSessionCategory: _as.AVAudioSessionCategory.record, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.allowBluetooth, - avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, - ); - } else if (this == AudioRecommendationType.playAndRecord) { - return playOnlyConfiguration.copyWith( - avAudioSessionCategory: _as.AVAudioSessionCategory.playAndRecord, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers & - _as.AVAudioSessionCategoryOptions.allowBluetooth & - _as.AVAudioSessionCategoryOptions.allowAirPlay & - _as.AVAudioSessionCategoryOptions.defaultToSpeaker, - avAudioSessionMode: _as.AVAudioSessionMode.voiceChat, - avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, - ); - } - - return playOnlyConfiguration; - } -} - -abstract class AudioManagerEvent implements LiveKitEvent {} - -class AudioManagerUpdatedRecommendationEvent with AudioManagerEvent { - final AudioRecommendationType type; - const AudioManagerUpdatedRecommendationEvent({ - required this.type, - }); -} - -class AudioManager { - static AudioManager? _instance; - bool automaticManagementEnabled = true; -// Initial state is listen - AudioRecommendationType currentRecommendation = AudioRecommendationType.playOnly; - int _subscribeCounter = 0; - int _publishCounter = 0; - - final events = EventsEmitter(); - - AudioManager._() { - (() async { - await _configureCurrentRecommendation(); - })(); - } - - // Singleton - factory AudioManager() { - _instance ??= AudioManager._(); - return _instance!; - } - - Future dispose() async { - await events.dispose(); - } - - Future incrementSubscriptionCounter() async { - _subscribeCounter++; - await _onUpdate(); - } - - Future decrementSubscriptionCounter() async { - if (_subscribeCounter <= 0) return; - _subscribeCounter--; - await _onUpdate(); - } - - Future incrementPublishCounter() async { - _publishCounter++; - await _onUpdate(); - } - - Future decrementPublishCounter() async { - if (_publishCounter <= 0) return; - _publishCounter--; - await _onUpdate(); - } - - AudioRecommendationType _computeRecommendation() { - if (_publishCounter > 0 && _subscribeCounter == 0) { - return AudioRecommendationType.recordOnly; - } else if (_publishCounter > 0 && _subscribeCounter > 0) { - return AudioRecommendationType.playAndRecord; - } - // Default - return AudioRecommendationType.playOnly; - } - - Future _onUpdate() async { - final newRecommendation = _computeRecommendation(); - if (currentRecommendation != newRecommendation) { - currentRecommendation = newRecommendation; - events.emit(AudioManagerUpdatedRecommendationEvent(type: currentRecommendation)); - logger.fine('[$runtimeType] updated recommendation ${currentRecommendation}'); - if (automaticManagementEnabled) { - await _configureCurrentRecommendation(); - } - } - } - - Future _configureCurrentRecommendation() async { - final config = currentRecommendation.configuration(); - logger.fine('[$runtimeType] configuring for ${currentRecommendation}, ' - '${config.avAudioSessionCategory}...'); - try { - final _audioSession = await _as.AudioSession.instance; - await _audioSession.configure(config); - await _audioSession.setActive(true); - } catch (error) { - logger.warning('[$runtimeType] Failed to configure ${error}'); - } - } -} +// import 'package:audio_session/audio_session.dart' as _as; + +// import '../events.dart'; +// import '../logger.dart'; +// import 'event.dart'; + +// // abstract class AudioManagerEvent implements LiveKitEvent {} + +// // class AudioManagerUpdatedRecommendationEvent with AudioManagerEvent { +// // final AudioTrackState type; +// // const AudioManagerUpdatedRecommendationEvent({ +// // required this.type, +// // }); +// // } + +// class AudioManager { +// static AudioManager? _instance; +// bool automaticManagementEnabled = true; +// // Initial state is listen +// // AudioTrackState currentRecommendation = AudioTrackState.none; + +// // final events = EventsEmitter(); + +// AudioManager._() { +// (() async { +// // await _configureCurrentRecommendation(); +// })(); +// } + +// // Singleton +// factory AudioManager() { +// _instance ??= AudioManager._(); +// return _instance!; +// } + +// Future dispose() async { +// // await events.dispose(); +// } + +// // Future incrementSubscriptionCounter() async { +// // _subscribeCounter++; +// // await _onUpdate(); +// // } + +// // Future decrementSubscriptionCounter() async { +// // if (_subscribeCounter <= 0) return; +// // _subscribeCounter--; +// // await _onUpdate(); +// // } + +// // Future incrementPublishCounter() async { +// // _publishCounter++; +// // await _onUpdate(); +// // } + +// // Future decrementPublishCounter() async { +// // if (_publishCounter <= 0) return; +// // _publishCounter--; +// // await _onUpdate(); +// // } + +// // static AudioTrackState computeAudioTrackState({ +// // required int local, +// // required int remote, +// // }) { +// // if (local > 0 && remote == 0) { +// // return AudioTrackState.localOnly; +// // } else if (local > 0 && remote > 0) { +// // return AudioTrackState.localAndRemote; +// // } +// // // Default +// // return AudioTrackState.remoteOnly; +// // } + +// // Future _onUpdate() async { +// // final newRecommendation = computeAudioTrackState(); +// // if (currentRecommendation != newRecommendation) { +// // currentRecommendation = newRecommendation; +// // events.emit(AudioManagerUpdatedRecommendationEvent(type: currentRecommendation)); +// // logger.fine('[$runtimeType] updated recommendation ${currentRecommendation}'); +// // if (automaticManagementEnabled) { +// // await _configureCurrentRecommendation(); +// // } +// // } +// // } + +// } diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index 1c7c7c669..5309a62ac 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -47,7 +47,7 @@ class LocalParticipant extends Participant { throw TrackPublishException('track already exists'); } - await AudioManager().incrementPublishCounter(); + // await AudioManager().incrementPublishCounter(); try { final trackInfo = await engine.addTrack( @@ -75,7 +75,7 @@ class LocalParticipant extends Participant { return pub; } catch (e) { // In any case there was an exception, revert the count. - await AudioManager().decrementPublishCounter(); + // await AudioManager().decrementPublishCounter(); rethrow; } } @@ -180,9 +180,9 @@ class LocalParticipant extends Participant { } } - if (track is AudioTrack) { - await AudioManager().decrementPublishCounter(); - } + // if (track is AudioTrack) { + // await AudioManager().decrementPublishCounter(); + // } } } diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index e8daf1f2c..3c144a055 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -94,7 +94,7 @@ class RemoteParticipant extends Participant { final Track track; if (pub.kind == lk_models.TrackType.AUDIO) { // audio track - await AudioManager().incrementSubscriptionCounter(); + // await AudioManager().incrementSubscriptionCounter(); final audioTrack = AudioTrack(pub.name, mediaTrack, stream); await audioTrack.start(); @@ -174,9 +174,9 @@ class RemoteParticipant extends Participant { publication: pub, )); - if (track is AudioTrack) { - await AudioManager().decrementSubscriptionCounter(); - } + // if (track is AudioTrack) { + // await AudioManager().decrementSubscriptionCounter(); + // } } if (notify) { diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index 027fd62d8..dcc4839a0 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -1,4 +1,6 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:livekit_client/src/managers/audio.dart'; +import 'package:audio_session/audio_session.dart' as _as; import '../logger.dart'; import '../proto/livekit_models.pb.dart' as lk_models; @@ -7,10 +9,23 @@ import 'local_audio_track.dart'; import 'track.dart'; import 'package:synchronized/synchronized.dart' as sync; +enum AudioTrackState { + none, + remoteOnly, + localOnly, + localAndRemote, +} + +typedef AudioTrackConfigureAudioSession = Future Function(AudioTrackState state); + class AudioTrack extends Track { + // it's possible to set custom function here to customize audio session configuration + static AudioTrackConfigureAudioSession onConfigureAudioSession = + AudioTrackExt.configureAudioSession; static final _counterLock = sync.Lock(); - static int localCount = 0; - static int remoteCount = 0; + static AudioTrackState state = AudioTrackState.none; + static int _localCount = 0; + static int _remoteCount = 0; rtc.MediaStream? mediaStream; @@ -35,13 +50,13 @@ class AudioTrack extends Track { } // update counter - await _counterLock.synchronized(() { + await _counterLock.synchronized(() async { if (this is LocalAudioTrack) { - localCount++; + _localCount++; } else if (this is! LocalAudioTrack) { - remoteCount++; + _remoteCount++; } - _didUpdateCounter(); + await _didUpdateCounter(); }); } @@ -57,20 +72,112 @@ class AudioTrack extends Track { audio.stopAudio(getCid()); // update counter - await _counterLock.synchronized(() { + await _counterLock.synchronized(() async { if (this is LocalAudioTrack) { - localCount--; + _localCount--; } else if (this is! LocalAudioTrack) { - remoteCount--; + _remoteCount--; } - _didUpdateCounter(); + await _didUpdateCounter(); }); } return didStop; } - void _didUpdateCounter() { - logger.fine('didUpdateCounter: local: $localCount, remote: $remoteCount'); + Future _didUpdateCounter() async { + logger.fine('[$runtimeType] didUpdateCounter: local: $_localCount, remote: $_remoteCount'); + final newState = AudioTrackStateExt.computeAudioTrackState( + local: _localCount, + remote: _remoteCount, + ); + + if (state != newState) { + state = newState; + logger.fine('[$runtimeType] didUpdateSate: $state'); + await AudioTrackExt.configureAudioSession(state); + } + } +} + +extension AudioTrackExt on AudioTrack { + // + static Future configureAudioSession(AudioTrackState state) async { + final config = state.defaultConfiguration(); + logger.fine('[AudioTrack] configuring for ${state}, ${config.avAudioSessionCategory}...'); + try { + final _audioSession = await _as.AudioSession.instance; + await _audioSession.configure(config); + await _audioSession.setActive(true); + } catch (error) { + logger.warning('[$AudioTrack] Failed to configure ${error}'); + } + } +} + +extension AudioTrackStateExt on AudioTrackState { + // + static AudioTrackState computeAudioTrackState({ + required int local, + required int remote, + }) { + if (local > 0 && remote == 0) { + return AudioTrackState.localOnly; + } else if (local == 0 && remote > 0) { + return AudioTrackState.remoteOnly; + } else if (local > 0 && remote > 0) { + return AudioTrackState.localAndRemote; + } + // Default + return AudioTrackState.none; + } +} + +extension AudioRecommendationTypeExt on AudioTrackState { + // returns default configuration for the AudioTrackState + _as.AudioSessionConfiguration defaultConfiguration() { + // + final _baseConfiguration = _as.AudioSessionConfiguration( + // ios defaults to soloAmbient + avAudioSessionCategory: _as.AVAudioSessionCategory.soloAmbient, + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers & + _as.AVAudioSessionCategoryOptions.allowBluetooth & + _as.AVAudioSessionCategoryOptions.allowAirPlay & + _as.AVAudioSessionCategoryOptions.defaultToSpeaker, + avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, + avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.longFormAudio, + avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + ); + + if (this == AudioTrackState.remoteOnly) { + return _baseConfiguration.copyWith( + avAudioSessionCategory: _as.AVAudioSessionCategory.playback, + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.allowBluetooth, + avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, + avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, + avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + ); + } else if (this == AudioTrackState.localOnly) { + return _baseConfiguration.copyWith( + avAudioSessionCategory: _as.AVAudioSessionCategory.record, + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.allowBluetooth, + avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, + avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, + avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + ); + } else if (this == AudioTrackState.localAndRemote) { + return _baseConfiguration.copyWith( + avAudioSessionCategory: _as.AVAudioSessionCategory.playAndRecord, + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers & + _as.AVAudioSessionCategoryOptions.allowBluetooth & + _as.AVAudioSessionCategoryOptions.allowAirPlay & + _as.AVAudioSessionCategoryOptions.defaultToSpeaker, + avAudioSessionMode: _as.AVAudioSessionMode.voiceChat, + avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, + avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + ); + } + + return _baseConfiguration; } } From 1e15e5f0dd24ea19ad81fbbdf4215fa04e57004b Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 28 Sep 2021 16:20:14 +0900 Subject: [PATCH 20/50] change defaults --- lib/src/participant/local_participant.dart | 9 +++++---- lib/src/track/audio_track.dart | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index 5309a62ac..bab40d1c3 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -1,18 +1,16 @@ import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; -import 'package:meta/meta.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:meta/meta.dart'; -import '../exceptions.dart'; import '../events.dart'; +import '../exceptions.dart'; import '../extensions.dart'; import '../logger.dart'; -import '../managers/audio.dart'; import '../managers/event.dart'; import '../options.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../rtc_engine.dart'; -import '../track/audio_track.dart'; import '../track/local_audio_track.dart'; import '../track/local_track_publication.dart'; import '../track/local_video_track.dart'; @@ -97,8 +95,11 @@ class LocalParticipant extends Participant { name: track.name, kind: track.kind, ); + logger.fine('publishVideoTrack addTrack response: ${trackInfo}'); + await track.start(); + // Video encodings and simulcasts // use constraints passed to getUserMedia by default diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index dcc4839a0..3715ac869 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -145,14 +145,14 @@ extension AudioRecommendationTypeExt on AudioTrackState { _as.AVAudioSessionCategoryOptions.allowAirPlay & _as.AVAudioSessionCategoryOptions.defaultToSpeaker, avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.longFormAudio, + avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, ); if (this == AudioTrackState.remoteOnly) { return _baseConfiguration.copyWith( avAudioSessionCategory: _as.AVAudioSessionCategory.playback, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.allowBluetooth, + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, From 8b3b06d46df10a942cf0293beb88d4b29e6866a7 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Tue, 28 Sep 2021 16:56:36 +0900 Subject: [PATCH 21/50] unpublish all --- example/lib/main.dart | 1 - example/lib/widgets/controls.dart | 8 ++ lib/src/managers/audio.dart | 87 --------------------- lib/src/participant/remote_participant.dart | 1 - lib/src/track/audio_track.dart | 23 +++--- 5 files changed, 19 insertions(+), 101 deletions(-) delete mode 100644 lib/src/managers/audio.dart diff --git a/example/lib/main.dart b/example/lib/main.dart index a8f6f01b1..e5816b6a9 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:livekit_client/livekit_client.dart'; import 'package:livekit_example/theme.dart'; import 'package:logging/logging.dart'; diff --git a/example/lib/widgets/controls.dart b/example/lib/widgets/controls.dart index 0ba975dac..564d63894 100644 --- a/example/lib/widgets/controls.dart +++ b/example/lib/widgets/controls.dart @@ -44,6 +44,10 @@ class _ControlsWidgetState extends State { setState(() {}); } + void _unpublishAll() async { + await participant.unpublishAllTracks(); + } + void _muteAudio() { if (participant.hasAudio) { final audioPub = participant.audioTracks.first; @@ -146,6 +150,10 @@ class _ControlsWidgetState extends State { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ + IconButton( + onPressed: _unpublishAll, + icon: const Icon(EvaIcons.closeCircleOutline), + ), if (canMute) IconButton( onPressed: _muteAudio, diff --git a/lib/src/managers/audio.dart b/lib/src/managers/audio.dart deleted file mode 100644 index b8cc07178..000000000 --- a/lib/src/managers/audio.dart +++ /dev/null @@ -1,87 +0,0 @@ -// import 'package:audio_session/audio_session.dart' as _as; - -// import '../events.dart'; -// import '../logger.dart'; -// import 'event.dart'; - -// // abstract class AudioManagerEvent implements LiveKitEvent {} - -// // class AudioManagerUpdatedRecommendationEvent with AudioManagerEvent { -// // final AudioTrackState type; -// // const AudioManagerUpdatedRecommendationEvent({ -// // required this.type, -// // }); -// // } - -// class AudioManager { -// static AudioManager? _instance; -// bool automaticManagementEnabled = true; -// // Initial state is listen -// // AudioTrackState currentRecommendation = AudioTrackState.none; - -// // final events = EventsEmitter(); - -// AudioManager._() { -// (() async { -// // await _configureCurrentRecommendation(); -// })(); -// } - -// // Singleton -// factory AudioManager() { -// _instance ??= AudioManager._(); -// return _instance!; -// } - -// Future dispose() async { -// // await events.dispose(); -// } - -// // Future incrementSubscriptionCounter() async { -// // _subscribeCounter++; -// // await _onUpdate(); -// // } - -// // Future decrementSubscriptionCounter() async { -// // if (_subscribeCounter <= 0) return; -// // _subscribeCounter--; -// // await _onUpdate(); -// // } - -// // Future incrementPublishCounter() async { -// // _publishCounter++; -// // await _onUpdate(); -// // } - -// // Future decrementPublishCounter() async { -// // if (_publishCounter <= 0) return; -// // _publishCounter--; -// // await _onUpdate(); -// // } - -// // static AudioTrackState computeAudioTrackState({ -// // required int local, -// // required int remote, -// // }) { -// // if (local > 0 && remote == 0) { -// // return AudioTrackState.localOnly; -// // } else if (local > 0 && remote > 0) { -// // return AudioTrackState.localAndRemote; -// // } -// // // Default -// // return AudioTrackState.remoteOnly; -// // } - -// // Future _onUpdate() async { -// // final newRecommendation = computeAudioTrackState(); -// // if (currentRecommendation != newRecommendation) { -// // currentRecommendation = newRecommendation; -// // events.emit(AudioManagerUpdatedRecommendationEvent(type: currentRecommendation)); -// // logger.fine('[$runtimeType] updated recommendation ${currentRecommendation}'); -// // if (automaticManagementEnabled) { -// // await _configureCurrentRecommendation(); -// // } -// // } -// // } - -// } diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index 3c144a055..a9546ed21 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -6,7 +6,6 @@ import '../constants.dart'; import '../events.dart'; import '../extensions.dart'; import '../logger.dart'; -import '../managers/audio.dart'; import '../managers/event.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../signal_client.dart'; diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index 3715ac869..c5ad81ad4 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -1,13 +1,12 @@ -import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import 'package:livekit_client/src/managers/audio.dart'; import 'package:audio_session/audio_session.dart' as _as; +import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:synchronized/synchronized.dart' as sync; import '../logger.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '_audio_api.dart' if (dart.library.html) '_audio_html.dart' as audio; import 'local_audio_track.dart'; import 'track.dart'; -import 'package:synchronized/synchronized.dart' as sync; enum AudioTrackState { none, @@ -157,15 +156,15 @@ extension AudioRecommendationTypeExt on AudioTrackState { avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, ); - } else if (this == AudioTrackState.localOnly) { - return _baseConfiguration.copyWith( - avAudioSessionCategory: _as.AVAudioSessionCategory.record, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.allowBluetooth, - avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, - ); - } else if (this == AudioTrackState.localAndRemote) { + // } else if (this == AudioTrackState.localOnly) { + // return _baseConfiguration.copyWith( + // avAudioSessionCategory: _as.AVAudioSessionCategory.record, + // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.allowBluetooth, + // avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, + // avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, + // avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + // ); + } else if (this == AudioTrackState.localAndRemote || this == AudioTrackState.localOnly) { return _baseConfiguration.copyWith( avAudioSessionCategory: _as.AVAudioSessionCategory.playAndRecord, avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers & From 454627a0c53d484e4c24619642b2e920544cd595 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Wed, 29 Sep 2021 01:55:16 +0900 Subject: [PATCH 22/50] use experimental build --- example/ios/Podfile | 3 +++ example/ios/Podfile.lock | 15 ++++++++------- example/lib/widgets/controls.dart | 1 + example/pubspec.lock | 2 +- lib/src/track/audio_track.dart | 24 ++++++++---------------- pubspec.lock | 2 +- 6 files changed, 22 insertions(+), 25 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index c6a6a5c89..042169679 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,6 +1,9 @@ # Uncomment this line to define a global platform for your project platform :ios, '12.1' +source 'https://github.com/hiroshihorie/unx_webrtc.git' +source 'https://github.com/CocoaPods/Specs.git' + # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 83b052434..75f6a7129 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -5,13 +5,13 @@ PODS: - flutter_webrtc (0.2.2): - Flutter - Libyuv (= 1703) - - WebRTC-SDK (= 92.4515.05) + - unx_webrtc (= 2021092804) - Libyuv (1703) - path_provider (0.0.1): - Flutter - shared_preferences (0.0.1): - Flutter - - WebRTC-SDK (92.4515.05) + - unx_webrtc (2021092804) DEPENDENCIES: - audio_session (from `.symlinks/plugins/audio_session/ios`) @@ -21,9 +21,10 @@ DEPENDENCIES: - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) SPEC REPOS: - trunk: + https://github.com/CocoaPods/Specs.git: - Libyuv - - WebRTC-SDK + https://github.com/HiroshiHorie/unx_webrtc.git: + - unx_webrtc EXTERNAL SOURCES: audio_session: @@ -40,12 +41,12 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: audio_session: 4f3e461722055d21515cf3261b64c973c062f345 Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a - flutter_webrtc: c0cb88c7cbd057e6e667ab1560e10c74e2ceb65b + flutter_webrtc: 11be7635286899f31a07d4d691892c58b5f50e7a Libyuv: 5f79ced0ee66e60a612ca97de1e6ccacd187a437 path_provider: d1e9807085df1f9cc9318206cd649dc0b76be3de shared_preferences: 5033afbb22d372e15aff8ff766df9021b845f273 - WebRTC-SDK: 7c76a541dbbffb0fc212aeb9902ec45a43c23996 + unx_webrtc: 86c423ae4370af9d102594458263a76e4a0ead64 -PODFILE CHECKSUM: 82aed1035f46bfa5b522f0d0dbf4730f17ec65ff +PODFILE CHECKSUM: d99737230d634a0d2df8e653d175b8cab1c12584 COCOAPODS: 1.11.2 diff --git a/example/lib/widgets/controls.dart b/example/lib/widgets/controls.dart index 564d63894..ffab30d68 100644 --- a/example/lib/widgets/controls.dart +++ b/example/lib/widgets/controls.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:eva_icons_flutter/eva_icons_flutter.dart'; import 'package:flutter/material.dart'; import 'package:livekit_client/livekit_client.dart'; +import 'package:livekit_client/src/track/audio_track.dart'; import 'package:collection/collection.dart'; import '../exts.dart'; diff --git a/example/pubspec.lock b/example/pubspec.lock index 4f94beced..6c3f5aa78 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -119,7 +119,7 @@ packages: description: path: "." ref: use-custom-webrtc-build - resolved-ref: "4942e7faec2e5775d35c42e22c2929ca6ca53769" + resolved-ref: "64d17b813f77b600c3c8bd77b5fd82397f62ca2a" url: "https://github.com/livekit/flutter-webrtc" source: git version: "0.6.7" diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index c5ad81ad4..584a64a15 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -139,13 +139,11 @@ extension AudioRecommendationTypeExt on AudioTrackState { final _baseConfiguration = _as.AudioSessionConfiguration( // ios defaults to soloAmbient avAudioSessionCategory: _as.AVAudioSessionCategory.soloAmbient, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers & - _as.AVAudioSessionCategoryOptions.allowBluetooth & - _as.AVAudioSessionCategoryOptions.allowAirPlay & + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers | + _as.AVAudioSessionCategoryOptions.allowBluetooth | + _as.AVAudioSessionCategoryOptions.allowAirPlay | _as.AVAudioSessionCategoryOptions.defaultToSpeaker, - avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + avAudioSessionMode: _as.AVAudioSessionMode.defaultMode, ); if (this == AudioTrackState.remoteOnly) { @@ -153,27 +151,21 @@ extension AudioRecommendationTypeExt on AudioTrackState { avAudioSessionCategory: _as.AVAudioSessionCategory.playback, avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, ); // } else if (this == AudioTrackState.localOnly) { // return _baseConfiguration.copyWith( // avAudioSessionCategory: _as.AVAudioSessionCategory.record, - // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.allowBluetooth, + // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, // avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - // avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, - // avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, // ); } else if (this == AudioTrackState.localAndRemote || this == AudioTrackState.localOnly) { return _baseConfiguration.copyWith( avAudioSessionCategory: _as.AVAudioSessionCategory.playAndRecord, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers & - _as.AVAudioSessionCategoryOptions.allowBluetooth & - _as.AVAudioSessionCategoryOptions.allowAirPlay & + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers | + _as.AVAudioSessionCategoryOptions.allowBluetooth | + _as.AVAudioSessionCategoryOptions.allowAirPlay | _as.AVAudioSessionCategoryOptions.defaultToSpeaker, avAudioSessionMode: _as.AVAudioSessionMode.voiceChat, - avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, ); } diff --git a/pubspec.lock b/pubspec.lock index 9efa8b042..70ca38cc8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -112,7 +112,7 @@ packages: description: path: "." ref: use-custom-webrtc-build - resolved-ref: "4942e7faec2e5775d35c42e22c2929ca6ca53769" + resolved-ref: "64d17b813f77b600c3c8bd77b5fd82397f62ca2a" url: "https://github.com/livekit/flutter-webrtc" source: git version: "0.6.7" From 9671e2ca8b47bd6dce299d95a25a130549675892 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Wed, 29 Sep 2021 02:01:50 +0900 Subject: [PATCH 23/50] change defaults --- lib/src/track/audio_track.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index 584a64a15..b2120ed6b 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -139,11 +139,10 @@ extension AudioRecommendationTypeExt on AudioTrackState { final _baseConfiguration = _as.AudioSessionConfiguration( // ios defaults to soloAmbient avAudioSessionCategory: _as.AVAudioSessionCategory.soloAmbient, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers | - _as.AVAudioSessionCategoryOptions.allowBluetooth | - _as.AVAudioSessionCategoryOptions.allowAirPlay | - _as.AVAudioSessionCategoryOptions.defaultToSpeaker, + avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers, avAudioSessionMode: _as.AVAudioSessionMode.defaultMode, + avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, + avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, ); if (this == AudioTrackState.remoteOnly) { From 7c3d151aff7aecddb3878f435789cfc905b6314f Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Wed, 29 Sep 2021 14:09:45 +0900 Subject: [PATCH 24/50] configuring is optional --- lib/src/track/audio_track.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index b2120ed6b..c67b62734 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -19,8 +19,9 @@ typedef AudioTrackConfigureAudioSession = Future Function(AudioTrackState class AudioTrack extends Track { // it's possible to set custom function here to customize audio session configuration - static AudioTrackConfigureAudioSession onConfigureAudioSession = + static AudioTrackConfigureAudioSession? onConfigureAudioSession = AudioTrackExt.configureAudioSession; + // = AudioTrackExt.configureAudioSession; static final _counterLock = sync.Lock(); static AudioTrackState state = AudioTrackState.none; static int _localCount = 0; @@ -94,7 +95,7 @@ class AudioTrack extends Track { if (state != newState) { state = newState; logger.fine('[$runtimeType] didUpdateSate: $state'); - await AudioTrackExt.configureAudioSession(state); + await onConfigureAudioSession?.call(state); } } } @@ -136,7 +137,7 @@ extension AudioRecommendationTypeExt on AudioTrackState { // returns default configuration for the AudioTrackState _as.AudioSessionConfiguration defaultConfiguration() { // - final _baseConfiguration = _as.AudioSessionConfiguration( + const _baseConfiguration = _as.AudioSessionConfiguration( // ios defaults to soloAmbient avAudioSessionCategory: _as.AVAudioSessionCategory.soloAmbient, avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers, @@ -151,6 +152,7 @@ extension AudioRecommendationTypeExt on AudioTrackState { avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, ); + // TODO: Support AVAudioSessionCategory.record // } else if (this == AudioTrackState.localOnly) { // return _baseConfiguration.copyWith( // avAudioSessionCategory: _as.AVAudioSessionCategory.record, From 4b60acbb011aba8893c6b31a53f403c2966fb047 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Wed, 29 Sep 2021 23:11:27 +0900 Subject: [PATCH 25/50] call native `RTCAudioSession.setConfiguration` --- example/ios/Podfile.lock | 24 +-- example/ios/Runner.xcodeproj/project.pbxproj | 5 +- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +- example/lib/widgets/controls.dart | 4 +- example/pubspec.lock | 16 +- ios/.gitignore | 38 +++++ ios/Assets/.gitkeep | 0 ios/Classes/LivekitClientPlugin.h | 4 + ios/Classes/LivekitClientPlugin.m | 15 ++ ios/Classes/SwiftLivekitClientPlugin.swift | 114 +++++++++++++++ ios/livekit_client.podspec | 25 ++++ lib/src/livekit.dart | 19 +++ lib/src/support/native_audio.dart | 85 +++++++++++ lib/src/track/audio_track.dart | 137 ++++++++++++------ pubspec.lock | 28 +--- pubspec.yaml | 17 ++- 16 files changed, 434 insertions(+), 107 deletions(-) create mode 100644 ios/.gitignore create mode 100644 ios/Assets/.gitkeep create mode 100644 ios/Classes/LivekitClientPlugin.h create mode 100644 ios/Classes/LivekitClientPlugin.m create mode 100644 ios/Classes/SwiftLivekitClientPlugin.swift create mode 100644 ios/livekit_client.podspec create mode 100644 lib/src/support/native_audio.dart diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 75f6a7129..7a5ed91c8 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,51 +1,51 @@ PODS: - - audio_session (0.0.1): - - Flutter - Flutter (1.0.0) - flutter_webrtc (0.2.2): - Flutter - Libyuv (= 1703) - - unx_webrtc (= 2021092804) + - WebRTC-SDK (= 92.4515.06) - Libyuv (1703) + - livekit_client (0.0.1): + - Flutter + - WebRTC-SDK (= 92.4515.06) - path_provider (0.0.1): - Flutter - shared_preferences (0.0.1): - Flutter - - unx_webrtc (2021092804) + - WebRTC-SDK (92.4515.06) DEPENDENCIES: - - audio_session (from `.symlinks/plugins/audio_session/ios`) - Flutter (from `Flutter`) - flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`) + - livekit_client (from `.symlinks/plugins/livekit_client/ios`) - path_provider (from `.symlinks/plugins/path_provider/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) SPEC REPOS: https://github.com/CocoaPods/Specs.git: - Libyuv - https://github.com/HiroshiHorie/unx_webrtc.git: - - unx_webrtc + - WebRTC-SDK EXTERNAL SOURCES: - audio_session: - :path: ".symlinks/plugins/audio_session/ios" Flutter: :path: Flutter flutter_webrtc: :path: ".symlinks/plugins/flutter_webrtc/ios" + livekit_client: + :path: ".symlinks/plugins/livekit_client/ios" path_provider: :path: ".symlinks/plugins/path_provider/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" SPEC CHECKSUMS: - audio_session: 4f3e461722055d21515cf3261b64c973c062f345 Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a - flutter_webrtc: 11be7635286899f31a07d4d691892c58b5f50e7a + flutter_webrtc: 251d24d5b756f19e0891d8b69843e53023de3a82 Libyuv: 5f79ced0ee66e60a612ca97de1e6ccacd187a437 + livekit_client: 352b5191b41fed22b23fc6a3e58e0fdf50175d5c path_provider: d1e9807085df1f9cc9318206cd649dc0b76be3de shared_preferences: 5033afbb22d372e15aff8ff766df9021b845f273 - unx_webrtc: 86c423ae4370af9d102594458263a76e4a0ead64 + WebRTC-SDK: c116520af8b4be802cc2cdf359791eb23ef86de2 PODFILE CHECKSUM: d99737230d634a0d2df8e653d175b8cab1c12584 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 3a41195a6..4d10ddbd6 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -155,7 +155,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -321,6 +321,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -396,6 +397,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -452,6 +454,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140cfd..c87d15a33 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - + +@interface LivekitClientPlugin : NSObject +@end diff --git a/ios/Classes/LivekitClientPlugin.m b/ios/Classes/LivekitClientPlugin.m new file mode 100644 index 000000000..349ba42f9 --- /dev/null +++ b/ios/Classes/LivekitClientPlugin.m @@ -0,0 +1,15 @@ +#import "LivekitClientPlugin.h" +#if __has_include() +#import +#else +// Support project import fallback if the generated compatibility header +// is not copied when this plugin is created as a library. +// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 +#import "livekit_client-Swift.h" +#endif + +@implementation LivekitClientPlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + [SwiftLivekitClientPlugin registerWithRegistrar:registrar]; +} +@end diff --git a/ios/Classes/SwiftLivekitClientPlugin.swift b/ios/Classes/SwiftLivekitClientPlugin.swift new file mode 100644 index 000000000..8cd0ad0ac --- /dev/null +++ b/ios/Classes/SwiftLivekitClientPlugin.swift @@ -0,0 +1,114 @@ +import Flutter +import UIKit +import WebRTC + +public class SwiftLivekitClientPlugin: NSObject, FlutterPlugin { + public static func register(with registrar: FlutterPluginRegistrar) { + let channel = FlutterMethodChannel(name: "livekit_client", binaryMessenger: registrar.messenger()) + let instance = SwiftLivekitClientPlugin() + registrar.addMethodCallDelegate(instance, channel: channel) + } + + // https://developer.apple.com/documentation/avfaudio/avaudiosession/category + let categoryMap: [String: AVAudioSession.Category] = [ + "ambient": .ambient, + "multiRoute": .multiRoute, + "playAndRecord": .playAndRecord, + "playback": .playback, + "record": .record, + "soloAmbient": .soloAmbient, + ] + + // https://developer.apple.com/documentation/avfaudio/avaudiosession/categoryoptions + let categoryOptionsMap: [String: AVAudioSession.CategoryOptions] = [ + "mixWithOthers": .mixWithOthers, + "duckOthers": .duckOthers, + "interruptSpokenAudioAndMixWithOthers": .interruptSpokenAudioAndMixWithOthers, + "allowBluetooth": .allowBluetooth, + "allowBluetoothA2DP": .allowBluetoothA2DP, + "allowAirPlay": .allowAirPlay, + "defaultToSpeaker": .defaultToSpeaker, +// @available(iOS 14.5, *) +// "overrideMutedMicrophoneInterruption": .overrideMutedMicrophoneInterruption, + ] + + // https://developer.apple.com/documentation/avfaudio/avaudiosession/mode + let modeMap: [String: AVAudioSession.Mode] = [ + "default": .default, + "gameChat": .gameChat, + "measurement": .measurement, + "moviePlayback": .moviePlayback, + "spokenAudio": .spokenAudio, + "videoChat": .videoChat, + "videoRecording": .videoRecording, + "voiceChat": .voiceChat, + "voicePrompt": .voicePrompt, + ] + + private func categoryOptions(fromFlutter options: [String]) -> AVAudioSession.CategoryOptions { + var result: AVAudioSession.CategoryOptions = [] + for option in categoryOptionsMap { + if (options.contains(option.key)) { + result.insert(option.value) + } + } + return result + } + + public func onConfigureAudioSession(args: [String: Any?], result: @escaping FlutterResult) { + + let configuration = RTCAudioSessionConfiguration.webRTC() + + // Category + if let string = args["iosCategory"] as? String, + let category = categoryMap[string] { + configuration.category = category.rawValue + print("[LiveKit] Configuring category: ", configuration.category) + } + + // CategoryOptions + if let strings = args["iosCategoryOptions"] as? [String] { + configuration.categoryOptions = categoryOptions(fromFlutter: strings) + print("[LiveKit] Configuring categoryOptions: ", strings) + } + + // Mode + if let string = args["iosMode"] as? String, + let mode = modeMap[string] { + configuration.mode = mode.rawValue + print("[LiveKit] Configuring mode: ", configuration.mode) + } + + let session = RTCAudioSession.sharedInstance() + session.lockForConfiguration() + defer { + session.unlockForConfiguration() + } + + do { + try session.setConfiguration(configuration, active: true) + print("[LiveKit] Configure success") + result(true) + } catch let error { + print("[LiveKit] Configure audio error: ", error) + result(FlutterError(code: "configure", message: error.localizedDescription, details: nil)) + } + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + + guard let args = call.arguments as? [String: Any?] else { + print("[LiveKit] arguments must be a dictionary") + result(FlutterMethodNotImplemented) + return + } + + switch call.method { + case "configureAudioSession": + onConfigureAudioSession(args: args, result: result) + default: + print("[LiveKit] method not found: ", call.method) + result(FlutterMethodNotImplemented) + } + } +} diff --git a/ios/livekit_client.podspec b/ios/livekit_client.podspec new file mode 100644 index 000000000..f6564884e --- /dev/null +++ b/ios/livekit_client.podspec @@ -0,0 +1,25 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint livekit_client.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'livekit_client' + s.version = '0.0.1' + s.summary = 'A new flutter plugin project.' + s.description = <<-DESC +A new flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + s.dependency 'WebRTC-SDK', '92.4515.06' + s.platform = :ios, '12.1' + # Flutter.framework does not contain a i386 slice. + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } + s.swift_version = '5.0' + s.static_framework = true +end diff --git a/lib/src/livekit.dart b/lib/src/livekit.dart index a1a345c5f..d6823a217 100644 --- a/lib/src/livekit.dart +++ b/lib/src/livekit.dart @@ -1,3 +1,8 @@ +import 'package:flutter/services.dart'; +import 'package:livekit_client/src/logger.dart'; +import 'package:livekit_client/src/support/native_audio.dart'; +import 'track/audio_track.dart'; + import 'options.dart'; import 'room.dart'; @@ -5,6 +10,7 @@ import 'room.dart'; /// {@category Room} class LiveKitClient { static const version = '0.4.0'; + static const _channel = MethodChannel('livekit_client'); /// Connects to a LiveKit room static Future connect( @@ -17,4 +23,17 @@ class LiveKitClient { token, options: options, ); + + static Future configureAudioSession(NativeAudioConfiguration configuration) async { + try { + final result = await _channel.invokeMethod( + 'configureAudioSession', + configuration.toMap(), + ); + return result == true; + } catch (_) { + logger.warning('configureAudioSession did throw $_'); + return false; + } + } } diff --git a/lib/src/support/native_audio.dart b/lib/src/support/native_audio.dart new file mode 100644 index 000000000..aa5ef18f2 --- /dev/null +++ b/lib/src/support/native_audio.dart @@ -0,0 +1,85 @@ +enum IosAudioCategory { + soloAmbient, + playback, + record, + playAndRecord, + multiRoute, +} + +enum IosAudioMode { + default_, + gameChat, + measurement, + moviePlayback, + spokenAudio, + videoChat, + videoRecording, + voiceChat, + voicePrompt, +} + +enum IosAudioCategoryOption { + mixWithOthers, // Only playAndRecord, playback, or multiRoute. + duckOthers, // Only playAndRecord, playback, or multiRoute. + interruptSpokenAudioAndMixWithOthers, + allowBluetooth, // Only playAndRecord or record. + allowBluetoothA2DP, + allowAirPlay, + defaultToSpeaker, +} + +extension IOSAudioCategoryExt on IosAudioCategory { + String toStringValue() => { + IosAudioCategory.soloAmbient: 'soloAmbient', + IosAudioCategory.playback: 'playback', + IosAudioCategory.record: 'record', + IosAudioCategory.playAndRecord: 'playAndRecord', + IosAudioCategory.multiRoute: 'multiRoute', + }[this]!; +} + +extension IosAudioModeExt on IosAudioMode { + String toStringValue() => { + IosAudioMode.default_: 'default', + IosAudioMode.gameChat: 'gameChat', + IosAudioMode.measurement: 'measurement', + IosAudioMode.moviePlayback: 'moviePlayback', + IosAudioMode.spokenAudio: 'spokenAudio', + IosAudioMode.videoChat: 'videoChat', + IosAudioMode.videoRecording: 'videoRecording', + IosAudioMode.voiceChat: 'voiceChat', + IosAudioMode.voicePrompt: 'voicePrompt', + }[this]!; +} + +extension IosAudioCategoryOptionExt on IosAudioCategoryOption { + String toStringValue() => { + IosAudioCategoryOption.mixWithOthers: 'mixWithOthers', + IosAudioCategoryOption.duckOthers: 'duckOthers', + IosAudioCategoryOption.interruptSpokenAudioAndMixWithOthers: + 'interruptSpokenAudioAndMixWithOthers', + IosAudioCategoryOption.allowBluetooth: 'allowBluetooth', + IosAudioCategoryOption.allowBluetoothA2DP: 'allowBluetoothA2DP', + IosAudioCategoryOption.allowAirPlay: 'allowAirPlay', + IosAudioCategoryOption.defaultToSpeaker: 'defaultToSpeaker', + }[this]!; +} + +class NativeAudioConfiguration { + final IosAudioCategory? iosCategory; + final IosAudioMode? iosMode; + final Set? iosCategoryOptions; + + NativeAudioConfiguration({ + this.iosCategory, + this.iosMode, + this.iosCategoryOptions, + }); + + Map toMap() => { + if (iosCategory != null) 'iosCategory': iosCategory!.toStringValue(), + if (iosCategoryOptions != null) + 'iosCategoryOptions': iosCategoryOptions!.map((e) => e.toStringValue()).toList(), + if (iosMode != null) 'iosMode': iosMode!.toStringValue(), + }; +} diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index c67b62734..dc3c6373f 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -1,5 +1,7 @@ -import 'package:audio_session/audio_session.dart' as _as; +// import 'package:audio_session/audio_session.dart' as _as; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:livekit_client/src/livekit.dart'; +import '../support/native_audio.dart'; import 'package:synchronized/synchronized.dart' as sync; import '../logger.dart'; @@ -19,9 +21,9 @@ typedef AudioTrackConfigureAudioSession = Future Function(AudioTrackState class AudioTrack extends Track { // it's possible to set custom function here to customize audio session configuration - static AudioTrackConfigureAudioSession? onConfigureAudioSession = + static AudioTrackConfigureAudioSession onConfigureAudioSession = AudioTrackExt.configureAudioSession; - // = AudioTrackExt.configureAudioSession; + static final _counterLock = sync.Lock(); static AudioTrackState state = AudioTrackState.none; static int _localCount = 0; @@ -95,22 +97,32 @@ class AudioTrack extends Track { if (state != newState) { state = newState; logger.fine('[$runtimeType] didUpdateSate: $state'); - await onConfigureAudioSession?.call(state); + await onConfigureAudioSession.call(state); } } } extension AudioTrackExt on AudioTrack { // + // static Future configureAudioSession(AudioTrackState state) async { + // final config = state.defaultConfiguration(); + // logger.fine('[AudioTrack] configuring for ${state}, ${config.avAudioSessionCategory}...'); + // try { + // final _audioSession = await _as.AudioSession.instance; + // await _audioSession.configure(config); + // await _audioSession.setActive(true); + // } catch (error) { + // logger.warning('[$AudioTrack] Failed to configure ${error}'); + // } + // } + static Future configureAudioSession(AudioTrackState state) async { - final config = state.defaultConfiguration(); - logger.fine('[AudioTrack] configuring for ${state}, ${config.avAudioSessionCategory}...'); + final config = state.nativeAudioConfiguration(); + logger.fine('[AudioTrack] NEW configuring for ${state}, ${config}...'); try { - final _audioSession = await _as.AudioSession.instance; - await _audioSession.configure(config); - await _audioSession.setActive(true); + await LiveKitClient.configureAudioSession(config); } catch (error) { - logger.warning('[$AudioTrack] Failed to configure ${error}'); + logger.warning('[$AudioTrack] NEW Failed to configure ${error}'); } } } @@ -134,42 +146,85 @@ extension AudioTrackStateExt on AudioTrackState { } extension AudioRecommendationTypeExt on AudioTrackState { - // returns default configuration for the AudioTrackState - _as.AudioSessionConfiguration defaultConfiguration() { + // + NativeAudioConfiguration nativeAudioConfiguration() { // - const _baseConfiguration = _as.AudioSessionConfiguration( - // ios defaults to soloAmbient - avAudioSessionCategory: _as.AVAudioSessionCategory.soloAmbient, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers, - avAudioSessionMode: _as.AVAudioSessionMode.defaultMode, - avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, - avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, - ); - if (this == AudioTrackState.remoteOnly) { - return _baseConfiguration.copyWith( - avAudioSessionCategory: _as.AVAudioSessionCategory.playback, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, - avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, + return NativeAudioConfiguration( + iosCategory: IosAudioCategory.playback, + iosCategoryOptions: { + IosAudioCategoryOption.mixWithOthers, + IosAudioCategoryOption.duckOthers, + }, + iosMode: IosAudioMode.spokenAudio, ); - // TODO: Support AVAudioSessionCategory.record - // } else if (this == AudioTrackState.localOnly) { - // return _baseConfiguration.copyWith( - // avAudioSessionCategory: _as.AVAudioSessionCategory.record, - // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, - // avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - // ); - } else if (this == AudioTrackState.localAndRemote || this == AudioTrackState.localOnly) { - return _baseConfiguration.copyWith( - avAudioSessionCategory: _as.AVAudioSessionCategory.playAndRecord, - avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers | - _as.AVAudioSessionCategoryOptions.allowBluetooth | - _as.AVAudioSessionCategoryOptions.allowAirPlay | - _as.AVAudioSessionCategoryOptions.defaultToSpeaker, - avAudioSessionMode: _as.AVAudioSessionMode.voiceChat, + } else if ([ + AudioTrackState.localOnly, + AudioTrackState.localAndRemote, + ].contains(this)) { + return NativeAudioConfiguration( + iosCategory: IosAudioCategory.playAndRecord, + iosCategoryOptions: { + IosAudioCategoryOption.allowBluetooth, + IosAudioCategoryOption.mixWithOthers, + IosAudioCategoryOption.duckOthers, + }, + iosMode: IosAudioMode.voiceChat, ); } - return _baseConfiguration; + // TODO: .record category causes exception in WebRTC lib for unknown reason + // AudioTrackState.localOnly: NativeAudioConfiguration( + // iosCategory: IosAudioCategory.record, + // iosCategoryOptions: { + // // IosAudioCategoryOption.allowBluetooth, + // }, + // iosMode: IosAudioMode.spokenAudio, + // ), + + return NativeAudioConfiguration( + iosCategory: IosAudioCategory.soloAmbient, + iosCategoryOptions: {}, + iosMode: IosAudioMode.default_, + ); } + + // // returns default configuration for the AudioTrackState + // _as.AudioSessionConfiguration defaultConfiguration() { + // // + // const _baseConfiguration = _as.AudioSessionConfiguration( + // // ios defaults to soloAmbient + // avAudioSessionCategory: _as.AVAudioSessionCategory.soloAmbient, + // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers, + // avAudioSessionMode: _as.AVAudioSessionMode.defaultMode, + // avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, + // avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, + // ); + + // if (this == AudioTrackState.remoteOnly) { + // return _baseConfiguration.copyWith( + // avAudioSessionCategory: _as.AVAudioSessionCategory.playback, + // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, + // avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, + // ); + // // TODO: Support AVAudioSessionCategory.record + // // } else if (this == AudioTrackState.localOnly) { + // // return _baseConfiguration.copyWith( + // // avAudioSessionCategory: _as.AVAudioSessionCategory.record, + // // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, + // // avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, + // // ); + // } else if (this == AudioTrackState.localAndRemote || this == AudioTrackState.localOnly) { + // return _baseConfiguration.copyWith( + // avAudioSessionCategory: _as.AVAudioSessionCategory.playAndRecord, + // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers | + // _as.AVAudioSessionCategoryOptions.allowBluetooth | + // _as.AVAudioSessionCategoryOptions.allowAirPlay | + // _as.AVAudioSessionCategoryOptions.defaultToSpeaker, + // avAudioSessionMode: _as.AVAudioSessionMode.voiceChat, + // ); + // } + + // return _baseConfiguration; + // } } diff --git a/pubspec.lock b/pubspec.lock index 70ca38cc8..5b2622d88 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -8,13 +8,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.8.1" - audio_session: - dependency: "direct main" - description: - name: audio_session - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.6+1" boolean_selector: dependency: transitive description: @@ -102,17 +95,12 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" flutter_webrtc: dependency: "direct main" description: path: "." ref: use-custom-webrtc-build - resolved-ref: "64d17b813f77b600c3c8bd77b5fd82397f62ca2a" + resolved-ref: a288de4a4d5aa11ea5688f360eef9c4e18a3f3ff url: "https://github.com/livekit/flutter-webrtc" source: git version: "0.6.7" @@ -130,13 +118,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" - js: - dependency: transitive - description: - name: js - url: "https://pub.dartlang.org" - source: hosted - version: "0.6.3" lints: dependency: transitive description: @@ -242,13 +223,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.0" - rxdart: - dependency: transitive - description: - name: rxdart - url: "https://pub.dartlang.org" - source: hosted - version: "0.27.2" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 547c9521e..e47e2a5bd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,14 +16,17 @@ dependencies: uuid: ^3.0.4 synchronized: ^3.0.0 protobuf: ^2.0.0 - audio_session: ^0.1.6+1 - + # audio_session: ^0.1.6+1 + flutter_webrtc: # This will use custom webrtc build from # https://github.com/webrtc-sdk/Specs/releases git: url: https://github.com/livekit/flutter-webrtc ref: use-custom-webrtc-build + # git: + # url: https://github.com/livekit/flutter-webrtc + # ref: audio-session # ^0.6.7 # path: ../../repos_livekit/flutter-webrtc/ @@ -42,3 +45,13 @@ dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^1.0.4 + +flutter: + # This section identifies this Flutter project as a plugin project. + # The 'pluginClass' and Android 'package' identifiers should not ordinarily + # be modified. They are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + platforms: + ios: + pluginClass: LivekitClientPlugin From 5c889072782f8cbd507c4a528eae51b7b844297c Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Wed, 29 Sep 2021 23:19:01 +0900 Subject: [PATCH 26/50] defaults adjustment --- lib/src/track/audio_track.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index dc3c6373f..2a6e73e05 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -154,7 +154,7 @@ extension AudioRecommendationTypeExt on AudioTrackState { iosCategory: IosAudioCategory.playback, iosCategoryOptions: { IosAudioCategoryOption.mixWithOthers, - IosAudioCategoryOption.duckOthers, + // IosAudioCategoryOption.duckOthers, }, iosMode: IosAudioMode.spokenAudio, ); @@ -167,7 +167,7 @@ extension AudioRecommendationTypeExt on AudioTrackState { iosCategoryOptions: { IosAudioCategoryOption.allowBluetooth, IosAudioCategoryOption.mixWithOthers, - IosAudioCategoryOption.duckOthers, + // IosAudioCategoryOption.duckOthers, }, iosMode: IosAudioMode.voiceChat, ); From 108986ce8373d4952fb7597edab344aa45097421 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Wed, 29 Sep 2021 23:29:22 +0900 Subject: [PATCH 27/50] iOS only for now --- lib/src/track/audio_track.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index 2a6e73e05..6de9c3d57 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -1,4 +1,7 @@ // import 'package:audio_session/audio_session.dart' as _as; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:livekit_client/src/livekit.dart'; import '../support/native_audio.dart'; @@ -117,6 +120,11 @@ extension AudioTrackExt on AudioTrack { // } static Future configureAudioSession(AudioTrackState state) async { + if (kIsWeb || !Platform.isIOS) { + // no-op other than iOS for now + return; + } + final config = state.nativeAudioConfiguration(); logger.fine('[AudioTrack] NEW configuring for ${state}, ${config}...'); try { From 112a50c26c3143b9ca1114a2ce815471c028d672 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 00:57:42 +0900 Subject: [PATCH 28/50] use lib 92.4515.07 --- example/ios/Podfile.lock | 12 ++++++------ example/pubspec.lock | 2 +- ios/livekit_client.podspec | 2 +- pubspec.lock | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 7a5ed91c8..fad0a3204 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -3,16 +3,16 @@ PODS: - flutter_webrtc (0.2.2): - Flutter - Libyuv (= 1703) - - WebRTC-SDK (= 92.4515.06) + - WebRTC-SDK (= 92.4515.07) - Libyuv (1703) - livekit_client (0.0.1): - Flutter - - WebRTC-SDK (= 92.4515.06) + - WebRTC-SDK (= 92.4515.07) - path_provider (0.0.1): - Flutter - shared_preferences (0.0.1): - Flutter - - WebRTC-SDK (92.4515.06) + - WebRTC-SDK (92.4515.07) DEPENDENCIES: - Flutter (from `Flutter`) @@ -40,12 +40,12 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a - flutter_webrtc: 251d24d5b756f19e0891d8b69843e53023de3a82 + flutter_webrtc: 6b71a1fc1d931a3dfe879e578ea10e2e6cd84f53 Libyuv: 5f79ced0ee66e60a612ca97de1e6ccacd187a437 - livekit_client: 352b5191b41fed22b23fc6a3e58e0fdf50175d5c + livekit_client: f42e479e64a540da4153eb4d67a3bff7da368b2d path_provider: d1e9807085df1f9cc9318206cd649dc0b76be3de shared_preferences: 5033afbb22d372e15aff8ff766df9021b845f273 - WebRTC-SDK: c116520af8b4be802cc2cdf359791eb23ef86de2 + WebRTC-SDK: 540a44f2e30e89c75e331d5c4a372253ba668233 PODFILE CHECKSUM: d99737230d634a0d2df8e653d175b8cab1c12584 diff --git a/example/pubspec.lock b/example/pubspec.lock index 78d4d8d82..c2b15f59e 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -112,7 +112,7 @@ packages: description: path: "." ref: use-custom-webrtc-build - resolved-ref: a288de4a4d5aa11ea5688f360eef9c4e18a3f3ff + resolved-ref: a514bcc74d323d34f42ec89dc3efd1cd59e1bcc7 url: "https://github.com/livekit/flutter-webrtc" source: git version: "0.6.7" diff --git a/ios/livekit_client.podspec b/ios/livekit_client.podspec index f6564884e..2be72414c 100644 --- a/ios/livekit_client.podspec +++ b/ios/livekit_client.podspec @@ -16,7 +16,7 @@ A new flutter plugin project. s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.dependency 'WebRTC-SDK', '92.4515.06' + s.dependency 'WebRTC-SDK', '92.4515.07' s.platform = :ios, '12.1' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } diff --git a/pubspec.lock b/pubspec.lock index 5b2622d88..a1ba085bd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -100,7 +100,7 @@ packages: description: path: "." ref: use-custom-webrtc-build - resolved-ref: a288de4a4d5aa11ea5688f360eef9c4e18a3f3ff + resolved-ref: a514bcc74d323d34f42ec89dc3efd1cd59e1bcc7 url: "https://github.com/livekit/flutter-webrtc" source: git version: "0.6.7" From 44b504689ef6536533a1f263730c876a9ab6954d Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 01:40:23 +0900 Subject: [PATCH 29/50] clean up --- example/ios/Runner/Info.plist | 2 - lib/src/livekit.dart | 5 +- lib/src/participant/local_participant.dart | 3 +- lib/src/participant/participant.dart | 14 ++-- lib/src/participant/remote_participant.dart | 12 ++-- lib/src/room.dart | 14 ++-- lib/src/rtc_engine.dart | 3 - lib/src/support/disposable.dart | 2 +- lib/src/track/audio_track.dart | 75 ++++----------------- 9 files changed, 35 insertions(+), 95 deletions(-) diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist index 350733461..626df2f53 100644 --- a/example/ios/Runner/Info.plist +++ b/example/ios/Runner/Info.plist @@ -29,8 +29,6 @@ UIBackgroundModes audio - fetch - processing UILaunchStoryboardName LaunchScreen diff --git a/lib/src/livekit.dart b/lib/src/livekit.dart index d6823a217..b7045872c 100644 --- a/lib/src/livekit.dart +++ b/lib/src/livekit.dart @@ -1,10 +1,9 @@ import 'package:flutter/services.dart'; -import 'package:livekit_client/src/logger.dart'; -import 'package:livekit_client/src/support/native_audio.dart'; -import 'track/audio_track.dart'; +import 'logger.dart'; import 'options.dart'; import 'room.dart'; +import 'support/native_audio.dart'; /// Main entry point to connect to a room. /// {@category Room} diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index bab40d1c3..90ac3125e 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -1,4 +1,3 @@ -import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:meta/meta.dart'; @@ -154,7 +153,7 @@ class LocalParticipant extends Participant { @override Future unpublishTrack(String trackSid, {bool notify = false}) async { logger.finer('Unpublish track sid: $trackSid, notify: $notify'); - final pub = trackPublications.firstWhereOrNull((e) => e.sid == trackSid); + final pub = trackPublications[trackSid]; if (pub is! LocalTrackPublication) return; trackPublications.remove(pub); diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index 28316226b..de2e9ec25 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -24,7 +24,7 @@ import 'remote_participant.dart'; abstract class Participant extends DisposeAwareChangeNotifier { /// map of track sid => published track // @Deprecated('This should be a SET') - final trackPublications = {}; + final trackPublications = {}; /// audio level between 0-1, 1 being the loudest double audioLevel = 0; @@ -69,7 +69,7 @@ abstract class Participant extends DisposeAwareChangeNotifier { /// tracks that are subscribed to List get subscribedTracks => - trackPublications.where((e) => e.subscribed).toList(); + trackPublications.values.where((e) => e.subscribed).toList(); /// for internal use /// {@nodoc} @@ -141,16 +141,14 @@ abstract class Participant extends DisposeAwareChangeNotifier { @internal void addTrackPublication(TrackPublication pub) { pub.track?.sid = pub.sid; - // - trackPublications.remove(pub); - trackPublications.add(pub); + trackPublications[pub.sid] = pub; } // Must implement Future unpublishTrack(String trackSid, {bool notify = false}); Future unpublishAllTracks({bool notify = false}) async { - final trackSids = trackPublications.map((e) => e.sid).toSet(); + final trackSids = trackPublications.keys.toSet(); for (final trackid in trackSids) { await unpublishTrack(trackid, notify: notify); } @@ -170,8 +168,8 @@ abstract class Participant extends DisposeAwareChangeNotifier { // Convenience extension extension ParticipantExt on Participant { List get videoTracks => - trackPublications.where((e) => e.kind == lk_models.TrackType.VIDEO).toList(); + trackPublications.values.where((e) => e.kind == lk_models.TrackType.VIDEO).toList(); List get audioTracks => - trackPublications.where((e) => e.kind == lk_models.TrackType.AUDIO).toList(); + trackPublications.values.where((e) => e.kind == lk_models.TrackType.AUDIO).toList(); } diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index a9546ed21..93b7782f2 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -1,4 +1,3 @@ -import 'package:collection/collection.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:meta/meta.dart'; @@ -46,10 +45,8 @@ class RemoteParticipant extends Participant { } RemoteTrackPublication? getTrackPublication(String sid) { - return trackPublications.firstWhereOrNull((element) => element.sid == sid) - as RemoteTrackPublication?; - // final pub = trackPublications[sid]; - // if (pub is RemoteTrackPublication) return pub; + final pub = trackPublications[sid]; + if (pub is RemoteTrackPublication) return pub; } /// for internal use @@ -148,8 +145,7 @@ class RemoteParticipant extends Participant { // unpublish any track that is not in the info final validSids = info.tracks.map((e) => e.sid); - final removeSids = - trackPublications.where((e) => !validSids.contains(e.sid)).map((e) => e.sid).toSet(); + final removeSids = trackPublications.keys.where((e) => !validSids.contains(e)).toSet(); for (final sid in removeSids) { await unpublishTrack(sid, notify: true); } @@ -158,7 +154,7 @@ class RemoteParticipant extends Participant { @override Future unpublishTrack(String trackSid, {bool notify = false}) async { logger.finer('Unpublish track sid: $trackSid, notify: $notify'); - final pub = trackPublications.firstWhereOrNull((e) => e.sid == trackSid); + final pub = trackPublications[trackSid]; if (pub is! RemoteTrackPublication) return; trackPublications.remove(pub); diff --git a/lib/src/room.dart b/lib/src/room.dart index 1eb13a43c..bc3104eb9 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -169,14 +169,14 @@ class Room extends DisposeAwareChangeNotifier { _connectionState = ConnectionState.reconnecting; events.emit(const RoomReconnectingEvent()); }) - ..on((event) => close()) + ..on((event) => _handleClose()) ..on((event) => _onParticipantUpdateEvent(event.participants)) ..on( (event) => _onEngineActiveSpeakersUpdateEvent(event.speakers)) ..on((event) => _onSignalSpeakersChangedEvent(event.speakers)) ..on(_onDataMessageEvent) ..on((event) async { - final track = localParticipant.trackPublications.firstWhereOrNull((e) => e.sid == event.sid); + final track = localParticipant.trackPublications[event.sid]; track?.muted = event.muted; }) ..on((event) async { @@ -207,8 +207,10 @@ class Room extends DisposeAwareChangeNotifier { /// Disconnects from the room, notifying server of disconnection. Future disconnect() async { - engine.signalClient.sendLeave(); - await close(); + if (_connectionState == ConnectionState.disconnected) { + engine.signalClient.sendLeave(); + } + await _handleClose(); } Future reconnect() async { @@ -242,8 +244,8 @@ class Room extends DisposeAwareChangeNotifier { } // there should be no problem calling this method multiple times - Future close() async { - logger.fine('[$objectId] close()'); + Future _handleClose() async { + logger.fine('[$objectId] _handleClose()'); if (_connectionState == ConnectionState.disconnected) { logger.warning('[$objectId]: close() already disconnected'); } diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 08c411aa0..b48eeee17 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -45,15 +45,12 @@ class RTCEngine extends Disposable { rtc.RTCDataChannel? _reliableDC; rtc.RTCDataChannel? _lossyDC; bool _iceConnected = false; - // bool isReconnecting = false; - // Room is only instantiated if connected, so defaults to connected. ConnectionState _connectionState = ConnectionState.disconnected; /// connection state of the room ConnectionState get connectionState => _connectionState; - // bool _isClosed = true; // true if publisher connection has already been established. // this is helpful to know if we need to restart ICE on the publisher connection bool _hasPublished = false; diff --git a/lib/src/support/disposable.dart b/lib/src/support/disposable.dart index d457f4aca..57e1f8f99 100644 --- a/lib/src/support/disposable.dart +++ b/lib/src/support/disposable.dart @@ -1,7 +1,7 @@ -import 'package:livekit_client/src/logger.dart'; import 'package:meta/meta.dart'; import '../extensions.dart'; +import '../logger.dart'; abstract class DisposeAware { // Should be true when is disposing or already disposed diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index 6de9c3d57..ed7ce36e6 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -3,12 +3,12 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; -import 'package:livekit_client/src/livekit.dart'; -import '../support/native_audio.dart'; import 'package:synchronized/synchronized.dart' as sync; +import '../livekit.dart'; import '../logger.dart'; import '../proto/livekit_models.pb.dart' as lk_models; +import '../support/native_audio.dart'; import '_audio_api.dart' if (dart.library.html) '_audio_html.dart' as audio; import 'local_audio_track.dart'; import 'track.dart'; @@ -107,25 +107,13 @@ class AudioTrack extends Track { extension AudioTrackExt on AudioTrack { // - // static Future configureAudioSession(AudioTrackState state) async { - // final config = state.defaultConfiguration(); - // logger.fine('[AudioTrack] configuring for ${state}, ${config.avAudioSessionCategory}...'); - // try { - // final _audioSession = await _as.AudioSession.instance; - // await _audioSession.configure(config); - // await _audioSession.setActive(true); - // } catch (error) { - // logger.warning('[$AudioTrack] Failed to configure ${error}'); - // } - // } - static Future configureAudioSession(AudioTrackState state) async { if (kIsWeb || !Platform.isIOS) { // no-op other than iOS for now return; } - final config = state.nativeAudioConfiguration(); + final config = state.defaultNativeAudioConfiguration(); logger.fine('[AudioTrack] NEW configuring for ${state}, ${config}...'); try { await LiveKitClient.configureAudioSession(config); @@ -155,7 +143,7 @@ extension AudioTrackStateExt on AudioTrackState { extension AudioRecommendationTypeExt on AudioTrackState { // - NativeAudioConfiguration nativeAudioConfiguration() { + NativeAudioConfiguration defaultNativeAudioConfiguration() { // if (this == AudioTrackState.remoteOnly) { return NativeAudioConfiguration( @@ -182,13 +170,15 @@ extension AudioRecommendationTypeExt on AudioTrackState { } // TODO: .record category causes exception in WebRTC lib for unknown reason - // AudioTrackState.localOnly: NativeAudioConfiguration( - // iosCategory: IosAudioCategory.record, - // iosCategoryOptions: { - // // IosAudioCategoryOption.allowBluetooth, - // }, - // iosMode: IosAudioMode.spokenAudio, - // ), + // if (this == AudioTrackState.localOnly) { + // return NativeAudioConfiguration( + // iosCategory: IosAudioCategory.record, + // iosCategoryOptions: { + // // IosAudioCategoryOption.allowBluetooth, + // }, + // iosMode: IosAudioMode.spokenAudio, + // ); + // } return NativeAudioConfiguration( iosCategory: IosAudioCategory.soloAmbient, @@ -196,43 +186,4 @@ extension AudioRecommendationTypeExt on AudioTrackState { iosMode: IosAudioMode.default_, ); } - - // // returns default configuration for the AudioTrackState - // _as.AudioSessionConfiguration defaultConfiguration() { - // // - // const _baseConfiguration = _as.AudioSessionConfiguration( - // // ios defaults to soloAmbient - // avAudioSessionCategory: _as.AVAudioSessionCategory.soloAmbient, - // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers, - // avAudioSessionMode: _as.AVAudioSessionMode.defaultMode, - // avAudioSessionRouteSharingPolicy: _as.AVAudioSessionRouteSharingPolicy.defaultPolicy, - // avAudioSessionSetActiveOptions: _as.AVAudioSessionSetActiveOptions.none, - // ); - - // if (this == AudioTrackState.remoteOnly) { - // return _baseConfiguration.copyWith( - // avAudioSessionCategory: _as.AVAudioSessionCategory.playback, - // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, - // avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - // ); - // // TODO: Support AVAudioSessionCategory.record - // // } else if (this == AudioTrackState.localOnly) { - // // return _baseConfiguration.copyWith( - // // avAudioSessionCategory: _as.AVAudioSessionCategory.record, - // // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.none, - // // avAudioSessionMode: _as.AVAudioSessionMode.spokenAudio, - // // ); - // } else if (this == AudioTrackState.localAndRemote || this == AudioTrackState.localOnly) { - // return _baseConfiguration.copyWith( - // avAudioSessionCategory: _as.AVAudioSessionCategory.playAndRecord, - // avAudioSessionCategoryOptions: _as.AVAudioSessionCategoryOptions.mixWithOthers | - // _as.AVAudioSessionCategoryOptions.allowBluetooth | - // _as.AVAudioSessionCategoryOptions.allowAirPlay | - // _as.AVAudioSessionCategoryOptions.defaultToSpeaker, - // avAudioSessionMode: _as.AVAudioSessionMode.voiceChat, - // ); - // } - - // return _baseConfiguration; - // } } From d8e254b0d7651e9e77da88661e5f0362a9731e7b Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 01:41:50 +0900 Subject: [PATCH 30/50] revert audio options for now --- lib/src/track/local_audio_track.dart | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/src/track/local_audio_track.dart b/lib/src/track/local_audio_track.dart index 0c8e0fd74..75b80b01d 100644 --- a/lib/src/track/local_audio_track.dart +++ b/lib/src/track/local_audio_track.dart @@ -17,10 +17,11 @@ class LocalAudioTrack extends AudioTrack { static Future create([LocalAudioTrackOptions? options]) async { // TODO: have back up incase the options fail final stream = await rtc.navigator.mediaDevices.getUserMedia({ - 'audio': { - 'echoCancellation': true, - 'noiseSuppression': true, - }, + // 'audio': { + // 'echoCancellation': true, + // 'noiseSuppression': true, + // }, + 'audio': true, 'video': false, }); From ea9ea7d13a2ad0fd269dff33b00827e084ea4c69 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 01:44:36 +0900 Subject: [PATCH 31/50] remove pod source --- example/ios/Podfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/example/ios/Podfile b/example/ios/Podfile index 042169679..c6a6a5c89 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,9 +1,6 @@ # Uncomment this line to define a global platform for your project platform :ios, '12.1' -source 'https://github.com/hiroshihorie/unx_webrtc.git' -source 'https://github.com/CocoaPods/Specs.git' - # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' From 0664a596194765a67cd4d280a9d77c5e8a8a782b Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 11:36:05 +0900 Subject: [PATCH 32/50] rename apple related audio --- ios/Classes/SwiftLivekitClientPlugin.swift | 6 +- lib/src/support/native_audio.dart | 118 ++++++++++++--------- lib/src/track/audio_track.dart | 24 ++--- 3 files changed, 83 insertions(+), 65 deletions(-) diff --git a/ios/Classes/SwiftLivekitClientPlugin.swift b/ios/Classes/SwiftLivekitClientPlugin.swift index 8cd0ad0ac..c7615a21e 100644 --- a/ios/Classes/SwiftLivekitClientPlugin.swift +++ b/ios/Classes/SwiftLivekitClientPlugin.swift @@ -60,20 +60,20 @@ public class SwiftLivekitClientPlugin: NSObject, FlutterPlugin { let configuration = RTCAudioSessionConfiguration.webRTC() // Category - if let string = args["iosCategory"] as? String, + if let string = args["appleAudioCategory"] as? String, let category = categoryMap[string] { configuration.category = category.rawValue print("[LiveKit] Configuring category: ", configuration.category) } // CategoryOptions - if let strings = args["iosCategoryOptions"] as? [String] { + if let strings = args["appleAudioCategoryOptions"] as? [String] { configuration.categoryOptions = categoryOptions(fromFlutter: strings) print("[LiveKit] Configuring categoryOptions: ", strings) } // Mode - if let string = args["iosMode"] as? String, + if let string = args["appleAudioMode"] as? String, let mode = modeMap[string] { configuration.mode = mode.rawValue print("[LiveKit] Configuring mode: ", configuration.mode) diff --git a/lib/src/support/native_audio.dart b/lib/src/support/native_audio.dart index aa5ef18f2..62b89cc8a 100644 --- a/lib/src/support/native_audio.dart +++ b/lib/src/support/native_audio.dart @@ -1,4 +1,5 @@ -enum IosAudioCategory { +// https://developer.apple.com/documentation/avfaudio/avaudiosession/category +enum AppleAudioCategory { soloAmbient, playback, record, @@ -6,7 +7,19 @@ enum IosAudioCategory { multiRoute, } -enum IosAudioMode { +// https://developer.apple.com/documentation/avfaudio/avaudiosession/categoryoptions +enum AppleAudioCategoryOption { + mixWithOthers, // Only playAndRecord, playback, or multiRoute. + duckOthers, // Only playAndRecord, playback, or multiRoute. + interruptSpokenAudioAndMixWithOthers, + allowBluetooth, // Only playAndRecord or record. + allowBluetoothA2DP, + allowAirPlay, + defaultToSpeaker, +} + +// https://developer.apple.com/documentation/avfaudio/avaudiosession/mode +enum AppleAudioMode { default_, gameChat, measurement, @@ -18,68 +31,73 @@ enum IosAudioMode { voicePrompt, } -enum IosAudioCategoryOption { - mixWithOthers, // Only playAndRecord, playback, or multiRoute. - duckOthers, // Only playAndRecord, playback, or multiRoute. - interruptSpokenAudioAndMixWithOthers, - allowBluetooth, // Only playAndRecord or record. - allowBluetoothA2DP, - allowAirPlay, - defaultToSpeaker, -} - -extension IOSAudioCategoryExt on IosAudioCategory { - String toStringValue() => { - IosAudioCategory.soloAmbient: 'soloAmbient', - IosAudioCategory.playback: 'playback', - IosAudioCategory.record: 'record', - IosAudioCategory.playAndRecord: 'playAndRecord', - IosAudioCategory.multiRoute: 'multiRoute', +extension AppleAudioCategoryExt on AppleAudioCategory { + String toStringValue() => { + AppleAudioCategory.soloAmbient: 'soloAmbient', + AppleAudioCategory.playback: 'playback', + AppleAudioCategory.record: 'record', + AppleAudioCategory.playAndRecord: 'playAndRecord', + AppleAudioCategory.multiRoute: 'multiRoute', }[this]!; } -extension IosAudioModeExt on IosAudioMode { - String toStringValue() => { - IosAudioMode.default_: 'default', - IosAudioMode.gameChat: 'gameChat', - IosAudioMode.measurement: 'measurement', - IosAudioMode.moviePlayback: 'moviePlayback', - IosAudioMode.spokenAudio: 'spokenAudio', - IosAudioMode.videoChat: 'videoChat', - IosAudioMode.videoRecording: 'videoRecording', - IosAudioMode.voiceChat: 'voiceChat', - IosAudioMode.voicePrompt: 'voicePrompt', +extension AppleAudioCategoryOptionExt on AppleAudioCategoryOption { + String toStringValue() => { + AppleAudioCategoryOption.mixWithOthers: 'mixWithOthers', + AppleAudioCategoryOption.duckOthers: 'duckOthers', + AppleAudioCategoryOption.interruptSpokenAudioAndMixWithOthers: + 'interruptSpokenAudioAndMixWithOthers', + AppleAudioCategoryOption.allowBluetooth: 'allowBluetooth', + AppleAudioCategoryOption.allowBluetoothA2DP: 'allowBluetoothA2DP', + AppleAudioCategoryOption.allowAirPlay: 'allowAirPlay', + AppleAudioCategoryOption.defaultToSpeaker: 'defaultToSpeaker', }[this]!; } -extension IosAudioCategoryOptionExt on IosAudioCategoryOption { - String toStringValue() => { - IosAudioCategoryOption.mixWithOthers: 'mixWithOthers', - IosAudioCategoryOption.duckOthers: 'duckOthers', - IosAudioCategoryOption.interruptSpokenAudioAndMixWithOthers: - 'interruptSpokenAudioAndMixWithOthers', - IosAudioCategoryOption.allowBluetooth: 'allowBluetooth', - IosAudioCategoryOption.allowBluetoothA2DP: 'allowBluetoothA2DP', - IosAudioCategoryOption.allowAirPlay: 'allowAirPlay', - IosAudioCategoryOption.defaultToSpeaker: 'defaultToSpeaker', +extension AppleAudioModeExt on AppleAudioMode { + String toStringValue() => { + AppleAudioMode.default_: 'default', + AppleAudioMode.gameChat: 'gameChat', + AppleAudioMode.measurement: 'measurement', + AppleAudioMode.moviePlayback: 'moviePlayback', + AppleAudioMode.spokenAudio: 'spokenAudio', + AppleAudioMode.videoChat: 'videoChat', + AppleAudioMode.videoRecording: 'videoRecording', + AppleAudioMode.voiceChat: 'voiceChat', + AppleAudioMode.voicePrompt: 'voicePrompt', }[this]!; } class NativeAudioConfiguration { - final IosAudioCategory? iosCategory; - final IosAudioMode? iosMode; - final Set? iosCategoryOptions; + final AppleAudioCategory? appleAudioCategory; + final Set? appleAudioCategoryOptions; + final AppleAudioMode? appleAudioMode; NativeAudioConfiguration({ - this.iosCategory, - this.iosMode, - this.iosCategoryOptions, + // for iOS / Mac + this.appleAudioCategory, + this.appleAudioCategoryOptions, + this.appleAudioMode, + // Android options + // ... }); Map toMap() => { - if (iosCategory != null) 'iosCategory': iosCategory!.toStringValue(), - if (iosCategoryOptions != null) - 'iosCategoryOptions': iosCategoryOptions!.map((e) => e.toStringValue()).toList(), - if (iosMode != null) 'iosMode': iosMode!.toStringValue(), + if (appleAudioCategory != null) 'appleAudioCategory': appleAudioCategory!.toStringValue(), + if (appleAudioCategoryOptions != null) + 'appleAudioCategoryOptions': + appleAudioCategoryOptions!.map((e) => e.toStringValue()).toList(), + if (appleAudioMode != null) 'appleAudioMode': appleAudioMode!.toStringValue(), }; + + NativeAudioConfiguration copyWith({ + AppleAudioCategory? appleAudioCategory, + AppleAudioMode? appleAudioMode, + Set? appleAudioCategoryOptions, + }) => + NativeAudioConfiguration( + appleAudioCategory: appleAudioCategory ?? this.appleAudioCategory, + appleAudioCategoryOptions: appleAudioCategoryOptions ?? this.appleAudioCategoryOptions, + appleAudioMode: appleAudioMode ?? this.appleAudioMode, + ); } diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index ed7ce36e6..678a6eb22 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -147,25 +147,25 @@ extension AudioRecommendationTypeExt on AudioTrackState { // if (this == AudioTrackState.remoteOnly) { return NativeAudioConfiguration( - iosCategory: IosAudioCategory.playback, - iosCategoryOptions: { - IosAudioCategoryOption.mixWithOthers, + appleAudioCategory: AppleAudioCategory.playback, + appleAudioCategoryOptions: { + AppleAudioCategoryOption.mixWithOthers, // IosAudioCategoryOption.duckOthers, }, - iosMode: IosAudioMode.spokenAudio, + appleAudioMode: AppleAudioMode.spokenAudio, ); } else if ([ AudioTrackState.localOnly, AudioTrackState.localAndRemote, ].contains(this)) { return NativeAudioConfiguration( - iosCategory: IosAudioCategory.playAndRecord, - iosCategoryOptions: { - IosAudioCategoryOption.allowBluetooth, - IosAudioCategoryOption.mixWithOthers, + appleAudioCategory: AppleAudioCategory.playAndRecord, + appleAudioCategoryOptions: { + AppleAudioCategoryOption.allowBluetooth, + AppleAudioCategoryOption.mixWithOthers, // IosAudioCategoryOption.duckOthers, }, - iosMode: IosAudioMode.voiceChat, + appleAudioMode: AppleAudioMode.voiceChat, ); } @@ -181,9 +181,9 @@ extension AudioRecommendationTypeExt on AudioTrackState { // } return NativeAudioConfiguration( - iosCategory: IosAudioCategory.soloAmbient, - iosCategoryOptions: {}, - iosMode: IosAudioMode.default_, + appleAudioCategory: AppleAudioCategory.soloAmbient, + appleAudioCategoryOptions: {}, + appleAudioMode: AppleAudioMode.default_, ); } } From 1f19b4c7fba1129eaa5ad168aa32d1042d73e752 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 16:47:26 +0900 Subject: [PATCH 33/50] `createListener` method --- example/lib/pages/room.dart | 2 +- lib/src/participant/participant.dart | 3 +++ lib/src/room.dart | 6 +++++- lib/src/rtc_engine.dart | 6 +++++- lib/src/signal_client.dart | 5 ++++- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/example/lib/pages/room.dart b/example/lib/pages/room.dart index b1616e89d..ef79f8461 100644 --- a/example/lib/pages/room.dart +++ b/example/lib/pages/room.dart @@ -25,7 +25,7 @@ class RoomPage extends StatefulWidget { class _RoomPageState extends State { // List participants = []; - late final _listener = EventsListener(widget.room.events); + late final EventsListener _listener = widget.room.createListener(); @override void initState() { diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index de2e9ec25..86270fd66 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -154,6 +154,9 @@ abstract class Participant extends DisposeAwareChangeNotifier { } } + /// convenience method to create [EventsListener] + EventsListener createListener({bool synchronized = false}) => + EventsListener(events, synchronized: synchronized); // // Equality operators // Object is considered equal when sid is equal diff --git a/lib/src/room.dart b/lib/src/room.dart index bc3104eb9..0fc8125f7 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -61,7 +61,7 @@ class Room extends DisposeAwareChangeNotifier { // suppport for multiple event listeners final events = EventsEmitter(); - late final _engineListener = EventsListener(engine.events); + late final _engineListener = engine.createListener(); /// internal use /// {@nodoc} @@ -391,4 +391,8 @@ class Room extends DisposeAwareChangeNotifier { events.emit(ParticipantDisconnectedEvent(participant: participant)); } + + /// convenience method to create [EventsListener] + EventsListener createListener({bool synchronized = false}) => + EventsListener(events, synchronized: synchronized); } diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index b48eeee17..b103fc007 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -67,7 +67,7 @@ class RTCEngine extends Disposable { int _reconnectAttempts = 0; final events = EventsEmitter(); - late final _signalListener = EventsListener(signalClient.events, synchronized: true); + late final _signalListener = signalClient.createListener(synchronized: true); final delays = CancelableDelayManager(); @@ -523,4 +523,8 @@ class RTCEngine extends Disposable { sid: event.sid, muted: event.muted, ))); + + /// convenience method to create [EventsListener] + EventsListener createListener({bool synchronized = false}) => + EventsListener(events, synchronized: synchronized); } diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index 1509c9638..a81cf7cf9 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:http/http.dart' as http; @@ -256,4 +255,8 @@ class SignalClient extends Disposable { _connected = false; events.emit(const SignalCloseEvent()); } + + /// convenience method to create [EventsListener] + EventsListener createListener({bool synchronized = false}) => + EventsListener(events, synchronized: synchronized); } From 14d176b85feb09de66f5bce04c6ae63246fab873 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 17:08:28 +0900 Subject: [PATCH 34/50] organize native audio --- lib/src/support/native_audio.dart | 2 +- lib/src/track/audio_track.dart | 170 ++++++++++++++---------------- 2 files changed, 79 insertions(+), 93 deletions(-) diff --git a/lib/src/support/native_audio.dart b/lib/src/support/native_audio.dart index 62b89cc8a..d57b292d8 100644 --- a/lib/src/support/native_audio.dart +++ b/lib/src/support/native_audio.dart @@ -92,8 +92,8 @@ class NativeAudioConfiguration { NativeAudioConfiguration copyWith({ AppleAudioCategory? appleAudioCategory, - AppleAudioMode? appleAudioMode, Set? appleAudioCategoryOptions, + AppleAudioMode? appleAudioMode, }) => NativeAudioConfiguration( appleAudioCategory: appleAudioCategory ?? this.appleAudioCategory, diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index 678a6eb22..f81d6b22b 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -20,17 +20,17 @@ enum AudioTrackState { localAndRemote, } -typedef AudioTrackConfigureAudioSession = Future Function(AudioTrackState state); +typedef ConfigureNativeAudioFunc = Future Function(AudioTrackState state); class AudioTrack extends Track { // it's possible to set custom function here to customize audio session configuration - static AudioTrackConfigureAudioSession onConfigureAudioSession = - AudioTrackExt.configureAudioSession; + static ConfigureNativeAudioFunc nativeAudioConfigurationForAudioTrackState = + defaultNativeAudioConfigurationFunc; - static final _counterLock = sync.Lock(); - static AudioTrackState state = AudioTrackState.none; - static int _localCount = 0; - static int _remoteCount = 0; + static final _trackCounterLock = sync.Lock(); + static AudioTrackState audioTrackState = AudioTrackState.none; + static int _localTrackCount = 0; + static int _remoteTrackCount = 0; rtc.MediaStream? mediaStream; @@ -55,13 +55,13 @@ class AudioTrack extends Track { } // update counter - await _counterLock.synchronized(() async { + await _trackCounterLock.synchronized(() async { if (this is LocalAudioTrack) { - _localCount++; + _localTrackCount++; } else if (this is! LocalAudioTrack) { - _remoteCount++; + _remoteTrackCount++; } - await _didUpdateCounter(); + await _onAudioTrackCountDidChange(); }); } @@ -77,63 +77,52 @@ class AudioTrack extends Track { audio.stopAudio(getCid()); // update counter - await _counterLock.synchronized(() async { + await _trackCounterLock.synchronized(() async { if (this is LocalAudioTrack) { - _localCount--; + _localTrackCount--; } else if (this is! LocalAudioTrack) { - _remoteCount--; + _remoteTrackCount--; } - await _didUpdateCounter(); + await _onAudioTrackCountDidChange(); }); } return didStop; } - Future _didUpdateCounter() async { - logger.fine('[$runtimeType] didUpdateCounter: local: $_localCount, remote: $_remoteCount'); - final newState = AudioTrackStateExt.computeAudioTrackState( - local: _localCount, - remote: _remoteCount, - ); + Future _onAudioTrackCountDidChange() async { + logger.fine('[$runtimeType] onAudioTrackCountDidChange: ' + 'local: $_localTrackCount, remote: $_remoteTrackCount'); - if (state != newState) { - state = newState; - logger.fine('[$runtimeType] didUpdateSate: $state'); - await onConfigureAudioSession.call(state); - } - } -} + final newState = _computeAudioTrackState(); -extension AudioTrackExt on AudioTrack { - // - static Future configureAudioSession(AudioTrackState state) async { - if (kIsWeb || !Platform.isIOS) { - // no-op other than iOS for now - return; - } + if (audioTrackState != newState) { + audioTrackState = newState; + logger.fine('[$runtimeType] didUpdateSate: $audioTrackState'); + + NativeAudioConfiguration? config; + if (kIsWeb || !Platform.isIOS) { + // Only iOS for now... + config = await nativeAudioConfigurationForAudioTrackState.call(audioTrackState); + } - final config = state.defaultNativeAudioConfiguration(); - logger.fine('[AudioTrack] NEW configuring for ${state}, ${config}...'); - try { - await LiveKitClient.configureAudioSession(config); - } catch (error) { - logger.warning('[$AudioTrack] NEW Failed to configure ${error}'); + if (config != null) { + logger.fine('[$runtimeType] configuring for ${audioTrackState} using ${config}...'); + try { + await LiveKitClient.configureAudioSession(config); + } catch (error) { + logger.warning('[$runtimeType] Failed to configure ${error}'); + } + } } } -} -extension AudioTrackStateExt on AudioTrackState { - // - static AudioTrackState computeAudioTrackState({ - required int local, - required int remote, - }) { - if (local > 0 && remote == 0) { + static AudioTrackState _computeAudioTrackState() { + if (_localTrackCount > 0 && _remoteTrackCount == 0) { return AudioTrackState.localOnly; - } else if (local == 0 && remote > 0) { + } else if (_localTrackCount == 0 && _remoteTrackCount > 0) { return AudioTrackState.remoteOnly; - } else if (local > 0 && remote > 0) { + } else if (_localTrackCount > 0 && _remoteTrackCount > 0) { return AudioTrackState.localAndRemote; } // Default @@ -141,49 +130,46 @@ extension AudioTrackStateExt on AudioTrackState { } } -extension AudioRecommendationTypeExt on AudioTrackState { +Future defaultNativeAudioConfigurationFunc(AudioTrackState state) async { // - NativeAudioConfiguration defaultNativeAudioConfiguration() { - // - if (this == AudioTrackState.remoteOnly) { - return NativeAudioConfiguration( - appleAudioCategory: AppleAudioCategory.playback, - appleAudioCategoryOptions: { - AppleAudioCategoryOption.mixWithOthers, - // IosAudioCategoryOption.duckOthers, - }, - appleAudioMode: AppleAudioMode.spokenAudio, - ); - } else if ([ - AudioTrackState.localOnly, - AudioTrackState.localAndRemote, - ].contains(this)) { - return NativeAudioConfiguration( - appleAudioCategory: AppleAudioCategory.playAndRecord, - appleAudioCategoryOptions: { - AppleAudioCategoryOption.allowBluetooth, - AppleAudioCategoryOption.mixWithOthers, - // IosAudioCategoryOption.duckOthers, - }, - appleAudioMode: AppleAudioMode.voiceChat, - ); - } - - // TODO: .record category causes exception in WebRTC lib for unknown reason - // if (this == AudioTrackState.localOnly) { - // return NativeAudioConfiguration( - // iosCategory: IosAudioCategory.record, - // iosCategoryOptions: { - // // IosAudioCategoryOption.allowBluetooth, - // }, - // iosMode: IosAudioMode.spokenAudio, - // ); - // } - + if (state == AudioTrackState.remoteOnly) { + return NativeAudioConfiguration( + appleAudioCategory: AppleAudioCategory.playback, + appleAudioCategoryOptions: { + AppleAudioCategoryOption.mixWithOthers, + // IosAudioCategoryOption.duckOthers, + }, + appleAudioMode: AppleAudioMode.spokenAudio, + ); + } else if ([ + AudioTrackState.localOnly, + AudioTrackState.localAndRemote, + ].contains(state)) { return NativeAudioConfiguration( - appleAudioCategory: AppleAudioCategory.soloAmbient, - appleAudioCategoryOptions: {}, - appleAudioMode: AppleAudioMode.default_, + appleAudioCategory: AppleAudioCategory.playAndRecord, + appleAudioCategoryOptions: { + AppleAudioCategoryOption.allowBluetooth, + AppleAudioCategoryOption.mixWithOthers, + // IosAudioCategoryOption.duckOthers, + }, + appleAudioMode: AppleAudioMode.voiceChat, ); } + + // TODO: .record category causes exception in WebRTC lib for unknown reason + // if (this == AudioTrackState.localOnly) { + // return NativeAudioConfiguration( + // iosCategory: IosAudioCategory.record, + // iosCategoryOptions: { + // // IosAudioCategoryOption.allowBluetooth, + // }, + // iosMode: IosAudioMode.spokenAudio, + // ); + // } + + return NativeAudioConfiguration( + appleAudioCategory: AppleAudioCategory.soloAmbient, + appleAudioCategoryOptions: {}, + appleAudioMode: AppleAudioMode.default_, + ); } From 5e8fef0113a578ad4db05a4c72a26cee18cdbc42 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 17:21:23 +0900 Subject: [PATCH 35/50] `SpeakingChangedEvent` only on `Participant` --- lib/src/participant/participant.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index 86270fd66..456b2a984 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -108,7 +108,7 @@ abstract class Participant extends DisposeAwareChangeNotifier { lastSpokeAt = DateTime.now(); } - [events, roomEvents].emit(SpeakingChangedEvent( + events.emit(SpeakingChangedEvent( participant: this, speaking: speaking, )); From 83dccbe076e46894901adec3e637a6fbe77f1cbb Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 17:51:50 +0900 Subject: [PATCH 36/50] refactoring --- ios/Classes/LivekitClientPlugin.h | 2 +- ios/Classes/LivekitClientPlugin.m | 6 +-- ...n.swift => SwiftLiveKitClientPlugin.swift} | 10 ++--- ios/livekit_client.podspec | 37 ++++++++++--------- lib/src/livekit.dart | 14 ------- lib/src/support/native_audio.dart | 19 ++++++++++ lib/src/track/audio_track.dart | 3 +- 7 files changed, 48 insertions(+), 43 deletions(-) rename ios/Classes/{SwiftLivekitClientPlugin.swift => SwiftLiveKitClientPlugin.swift} (92%) diff --git a/ios/Classes/LivekitClientPlugin.h b/ios/Classes/LivekitClientPlugin.h index 7f716d504..1219c0d84 100644 --- a/ios/Classes/LivekitClientPlugin.h +++ b/ios/Classes/LivekitClientPlugin.h @@ -1,4 +1,4 @@ #import -@interface LivekitClientPlugin : NSObject +@interface LiveKitClientPlugin : NSObject @end diff --git a/ios/Classes/LivekitClientPlugin.m b/ios/Classes/LivekitClientPlugin.m index 349ba42f9..670eb810c 100644 --- a/ios/Classes/LivekitClientPlugin.m +++ b/ios/Classes/LivekitClientPlugin.m @@ -1,4 +1,4 @@ -#import "LivekitClientPlugin.h" +#import "LiveKitClientPlugin.h" #if __has_include() #import #else @@ -8,8 +8,8 @@ #import "livekit_client-Swift.h" #endif -@implementation LivekitClientPlugin +@implementation LiveKitClientPlugin + (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftLivekitClientPlugin registerWithRegistrar:registrar]; + [SwiftLiveKitClientPlugin registerWithRegistrar:registrar]; } @end diff --git a/ios/Classes/SwiftLivekitClientPlugin.swift b/ios/Classes/SwiftLiveKitClientPlugin.swift similarity index 92% rename from ios/Classes/SwiftLivekitClientPlugin.swift rename to ios/Classes/SwiftLiveKitClientPlugin.swift index c7615a21e..14aa2bea1 100644 --- a/ios/Classes/SwiftLivekitClientPlugin.swift +++ b/ios/Classes/SwiftLiveKitClientPlugin.swift @@ -2,10 +2,10 @@ import Flutter import UIKit import WebRTC -public class SwiftLivekitClientPlugin: NSObject, FlutterPlugin { +public class SwiftLiveKitClientPlugin: NSObject, FlutterPlugin { public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: "livekit_client", binaryMessenger: registrar.messenger()) - let instance = SwiftLivekitClientPlugin() + let instance = SwiftLiveKitClientPlugin() registrar.addMethodCallDelegate(instance, channel: channel) } @@ -55,7 +55,7 @@ public class SwiftLivekitClientPlugin: NSObject, FlutterPlugin { return result } - public func onConfigureAudioSession(args: [String: Any?], result: @escaping FlutterResult) { + public func handleConfigureNativeAudio(args: [String: Any?], result: @escaping FlutterResult) { let configuration = RTCAudioSessionConfiguration.webRTC() @@ -104,8 +104,8 @@ public class SwiftLivekitClientPlugin: NSObject, FlutterPlugin { } switch call.method { - case "configureAudioSession": - onConfigureAudioSession(args: args, result: result) + case "configureNativeAudio": + handleConfigureNativeAudio(args: args, result: result) default: print("[LiveKit] method not found: ", call.method) result(FlutterMethodNotImplemented) diff --git a/ios/livekit_client.podspec b/ios/livekit_client.podspec index 2be72414c..ddb698c39 100644 --- a/ios/livekit_client.podspec +++ b/ios/livekit_client.podspec @@ -1,25 +1,26 @@ # -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. -# Run `pod lib lint livekit_client.podspec` to validate before publishing. +# LiveKit +# https://livekit.io/ +# https://github.com/livekit # + Pod::Spec.new do |s| - s.name = 'livekit_client' - s.version = '0.0.1' - s.summary = 'A new flutter plugin project.' - s.description = <<-DESC -A new flutter plugin project. - DESC - s.homepage = 'http://example.com' - s.license = { :file => '../LICENSE' } - s.author = { 'Your Company' => 'email@example.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' + s.name = 'livekit_client' + s.version = '0.0.1' + s.summary = 'Open source platform for real-time audio and video.' + s.description = 'Open source platform for real-time audio and video.' + s.homepage = 'https://livekit.io/' + s.license = { :file => '../LICENSE' } + s.author = { 'LiveKit' => 'contact@livekit.io' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.dependency 'WebRTC-SDK', '92.4515.07' - s.platform = :ios, '12.1' + s.platform = :ios, '12.1' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } - s.swift_version = '5.0' - s.static_framework = true + s.swift_version = '5.0' + s.static_framework = true + + s.dependency 'Flutter' + s.dependency 'WebRTC-SDK', '92.4515.07' end diff --git a/lib/src/livekit.dart b/lib/src/livekit.dart index b7045872c..d31f47029 100644 --- a/lib/src/livekit.dart +++ b/lib/src/livekit.dart @@ -9,7 +9,6 @@ import 'support/native_audio.dart'; /// {@category Room} class LiveKitClient { static const version = '0.4.0'; - static const _channel = MethodChannel('livekit_client'); /// Connects to a LiveKit room static Future connect( @@ -22,17 +21,4 @@ class LiveKitClient { token, options: options, ); - - static Future configureAudioSession(NativeAudioConfiguration configuration) async { - try { - final result = await _channel.invokeMethod( - 'configureAudioSession', - configuration.toMap(), - ); - return result == true; - } catch (_) { - logger.warning('configureAudioSession did throw $_'); - return false; - } - } } diff --git a/lib/src/support/native_audio.dart b/lib/src/support/native_audio.dart index d57b292d8..0af42246c 100644 --- a/lib/src/support/native_audio.dart +++ b/lib/src/support/native_audio.dart @@ -1,4 +1,8 @@ // https://developer.apple.com/documentation/avfaudio/avaudiosession/category +import 'package:flutter/services.dart'; + +import '../logger.dart'; + enum AppleAudioCategory { soloAmbient, playback, @@ -101,3 +105,18 @@ class NativeAudioConfiguration { appleAudioMode: appleAudioMode ?? this.appleAudioMode, ); } + +const _lkMethodChannel = MethodChannel('livekit_client'); + +Future configureNativeAudio(NativeAudioConfiguration configuration) async { + try { + final result = await _lkMethodChannel.invokeMethod( + 'configureNativeAudio', + configuration.toMap(), + ); + return result == true; + } catch (_) { + logger.warning('configureAudioSession did throw $_'); + return false; + } +} diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index f81d6b22b..b7f552af6 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -5,7 +5,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:synchronized/synchronized.dart' as sync; -import '../livekit.dart'; import '../logger.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../support/native_audio.dart'; @@ -109,7 +108,7 @@ class AudioTrack extends Track { if (config != null) { logger.fine('[$runtimeType] configuring for ${audioTrackState} using ${config}...'); try { - await LiveKitClient.configureAudioSession(config); + await configureNativeAudio(config); } catch (error) { logger.warning('[$runtimeType] Failed to configure ${error}'); } From 1423c8745bb96ca3ef4b186fb9aa971e856ea24e Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 18:05:39 +0900 Subject: [PATCH 37/50] fix ios compile --- example/ios/Podfile.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index fad0a3204..14d0b26ec 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -42,11 +42,11 @@ SPEC CHECKSUMS: Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a flutter_webrtc: 6b71a1fc1d931a3dfe879e578ea10e2e6cd84f53 Libyuv: 5f79ced0ee66e60a612ca97de1e6ccacd187a437 - livekit_client: f42e479e64a540da4153eb4d67a3bff7da368b2d + livekit_client: 9216ac9adba8d54cefc870bbcb657ec1da534309 path_provider: d1e9807085df1f9cc9318206cd649dc0b76be3de shared_preferences: 5033afbb22d372e15aff8ff766df9021b845f273 WebRTC-SDK: 540a44f2e30e89c75e331d5c4a372253ba668233 -PODFILE CHECKSUM: d99737230d634a0d2df8e653d175b8cab1c12584 +PODFILE CHECKSUM: 82aed1035f46bfa5b522f0d0dbf4730f17ec65ff COCOAPODS: 1.11.2 diff --git a/pubspec.yaml b/pubspec.yaml index e47e2a5bd..884c6c1c7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,4 +54,4 @@ flutter: plugin: platforms: ios: - pluginClass: LivekitClientPlugin + pluginClass: LiveKitClientPlugin From 38f60fba7a852f2dd8cbce27554aa87ded3e59f5 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 18:29:11 +0900 Subject: [PATCH 38/50] fix configure audio only for iOS logic --- lib/src/track/audio_track.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/track/audio_track.dart b/lib/src/track/audio_track.dart index b7f552af6..68fc5ff56 100644 --- a/lib/src/track/audio_track.dart +++ b/lib/src/track/audio_track.dart @@ -100,7 +100,7 @@ class AudioTrack extends Track { logger.fine('[$runtimeType] didUpdateSate: $audioTrackState'); NativeAudioConfiguration? config; - if (kIsWeb || !Platform.isIOS) { + if (!kIsWeb && Platform.isIOS) { // Only iOS for now... config = await nativeAudioConfigurationForAudioTrackState.call(audioTrackState); } From 15a809adc3f3c7f7f1a5f99897e16cb17f256d4a Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 21:45:41 +0900 Subject: [PATCH 39/50] minor fix & clean up --- example/lib/pages/room.dart | 5 ++++- lib/src/managers/event.dart | 11 +++++++---- lib/src/room.dart | 4 ++-- pubspec.yaml | 21 --------------------- 4 files changed, 13 insertions(+), 28 deletions(-) diff --git a/example/lib/pages/room.dart b/example/lib/pages/room.dart index ef79f8461..53b418131 100644 --- a/example/lib/pages/room.dart +++ b/example/lib/pages/room.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:math' as math; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:livekit_client/livekit_client.dart'; @@ -48,7 +49,9 @@ class _RoomPageState extends State { } void _setUpListeners() => _listener - ..on((_) => Navigator.pop(context)) + ..on((_) async { + WidgetsBinding.instance?.addPostFrameCallback((timeStamp) => Navigator.pop(context)); + }) ..on((event) { String decoded = 'Failed to decode'; try { diff --git a/lib/src/managers/event.dart b/lib/src/managers/event.dart index fe25e58eb..342660976 100644 --- a/lib/src/managers/event.dart +++ b/lib/src/managers/event.dart @@ -71,10 +71,13 @@ abstract class EventsListenable extends Disposable { Future dispose() async { // mark as disposed super.dispose(); - // Stop listening to all events - logger.fine('${objectId} dispose() cancelling ${_listeners.length} event(s)'); - for (final listener in _listeners) { - await listener.cancel(); + + if (_listeners.isNotEmpty) { + // Stop listening to all events + logger.fine('${objectId} dispose() cancelling ${_listeners.length} event(s)'); + for (final listener in _listeners) { + await listener.cancel(); + } } } diff --git a/lib/src/room.dart b/lib/src/room.dart index 0fc8125f7..99a4838e6 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -207,7 +207,7 @@ class Room extends DisposeAwareChangeNotifier { /// Disconnects from the room, notifying server of disconnection. Future disconnect() async { - if (_connectionState == ConnectionState.disconnected) { + if (_connectionState != ConnectionState.disconnected) { engine.signalClient.sendLeave(); } await _handleClose(); @@ -251,7 +251,7 @@ class Room extends DisposeAwareChangeNotifier { } // clean up RemoteParticipants - for (final _ in _participants.values) { + for (final _ in _participants.values.toList()) { // RemoteParticipant is responsible for disposing resources await _.dispose(); } diff --git a/pubspec.yaml b/pubspec.yaml index 884c6c1c7..898da3cc5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,6 @@ dependencies: uuid: ^3.0.4 synchronized: ^3.0.0 protobuf: ^2.0.0 - # audio_session: ^0.1.6+1 flutter_webrtc: # This will use custom webrtc build from @@ -24,22 +23,6 @@ dependencies: git: url: https://github.com/livekit/flutter-webrtc ref: use-custom-webrtc-build - # git: - # url: https://github.com/livekit/flutter-webrtc - # ref: audio-session - - # ^0.6.7 - # path: ../../repos_livekit/flutter-webrtc/ - - # protobuf: - # git: - # url: https://github.com/google/protobuf.dart.git - # ref: master - # path: protobuf/ - - # WebSocketChannel has design flaws - # https://github.com/dart-lang/web_socket_channel/issues/25 - # web_socket_channel: ^2.1.0 dev_dependencies: flutter_test: @@ -47,10 +30,6 @@ dev_dependencies: flutter_lints: ^1.0.4 flutter: - # This section identifies this Flutter project as a plugin project. - # The 'pluginClass' and Android 'package' identifiers should not ordinarily - # be modified. They are used by the tooling to maintain consistency when - # adding or updating assets for this project. plugin: platforms: ios: From 51cad27b94ba0ece2d739d9e4d24c759662a4a78 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 23:29:37 +0900 Subject: [PATCH 40/50] change dispose logic --- lib/src/livekit.dart | 4 -- lib/src/managers/delay.dart | 18 ++++--- lib/src/managers/event.dart | 62 +++++++++++++++++------- lib/src/participant/participant.dart | 24 ++++++---- lib/src/room.dart | 28 +++++------ lib/src/rtc_engine.dart | 24 ++++++---- lib/src/signal_client.dart | 26 ++++++---- lib/src/support/change_notifier.dart | 29 ++++-------- lib/src/support/disposable.dart | 40 +++++++++++----- lib/src/track/track.dart | 4 +- lib/src/track/track_publication.dart | 2 +- lib/src/transport.dart | 71 +++++++++++++++------------- 12 files changed, 194 insertions(+), 138 deletions(-) diff --git a/lib/src/livekit.dart b/lib/src/livekit.dart index d31f47029..a1a345c5f 100644 --- a/lib/src/livekit.dart +++ b/lib/src/livekit.dart @@ -1,9 +1,5 @@ -import 'package:flutter/services.dart'; - -import 'logger.dart'; import 'options.dart'; import 'room.dart'; -import 'support/native_audio.dart'; /// Main entry point to connect to a room. /// {@category Room} diff --git a/lib/src/managers/delay.dart b/lib/src/managers/delay.dart index 78b7d9066..55b048d6c 100644 --- a/lib/src/managers/delay.dart +++ b/lib/src/managers/delay.dart @@ -2,10 +2,13 @@ import 'package:async/async.dart'; import '../support/disposable.dart'; -class CancelableDelayManager extends Disposable { +class CancelableDelayManager with Disposable { // final _delays = >[]; + CancelableDelayManager() { + onDispose(() async => await cancelAll()); + } // delay but cancelable Future waitFor( Duration wait, { @@ -21,11 +24,14 @@ class CancelableDelayManager extends Disposable { if (!op.isCanceled) ifNotCancelled?.call(); } - @override - Future dispose() async { - super.dispose(); - await cancelAll(); - } + // @override + // Future dispose() async { + // final didDispose = await super.dispose(); + // if (didDispose) { + // await cancelAll(); + // } + // return didDispose; + // } Future cancelAll() async { // cancel all delays diff --git a/lib/src/managers/event.dart b/lib/src/managers/event.dart index 342660976..f075a32ef 100644 --- a/lib/src/managers/event.dart +++ b/lib/src/managers/event.dart @@ -9,6 +9,18 @@ import '../extensions.dart'; import '../logger.dart'; import '../types.dart'; +mixin EventCreatable on Disposable { + final events = EventsEmitter(); + EventsListener createListener({bool synchronized = false}) => + EventsListener(events, synchronized: synchronized); + + @override + Future dispose() async { + final didDispose = await super.dispose(); + if (didDispose) await events.dispose(); + return didDispose; + } +} // Type-safe, multi-listenable, dispose safe event handling // TODO: Move to a separate package @@ -32,10 +44,13 @@ class EventsEmitter extends EventsListenable { @override @mustCallSuper - Future dispose() async { + Future dispose() async { // mark as disposed - await super.dispose(); - await streamCtrl.close(); + final didDispose = await super.dispose(); + if (didDispose) { + await streamCtrl.close(); + } + return didDispose; } } @@ -53,7 +68,7 @@ class EventsListener extends EventsListenable { } // ensures all listeners will close on dispose -abstract class EventsListenable extends Disposable { +abstract class EventsListenable with Disposable { // the emitter to listen to EventsEmitter get emitter; @@ -64,23 +79,34 @@ abstract class EventsListenable extends Disposable { EventsListenable({ required this.synchronized, - }); - - @override - @mustCallSuper - Future dispose() async { - // mark as disposed - super.dispose(); - - if (_listeners.isNotEmpty) { - // Stop listening to all events - logger.fine('${objectId} dispose() cancelling ${_listeners.length} event(s)'); - for (final listener in _listeners) { - await listener.cancel(); + }) { + onDispose(() async { + if (_listeners.isNotEmpty) { + // Stop listening to all events + logger.fine('${objectId} cancelling ${_listeners.length} listeners(s)'); + for (final listener in _listeners) { + await listener.cancel(); + } } - } + }); } + // @override + // @mustCallSuper + // Future dispose() async { + // // mark as disposed + // final didDispose = await super.dispose(); + // if (didDispose && _listeners.isNotEmpty) { + // // Stop listening to all events + // logger.fine('${objectId} dispose() cancelling ${_listeners.length} event(s)'); + // for (final listener in _listeners) { + // await listener.cancel(); + // } + // } + + // return didDispose; + // } + // listens to all events, guaranteed to be cancelled on dispose CancelListenFunc listen(FutureOr Function(T) onEvent) { // diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index 456b2a984..22ff568a8 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -2,12 +2,13 @@ import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:meta/meta.dart'; -import '../support/change_notifier.dart'; import '../events.dart'; import '../extensions.dart'; import '../logger.dart'; import '../managers/event.dart'; import '../proto/livekit_models.pb.dart' as lk_models; +import '../support/change_notifier.dart'; +import '../support/disposable.dart'; import '../track/track_publication.dart'; import 'remote_participant.dart'; @@ -21,7 +22,7 @@ import 'remote_participant.dart'; /// Base for [RemoteParticipant] and [LocalParticipant], /// can not be instantiated directly. -abstract class Participant extends DisposeAwareChangeNotifier { +abstract class Participant extends ChangeNotifier with Disposable, DisposeGuardChangeNotifier { /// map of track sid => published track // @Deprecated('This should be a SET') final trackPublications = {}; @@ -86,17 +87,20 @@ abstract class Participant extends DisposeAwareChangeNotifier { logger.fine('[ParticipantEvent] $event, will notifyListeners()'); notifyListeners(); }); - } - @override - @mustCallSuper - Future dispose() async { - // This will mark object as disposed - super.dispose(); - await unpublishAllTracks(); - await events.dispose(); + onDispose(() async { + await unpublishAllTracks(); + await events.dispose(); + }); } + // @override + // @mustCallSuper + // Future dispose() async { + // // This will mark object as disposed + // super.dispose(); + // } + /// for internal use /// {@nodoc} set isSpeaking(bool speaking) { diff --git a/lib/src/room.dart b/lib/src/room.dart index 99a4838e6..35a16b803 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -1,7 +1,7 @@ -import 'dart:async'; import 'dart:collection'; import 'package:collection/collection.dart'; +import 'package:flutter/foundation.dart'; import 'constants.dart'; import 'events.dart'; @@ -17,6 +17,7 @@ import 'proto/livekit_models.pb.dart' as lk_models; import 'proto/livekit_rtc.pb.dart' as lk_rtc; import 'rtc_engine.dart'; import 'support/change_notifier.dart'; +import 'support/disposable.dart'; import 'track/track.dart'; import 'types.dart'; @@ -29,7 +30,7 @@ import 'types.dart'; /// * participant membership changes /// * active speakers are different /// {@category Room} -class Room extends DisposeAwareChangeNotifier { +class Room extends ChangeNotifier with Disposable, DisposeGuardChangeNotifier { // Room is only instantiated if connected, so defaults to connected. ConnectionState _connectionState = ConnectionState.connected; @@ -90,20 +91,17 @@ class Room extends DisposeAwareChangeNotifier { logger.fine('[RoomEvent] $event, will notifyListeners()'); notifyListeners(); }); - } - @override - Future dispose() async { - // mark as disposed - super.dispose(); - // dispose local participant - await localParticipant.dispose(); - // dispose Room's events emitter - await events.dispose(); - // dispose all listeners for RTCEngine - await _engineListener.dispose(); - // dispose the engine - await engine.dispose(); + onDispose(() async { + // dispose local participant + await localParticipant.dispose(); + // dispose Room's events emitter + await events.dispose(); + // dispose all listeners for RTCEngine + await _engineListener.dispose(); + // dispose the engine + await engine.dispose(); + }); } static Future connect( diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index b103fc007..4f14eea4d 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -20,7 +20,7 @@ import 'support/disposable.dart'; import 'transport.dart'; import 'types.dart'; -class RTCEngine extends Disposable { +class RTCEngine with Disposable { static const _lossyDCLabel = '_lossy'; static const _reliableDCLabel = '_reliable'; static const _maxReconnectAttempts = 5; @@ -85,15 +85,23 @@ class RTCEngine extends Disposable { _setUpListeners(); // _statsTimer = Timer.periodic(const Duration(seconds: 1), _onStatTimer); + onDispose(() async { + await close(); + await events.dispose(); + await _signalListener.dispose(); + }); } - @override - Future dispose() async { - super.dispose(); - await close(); - await events.dispose(); - await _signalListener.dispose(); - } + // @override + // Future dispose() async { + // final didDispose = await super.dispose(); + // if (didDispose) { + // await close(); + // await events.dispose(); + // await _signalListener.dispose(); + // } + // return didDispose; + // } // void _onStatTimer(Timer _) async { // // diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index a81cf7cf9..cdf929f3a 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -16,8 +16,8 @@ import 'support/websocket.dart'; import 'types.dart'; import 'utils.dart'; -class SignalClient extends Disposable { - final events = EventsEmitter(); +class SignalClient with Disposable, EventCreatable { + // final ProtocolVersion protocol; bool _connected = false; @@ -29,6 +29,11 @@ class SignalClient extends Disposable { events.listen((event) { logger.fine('[SignalEvent] $event'); }); + + onDispose(() async { + await events.dispose(); + await close(); + }); } bool get connected => _connected; @@ -114,11 +119,12 @@ class SignalClient extends Disposable { await _ws?.dispose(); } - @override - void dispose() { - super.dispose(); - close(); - } + // @override + // Future dispose() async { + // super.dispose(); + // await events.dispose(); + // await close(); + // } void sendOffer(rtc.RTCSessionDescription offer) => _sendRequest(lk_rtc.SignalRequest( offer: offer.toSDKType(), @@ -256,7 +262,7 @@ class SignalClient extends Disposable { events.emit(const SignalCloseEvent()); } - /// convenience method to create [EventsListener] - EventsListener createListener({bool synchronized = false}) => - EventsListener(events, synchronized: synchronized); + // /// convenience method to create [EventsListener] + // EventsListener createListener({bool synchronized = false}) => + // EventsListener(events, synchronized: synchronized); } diff --git a/lib/src/support/change_notifier.dart b/lib/src/support/change_notifier.dart index 986cf7da3..edc1c1e2c 100644 --- a/lib/src/support/change_notifier.dart +++ b/lib/src/support/change_notifier.dart @@ -1,31 +1,22 @@ import 'package:flutter/foundation.dart'; import '../logger.dart'; -import '../extensions.dart'; import 'disposable.dart'; -// dispose safe change notifier -abstract class DisposeAwareChangeNotifier extends ChangeNotifier implements DisposeAware { - // - bool _isDisposed = false; - - @override - bool get isDisposed => _isDisposed; - - // must implement +// A layer to prevent calling ChangeNotifier methods if already disposed +mixin DisposeGuardChangeNotifier on Disposable, ChangeNotifier { @override - @mustCallSuper - void dispose() { - logger.fine('[${objectId}] dispose()'); - if (!_isDisposed) { - _isDisposed = true; - super.dispose(); + bool get hasListeners { + if (isDisposed) { + logger.warning('called hasListeners on a disposed ChangeNotifier'); + return false; } + return super.hasListeners; } @override void addListener(VoidCallback listener) { - if (_isDisposed) { + if (isDisposed) { logger.warning('called addListener() on a disposed ChangeNotifier'); return; } @@ -34,7 +25,7 @@ abstract class DisposeAwareChangeNotifier extends ChangeNotifier implements Disp @override void removeListener(VoidCallback listener) { - if (_isDisposed) { + if (isDisposed) { logger.warning('called removeListener() on a disposed ChangeNotifier'); return; } @@ -43,7 +34,7 @@ abstract class DisposeAwareChangeNotifier extends ChangeNotifier implements Disp @override void notifyListeners() { - if (_isDisposed) { + if (isDisposed) { logger.warning('called notifyListeners() on a disposed ChangeNotifier'); return; } diff --git a/lib/src/support/disposable.dart b/lib/src/support/disposable.dart index 57e1f8f99..4fb55beb8 100644 --- a/lib/src/support/disposable.dart +++ b/lib/src/support/disposable.dart @@ -3,24 +3,38 @@ import 'package:meta/meta.dart'; import '../extensions.dart'; import '../logger.dart'; -abstract class DisposeAware { - // Should be true when is disposing or already disposed - bool get isDisposed; - @mustCallSuper - void dispose(); -} +// abstract class DisposeAware { +// // Should be true when is disposing or already disposed +// bool get isDisposed; +// @mustCallSuper +// void dispose(); +// } -abstract class Disposable extends DisposeAware { +typedef OnDisposeFunc = Future Function(); +mixin Disposable { // + final _disposeFuncs = []; bool _isDisposed = false; - - @override bool get isDisposed => _isDisposed; - @override + void onDispose(OnDisposeFunc func) => _disposeFuncs.add(func); + @mustCallSuper - void dispose() { - logger.fine('[${objectId}] dispose()'); - _isDisposed = true; + Future dispose() async { + if (!_isDisposed) { + logger.fine('[${objectId}] dispose()'); + _isDisposed = true; + if (_disposeFuncs.isNotEmpty) { + logger.fine('[$objectId] running ${_disposeFuncs.length} dispose funcs...'); + // call dispose funcs in reverse order + for (final _func in _disposeFuncs.reversed) { + await _func(); + } + _disposeFuncs.clear(); + logger.fine('[$objectId] dispose complete.'); + } + return true; + } + return false; } } diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index 2aaa6bd96..a9bf10a15 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:meta/meta.dart'; import 'package:uuid/uuid.dart'; @@ -6,11 +7,12 @@ import '../extensions.dart'; import '../logger.dart'; import '../proto/livekit_models.pb.dart' as lk_models; import '../support/change_notifier.dart'; +import '../support/disposable.dart'; /// Wrapper around a MediaStreamTrack with additional metadata. /// Base for [AudioTrack] and [VideoTrack], /// can not be instantiated directly. -abstract class Track extends DisposeAwareChangeNotifier { +abstract class Track extends ChangeNotifier with Disposable, DisposeGuardChangeNotifier { static const cameraName = 'camera'; static const screenShareName = 'screen'; diff --git a/lib/src/track/track_publication.dart b/lib/src/track/track_publication.dart index a476aad31..d47080d6c 100644 --- a/lib/src/track/track_publication.dart +++ b/lib/src/track/track_publication.dart @@ -9,7 +9,7 @@ import 'track.dart'; /// Base for [RemoteTrackPublication] and [LocalTrackPublication], /// can not be instantiated directly. -abstract class TrackPublication extends Disposable { +abstract class TrackPublication with Disposable { final String sid; final String name; final lk_models.TrackType kind; diff --git a/lib/src/transport.dart b/lib/src/transport.dart index 214c901c6..d00279289 100644 --- a/lib/src/transport.dart +++ b/lib/src/transport.dart @@ -12,7 +12,7 @@ import 'utils.dart'; typedef PCTransportOnOffer = void Function(rtc.RTCSessionDescription offer); /// a wrapper around PeerConnection -class PCTransport extends Disposable { +class PCTransport with Disposable { final rtc.RTCPeerConnection pc; final List _pendingCandidates = []; bool restartingIce = false; @@ -21,7 +21,38 @@ class PCTransport extends Disposable { Function? _cancelDebounce; // private constructor - PCTransport._(this.pc); + PCTransport._(this.pc) { + // + onDispose(() async { + _cancelDebounce?.call(); + _cancelDebounce = null; + + // Ensure callbacks won't fire any more + pc.onRenegotiationNeeded = null; + pc.onIceCandidate = null; + pc.onIceConnectionState = null; + pc.onTrack = null; + + // Remove all senders + List senders = []; + try { + senders = await pc.getSenders(); + } catch (_) { + logger.warning('getSenders() failed with error: $_'); + } + + for (final e in senders) { + try { + await pc.removeTrack(e); + } catch (_) { + logger.warning('removeTrack() failed with error: $_'); + } + } + + await pc.close(); + await pc.dispose(); + }); + } static Future create([RTCConfiguration? rtcConfig]) async { rtcConfig ??= const RTCConfiguration(); @@ -36,38 +67,12 @@ class PCTransport extends Disposable { wait: Timeouts.debounce, ); - @override - Future dispose() async { - super.dispose(); - // Ensure debounce won't fire - _cancelDebounce?.call(); - _cancelDebounce = null; - - // Ensure callbacks won't fire any more - pc.onRenegotiationNeeded = null; - pc.onIceCandidate = null; - pc.onIceConnectionState = null; - pc.onTrack = null; - - // Remove all senders - List senders = []; - try { - senders = await pc.getSenders(); - } catch (_) { - logger.warning('getSenders() failed with error: $_'); - } - - for (final e in senders) { - try { - await pc.removeTrack(e); - } catch (_) { - logger.warning('removeTrack() failed with error: $_'); - } - } + // @override + // Future dispose() async { + // super.dispose(); + // // Ensure debounce won't fire - await pc.close(); - await pc.dispose(); - } + // } Future setRemoteDescription(rtc.RTCSessionDescription sd) async { if (isDisposed) { From 3cde3e99979cee0a52b7f2b207c3f065e371bc23 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 30 Sep 2021 23:30:21 +0900 Subject: [PATCH 41/50] format protos --- lib/src/proto/livekit_models.pb.dart | 592 +++++++---- lib/src/proto/livekit_models.pbenum.dart | 40 +- lib/src/proto/livekit_models.pbjson.dart | 59 +- lib/src/proto/livekit_models.pbserver.dart | 1 - lib/src/proto/livekit_rtc.pb.dart | 1076 +++++++++++++------- lib/src/proto/livekit_rtc.pbenum.dart | 22 +- lib/src/proto/livekit_rtc.pbjson.dart | 281 ++++- lib/src/proto/livekit_rtc.pbserver.dart | 1 - 8 files changed, 1439 insertions(+), 633 deletions(-) diff --git a/lib/src/proto/livekit_models.pb.dart b/lib/src/proto/livekit_models.pb.dart index b3239fe25..0d4251ff7 100644 --- a/lib/src/proto/livekit_models.pb.dart +++ b/lib/src/proto/livekit_models.pb.dart @@ -15,17 +15,30 @@ import 'livekit_models.pbenum.dart'; export 'livekit_models.pbenum.dart'; class Room extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Room', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Room', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') - ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'emptyTimeout', $pb.PbFieldType.OU3) - ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'maxParticipants', $pb.PbFieldType.OU3) + ..a<$core.int>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'emptyTimeout', + $pb.PbFieldType.OU3) + ..a<$core.int>( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'maxParticipants', + $pb.PbFieldType.OU3) ..aInt64(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'creationTime') ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'turnPassword') - ..pc(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'enabledCodecs', $pb.PbFieldType.PM, subBuilder: Codec.create) + ..pc( + 7, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'enabledCodecs', + $pb.PbFieldType.PM, + subBuilder: Codec.create) ..aOS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'metadata') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; Room._() : super(); factory Room({ @@ -65,18 +78,21 @@ class Room extends $pb.GeneratedMessage { } return _result; } - factory Room.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory Room.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory Room.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Room.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') Room clone() => Room()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - Room copyWith(void Function(Room) updates) => super.copyWith((message) => updates(message as Room)) as Room; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Room copyWith(void Function(Room) updates) => + super.copyWith((message) => updates(message as Room)) + as Room; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Room create() => Room._(); @@ -89,7 +105,10 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { $_setString(0, v); } + set sid($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -98,7 +117,10 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get name => $_getSZ(1); @$pb.TagNumber(2) - set name($core.String v) { $_setString(1, v); } + set name($core.String v) { + $_setString(1, v); + } + @$pb.TagNumber(2) $core.bool hasName() => $_has(1); @$pb.TagNumber(2) @@ -107,7 +129,10 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.int get emptyTimeout => $_getIZ(2); @$pb.TagNumber(3) - set emptyTimeout($core.int v) { $_setUnsignedInt32(2, v); } + set emptyTimeout($core.int v) { + $_setUnsignedInt32(2, v); + } + @$pb.TagNumber(3) $core.bool hasEmptyTimeout() => $_has(2); @$pb.TagNumber(3) @@ -116,7 +141,10 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.int get maxParticipants => $_getIZ(3); @$pb.TagNumber(4) - set maxParticipants($core.int v) { $_setUnsignedInt32(3, v); } + set maxParticipants($core.int v) { + $_setUnsignedInt32(3, v); + } + @$pb.TagNumber(4) $core.bool hasMaxParticipants() => $_has(3); @$pb.TagNumber(4) @@ -125,7 +153,10 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(5) $fixnum.Int64 get creationTime => $_getI64(4); @$pb.TagNumber(5) - set creationTime($fixnum.Int64 v) { $_setInt64(4, v); } + set creationTime($fixnum.Int64 v) { + $_setInt64(4, v); + } + @$pb.TagNumber(5) $core.bool hasCreationTime() => $_has(4); @$pb.TagNumber(5) @@ -134,7 +165,10 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.String get turnPassword => $_getSZ(5); @$pb.TagNumber(6) - set turnPassword($core.String v) { $_setString(5, v); } + set turnPassword($core.String v) { + $_setString(5, v); + } + @$pb.TagNumber(6) $core.bool hasTurnPassword() => $_has(5); @$pb.TagNumber(6) @@ -146,7 +180,10 @@ class Room extends $pb.GeneratedMessage { @$pb.TagNumber(8) $core.String get metadata => $_getSZ(7); @$pb.TagNumber(8) - set metadata($core.String v) { $_setString(7, v); } + set metadata($core.String v) { + $_setString(7, v); + } + @$pb.TagNumber(8) $core.bool hasMetadata() => $_has(7); @$pb.TagNumber(8) @@ -154,11 +191,14 @@ class Room extends $pb.GeneratedMessage { } class Codec extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Codec', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Codec', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mime') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fmtpLine') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; Codec._() : super(); factory Codec({ @@ -174,31 +214,38 @@ class Codec extends $pb.GeneratedMessage { } return _result; } - factory Codec.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory Codec.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory Codec.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory Codec.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') Codec clone() => Codec()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - Codec copyWith(void Function(Codec) updates) => super.copyWith((message) => updates(message as Codec)) as Codec; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + Codec copyWith(void Function(Codec) updates) => + super.copyWith((message) => updates(message as Codec)) + as Codec; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Codec create() => Codec._(); Codec createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static Codec getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Codec getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static Codec? _defaultInstance; @$pb.TagNumber(1) $core.String get mime => $_getSZ(0); @$pb.TagNumber(1) - set mime($core.String v) { $_setString(0, v); } + set mime($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasMime() => $_has(0); @$pb.TagNumber(1) @@ -207,7 +254,10 @@ class Codec extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get fmtpLine => $_getSZ(1); @$pb.TagNumber(2) - set fmtpLine($core.String v) { $_setString(1, v); } + set fmtpLine($core.String v) { + $_setString(1, v); + } + @$pb.TagNumber(2) $core.bool hasFmtpLine() => $_has(1); @$pb.TagNumber(2) @@ -215,16 +265,29 @@ class Codec extends $pb.GeneratedMessage { } class ParticipantInfo extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ParticipantInfo', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ParticipantInfo', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'identity') - ..e(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'state', $pb.PbFieldType.OE, defaultOrMaker: ParticipantInfo_State.JOINING, valueOf: ParticipantInfo_State.valueOf, enumValues: ParticipantInfo_State.values) - ..pc(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'tracks', $pb.PbFieldType.PM, subBuilder: TrackInfo.create) + ..e( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'state', + $pb.PbFieldType.OE, + defaultOrMaker: ParticipantInfo_State.JOINING, + valueOf: ParticipantInfo_State.valueOf, + enumValues: ParticipantInfo_State.values) + ..pc( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'tracks', + $pb.PbFieldType.PM, + subBuilder: TrackInfo.create) ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'metadata') ..aInt64(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'joinedAt') ..aOB(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hidden') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; ParticipantInfo._() : super(); factory ParticipantInfo({ @@ -260,31 +323,39 @@ class ParticipantInfo extends $pb.GeneratedMessage { } return _result; } - factory ParticipantInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory ParticipantInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory ParticipantInfo.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ParticipantInfo.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') ParticipantInfo clone() => ParticipantInfo()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - ParticipantInfo copyWith(void Function(ParticipantInfo) updates) => super.copyWith((message) => updates(message as ParticipantInfo)) as ParticipantInfo; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ParticipantInfo copyWith(void Function(ParticipantInfo) updates) => + super.copyWith((message) => updates(message as ParticipantInfo)) + as ParticipantInfo; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ParticipantInfo create() => ParticipantInfo._(); ParticipantInfo createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static ParticipantInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ParticipantInfo getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static ParticipantInfo? _defaultInstance; @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { $_setString(0, v); } + set sid($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -293,7 +364,10 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get identity => $_getSZ(1); @$pb.TagNumber(2) - set identity($core.String v) { $_setString(1, v); } + set identity($core.String v) { + $_setString(1, v); + } + @$pb.TagNumber(2) $core.bool hasIdentity() => $_has(1); @$pb.TagNumber(2) @@ -302,7 +376,10 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(3) ParticipantInfo_State get state => $_getN(2); @$pb.TagNumber(3) - set state(ParticipantInfo_State v) { setField(3, v); } + set state(ParticipantInfo_State v) { + setField(3, v); + } + @$pb.TagNumber(3) $core.bool hasState() => $_has(2); @$pb.TagNumber(3) @@ -314,7 +391,10 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.String get metadata => $_getSZ(4); @$pb.TagNumber(5) - set metadata($core.String v) { $_setString(4, v); } + set metadata($core.String v) { + $_setString(4, v); + } + @$pb.TagNumber(5) $core.bool hasMetadata() => $_has(4); @$pb.TagNumber(5) @@ -323,7 +403,10 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(6) $fixnum.Int64 get joinedAt => $_getI64(5); @$pb.TagNumber(6) - set joinedAt($fixnum.Int64 v) { $_setInt64(5, v); } + set joinedAt($fixnum.Int64 v) { + $_setInt64(5, v); + } + @$pb.TagNumber(6) $core.bool hasJoinedAt() => $_has(5); @$pb.TagNumber(6) @@ -332,7 +415,10 @@ class ParticipantInfo extends $pb.GeneratedMessage { @$pb.TagNumber(7) $core.bool get hidden => $_getBF(6); @$pb.TagNumber(7) - set hidden($core.bool v) { $_setBool(6, v); } + set hidden($core.bool v) { + $_setBool(6, v); + } + @$pb.TagNumber(7) $core.bool hasHidden() => $_has(6); @$pb.TagNumber(7) @@ -340,16 +426,23 @@ class ParticipantInfo extends $pb.GeneratedMessage { } class TrackInfo extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrackInfo', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrackInfo', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') - ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', $pb.PbFieldType.OE, defaultOrMaker: TrackType.AUDIO, valueOf: TrackType.valueOf, enumValues: TrackType.values) + ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', + $pb.PbFieldType.OE, + defaultOrMaker: TrackType.AUDIO, valueOf: TrackType.valueOf, enumValues: TrackType.values) ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'muted') - ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.OU3) - ..a<$core.int>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.OU3) + ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', + $pb.PbFieldType.OU3) + ..a<$core.int>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', + $pb.PbFieldType.OU3) ..aOB(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'simulcast') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; TrackInfo._() : super(); factory TrackInfo({ @@ -385,31 +478,39 @@ class TrackInfo extends $pb.GeneratedMessage { } return _result; } - factory TrackInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory TrackInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory TrackInfo.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory TrackInfo.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') TrackInfo clone() => TrackInfo()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - TrackInfo copyWith(void Function(TrackInfo) updates) => super.copyWith((message) => updates(message as TrackInfo)) as TrackInfo; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TrackInfo copyWith(void Function(TrackInfo) updates) => + super.copyWith((message) => updates(message as TrackInfo)) + as TrackInfo; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static TrackInfo create() => TrackInfo._(); TrackInfo createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static TrackInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TrackInfo getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static TrackInfo? _defaultInstance; @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { $_setString(0, v); } + set sid($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -418,7 +519,10 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(2) TrackType get type => $_getN(1); @$pb.TagNumber(2) - set type(TrackType v) { setField(2, v); } + set type(TrackType v) { + setField(2, v); + } + @$pb.TagNumber(2) $core.bool hasType() => $_has(1); @$pb.TagNumber(2) @@ -427,7 +531,10 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get name => $_getSZ(2); @$pb.TagNumber(3) - set name($core.String v) { $_setString(2, v); } + set name($core.String v) { + $_setString(2, v); + } + @$pb.TagNumber(3) $core.bool hasName() => $_has(2); @$pb.TagNumber(3) @@ -436,7 +543,10 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.bool get muted => $_getBF(3); @$pb.TagNumber(4) - set muted($core.bool v) { $_setBool(3, v); } + set muted($core.bool v) { + $_setBool(3, v); + } + @$pb.TagNumber(4) $core.bool hasMuted() => $_has(3); @$pb.TagNumber(4) @@ -445,7 +555,10 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.int get width => $_getIZ(4); @$pb.TagNumber(5) - set width($core.int v) { $_setUnsignedInt32(4, v); } + set width($core.int v) { + $_setUnsignedInt32(4, v); + } + @$pb.TagNumber(5) $core.bool hasWidth() => $_has(4); @$pb.TagNumber(5) @@ -454,7 +567,10 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.int get height => $_getIZ(5); @$pb.TagNumber(6) - set height($core.int v) { $_setUnsignedInt32(5, v); } + set height($core.int v) { + $_setUnsignedInt32(5, v); + } + @$pb.TagNumber(6) $core.bool hasHeight() => $_has(5); @$pb.TagNumber(6) @@ -463,32 +579,44 @@ class TrackInfo extends $pb.GeneratedMessage { @$pb.TagNumber(7) $core.bool get simulcast => $_getBF(6); @$pb.TagNumber(7) - set simulcast($core.bool v) { $_setBool(6, v); } + set simulcast($core.bool v) { + $_setBool(6, v); + } + @$pb.TagNumber(7) $core.bool hasSimulcast() => $_has(6); @$pb.TagNumber(7) void clearSimulcast() => clearField(7); } -enum DataPacket_Value { - user, - speaker, - notSet -} +enum DataPacket_Value { user, speaker, notSet } class DataPacket extends $pb.GeneratedMessage { static const $core.Map<$core.int, DataPacket_Value> _DataPacket_ValueByTag = { - 2 : DataPacket_Value.user, - 3 : DataPacket_Value.speaker, - 0 : DataPacket_Value.notSet + 2: DataPacket_Value.user, + 3: DataPacket_Value.speaker, + 0: DataPacket_Value.notSet }; - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DataPacket', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DataPacket', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..oo(0, [2, 3]) - ..e(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'kind', $pb.PbFieldType.OE, defaultOrMaker: DataPacket_Kind.RELIABLE, valueOf: DataPacket_Kind.valueOf, enumValues: DataPacket_Kind.values) - ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'user', subBuilder: UserPacket.create) - ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speaker', subBuilder: ActiveSpeakerUpdate.create) - ..hasRequiredFields = false - ; + ..e( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'kind', + $pb.PbFieldType.OE, + defaultOrMaker: DataPacket_Kind.RELIABLE, + valueOf: DataPacket_Kind.valueOf, + enumValues: DataPacket_Kind.values) + ..aOM( + 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'user', + subBuilder: UserPacket.create) + ..aOM( + 3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speaker', + subBuilder: ActiveSpeakerUpdate.create) + ..hasRequiredFields = false; DataPacket._() : super(); factory DataPacket({ @@ -508,25 +636,30 @@ class DataPacket extends $pb.GeneratedMessage { } return _result; } - factory DataPacket.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory DataPacket.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory DataPacket.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory DataPacket.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') DataPacket clone() => DataPacket()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - DataPacket copyWith(void Function(DataPacket) updates) => super.copyWith((message) => updates(message as DataPacket)) as DataPacket; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + DataPacket copyWith(void Function(DataPacket) updates) => + super.copyWith((message) => updates(message as DataPacket)) + as DataPacket; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static DataPacket create() => DataPacket._(); DataPacket createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static DataPacket getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static DataPacket getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static DataPacket? _defaultInstance; DataPacket_Value whichValue() => _DataPacket_ValueByTag[$_whichOneof(0)]!; @@ -535,7 +668,10 @@ class DataPacket extends $pb.GeneratedMessage { @$pb.TagNumber(1) DataPacket_Kind get kind => $_getN(0); @$pb.TagNumber(1) - set kind(DataPacket_Kind v) { setField(1, v); } + set kind(DataPacket_Kind v) { + setField(1, v); + } + @$pb.TagNumber(1) $core.bool hasKind() => $_has(0); @$pb.TagNumber(1) @@ -544,7 +680,10 @@ class DataPacket extends $pb.GeneratedMessage { @$pb.TagNumber(2) UserPacket get user => $_getN(1); @$pb.TagNumber(2) - set user(UserPacket v) { setField(2, v); } + set user(UserPacket v) { + setField(2, v); + } + @$pb.TagNumber(2) $core.bool hasUser() => $_has(1); @$pb.TagNumber(2) @@ -555,7 +694,10 @@ class DataPacket extends $pb.GeneratedMessage { @$pb.TagNumber(3) ActiveSpeakerUpdate get speaker => $_getN(2); @$pb.TagNumber(3) - set speaker(ActiveSpeakerUpdate v) { setField(3, v); } + set speaker(ActiveSpeakerUpdate v) { + setField(3, v); + } + @$pb.TagNumber(3) $core.bool hasSpeaker() => $_has(2); @$pb.TagNumber(3) @@ -565,10 +707,17 @@ class DataPacket extends $pb.GeneratedMessage { } class ActiveSpeakerUpdate extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ActiveSpeakerUpdate', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) - ..pc(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakers', $pb.PbFieldType.PM, subBuilder: SpeakerInfo.create) - ..hasRequiredFields = false - ; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ActiveSpeakerUpdate', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) + ..pc( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakers', + $pb.PbFieldType.PM, + subBuilder: SpeakerInfo.create) + ..hasRequiredFields = false; ActiveSpeakerUpdate._() : super(); factory ActiveSpeakerUpdate({ @@ -580,25 +729,30 @@ class ActiveSpeakerUpdate extends $pb.GeneratedMessage { } return _result; } - factory ActiveSpeakerUpdate.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory ActiveSpeakerUpdate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory ActiveSpeakerUpdate.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ActiveSpeakerUpdate.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') ActiveSpeakerUpdate clone() => ActiveSpeakerUpdate()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - ActiveSpeakerUpdate copyWith(void Function(ActiveSpeakerUpdate) updates) => super.copyWith((message) => updates(message as ActiveSpeakerUpdate)) as ActiveSpeakerUpdate; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ActiveSpeakerUpdate copyWith(void Function(ActiveSpeakerUpdate) updates) => + super.copyWith((message) => updates(message as ActiveSpeakerUpdate)) + as ActiveSpeakerUpdate; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ActiveSpeakerUpdate create() => ActiveSpeakerUpdate._(); ActiveSpeakerUpdate createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static ActiveSpeakerUpdate getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ActiveSpeakerUpdate getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static ActiveSpeakerUpdate? _defaultInstance; @$pb.TagNumber(1) @@ -606,12 +760,18 @@ class ActiveSpeakerUpdate extends $pb.GeneratedMessage { } class SpeakerInfo extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SpeakerInfo', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SpeakerInfo', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') - ..a<$core.double>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'level', $pb.PbFieldType.OF) + ..a<$core.double>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'level', + $pb.PbFieldType.OF) ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'active') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; SpeakerInfo._() : super(); factory SpeakerInfo({ @@ -631,31 +791,39 @@ class SpeakerInfo extends $pb.GeneratedMessage { } return _result; } - factory SpeakerInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SpeakerInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SpeakerInfo.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SpeakerInfo.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SpeakerInfo clone() => SpeakerInfo()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SpeakerInfo copyWith(void Function(SpeakerInfo) updates) => super.copyWith((message) => updates(message as SpeakerInfo)) as SpeakerInfo; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SpeakerInfo copyWith(void Function(SpeakerInfo) updates) => + super.copyWith((message) => updates(message as SpeakerInfo)) + as SpeakerInfo; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SpeakerInfo create() => SpeakerInfo._(); SpeakerInfo createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SpeakerInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SpeakerInfo getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SpeakerInfo? _defaultInstance; @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { $_setString(0, v); } + set sid($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -664,7 +832,10 @@ class SpeakerInfo extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.double get level => $_getN(1); @$pb.TagNumber(2) - set level($core.double v) { $_setFloat(1, v); } + set level($core.double v) { + $_setFloat(1, v); + } + @$pb.TagNumber(2) $core.bool hasLevel() => $_has(1); @$pb.TagNumber(2) @@ -673,7 +844,10 @@ class SpeakerInfo extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.bool get active => $_getBF(2); @$pb.TagNumber(3) - set active($core.bool v) { $_setBool(2, v); } + set active($core.bool v) { + $_setBool(2, v); + } + @$pb.TagNumber(3) $core.bool hasActive() => $_has(2); @$pb.TagNumber(3) @@ -681,12 +855,18 @@ class SpeakerInfo extends $pb.GeneratedMessage { } class UserPacket extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UserPacket', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UserPacket', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participantSid') - ..a<$core.List<$core.int>>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'payload', $pb.PbFieldType.OY) + ..a<$core.List<$core.int>>( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'payload', + $pb.PbFieldType.OY) ..pPS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'destinationSids') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; UserPacket._() : super(); factory UserPacket({ @@ -706,31 +886,39 @@ class UserPacket extends $pb.GeneratedMessage { } return _result; } - factory UserPacket.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory UserPacket.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory UserPacket.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory UserPacket.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') UserPacket clone() => UserPacket()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - UserPacket copyWith(void Function(UserPacket) updates) => super.copyWith((message) => updates(message as UserPacket)) as UserPacket; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + UserPacket copyWith(void Function(UserPacket) updates) => + super.copyWith((message) => updates(message as UserPacket)) + as UserPacket; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static UserPacket create() => UserPacket._(); UserPacket createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static UserPacket getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static UserPacket getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static UserPacket? _defaultInstance; @$pb.TagNumber(1) $core.String get participantSid => $_getSZ(0); @$pb.TagNumber(1) - set participantSid($core.String v) { $_setString(0, v); } + set participantSid($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasParticipantSid() => $_has(0); @$pb.TagNumber(1) @@ -739,7 +927,10 @@ class UserPacket extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.List<$core.int> get payload => $_getN(1); @$pb.TagNumber(2) - set payload($core.List<$core.int> v) { $_setBytes(1, v); } + set payload($core.List<$core.int> v) { + $_setBytes(1, v); + } + @$pb.TagNumber(2) $core.bool hasPayload() => $_has(1); @$pb.TagNumber(2) @@ -750,13 +941,16 @@ class UserPacket extends $pb.GeneratedMessage { } class RecordingResult extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RecordingResult', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RecordingResult', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'error') ..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'duration') ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'location') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; RecordingResult._() : super(); factory RecordingResult({ @@ -780,31 +974,39 @@ class RecordingResult extends $pb.GeneratedMessage { } return _result; } - factory RecordingResult.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory RecordingResult.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory RecordingResult.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory RecordingResult.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') RecordingResult clone() => RecordingResult()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - RecordingResult copyWith(void Function(RecordingResult) updates) => super.copyWith((message) => updates(message as RecordingResult)) as RecordingResult; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RecordingResult copyWith(void Function(RecordingResult) updates) => + super.copyWith((message) => updates(message as RecordingResult)) + as RecordingResult; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static RecordingResult create() => RecordingResult._(); RecordingResult createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static RecordingResult getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RecordingResult getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static RecordingResult? _defaultInstance; @$pb.TagNumber(1) $core.String get id => $_getSZ(0); @$pb.TagNumber(1) - set id($core.String v) { $_setString(0, v); } + set id($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasId() => $_has(0); @$pb.TagNumber(1) @@ -813,7 +1015,10 @@ class RecordingResult extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get error => $_getSZ(1); @$pb.TagNumber(2) - set error($core.String v) { $_setString(1, v); } + set error($core.String v) { + $_setString(1, v); + } + @$pb.TagNumber(2) $core.bool hasError() => $_has(1); @$pb.TagNumber(2) @@ -822,7 +1027,10 @@ class RecordingResult extends $pb.GeneratedMessage { @$pb.TagNumber(3) $fixnum.Int64 get duration => $_getI64(2); @$pb.TagNumber(3) - set duration($fixnum.Int64 v) { $_setInt64(2, v); } + set duration($fixnum.Int64 v) { + $_setInt64(2, v); + } + @$pb.TagNumber(3) $core.bool hasDuration() => $_has(2); @$pb.TagNumber(3) @@ -831,10 +1039,12 @@ class RecordingResult extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get location => $_getSZ(3); @$pb.TagNumber(4) - set location($core.String v) { $_setString(3, v); } + set location($core.String v) { + $_setString(3, v); + } + @$pb.TagNumber(4) $core.bool hasLocation() => $_has(3); @$pb.TagNumber(4) void clearLocation() => clearField(4); } - diff --git a/lib/src/proto/livekit_models.pbenum.dart b/lib/src/proto/livekit_models.pbenum.dart index 71141d73b..e4f8aea87 100644 --- a/lib/src/proto/livekit_models.pbenum.dart +++ b/lib/src/proto/livekit_models.pbenum.dart @@ -10,11 +10,14 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; class TrackType extends $pb.ProtobufEnum { - static const TrackType AUDIO = TrackType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AUDIO'); - static const TrackType VIDEO = TrackType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'VIDEO'); - static const TrackType DATA = TrackType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DATA'); + static const TrackType AUDIO = + TrackType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AUDIO'); + static const TrackType VIDEO = + TrackType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'VIDEO'); + static const TrackType DATA = + TrackType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DATA'); - static const $core.List values = [ + static const $core.List values = [ AUDIO, VIDEO, DATA, @@ -27,36 +30,43 @@ class TrackType extends $pb.ProtobufEnum { } class ParticipantInfo_State extends $pb.ProtobufEnum { - static const ParticipantInfo_State JOINING = ParticipantInfo_State._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'JOINING'); - static const ParticipantInfo_State JOINED = ParticipantInfo_State._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'JOINED'); - static const ParticipantInfo_State ACTIVE = ParticipantInfo_State._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ACTIVE'); - static const ParticipantInfo_State DISCONNECTED = ParticipantInfo_State._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DISCONNECTED'); + static const ParticipantInfo_State JOINING = ParticipantInfo_State._( + 0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'JOINING'); + static const ParticipantInfo_State JOINED = ParticipantInfo_State._( + 1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'JOINED'); + static const ParticipantInfo_State ACTIVE = ParticipantInfo_State._( + 2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ACTIVE'); + static const ParticipantInfo_State DISCONNECTED = ParticipantInfo_State._( + 3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DISCONNECTED'); - static const $core.List values = [ + static const $core.List values = [ JOINING, JOINED, ACTIVE, DISCONNECTED, ]; - static final $core.Map<$core.int, ParticipantInfo_State> _byValue = $pb.ProtobufEnum.initByValue(values); + static final $core.Map<$core.int, ParticipantInfo_State> _byValue = + $pb.ProtobufEnum.initByValue(values); static ParticipantInfo_State? valueOf($core.int value) => _byValue[value]; const ParticipantInfo_State._($core.int v, $core.String n) : super(v, n); } class DataPacket_Kind extends $pb.ProtobufEnum { - static const DataPacket_Kind RELIABLE = DataPacket_Kind._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RELIABLE'); - static const DataPacket_Kind LOSSY = DataPacket_Kind._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LOSSY'); + static const DataPacket_Kind RELIABLE = DataPacket_Kind._( + 0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RELIABLE'); + static const DataPacket_Kind LOSSY = DataPacket_Kind._( + 1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LOSSY'); - static const $core.List values = [ + static const $core.List values = [ RELIABLE, LOSSY, ]; - static final $core.Map<$core.int, DataPacket_Kind> _byValue = $pb.ProtobufEnum.initByValue(values); + static final $core.Map<$core.int, DataPacket_Kind> _byValue = + $pb.ProtobufEnum.initByValue(values); static DataPacket_Kind? valueOf($core.int value) => _byValue[value]; const DataPacket_Kind._($core.int v, $core.String n) : super(v, n); } - diff --git a/lib/src/proto/livekit_models.pbjson.dart b/lib/src/proto/livekit_models.pbjson.dart index dd358517f..0ca1adf1f 100644 --- a/lib/src/proto/livekit_models.pbjson.dart +++ b/lib/src/proto/livekit_models.pbjson.dart @@ -8,6 +8,7 @@ import 'dart:core' as $core; import 'dart:convert' as $convert; import 'dart:typed_data' as $typed_data; + @$core.Deprecated('Use trackTypeDescriptor instead') const TrackType$json = const { '1': 'TrackType', @@ -19,7 +20,8 @@ const TrackType$json = const { }; /// Descriptor for `TrackType`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List trackTypeDescriptor = $convert.base64Decode('CglUcmFja1R5cGUSCQoFQVVESU8QABIJCgVWSURFTxABEggKBERBVEEQAg=='); +final $typed_data.Uint8List trackTypeDescriptor = + $convert.base64Decode('CglUcmFja1R5cGUSCQoFQVVESU8QABIJCgVWSURFTxABEggKBERBVEEQAg=='); @$core.Deprecated('Use roomDescriptor instead') const Room$json = const { '1': 'Room', @@ -30,13 +32,21 @@ const Room$json = const { const {'1': 'max_participants', '3': 4, '4': 1, '5': 13, '10': 'maxParticipants'}, const {'1': 'creation_time', '3': 5, '4': 1, '5': 3, '10': 'creationTime'}, const {'1': 'turn_password', '3': 6, '4': 1, '5': 9, '10': 'turnPassword'}, - const {'1': 'enabled_codecs', '3': 7, '4': 3, '5': 11, '6': '.livekit.Codec', '10': 'enabledCodecs'}, + const { + '1': 'enabled_codecs', + '3': 7, + '4': 3, + '5': 11, + '6': '.livekit.Codec', + '10': 'enabledCodecs' + }, const {'1': 'metadata', '3': 8, '4': 1, '5': 9, '10': 'metadata'}, ], }; /// Descriptor for `Room`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List roomDescriptor = $convert.base64Decode('CgRSb29tEhAKA3NpZBgBIAEoCVIDc2lkEhIKBG5hbWUYAiABKAlSBG5hbWUSIwoNZW1wdHlfdGltZW91dBgDIAEoDVIMZW1wdHlUaW1lb3V0EikKEG1heF9wYXJ0aWNpcGFudHMYBCABKA1SD21heFBhcnRpY2lwYW50cxIjCg1jcmVhdGlvbl90aW1lGAUgASgDUgxjcmVhdGlvblRpbWUSIwoNdHVybl9wYXNzd29yZBgGIAEoCVIMdHVyblBhc3N3b3JkEjUKDmVuYWJsZWRfY29kZWNzGAcgAygLMg4ubGl2ZWtpdC5Db2RlY1INZW5hYmxlZENvZGVjcxIaCghtZXRhZGF0YRgIIAEoCVIIbWV0YWRhdGE='); +final $typed_data.Uint8List roomDescriptor = $convert.base64Decode( + 'CgRSb29tEhAKA3NpZBgBIAEoCVIDc2lkEhIKBG5hbWUYAiABKAlSBG5hbWUSIwoNZW1wdHlfdGltZW91dBgDIAEoDVIMZW1wdHlUaW1lb3V0EikKEG1heF9wYXJ0aWNpcGFudHMYBCABKA1SD21heFBhcnRpY2lwYW50cxIjCg1jcmVhdGlvbl90aW1lGAUgASgDUgxjcmVhdGlvblRpbWUSIwoNdHVybl9wYXNzd29yZBgGIAEoCVIMdHVyblBhc3N3b3JkEjUKDmVuYWJsZWRfY29kZWNzGAcgAygLMg4ubGl2ZWtpdC5Db2RlY1INZW5hYmxlZENvZGVjcxIaCghtZXRhZGF0YRgIIAEoCVIIbWV0YWRhdGE='); @$core.Deprecated('Use codecDescriptor instead') const Codec$json = const { '1': 'Codec', @@ -47,14 +57,22 @@ const Codec$json = const { }; /// Descriptor for `Codec`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List codecDescriptor = $convert.base64Decode('CgVDb2RlYxISCgRtaW1lGAEgASgJUgRtaW1lEhsKCWZtdHBfbGluZRgCIAEoCVIIZm10cExpbmU='); +final $typed_data.Uint8List codecDescriptor = $convert + .base64Decode('CgVDb2RlYxISCgRtaW1lGAEgASgJUgRtaW1lEhsKCWZtdHBfbGluZRgCIAEoCVIIZm10cExpbmU='); @$core.Deprecated('Use participantInfoDescriptor instead') const ParticipantInfo$json = const { '1': 'ParticipantInfo', '2': const [ const {'1': 'sid', '3': 1, '4': 1, '5': 9, '10': 'sid'}, const {'1': 'identity', '3': 2, '4': 1, '5': 9, '10': 'identity'}, - const {'1': 'state', '3': 3, '4': 1, '5': 14, '6': '.livekit.ParticipantInfo.State', '10': 'state'}, + const { + '1': 'state', + '3': 3, + '4': 1, + '5': 14, + '6': '.livekit.ParticipantInfo.State', + '10': 'state' + }, const {'1': 'tracks', '3': 4, '4': 3, '5': 11, '6': '.livekit.TrackInfo', '10': 'tracks'}, const {'1': 'metadata', '3': 5, '4': 1, '5': 9, '10': 'metadata'}, const {'1': 'joined_at', '3': 6, '4': 1, '5': 3, '10': 'joinedAt'}, @@ -75,7 +93,8 @@ const ParticipantInfo_State$json = const { }; /// Descriptor for `ParticipantInfo`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List participantInfoDescriptor = $convert.base64Decode('Cg9QYXJ0aWNpcGFudEluZm8SEAoDc2lkGAEgASgJUgNzaWQSGgoIaWRlbnRpdHkYAiABKAlSCGlkZW50aXR5EjQKBXN0YXRlGAMgASgOMh4ubGl2ZWtpdC5QYXJ0aWNpcGFudEluZm8uU3RhdGVSBXN0YXRlEioKBnRyYWNrcxgEIAMoCzISLmxpdmVraXQuVHJhY2tJbmZvUgZ0cmFja3MSGgoIbWV0YWRhdGEYBSABKAlSCG1ldGFkYXRhEhsKCWpvaW5lZF9hdBgGIAEoA1IIam9pbmVkQXQSFgoGaGlkZGVuGAcgASgIUgZoaWRkZW4iPgoFU3RhdGUSCwoHSk9JTklORxAAEgoKBkpPSU5FRBABEgoKBkFDVElWRRACEhAKDERJU0NPTk5FQ1RFRBAD'); +final $typed_data.Uint8List participantInfoDescriptor = $convert.base64Decode( + 'Cg9QYXJ0aWNpcGFudEluZm8SEAoDc2lkGAEgASgJUgNzaWQSGgoIaWRlbnRpdHkYAiABKAlSCGlkZW50aXR5EjQKBXN0YXRlGAMgASgOMh4ubGl2ZWtpdC5QYXJ0aWNpcGFudEluZm8uU3RhdGVSBXN0YXRlEioKBnRyYWNrcxgEIAMoCzISLmxpdmVraXQuVHJhY2tJbmZvUgZ0cmFja3MSGgoIbWV0YWRhdGEYBSABKAlSCG1ldGFkYXRhEhsKCWpvaW5lZF9hdBgGIAEoA1IIam9pbmVkQXQSFgoGaGlkZGVuGAcgASgIUgZoaWRkZW4iPgoFU3RhdGUSCwoHSk9JTklORxAAEgoKBkpPSU5FRBABEgoKBkFDVElWRRACEhAKDERJU0NPTk5FQ1RFRBAD'); @$core.Deprecated('Use trackInfoDescriptor instead') const TrackInfo$json = const { '1': 'TrackInfo', @@ -91,14 +110,23 @@ const TrackInfo$json = const { }; /// Descriptor for `TrackInfo`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List trackInfoDescriptor = $convert.base64Decode('CglUcmFja0luZm8SEAoDc2lkGAEgASgJUgNzaWQSJgoEdHlwZRgCIAEoDjISLmxpdmVraXQuVHJhY2tUeXBlUgR0eXBlEhIKBG5hbWUYAyABKAlSBG5hbWUSFAoFbXV0ZWQYBCABKAhSBW11dGVkEhQKBXdpZHRoGAUgASgNUgV3aWR0aBIWCgZoZWlnaHQYBiABKA1SBmhlaWdodBIcCglzaW11bGNhc3QYByABKAhSCXNpbXVsY2FzdA=='); +final $typed_data.Uint8List trackInfoDescriptor = $convert.base64Decode( + 'CglUcmFja0luZm8SEAoDc2lkGAEgASgJUgNzaWQSJgoEdHlwZRgCIAEoDjISLmxpdmVraXQuVHJhY2tUeXBlUgR0eXBlEhIKBG5hbWUYAyABKAlSBG5hbWUSFAoFbXV0ZWQYBCABKAhSBW11dGVkEhQKBXdpZHRoGAUgASgNUgV3aWR0aBIWCgZoZWlnaHQYBiABKA1SBmhlaWdodBIcCglzaW11bGNhc3QYByABKAhSCXNpbXVsY2FzdA=='); @$core.Deprecated('Use dataPacketDescriptor instead') const DataPacket$json = const { '1': 'DataPacket', '2': const [ const {'1': 'kind', '3': 1, '4': 1, '5': 14, '6': '.livekit.DataPacket.Kind', '10': 'kind'}, const {'1': 'user', '3': 2, '4': 1, '5': 11, '6': '.livekit.UserPacket', '9': 0, '10': 'user'}, - const {'1': 'speaker', '3': 3, '4': 1, '5': 11, '6': '.livekit.ActiveSpeakerUpdate', '9': 0, '10': 'speaker'}, + const { + '1': 'speaker', + '3': 3, + '4': 1, + '5': 11, + '6': '.livekit.ActiveSpeakerUpdate', + '9': 0, + '10': 'speaker' + }, ], '4': const [DataPacket_Kind$json], '8': const [ @@ -116,7 +144,8 @@ const DataPacket_Kind$json = const { }; /// Descriptor for `DataPacket`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List dataPacketDescriptor = $convert.base64Decode('CgpEYXRhUGFja2V0EiwKBGtpbmQYASABKA4yGC5saXZla2l0LkRhdGFQYWNrZXQuS2luZFIEa2luZBIpCgR1c2VyGAIgASgLMhMubGl2ZWtpdC5Vc2VyUGFja2V0SABSBHVzZXISOAoHc3BlYWtlchgDIAEoCzIcLmxpdmVraXQuQWN0aXZlU3BlYWtlclVwZGF0ZUgAUgdzcGVha2VyIh8KBEtpbmQSDAoIUkVMSUFCTEUQABIJCgVMT1NTWRABQgcKBXZhbHVl'); +final $typed_data.Uint8List dataPacketDescriptor = $convert.base64Decode( + 'CgpEYXRhUGFja2V0EiwKBGtpbmQYASABKA4yGC5saXZla2l0LkRhdGFQYWNrZXQuS2luZFIEa2luZBIpCgR1c2VyGAIgASgLMhMubGl2ZWtpdC5Vc2VyUGFja2V0SABSBHVzZXISOAoHc3BlYWtlchgDIAEoCzIcLmxpdmVraXQuQWN0aXZlU3BlYWtlclVwZGF0ZUgAUgdzcGVha2VyIh8KBEtpbmQSDAoIUkVMSUFCTEUQABIJCgVMT1NTWRABQgcKBXZhbHVl'); @$core.Deprecated('Use activeSpeakerUpdateDescriptor instead') const ActiveSpeakerUpdate$json = const { '1': 'ActiveSpeakerUpdate', @@ -126,7 +155,8 @@ const ActiveSpeakerUpdate$json = const { }; /// Descriptor for `ActiveSpeakerUpdate`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List activeSpeakerUpdateDescriptor = $convert.base64Decode('ChNBY3RpdmVTcGVha2VyVXBkYXRlEjAKCHNwZWFrZXJzGAEgAygLMhQubGl2ZWtpdC5TcGVha2VySW5mb1IIc3BlYWtlcnM='); +final $typed_data.Uint8List activeSpeakerUpdateDescriptor = $convert.base64Decode( + 'ChNBY3RpdmVTcGVha2VyVXBkYXRlEjAKCHNwZWFrZXJzGAEgAygLMhQubGl2ZWtpdC5TcGVha2VySW5mb1IIc3BlYWtlcnM='); @$core.Deprecated('Use speakerInfoDescriptor instead') const SpeakerInfo$json = const { '1': 'SpeakerInfo', @@ -138,7 +168,8 @@ const SpeakerInfo$json = const { }; /// Descriptor for `SpeakerInfo`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List speakerInfoDescriptor = $convert.base64Decode('CgtTcGVha2VySW5mbxIQCgNzaWQYASABKAlSA3NpZBIUCgVsZXZlbBgCIAEoAlIFbGV2ZWwSFgoGYWN0aXZlGAMgASgIUgZhY3RpdmU='); +final $typed_data.Uint8List speakerInfoDescriptor = $convert.base64Decode( + 'CgtTcGVha2VySW5mbxIQCgNzaWQYASABKAlSA3NpZBIUCgVsZXZlbBgCIAEoAlIFbGV2ZWwSFgoGYWN0aXZlGAMgASgIUgZhY3RpdmU='); @$core.Deprecated('Use userPacketDescriptor instead') const UserPacket$json = const { '1': 'UserPacket', @@ -150,7 +181,8 @@ const UserPacket$json = const { }; /// Descriptor for `UserPacket`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List userPacketDescriptor = $convert.base64Decode('CgpVc2VyUGFja2V0EicKD3BhcnRpY2lwYW50X3NpZBgBIAEoCVIOcGFydGljaXBhbnRTaWQSGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBIpChBkZXN0aW5hdGlvbl9zaWRzGAMgAygJUg9kZXN0aW5hdGlvblNpZHM='); +final $typed_data.Uint8List userPacketDescriptor = $convert.base64Decode( + 'CgpVc2VyUGFja2V0EicKD3BhcnRpY2lwYW50X3NpZBgBIAEoCVIOcGFydGljaXBhbnRTaWQSGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBIpChBkZXN0aW5hdGlvbl9zaWRzGAMgAygJUg9kZXN0aW5hdGlvblNpZHM='); @$core.Deprecated('Use recordingResultDescriptor instead') const RecordingResult$json = const { '1': 'RecordingResult', @@ -163,4 +195,5 @@ const RecordingResult$json = const { }; /// Descriptor for `RecordingResult`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List recordingResultDescriptor = $convert.base64Decode('Cg9SZWNvcmRpbmdSZXN1bHQSDgoCaWQYASABKAlSAmlkEhQKBWVycm9yGAIgASgJUgVlcnJvchIaCghkdXJhdGlvbhgDIAEoA1IIZHVyYXRpb24SGgoIbG9jYXRpb24YBCABKAlSCGxvY2F0aW9u'); +final $typed_data.Uint8List recordingResultDescriptor = $convert.base64Decode( + 'Cg9SZWNvcmRpbmdSZXN1bHQSDgoCaWQYASABKAlSAmlkEhQKBWVycm9yGAIgASgJUgVlcnJvchIaCghkdXJhdGlvbhgDIAEoA1IIZHVyYXRpb24SGgoIbG9jYXRpb24YBCABKAlSCGxvY2F0aW9u'); diff --git a/lib/src/proto/livekit_models.pbserver.dart b/lib/src/proto/livekit_models.pbserver.dart index e517cbf17..c28eba2de 100644 --- a/lib/src/proto/livekit_models.pbserver.dart +++ b/lib/src/proto/livekit_models.pbserver.dart @@ -6,4 +6,3 @@ // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_this,unused_import,unused_shown_name export 'livekit_models.pb.dart'; - diff --git a/lib/src/proto/livekit_rtc.pb.dart b/lib/src/proto/livekit_rtc.pb.dart index d22ef103b..d6ceb95a7 100644 --- a/lib/src/proto/livekit_rtc.pb.dart +++ b/lib/src/proto/livekit_rtc.pb.dart @@ -17,44 +17,65 @@ import 'livekit_rtc.pbenum.dart'; export 'livekit_rtc.pbenum.dart'; enum SignalRequest_Message { - offer, - answer, - trickle, - addTrack, - mute, - subscription, - trackSetting, - leave, - simulcast, + offer, + answer, + trickle, + addTrack, + mute, + subscription, + trackSetting, + leave, + simulcast, notSet } class SignalRequest extends $pb.GeneratedMessage { static const $core.Map<$core.int, SignalRequest_Message> _SignalRequest_MessageByTag = { - 1 : SignalRequest_Message.offer, - 2 : SignalRequest_Message.answer, - 3 : SignalRequest_Message.trickle, - 4 : SignalRequest_Message.addTrack, - 5 : SignalRequest_Message.mute, - 6 : SignalRequest_Message.subscription, - 7 : SignalRequest_Message.trackSetting, - 8 : SignalRequest_Message.leave, - 9 : SignalRequest_Message.simulcast, - 0 : SignalRequest_Message.notSet + 1: SignalRequest_Message.offer, + 2: SignalRequest_Message.answer, + 3: SignalRequest_Message.trickle, + 4: SignalRequest_Message.addTrack, + 5: SignalRequest_Message.mute, + 6: SignalRequest_Message.subscription, + 7: SignalRequest_Message.trackSetting, + 8: SignalRequest_Message.leave, + 9: SignalRequest_Message.simulcast, + 0: SignalRequest_Message.notSet }; - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SignalRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SignalRequest', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9]) - ..aOM(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offer', subBuilder: SessionDescription.create) - ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'answer', subBuilder: SessionDescription.create) - ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trickle', subBuilder: TrickleRequest.create) - ..aOM(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'addTrack', subBuilder: AddTrackRequest.create) - ..aOM(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mute', subBuilder: MuteTrackRequest.create) - ..aOM(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscription', subBuilder: UpdateSubscription.create) - ..aOM(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSetting', subBuilder: UpdateTrackSettings.create) - ..aOM(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'leave', subBuilder: LeaveRequest.create) - ..aOM(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'simulcast', subBuilder: SetSimulcastLayers.create) - ..hasRequiredFields = false - ; + ..aOM( + 1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offer', + subBuilder: SessionDescription.create) + ..aOM( + 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'answer', + subBuilder: SessionDescription.create) + ..aOM( + 3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trickle', + subBuilder: TrickleRequest.create) + ..aOM( + 4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'addTrack', + subBuilder: AddTrackRequest.create) + ..aOM( + 5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mute', + subBuilder: MuteTrackRequest.create) + ..aOM( + 6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscription', + subBuilder: UpdateSubscription.create) + ..aOM( + 7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSetting', + subBuilder: UpdateTrackSettings.create) + ..aOM( + 8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'leave', + subBuilder: LeaveRequest.create) + ..aOM( + 9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'simulcast', + subBuilder: SetSimulcastLayers.create) + ..hasRequiredFields = false; SignalRequest._() : super(); factory SignalRequest({ @@ -98,25 +119,30 @@ class SignalRequest extends $pb.GeneratedMessage { } return _result; } - factory SignalRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SignalRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SignalRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SignalRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SignalRequest clone() => SignalRequest()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SignalRequest copyWith(void Function(SignalRequest) updates) => super.copyWith((message) => updates(message as SignalRequest)) as SignalRequest; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SignalRequest copyWith(void Function(SignalRequest) updates) => + super.copyWith((message) => updates(message as SignalRequest)) + as SignalRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SignalRequest create() => SignalRequest._(); SignalRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SignalRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SignalRequest getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SignalRequest? _defaultInstance; SignalRequest_Message whichMessage() => _SignalRequest_MessageByTag[$_whichOneof(0)]!; @@ -125,7 +151,10 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(1) SessionDescription get offer => $_getN(0); @$pb.TagNumber(1) - set offer(SessionDescription v) { setField(1, v); } + set offer(SessionDescription v) { + setField(1, v); + } + @$pb.TagNumber(1) $core.bool hasOffer() => $_has(0); @$pb.TagNumber(1) @@ -136,7 +165,10 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) SessionDescription get answer => $_getN(1); @$pb.TagNumber(2) - set answer(SessionDescription v) { setField(2, v); } + set answer(SessionDescription v) { + setField(2, v); + } + @$pb.TagNumber(2) $core.bool hasAnswer() => $_has(1); @$pb.TagNumber(2) @@ -147,7 +179,10 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) TrickleRequest get trickle => $_getN(2); @$pb.TagNumber(3) - set trickle(TrickleRequest v) { setField(3, v); } + set trickle(TrickleRequest v) { + setField(3, v); + } + @$pb.TagNumber(3) $core.bool hasTrickle() => $_has(2); @$pb.TagNumber(3) @@ -158,7 +193,10 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) AddTrackRequest get addTrack => $_getN(3); @$pb.TagNumber(4) - set addTrack(AddTrackRequest v) { setField(4, v); } + set addTrack(AddTrackRequest v) { + setField(4, v); + } + @$pb.TagNumber(4) $core.bool hasAddTrack() => $_has(3); @$pb.TagNumber(4) @@ -169,7 +207,10 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(5) MuteTrackRequest get mute => $_getN(4); @$pb.TagNumber(5) - set mute(MuteTrackRequest v) { setField(5, v); } + set mute(MuteTrackRequest v) { + setField(5, v); + } + @$pb.TagNumber(5) $core.bool hasMute() => $_has(4); @$pb.TagNumber(5) @@ -180,7 +221,10 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(6) UpdateSubscription get subscription => $_getN(5); @$pb.TagNumber(6) - set subscription(UpdateSubscription v) { setField(6, v); } + set subscription(UpdateSubscription v) { + setField(6, v); + } + @$pb.TagNumber(6) $core.bool hasSubscription() => $_has(5); @$pb.TagNumber(6) @@ -191,7 +235,10 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(7) UpdateTrackSettings get trackSetting => $_getN(6); @$pb.TagNumber(7) - set trackSetting(UpdateTrackSettings v) { setField(7, v); } + set trackSetting(UpdateTrackSettings v) { + setField(7, v); + } + @$pb.TagNumber(7) $core.bool hasTrackSetting() => $_has(6); @$pb.TagNumber(7) @@ -202,7 +249,10 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(8) LeaveRequest get leave => $_getN(7); @$pb.TagNumber(8) - set leave(LeaveRequest v) { setField(8, v); } + set leave(LeaveRequest v) { + setField(8, v); + } + @$pb.TagNumber(8) $core.bool hasLeave() => $_has(7); @$pb.TagNumber(8) @@ -213,7 +263,10 @@ class SignalRequest extends $pb.GeneratedMessage { @$pb.TagNumber(9) SetSimulcastLayers get simulcast => $_getN(8); @$pb.TagNumber(9) - set simulcast(SetSimulcastLayers v) { setField(9, v); } + set simulcast(SetSimulcastLayers v) { + setField(9, v); + } + @$pb.TagNumber(9) $core.bool hasSimulcast() => $_has(8); @$pb.TagNumber(9) @@ -223,47 +276,70 @@ class SignalRequest extends $pb.GeneratedMessage { } enum SignalResponse_Message { - join, - answer, - offer, - trickle, - update, - trackPublished, - leave, - mute, - speakersChanged, - roomUpdate, + join, + answer, + offer, + trickle, + update, + trackPublished, + leave, + mute, + speakersChanged, + roomUpdate, notSet } class SignalResponse extends $pb.GeneratedMessage { static const $core.Map<$core.int, SignalResponse_Message> _SignalResponse_MessageByTag = { - 1 : SignalResponse_Message.join, - 2 : SignalResponse_Message.answer, - 3 : SignalResponse_Message.offer, - 4 : SignalResponse_Message.trickle, - 5 : SignalResponse_Message.update, - 6 : SignalResponse_Message.trackPublished, - 8 : SignalResponse_Message.leave, - 9 : SignalResponse_Message.mute, - 10 : SignalResponse_Message.speakersChanged, - 11 : SignalResponse_Message.roomUpdate, - 0 : SignalResponse_Message.notSet + 1: SignalResponse_Message.join, + 2: SignalResponse_Message.answer, + 3: SignalResponse_Message.offer, + 4: SignalResponse_Message.trickle, + 5: SignalResponse_Message.update, + 6: SignalResponse_Message.trackPublished, + 8: SignalResponse_Message.leave, + 9: SignalResponse_Message.mute, + 10: SignalResponse_Message.speakersChanged, + 11: SignalResponse_Message.roomUpdate, + 0: SignalResponse_Message.notSet }; - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SignalResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SignalResponse', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..oo(0, [1, 2, 3, 4, 5, 6, 8, 9, 10, 11]) - ..aOM(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'join', subBuilder: JoinResponse.create) - ..aOM(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'answer', subBuilder: SessionDescription.create) - ..aOM(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offer', subBuilder: SessionDescription.create) - ..aOM(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trickle', subBuilder: TrickleRequest.create) - ..aOM(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'update', subBuilder: ParticipantUpdate.create) - ..aOM(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackPublished', subBuilder: TrackPublishedResponse.create) - ..aOM(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'leave', subBuilder: LeaveRequest.create) - ..aOM(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mute', subBuilder: MuteTrackRequest.create) - ..aOM(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakersChanged', subBuilder: SpeakersChanged.create) - ..aOM(11, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'roomUpdate', subBuilder: RoomUpdate.create) - ..hasRequiredFields = false - ; + ..aOM( + 1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'join', + subBuilder: JoinResponse.create) + ..aOM( + 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'answer', + subBuilder: SessionDescription.create) + ..aOM( + 3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'offer', + subBuilder: SessionDescription.create) + ..aOM( + 4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trickle', + subBuilder: TrickleRequest.create) + ..aOM( + 5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'update', + subBuilder: ParticipantUpdate.create) + ..aOM( + 6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackPublished', + subBuilder: TrackPublishedResponse.create) + ..aOM( + 8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'leave', + subBuilder: LeaveRequest.create) + ..aOM( + 9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mute', + subBuilder: MuteTrackRequest.create) + ..aOM( + 10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakersChanged', + subBuilder: SpeakersChanged.create) + ..aOM( + 11, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'roomUpdate', + subBuilder: RoomUpdate.create) + ..hasRequiredFields = false; SignalResponse._() : super(); factory SignalResponse({ @@ -311,25 +387,30 @@ class SignalResponse extends $pb.GeneratedMessage { } return _result; } - factory SignalResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SignalResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SignalResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SignalResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SignalResponse clone() => SignalResponse()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SignalResponse copyWith(void Function(SignalResponse) updates) => super.copyWith((message) => updates(message as SignalResponse)) as SignalResponse; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SignalResponse copyWith(void Function(SignalResponse) updates) => + super.copyWith((message) => updates(message as SignalResponse)) + as SignalResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SignalResponse create() => SignalResponse._(); SignalResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SignalResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SignalResponse getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SignalResponse? _defaultInstance; SignalResponse_Message whichMessage() => _SignalResponse_MessageByTag[$_whichOneof(0)]!; @@ -338,7 +419,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(1) JoinResponse get join => $_getN(0); @$pb.TagNumber(1) - set join(JoinResponse v) { setField(1, v); } + set join(JoinResponse v) { + setField(1, v); + } + @$pb.TagNumber(1) $core.bool hasJoin() => $_has(0); @$pb.TagNumber(1) @@ -349,7 +433,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) SessionDescription get answer => $_getN(1); @$pb.TagNumber(2) - set answer(SessionDescription v) { setField(2, v); } + set answer(SessionDescription v) { + setField(2, v); + } + @$pb.TagNumber(2) $core.bool hasAnswer() => $_has(1); @$pb.TagNumber(2) @@ -360,7 +447,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(3) SessionDescription get offer => $_getN(2); @$pb.TagNumber(3) - set offer(SessionDescription v) { setField(3, v); } + set offer(SessionDescription v) { + setField(3, v); + } + @$pb.TagNumber(3) $core.bool hasOffer() => $_has(2); @$pb.TagNumber(3) @@ -371,7 +461,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(4) TrickleRequest get trickle => $_getN(3); @$pb.TagNumber(4) - set trickle(TrickleRequest v) { setField(4, v); } + set trickle(TrickleRequest v) { + setField(4, v); + } + @$pb.TagNumber(4) $core.bool hasTrickle() => $_has(3); @$pb.TagNumber(4) @@ -382,7 +475,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(5) ParticipantUpdate get update => $_getN(4); @$pb.TagNumber(5) - set update(ParticipantUpdate v) { setField(5, v); } + set update(ParticipantUpdate v) { + setField(5, v); + } + @$pb.TagNumber(5) $core.bool hasUpdate() => $_has(4); @$pb.TagNumber(5) @@ -393,7 +489,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(6) TrackPublishedResponse get trackPublished => $_getN(5); @$pb.TagNumber(6) - set trackPublished(TrackPublishedResponse v) { setField(6, v); } + set trackPublished(TrackPublishedResponse v) { + setField(6, v); + } + @$pb.TagNumber(6) $core.bool hasTrackPublished() => $_has(5); @$pb.TagNumber(6) @@ -404,7 +503,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(8) LeaveRequest get leave => $_getN(6); @$pb.TagNumber(8) - set leave(LeaveRequest v) { setField(8, v); } + set leave(LeaveRequest v) { + setField(8, v); + } + @$pb.TagNumber(8) $core.bool hasLeave() => $_has(6); @$pb.TagNumber(8) @@ -415,7 +517,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(9) MuteTrackRequest get mute => $_getN(7); @$pb.TagNumber(9) - set mute(MuteTrackRequest v) { setField(9, v); } + set mute(MuteTrackRequest v) { + setField(9, v); + } + @$pb.TagNumber(9) $core.bool hasMute() => $_has(7); @$pb.TagNumber(9) @@ -426,7 +531,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(10) SpeakersChanged get speakersChanged => $_getN(8); @$pb.TagNumber(10) - set speakersChanged(SpeakersChanged v) { setField(10, v); } + set speakersChanged(SpeakersChanged v) { + setField(10, v); + } + @$pb.TagNumber(10) $core.bool hasSpeakersChanged() => $_has(8); @$pb.TagNumber(10) @@ -437,7 +545,10 @@ class SignalResponse extends $pb.GeneratedMessage { @$pb.TagNumber(11) RoomUpdate get roomUpdate => $_getN(9); @$pb.TagNumber(11) - set roomUpdate(RoomUpdate v) { setField(11, v); } + set roomUpdate(RoomUpdate v) { + setField(11, v); + } + @$pb.TagNumber(11) $core.bool hasRoomUpdate() => $_has(9); @$pb.TagNumber(11) @@ -447,15 +558,26 @@ class SignalResponse extends $pb.GeneratedMessage { } class AddTrackRequest extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AddTrackRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AddTrackRequest', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cid') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') - ..e<$0.TrackType>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', $pb.PbFieldType.OE, defaultOrMaker: $0.TrackType.AUDIO, valueOf: $0.TrackType.valueOf, enumValues: $0.TrackType.values) - ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', $pb.PbFieldType.OU3) - ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', $pb.PbFieldType.OU3) + ..e<$0.TrackType>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type', + $pb.PbFieldType.OE, + defaultOrMaker: $0.TrackType.AUDIO, + valueOf: $0.TrackType.valueOf, + enumValues: $0.TrackType.values) + ..a<$core.int>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'width', + $pb.PbFieldType.OU3) + ..a<$core.int>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'height', + $pb.PbFieldType.OU3) ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'muted') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; AddTrackRequest._() : super(); factory AddTrackRequest({ @@ -487,31 +609,39 @@ class AddTrackRequest extends $pb.GeneratedMessage { } return _result; } - factory AddTrackRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory AddTrackRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory AddTrackRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory AddTrackRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') AddTrackRequest clone() => AddTrackRequest()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - AddTrackRequest copyWith(void Function(AddTrackRequest) updates) => super.copyWith((message) => updates(message as AddTrackRequest)) as AddTrackRequest; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + AddTrackRequest copyWith(void Function(AddTrackRequest) updates) => + super.copyWith((message) => updates(message as AddTrackRequest)) + as AddTrackRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static AddTrackRequest create() => AddTrackRequest._(); AddTrackRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static AddTrackRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static AddTrackRequest getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static AddTrackRequest? _defaultInstance; @$pb.TagNumber(1) $core.String get cid => $_getSZ(0); @$pb.TagNumber(1) - set cid($core.String v) { $_setString(0, v); } + set cid($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasCid() => $_has(0); @$pb.TagNumber(1) @@ -520,7 +650,10 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get name => $_getSZ(1); @$pb.TagNumber(2) - set name($core.String v) { $_setString(1, v); } + set name($core.String v) { + $_setString(1, v); + } + @$pb.TagNumber(2) $core.bool hasName() => $_has(1); @$pb.TagNumber(2) @@ -529,7 +662,10 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(3) $0.TrackType get type => $_getN(2); @$pb.TagNumber(3) - set type($0.TrackType v) { setField(3, v); } + set type($0.TrackType v) { + setField(3, v); + } + @$pb.TagNumber(3) $core.bool hasType() => $_has(2); @$pb.TagNumber(3) @@ -538,7 +674,10 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.int get width => $_getIZ(3); @$pb.TagNumber(4) - set width($core.int v) { $_setUnsignedInt32(3, v); } + set width($core.int v) { + $_setUnsignedInt32(3, v); + } + @$pb.TagNumber(4) $core.bool hasWidth() => $_has(3); @$pb.TagNumber(4) @@ -547,7 +686,10 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(5) $core.int get height => $_getIZ(4); @$pb.TagNumber(5) - set height($core.int v) { $_setUnsignedInt32(4, v); } + set height($core.int v) { + $_setUnsignedInt32(4, v); + } + @$pb.TagNumber(5) $core.bool hasHeight() => $_has(4); @$pb.TagNumber(5) @@ -556,7 +698,10 @@ class AddTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.bool get muted => $_getBF(5); @$pb.TagNumber(6) - set muted($core.bool v) { $_setBool(5, v); } + set muted($core.bool v) { + $_setBool(5, v); + } + @$pb.TagNumber(6) $core.bool hasMuted() => $_has(5); @$pb.TagNumber(6) @@ -564,11 +709,21 @@ class AddTrackRequest extends $pb.GeneratedMessage { } class TrickleRequest extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrickleRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) - ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'candidateInit', protoName: 'candidateInit') - ..e(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'target', $pb.PbFieldType.OE, defaultOrMaker: SignalTarget.PUBLISHER, valueOf: SignalTarget.valueOf, enumValues: SignalTarget.values) - ..hasRequiredFields = false - ; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrickleRequest', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'candidateInit', + protoName: 'candidateInit') + ..e( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'target', + $pb.PbFieldType.OE, + defaultOrMaker: SignalTarget.PUBLISHER, + valueOf: SignalTarget.valueOf, + enumValues: SignalTarget.values) + ..hasRequiredFields = false; TrickleRequest._() : super(); factory TrickleRequest({ @@ -584,31 +739,39 @@ class TrickleRequest extends $pb.GeneratedMessage { } return _result; } - factory TrickleRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory TrickleRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory TrickleRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory TrickleRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') TrickleRequest clone() => TrickleRequest()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - TrickleRequest copyWith(void Function(TrickleRequest) updates) => super.copyWith((message) => updates(message as TrickleRequest)) as TrickleRequest; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TrickleRequest copyWith(void Function(TrickleRequest) updates) => + super.copyWith((message) => updates(message as TrickleRequest)) + as TrickleRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static TrickleRequest create() => TrickleRequest._(); TrickleRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static TrickleRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TrickleRequest getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static TrickleRequest? _defaultInstance; @$pb.TagNumber(1) $core.String get candidateInit => $_getSZ(0); @$pb.TagNumber(1) - set candidateInit($core.String v) { $_setString(0, v); } + set candidateInit($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasCandidateInit() => $_has(0); @$pb.TagNumber(1) @@ -617,7 +780,10 @@ class TrickleRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) SignalTarget get target => $_getN(1); @$pb.TagNumber(2) - set target(SignalTarget v) { setField(2, v); } + set target(SignalTarget v) { + setField(2, v); + } + @$pb.TagNumber(2) $core.bool hasTarget() => $_has(1); @$pb.TagNumber(2) @@ -625,11 +791,14 @@ class TrickleRequest extends $pb.GeneratedMessage { } class MuteTrackRequest extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MuteTrackRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'MuteTrackRequest', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sid') ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'muted') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; MuteTrackRequest._() : super(); factory MuteTrackRequest({ @@ -645,31 +814,39 @@ class MuteTrackRequest extends $pb.GeneratedMessage { } return _result; } - factory MuteTrackRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory MuteTrackRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory MuteTrackRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory MuteTrackRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') MuteTrackRequest clone() => MuteTrackRequest()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - MuteTrackRequest copyWith(void Function(MuteTrackRequest) updates) => super.copyWith((message) => updates(message as MuteTrackRequest)) as MuteTrackRequest; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + MuteTrackRequest copyWith(void Function(MuteTrackRequest) updates) => + super.copyWith((message) => updates(message as MuteTrackRequest)) + as MuteTrackRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static MuteTrackRequest create() => MuteTrackRequest._(); MuteTrackRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static MuteTrackRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static MuteTrackRequest getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static MuteTrackRequest? _defaultInstance; @$pb.TagNumber(1) $core.String get sid => $_getSZ(0); @$pb.TagNumber(1) - set sid($core.String v) { $_setString(0, v); } + set sid($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasSid() => $_has(0); @$pb.TagNumber(1) @@ -678,7 +855,10 @@ class MuteTrackRequest extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.bool get muted => $_getBF(1); @$pb.TagNumber(2) - set muted($core.bool v) { $_setBool(1, v); } + set muted($core.bool v) { + $_setBool(1, v); + } + @$pb.TagNumber(2) $core.bool hasMuted() => $_has(1); @$pb.TagNumber(2) @@ -686,11 +866,19 @@ class MuteTrackRequest extends $pb.GeneratedMessage { } class SetSimulcastLayers extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SetSimulcastLayers', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SetSimulcastLayers', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSid') - ..pc(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'layers', $pb.PbFieldType.PE, valueOf: VideoQuality.valueOf, enumValues: VideoQuality.values) - ..hasRequiredFields = false - ; + ..pc( + 2, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'layers', + $pb.PbFieldType.PE, + valueOf: VideoQuality.valueOf, + enumValues: VideoQuality.values) + ..hasRequiredFields = false; SetSimulcastLayers._() : super(); factory SetSimulcastLayers({ @@ -706,31 +894,39 @@ class SetSimulcastLayers extends $pb.GeneratedMessage { } return _result; } - factory SetSimulcastLayers.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SetSimulcastLayers.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SetSimulcastLayers.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SetSimulcastLayers.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SetSimulcastLayers clone() => SetSimulcastLayers()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SetSimulcastLayers copyWith(void Function(SetSimulcastLayers) updates) => super.copyWith((message) => updates(message as SetSimulcastLayers)) as SetSimulcastLayers; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SetSimulcastLayers copyWith(void Function(SetSimulcastLayers) updates) => + super.copyWith((message) => updates(message as SetSimulcastLayers)) + as SetSimulcastLayers; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SetSimulcastLayers create() => SetSimulcastLayers._(); SetSimulcastLayers createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SetSimulcastLayers getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SetSimulcastLayers getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SetSimulcastLayers? _defaultInstance; @$pb.TagNumber(1) $core.String get trackSid => $_getSZ(0); @$pb.TagNumber(1) - set trackSid($core.String v) { $_setString(0, v); } + set trackSid($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasTrackSid() => $_has(0); @$pb.TagNumber(1) @@ -741,15 +937,30 @@ class SetSimulcastLayers extends $pb.GeneratedMessage { } class JoinResponse extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'JoinResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) - ..aOM<$0.Room>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'room', subBuilder: $0.Room.create) - ..aOM<$0.ParticipantInfo>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participant', subBuilder: $0.ParticipantInfo.create) - ..pc<$0.ParticipantInfo>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'otherParticipants', $pb.PbFieldType.PM, subBuilder: $0.ParticipantInfo.create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'JoinResponse', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) + ..aOM<$0.Room>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'room', + subBuilder: $0.Room.create) + ..aOM<$0.ParticipantInfo>( + 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participant', + subBuilder: $0.ParticipantInfo.create) + ..pc<$0.ParticipantInfo>( + 3, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'otherParticipants', + $pb.PbFieldType.PM, + subBuilder: $0.ParticipantInfo.create) ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serverVersion') - ..pc(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'iceServers', $pb.PbFieldType.PM, subBuilder: ICEServer.create) - ..aOB(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscriberPrimary') - ..hasRequiredFields = false - ; + ..pc( + 5, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'iceServers', + $pb.PbFieldType.PM, + subBuilder: ICEServer.create) + ..aOB( + 6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscriberPrimary') + ..hasRequiredFields = false; JoinResponse._() : super(); factory JoinResponse({ @@ -781,31 +992,39 @@ class JoinResponse extends $pb.GeneratedMessage { } return _result; } - factory JoinResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory JoinResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory JoinResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory JoinResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') JoinResponse clone() => JoinResponse()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - JoinResponse copyWith(void Function(JoinResponse) updates) => super.copyWith((message) => updates(message as JoinResponse)) as JoinResponse; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + JoinResponse copyWith(void Function(JoinResponse) updates) => + super.copyWith((message) => updates(message as JoinResponse)) + as JoinResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static JoinResponse create() => JoinResponse._(); JoinResponse createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static JoinResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static JoinResponse getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static JoinResponse? _defaultInstance; @$pb.TagNumber(1) $0.Room get room => $_getN(0); @$pb.TagNumber(1) - set room($0.Room v) { setField(1, v); } + set room($0.Room v) { + setField(1, v); + } + @$pb.TagNumber(1) $core.bool hasRoom() => $_has(0); @$pb.TagNumber(1) @@ -816,7 +1035,10 @@ class JoinResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $0.ParticipantInfo get participant => $_getN(1); @$pb.TagNumber(2) - set participant($0.ParticipantInfo v) { setField(2, v); } + set participant($0.ParticipantInfo v) { + setField(2, v); + } + @$pb.TagNumber(2) $core.bool hasParticipant() => $_has(1); @$pb.TagNumber(2) @@ -830,7 +1052,10 @@ class JoinResponse extends $pb.GeneratedMessage { @$pb.TagNumber(4) $core.String get serverVersion => $_getSZ(3); @$pb.TagNumber(4) - set serverVersion($core.String v) { $_setString(3, v); } + set serverVersion($core.String v) { + $_setString(3, v); + } + @$pb.TagNumber(4) $core.bool hasServerVersion() => $_has(3); @$pb.TagNumber(4) @@ -842,7 +1067,10 @@ class JoinResponse extends $pb.GeneratedMessage { @$pb.TagNumber(6) $core.bool get subscriberPrimary => $_getBF(5); @$pb.TagNumber(6) - set subscriberPrimary($core.bool v) { $_setBool(5, v); } + set subscriberPrimary($core.bool v) { + $_setBool(5, v); + } + @$pb.TagNumber(6) $core.bool hasSubscriberPrimary() => $_has(5); @$pb.TagNumber(6) @@ -850,11 +1078,18 @@ class JoinResponse extends $pb.GeneratedMessage { } class TrackPublishedResponse extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TrackPublishedResponse', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') + ? '' + : 'TrackPublishedResponse', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cid') - ..aOM<$0.TrackInfo>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'track', subBuilder: $0.TrackInfo.create) - ..hasRequiredFields = false - ; + ..aOM<$0.TrackInfo>( + 2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'track', + subBuilder: $0.TrackInfo.create) + ..hasRequiredFields = false; TrackPublishedResponse._() : super(); factory TrackPublishedResponse({ @@ -870,31 +1105,40 @@ class TrackPublishedResponse extends $pb.GeneratedMessage { } return _result; } - factory TrackPublishedResponse.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory TrackPublishedResponse.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory TrackPublishedResponse.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory TrackPublishedResponse.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') TrackPublishedResponse clone() => TrackPublishedResponse()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - TrackPublishedResponse copyWith(void Function(TrackPublishedResponse) updates) => super.copyWith((message) => updates(message as TrackPublishedResponse)) as TrackPublishedResponse; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + TrackPublishedResponse copyWith(void Function(TrackPublishedResponse) updates) => + super.copyWith((message) => updates(message as TrackPublishedResponse)) + as TrackPublishedResponse; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static TrackPublishedResponse create() => TrackPublishedResponse._(); TrackPublishedResponse createEmptyInstance() => create(); - static $pb.PbList createRepeated() => $pb.PbList(); + static $pb.PbList createRepeated() => + $pb.PbList(); @$core.pragma('dart2js:noInline') - static TrackPublishedResponse getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static TrackPublishedResponse getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static TrackPublishedResponse? _defaultInstance; @$pb.TagNumber(1) $core.String get cid => $_getSZ(0); @$pb.TagNumber(1) - set cid($core.String v) { $_setString(0, v); } + set cid($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasCid() => $_has(0); @$pb.TagNumber(1) @@ -903,7 +1147,10 @@ class TrackPublishedResponse extends $pb.GeneratedMessage { @$pb.TagNumber(2) $0.TrackInfo get track => $_getN(1); @$pb.TagNumber(2) - set track($0.TrackInfo v) { setField(2, v); } + set track($0.TrackInfo v) { + setField(2, v); + } + @$pb.TagNumber(2) $core.bool hasTrack() => $_has(1); @$pb.TagNumber(2) @@ -913,11 +1160,14 @@ class TrackPublishedResponse extends $pb.GeneratedMessage { } class SessionDescription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SessionDescription', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SessionDescription', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'type') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sdp') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; SessionDescription._() : super(); factory SessionDescription({ @@ -933,31 +1183,39 @@ class SessionDescription extends $pb.GeneratedMessage { } return _result; } - factory SessionDescription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SessionDescription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SessionDescription.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SessionDescription.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SessionDescription clone() => SessionDescription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SessionDescription copyWith(void Function(SessionDescription) updates) => super.copyWith((message) => updates(message as SessionDescription)) as SessionDescription; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SessionDescription copyWith(void Function(SessionDescription) updates) => + super.copyWith((message) => updates(message as SessionDescription)) + as SessionDescription; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SessionDescription create() => SessionDescription._(); SessionDescription createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SessionDescription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SessionDescription getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SessionDescription? _defaultInstance; @$pb.TagNumber(1) $core.String get type => $_getSZ(0); @$pb.TagNumber(1) - set type($core.String v) { $_setString(0, v); } + set type($core.String v) { + $_setString(0, v); + } + @$pb.TagNumber(1) $core.bool hasType() => $_has(0); @$pb.TagNumber(1) @@ -966,7 +1224,10 @@ class SessionDescription extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get sdp => $_getSZ(1); @$pb.TagNumber(2) - set sdp($core.String v) { $_setString(1, v); } + set sdp($core.String v) { + $_setString(1, v); + } + @$pb.TagNumber(2) $core.bool hasSdp() => $_has(1); @$pb.TagNumber(2) @@ -974,10 +1235,17 @@ class SessionDescription extends $pb.GeneratedMessage { } class ParticipantUpdate extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ParticipantUpdate', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) - ..pc<$0.ParticipantInfo>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participants', $pb.PbFieldType.PM, subBuilder: $0.ParticipantInfo.create) - ..hasRequiredFields = false - ; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ParticipantUpdate', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) + ..pc<$0.ParticipantInfo>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'participants', + $pb.PbFieldType.PM, + subBuilder: $0.ParticipantInfo.create) + ..hasRequiredFields = false; ParticipantUpdate._() : super(); factory ParticipantUpdate({ @@ -989,25 +1257,30 @@ class ParticipantUpdate extends $pb.GeneratedMessage { } return _result; } - factory ParticipantUpdate.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory ParticipantUpdate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory ParticipantUpdate.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ParticipantUpdate.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') ParticipantUpdate clone() => ParticipantUpdate()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - ParticipantUpdate copyWith(void Function(ParticipantUpdate) updates) => super.copyWith((message) => updates(message as ParticipantUpdate)) as ParticipantUpdate; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ParticipantUpdate copyWith(void Function(ParticipantUpdate) updates) => + super.copyWith((message) => updates(message as ParticipantUpdate)) + as ParticipantUpdate; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ParticipantUpdate create() => ParticipantUpdate._(); ParticipantUpdate createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static ParticipantUpdate getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ParticipantUpdate getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static ParticipantUpdate? _defaultInstance; @$pb.TagNumber(1) @@ -1015,11 +1288,14 @@ class ParticipantUpdate extends $pb.GeneratedMessage { } class UpdateSubscription extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateSubscription', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateSubscription', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSids') ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'subscribe') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; UpdateSubscription._() : super(); factory UpdateSubscription({ @@ -1035,25 +1311,30 @@ class UpdateSubscription extends $pb.GeneratedMessage { } return _result; } - factory UpdateSubscription.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory UpdateSubscription.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory UpdateSubscription.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory UpdateSubscription.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') UpdateSubscription clone() => UpdateSubscription()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - UpdateSubscription copyWith(void Function(UpdateSubscription) updates) => super.copyWith((message) => updates(message as UpdateSubscription)) as UpdateSubscription; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + UpdateSubscription copyWith(void Function(UpdateSubscription) updates) => + super.copyWith((message) => updates(message as UpdateSubscription)) + as UpdateSubscription; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static UpdateSubscription create() => UpdateSubscription._(); UpdateSubscription createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static UpdateSubscription getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static UpdateSubscription getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static UpdateSubscription? _defaultInstance; @$pb.TagNumber(1) @@ -1062,7 +1343,10 @@ class UpdateSubscription extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.bool get subscribe => $_getBF(1); @$pb.TagNumber(2) - set subscribe($core.bool v) { $_setBool(1, v); } + set subscribe($core.bool v) { + $_setBool(1, v); + } + @$pb.TagNumber(2) $core.bool hasSubscribe() => $_has(1); @$pb.TagNumber(2) @@ -1070,12 +1354,21 @@ class UpdateSubscription extends $pb.GeneratedMessage { } class UpdateTrackSettings extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateTrackSettings', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateTrackSettings', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'trackSids') ..aOB(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'disabled') - ..e(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'quality', $pb.PbFieldType.OE, defaultOrMaker: VideoQuality.LOW, valueOf: VideoQuality.valueOf, enumValues: VideoQuality.values) - ..hasRequiredFields = false - ; + ..e( + 4, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'quality', + $pb.PbFieldType.OE, + defaultOrMaker: VideoQuality.LOW, + valueOf: VideoQuality.valueOf, + enumValues: VideoQuality.values) + ..hasRequiredFields = false; UpdateTrackSettings._() : super(); factory UpdateTrackSettings({ @@ -1095,25 +1388,30 @@ class UpdateTrackSettings extends $pb.GeneratedMessage { } return _result; } - factory UpdateTrackSettings.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory UpdateTrackSettings.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory UpdateTrackSettings.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory UpdateTrackSettings.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') UpdateTrackSettings clone() => UpdateTrackSettings()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - UpdateTrackSettings copyWith(void Function(UpdateTrackSettings) updates) => super.copyWith((message) => updates(message as UpdateTrackSettings)) as UpdateTrackSettings; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + UpdateTrackSettings copyWith(void Function(UpdateTrackSettings) updates) => + super.copyWith((message) => updates(message as UpdateTrackSettings)) + as UpdateTrackSettings; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static UpdateTrackSettings create() => UpdateTrackSettings._(); UpdateTrackSettings createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static UpdateTrackSettings getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static UpdateTrackSettings getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static UpdateTrackSettings? _defaultInstance; @$pb.TagNumber(1) @@ -1122,7 +1420,10 @@ class UpdateTrackSettings extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.bool get disabled => $_getBF(1); @$pb.TagNumber(3) - set disabled($core.bool v) { $_setBool(1, v); } + set disabled($core.bool v) { + $_setBool(1, v); + } + @$pb.TagNumber(3) $core.bool hasDisabled() => $_has(1); @$pb.TagNumber(3) @@ -1131,7 +1432,10 @@ class UpdateTrackSettings extends $pb.GeneratedMessage { @$pb.TagNumber(4) VideoQuality get quality => $_getN(2); @$pb.TagNumber(4) - set quality(VideoQuality v) { setField(4, v); } + set quality(VideoQuality v) { + setField(4, v); + } + @$pb.TagNumber(4) $core.bool hasQuality() => $_has(2); @$pb.TagNumber(4) @@ -1139,10 +1443,13 @@ class UpdateTrackSettings extends $pb.GeneratedMessage { } class LeaveRequest extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'LeaveRequest', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'LeaveRequest', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'canReconnect') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; LeaveRequest._() : super(); factory LeaveRequest({ @@ -1154,31 +1461,39 @@ class LeaveRequest extends $pb.GeneratedMessage { } return _result; } - factory LeaveRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory LeaveRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory LeaveRequest.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory LeaveRequest.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') LeaveRequest clone() => LeaveRequest()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - LeaveRequest copyWith(void Function(LeaveRequest) updates) => super.copyWith((message) => updates(message as LeaveRequest)) as LeaveRequest; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + LeaveRequest copyWith(void Function(LeaveRequest) updates) => + super.copyWith((message) => updates(message as LeaveRequest)) + as LeaveRequest; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static LeaveRequest create() => LeaveRequest._(); LeaveRequest createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static LeaveRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static LeaveRequest getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static LeaveRequest? _defaultInstance; @$pb.TagNumber(1) $core.bool get canReconnect => $_getBF(0); @$pb.TagNumber(1) - set canReconnect($core.bool v) { $_setBool(0, v); } + set canReconnect($core.bool v) { + $_setBool(0, v); + } + @$pb.TagNumber(1) $core.bool hasCanReconnect() => $_has(0); @$pb.TagNumber(1) @@ -1186,12 +1501,15 @@ class LeaveRequest extends $pb.GeneratedMessage { } class ICEServer extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ICEServer', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ICEServer', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'urls') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'username') ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'credential') - ..hasRequiredFields = false - ; + ..hasRequiredFields = false; ICEServer._() : super(); factory ICEServer({ @@ -1211,25 +1529,30 @@ class ICEServer extends $pb.GeneratedMessage { } return _result; } - factory ICEServer.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory ICEServer.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory ICEServer.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory ICEServer.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') ICEServer clone() => ICEServer()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - ICEServer copyWith(void Function(ICEServer) updates) => super.copyWith((message) => updates(message as ICEServer)) as ICEServer; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + ICEServer copyWith(void Function(ICEServer) updates) => + super.copyWith((message) => updates(message as ICEServer)) + as ICEServer; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static ICEServer create() => ICEServer._(); ICEServer createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static ICEServer getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ICEServer getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static ICEServer? _defaultInstance; @$pb.TagNumber(1) @@ -1238,7 +1561,10 @@ class ICEServer extends $pb.GeneratedMessage { @$pb.TagNumber(2) $core.String get username => $_getSZ(1); @$pb.TagNumber(2) - set username($core.String v) { $_setString(1, v); } + set username($core.String v) { + $_setString(1, v); + } + @$pb.TagNumber(2) $core.bool hasUsername() => $_has(1); @$pb.TagNumber(2) @@ -1247,7 +1573,10 @@ class ICEServer extends $pb.GeneratedMessage { @$pb.TagNumber(3) $core.String get credential => $_getSZ(2); @$pb.TagNumber(3) - set credential($core.String v) { $_setString(2, v); } + set credential($core.String v) { + $_setString(2, v); + } + @$pb.TagNumber(3) $core.bool hasCredential() => $_has(2); @$pb.TagNumber(3) @@ -1255,10 +1584,17 @@ class ICEServer extends $pb.GeneratedMessage { } class SpeakersChanged extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SpeakersChanged', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) - ..pc<$0.SpeakerInfo>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakers', $pb.PbFieldType.PM, subBuilder: $0.SpeakerInfo.create) - ..hasRequiredFields = false - ; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'SpeakersChanged', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) + ..pc<$0.SpeakerInfo>( + 1, + const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'speakers', + $pb.PbFieldType.PM, + subBuilder: $0.SpeakerInfo.create) + ..hasRequiredFields = false; SpeakersChanged._() : super(); factory SpeakersChanged({ @@ -1270,25 +1606,30 @@ class SpeakersChanged extends $pb.GeneratedMessage { } return _result; } - factory SpeakersChanged.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory SpeakersChanged.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory SpeakersChanged.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory SpeakersChanged.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') SpeakersChanged clone() => SpeakersChanged()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - SpeakersChanged copyWith(void Function(SpeakersChanged) updates) => super.copyWith((message) => updates(message as SpeakersChanged)) as SpeakersChanged; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + SpeakersChanged copyWith(void Function(SpeakersChanged) updates) => + super.copyWith((message) => updates(message as SpeakersChanged)) + as SpeakersChanged; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static SpeakersChanged create() => SpeakersChanged._(); SpeakersChanged createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static SpeakersChanged getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static SpeakersChanged getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static SpeakersChanged? _defaultInstance; @$pb.TagNumber(1) @@ -1296,10 +1637,14 @@ class SpeakersChanged extends $pb.GeneratedMessage { } class RoomUpdate extends $pb.GeneratedMessage { - static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RoomUpdate', package: const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), createEmptyInstance: create) - ..aOM<$0.Room>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'room', subBuilder: $0.Room.create) - ..hasRequiredFields = false - ; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RoomUpdate', + package: const $pb.PackageName( + const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'livekit'), + createEmptyInstance: create) + ..aOM<$0.Room>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'room', + subBuilder: $0.Room.create) + ..hasRequiredFields = false; RoomUpdate._() : super(); factory RoomUpdate({ @@ -1311,31 +1656,39 @@ class RoomUpdate extends $pb.GeneratedMessage { } return _result; } - factory RoomUpdate.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); - factory RoomUpdate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' - 'Will be removed in next major version') + factory RoomUpdate.fromBuffer($core.List<$core.int> i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(i, r); + factory RoomUpdate.fromJson($core.String i, + [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(i, r); + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') RoomUpdate clone() => RoomUpdate()..mergeFromMessage(this); - @$core.Deprecated( - 'Using this can add significant overhead to your binary. ' - 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' - 'Will be removed in next major version') - RoomUpdate copyWith(void Function(RoomUpdate) updates) => super.copyWith((message) => updates(message as RoomUpdate)) as RoomUpdate; // ignore: deprecated_member_use + @$core.Deprecated('Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + RoomUpdate copyWith(void Function(RoomUpdate) updates) => + super.copyWith((message) => updates(message as RoomUpdate)) + as RoomUpdate; // ignore: deprecated_member_use $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static RoomUpdate create() => RoomUpdate._(); RoomUpdate createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') - static RoomUpdate getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static RoomUpdate getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static RoomUpdate? _defaultInstance; @$pb.TagNumber(1) $0.Room get room => $_getN(0); @$pb.TagNumber(1) - set room($0.Room v) { setField(1, v); } + set room($0.Room v) { + setField(1, v); + } + @$pb.TagNumber(1) $core.bool hasRoom() => $_has(0); @$pb.TagNumber(1) @@ -1343,4 +1696,3 @@ class RoomUpdate extends $pb.GeneratedMessage { @$pb.TagNumber(1) $0.Room ensureRoom() => $_ensure(0); } - diff --git a/lib/src/proto/livekit_rtc.pbenum.dart b/lib/src/proto/livekit_rtc.pbenum.dart index 5c10154fb..b95f930ad 100644 --- a/lib/src/proto/livekit_rtc.pbenum.dart +++ b/lib/src/proto/livekit_rtc.pbenum.dart @@ -10,10 +10,12 @@ import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; class SignalTarget extends $pb.ProtobufEnum { - static const SignalTarget PUBLISHER = SignalTarget._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PUBLISHER'); - static const SignalTarget SUBSCRIBER = SignalTarget._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SUBSCRIBER'); + static const SignalTarget PUBLISHER = SignalTarget._( + 0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PUBLISHER'); + static const SignalTarget SUBSCRIBER = SignalTarget._( + 1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SUBSCRIBER'); - static const $core.List values = [ + static const $core.List values = [ PUBLISHER, SUBSCRIBER, ]; @@ -25,11 +27,14 @@ class SignalTarget extends $pb.ProtobufEnum { } class VideoQuality extends $pb.ProtobufEnum { - static const VideoQuality LOW = VideoQuality._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LOW'); - static const VideoQuality MEDIUM = VideoQuality._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'MEDIUM'); - static const VideoQuality HIGH = VideoQuality._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'HIGH'); - - static const $core.List values = [ + static const VideoQuality LOW = + VideoQuality._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'LOW'); + static const VideoQuality MEDIUM = VideoQuality._( + 1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'MEDIUM'); + static const VideoQuality HIGH = + VideoQuality._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'HIGH'); + + static const $core.List values = [ LOW, MEDIUM, HIGH, @@ -40,4 +45,3 @@ class VideoQuality extends $pb.ProtobufEnum { const VideoQuality._($core.int v, $core.String n) : super(v, n); } - diff --git a/lib/src/proto/livekit_rtc.pbjson.dart b/lib/src/proto/livekit_rtc.pbjson.dart index 31d6dd3ac..4833792c8 100644 --- a/lib/src/proto/livekit_rtc.pbjson.dart +++ b/lib/src/proto/livekit_rtc.pbjson.dart @@ -8,6 +8,7 @@ import 'dart:core' as $core; import 'dart:convert' as $convert; import 'dart:typed_data' as $typed_data; + @$core.Deprecated('Use signalTargetDescriptor instead') const SignalTarget$json = const { '1': 'SignalTarget', @@ -18,7 +19,8 @@ const SignalTarget$json = const { }; /// Descriptor for `SignalTarget`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List signalTargetDescriptor = $convert.base64Decode('CgxTaWduYWxUYXJnZXQSDQoJUFVCTElTSEVSEAASDgoKU1VCU0NSSUJFUhAB'); +final $typed_data.Uint8List signalTargetDescriptor = + $convert.base64Decode('CgxTaWduYWxUYXJnZXQSDQoJUFVCTElTSEVSEAASDgoKU1VCU0NSSUJFUhAB'); @$core.Deprecated('Use videoQualityDescriptor instead') const VideoQuality$json = const { '1': 'VideoQuality', @@ -30,20 +32,93 @@ const VideoQuality$json = const { }; /// Descriptor for `VideoQuality`. Decode as a `google.protobuf.EnumDescriptorProto`. -final $typed_data.Uint8List videoQualityDescriptor = $convert.base64Decode('CgxWaWRlb1F1YWxpdHkSBwoDTE9XEAASCgoGTUVESVVNEAESCAoESElHSBAC'); +final $typed_data.Uint8List videoQualityDescriptor = + $convert.base64Decode('CgxWaWRlb1F1YWxpdHkSBwoDTE9XEAASCgoGTUVESVVNEAESCAoESElHSBAC'); @$core.Deprecated('Use signalRequestDescriptor instead') const SignalRequest$json = const { '1': 'SignalRequest', '2': const [ - const {'1': 'offer', '3': 1, '4': 1, '5': 11, '6': '.livekit.SessionDescription', '9': 0, '10': 'offer'}, - const {'1': 'answer', '3': 2, '4': 1, '5': 11, '6': '.livekit.SessionDescription', '9': 0, '10': 'answer'}, - const {'1': 'trickle', '3': 3, '4': 1, '5': 11, '6': '.livekit.TrickleRequest', '9': 0, '10': 'trickle'}, - const {'1': 'add_track', '3': 4, '4': 1, '5': 11, '6': '.livekit.AddTrackRequest', '9': 0, '10': 'addTrack'}, - const {'1': 'mute', '3': 5, '4': 1, '5': 11, '6': '.livekit.MuteTrackRequest', '9': 0, '10': 'mute'}, - const {'1': 'subscription', '3': 6, '4': 1, '5': 11, '6': '.livekit.UpdateSubscription', '9': 0, '10': 'subscription'}, - const {'1': 'track_setting', '3': 7, '4': 1, '5': 11, '6': '.livekit.UpdateTrackSettings', '9': 0, '10': 'trackSetting'}, - const {'1': 'leave', '3': 8, '4': 1, '5': 11, '6': '.livekit.LeaveRequest', '9': 0, '10': 'leave'}, - const {'1': 'simulcast', '3': 9, '4': 1, '5': 11, '6': '.livekit.SetSimulcastLayers', '9': 0, '10': 'simulcast'}, + const { + '1': 'offer', + '3': 1, + '4': 1, + '5': 11, + '6': '.livekit.SessionDescription', + '9': 0, + '10': 'offer' + }, + const { + '1': 'answer', + '3': 2, + '4': 1, + '5': 11, + '6': '.livekit.SessionDescription', + '9': 0, + '10': 'answer' + }, + const { + '1': 'trickle', + '3': 3, + '4': 1, + '5': 11, + '6': '.livekit.TrickleRequest', + '9': 0, + '10': 'trickle' + }, + const { + '1': 'add_track', + '3': 4, + '4': 1, + '5': 11, + '6': '.livekit.AddTrackRequest', + '9': 0, + '10': 'addTrack' + }, + const { + '1': 'mute', + '3': 5, + '4': 1, + '5': 11, + '6': '.livekit.MuteTrackRequest', + '9': 0, + '10': 'mute' + }, + const { + '1': 'subscription', + '3': 6, + '4': 1, + '5': 11, + '6': '.livekit.UpdateSubscription', + '9': 0, + '10': 'subscription' + }, + const { + '1': 'track_setting', + '3': 7, + '4': 1, + '5': 11, + '6': '.livekit.UpdateTrackSettings', + '9': 0, + '10': 'trackSetting' + }, + const { + '1': 'leave', + '3': 8, + '4': 1, + '5': 11, + '6': '.livekit.LeaveRequest', + '9': 0, + '10': 'leave' + }, + const { + '1': 'simulcast', + '3': 9, + '4': 1, + '5': 11, + '6': '.livekit.SetSimulcastLayers', + '9': 0, + '10': 'simulcast' + }, ], '8': const [ const {'1': 'message'}, @@ -51,21 +126,102 @@ const SignalRequest$json = const { }; /// Descriptor for `SignalRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List signalRequestDescriptor = $convert.base64Decode('Cg1TaWduYWxSZXF1ZXN0EjMKBW9mZmVyGAEgASgLMhsubGl2ZWtpdC5TZXNzaW9uRGVzY3JpcHRpb25IAFIFb2ZmZXISNQoGYW5zd2VyGAIgASgLMhsubGl2ZWtpdC5TZXNzaW9uRGVzY3JpcHRpb25IAFIGYW5zd2VyEjMKB3RyaWNrbGUYAyABKAsyFy5saXZla2l0LlRyaWNrbGVSZXF1ZXN0SABSB3RyaWNrbGUSNwoJYWRkX3RyYWNrGAQgASgLMhgubGl2ZWtpdC5BZGRUcmFja1JlcXVlc3RIAFIIYWRkVHJhY2sSLwoEbXV0ZRgFIAEoCzIZLmxpdmVraXQuTXV0ZVRyYWNrUmVxdWVzdEgAUgRtdXRlEkEKDHN1YnNjcmlwdGlvbhgGIAEoCzIbLmxpdmVraXQuVXBkYXRlU3Vic2NyaXB0aW9uSABSDHN1YnNjcmlwdGlvbhJDCg10cmFja19zZXR0aW5nGAcgASgLMhwubGl2ZWtpdC5VcGRhdGVUcmFja1NldHRpbmdzSABSDHRyYWNrU2V0dGluZxItCgVsZWF2ZRgIIAEoCzIVLmxpdmVraXQuTGVhdmVSZXF1ZXN0SABSBWxlYXZlEjsKCXNpbXVsY2FzdBgJIAEoCzIbLmxpdmVraXQuU2V0U2ltdWxjYXN0TGF5ZXJzSABSCXNpbXVsY2FzdEIJCgdtZXNzYWdl'); +final $typed_data.Uint8List signalRequestDescriptor = $convert.base64Decode( + 'Cg1TaWduYWxSZXF1ZXN0EjMKBW9mZmVyGAEgASgLMhsubGl2ZWtpdC5TZXNzaW9uRGVzY3JpcHRpb25IAFIFb2ZmZXISNQoGYW5zd2VyGAIgASgLMhsubGl2ZWtpdC5TZXNzaW9uRGVzY3JpcHRpb25IAFIGYW5zd2VyEjMKB3RyaWNrbGUYAyABKAsyFy5saXZla2l0LlRyaWNrbGVSZXF1ZXN0SABSB3RyaWNrbGUSNwoJYWRkX3RyYWNrGAQgASgLMhgubGl2ZWtpdC5BZGRUcmFja1JlcXVlc3RIAFIIYWRkVHJhY2sSLwoEbXV0ZRgFIAEoCzIZLmxpdmVraXQuTXV0ZVRyYWNrUmVxdWVzdEgAUgRtdXRlEkEKDHN1YnNjcmlwdGlvbhgGIAEoCzIbLmxpdmVraXQuVXBkYXRlU3Vic2NyaXB0aW9uSABSDHN1YnNjcmlwdGlvbhJDCg10cmFja19zZXR0aW5nGAcgASgLMhwubGl2ZWtpdC5VcGRhdGVUcmFja1NldHRpbmdzSABSDHRyYWNrU2V0dGluZxItCgVsZWF2ZRgIIAEoCzIVLmxpdmVraXQuTGVhdmVSZXF1ZXN0SABSBWxlYXZlEjsKCXNpbXVsY2FzdBgJIAEoCzIbLmxpdmVraXQuU2V0U2ltdWxjYXN0TGF5ZXJzSABSCXNpbXVsY2FzdEIJCgdtZXNzYWdl'); @$core.Deprecated('Use signalResponseDescriptor instead') const SignalResponse$json = const { '1': 'SignalResponse', '2': const [ - const {'1': 'join', '3': 1, '4': 1, '5': 11, '6': '.livekit.JoinResponse', '9': 0, '10': 'join'}, - const {'1': 'answer', '3': 2, '4': 1, '5': 11, '6': '.livekit.SessionDescription', '9': 0, '10': 'answer'}, - const {'1': 'offer', '3': 3, '4': 1, '5': 11, '6': '.livekit.SessionDescription', '9': 0, '10': 'offer'}, - const {'1': 'trickle', '3': 4, '4': 1, '5': 11, '6': '.livekit.TrickleRequest', '9': 0, '10': 'trickle'}, - const {'1': 'update', '3': 5, '4': 1, '5': 11, '6': '.livekit.ParticipantUpdate', '9': 0, '10': 'update'}, - const {'1': 'track_published', '3': 6, '4': 1, '5': 11, '6': '.livekit.TrackPublishedResponse', '9': 0, '10': 'trackPublished'}, - const {'1': 'leave', '3': 8, '4': 1, '5': 11, '6': '.livekit.LeaveRequest', '9': 0, '10': 'leave'}, - const {'1': 'mute', '3': 9, '4': 1, '5': 11, '6': '.livekit.MuteTrackRequest', '9': 0, '10': 'mute'}, - const {'1': 'speakers_changed', '3': 10, '4': 1, '5': 11, '6': '.livekit.SpeakersChanged', '9': 0, '10': 'speakersChanged'}, - const {'1': 'room_update', '3': 11, '4': 1, '5': 11, '6': '.livekit.RoomUpdate', '9': 0, '10': 'roomUpdate'}, + const { + '1': 'join', + '3': 1, + '4': 1, + '5': 11, + '6': '.livekit.JoinResponse', + '9': 0, + '10': 'join' + }, + const { + '1': 'answer', + '3': 2, + '4': 1, + '5': 11, + '6': '.livekit.SessionDescription', + '9': 0, + '10': 'answer' + }, + const { + '1': 'offer', + '3': 3, + '4': 1, + '5': 11, + '6': '.livekit.SessionDescription', + '9': 0, + '10': 'offer' + }, + const { + '1': 'trickle', + '3': 4, + '4': 1, + '5': 11, + '6': '.livekit.TrickleRequest', + '9': 0, + '10': 'trickle' + }, + const { + '1': 'update', + '3': 5, + '4': 1, + '5': 11, + '6': '.livekit.ParticipantUpdate', + '9': 0, + '10': 'update' + }, + const { + '1': 'track_published', + '3': 6, + '4': 1, + '5': 11, + '6': '.livekit.TrackPublishedResponse', + '9': 0, + '10': 'trackPublished' + }, + const { + '1': 'leave', + '3': 8, + '4': 1, + '5': 11, + '6': '.livekit.LeaveRequest', + '9': 0, + '10': 'leave' + }, + const { + '1': 'mute', + '3': 9, + '4': 1, + '5': 11, + '6': '.livekit.MuteTrackRequest', + '9': 0, + '10': 'mute' + }, + const { + '1': 'speakers_changed', + '3': 10, + '4': 1, + '5': 11, + '6': '.livekit.SpeakersChanged', + '9': 0, + '10': 'speakersChanged' + }, + const { + '1': 'room_update', + '3': 11, + '4': 1, + '5': 11, + '6': '.livekit.RoomUpdate', + '9': 0, + '10': 'roomUpdate' + }, ], '8': const [ const {'1': 'message'}, @@ -73,7 +229,8 @@ const SignalResponse$json = const { }; /// Descriptor for `SignalResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List signalResponseDescriptor = $convert.base64Decode('Cg5TaWduYWxSZXNwb25zZRIrCgRqb2luGAEgASgLMhUubGl2ZWtpdC5Kb2luUmVzcG9uc2VIAFIEam9pbhI1CgZhbnN3ZXIYAiABKAsyGy5saXZla2l0LlNlc3Npb25EZXNjcmlwdGlvbkgAUgZhbnN3ZXISMwoFb2ZmZXIYAyABKAsyGy5saXZla2l0LlNlc3Npb25EZXNjcmlwdGlvbkgAUgVvZmZlchIzCgd0cmlja2xlGAQgASgLMhcubGl2ZWtpdC5Ucmlja2xlUmVxdWVzdEgAUgd0cmlja2xlEjQKBnVwZGF0ZRgFIAEoCzIaLmxpdmVraXQuUGFydGljaXBhbnRVcGRhdGVIAFIGdXBkYXRlEkoKD3RyYWNrX3B1Ymxpc2hlZBgGIAEoCzIfLmxpdmVraXQuVHJhY2tQdWJsaXNoZWRSZXNwb25zZUgAUg50cmFja1B1Ymxpc2hlZBItCgVsZWF2ZRgIIAEoCzIVLmxpdmVraXQuTGVhdmVSZXF1ZXN0SABSBWxlYXZlEi8KBG11dGUYCSABKAsyGS5saXZla2l0Lk11dGVUcmFja1JlcXVlc3RIAFIEbXV0ZRJFChBzcGVha2Vyc19jaGFuZ2VkGAogASgLMhgubGl2ZWtpdC5TcGVha2Vyc0NoYW5nZWRIAFIPc3BlYWtlcnNDaGFuZ2VkEjYKC3Jvb21fdXBkYXRlGAsgASgLMhMubGl2ZWtpdC5Sb29tVXBkYXRlSABSCnJvb21VcGRhdGVCCQoHbWVzc2FnZQ=='); +final $typed_data.Uint8List signalResponseDescriptor = $convert.base64Decode( + 'Cg5TaWduYWxSZXNwb25zZRIrCgRqb2luGAEgASgLMhUubGl2ZWtpdC5Kb2luUmVzcG9uc2VIAFIEam9pbhI1CgZhbnN3ZXIYAiABKAsyGy5saXZla2l0LlNlc3Npb25EZXNjcmlwdGlvbkgAUgZhbnN3ZXISMwoFb2ZmZXIYAyABKAsyGy5saXZla2l0LlNlc3Npb25EZXNjcmlwdGlvbkgAUgVvZmZlchIzCgd0cmlja2xlGAQgASgLMhcubGl2ZWtpdC5Ucmlja2xlUmVxdWVzdEgAUgd0cmlja2xlEjQKBnVwZGF0ZRgFIAEoCzIaLmxpdmVraXQuUGFydGljaXBhbnRVcGRhdGVIAFIGdXBkYXRlEkoKD3RyYWNrX3B1Ymxpc2hlZBgGIAEoCzIfLmxpdmVraXQuVHJhY2tQdWJsaXNoZWRSZXNwb25zZUgAUg50cmFja1B1Ymxpc2hlZBItCgVsZWF2ZRgIIAEoCzIVLmxpdmVraXQuTGVhdmVSZXF1ZXN0SABSBWxlYXZlEi8KBG11dGUYCSABKAsyGS5saXZla2l0Lk11dGVUcmFja1JlcXVlc3RIAFIEbXV0ZRJFChBzcGVha2Vyc19jaGFuZ2VkGAogASgLMhgubGl2ZWtpdC5TcGVha2Vyc0NoYW5nZWRIAFIPc3BlYWtlcnNDaGFuZ2VkEjYKC3Jvb21fdXBkYXRlGAsgASgLMhMubGl2ZWtpdC5Sb29tVXBkYXRlSABSCnJvb21VcGRhdGVCCQoHbWVzc2FnZQ=='); @$core.Deprecated('Use addTrackRequestDescriptor instead') const AddTrackRequest$json = const { '1': 'AddTrackRequest', @@ -88,7 +245,8 @@ const AddTrackRequest$json = const { }; /// Descriptor for `AddTrackRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List addTrackRequestDescriptor = $convert.base64Decode('Cg9BZGRUcmFja1JlcXVlc3QSEAoDY2lkGAEgASgJUgNjaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRImCgR0eXBlGAMgASgOMhIubGl2ZWtpdC5UcmFja1R5cGVSBHR5cGUSFAoFd2lkdGgYBCABKA1SBXdpZHRoEhYKBmhlaWdodBgFIAEoDVIGaGVpZ2h0EhQKBW11dGVkGAYgASgIUgVtdXRlZA=='); +final $typed_data.Uint8List addTrackRequestDescriptor = $convert.base64Decode( + 'Cg9BZGRUcmFja1JlcXVlc3QSEAoDY2lkGAEgASgJUgNjaWQSEgoEbmFtZRgCIAEoCVIEbmFtZRImCgR0eXBlGAMgASgOMhIubGl2ZWtpdC5UcmFja1R5cGVSBHR5cGUSFAoFd2lkdGgYBCABKA1SBXdpZHRoEhYKBmhlaWdodBgFIAEoDVIGaGVpZ2h0EhQKBW11dGVkGAYgASgIUgVtdXRlZA=='); @$core.Deprecated('Use trickleRequestDescriptor instead') const TrickleRequest$json = const { '1': 'TrickleRequest', @@ -99,7 +257,8 @@ const TrickleRequest$json = const { }; /// Descriptor for `TrickleRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List trickleRequestDescriptor = $convert.base64Decode('Cg5Ucmlja2xlUmVxdWVzdBIkCg1jYW5kaWRhdGVJbml0GAEgASgJUg1jYW5kaWRhdGVJbml0Ei0KBnRhcmdldBgCIAEoDjIVLmxpdmVraXQuU2lnbmFsVGFyZ2V0UgZ0YXJnZXQ='); +final $typed_data.Uint8List trickleRequestDescriptor = $convert.base64Decode( + 'Cg5Ucmlja2xlUmVxdWVzdBIkCg1jYW5kaWRhdGVJbml0GAEgASgJUg1jYW5kaWRhdGVJbml0Ei0KBnRhcmdldBgCIAEoDjIVLmxpdmVraXQuU2lnbmFsVGFyZ2V0UgZ0YXJnZXQ='); @$core.Deprecated('Use muteTrackRequestDescriptor instead') const MuteTrackRequest$json = const { '1': 'MuteTrackRequest', @@ -110,7 +269,8 @@ const MuteTrackRequest$json = const { }; /// Descriptor for `MuteTrackRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List muteTrackRequestDescriptor = $convert.base64Decode('ChBNdXRlVHJhY2tSZXF1ZXN0EhAKA3NpZBgBIAEoCVIDc2lkEhQKBW11dGVkGAIgASgIUgVtdXRlZA=='); +final $typed_data.Uint8List muteTrackRequestDescriptor = $convert.base64Decode( + 'ChBNdXRlVHJhY2tSZXF1ZXN0EhAKA3NpZBgBIAEoCVIDc2lkEhQKBW11dGVkGAIgASgIUgVtdXRlZA=='); @$core.Deprecated('Use setSimulcastLayersDescriptor instead') const SetSimulcastLayers$json = const { '1': 'SetSimulcastLayers', @@ -121,22 +281,45 @@ const SetSimulcastLayers$json = const { }; /// Descriptor for `SetSimulcastLayers`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List setSimulcastLayersDescriptor = $convert.base64Decode('ChJTZXRTaW11bGNhc3RMYXllcnMSGwoJdHJhY2tfc2lkGAEgASgJUgh0cmFja1NpZBItCgZsYXllcnMYAiADKA4yFS5saXZla2l0LlZpZGVvUXVhbGl0eVIGbGF5ZXJz'); +final $typed_data.Uint8List setSimulcastLayersDescriptor = $convert.base64Decode( + 'ChJTZXRTaW11bGNhc3RMYXllcnMSGwoJdHJhY2tfc2lkGAEgASgJUgh0cmFja1NpZBItCgZsYXllcnMYAiADKA4yFS5saXZla2l0LlZpZGVvUXVhbGl0eVIGbGF5ZXJz'); @$core.Deprecated('Use joinResponseDescriptor instead') const JoinResponse$json = const { '1': 'JoinResponse', '2': const [ const {'1': 'room', '3': 1, '4': 1, '5': 11, '6': '.livekit.Room', '10': 'room'}, - const {'1': 'participant', '3': 2, '4': 1, '5': 11, '6': '.livekit.ParticipantInfo', '10': 'participant'}, - const {'1': 'other_participants', '3': 3, '4': 3, '5': 11, '6': '.livekit.ParticipantInfo', '10': 'otherParticipants'}, + const { + '1': 'participant', + '3': 2, + '4': 1, + '5': 11, + '6': '.livekit.ParticipantInfo', + '10': 'participant' + }, + const { + '1': 'other_participants', + '3': 3, + '4': 3, + '5': 11, + '6': '.livekit.ParticipantInfo', + '10': 'otherParticipants' + }, const {'1': 'server_version', '3': 4, '4': 1, '5': 9, '10': 'serverVersion'}, - const {'1': 'ice_servers', '3': 5, '4': 3, '5': 11, '6': '.livekit.ICEServer', '10': 'iceServers'}, + const { + '1': 'ice_servers', + '3': 5, + '4': 3, + '5': 11, + '6': '.livekit.ICEServer', + '10': 'iceServers' + }, const {'1': 'subscriber_primary', '3': 6, '4': 1, '5': 8, '10': 'subscriberPrimary'}, ], }; /// Descriptor for `JoinResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List joinResponseDescriptor = $convert.base64Decode('CgxKb2luUmVzcG9uc2USIQoEcm9vbRgBIAEoCzINLmxpdmVraXQuUm9vbVIEcm9vbRI6CgtwYXJ0aWNpcGFudBgCIAEoCzIYLmxpdmVraXQuUGFydGljaXBhbnRJbmZvUgtwYXJ0aWNpcGFudBJHChJvdGhlcl9wYXJ0aWNpcGFudHMYAyADKAsyGC5saXZla2l0LlBhcnRpY2lwYW50SW5mb1IRb3RoZXJQYXJ0aWNpcGFudHMSJQoOc2VydmVyX3ZlcnNpb24YBCABKAlSDXNlcnZlclZlcnNpb24SMwoLaWNlX3NlcnZlcnMYBSADKAsyEi5saXZla2l0LklDRVNlcnZlclIKaWNlU2VydmVycxItChJzdWJzY3JpYmVyX3ByaW1hcnkYBiABKAhSEXN1YnNjcmliZXJQcmltYXJ5'); +final $typed_data.Uint8List joinResponseDescriptor = $convert.base64Decode( + 'CgxKb2luUmVzcG9uc2USIQoEcm9vbRgBIAEoCzINLmxpdmVraXQuUm9vbVIEcm9vbRI6CgtwYXJ0aWNpcGFudBgCIAEoCzIYLmxpdmVraXQuUGFydGljaXBhbnRJbmZvUgtwYXJ0aWNpcGFudBJHChJvdGhlcl9wYXJ0aWNpcGFudHMYAyADKAsyGC5saXZla2l0LlBhcnRpY2lwYW50SW5mb1IRb3RoZXJQYXJ0aWNpcGFudHMSJQoOc2VydmVyX3ZlcnNpb24YBCABKAlSDXNlcnZlclZlcnNpb24SMwoLaWNlX3NlcnZlcnMYBSADKAsyEi5saXZla2l0LklDRVNlcnZlclIKaWNlU2VydmVycxItChJzdWJzY3JpYmVyX3ByaW1hcnkYBiABKAhSEXN1YnNjcmliZXJQcmltYXJ5'); @$core.Deprecated('Use trackPublishedResponseDescriptor instead') const TrackPublishedResponse$json = const { '1': 'TrackPublishedResponse', @@ -147,7 +330,8 @@ const TrackPublishedResponse$json = const { }; /// Descriptor for `TrackPublishedResponse`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List trackPublishedResponseDescriptor = $convert.base64Decode('ChZUcmFja1B1Ymxpc2hlZFJlc3BvbnNlEhAKA2NpZBgBIAEoCVIDY2lkEigKBXRyYWNrGAIgASgLMhIubGl2ZWtpdC5UcmFja0luZm9SBXRyYWNr'); +final $typed_data.Uint8List trackPublishedResponseDescriptor = $convert.base64Decode( + 'ChZUcmFja1B1Ymxpc2hlZFJlc3BvbnNlEhAKA2NpZBgBIAEoCVIDY2lkEigKBXRyYWNrGAIgASgLMhIubGl2ZWtpdC5UcmFja0luZm9SBXRyYWNr'); @$core.Deprecated('Use sessionDescriptionDescriptor instead') const SessionDescription$json = const { '1': 'SessionDescription', @@ -158,17 +342,26 @@ const SessionDescription$json = const { }; /// Descriptor for `SessionDescription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List sessionDescriptionDescriptor = $convert.base64Decode('ChJTZXNzaW9uRGVzY3JpcHRpb24SEgoEdHlwZRgBIAEoCVIEdHlwZRIQCgNzZHAYAiABKAlSA3NkcA=='); +final $typed_data.Uint8List sessionDescriptionDescriptor = $convert.base64Decode( + 'ChJTZXNzaW9uRGVzY3JpcHRpb24SEgoEdHlwZRgBIAEoCVIEdHlwZRIQCgNzZHAYAiABKAlSA3NkcA=='); @$core.Deprecated('Use participantUpdateDescriptor instead') const ParticipantUpdate$json = const { '1': 'ParticipantUpdate', '2': const [ - const {'1': 'participants', '3': 1, '4': 3, '5': 11, '6': '.livekit.ParticipantInfo', '10': 'participants'}, + const { + '1': 'participants', + '3': 1, + '4': 3, + '5': 11, + '6': '.livekit.ParticipantInfo', + '10': 'participants' + }, ], }; /// Descriptor for `ParticipantUpdate`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List participantUpdateDescriptor = $convert.base64Decode('ChFQYXJ0aWNpcGFudFVwZGF0ZRI8CgxwYXJ0aWNpcGFudHMYASADKAsyGC5saXZla2l0LlBhcnRpY2lwYW50SW5mb1IMcGFydGljaXBhbnRz'); +final $typed_data.Uint8List participantUpdateDescriptor = $convert.base64Decode( + 'ChFQYXJ0aWNpcGFudFVwZGF0ZRI8CgxwYXJ0aWNpcGFudHMYASADKAsyGC5saXZla2l0LlBhcnRpY2lwYW50SW5mb1IMcGFydGljaXBhbnRz'); @$core.Deprecated('Use updateSubscriptionDescriptor instead') const UpdateSubscription$json = const { '1': 'UpdateSubscription', @@ -179,7 +372,8 @@ const UpdateSubscription$json = const { }; /// Descriptor for `UpdateSubscription`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List updateSubscriptionDescriptor = $convert.base64Decode('ChJVcGRhdGVTdWJzY3JpcHRpb24SHQoKdHJhY2tfc2lkcxgBIAMoCVIJdHJhY2tTaWRzEhwKCXN1YnNjcmliZRgCIAEoCFIJc3Vic2NyaWJl'); +final $typed_data.Uint8List updateSubscriptionDescriptor = $convert.base64Decode( + 'ChJVcGRhdGVTdWJzY3JpcHRpb24SHQoKdHJhY2tfc2lkcxgBIAMoCVIJdHJhY2tTaWRzEhwKCXN1YnNjcmliZRgCIAEoCFIJc3Vic2NyaWJl'); @$core.Deprecated('Use updateTrackSettingsDescriptor instead') const UpdateTrackSettings$json = const { '1': 'UpdateTrackSettings', @@ -191,7 +385,8 @@ const UpdateTrackSettings$json = const { }; /// Descriptor for `UpdateTrackSettings`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List updateTrackSettingsDescriptor = $convert.base64Decode('ChNVcGRhdGVUcmFja1NldHRpbmdzEh0KCnRyYWNrX3NpZHMYASADKAlSCXRyYWNrU2lkcxIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSLwoHcXVhbGl0eRgEIAEoDjIVLmxpdmVraXQuVmlkZW9RdWFsaXR5UgdxdWFsaXR5'); +final $typed_data.Uint8List updateTrackSettingsDescriptor = $convert.base64Decode( + 'ChNVcGRhdGVUcmFja1NldHRpbmdzEh0KCnRyYWNrX3NpZHMYASADKAlSCXRyYWNrU2lkcxIaCghkaXNhYmxlZBgDIAEoCFIIZGlzYWJsZWQSLwoHcXVhbGl0eRgEIAEoDjIVLmxpdmVraXQuVmlkZW9RdWFsaXR5UgdxdWFsaXR5'); @$core.Deprecated('Use leaveRequestDescriptor instead') const LeaveRequest$json = const { '1': 'LeaveRequest', @@ -201,7 +396,8 @@ const LeaveRequest$json = const { }; /// Descriptor for `LeaveRequest`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List leaveRequestDescriptor = $convert.base64Decode('CgxMZWF2ZVJlcXVlc3QSIwoNY2FuX3JlY29ubmVjdBgBIAEoCFIMY2FuUmVjb25uZWN0'); +final $typed_data.Uint8List leaveRequestDescriptor = + $convert.base64Decode('CgxMZWF2ZVJlcXVlc3QSIwoNY2FuX3JlY29ubmVjdBgBIAEoCFIMY2FuUmVjb25uZWN0'); @$core.Deprecated('Use iCEServerDescriptor instead') const ICEServer$json = const { '1': 'ICEServer', @@ -213,7 +409,8 @@ const ICEServer$json = const { }; /// Descriptor for `ICEServer`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List iCEServerDescriptor = $convert.base64Decode('CglJQ0VTZXJ2ZXISEgoEdXJscxgBIAMoCVIEdXJscxIaCgh1c2VybmFtZRgCIAEoCVIIdXNlcm5hbWUSHgoKY3JlZGVudGlhbBgDIAEoCVIKY3JlZGVudGlhbA=='); +final $typed_data.Uint8List iCEServerDescriptor = $convert.base64Decode( + 'CglJQ0VTZXJ2ZXISEgoEdXJscxgBIAMoCVIEdXJscxIaCgh1c2VybmFtZRgCIAEoCVIIdXNlcm5hbWUSHgoKY3JlZGVudGlhbBgDIAEoCVIKY3JlZGVudGlhbA=='); @$core.Deprecated('Use speakersChangedDescriptor instead') const SpeakersChanged$json = const { '1': 'SpeakersChanged', @@ -223,7 +420,8 @@ const SpeakersChanged$json = const { }; /// Descriptor for `SpeakersChanged`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List speakersChangedDescriptor = $convert.base64Decode('Cg9TcGVha2Vyc0NoYW5nZWQSMAoIc3BlYWtlcnMYASADKAsyFC5saXZla2l0LlNwZWFrZXJJbmZvUghzcGVha2Vycw=='); +final $typed_data.Uint8List speakersChangedDescriptor = $convert.base64Decode( + 'Cg9TcGVha2Vyc0NoYW5nZWQSMAoIc3BlYWtlcnMYASADKAsyFC5saXZla2l0LlNwZWFrZXJJbmZvUghzcGVha2Vycw=='); @$core.Deprecated('Use roomUpdateDescriptor instead') const RoomUpdate$json = const { '1': 'RoomUpdate', @@ -233,4 +431,5 @@ const RoomUpdate$json = const { }; /// Descriptor for `RoomUpdate`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List roomUpdateDescriptor = $convert.base64Decode('CgpSb29tVXBkYXRlEiEKBHJvb20YASABKAsyDS5saXZla2l0LlJvb21SBHJvb20='); +final $typed_data.Uint8List roomUpdateDescriptor = + $convert.base64Decode('CgpSb29tVXBkYXRlEiEKBHJvb20YASABKAsyDS5saXZla2l0LlJvb21SBHJvb20='); diff --git a/lib/src/proto/livekit_rtc.pbserver.dart b/lib/src/proto/livekit_rtc.pbserver.dart index 67167beb7..904b71cfd 100644 --- a/lib/src/proto/livekit_rtc.pbserver.dart +++ b/lib/src/proto/livekit_rtc.pbserver.dart @@ -6,4 +6,3 @@ // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_this,unused_import,unused_shown_name export 'livekit_rtc.pb.dart'; - From 65a05a5bd248bd3b4f9c6490f5e0e5af22292b1f Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 1 Oct 2021 00:03:15 +0900 Subject: [PATCH 42/50] fix unpublishTrack --- lib/src/participant/local_participant.dart | 4 +--- lib/src/participant/remote_participant.dart | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index 90ac3125e..67ae64895 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -153,11 +153,9 @@ class LocalParticipant extends Participant { @override Future unpublishTrack(String trackSid, {bool notify = false}) async { logger.finer('Unpublish track sid: $trackSid, notify: $notify'); - final pub = trackPublications[trackSid]; + final pub = trackPublications.remove(trackSid); if (pub is! LocalTrackPublication) return; - trackPublications.remove(pub); - // final existing = tracks.values.where((element) => element.track == track); // if (existing.isEmpty) return; // final pub = existing.first; diff --git a/lib/src/participant/remote_participant.dart b/lib/src/participant/remote_participant.dart index 93b7782f2..177a7eb7f 100644 --- a/lib/src/participant/remote_participant.dart +++ b/lib/src/participant/remote_participant.dart @@ -154,11 +154,9 @@ class RemoteParticipant extends Participant { @override Future unpublishTrack(String trackSid, {bool notify = false}) async { logger.finer('Unpublish track sid: $trackSid, notify: $notify'); - final pub = trackPublications[trackSid]; + final pub = trackPublications.remove(trackSid); if (pub is! RemoteTrackPublication) return; - trackPublications.remove(pub); - final track = pub.track; // if has track if (track != null) { From 3561e3350bb7aa113eef8f51f6d77ab5a574020e Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 1 Oct 2021 00:19:07 +0900 Subject: [PATCH 43/50] `createListener` into a mixin --- lib/src/managers/event.dart | 22 ++++----------- lib/src/participant/participant.dart | 6 ++-- lib/src/room.dart | 10 ++----- lib/src/rtc_engine.dart | 41 +++------------------------- lib/src/signal_client.dart | 7 +---- lib/src/support/disposable.dart | 12 +++----- 6 files changed, 19 insertions(+), 79 deletions(-) diff --git a/lib/src/managers/event.dart b/lib/src/managers/event.dart index f075a32ef..d43da8e5e 100644 --- a/lib/src/managers/event.dart +++ b/lib/src/managers/event.dart @@ -9,16 +9,15 @@ import '../extensions.dart'; import '../logger.dart'; import '../types.dart'; -mixin EventCreatable on Disposable { +mixin EventsEmittable on Disposable { final events = EventsEmitter(); EventsListener createListener({bool synchronized = false}) => EventsListener(events, synchronized: synchronized); @override Future dispose() async { - final didDispose = await super.dispose(); - if (didDispose) await events.dispose(); - return didDispose; + if (!isDisposed) await events.dispose(); + return await super.dispose(); } } // Type-safe, multi-listenable, dispose safe event handling @@ -30,7 +29,9 @@ class EventsEmitter extends EventsListenable { EventsEmitter({ bool listenSynchronized = false, - }) : super(synchronized: listenSynchronized); + }) : super(synchronized: listenSynchronized) { + onDispose(() async => await streamCtrl.close()); + } @override EventsEmitter get emitter => this; @@ -41,17 +42,6 @@ class EventsEmitter extends EventsListenable { // emit the event streamCtrl.add(event); } - - @override - @mustCallSuper - Future dispose() async { - // mark as disposed - final didDispose = await super.dispose(); - if (didDispose) { - await streamCtrl.close(); - } - return didDispose; - } } // for listening only diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index 22ff568a8..cbc2f6d6b 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -22,9 +22,9 @@ import 'remote_participant.dart'; /// Base for [RemoteParticipant] and [LocalParticipant], /// can not be instantiated directly. -abstract class Participant extends ChangeNotifier with Disposable, DisposeGuardChangeNotifier { +abstract class Participant extends ChangeNotifier + with Disposable, DisposeGuardChangeNotifier, EventsEmittable { /// map of track sid => published track - // @Deprecated('This should be a SET') final trackPublications = {}; /// audio level between 0-1, 1 being the loudest @@ -46,7 +46,6 @@ abstract class Participant extends ChangeNotifier with Disposable, DisposeGuardC bool _isSpeaking = false; // suppport for multiple event listeners - final events = EventsEmitter(); final EventsEmitter roomEvents; /// when the participant joined the room @@ -90,7 +89,6 @@ abstract class Participant extends ChangeNotifier with Disposable, DisposeGuardC onDispose(() async { await unpublishAllTracks(); - await events.dispose(); }); } diff --git a/lib/src/room.dart b/lib/src/room.dart index 35a16b803..255bc497b 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -30,7 +30,8 @@ import 'types.dart'; /// * participant membership changes /// * active speakers are different /// {@category Room} -class Room extends ChangeNotifier with Disposable, DisposeGuardChangeNotifier { +class Room extends ChangeNotifier + with Disposable, DisposeGuardChangeNotifier, EventsEmittable { // Room is only instantiated if connected, so defaults to connected. ConnectionState _connectionState = ConnectionState.connected; @@ -61,7 +62,6 @@ class Room extends ChangeNotifier with Disposable, DisposeGuardChangeNotifier { final RTCEngine engine; // suppport for multiple event listeners - final events = EventsEmitter(); late final _engineListener = engine.createListener(); /// internal use @@ -95,8 +95,6 @@ class Room extends ChangeNotifier with Disposable, DisposeGuardChangeNotifier { onDispose(() async { // dispose local participant await localParticipant.dispose(); - // dispose Room's events emitter - await events.dispose(); // dispose all listeners for RTCEngine await _engineListener.dispose(); // dispose the engine @@ -389,8 +387,4 @@ class Room extends ChangeNotifier with Disposable, DisposeGuardChangeNotifier { events.emit(ParticipantDisconnectedEvent(participant: participant)); } - - /// convenience method to create [EventsListener] - EventsListener createListener({bool synchronized = false}) => - EventsListener(events, synchronized: synchronized); } diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 4f14eea4d..5e5366879 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -20,7 +20,7 @@ import 'support/disposable.dart'; import 'transport.dart'; import 'types.dart'; -class RTCEngine with Disposable { +class RTCEngine with Disposable, EventsEmittable { static const _lossyDCLabel = '_lossy'; static const _reliableDCLabel = '_reliable'; static const _maxReconnectAttempts = 5; @@ -38,9 +38,6 @@ class RTCEngine with Disposable { @internal PCTransport? get primary => _subscriberPrimary ? subscriber : publisher; - // used for ice state notifications - // CancelListenFunc? _primaryIceStateListener; - // data channels for packets rtc.RTCDataChannel? _reliableDC; rtc.RTCDataChannel? _lossyDC; @@ -66,14 +63,10 @@ class RTCEngine with Disposable { // internal int _reconnectAttempts = 0; - final events = EventsEmitter(); late final _signalListener = signalClient.createListener(synchronized: true); final delays = CancelableDelayManager(); - // late final Timer _statsTimer; - // bool get isClosed => - RTCEngine( this.rtcConfig, { SignalClient? signalClient, @@ -84,35 +77,13 @@ class RTCEngine with Disposable { } _setUpListeners(); - // _statsTimer = Timer.periodic(const Duration(seconds: 1), _onStatTimer); + onDispose(() async { await close(); - await events.dispose(); await _signalListener.dispose(); }); } - // @override - // Future dispose() async { - // final didDispose = await super.dispose(); - // if (didDispose) { - // await close(); - // await events.dispose(); - // await _signalListener.dispose(); - // } - // return didDispose; - // } - - // void _onStatTimer(Timer _) async { - // // - // final stats = await publisher?.pc.getStats(); - // if (stats == null || stats.isEmpty) return; - - // for (final s in stats) { - // logger.fine('STATS ${s.values}'); - // } - // } - Future join( String url, String token, { @@ -372,7 +343,7 @@ class RTCEngine with Disposable { ..ordered = true ..maxRetransmits = 0; _lossyDC = await publisher?.pc.createDataChannel(_lossyDCLabel, lossyInit); - _lossyDC!.onMessage = _onDCMessage; + _lossyDC?.onMessage = _onDCMessage; } catch (_) { logger.severe('[$objectId] createDataChannel() did throw $_'); } @@ -382,7 +353,7 @@ class RTCEngine with Disposable { ..binaryType = 'binary' ..ordered = true; _reliableDC = await publisher?.pc.createDataChannel(_reliableDCLabel, reliableInit); - _reliableDC!.onMessage = _onDCMessage; + _reliableDC?.onMessage = _onDCMessage; } catch (_) { logger.severe('[$objectId] createDataChannel() did throw $_'); } @@ -531,8 +502,4 @@ class RTCEngine with Disposable { sid: event.sid, muted: event.muted, ))); - - /// convenience method to create [EventsListener] - EventsListener createListener({bool synchronized = false}) => - EventsListener(events, synchronized: synchronized); } diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index cdf929f3a..120e03f10 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -16,7 +16,7 @@ import 'support/websocket.dart'; import 'types.dart'; import 'utils.dart'; -class SignalClient with Disposable, EventCreatable { +class SignalClient with Disposable, EventsEmittable { // final ProtocolVersion protocol; @@ -31,7 +31,6 @@ class SignalClient with Disposable, EventCreatable { }); onDispose(() async { - await events.dispose(); await close(); }); } @@ -261,8 +260,4 @@ class SignalClient with Disposable, EventCreatable { _connected = false; events.emit(const SignalCloseEvent()); } - - // /// convenience method to create [EventsListener] - // EventsListener createListener({bool synchronized = false}) => - // EventsListener(events, synchronized: synchronized); } diff --git a/lib/src/support/disposable.dart b/lib/src/support/disposable.dart index 4fb55beb8..5b366665c 100644 --- a/lib/src/support/disposable.dart +++ b/lib/src/support/disposable.dart @@ -3,13 +3,6 @@ import 'package:meta/meta.dart'; import '../extensions.dart'; import '../logger.dart'; -// abstract class DisposeAware { -// // Should be true when is disposing or already disposed -// bool get isDisposed; -// @mustCallSuper -// void dispose(); -// } - typedef OnDisposeFunc = Future Function(); mixin Disposable { // @@ -17,6 +10,7 @@ mixin Disposable { bool _isDisposed = false; bool get isDisposed => _isDisposed; + // last added func will be called first when disposing void onDispose(OnDisposeFunc func) => _disposeFuncs.add(func); @mustCallSuper @@ -34,7 +28,9 @@ mixin Disposable { logger.fine('[$objectId] dispose complete.'); } return true; + } else { + logger.warning('[$objectId] unnecessary dispose() called.'); + return false; } - return false; } } From 95c35fe98b770e2176485999e606f15d164711c6 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 1 Oct 2021 01:31:55 +0900 Subject: [PATCH 44/50] simplify --- lib/src/managers/delay.dart | 2 +- lib/src/managers/event.dart | 14 ++----- lib/src/participant/participant.dart | 13 +----- lib/src/room.dart | 6 +-- lib/src/rtc_engine.dart | 4 +- lib/src/signal_client.dart | 3 +- lib/src/support/change_notifier.dart | 43 -------------------- lib/src/support/disposable.dart | 60 ++++++++++++++++++++++++++-- lib/src/track/track.dart | 3 +- lib/src/track/track_publication.dart | 2 +- lib/src/transport.dart | 2 +- 11 files changed, 75 insertions(+), 77 deletions(-) delete mode 100644 lib/src/support/change_notifier.dart diff --git a/lib/src/managers/delay.dart b/lib/src/managers/delay.dart index 55b048d6c..f5026d860 100644 --- a/lib/src/managers/delay.dart +++ b/lib/src/managers/delay.dart @@ -2,7 +2,7 @@ import 'package:async/async.dart'; import '../support/disposable.dart'; -class CancelableDelayManager with Disposable { +class CancelableDelayManager extends Disposable { // final _delays = >[]; diff --git a/lib/src/managers/event.dart b/lib/src/managers/event.dart index d43da8e5e..7bc0c7eb5 100644 --- a/lib/src/managers/event.dart +++ b/lib/src/managers/event.dart @@ -1,25 +1,19 @@ import 'dart:async'; -import 'package:flutter/material.dart'; import 'package:synchronized/synchronized.dart' as sync; -import '../support/disposable.dart'; import '../exceptions.dart'; import '../extensions.dart'; import '../logger.dart'; +import '../support/disposable.dart'; import '../types.dart'; -mixin EventsEmittable on Disposable { +mixin EventsEmittable { final events = EventsEmitter(); EventsListener createListener({bool synchronized = false}) => EventsListener(events, synchronized: synchronized); - - @override - Future dispose() async { - if (!isDisposed) await events.dispose(); - return await super.dispose(); - } } + // Type-safe, multi-listenable, dispose safe event handling // TODO: Move to a separate package @@ -58,7 +52,7 @@ class EventsListener extends EventsListenable { } // ensures all listeners will close on dispose -abstract class EventsListenable with Disposable { +abstract class EventsListenable extends Disposable { // the emitter to listen to EventsEmitter get emitter; diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index cbc2f6d6b..dcde3035d 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -1,5 +1,4 @@ import 'package:collection/collection.dart'; -import 'package:flutter/foundation.dart'; import 'package:meta/meta.dart'; import '../events.dart'; @@ -7,7 +6,6 @@ import '../extensions.dart'; import '../logger.dart'; import '../managers/event.dart'; import '../proto/livekit_models.pb.dart' as lk_models; -import '../support/change_notifier.dart'; import '../support/disposable.dart'; import '../track/track_publication.dart'; import 'remote_participant.dart'; @@ -22,8 +20,7 @@ import 'remote_participant.dart'; /// Base for [RemoteParticipant] and [LocalParticipant], /// can not be instantiated directly. -abstract class Participant extends ChangeNotifier - with Disposable, DisposeGuardChangeNotifier, EventsEmittable { +abstract class Participant extends DisposableChangeNotifier with EventsEmittable { /// map of track sid => published track final trackPublications = {}; @@ -88,17 +85,11 @@ abstract class Participant extends ChangeNotifier }); onDispose(() async { + await events.dispose(); await unpublishAllTracks(); }); } - // @override - // @mustCallSuper - // Future dispose() async { - // // This will mark object as disposed - // super.dispose(); - // } - /// for internal use /// {@nodoc} set isSpeaking(bool speaking) { diff --git a/lib/src/room.dart b/lib/src/room.dart index 255bc497b..5672b3fcb 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -16,7 +16,6 @@ import 'participant/remote_participant.dart'; import 'proto/livekit_models.pb.dart' as lk_models; import 'proto/livekit_rtc.pb.dart' as lk_rtc; import 'rtc_engine.dart'; -import 'support/change_notifier.dart'; import 'support/disposable.dart'; import 'track/track.dart'; import 'types.dart'; @@ -30,8 +29,7 @@ import 'types.dart'; /// * participant membership changes /// * active speakers are different /// {@category Room} -class Room extends ChangeNotifier - with Disposable, DisposeGuardChangeNotifier, EventsEmittable { +class Room extends DisposableChangeNotifier with EventsEmittable { // Room is only instantiated if connected, so defaults to connected. ConnectionState _connectionState = ConnectionState.connected; @@ -93,6 +91,8 @@ class Room extends ChangeNotifier }); onDispose(() async { + // dispose events + await events.dispose(); // dispose local participant await localParticipant.dispose(); // dispose all listeners for RTCEngine diff --git a/lib/src/rtc_engine.dart b/lib/src/rtc_engine.dart index 5e5366879..882935ca9 100644 --- a/lib/src/rtc_engine.dart +++ b/lib/src/rtc_engine.dart @@ -20,7 +20,7 @@ import 'support/disposable.dart'; import 'transport.dart'; import 'types.dart'; -class RTCEngine with Disposable, EventsEmittable { +class RTCEngine extends Disposable with EventsEmittable { static const _lossyDCLabel = '_lossy'; static const _reliableDCLabel = '_reliable'; static const _maxReconnectAttempts = 5; @@ -79,6 +79,8 @@ class RTCEngine with Disposable, EventsEmittable { _setUpListeners(); onDispose(() async { + await events.dispose(); + await delays.dispose(); await close(); await _signalListener.dispose(); }); diff --git a/lib/src/signal_client.dart b/lib/src/signal_client.dart index 120e03f10..d7e6fc2c5 100644 --- a/lib/src/signal_client.dart +++ b/lib/src/signal_client.dart @@ -16,7 +16,7 @@ import 'support/websocket.dart'; import 'types.dart'; import 'utils.dart'; -class SignalClient with Disposable, EventsEmittable { +class SignalClient extends Disposable with EventsEmittable { // final ProtocolVersion protocol; @@ -31,6 +31,7 @@ class SignalClient with Disposable, EventsEmittable { }); onDispose(() async { + await events.dispose(); await close(); }); } diff --git a/lib/src/support/change_notifier.dart b/lib/src/support/change_notifier.dart deleted file mode 100644 index edc1c1e2c..000000000 --- a/lib/src/support/change_notifier.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/foundation.dart'; - -import '../logger.dart'; -import 'disposable.dart'; - -// A layer to prevent calling ChangeNotifier methods if already disposed -mixin DisposeGuardChangeNotifier on Disposable, ChangeNotifier { - @override - bool get hasListeners { - if (isDisposed) { - logger.warning('called hasListeners on a disposed ChangeNotifier'); - return false; - } - return super.hasListeners; - } - - @override - void addListener(VoidCallback listener) { - if (isDisposed) { - logger.warning('called addListener() on a disposed ChangeNotifier'); - return; - } - super.addListener(listener); - } - - @override - void removeListener(VoidCallback listener) { - if (isDisposed) { - logger.warning('called removeListener() on a disposed ChangeNotifier'); - return; - } - super.removeListener(listener); - } - - @override - void notifyListeners() { - if (isDisposed) { - logger.warning('called notifyListeners() on a disposed ChangeNotifier'); - return; - } - super.notifyListeners(); - } -} diff --git a/lib/src/support/disposable.dart b/lib/src/support/disposable.dart index 5b366665c..2795e3ec5 100644 --- a/lib/src/support/disposable.dart +++ b/lib/src/support/disposable.dart @@ -1,10 +1,14 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; import 'package:meta/meta.dart'; import '../extensions.dart'; import '../logger.dart'; typedef OnDisposeFunc = Future Function(); -mixin Disposable { + +mixin _Disposer { // final _disposeFuncs = []; bool _isDisposed = false; @@ -13,8 +17,7 @@ mixin Disposable { // last added func will be called first when disposing void onDispose(OnDisposeFunc func) => _disposeFuncs.add(func); - @mustCallSuper - Future dispose() async { + Future _dispose() async { if (!_isDisposed) { logger.fine('[${objectId}] dispose()'); _isDisposed = true; @@ -34,3 +37,54 @@ mixin Disposable { } } } + +abstract class Disposable with _Disposer { + @mustCallSuper + Future dispose() async { + return await _dispose(); + } +} + +abstract class DisposableChangeNotifier extends ChangeNotifier with _Disposer { + @override + Future dispose() async { + if (!isDisposed) super.dispose(); + return await super._dispose(); + } + + @override + bool get hasListeners { + if (isDisposed) { + logger.warning('called hasListeners on a disposed ChangeNotifier'); + return false; + } + return super.hasListeners; + } + + @override + void addListener(VoidCallback listener) { + if (isDisposed) { + logger.warning('called addListener() on a disposed ChangeNotifier'); + return; + } + super.addListener(listener); + } + + @override + void notifyListeners() { + if (isDisposed) { + logger.warning('called notifyListeners() on a disposed ChangeNotifier'); + return; + } + super.notifyListeners(); + } + + @override + void removeListener(VoidCallback listener) { + if (isDisposed) { + logger.warning('called removeListener() on a disposed ChangeNotifier'); + return; + } + super.removeListener(listener); + } +} diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index a9bf10a15..ceddb3ece 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -6,13 +6,12 @@ import 'package:uuid/uuid.dart'; import '../extensions.dart'; import '../logger.dart'; import '../proto/livekit_models.pb.dart' as lk_models; -import '../support/change_notifier.dart'; import '../support/disposable.dart'; /// Wrapper around a MediaStreamTrack with additional metadata. /// Base for [AudioTrack] and [VideoTrack], /// can not be instantiated directly. -abstract class Track extends ChangeNotifier with Disposable, DisposeGuardChangeNotifier { +abstract class Track extends DisposableChangeNotifier { static const cameraName = 'camera'; static const screenShareName = 'screen'; diff --git a/lib/src/track/track_publication.dart b/lib/src/track/track_publication.dart index d47080d6c..a476aad31 100644 --- a/lib/src/track/track_publication.dart +++ b/lib/src/track/track_publication.dart @@ -9,7 +9,7 @@ import 'track.dart'; /// Base for [RemoteTrackPublication] and [LocalTrackPublication], /// can not be instantiated directly. -abstract class TrackPublication with Disposable { +abstract class TrackPublication extends Disposable { final String sid; final String name; final lk_models.TrackType kind; diff --git a/lib/src/transport.dart b/lib/src/transport.dart index d00279289..f21cad475 100644 --- a/lib/src/transport.dart +++ b/lib/src/transport.dart @@ -12,7 +12,7 @@ import 'utils.dart'; typedef PCTransportOnOffer = void Function(rtc.RTCSessionDescription offer); /// a wrapper around PeerConnection -class PCTransport with Disposable { +class PCTransport extends Disposable { final rtc.RTCPeerConnection pc; final List _pendingCandidates = []; bool restartingIce = false; From cb4d5544ae13a7c2aa368b56f02083b759791f4f Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 1 Oct 2021 01:48:40 +0900 Subject: [PATCH 45/50] use flutter_webrtc master --- example/ios/Podfile.lock | 2 +- example/pubspec.lock | 8 ++++---- lib/src/participant/participant.dart | 3 --- pubspec.lock | 8 ++++---- pubspec.yaml | 4 ++-- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 14d0b26ec..04b3dde0c 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -22,7 +22,7 @@ DEPENDENCIES: - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) SPEC REPOS: - https://github.com/CocoaPods/Specs.git: + trunk: - Libyuv - WebRTC-SDK diff --git a/example/pubspec.lock b/example/pubspec.lock index c2b15f59e..c04b21609 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -111,11 +111,11 @@ packages: dependency: transitive description: path: "." - ref: use-custom-webrtc-build - resolved-ref: a514bcc74d323d34f42ec89dc3efd1cd59e1bcc7 - url: "https://github.com/livekit/flutter-webrtc" + ref: master + resolved-ref: "32d83d85fa2faebcd37a19534f8a84273b12cbce" + url: "https://github.com/flutter-webrtc/flutter-webrtc" source: git - version: "0.6.7" + version: "0.6.8" google_fonts: dependency: "direct main" description: diff --git a/lib/src/participant/participant.dart b/lib/src/participant/participant.dart index dcde3035d..1ede18c01 100644 --- a/lib/src/participant/participant.dart +++ b/lib/src/participant/participant.dart @@ -147,9 +147,6 @@ abstract class Participant extends DisposableChangeNotifier with EventsEmittable } } - /// convenience method to create [EventsListener] - EventsListener createListener({bool synchronized = false}) => - EventsListener(events, synchronized: synchronized); // // Equality operators // Object is considered equal when sid is equal diff --git a/pubspec.lock b/pubspec.lock index a1ba085bd..d1a0e23b6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -99,11 +99,11 @@ packages: dependency: "direct main" description: path: "." - ref: use-custom-webrtc-build - resolved-ref: a514bcc74d323d34f42ec89dc3efd1cd59e1bcc7 - url: "https://github.com/livekit/flutter-webrtc" + ref: master + resolved-ref: "32d83d85fa2faebcd37a19534f8a84273b12cbce" + url: "https://github.com/flutter-webrtc/flutter-webrtc" source: git - version: "0.6.7" + version: "0.6.8" http: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 898da3cc5..0ace21913 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,8 +21,8 @@ dependencies: # This will use custom webrtc build from # https://github.com/webrtc-sdk/Specs/releases git: - url: https://github.com/livekit/flutter-webrtc - ref: use-custom-webrtc-build + url: https://github.com/flutter-webrtc/flutter-webrtc + ref: master dev_dependencies: flutter_test: From fe61cbd527fef550b15556e8a52152b5cc6cd33b Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 1 Oct 2021 02:03:59 +0900 Subject: [PATCH 46/50] unpublish for example --- example/lib/exts.dart | 18 ++++++++++++++++++ example/lib/widgets/controls.dart | 7 ++++++- lib/src/participant/local_participant.dart | 4 ---- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/example/lib/exts.dart b/example/lib/exts.dart index 45a362f74..5068044d4 100644 --- a/example/lib/exts.dart +++ b/example/lib/exts.dart @@ -20,6 +20,24 @@ extension LKExampleExt on BuildContext { ), ); + Future showUnPublishDialog() => showDialog( + context: this, + builder: (ctx) => AlertDialog( + title: const Text('UnPublish'), + content: const Text('Would you like to un-publish your Camera & Mic ?'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(ctx, false), + child: const Text('NO'), + ), + TextButton( + onPressed: () => Navigator.pop(ctx, true), + child: const Text('YES'), + ), + ], + ), + ); + Future showErrorDialog(dynamic exception) => showDialog( context: this, builder: (ctx) => AlertDialog( diff --git a/example/lib/widgets/controls.dart b/example/lib/widgets/controls.dart index 2d3db2524..3be30cab8 100644 --- a/example/lib/widgets/controls.dart +++ b/example/lib/widgets/controls.dart @@ -46,7 +46,12 @@ class _ControlsWidgetState extends State { } void _unpublishAll() async { - await participant.unpublishAllTracks(); + final result = await context.showUnPublishDialog(); + if (result == true) { + await participant.unpublishAllTracks(); + // Force to update UI for now + participant.notifyListeners(); + } } void _muteAudio() { diff --git a/lib/src/participant/local_participant.dart b/lib/src/participant/local_participant.dart index 67ae64895..0d096ba51 100644 --- a/lib/src/participant/local_participant.dart +++ b/lib/src/participant/local_participant.dart @@ -177,10 +177,6 @@ class LocalParticipant extends Participant { await engine.negotiate(); } } - - // if (track is AudioTrack) { - // await AudioManager().decrementPublishCounter(); - // } } } From 98f6cf164378283c5258c122f451b7ece2a7ce19 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 1 Oct 2021 02:23:56 +0900 Subject: [PATCH 47/50] update ios icon --- example/ios/Runner.xcodeproj/project.pbxproj | 6 +- .../AppIcon-LiveKit.appiconset/Contents.json | 116 +++++++++++++++++ .../ios-marketing-1024@1x.png | Bin 0 -> 8044 bytes .../AppIcon-LiveKit.appiconset/ipad-20@1x.png | Bin 0 -> 539 bytes .../AppIcon-LiveKit.appiconset/ipad-20@2x.png | Bin 0 -> 577 bytes .../AppIcon-LiveKit.appiconset/ipad-29@1x.png | Bin 0 -> 568 bytes .../AppIcon-LiveKit.appiconset/ipad-29@2x.png | Bin 0 -> 575 bytes .../AppIcon-LiveKit.appiconset/ipad-40@1x.png | Bin 0 -> 577 bytes .../AppIcon-LiveKit.appiconset/ipad-40@2x.png | Bin 0 -> 668 bytes .../AppIcon-LiveKit.appiconset/ipad-76@1x.png | Bin 0 -> 619 bytes .../AppIcon-LiveKit.appiconset/ipad-76@2x.png | Bin 0 -> 881 bytes .../ipad-83.5@2x.png | Bin 0 -> 954 bytes .../iphone-20@2x.png | Bin 0 -> 577 bytes .../iphone-20@3x.png | Bin 0 -> 651 bytes .../iphone-29@2x.png | Bin 0 -> 575 bytes .../iphone-29@3x.png | Bin 0 -> 654 bytes .../iphone-40@2x.png | Bin 0 -> 668 bytes .../iphone-40@3x.png | Bin 0 -> 771 bytes .../iphone-60@2x.png | Bin 0 -> 771 bytes .../iphone-60@3x.png | Bin 0 -> 955 bytes .../AppIcon.appiconset/Contents.json | 122 ------------------ .../Icon-App-1024x1024@1x.png | Bin 10932 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../ios/Runner/Assets.xcassets/Contents.json | 6 + example/ios/Runner/Info.plist | 2 +- 38 files changed, 126 insertions(+), 126 deletions(-) create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/Contents.json create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ios-marketing-1024@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-20@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-20@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-29@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-29@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-40@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-40@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-76@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-76@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-83.5@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-20@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-20@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-29@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-29@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-40@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-40@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-60@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-60@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/Contents.json diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 4d10ddbd6..cf77f1ea6 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -353,7 +353,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-LiveKit"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -488,7 +488,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-LiveKit"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -514,7 +514,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-LiveKit"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/Contents.json new file mode 100644 index 000000000..9fb188320 --- /dev/null +++ b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images" : [ + { + "filename" : "iphone-20@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "iphone-20@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "iphone-29@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "iphone-29@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "iphone-40@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "iphone-40@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "iphone-60@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "iphone-60@3x.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "ipad-20@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "ipad-20@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "ipad-29@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "ipad-29@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "ipad-40@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "ipad-40@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "ipad-76@1x.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "ipad-76@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "ipad-83.5@2x.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "ios-marketing-1024@1x.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ios-marketing-1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ios-marketing-1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..47c2fb7ed9af02fc637cdc3eb5b210aa08b8d36e GIT binary patch literal 8044 zcmeAS@N?(olHy`uVBq!ia0y~yU;#2&7&w@K)Q9>#SAY~}fk$L90|U1(2s1Lwnj^u$ zATQ_X;uunK>+MZLzJm-R#~;R>aE)0gZV<^MWWK?osenOy_PV>O-;x4Dc@rma>~-7w ze*Sxb_tU2@xyjj~sUIJ2%)RsObIVF`2cJ%94wiO3`_^kurMevFfb;hF);`* zG%y$#Gcs@hWoFC-xk-WHj1N!|P$o?cs0b)yEDTh{fI~Zp%1N+|495^*I^zR2CW4+K z!W_&nAv*{O*+$(6gV`nkObDbzG)x~6>4Zixr$GJG3-J`w0ZA5G1u{{Yh=j0(W?@>z zTmf4n&a6(lE0GEsk_#4MZKF;xhHe`NL;3`AibHgBuoRCJ6t;LwXL7((NaN8*xQu6M zFdkZU2O}`hsaV4y1s*3ux&Up8c?W9O%Me#H9pD`;*}w%FLjm(>$p)&JIe-m6!kM0& zb|LOMX+brkLDc<*8Dht);zAu9X1iZDV-N_wG(Wy!#|Fwapx zrGX2^(UJ{5Ji>H9bx5_NNJ^L_rE4k-8DVu?1GKa!$uWdWfYHtid~|Q*y zsTEl4f`>;zDHdE%kR=38pwux6RKWn<0P3Jp;v%RqP~U-DUsQGM>#Rm$B+g`@{}k^{qzMoL}OfRZB`7z#KWQA8+?ZOE`0#l}FhEqGvr{9FqU zIz%*3sXTz2Ozj8(H4_o8go@c|Eb`jUFNkID(AfvSZJuyg`X&S6W`FXqWl-e>+t?-s*T1|aZs^>bP0 Hl+XkK>n7L@ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7433fbc428876e75917718c189b3d41430ce2eb0 GIT binary patch literal 539 zcmV+$0_6RPP)0eZK>j0 z{RUQ4h@$b02p-iWDwSwG+7?Ay@lu?bOg7scg9~f6vaY+G>B{Z~Jml)|gFXG9mthvX zJ|MRCL(;sTo%&fYP17(;>sa3noxazuMm03-0-kF)Lu~B_#QP=t`J9LE9}L~#?pYaw zhd*lYlZMA!z?-kc)^S9HYz z>Z!_|sOp*eH>usM>C(DR6E2{BfjSoHs~BzB7J~%#Lez`6AVO~;{9Y{bamE7pWso>*lC0DTWE^ zhqxbctV$0=$G1GJ8K&+68ds=em6r(YiUWTjTRSRn0|E-=;OX5{oohy9$EaLAB-c(B z0(*IXTJ-O5fgQ0mElzx+vCG2DMPb$jyy#XOJxWEFQZ*>oFGy^Dw*R9TZQ2xCGT6JH zbpw?l#nH#}Y=p)Y$rGoZrAKTRe@f^)A{~b%KxI&Ign0j#!?I^tvhL5q-j6RSu=nf! di1r;P)rZEw( z>Om4O9$02!8H8J6MyHoVaeA9=0UhdMe5 z-*)Qv9W*Hd)H02CqfD=@lXu3MX1whkW}Vty2i_3@y(>n%z7^x@3*+H8zWl>}ZrO`= zqy@`*_4DAf*W7ZO6%mk_jAdAc zW%#d!=eSTJ&xby+afY%GXHmFugoE$e^j`Y|;(Eb#5)UMwaiK(!4_DZPiFAr}7H)#! z5dsS~KfN#nGrsi17V4U^udf=JFHEa2tr{*}WrJJv!S>!)`%i`cu37@%yw(&tce8on z(LrL)Qf4eAAL;V6b!Ev+t)tW$PQ4ZYoudt*j!dI#YQJZJCyP8eA1OEuy)VtdO)^lT z17!iwInog7NH;D%-VZjrb=IN}e{g}OmQ8ho^uMLT9~&8#VHuX;e=mFtnct=_tDYHC P00000NkvXXu0mjf3w8d% literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-29@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..19f67df8e371365466782a8a26322f30039e5fdb GIT binary patch literal 568 zcmV-80>}M{P)PbXFR7l6|)J;zlK^VaC`8*<5;qHMJkU(nM5-Y}pQXp!Z)x-n} zegjN2QPCDt0tp_`wkF~WaBMVU)aV7eoo+WHPa8KGyG^#+U8apMEc;+I;kc9EX_NhD zvh&Q63vU#+i<`>u2EF~UYTI_pvTWyS+3hE5CP+pxX_RI##Or$9f9Z~F(1lL7X<4my z>yKuq`^1DBMseOKB{3wjrMQi4D5`w{Tt^TCdC% z;H%MiU)MkA4m-O3NpED0?-_G{)r1uc@u#YYbhYn(E%21Zl;U_%j>--(S&r=Oz57w` z>>XdEe+k?M9z)+EgtF|qO5-J(pbiqHld}A_-tIP?pZ>RFyS_yTW?4d|S4;F7br9+3 zukL^E*Xy28Hw}m-@I8RwGZwGVD{?!1n3xbTe1*=O8J4&>2r`fXx4~ubr6Ba2N#AH( zp^1uvRH3o5ywmvWetTy%L{d9*Q#-p*8-2loITp%0g!3$rWw#1&?@LYG^}85yI?53f z{M2PG(*5FsJOtmPqr|NlURTe*rh%7b6zQJgh-uyxp{f4Od5M1bIz zOV0kg?5i@5u64@%I%8&zkf)mTMoq4bH%rX+ez|aXkI1SM-1n3DSrqs}8gIUT{||DZk!!ZF~Cn zH#fNB@7_IqY})M`c?`Eo?v~%z&stbNMPpLb(+Agn95#RVz`gj+60TIP$+>ejD*8qj z$`~deaR2#O@ud>`_H)6k|NdM!6`9lZa+O}R-}U1fx&?CbJ<}wjir#%#xHKxK>E+~I zIZktyn#dRb|6YRR;P(dQz0KO6Lgw+;Zwi_08&EsxPpsi);;pU*n> zXJ+xEIQfsSrED&(`@xwd{nc7*@4Hg<*at5|9Uh6;-r6>Q+ADv)NiMgJ|6$ph`nOMY zef8m=wNsu7ufF$KHhRs!nMITG+Gnqn;QW`*qW}$ANFaZo{hOO<1r;P)rZEw( z>Om4O9$02!8H8J6MyHoVaeA9=0UhdMe5 z-*)Qv9W*Hd)H02CqfD=@lXu3MX1whkW}Vty2i_3@y(>n%z7^x@3*+H8zWl>}ZrO`= zqy@`*_4DAf*W7ZO6%mk_jAdAc zW%#d!=eSTJ&xby+afY%GXHmFugoE$e^j`Y|;(Eb#5)UMwaiK(!4_DZPiFAr}7H)#! z5dsS~KfN#nGrsi17V4U^udf=JFHEa2tr{*}WrJJv!S>!)`%i`cu37@%yw(&tce8on z(LrL)Qf4eAAL;V6b!Ev+t)tW$PQ4ZYoudt*j!dI#YQJZJCyP8eA1OEuy)VtdO)^lT z17!iwInog7NH;D%-VZjrb=IN}e{g}OmQ8ho^uMLT9~&8#VHuX;e=mFtnct=_tDYHC P00000NkvXXu0mjf3w8d% literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..56efb4fcc77cd73d2f6e27aae55fc3cdb0d771c2 GIT binary patch literal 668 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51SA=YQ-1*|&H|6fVg?3oVGw3ym^DX&fq}`- z)5S5Q;?~=nzS+WoBF8@dvd{qWzyw%wMO*2cD~ zyiY&6^X&BgD|y>*zbn}_&3|`x-IJ{g-Dd5~=(bhzVvZ+Q0`e+cY$2On+5!8l_G4O z$)1kEUN`1S6{@3q)l|LX1g z`JR*7-e;Mxo>A=AxuPDX-E7{opk>Ax5!>qJ&$wn~6!K&77sRh0TATheHC8RC+j%nm R4KTSec)I$ztaD0e0sto4EKmRd literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..52545ede34c9362870a7893038395c6c067dc368 GIT binary patch literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^J|N7&1SCDa9;*RToCO|{#S9GG!XV7ZFl&wk0|S$+ zr;B4q#jUqD&t?ldN*w?Avwlr|%c2{(2ew}eHs{ElWzs%FNbunF)m&8@#ItYBiaL0! z$+lvOl(22b(M5tf5&S35?byA^dbX~K;;CyXcU><0K3A;q)VyZq=emkCJ?or3Nvo!> znU!vSBzw1P+r#&9D>m(Fu3dh6r;x;T=DJ=bHkAnuOq`g6oY|9|yn%8G&2j&olegPD z)V(cR$9C*&!~F#vs`qESiml1+o96nI{ie$PuU0!3)LCYTXe2E@FZ=b_wYis9pL?5| zUwb}2^Vj*BrSr`GidXNBzI%;*(TxvHDj9+EW_|urer?K457VA0g8R25zWDlU&109( zA=bkG#ib)BvDo&lh|9XHcf;oV(VmWY#}1w6{IT2XKRGXb{a4>CXcCLAXYRe(cebSG z%zON3Qb+ugGX-|$4wrm|JQNyP(1=eHl;u5}yn?i=gx|m2bF{dvW6s9Y#S_hbFfZ@F z^Zx7qN2`ttou0HnUGS=RZY1mVjyV@?lEXJtUds}hy=1aY<$d*xYxaft;q@<5_RpB< zAGS#=Q zYFA-vtGh}Xx20xf$?t!yKJD)Q@DSD9zpF literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-76@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc2562981f0d6a5805a46a7715f38cd3ebc80c5 GIT binary patch literal 881 zcmeAS@N?(olHy`uVBq!ia0vp^GeDSw2}n*~u)PdOaTa()7Bet#3xhBt!>lL5m*z4pZD99tw5@2^-EJ1iU7;$` z-0QJ5;(u#}!9^Bj!)0?{=IlN#a>D3f>g}bkb81=H`1T)ue)2o3&%E=0=FPn9V^pEd zfAvH8&x844`v10FeEoIX_UgiGm*f6ttt)*$|CNq^{<8P%+Kik+DjpLQ9Gh5Zz<9FR zS?}3GseM!BVk1q&{AMZnE|NE&nszU;6E?-TpUa-{%e6 zuI|}W`aWpGr0dzPYwUEtofXNC&-Z!q@`jhyG`CC}-}{kqKR4?9zAX7_&5cOUt%VzB zX@5H_#vE_9{MF5rS-xq3Rx?vYpPyIwum9v^RhiORzm&jLI{l5b2n=vA+tr_#a6emi z$GtgcHb2(B`O(DdYOLw5N&mjA;J>+6Wqb8PuX{UUj=b`kU;M)DbBXcnRq4UmfmU0m z`ChqvyT4p*lX$*T{ND|ttNWv>&uzW;=gGr~M~|I2d+dbM0=9fJyMLvN%f25xGoL@L zdFq~uEj?E=ejeKW^mKak`m0@gjgQ{D>2X%1eP4w2huo?J#qO|8)q8rby8OJ9@zcw6 z%6!q^&%6FkS27LfslRIR$+@m#rQF(->k*QxKmLn(H#0Bv{OSMqYMDZ{*`8fzpB}dO l@7HBqv`aZalh5DTukz2;#d=FvB`^;$c)I$ztaD0e0ss+=ZgT(t literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-83.5@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/ipad-83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..25f241d9d83e46c197df82f47973031f8f90c1ce GIT binary patch literal 954 zcmeAS@N?(olHy`uVBq!ia0vp^%R!if2}u4fxxE`maTa()7Bet#3xhBt!>l!J`-6@{iGNWR8vsY-;!-h8H zcCl0YA8k~M3-E87D<8bOH0(s$E|=>|UvKNxZ#Z)J@{`Y}zq9&$nwkD==ig1Y<|-BS zE`9W%x8&Wy`OOC(+&rf6=4Ra%?Z4kb-ajnS|F2LcS^DbA%HZXGbFJvbsQ3GN+x3Z5 zc~^7y%gef7>&@8CvpK&0zx-d_`-kp(Yplv5|KI;{# zgimC2Mz8qUjcIn%*xyFX+kZDlZ~c1yZFWBn`ftl$$8*>G>51^v$G2`>@tSqwathb2 zl~ay=uGx9}?j3u!!tecWH$60H&08n)bJLpm=-Dxz>Yq!DSaX$@F0TA{c-k+&8T1M- zNZkCN|I2U3+vWQ+@HAH)oUHc=}tsj&phD<$oU@-Fg`| zOXt$csSAA9E_v))_x>f{%&+0+N}S5KeZExk{Hy-FJ(a7k?zoqwb8Kzh-mfSBemk?i z-~RX0kIy%rj;mSDb$8;c*6pjN+rQcKtF-$4&u{l;?&zJ9FTd;8@5b3b8>KZXZob>7 zRdRe)?EA3lb7gV6L;B85TU=at+ur()ec0=A`K!~r9;EK>4_hd`x=eQEw>d9){(roE zI`)Q}{*5}maF75ze|`U95yjo6%mOvQ%*f#B>gTe~DWM4f>(B%< literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-20@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e35c1fcc4c2e26d8ccb1bf4d561a6b97f070386e GIT binary patch literal 577 zcmV-H0>1r;P)rZEw( z>Om4O9$02!8H8J6MyHoVaeA9=0UhdMe5 z-*)Qv9W*Hd)H02CqfD=@lXu3MX1whkW}Vty2i_3@y(>n%z7^x@3*+H8zWl>}ZrO`= zqy@`*_4DAf*W7ZO6%mk_jAdAc zW%#d!=eSTJ&xby+afY%GXHmFugoE$e^j`Y|;(Eb#5)UMwaiK(!4_DZPiFAr}7H)#! z5dsS~KfN#nGrsi17V4U^udf=JFHEa2tr{*}WrJJv!S>!)`%i`cu37@%yw(&tce8on z(LrL)Qf4eAAL;V6b!Ev+t)tW$PQ4ZYoudt*j!dI#YQJZJCyP8eA1OEuy)VtdO)^lT z17!iwInog7NH;D%-VZjrb=IN}e{g}OmQ8ho^uMLT9~&8#VHuX;e=mFtnct=_tDYHC P00000NkvXXu0mjf3w8d% literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9d06245833acf42314e360d86d6b704620972f71 GIT binary patch literal 651 zcmV;60(AX}P)7nm-eD^>;ExE)MN-XkJolkDzA~uUADx$dQ2o+58E+M}??|iq&E^Ta?D-^oZ zZ+U5(OcOkX@Dz^QG{z-_W+^?0&?1odh|e1et#6Yu!3M$xj$0YyaM;y<=n+gB(0~Rs zpaBhNKm+>!KreBHl8ZcD=lT{25r!GL<5fmjH&K<)j_ZYF&mSByWz)u1xI)Qgo_@#m zpQKEq5t6utZ$`)H9-~7Y0+I`Dg%YpZsW-PAXTEm-bbO4p|cI9aJh9BpaBhN lKm!`kfCe<60S#z%^j|L{yIe#W=>Y%$002ovPDHLkV1kiDDy;wj literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6b421635fad35f2412dadae9feca80f2b8b091e0 GIT binary patch literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^Rv^s51SIor-mM2xoCO|{#S9GG!XV7ZFl&wk0|Vnn zPZ!6KjC*fyocF%tAada2&*m@v7vgrUPUybWv`%bI-j@Y!OT$*gxw>p{f4Od5M1bIz zOV0kg?5i@5u64@%I%8&zkf)mTMoq4bH%rX+ez|aXkI1SM-1n3DSrqs}8gIUT{||DZk!!ZF~Cn zH#fNB@7_IqY})M`c?`Eo?v~%z&stbNMPpLb(+Agn95#RVz`gj+60TIP$+>ejD*8qj z$`~deaR2#O@ud>`_H)6k|NdM!6`9lZa+O}R-}U1fx&?CbJ<}wjir#%#xHKxK>E+~I zIZktyn#dRb|6YRR;P(dQz0KO6Lgw+;Zwi_08&EsxPpsi);;pU*n> zXJ+xEIQfsSrED&(`@xwd{nc7*@4Hg<*at5|9Uh6;-r6>Q+ADv)NiMgJ|6$ph`nOMY zef8m=wNsu7ufF$KHhRs!nMITG+Gnqn;QW`*qW}$ANFaZo{hOO< zO0Im(y?(!cvWlUaVx)V&q}sF0H+rsr5}(*8^g1$f1vD^;EMQ>OaKOp@(S9iD$mQDm z>b+B~x;A9XmTp~}R}%ZZJVnS@X66Y26B9MFXVWEZyZ3xiFj3m*Bena-vE^?MW$)kc z(*D+4+jo_`*Rv~3bgS=8j_W_(TqpG30+dO8Pn-$n2_ZkJ7; z_j#6pm7SEyBG2EuBkFuFPjm8F|GHH+a;o1|!BEG5U;ntBbUa_mYxVF+a#)MC&MeJ+ zf1;~It8WEIQxHdVhpVRlrAYkVdDx~01^_#h=+Ks8AegRXx zXP@4+_>Nr0a_kGo`{g6HX`>Xix?`jqM zQuA83%-tn9Z`+}j&mFg|+^m0cR+MD_?Wg@&>y)40Iddx>r^pZZ&a?LtqYt^Rkd zxpV8sF3qiXFKyE*?MxPaI$_(H8jDKxGkZCX?OwjOBzo76le%T1Z~vQT5)m!(T=fj4 Y9~UMj&0Tc}n7|l3UHx3vIVCg!0AMo|ZvX%Q literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..56efb4fcc77cd73d2f6e27aae55fc3cdb0d771c2 GIT binary patch literal 668 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51SA=YQ-1*|&H|6fVg?3oVGw3ym^DX&fq}`- z)5S5Q;?~=nzS+WoBF8@dvd{qWzyw%wMO*2cD~ zyiY&6^X&BgD|y>*zbn}_&3|`x-IJ{g-Dd5~=(bhzVvZ+Q0`e+cY$2On+5!8l_G4O z$)1kEUN`1S6{@3q)l|LX1g z`JR*7-e;Mxo>A=AxuPDX-E7{opk>Ax5!>qJ&$wn~6!K&77sRh0TATheHC8RC+j%nm R4KTSec)I$ztaD0e0sto4EKmRd literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..23f58754a1d4c9d5742a0d62f1ada9a1f72da21c GIT binary patch literal 771 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1SGeyEo=o+oCO|{#S9GG!XV7ZFl&wk0|V1m zPZ!6Kid%2*`1%VwN*wt3*Y1$xo*%qR99BpymN+=OiLuPGW7_oQPL)?DH#@a5xb?_8 zav#h1!{?R|pLTmmut`Z}@r|2N-jB>bWKQ}2q<;RB>FUPCH%s&Kv`)5}U47tY@@eIs z>N#doy*k+^)?BXTGyZ*K#qVSDO%L|u@Lh0V<~1Rk_`m+bF4nneytgN4ewv*1DT%Ymq*YvMfOKl%de}3v?jL!9*pwCmiYCe5d@czDOi{9+X+F1{G ziI@D(Dt!}eBK9lUQQ>lhK+ms#AtHZ0F59bjJ}Ih-%X(PUZM8q_>oz5QuDt;(P8!VN zXv$o=Z~KDW(@~qYIqr_0DBYT;5psE#6clY^gPuo(kbJ4l|t9IR< zxcbojYf6=Y7IJK@J8FgR?v4;%_uN%?|DwC=PkmO-cVBUGZbp)|4ohK83SaM9>Decq z#mrd4ef{ZGeZRM{k(ZhCS24dXimi*?`)%8+x^)%twO$@5st}Q7m3yvxW;-YT>UOh75Ba_9mKU1{ zu1i*VS@e1@_ttr;H?R8zeqaA$VUW(B`Hhzw*rYNRG?GjF%Ky&2#^Zap?OXmyz*NoP M>FVdQ&MBb@0LmFvg#Z8m literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..23f58754a1d4c9d5742a0d62f1ada9a1f72da21c GIT binary patch literal 771 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1SGeyEo=o+oCO|{#S9GG!XV7ZFl&wk0|V1m zPZ!6Kid%2*`1%VwN*wt3*Y1$xo*%qR99BpymN+=OiLuPGW7_oQPL)?DH#@a5xb?_8 zav#h1!{?R|pLTmmut`Z}@r|2N-jB>bWKQ}2q<;RB>FUPCH%s&Kv`)5}U47tY@@eIs z>N#doy*k+^)?BXTGyZ*K#qVSDO%L|u@Lh0V<~1Rk_`m+bF4nneytgN4ewv*1DT%Ymq*YvMfOKl%de}3v?jL!9*pwCmiYCe5d@czDOi{9+X+F1{G ziI@D(Dt!}eBK9lUQQ>lhK+ms#AtHZ0F59bjJ}Ih-%X(PUZM8q_>oz5QuDt;(P8!VN zXv$o=Z~KDW(@~qYIqr_0DBYT;5psE#6clY^gPuo(kbJ4l|t9IR< zxcbojYf6=Y7IJK@J8FgR?v4;%_uN%?|DwC=PkmO-cVBUGZbp)|4ohK83SaM9>Decq z#mrd4ef{ZGeZRM{k(ZhCS24dXimi*?`)%8+x^)%twO$@5st}Q7m3yvxW;-YT>UOh75Ba_9mKU1{ zu1i*VS@e1@_ttr;H?R8zeqaA$VUW(B`Hhzw*rYNRG?GjF%Ky&2#^Zap?OXmyz*NoP M>FVdQ&MBb@0LmFvg#Z8m literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon-LiveKit.appiconset/iphone-60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..51bb77d2b7b961bb6c1c4c8bcac5d9160e69cc4f GIT binary patch literal 955 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD2}o{QKQR?ZaTa()7Bet#3xhBt!>lsy%6Y}? zVyf4C%WW&?{qlP=OZ@U=IObe2KWo?g<-q$7|5@7Q&li_14_Yg}QEHudy7o+ay4A*Q`sY2FMT0G{{ujv1_HKMN-&cM9vRm7e z7XAEgf8VWVoyn(Tx6Jy!o-I=Ln|k>Re|J*U}Zk=xLp4?Dz osjF3j8Ws;4nE3`3QMTQl(RKZERoR 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 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8CFBundleInfoDictionaryVersion 6.0 CFBundleName - livekit_example + LiveKit CFBundlePackageType APPL CFBundleShortVersionString From 12912f9da3e7741a0853636716dca4e0d74e9ccd Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 1 Oct 2021 02:31:33 +0900 Subject: [PATCH 48/50] android icon --- example/android/app/src/main/AndroidManifest.xml | 2 +- .../app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../main/res/mipmap-hdpi/livekit_ic_launcher.png | Bin 0 -> 1104 bytes .../mipmap-hdpi/livekit_ic_launcher_round.png | Bin 0 -> 1643 bytes .../app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../main/res/mipmap-mdpi/livekit_ic_launcher.png | Bin 0 -> 867 bytes .../mipmap-mdpi/livekit_ic_launcher_round.png | Bin 0 -> 1217 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../res/mipmap-xhdpi/livekit_ic_launcher.png | Bin 0 -> 1242 bytes .../mipmap-xhdpi/livekit_ic_launcher_round.png | Bin 0 -> 2039 bytes .../src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../res/mipmap-xxhdpi/livekit_ic_launcher.png | Bin 0 -> 1717 bytes .../mipmap-xxhdpi/livekit_ic_launcher_round.png | Bin 0 -> 2884 bytes .../src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../res/mipmap-xxxhdpi/livekit_ic_launcher.png | Bin 0 -> 2184 bytes .../mipmap-xxxhdpi/livekit_ic_launcher_round.png | Bin 0 -> 3826 bytes 16 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-hdpi/livekit_ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-hdpi/livekit_ic_launcher_round.png delete mode 100644 example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-mdpi/livekit_ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-mdpi/livekit_ic_launcher_round.png delete mode 100644 example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xhdpi/livekit_ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xhdpi/livekit_ic_launcher_round.png delete mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/livekit_ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/livekit_ic_launcher_round.png delete mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/livekit_ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/livekit_ic_launcher_round.png diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index e439f3fbf..d69062758 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ + android:icon="@mipmap/livekit_ic_launcher"> P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/example/android/app/src/main/res/mipmap-hdpi/livekit_ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/livekit_ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..062038ba7c14ce3e5853304b744da73907c5946d GIT binary patch literal 1104 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!oCO|{#S9GG!XV7ZFl&wk0|N__ zr;B4q#jUq@&gWlFlQ~{^|Jpq^cZa|1)4U!Z+P^_8Oe?oNjI*gMqqu&_)23@CqV1l} zGUcv4^12&*W!QE*3v=FR487g=)+JK-Hs`G7D_8uZMIJxd{Qk2^FPCpX;C%O}8`mG{ z79YIy`PJj&$JXUU>TYwnWBd; zwWWP?9mGo>ZLtp6d*$5ft5VFSkvpDV)t&e8+^b`i{tXV{TNPK=%|GmL_WGjTpG2xp zIp{`Da%gIdQqvK(crPd*(b0&EW-(v<|7_uIwhN1u!d^RsN`?3ae~MUO-^lby!)v90af14OnR(S4gveEm5OBXL&dMTZp8PfM9o~6vqLG{IXcYemXDhocQ zN{KM~X0Xg!!@RVd;pLv*iexrJ0cM;ifceCc&l#Oxq$X@;U84Q-N7)*_Ex%6vP!4B4 zza;+$%hSdG+2v2Bn<(h7pYX)z(!`o$y74S0wyQ3ZI`|~*Yuv*5yBe$X_B-6q;Y{w< zn^bT8>S1ls&5M_g7>h67;=fkpL0+4{)Kyi@(Pk4$ON<&i?flp*%IbJ)i&ek;-(fnt zM9u&H`S(90YJbQ)-Y?dhTKi>c!@H!S|4Rcr=Evx*yzIMAee&x`+g?SUO}pHgW@w~wn@)c6QtkSZx2tDw`<_=~_+s}s|ddRplA{?J9%Y)J}8Xu&j4ig~)ubHRRz6_p>?Y}aUfXBcq0 zZriS0!!r)L*11RDJW$|Wb;e|3<1%iOBp@O=HlqdA2QY}QNOP0rc)Bd`3<|4IeLe5RN8?<|chURJm@YtvtDmOT}l U)-bzopr0H|06xBvhE literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-hdpi/livekit_ic_launcher_round.png b/example/android/app/src/main/res/mipmap-hdpi/livekit_ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..15a5dc4a0c7b40d6cbe47d58712b893b19fb3e07 GIT binary patch literal 1643 zcmV-x29)`UP)pEf$)G~Y$T}Bm=T;jXyV4&-rFwRyT5G)+~>{lr4GH|rs2VlFur6vT|9%9W;B zj{G`;znw^qMFlY$s#{gMs?{z89!^G%g#|HTJmKm@SF243T2EGv#RVCXz-Cc$N)hm# zdy$g?f}+(;bHALboF|iMkTXS3wbRN zM>}W%hy8vUf}}~(jp`N@M|j$j(uNLoA0UyGeWKFFFBRJJx0f2c9;$Z(j~E(&!|gUC zafyny+`?tY zPUL(vOPVIg8xMz^2?4B)Jmq zQ7mx;mLkaCb5PKAJ~^4xPFDoE21Ig55N~;2dry0%iyeXEIV9-VJ@2$fkol-?y;(1) zNB#}@ee*i60YOCwcsz>*jiKFnJf#yqkhHGE5xkv+f;7l^NywQo1YHUAEE2>gC*Kl! z>JUNKA^30>2;!5IJJWJ*6@hO`uDV%P5TBgfoR`joL1<~>hTD>Y#&F%b1vxtp36Db5 zFPS4q>IFr43z@i|WOgPa78b-ki*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uu~SB)4&r;!(=UoX)Avw zQ&xVDuA5V}-29Z4YgJBL6x3~k{VnM85;y^ywsL)^1@8n6{+tCk&XEK!8<9KTBm$fY zNwg?_%_D>Ypl4!^1hmg#72ppxuYWVd0!)z!zKH}72}A;sK-dLh84aSi0&AYYt}kFy zP)Q(s_4J_9Ob;2F3}0?ZeXSykA0Y^j*2?I2AOGAOY%x~qc3iGfuOgCBJK zsMcXQHV$kX)qwE5HR7jT$1_XEL#u#UNtEto1ESpE*VhJm-xx^m=$O$pOl!fJA=1Qr zv4~>5hJ7@^sGLj*l+KqW$k4G^LKlgQd@UeR$Rm*#V>p+?gsOry{1SBJ%22t!WIzTk z(Y<0|Y+J>+nnx;MK&lXoaUw|)JPW&xy6_=z91Xc1d^126bXz82yhaK&B7k60X3qFHrCVg2LMlE-+mCFXN`J=M&*Dqz!L>|>GW;p-=002ovPDHLkV1i&1cG3U< literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-mdpi/livekit_ic_launcher_round.png b/example/android/app/src/main/res/mipmap-mdpi/livekit_ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f7181253e456934dd120f2771bdd9a22b36d9a GIT binary patch literal 1217 zcmV;y1U~zTP)a^Q*4D6j{{%;^0*pBv9o~h`d;@ z@NZXN^(G2121a6Fuk-ylC~ptnBmu?((b~cWBcjvh z00h=|3*Q0(CJ%|1pA`P-?W;{22{1Py(XpFAN+f&>1!$tAe7IBiE>LKD0e32OKKelk;!J`RIJ>$^tK||E$sz;ODKE$GPWawS zdMB^}$e$R5Fyzh%o}EO3iQ;9nmL=qyn3vA~1>g@E6ukbc|mZ(@HhqrU$jLrHK< zwhm$mN8qw2kZ}b>;j)7T##EFNJB9A3F%3wR&`_RUiy72= z!3|Q=egccY;9Qp8b@ths44*%8DiMn2ySk(K0-z_eO~4BzwG5;GL2OGSbDDEVP(AGs zzyOcGo)o&9zkfM`2u{&A~|h#nNBY} zygD^jfL9y7DXQyTF(jTs_z`zB8YaLeY<8^0DOn4t?-_ f82$Iv<8S{5ZF6&&SfxL_00000NkvXXu0mjfp<^4h literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 09d4391482be68e9e4a07fab769b5de337d16eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy!iOI#yLg7ec#$`gxH85~pclTsBt za}(23gHjVyDhp4h+5i=O3-AeX1=1l$e`s#|#^}+&7(N@w0CIr{$Oe+Uk^K-ZP~83C zcc@hG6rikF&NPT(23>y!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/example/android/app/src/main/res/mipmap-xhdpi/livekit_ic_launcher.png b/example/android/app/src/main/res/mipmap-xhdpi/livekit_ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..58572cf7c4741f8190f4ff37df0b73c577e07f25 GIT binary patch literal 1242 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|QHs zr;B4q#jUq@-{%L1O0a*}{J(`Y{-xLrlYN2CA9{H-3eSSjsV^-QIi?b0o?XZYh@^wPlo zr~>o(=s$b+-1`5*_2F-xgw57@Mu#5gb?e`McIS2K$KSjQCY!ode2>)ruOP1eru5@) z5eL-=G8I`Lm8Th>Xe}%i+279?HFpBvr}Z|45585MXFt$qoS1q1pv=irkFC1zzh`*+ zq(5)}-5AD(JcjC>o4=nnFAiT!)}RnXjPvrSh?bVx+&OzxD~6|$_b&7yX-!^bAy<+-(;#c7`^tzKJfiF=*X z=xcm?fkn+tRbk2B>wJX6W4-PaWt`innJKOjd112UIUVICJGkYpWZlYV+Sbl^YKgry z<0PI57dRFO)$=$!&;5`riz_tnh*zv+P@Bgc%F!;7P$RtH0^0@AuM$g`ES`Jp%KvxK zh53A2-Fev!FD@PN=P8)Yxa6+W1+jM)UmXfoX{-z~|6b>`n_2JUsw;C2zxu^net%)lHJ?uHIlFVQ`blfPqm}!9?ooL@f5JaL=@8CWPg;K|yFIrtnmBQZd;YwY7oJ=- z@{KFb{FL7N@Tc8_*H`rQ&feSM-MLig`MQZ6*ZqE`D6OCOB{Tlc;*IOC|F9{De$Tz4 z*fIRxc5u zo)#>bXwcyQ>oCI|*59HBw%5p&a4q_37Qq-(sCkNE?R56dX>r$CaR*StKgJIX30wzO zYBY#4%wX(@D2ilEVNA&3KGm^sMmZzHF$TLpSpzPHWQN~I3eHGN%=%c&aG{Rj|IZiA z=VB&kGGy2{*xz9ah!yyp&*X6X)&JO9kLu&)PbCxi#gDT(oDcseC0@V2;?{#lG7nf7 zUPLmTvwrlSP5gzf-IVu?3)Hp$FSv2`!RLet+*?^1rtfzopr0PSEKdjJ3c literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xhdpi/livekit_ic_launcher_round.png b/example/android/app/src/main/res/mipmap-xhdpi/livekit_ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..706922f5f945722d46ceb98fe0702229c20670f7 GIT binary patch literal 2039 zcmV}C^p}VE+-sb1`>`p_W zwB2oY&&=$eNj@1;*iQI<_FU%7nR9G5lO9B52g|@FP1E+_+zS2#*FY!e10kJ0{b$$o zf77aeW|RIq>^5;sd?2vrz$&mGfn5YKO7GE$-+dV8^*ApOiQ}j|=bzs<9IZqsXAw%2 zI34=6&J1YLim$`+{G1Bi<&kE(JaSRlX{iMQh9F=h6yhi#eue;ofT5isZ%aeiS6CnN z&dm1Ui=7_n63zqx1Oa3M0R#aA0gM|BA>U?*n4L|*&qm-MgANw_2qqOU!tMI7uiWw? zoE~{8!v1S?@D>p;!WFQ>g5P@id8b=Ggmdg^;af-mLqlmeULW?pWRY*ZREmIm#|z$q z0!HY8gtexw>k1a zRKmBq0G(d&meJq*l?XGCYWP_q042dUfa++CQ9Ye?V0bFwXNv%x5JYU`8@^lGI8hff z#{@89Xcx+O)%ovC=bN9U0vO@?kZ*OS!(WE*g3}E@O9e0 zR?^-@Mfh`^Zn-U8;b*mg#C<}0T5r}6*uiv$pX~zT5<=c@(-r=E$qp|F0Z$I%c}u4| zzVl)-18YLSgaddBrz4;#6XEBO08~Z3qf_m2uE<2ylWPLlONC zy_VABO_y7)$Yl7rCm_z2WP3fcz%3yl?Q|qn3h?cBWjg#E6+n}YnxgKXfpD%10U6`w zgpkf&wMcs;U>5{@!bbqZG0~V$E1*n+l163jgn$Rb+@^$% zIR+_4Uxg*w5xPseAz>FEnx9_%oR;li5D*W_PRUeprknhOVH(zAG!Tu_KrF@wTx$^L zo@j&)hP!ERxQo7k2u=)vu@izzjw@Awcu{;zp>@p)HQe>no^F{wmHj~G!XCe$8gTxy zyPM=lhz2N153~sN^P_x>07s*G77#Di995|pBDQvPQB9YRw)*%{1FF4V+9^r&Afi`+ z8rRy-^H}(WO^O{v0rA4|qe>+w6sqlzXuIU2I$synb@5?4*aivpCyS~xFG}>Cg3V70bU`%FadX%fLyajcE``3+q6kwJ*-aHBRP1jN7jWi}%Yy*ld8VF5vezuIQxf!MNungo278lhoGmLr)3@n0*JhqivZu69^cDfMy7Au>BKk zxpY8)9RkWBz=J>{90f#hJr4wIfdIQr9PyV#o<%sTza<3CIM-Fa{_{u%b!CbfY5F0=kW{|C^5 VzvyNakuU%N002ovPDHLkV1n5crEmZM literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/livekit_ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/livekit_ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ab35d4dd9eeb4505db7763e00e8a34b411bd00 GIT binary patch literal 1717 zcmb_dX;ji#6o25Z*-E*PN~R?vYATtcCYcLDrnwwTTg-C76;~u+`e!wxB4%bP70R(u z3%4?toEjTX?ur>qHi%0{3sO|Ztr{C^=;M6t%!m7a@7(+QeYo$wdvA{aQEy#sLu~+n zt`ET@K#2w4OjBKX%Dko?D?y7wIFSl~&bDs`1Gnzz1E3!5<8de`b98=OkQ5ZG-?J#P z>Tq-KU>A4tkY540`X_DA+?Mbo4Dv26T#Hxdh3Y3&YdK!<@t;HDJ1kOzBFMR2dP~Z< zreM6f!BWf$oUTutWVCYxu_hGxsQS}vhpA(}Eu;P*XmxCEb=n&daJPbAV`rQcNgw=7 zs~-mUW}RxtoMcCwhiff+hbhf-5c$p+FtR+ z+J53>iz*)Q!`;Uz@-dkXfZc2C+*Cp@*N`sN;GlT5w|O5vEz&xKzx6q|06s_1WnPu0 zzX1=lRbr~qTr<_pkUK^;-2=z#!Blw#PA0$*rgSY3tKoPj0JAvX*zKj%ae*ctz&Arc z6$N15d9~QdD|N_D;K2P~RuC4G@L`ByWD7hNN$Kh?f|-+`&a#a$jSRJwdPQH=SVPBG z&VbzMbHvDdNqpGp;o6b1_m!f{cA3vZoIU$?XcvkONb(V84bLv_=zhzbzm#==R#RTk zipe8?F+;b!GY|+5`xb=-7*ZTeg<&ez+;8o5=gt+M95|5tdRZE zEX-e$>T9V+GZ|YO51#d_$c=dpDIBV$nqv#xA^{fJ<&HL0zORnyKy^dz@;v!iA@$7$A~+MJZvs((<|+q zCk8zdCwC336`EM~$F!pk^vtnn5$8hV2d9z3rMJaRO^jQG#dkw0-w}j-%vTq5-I+a+ z&#BM)x=rePyA|_!w3VBA$4f%&mwE>bXz{1K3_om?GYCI7t)pv%5B%r>+<`jWOkaPX z7I~gpxmv`uW#L2-=VqOSjgGg9tC-J)E6FJ-=}{tPv_RuVW7S3f(P!zA=@fSL)nj;r zhc+{dr(=>sLQPGMg4`8xv+fp`B+B$utQz8^>B)BXXv_cc!!f*_5J1?8!La5xLd}#P5O`*|TtVPk<_KADPwWe1z$ZgDVMe?3;tzH=JE=*85cp1%gYF zYh%kt{6|sVN}{&Rt(=oGvu{LG8PSaCGvj$0&EOJ>Oq2~vmgd3v_N~PZL>&lV1rycc zvHNKj&M*{M*CuTh>xG6ss ScC>O20Uyt!9`)|wS^ol+60?E; literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/livekit_ic_launcher_round.png b/example/android/app/src/main/res/mipmap-xxhdpi/livekit_ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..10daf80a0dfcd0b990c4e0e257f192d79e5aced2 GIT binary patch literal 2884 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 VI#l{=G>rhTm>F9V80TH@{~wndHQxXL literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/livekit_ic_launcher.png b/example/android/app/src/main/res/mipmap-xxxhdpi/livekit_ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..04dbc25edabf8145431850c3937338905a12ced2 GIT binary patch literal 2184 zcmd^<`9IrP7sqdsk`Te56|G6fI@(I?RF|p2lr%+&rz2>ej9L;+Z9#?5w6;-Qw3I%K zeXFeoQ4h7XwX{O4r5MbsArVDOrK+g;ntx(`nEQI2d(J)gob$`)yxvLY9PKc&`(*(D z7^1zc3*_5(4J8fTE`KnPkdq0rr!WCPEAJW%Wd4Q)0CkLL`=e{b#L^Tm(A5Xqy;28P zeVz**?JY>dUcjm<1z&31|D9FQT)`u85Iq?cFW=b_U+Ze2YfU%1o|n{=7Dr0lgYb_t z(|^P~R;udDX+Jw@Xyb>=&2X&o_mJgsnK|#Xwn8T6wA=bw1}FU%SjvXwUP+~<$>m

p!8mfV#Gwbx}ftk`MGK*H`>p$K=8*~!)N0aksfu1EOEH=oLIGwIr zSyy?{d&qUG<3Wrvk)xY2YgbH@CH|-0Cz?%vZL7Y-Ml_19DGYWdzPA8|z z+ibuT-2tJ&tfKqr)+8ycN&zr|r)=g0LA`KC`)ntYBLiaT?B3KIst1;*08D_bMOWC} zI$=Ko0G*s>O*hH!yc}bxpyQQuNX{WZ_@B|v;NrC9waY<=dZCOZAgC6Of9BSJql%wa z5$)O_BLVr~+LIDUUljez>1am5XU1JfYYl#lbIyX?`!WRp&Yf-J!o_FvM8x zuZ|qz`b5^)ELgWk#GNtqE#vU*GZ{A zZ&C?0ag}55q~jG;U@CHbAXckdwsk;_+Q0{$J2?S_X za?$bQ13rkVMpH|dFBxkvJ8SPCZ*EZ|u+~dh4al3Vt*3E*I#}_tTs>YTg9fTpB*)No|nFEGCZTE~c3IP53N{<6cFeHR&}ER~NX= zwOU%d)7x*+ z-uwnr5;d>dmq%a)3^=^rc5aX#9YS))ht+V(|7_P~FhtN1UnjSHtvH6aaAy z!Di{jQr0Ckbop>U-8lf7t3izHxcy$w*=Uc%PiiN+Uhiw1759LD!w0f2f_G^$m-(QT;QOQ`01Lb{dA zla^H_?m~yz0l34kEooEi4C3TCQH{mF^oq6wW(R2Z?mQ48LIFw!tWzhQ`}6~A6P7VK zV?NGg`bnET93|v{07uXHFvqvyqfAV*cooCnmwa7C0UcCccT3m&^z4@zo<8}C%DN2N zOcD^Tch@`Sb#C>(wge++Z*HYj3KN9on?r}MW>nvjk}OXi(DjervCtfhrEJJ+80~Hr N@h3;y$JW#ve*rk9`au8y literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/livekit_ic_launcher_round.png b/example/android/app/src/main/res/mipmap-xxxhdpi/livekit_ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b03110e1537289e015c98ae3f9b38e98346d02b4 GIT binary patch literal 3826 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 Bs1pDH literal 0 HcmV?d00001 From 21e3f34b6cf3915ef1ddfff5b2434ccab2de2cf8 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 1 Oct 2021 02:35:00 +0900 Subject: [PATCH 49/50] web icon --- example/web/icons/Icon-192.png | Bin 5292 -> 4716 bytes example/web/icons/Icon-512.png | Bin 8252 -> 9587 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/example/web/icons/Icon-192.png b/example/web/icons/Icon-192.png index b749bfef07473333cf1dd31e9eed89862a5d52aa..ba48301fe2125e7f8b898f1d9ef4295b9771619f 100644 GIT binary patch literal 4716 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 PXTGQVPPd#bA&LJ5(3|z_ literal 5292 zcmZ`-2T+sGz6~)*FVZ`aW+(v>MIm&M-g^@e2u-B-DoB?qO+b1Tq<5uCCv>ESfRum& zp%X;f!~1{tzL__3=gjVJ=j=J>+nMj%ncXj1Q(b|Ckbw{Y0FWpt%4y%$uD=Z*c-x~o zE;IoE;xa#7Ll5nj-e4CuXB&G*IM~D21rCP$*xLXAK8rIMCSHuSu%bL&S3)8YI~vyp@KBu9Ph7R_pvKQ@xv>NQ`dZp(u{Z8K3yOB zn7-AR+d2JkW)KiGx0hosml;+eCXp6+w%@STjFY*CJ?udJ64&{BCbuebcuH;}(($@@ znNlgBA@ZXB)mcl9nbX#F!f_5Z=W>0kh|UVWnf!At4V*LQP%*gPdCXd6P@J4Td;!Ur z<2ZLmwr(NG`u#gDEMP19UcSzRTL@HsK+PnIXbVBT@oHm53DZr?~V(0{rsalAfwgo zEh=GviaqkF;}F_5-yA!1u3!gxaR&Mj)hLuj5Q-N-@Lra{%<4ONja8pycD90&>yMB` zchhd>0CsH`^|&TstH-8+R`CfoWqmTTF_0?zDOY`E`b)cVi!$4xA@oO;SyOjJyP^_j zx^@Gdf+w|FW@DMdOi8=4+LJl$#@R&&=UM`)G!y%6ZzQLoSL%*KE8IO0~&5XYR9 z&N)?goEiWA(YoRfT{06&D6Yuu@Qt&XVbuW@COb;>SP9~aRc+z`m`80pB2o%`#{xD@ zI3RAlukL5L>px6b?QW1Ac_0>ew%NM!XB2(H+1Y3AJC?C?O`GGs`331Nd4ZvG~bMo{lh~GeL zSL|tT*fF-HXxXYtfu5z+T5Mx9OdP7J4g%@oeC2FaWO1D{=NvL|DNZ}GO?O3`+H*SI z=grGv=7dL{+oY0eJFGO!Qe(e2F?CHW(i!!XkGo2tUvsQ)I9ev`H&=;`N%Z{L zO?vV%rDv$y(@1Yj@xfr7Kzr<~0{^T8wM80xf7IGQF_S-2c0)0D6b0~yD7BsCy+(zL z#N~%&e4iAwi4F$&dI7x6cE|B{f@lY5epaDh=2-(4N05VO~A zQT3hanGy_&p+7Fb^I#ewGsjyCEUmSCaP6JDB*=_()FgQ(-pZ28-{qx~2foO4%pM9e z*_63RT8XjgiaWY|*xydf;8MKLd{HnfZ2kM%iq}fstImB-K6A79B~YoPVa@tYN@T_$ zea+9)<%?=Fl!kd(Y!G(-o}ko28hg2!MR-o5BEa_72uj7Mrc&{lRh3u2%Y=Xk9^-qa zBPWaD=2qcuJ&@Tf6ue&)4_V*45=zWk@Z}Q?f5)*z)-+E|-yC4fs5CE6L_PH3=zI8p z*Z3!it{1e5_^(sF*v=0{`U9C741&lub89gdhKp|Y8CeC{_{wYK-LSbp{h)b~9^j!s z7e?Y{Z3pZv0J)(VL=g>l;<}xk=T*O5YR|hg0eg4u98f2IrA-MY+StQIuK-(*J6TRR z|IM(%uI~?`wsfyO6Tgmsy1b3a)j6M&-jgUjVg+mP*oTKdHg?5E`!r`7AE_#?Fc)&a z08KCq>Gc=ne{PCbRvs6gVW|tKdcE1#7C4e`M|j$C5EYZ~Y=jUtc zj`+?p4ba3uy7><7wIokM79jPza``{Lx0)zGWg;FW1^NKY+GpEi=rHJ+fVRGfXO zPHV52k?jxei_!YYAw1HIz}y8ZMwdZqU%ESwMn7~t zdI5%B;U7RF=jzRz^NuY9nM)&<%M>x>0(e$GpU9th%rHiZsIT>_qp%V~ILlyt^V`=d z!1+DX@ah?RnB$X!0xpTA0}lN@9V-ePx>wQ?-xrJr^qDlw?#O(RsXeAvM%}rg0NT#t z!CsT;-vB=B87ShG`GwO;OEbeL;a}LIu=&@9cb~Rsx(ZPNQ!NT7H{@j0e(DiLea>QD zPmpe90gEKHEZ8oQ@6%E7k-Ptn#z)b9NbD@_GTxEhbS+}Bb74WUaRy{w;E|MgDAvHw zL)ycgM7mB?XVh^OzbC?LKFMotw3r@i&VdUV%^Efdib)3@soX%vWCbnOyt@Y4swW925@bt45y0HY3YI~BnnzZYrinFy;L?2D3BAL`UQ zEj))+f>H7~g8*VuWQ83EtGcx`hun$QvuurSMg3l4IP8Fe`#C|N6mbYJ=n;+}EQm;< z!!N=5j1aAr_uEnnzrEV%_E|JpTb#1p1*}5!Ce!R@d$EtMR~%9# zd;h8=QGT)KMW2IKu_fA_>p_und#-;Q)p%%l0XZOXQicfX8M~7?8}@U^ihu;mizj)t zgV7wk%n-UOb z#!P5q?Ex+*Kx@*p`o$q8FWL*E^$&1*!gpv?Za$YO~{BHeGY*5%4HXUKa_A~~^d z=E*gf6&+LFF^`j4$T~dR)%{I)T?>@Ma?D!gi9I^HqvjPc3-v~=qpX1Mne@*rzT&Xw zQ9DXsSV@PqpEJO-g4A&L{F&;K6W60D!_vs?Vx!?w27XbEuJJP&);)^+VF1nHqHBWu z^>kI$M9yfOY8~|hZ9WB!q-9u&mKhEcRjlf2nm_@s;0D#c|@ED7NZE% zzR;>P5B{o4fzlfsn3CkBK&`OSb-YNrqx@N#4CK!>bQ(V(D#9|l!e9(%sz~PYk@8zt zPN9oK78&-IL_F zhsk1$6p;GqFbtB^ZHHP+cjMvA0(LqlskbdYE_rda>gvQLTiqOQ1~*7lg%z*&p`Ry& zRcG^DbbPj_jOKHTr8uk^15Boj6>hA2S-QY(W-6!FIq8h$<>MI>PYYRenQDBamO#Fv zAH5&ImqKBDn0v5kb|8i0wFhUBJTpT!rB-`zK)^SNnRmLraZcPYK7b{I@+}wXVdW-{Ps17qdRA3JatEd?rPV z4@}(DAMf5EqXCr4-B+~H1P#;t@O}B)tIJ(W6$LrK&0plTmnPpb1TKn3?f?Kk``?D+ zQ!MFqOX7JbsXfQrz`-M@hq7xlfNz;_B{^wbpG8des56x(Q)H)5eLeDwCrVR}hzr~= zM{yXR6IM?kXxauLza#@#u?Y|o;904HCqF<8yT~~c-xyRc0-vxofnxG^(x%>bj5r}N zyFT+xnn-?B`ohA>{+ZZQem=*Xpqz{=j8i2TAC#x-m;;mo{{sLB_z(UoAqD=A#*juZ zCv=J~i*O8;F}A^Wf#+zx;~3B{57xtoxC&j^ie^?**T`WT2OPRtC`xj~+3Kprn=rVM zVJ|h5ux%S{dO}!mq93}P+h36mZ5aZg1-?vhL$ke1d52qIiXSE(llCr5i=QUS?LIjc zV$4q=-)aaR4wsrQv}^shL5u%6;`uiSEs<1nG^?$kl$^6DL z43CjY`M*p}ew}}3rXc7Xck@k41jx}c;NgEIhKZ*jsBRZUP-x2cm;F1<5$jefl|ppO zmZd%%?gMJ^g9=RZ^#8Mf5aWNVhjAS^|DQO+q$)oeob_&ZLFL(zur$)); zU19yRm)z<4&4-M}7!9+^Wl}Uk?`S$#V2%pQ*SIH5KI-mn%i;Z7-)m$mN9CnI$G7?# zo`zVrUwoSL&_dJ92YhX5TKqaRkfPgC4=Q&=K+;_aDs&OU0&{WFH}kKX6uNQC6%oUH z2DZa1s3%Vtk|bglbxep-w)PbFG!J17`<$g8lVhqD2w;Z0zGsh-r zxZ13G$G<48leNqR!DCVt9)@}(zMI5w6Wo=N zpP1*3DI;~h2WDWgcKn*f!+ORD)f$DZFwgKBafEZmeXQMAsq9sxP9A)7zOYnkHT9JU zRA`umgmP9d6=PHmFIgx=0$(sjb>+0CHG)K@cPG{IxaJ&Ueo8)0RWgV9+gO7+Bl1(F z7!BslJ2MP*PWJ;x)QXbR$6jEr5q3 z(3}F@YO_P1NyTdEXRLU6fp?9V2-S=E+YaeLL{Y)W%6`k7$(EW8EZSA*(+;e5@jgD^I zaJQ2|oCM1n!A&-8`;#RDcZyk*+RPkn_r8?Ak@agHiSp*qFNX)&i21HE?yuZ;-C<3C zwJGd1lx5UzViP7sZJ&|LqH*mryb}y|%AOw+v)yc`qM)03qyyrqhX?ub`Cjwx2PrR! z)_z>5*!*$x1=Qa-0uE7jy0z`>|Ni#X+uV|%_81F7)b+nf%iz=`fF4g5UfHS_?PHbr zB;0$bK@=di?f`dS(j{l3-tSCfp~zUuva+=EWxJcRfp(<$@vd(GigM&~vaYZ0c#BTs z3ijkxMl=vw5AS&DcXQ%eeKt!uKvh2l3W?&3=dBHU=Gz?O!40S&&~ei2vg**c$o;i89~6DVns zG>9a*`k5)NI9|?W!@9>rzJ;9EJ=YlJTx1r1BA?H`LWijk(rTax9(OAu;q4_wTj-yj z1%W4GW&K4T=uEGb+E!>W0SD_C0RR91 diff --git a/example/web/icons/Icon-512.png b/example/web/icons/Icon-512.png index 88cfd48dff1169879ba46840804b412fe02fefd6..60608776011c321c2a71521c52557addc3f17960 100644 GIT binary patch literal 9587 zcmeHNdsGu=7N5ifk=8{->jQ)sc3T!ClSCIJBmo4(C=o$spkw(C*e3 z;=9FFg3Ge3x{50*w7hb_ZrXzaKDLx9kBT)^77;PXD`aOvc*udC{iA>FndIcmmwWH; z-tYU}``vHOB!@ya2hO)zZUq3qeBK8CPyisJLn2^lfnMGy9}NKjAyw?>7sB)NqlCy| zp*S7_0Ou3w$N8@QTb627!nkLJ5!bI@FU$Tsd*yn5{OR0JZ#3ptNM1fk-nzPDpU$c| z+<9lfq3lw!Iy3u^H@0s)aqv8uZ<5 z>VcIK`JTu=_LhKUw6vQ)udn});l?*R4;KV*e}DIAU`>s#=G=(~F*VjT8BP$SDSY$if;QpF zwza3C=-jq~j8NN#%}059p8H9s8p_Hwe_BQfI!;T0=0Dh+`I}~e_Vf5ePc}^3srdHv zRs9j$1j*XH$iOWhk&p0nakark|NQMm-Qp*9g;9uI{dX6Cta`M!bxzOn^HJx%DqIpN zqstGi&DQUKC|bFyIr2R;8(%=-JRzSCxS(T8z=E(4n1hZ8=o=s`2gs%| z0Bk4NO^l-m&So1lsRX7ewTn%?Q%YnQ3ScW)=uiS70*X=+FIBLV9IDBJg^n>XNTrxeki8sgI6s8q2g@OfJB?1G zQ@K_Y3WY6?6|zG8*PG$!Hx4xpL1ZitOiD_kC9S5xauLYz^z;PjOpwWRLoM7C$x=k1 zbdxHa#+;1%@rM*KaJK>Z9nF%J5%otFC1nfhXV5Ve7q#`U?27#fF0#202Kmq$8 zDdIHK+|fz=vZI+mvN#xl6>;z^&AO_+x*d}VHiYD_i zW*s6{Lh<4LVhJQwpgH6+=*%@{)O6L1(1_WgQ&dx+SkhQLi9iJH5XT~M=77_s(*YRO z@rhWKZIg--E|U$K5YxodQKm3KkW@579J6>jBv>v+lPSO=Vf2}zOqETy51*U@*JFHI zQ-#w35i9`_ZY}$-6fm{J$rOKgVQL$Q` z*u4{*6T_HFo~3|=NRmJf`HD~qxV}Q6809*df^KoKND9d*44NlxH5;7CcyiJce$7q= zF(xi$ayT|I28tbro5i!^lHwpK7i+3+47wYg5jNgbUFn`II(^)Y$!fY2Hi&hic=5a3 zj7i_6j1A64F&kB|_;9RPnCve=pkJEFG|S1^jQK!2a;yLm{7+t{+D`E^vE^ClErt1x zf~yD(Tu0#r__;GY-QC@oG_+c0w42e7sY#&AgScoyCt;IfGir>qDNWwQ>6jEfLbz5a zgX6~$*D7{ZP$2-=b9nx~VM;>xUWfG4QS(XbZ zKAAw4oIuV$|2=_(ea%;A5*tBVTN_-1bAZswlS`vQ9$avY?``W!)`g#2=J zsJGyD?Xsg9{XFB2XnU<=o8kF@p-647RzvMB*VGodeBwJ&AS= zY|^M-`^&nn)XUiI*e>tFp}~^CH$N(k@pE9c<4F3Fd~tZ4Hf8kEqwc`~qpoLbPeYs9 zXs?kkZGv58I-^CSyWN2c#3s>j(_3RPc(qjxtJ@+ft8Tpr$S>4*fc&3$>4$3Vx=Cpx z@RCDWQH#sC>ciDhhE&+L)49D?r475gh`cEC?*e`%Kp>LNS~>%p_V42pvFcrbD{xBi zV!*cn-Wl+oh@S@krw3$Iv8J|*Q!ge}m1tTji{5w@3_4b<&*~ej$h+UgNH5E%Zq3Nn zdL7oNoMej8O--wZ9t=P15>$RU`mZBC!CB=!oR^+oT(aCnY-m++t2`aNQ`WYQ^hfBq z|1P=DZy%zo(mnOveKDim-F?veO;eAsYiV# zt5`ko*UQ1I50fL>S6$N0HMC_6ecfBGjph#T$!su2fAD%cm{smQ((Lqu>%xcrS&vJA zwEn>ac1G9pf#+%uZFN0UX2@NVwVBwIdcVlpL;KdT#a?Cn_Ebl~a~L0Bbq+z{Vex*RUIKsL<(&Rj9%^UD2IK3W?2j>D?eWQgvS-HLymHo9%~|N2Q{~j za?*X-{b9JRowv_*Mh|;*-kPFn>PI;r<#kFaxFqbn?aq|PduQg=2Q;~Qc}#z)_T%x9 zE|0!a70`58wjREmAH38H1)#gof)U3g9FZ^ zF7&-0^Hy{4XHWLoC*hOG(dg~2g6&?-wqcpf{ z&3=o8vw7lMi22jCG9RQbv8H}`+}9^zSk`nlR8?Z&G2dlDy$4#+WOlg;VHqzuE=fM@ z?OI6HEJH4&tA?FVG}9>jAnq_^tlw8NbjNhfqk2rQr?h(F&WiKy03Sn=-;ZJRh~JrD zbt)zLbnabttEZ>zUiu`N*u4sfQaLE8-WDn@tHp50uD(^r-}UsUUu)`!Rl1PozAc!a z?uj|2QDQ%oV-jxUJmJycySBINSKdX{kDYRS=+`HgR2GO19fg&lZKyBFbbXhQV~v~L za^U944F1_GtuFXtvDdDNDvp<`fqy);>Vw=ncy!NB85Tw{&sT5&Ox%-p%8fTS;OzlRBwErvO+ROe?{%q-Zge=%Up|D4L#>4K@Ke=x%?*^_^P*KD zgXueMiS63!sEw@fNLB-i^F|@Oib+S4bcy{eu&e}Xvb^(mA!=U=Xr3||IpV~3K zQWzEsUeX_qBe6fky#M zzOJm5b+l;~>=sdp%i}}0h zO?B?i*W;Ndn02Y0GUUPxERG`3Bjtj!NroLoYtyVdLtl?SE*CYpf4|_${ku2s`*_)k zN=a}V8_2R5QANlxsq!1BkT6$4>9=-Ix4As@FSS;1q^#TXPrBsw>hJ}$jZ{kUHoP+H zvoYiR39gX}2OHIBYCa~6ERRPJ#V}RIIZakUmuIoLF*{sO8rAUEB9|+A#C|@kw5>u0 zBd=F!4I)Be8ycH*)X1-VPiZ+Ts8_GB;YW&ZFFUo|Sw|x~ZajLsp+_3gv((Q#N>?Jz zFBf`~p_#^${zhPIIJY~yo!7$-xi2LK%3&RkFg}Ax)3+dFCjGgKv^1;lUzQlPo^E{K zmCnrwJ)NuSaJEmueEPO@(_6h3f5mFffhkU9r8A8(JC5eOkux{gPmx_$Uv&|hyj)gN zd>JP8l2U&81@1Hc>#*su2xd{)T`Yw< zN$dSLUN}dfx)Fu`NcY}TuZ)SdviT{JHaiYgP4~@`x{&h*Hd>c3K_To9BnQi@;tuoL z%PYQo&{|IsM)_>BrF1oB~+`2_uZQ48z9!)mtUR zdfKE+b*w8cPu;F6RYJiYyV;PRBbThqHBEu_(U{(gGtjM}Zi$pL8Whx}<JwE3RM0F8x7%!!s)UJVq|TVd#hf1zVLya$;mYp(^oZQ2>=ZXU1c$}f zm|7kfk>=4KoQoQ!2&SOW5|JP1)%#55C$M(u4%SP~tHa&M+=;YsW=v(Old9L3(j)`u z2?#fK&1vtS?G6aOt@E`gZ9*qCmyvc>Ma@Q8^I4y~f3gs7*d=ATlP>1S zyF=k&6p2;7dn^8?+!wZO5r~B+;@KXFEn^&C=6ma1J7Au6y29iMIxd7#iW%=iUzq&C=$aPLa^Q zncia$@TIy6UT@69=nbty5epP>*fVW@5qbUcb2~Gg75dNd{COFLdiz3}kODn^U*=@E z0*$7u7Rl2u)=%fk4m8EK1ctR!6%Ve`e!O20L$0LkM#f+)n9h^dn{n`T*^~d+l*Qlx z$;JC0P9+en2Wlxjwq#z^a6pdnD6fJM!GV7_%8%c)kc5LZs_G^qvw)&J#6WSp< zmsd~1-(GrgjC56Pdf6#!dt^y8Rg}!#UXf)W%~PeU+kU`FeSZHk)%sFv++#Dujk-~m zFHvVJC}UBn2jN& zs!@nZ?e(iyZPNo`p1i#~wsv9l@#Z|ag3JR>0#u1iW9M1RK1iF6-RbJ4KYg?B`dET9 zyR~DjZ>%_vWYm*Z9_+^~hJ_|SNTzBKx=U0l9 z9x(J96b{`R)UVQ$I`wTJ@$_}`)_DyUNOso6=WOmQKI1e`oyYy1C&%AQU<0-`(ow)1 zT}gYdwWdm4wW6|K)LcfMe&psE0XGhMy&xS`@vLi|1#Za{D6l@#D!?nW87wcscUZgELT{Cz**^;Zb~7 z(~WFRO`~!WvyZAW-8v!6n&j*PLm9NlN}BuUN}@E^TX*4Or#dMMF?V9KBeLSiLO4?B zcE3WNIa-H{ThrlCoN=XjOGk1dT=xwwrmt<1a)mrRzg{35`@C!T?&_;Q4Ce=5=>z^*zE_c(0*vWo2_#TD<2)pLXV$FlwP}Ik74IdDQU@yhkCr5h zn5aa>B7PWy5NQ!vf7@p_qtC*{dZ8zLS;JetPkHi>IvPjtJ#ThGQD|Lq#@vE2xdl%`x4A8xOln}BiQ92Po zW;0%A?I5CQ_O`@Ad=`2BLPPbBuPUp@Hb%a_OOI}y{Rwa<#h z5^6M}s7VzE)2&I*33pA>e71d78QpF>sNK;?lj^Kl#wU7G++`N_oL4QPd-iPqBhhs| z(uVM}$ItF-onXuuXO}o$t)emBO3Hjfyil@*+GF;9j?`&67GBM;TGkLHi>@)rkS4Nj zAEk;u)`jc4C$qN6WV2dVd#q}2X6nKt&X*}I@jP%Srs%%DS92lpDY^K*Sx4`l;aql$ zt*-V{U&$DM>pdO?%jt$t=vg5|p+Rw?SPaLW zB6nvZ69$ne4Z(s$3=Rf&RX8L9PWMV*S0@R zuIk&ba#s6sxVZ51^4Kon46X^9`?DC9mEhWB3f+o4#2EXFqy0(UTc>GU| zGCJmI|Dn-dX#7|_6(fT)>&YQ0H&&JX3cTvAq(a@ydM4>5Njnuere{J8p;3?1az60* z$1E7Yyxt^ytULeokgDnRVKQw9vzHg1>X@@jM$n$HBlveIrKP5-GJq%iWH#odVwV6cF^kKX(@#%%uQVb>#T6L^mC@)%SMd4DF? zVky!~ge27>cpUP1Vi}Z32lbLV+CQy+T5Wdmva6Fg^lKb!zrg|HPU=5Qu}k;4GVH+x z%;&pN1LOce0w@9i1Mo-Y|7|z}fbch@BPp2{&R-5{GLoeu8@limQmFF zaJRR|^;kW_nw~0V^ zfTnR!Ni*;-%oSHG1yItARs~uxra|O?YJxBzLjpeE-=~TO3Dn`JL5Gz;F~O1u3|FE- zvK2Vve`ylc`a}G`gpHg58Cqc9fMoy1L}7x7T>%~b&irrNMo?np3`q;d3d;zTK>nrK zOjPS{@&74-fA7j)8uT9~*g23uGnxwIVj9HorzUX#s0pcp2?GH6i}~+kv9fWChtPa_ z@T3m+$0pbjdQw7jcnHn;Pi85hk_u2-1^}c)LNvjdam8K-XJ+KgKQ%!?2n_!#{$H|| zLO=%;hRo6EDmnOBKCL9Cg~ETU##@u^W_5joZ%Et%X_n##%JDOcsO=0VL|Lkk!VdRJ z^|~2pB@PUspT?NOeO?=0Vb+fAGc!j%Ufn-cB`s2A~W{Zj{`wqWq_-w0wr@6VrM zbzni@8c>WS!7c&|ZR$cQ;`niRw{4kG#e z70e!uX8VmP23SuJ*)#(&R=;SxGAvq|&>geL&!5Z7@0Z(No*W561n#u$Uc`f9pD70# z=sKOSK|bF~#khTTn)B28h^a1{;>EaRnHj~>i=Fnr3+Fa4 z`^+O5_itS#7kPd20rq66_wH`%?HNzWk@XFK0n;Z@Cx{kx==2L22zWH$Yg?7 zvDj|u{{+NR3JvUH({;b*$b(U5U z7(lF!1bz2%06+|-v(D?2KgwNw7( zJB#Tz+ZRi&U$i?f34m7>uTzO#+E5cbaiQ&L}UxyOQq~afbNB4EI{E04ZWg53w0A{O%qo=lF8d zf~ktGvIgf-a~zQoWf>loF7pOodrd0a2|BzwwPDV}ShauTK8*fmF6NRbO>Iw9zZU}u zw8Ya}?seBnEGQDmH#XpUUkj}N49tP<2jYwTFp!P+&Fd(%Z#yo80|5@zN(D{_pNow*&4%ql zW~&yp@scb-+Qj-EmErY+Tu=dUmf@*BoXY2&oKT8U?8?s1d}4a`Aq>7SV800m$FE~? zjmz(LY+Xx9sDX$;vU`xgw*jLw7dWOnWWCO8o|;}f>cu0Q&`0I{YudMn;P;L3R-uz# zfns_mZED_IakFBPP2r_S8XM$X)@O-xVKi4`7373Jkd5{2$M#%cRhWer3M(vr{S6>h zj{givZJ3(`yFL@``(afn&~iNx@B1|-qfYiZu?-_&Z8+R~v`d6R-}EX9IVXWO-!hL5 z*k6T#^2zAXdardU3Ao~I)4DGdAv2bx{4nOK`20rJo>rmk3S2ZDu}))8Z1m}CKigf0 z3L`3Y`{huj`xj9@`$xTZzZc3je?n^yG<8sw$`Y%}9mUsjUR%T!?k^(q)6FH6Af^b6 zlPg~IEwg0y;`t9y;#D+uz!oE4VP&Je!<#q*F?m5L5?J3i@!0J6q#eu z!RRU`-)HeqGi_UJZ(n~|PSNsv+Wgl{P-TvaUQ9j?ZCtvb^37U$sFpBrkT{7Jpd?HpIvj2!}RIq zH{9~+gErN2+}J`>Jvng2hwM`=PLNkc7pkjblKW|+Fk9rc)G1R>Ww>RC=r-|!m-u7( zc(a$9NG}w#PjWNMS~)o=i~WA&4L(YIW25@AL9+H9!?3Y}sv#MOdY{bb9j>p`{?O(P zIvb`n?_(gP2w3P#&91JX*md+bBEr%xUHMVqfB;(f?OPtMnAZ#rm5q5mh;a2f_si2_ z3oXWB?{NF(JtkAn6F(O{z@b76OIqMC$&oJ_&S|YbFJ*)3qVX_uNf5b8(!vGX19hsG z(OP>RmZp29KH9Ge2kKjKigUmOe^K_!UXP`von)PR8Qz$%=EmOB9xS(ZxE_tnyzo}7 z=6~$~9k0M~v}`w={AeqF?_)9q{m8K#6M{a&(;u;O41j)I$^T?lx5(zlebpY@NT&#N zR+1bB)-1-xj}R8uwqwf=iP1GbxBjneCC%UrSdSxK1vM^i9;bUkS#iRZw2H>rS<2<$ zNT3|sDH>{tXb=zq7XZi*K?#Zsa1h1{h5!Tq_YbKFm_*=A5-<~j63he;4`77!|LBlo zR^~tR3yxcU=gDFbshyF6>o0bdp$qmHS7D}m3;^QZq9kBBU|9$N-~oU?G5;jyFR7>z hN`IR97YZXIo@y!QgFWddJ3|0`sjFx!m))><{BI=FK%f8s From f6d9aa38c49ceb8cc83cb747e3fc03543af40a6d Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 1 Oct 2021 02:38:14 +0900 Subject: [PATCH 50/50] favicon --- example/web/favicon.png | Bin 917 -> 2968 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/example/web/favicon.png b/example/web/favicon.png index 8aaa46ac1ae21512746f852a42ba87e4165dfdd1..7437724ee3f3f834ac98691849cb462e12f2c275 100644 GIT binary patch literal 2968 zcmaKu3se)=7CK7;Ovp%*3CSSDQb15X zTI6FbmLj6{b?Fl=Sc)x6S_CVFitQ8XD`=%6AS{Hgf^Ef5-kV7RL{{iz&D@)F&pzj# zbMCz}h2h&m>};KF0RXTQh6*BxmPy`=tcmANi>Z77plDG(KU~P?)56u56qO?Y;8yxx ziO55+gW8rQEuhBM*4BQ>s>!4J)a~#(9=@Wh`kG=qZu0EV;Qq(9Jz}?af(nbSE;yZC zbofe4SZUcQFhG88lq2=do#@t7^=WTwbf+d4mT%wKi6a{&R~j7OvPF+acJ2DZ;fttW z&pH+>2Rakhu#enGd*y^(WqYJ_U8vVp{m&&;^ZPZ5qfd)v9@^8=+M+nxa6vrc6FcGd zF#6ke3+(M+aBE~u{tk1>cW8sG>>zWdl_kEJtUzoK1 z=DCKjhLZIi_N%;uscW`oyFN$kek?rA=z-hH<*A%XukuS%l8(DM{en1`cISAgvu~{2 zX>b(#Camc`^t37G-A}rYDq4HE-hJf<9{9<`xm{Z#uRi_k!*}kS2yLEZb#LGN$fx`E zfJ2k6rI@$s`~keOeE<0ehl=gmwEn8fV*XbfT;nB+T^+yJ)R_CbBef~#RQ$00SYFTe zP9Vu5?xI9U)Z!!}7D`1Tz@6wX0<0;^0864rA$|bG8Can213(PLWv0KI;%3ybAavLO z@dTC=w=^FGtc>~xh?cxUiJP!wXxU6Qi_2ninJgNU&1HFWz1aX@QEf3pF{>?S`y{SA z&w7(+Y*eAK8UR@AK;9IfqLK;#))&wyF)kKu;-4Q~ zhT|$O2&Sc_G19ykm^uk$aX1{1$p+bMPeQ{}qgCQ?x~EdJ+F)ebjsVdls!1gIM%o9mRXFVx3#;}M0L2?9SF_@q^3`eE&VC2ZW7?C59XeO}N+@-@R zJ*H5Yb*RCE_7fo(Q(~6XL}^tB7=dW8RCOW}v>#F8tIf@wn8e>3G6$(-7>;RV*gWXW zupxAPNe!9ik$L3uF*&A=RKbY|#Nz2wYbu(pi$OaaO-JNn0jfZh8lr{}i^DcTb4SdQ zvGbB9BPJwSGOkboCm}mg2`+{89`S|Hb^qx$0P3+8UbuRHCVf>DOG!Y?zG+_|mm&Nh*^<*=Mb!t}6tR4N~ zKm>+BL@8&nS+S8aq|4-R*JslpC0-qnEfN0oYY4Kf7JO7syzJyc!R9F0f-&(HbvM&q z(Npz!J0!U7b6GHhE>$9)jn_1 z^$d>N{H7c~OAT2t75|Sxb>#Oy-CNw_d!l3wRr_aMdGT0NM)|gwfRF7CLcJ4viu;@I zjCeS?IjMrH?+4xn8XvB;9JlA%gjrWo@KzU)zbm`*?cu1Z!>2nIE?3_T3?I9#$?jcO z^i%!GCI~%9XfZ}-%6H#q~7_mWH9K{Qt>{9lh}RY-&Z98tLwVs*tJmu(O7%7;2M7_Otj~s zvukVRmh0|+rj)Gx#a}m(5yV+}@Nnf`Jd^S2zaBMbes)k%&#YebIJlALrgJJU*jJBP z?i1G2Z{0W=RZ+DgVbh~!?-rbH+x_FVCCSMK04V>h8kpEq+5IKI#nAs+XdnHvz5lx53svghT?;WA3rlJ}OZwfy?o)PKGKhIf?} U4oLUDB0q_QLE8kE0~2!o58|N=iU0rr delta 601 zcmV-f0;c_#7nKJ`iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVE_OC0drDE zLIAGL9O(c6010qNS#tmYE+YT{E+YYWr9XB600CK(V**eEH7+!hwgP~YZ385e$OSl) z;s`E(Ou{Ew0005iNklYp&slpFPnL0%RHV8+M(6~Ud5K^Sra$zh&ame1i&CH$GUY`?hal1Ra@4cC~ zb3)U=h+&@!F?`V*4)r4pPJ)uL{}O}*c1ZDmqM`8fHU#gd(!lo96g)ck9kT4l=ZPPRg%Wd}Pw1cWy9_S@3Mq z{%(O6Q^3J;4DN(+SvIDZfiZ`{d!#%`%JT$%m-F$+w~MynWHOgvz@^_3udZbTo+W#K z->>?Rq*`ezq+J0?#pa$k@M&$vKnZNdnF2WN4|yMLTEG0!#@3ZYzS417e33OD5 zlsk|#26p^>Ofp8Da+vkeY)k5-Q+)b#_!+G~K?J5AFnaMEo0#}^JLTKuFO7va8s1wy zw{xg#jaGCqv^r_X1EysSej0~Wtxy3}bVH~F} nj)={jkpu={NJR42qzium05Tpns9Bec00000NkvXXu0mjfks||j