diff --git a/.changes/fix-processor-track-restore b/.changes/fix-processor-track-restore new file mode 100644 index 00000000..cb0a3ead --- /dev/null +++ b/.changes/fix-processor-track-restore @@ -0,0 +1 @@ +patch type="fixed" "Restore original track on sender when processor stopped" diff --git a/lib/src/track/local/local.dart b/lib/src/track/local/local.dart index e520b871..dc176ff0 100644 --- a/lib/src/track/local/local.dart +++ b/lib/src/track/local/local.dart @@ -348,7 +348,7 @@ abstract class LocalTrack extends Track { await _processor!.init(processorOptions); if (_processor?.processedTrack != null) { - setProcessedTrack(processor.processedTrack!); + await setProcessedTrack(processor.processedTrack!); } logger.fine('processor initialized'); @@ -361,18 +361,12 @@ abstract class LocalTrack extends Track { if (_processor == null) return; logger.fine('stopping processor'); + await _processor?.processedTrack?.stop(); await _processor?.destroy(); _processor = null; - if (!keepElement) { - // processorElement?.remove(); - // processorElement = null; - } - - // apply original track constraints in case the processor changed them - //await this._mediaStreamTrack.applyConstraints(this._constraints); - // force re-setting of the mediaStreamTrack on the sender - //await this.setMediaStreamTrack(this._mediaStreamTrack, true); + // Restore original track on sender + await setProcessedTrack(null); events.emit(TrackProcessorUpdateEvent(track: this)); } diff --git a/lib/src/track/track.dart b/lib/src/track/track.dart index 520a6916..203e371a 100644 --- a/lib/src/track/track.dart +++ b/lib/src/track/track.dart @@ -222,8 +222,19 @@ abstract class Track extends DisposableChangeNotifier with EventsEmittable setProcessedTrack(rtc.MediaStreamTrack? track) async { + if (track != null) { + _originalTrack = _mediaStreamTrack; + _mediaStreamTrack = track; + } else if (_originalTrack != null) { + _mediaStreamTrack = _originalTrack!; + _originalTrack = null; + } + // Update sender to transmit the correct track + await sender?.replaceTrack(_mediaStreamTrack); + events.emit(TrackStreamUpdatedEvent( + track: this, + stream: _mediaStream, + )); } }