Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/spreed.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
authorDaniel Calviño Sánchez <danxuliu@gmail.com>2022-03-10 00:30:43 +0300
committerDaniel Calviño Sánchez <danxuliu@gmail.com>2022-03-10 00:30:43 +0300
commit864ff7efda2a6b4cef3c6dd412ccec61f5d82b29 (patch)
treee73d58e25761d0611bba65c2d5a34f8f801cc9cf /src/utils
parent2a65ecd2e31d3896592b3f939b838364444a28a4 (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.js13
-rw-r--r--src/utils/media/pipeline/TrackToStream.spec.js49
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')