@@ -66,13 +66,16 @@ class TrackVisibilityUpdatedEvent with TrackEvent, InternalEvent {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used to notify muted state from Track to TrackPublication.
|
||||||
@internal
|
@internal
|
||||||
class TrackMuteUpdatedEvent with TrackEvent, InternalEvent {
|
class InternalTrackMuteUpdatedEvent with TrackEvent, InternalEvent {
|
||||||
final Track track;
|
final Track track;
|
||||||
final bool muted;
|
final bool muted;
|
||||||
const TrackMuteUpdatedEvent({
|
final bool shouldSendSignal;
|
||||||
|
const InternalTrackMuteUpdatedEvent({
|
||||||
required this.track,
|
required this.track,
|
||||||
required this.muted,
|
required this.muted,
|
||||||
|
required this.shouldSendSignal,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
import '../logger.dart';
|
|
||||||
import '../events.dart';
|
|
||||||
import '../extensions.dart';
|
|
||||||
import '../internal/events.dart';
|
|
||||||
import '../participant/local_participant.dart';
|
import '../participant/local_participant.dart';
|
||||||
import '../proto/livekit_models.pb.dart' as lk_models;
|
import '../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../track/local.dart';
|
import '../track/local.dart';
|
||||||
@@ -24,34 +20,6 @@ class LocalTrackPublication<T extends LocalTrack> extends TrackPublication<T> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool> updateTrack(T? newValue) async {
|
|
||||||
final didUpdate = await super.updateTrack(newValue);
|
|
||||||
|
|
||||||
if (newValue != null) {
|
|
||||||
// attach listener to track
|
|
||||||
final listener = newValue.createListener()
|
|
||||||
// listen for track muted events
|
|
||||||
..on<TrackMuteUpdatedEvent>((event) {
|
|
||||||
// send signal to server
|
|
||||||
logger.fine('${this} sending mute signal ${sid}, ${event.muted}');
|
|
||||||
participant.room.engine.signalClient.sendMuteTrack(sid, event.muted);
|
|
||||||
// emit events
|
|
||||||
final newEvent = event.muted
|
|
||||||
? TrackMutedEvent(participant: participant, track: this)
|
|
||||||
: TrackUnmutedEvent(participant: participant, track: this);
|
|
||||||
[participant.events, participant.room.events].emit(newEvent);
|
|
||||||
});
|
|
||||||
// dispose listener when the track is disposed
|
|
||||||
newValue.onDispose(() => listener.dispose());
|
|
||||||
}
|
|
||||||
|
|
||||||
return didUpdate;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool get muted => track?.muted ?? super.muted;
|
|
||||||
|
|
||||||
/// Mute the track associated with this publication
|
/// Mute the track associated with this publication
|
||||||
Future<void> mute() async => await track?.mute();
|
Future<void> mute() async => await track?.mute();
|
||||||
|
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ class RemoteTrackPublication<T extends RemoteTrack>
|
|||||||
@override
|
@override
|
||||||
void updateFromInfo(lk_models.TrackInfo info) {
|
void updateFromInfo(lk_models.TrackInfo info) {
|
||||||
super.updateFromInfo(info);
|
super.updateFromInfo(info);
|
||||||
updateMuted(info.muted);
|
|
||||||
track?.updateMuted(info.muted);
|
track?.updateMuted(info.muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
|
import '../events.dart';
|
||||||
|
import '../internal/events.dart';
|
||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
import '../extensions.dart';
|
import '../extensions.dart';
|
||||||
|
import '../logger.dart';
|
||||||
import '../participant/participant.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';
|
||||||
@@ -26,9 +29,7 @@ abstract class TrackPublication<T extends Track> extends Disposable {
|
|||||||
/// The [Participant] this publication belongs to.
|
/// The [Participant] this publication belongs to.
|
||||||
abstract final Participant participant;
|
abstract final Participant participant;
|
||||||
|
|
||||||
// metadata-muted
|
bool get muted => track?.muted ?? false;
|
||||||
bool _muted = false;
|
|
||||||
bool get muted => _muted;
|
|
||||||
|
|
||||||
bool simulcasted = false;
|
bool simulcasted = false;
|
||||||
TrackDimension? dimension;
|
TrackDimension? dimension;
|
||||||
@@ -64,9 +65,6 @@ abstract class TrackPublication<T extends Track> extends Disposable {
|
|||||||
bool operator ==(Object other) =>
|
bool operator ==(Object other) =>
|
||||||
other is TrackPublication && sid == other.sid;
|
other is TrackPublication && sid == other.sid;
|
||||||
|
|
||||||
@internal
|
|
||||||
void updateMuted(bool muted) => _muted = muted;
|
|
||||||
|
|
||||||
// Update track to new value, dispose previous if exists.
|
// Update track to new value, dispose previous if exists.
|
||||||
// Returns true if value has changed.
|
// Returns true if value has changed.
|
||||||
// Intended for internal use only.
|
// Intended for internal use only.
|
||||||
@@ -76,6 +74,30 @@ abstract class TrackPublication<T extends Track> extends Disposable {
|
|||||||
// dispose previous track (if exists)
|
// dispose previous track (if exists)
|
||||||
await _track?.dispose();
|
await _track?.dispose();
|
||||||
_track = newValue;
|
_track = newValue;
|
||||||
|
|
||||||
|
if (newValue != null) {
|
||||||
|
// listen for Track's muted events
|
||||||
|
final listener = newValue.createListener()
|
||||||
|
..on<InternalTrackMuteUpdatedEvent>(
|
||||||
|
(event) => _onTrackMuteUpdatedEvent(event));
|
||||||
|
// dispose listener when the track is disposed
|
||||||
|
newValue.onDispose(() => listener.dispose());
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _onTrackMuteUpdatedEvent(InternalTrackMuteUpdatedEvent event) {
|
||||||
|
// send signal to server (if mute initiated by local user)
|
||||||
|
if (event.shouldSendSignal) {
|
||||||
|
logger.fine(
|
||||||
|
'${this} Sending mute signal... sid:${sid}, muted:${event.muted}');
|
||||||
|
participant.room.engine.signalClient.sendMuteTrack(sid, event.muted);
|
||||||
|
}
|
||||||
|
// emit events
|
||||||
|
final newEvent = event.muted
|
||||||
|
? TrackMutedEvent(participant: participant, track: this)
|
||||||
|
: TrackUnmutedEvent(participant: participant, track: this);
|
||||||
|
[participant.events, participant.room.events].emit(newEvent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
|
|||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
import '../exceptions.dart';
|
import '../exceptions.dart';
|
||||||
import '../internal/events.dart';
|
|
||||||
import '../logger.dart';
|
import '../logger.dart';
|
||||||
import '../proto/livekit_models.pb.dart' as lk_models;
|
import '../proto/livekit_models.pb.dart' as lk_models;
|
||||||
import '../types.dart';
|
import '../types.dart';
|
||||||
@@ -41,8 +40,7 @@ abstract class LocalTrack extends Track {
|
|||||||
if (!Platform.isWindows) {
|
if (!Platform.isWindows) {
|
||||||
await stop();
|
await stop();
|
||||||
}
|
}
|
||||||
updateMuted(true);
|
updateMuted(true, shouldSendSignal: true);
|
||||||
events.emit(TrackMuteUpdatedEvent(track: this, muted: muted));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,8 +52,7 @@ abstract class LocalTrack extends Track {
|
|||||||
await restartTrack();
|
await restartTrack();
|
||||||
}
|
}
|
||||||
await enable();
|
await enable();
|
||||||
updateMuted(false);
|
updateMuted(false, shouldSendSignal: true);
|
||||||
events.emit(TrackMuteUpdatedEvent(track: this, muted: muted));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -139,7 +139,15 @@ abstract class Track extends DisposableChangeNotifier
|
|||||||
}
|
}
|
||||||
|
|
||||||
@internal
|
@internal
|
||||||
void updateMuted(bool muted) => _muted = muted;
|
void updateMuted(bool muted, {bool shouldSendSignal = false}) {
|
||||||
|
if (_muted == muted) return;
|
||||||
|
_muted = muted;
|
||||||
|
events.emit(InternalTrackMuteUpdatedEvent(
|
||||||
|
track: this,
|
||||||
|
muted: muted,
|
||||||
|
shouldSendSignal: shouldSendSignal,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
@internal
|
@internal
|
||||||
void updateMediaStreamAndTrack(
|
void updateMediaStreamAndTrack(
|
||||||
|
|||||||
Reference in New Issue
Block a user