participant to parent (TrackPublication)
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user