diff --git a/lib/src/core/engine.dart b/lib/src/core/engine.dart index 6625f19e..1847e223 100644 --- a/lib/src/core/engine.dart +++ b/lib/src/core/engine.dart @@ -313,6 +313,7 @@ class Engine extends Disposable with EventsEmittable { completer.completeError('Engine disconnected'); } } + events.once((e) => onClosing()); while (!_dcBufferStatus[kind]!) { diff --git a/lib/src/track/local/local.dart b/lib/src/track/local/local.dart index 2e7e56bb..8d90928a 100644 --- a/lib/src/track/local/local.dart +++ b/lib/src/track/local/local.dart @@ -36,9 +36,6 @@ import '../track.dart'; import 'audio.dart'; import 'video.dart'; -import '../processor_native.dart' - if (dart.library.js_interop) '../processor_web.dart'; - /// Used to group [LocalVideoTrack] and [RemoteVideoTrack]. mixin VideoTrack on Track { @internal @@ -147,6 +144,13 @@ abstract class LocalTrack extends Track { logger.severe('MediaStreamTrack.dispose() did throw $error'); } _stopped = true; + try { + if (_processor != null) { + await stopProcessor(); + } + } catch (error) { + logger.severe('LocalTrack.stopProcessor did throw: $error'); + } } return didStop; } @@ -261,14 +265,15 @@ abstract class LocalTrack extends Track { _processor = processor; - final processorOptions = AudioProcessorOptions( + final processorOptions = ProcessorOptions( + kind: kind, track: mediaStreamTrack, ); await _processor!.init(processorOptions); if (_processor?.processedTrack != null) { - setProcessedTrack(processor.processedTrack!); + await setProcessedTrack(processor.processedTrack!); } logger.fine('processor initialized'); @@ -294,6 +299,8 @@ abstract class LocalTrack extends Track { // force re-setting of the mediaStreamTrack on the sender //await this.setMediaStreamTrack(this._mediaStreamTrack, true); + await setProcessedTrack(null); + events.emit(TrackProcessorUpdateEvent(track: this)); } diff --git a/lib/src/track/options.dart b/lib/src/track/options.dart index 61735b3c..4b1d597e 100644 --- a/lib/src/track/options.dart +++ b/lib/src/track/options.dart @@ -81,6 +81,7 @@ class CameraCaptureOptions extends VideoCaptureOptions { params: captureOptions.params, deviceId: captureOptions.deviceId, maxFrameRate: captureOptions.maxFrameRate, + processor: captureOptions.processor, ); @override @@ -112,19 +113,25 @@ class CameraCaptureOptions extends VideoCaptureOptions { // Returns new options with updated properties CameraCaptureOptions copyWith({ - VideoParameters? params, CameraPosition? cameraPosition, + CameraFocusMode? focusMode, + CameraExposureMode? exposureMode, String? deviceId, double? maxFrameRate, + VideoParameters? params, bool? stopCameraCaptureOnMute, + TrackProcessor? processor, }) => CameraCaptureOptions( - params: params ?? this.params, cameraPosition: cameraPosition ?? this.cameraPosition, + focusMode: focusMode ?? this.focusMode, + exposureMode: exposureMode ?? this.exposureMode, deviceId: deviceId ?? this.deviceId, maxFrameRate: maxFrameRate ?? this.maxFrameRate, + params: params ?? this.params, stopCameraCaptureOnMute: stopCameraCaptureOnMute ?? this.stopCameraCaptureOnMute, + processor: processor ?? this.processor, ); } diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index 3c10ea94..62792e96 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -229,8 +229,25 @@ abstract class Track extends DisposableChangeNotifier } @internal - void setProcessedTrack(rtc.MediaStreamTrack track) { - _originalTrack = _mediaStreamTrack; - _mediaStreamTrack = track; + Future setProcessedTrack(rtc.MediaStreamTrack? track) async { + if (track != null) { + // set processed track + _originalTrack = _mediaStreamTrack; + _mediaStreamTrack = track; + if (_originalTrack != null) { + await _mediaStream.removeTrack(_originalTrack!); + } + await _mediaStream.addTrack(track); + } else if (_originalTrack != null) { + // reset processed track + await _mediaStream.removeTrack(_mediaStreamTrack); + await _mediaStream.addTrack(_originalTrack!); + _mediaStreamTrack = _originalTrack!; + _originalTrack = null; + } + events.emit(TrackStreamUpdatedEvent( + track: this, + stream: _mediaStream, + )); } }