diff options
author | Daniel Calviño Sánchez <danxuliu@gmail.com> | 2022-03-10 00:30:43 +0300 |
---|---|---|
committer | Daniel Calviño Sánchez <danxuliu@gmail.com> | 2022-03-10 00:30:43 +0300 |
commit | 864ff7efda2a6b4cef3c6dd412ccec61f5d82b29 (patch) | |
tree | e73d58e25761d0611bba65c2d5a34f8f801cc9cf /src/utils | |
parent | 2a65ecd2e31d3896592b3f939b838364444a28a4 (diff) |
Trigger event when same input track is set again with different state
As described in the TrackSinkMixin documentation when a different source
track is set the "_handleInputTrackEnabled()" method will not be called
even if the new track has different state than the previous track.
Therefore, in that case TrackToStream should trigger the "trackEnabled"
event, as otherwise the state change would not be noticed.
Currently this has no effect, as the input track was never set again
with a different enabled state, but it should make the code more robust.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/media/pipeline/TrackToStream.js | 13 | ||||
-rw-r--r-- | src/utils/media/pipeline/TrackToStream.spec.js | 49 |
2 files changed, 62 insertions, 0 deletions
diff --git a/src/utils/media/pipeline/TrackToStream.js b/src/utils/media/pipeline/TrackToStream.js index 562cc3e50..d2b773f88 100644 --- a/src/utils/media/pipeline/TrackToStream.js +++ b/src/utils/media/pipeline/TrackToStream.js @@ -56,6 +56,8 @@ export default class TrackToStream extends TrackSink { this._superEmitterMixin() this._stream = null + + this._trackEnabledStates = {} } addInputTrackSlot(trackId) { @@ -69,6 +71,13 @@ export default class TrackToStream extends TrackSink { _handleInputTrack(trackId, newTrack, oldTrack) { // Only constraints changed, nothing to do if (newTrack === oldTrack) { + // But trigger "trackEnabled" if the state changed + if (newTrack && this._trackEnabledStates[trackId] !== newTrack.enabled) { + this._trackEnabledStates[trackId] = newTrack.enabled + + this._trigger('trackEnabled', [newTrack, newTrack.enabled]) + } + return } @@ -86,6 +95,8 @@ export default class TrackToStream extends TrackSink { this._stream.addTrack(newTrack) } + this._trackEnabledStates[trackId] = newTrack?.enabled + this._trigger('trackReplaced', [newTrack, oldTrack]) if (this._stream && this._stream.getTracks().length === 0) { @@ -98,6 +109,8 @@ export default class TrackToStream extends TrackSink { } _handleInputTrackEnabled(trackId, enabled) { + this._trackEnabledStates[trackId] = enabled + this._trigger('trackEnabled', [this.getInputTrack(trackId), enabled]) } diff --git a/src/utils/media/pipeline/TrackToStream.spec.js b/src/utils/media/pipeline/TrackToStream.spec.js index 7c9b01f31..007a5e28b 100644 --- a/src/utils/media/pipeline/TrackToStream.spec.js +++ b/src/utils/media/pipeline/TrackToStream.spec.js @@ -277,6 +277,55 @@ describe('TrackToStream', () => { expect(trackEnabledHandler).toHaveBeenCalledTimes(0) }) + test('triggers event when setting same now disabled input track again', () => { + const audioTrack = newMediaStreamTrackMock('audio') + + trackToStream._setInputTrack('audio', audioTrack) + + const stream = trackToStream.getStream() + + streamSetHandler.mockClear() + trackReplacedHandler.mockClear() + trackEnabledHandler.mockClear() + + audioTrack.enabled = false + trackToStream._setInputTrack('audio', audioTrack) + + expect(trackToStream.getStream()).not.toBe(null) + expect(trackToStream.getStream()).toBe(stream) + expect(trackToStream.getStream().getTracks().length).toBe(1) + expect(trackToStream.getStream().getTracks()).toContain(audioTrack) + expect(streamSetHandler).toHaveBeenCalledTimes(0) + expect(trackReplacedHandler).toHaveBeenCalledTimes(0) + expect(trackEnabledHandler).toHaveBeenCalledTimes(1) + expect(trackEnabledHandler).toHaveBeenCalledWith(trackToStream, audioTrack, false) + }) + + test('triggers event when setting same now enabled input track again', () => { + const audioTrack = newMediaStreamTrackMock('audio') + + audioTrack.enabled = false + trackToStream._setInputTrack('audio', audioTrack) + + const stream = trackToStream.getStream() + + streamSetHandler.mockClear() + trackReplacedHandler.mockClear() + trackEnabledHandler.mockClear() + + audioTrack.enabled = true + trackToStream._setInputTrack('audio', audioTrack) + + expect(trackToStream.getStream()).not.toBe(null) + expect(trackToStream.getStream()).toBe(stream) + expect(trackToStream.getStream().getTracks().length).toBe(1) + expect(trackToStream.getStream().getTracks()).toContain(audioTrack) + expect(streamSetHandler).toHaveBeenCalledTimes(0) + expect(trackReplacedHandler).toHaveBeenCalledTimes(0) + expect(trackEnabledHandler).toHaveBeenCalledTimes(1) + expect(trackEnabledHandler).toHaveBeenCalledWith(trackToStream, audioTrack, true) + }) + test('replaces track in existing stream when setting another input track', () => { const audioTrack = newMediaStreamTrackMock('audio') const audioTrack2 = newMediaStreamTrackMock('audio2') |