participant to parent (TrackPublication)

This commit is contained in:
Hiroshi Horie
2021-12-03 00:57:42 +07:00
parent 2fe32f7d72
commit 4c66704427
6 changed files with 53 additions and 32 deletions
+10 -2
View File
@@ -76,7 +76,11 @@ class LocalParticipant extends Participant {
); );
await engine.negotiate(); await engine.negotiate();
final pub = LocalTrackPublication<LocalAudioTrack>(trackInfo, track, this); final pub = LocalTrackPublication<LocalAudioTrack>(
participant: this,
info: trackInfo,
track: track,
);
addTrackPublication(pub); addTrackPublication(pub);
[events, roomEvents].emit(LocalTrackPublishedEvent( [events, roomEvents].emit(LocalTrackPublishedEvent(
@@ -159,7 +163,11 @@ class LocalParticipant extends Participant {
); );
await engine.negotiate(); await engine.negotiate();
final pub = LocalTrackPublication<LocalVideoTrack>(trackInfo, track, this); final pub = LocalTrackPublication<LocalVideoTrack>(
participant: this,
info: trackInfo,
track: track,
);
addTrackPublication(pub); addTrackPublication(pub);
[events, roomEvents].emit(LocalTrackPublishedEvent( [events, roomEvents].emit(LocalTrackPublishedEvent(
+8 -2
View File
@@ -143,9 +143,15 @@ class RemoteParticipant extends Participant {
if (pub == null) { if (pub == null) {
final RemoteTrackPublication pub; final RemoteTrackPublication pub;
if (trackInfo.type == lk_models.TrackType.VIDEO) { if (trackInfo.type == lk_models.TrackType.VIDEO) {
pub = RemoteTrackPublication<RemoteVideoTrack>(trackInfo, this); pub = RemoteTrackPublication<RemoteVideoTrack>(
participant: this,
info: trackInfo,
);
} else if (trackInfo.type == lk_models.TrackType.AUDIO) { } else if (trackInfo.type == lk_models.TrackType.AUDIO) {
pub = RemoteTrackPublication<RemoteAudioTrack>(trackInfo, this); pub = RemoteTrackPublication<RemoteAudioTrack>(
participant: this,
info: trackInfo,
);
} else { } else {
throw UnexpectedStateException('Unknown track type'); throw UnexpectedStateException('Unknown track type');
} }
@@ -8,16 +8,17 @@ import '../track/track.dart';
import 'track_publication.dart'; import 'track_publication.dart';
class LocalTrackPublication<T extends LocalTrack> extends TrackPublication { class LocalTrackPublication<T extends LocalTrack> extends TrackPublication {
final LocalParticipant _participant;
@override @override
covariant T? track; covariant T? track;
LocalTrackPublication( @override
lk_models.TrackInfo info, final LocalParticipant participant;
Track track,
this._participant, LocalTrackPublication({
) : super.fromInfo(info) { required this.participant,
required lk_models.TrackInfo info,
required Track track,
}) : super(info: info) {
updateTrack(track); updateTrack(track);
// register dispose func // register dispose func
onDispose(() async { onDispose(() async {
@@ -36,12 +37,12 @@ class LocalTrackPublication<T extends LocalTrack> extends TrackPublication {
// listen for track muted events // listen for track muted events
..on<TrackMuteUpdatedEvent>((event) { ..on<TrackMuteUpdatedEvent>((event) {
// send signal to server // send signal to server
_participant.engine.signalClient.sendMuteTrack(sid, event.muted); participant.engine.signalClient.sendMuteTrack(sid, event.muted);
// emit events // emit events
final newEvent = event.muted final newEvent = event.muted
? TrackMutedEvent(participant: _participant, track: this) ? TrackMutedEvent(participant: participant, track: this)
: TrackUnmutedEvent(participant: _participant, track: this); : TrackUnmutedEvent(participant: participant, track: this);
[_participant.events, _participant.roomEvents].emit(newEvent); [participant.events, participant.roomEvents].emit(newEvent);
}); });
// dispose listener when the track is disposed // dispose listener when the track is disposed
newValue.onDispose(() => listener.dispose()); newValue.onDispose(() => listener.dispose());
@@ -35,7 +35,9 @@ class RemoteTrackPublication<T extends RemoteTrack> extends TrackPublication {
@override @override
covariant T? track; covariant T? track;
final RemoteParticipant _participant; @override
final RemoteParticipant participant;
bool _enabled = true; bool _enabled = true;
lk_rtc.VideoQuality _videoQuality = lk_rtc.VideoQuality.HIGH; lk_rtc.VideoQuality _videoQuality = lk_rtc.VideoQuality.HIGH;
lk_rtc.VideoQuality get videoQuality => _videoQuality; lk_rtc.VideoQuality get videoQuality => _videoQuality;
@@ -46,11 +48,11 @@ class RemoteTrackPublication<T extends RemoteTrack> extends TrackPublication {
Function(void)? _visibilityDidUpdate; Function(void)? _visibilityDidUpdate;
Function? _cancelVisibilityDebounceFunc; Function? _cancelVisibilityDebounceFunc;
RemoteTrackPublication( RemoteTrackPublication({
lk_models.TrackInfo info, required this.participant,
this._participant, [ required lk_models.TrackInfo info,
Track? track, Track? track,
]) : super.fromInfo(info) { }) : super(info: info) {
// register dispose func // register dispose func
onDispose(() async { onDispose(() async {
_cancelVisibilityDebounceFunc?.call(); _cancelVisibilityDebounceFunc?.call();
@@ -142,7 +144,7 @@ class RemoteTrackPublication<T extends RemoteTrack> extends TrackPublication {
} }
logger.fine('[Visibility] Sending to server ${settings.toProto3Json()}'); logger.fine('[Visibility] Sending to server ${settings.toProto3Json()}');
_participant.engine.signalClient.sendUpdateTrackSettings(settings); participant.engine.signalClient.sendUpdateTrackSettings(settings);
} }
@internal @internal
@@ -154,7 +156,7 @@ class RemoteTrackPublication<T extends RemoteTrack> extends TrackPublication {
// and the attached track is a video track // and the attached track is a video track
if (didUpdate && if (didUpdate &&
newValue != null && newValue != null &&
_participant.engine.connectOptions.optimizeVideo && participant.engine.connectOptions.optimizeVideo &&
newValue.kind == lk_models.TrackType.VIDEO) { newValue.kind == lk_models.TrackType.VIDEO) {
// //
// Attach visibility event listener (if video track) // Attach visibility event listener (if video track)
@@ -195,9 +197,8 @@ class RemoteTrackPublication<T extends RemoteTrack> extends TrackPublication {
// Ideally, we should wait for WebRTC's onRemoveTrack event // Ideally, we should wait for WebRTC's onRemoveTrack event
// but it does not work reliably across platforms. // but it does not work reliably across platforms.
// So for now we will assume remove track succeeded. // So for now we will assume remove track succeeded.
[_participant.events, _participant.roomEvents] [participant.events, participant.roomEvents].emit(TrackUnsubscribedEvent(
.emit(TrackUnsubscribedEvent( participant: participant,
participant: _participant,
track: track!, track: track!,
publication: this, publication: this,
)); ));
@@ -212,7 +213,7 @@ class RemoteTrackPublication<T extends RemoteTrack> extends TrackPublication {
trackSids: [sid], trackSids: [sid],
subscribe: subscribed, subscribe: subscribed,
); );
_participant.engine.signalClient.sendUpdateSubscription(subscription); participant.engine.signalClient.sendUpdateSubscription(subscription);
} }
void _sendUpdateTrackSettings() { void _sendUpdateTrackSettings() {
@@ -223,6 +224,6 @@ class RemoteTrackPublication<T extends RemoteTrack> extends TrackPublication {
if (kind == lk_models.TrackType.VIDEO) { if (kind == lk_models.TrackType.VIDEO) {
settings.quality = _videoQuality; settings.quality = _videoQuality;
} }
_participant.engine.signalClient.sendUpdateTrackSettings(settings); participant.engine.signalClient.sendUpdateTrackSettings(settings);
} }
} }
+10 -4
View File
@@ -1,10 +1,11 @@
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import '../extensions.dart'; import '../extensions.dart';
import '../participant/participant.dart';
import '../proto/livekit_models.pb.dart' as lk_models; import '../proto/livekit_models.pb.dart' as lk_models;
import '../support/disposable.dart'; import '../support/disposable.dart';
import '../types.dart';
import '../track/track.dart'; import '../track/track.dart';
import '../types.dart';
/// Represents a track that's published to the server. This class contains /// Represents a track that's published to the server. This class contains
/// metadata associated with tracks. /// metadata associated with tracks.
@@ -18,8 +19,12 @@ abstract class TrackPublication extends Disposable {
final lk_models.TrackType kind; final lk_models.TrackType kind;
final TrackSource source; final TrackSource source;
// Relevant type must be implemented
abstract Track? track; abstract Track? track;
// Track? get track => _track;
// Relevant type must be implemented
/// The [Participant] this publication belongs to.
abstract final Participant participant;
// metadata-muted // metadata-muted
bool _muted = false; bool _muted = false;
@@ -30,8 +35,9 @@ abstract class TrackPublication extends Disposable {
bool get subscribed => track != null; bool get subscribed => track != null;
TrackPublication.fromInfo(lk_models.TrackInfo info) TrackPublication({
: sid = info.sid, required lk_models.TrackInfo info,
}) : sid = info.sid,
name = info.name, name = info.name,
kind = info.type, kind = info.type,
source = info.source.toLKType() { source = info.source.toLKType() {
-1
View File
@@ -16,7 +16,6 @@ import 'proto/livekit_models.pb.dart' as lk_models;
import 'proto/livekit_rtc.pb.dart' as lk_rtc; import 'proto/livekit_rtc.pb.dart' as lk_rtc;
import 'rtc_engine.dart'; import 'rtc_engine.dart';
import 'support/disposable.dart'; import 'support/disposable.dart';
import 'publication/local_track_publication.dart';
import 'track/track.dart'; import 'track/track.dart';
import 'types.dart'; import 'types.dart';