diff --git a/lib/src/track/local/local.dart b/lib/src/track/local/local.dart index 981b0717..fd8ab0fa 100644 --- a/lib/src/track/local/local.dart +++ b/lib/src/track/local/local.dart @@ -30,7 +30,6 @@ import '../../support/platform.dart'; import '../../types/other.dart'; import '../options.dart'; import '../processor.dart'; -import '../processor_native.dart' if (dart.library.js_interop) '../processor_web.dart'; import '../remote/audio.dart'; import '../remote/video.dart'; import '../track.dart'; @@ -144,6 +143,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; } @@ -254,14 +260,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'); @@ -287,6 +294,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 ce987d61..bc345126 100644 --- a/lib/src/track/options.dart +++ b/lib/src/track/options.dart @@ -79,6 +79,7 @@ class CameraCaptureOptions extends VideoCaptureOptions { params: captureOptions.params, deviceId: captureOptions.deviceId, maxFrameRate: captureOptions.maxFrameRate, + processor: captureOptions.processor, ); @override @@ -108,18 +109,24 @@ 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 3c0f0917..23a3b7c0 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -222,8 +222,25 @@ abstract class Track extends DisposableChangeNotifier with EventsEmittable 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, + )); } }