ソースを参照

Moves the code that trigger TRACK_REMOVED events for remote track to use peerconnection event instead of relying on TRACK_STOPPED event.

tags/v0.0.2
hristoterezov 10年前
コミット
59cd39c9c2
3個のファイルの変更46行の追加14行の削除
  1. 18
    11
      JitsiConference.js
  2. 24
    3
      modules/xmpp/JingleSessionPC.js
  3. 4
    0
      service/xmpp/XMPPEvents.js

+ 18
- 11
JitsiConference.js ファイルの表示

@@ -582,17 +582,6 @@ JitsiConference.prototype.onTrackAdded = function (track) {
582 582
     participant._tracks.push(track);
583 583
 
584 584
     var emitter = this.eventEmitter;
585
-    track.addEventListener(
586
-        JitsiTrackEvents.TRACK_STOPPED,
587
-        function () {
588
-            // remove track from JitsiParticipant
589
-            var pos = participant._tracks.indexOf(track);
590
-            if (pos > -1) {
591
-                participant._tracks.splice(pos, 1);
592
-            }
593
-            emitter.emit(JitsiConferenceEvents.TRACK_REMOVED, track);
594
-        }
595
-    );
596 585
     track.addEventListener(
597 586
         JitsiTrackEvents.TRACK_MUTE_CHANGED,
598 587
         function () {
@@ -870,6 +859,24 @@ function setupListeners(conference) {
870 859
             }
871 860
         }
872 861
     );
862
+    conference.room.addListener(XMPPEvents.REMOTE_STREAM_REMOVED,
863
+        function (streamId) {
864
+            var participants = conference.getParticipants();
865
+            for(var j = 0; j < participants.length; j++) {
866
+                var participant = participants[j];
867
+                var tracks = participant.getTracks();
868
+                for(var i = 0; i < tracks.length; i++) {
869
+                    if(tracks[i] && tracks[i].stream &&
870
+                        RTC.getStreamID(tracks[i].stream) == streamId){
871
+                        var track = participant._tracks.splice(i, 1);
872
+                        conference.eventEmitter.emit(
873
+                            JitsiConferenceEvents.TRACK_REMOVED, track);
874
+                        return;
875
+                    }
876
+                }
877
+            }
878
+        }
879
+    );
873 880
     conference.rtc.addListener(RTCEvents.FAKE_VIDEO_TRACK_CREATED,
874 881
         function (track) {
875 882
             conference.onTrackAdded(track);

+ 24
- 3
modules/xmpp/JingleSessionPC.js ファイルの表示

@@ -128,9 +128,16 @@ JingleSessionPC.prototype.doInitialize = function () {
128 128
     };
129 129
     this.peerconnection.onremovestream = function (event) {
130 130
         // Remove the stream from remoteStreams
131
-        // FIXME: remotestreamremoved.jingle not defined anywhere(unused)
132
-
133
-        $(document).trigger('remotestreamremoved.jingle', [event, self.sid]);
131
+        if (event.stream.id !== 'default') {
132
+            logger.log("REMOTE STREAM REMOVED: ", event.stream , event.stream.id);
133
+            self.remoteStreamRemoved(event);
134
+        } else {
135
+            // This is a recvonly stream. Clients that implement Unified Plan,
136
+            // such as Firefox use recvonly "streams/channels/tracks" for
137
+            // receiving remote stream/tracks, as opposed to Plan B where there
138
+            // are only 3 channels: audio, video and data.
139
+            logger.log("RECVONLY REMOTE STREAM IGNORED: " + event.stream + " - " + event.stream.id);
140
+        }
134 141
     };
135 142
     this.peerconnection.onsignalingstatechange = function (event) {
136 143
         if (!(self && self.peerconnection)) return;
@@ -1381,6 +1388,20 @@ JingleSessionPC.prototype.remoteStreamAdded = function (data, times) {
1381 1388
     }
1382 1389
 }
1383 1390
 
1391
+/**
1392
+ * Handles remote stream removal.
1393
+ * @param event The event object associated with the removal.
1394
+ */
1395
+JingleSessionPC.prototype.remoteStreamRemoved = function (event) {
1396
+    var thessrc;
1397
+    var streamId = RTC.getStreamID(event.stream);
1398
+    if (!streamId) {
1399
+        logger.error("No stream ID for", event.stream);
1400
+    } else if (streamId && streamId.indexOf('mixedmslabel') === -1) {
1401
+        this.room.eventEmitter.emit(XMPPEvents.REMOTE_STREAM_REMOVED, streamId);
1402
+    }
1403
+}
1404
+
1384 1405
 /**
1385 1406
  * Returns the ice connection state for the peer connection.
1386 1407
  * @returns the ice connection state for the peer connection.

+ 4
- 0
service/xmpp/XMPPEvents.js ファイルの表示

@@ -85,6 +85,10 @@ var XMPPEvents = {
85 85
     READY_TO_JOIN: 'xmpp.ready_to_join',
86 86
     FOCUS_LEFT: "xmpp.focus_left",
87 87
     REMOTE_STREAM_RECEIVED: "xmpp.remote_stream_received",
88
+    /**
89
+     * Indicates that remote stream has been removed from the conference.
90
+     */
91
+    REMOTE_STREAM_REMOVED: "xmpp.remote_stream_removed",
88 92
     /**
89 93
      * Indicates that recording state changed.
90 94
      */

読み込み中…
キャンセル
保存