浏览代码

Makes sure we add/remove all onended events for media streams in one central place.

master
damencho 10 年前
父节点
当前提交
1ba0a182f6

+ 6
- 3
modules/RTC/LocalStream.js 查看文件

@@ -39,9 +39,12 @@ function LocalStream(stream, type, eventEmitter, videoType, isGUMStream) {
39 39
         };
40 40
     }
41 41
 
42
-    this.stream.onended = function () {
43
-        self.streamEnded();
44
-    };
42
+    APP.RTC.addMediaStreamInactiveHandler(
43
+        this.stream,
44
+        function () {
45
+            self.streamEnded();
46
+        });
47
+
45 48
     if (RTCBrowserType.isFirefox()) {
46 49
         implementOnEndedHandling(this.stream);
47 50
     }

+ 31
- 0
modules/RTC/RTC.js 查看文件

@@ -266,6 +266,7 @@ var RTC = {
266 266
     /**
267 267
      * A method to handle stopping of the stream.
268 268
      * One point to handle the differences in various implementations.
269
+     * @param mediaStream MediaStream object to stop.
269 270
      */
270 271
     stopMediaStream: function (mediaStream) {
271 272
         mediaStream.getAudioTracks().forEach(function (track) {
@@ -285,6 +286,36 @@ var RTC = {
285 286
         if (mediaStream.stop) {
286 287
             mediaStream.stop();
287 288
         }
289
+    },
290
+    /**
291
+     * Adds onended handler to a MediaStream.
292
+     * @param mediaStream a MediaStream to attach onended handler
293
+     * @param handler the handler
294
+     */
295
+    addMediaStreamInactiveHandler: function (mediaStream, handler) {
296
+        if (mediaStream.addEventListener) {
297
+            // chrome
298
+            mediaStream.onended = handler;
299
+        } else {
300
+            // themasys
301
+            mediaStream.attachEvent('ended', function () {
302
+                handler(mediaStream);
303
+            });
304
+        }
305
+    },
306
+    /**
307
+     * Removes onended handler.
308
+     * @param mediaStream the MediaStream to remove the handler from.
309
+     * @param handler the handler to remove.
310
+     */
311
+    removeMediaStreamInactiveHandler: function (mediaStream, handler) {
312
+        if (mediaStream.removeEventListener) {
313
+            // chrome
314
+            mediaStream.onended = null;
315
+        } else {
316
+            // themasys
317
+            mediaStream.detachEvent('ended', handler);
318
+        }
288 319
     }
289 320
 };
290 321
 

+ 3
- 2
modules/UI/videolayout/LocalVideo.js 查看文件

@@ -208,13 +208,14 @@ LocalVideo.prototype.changeVideo = function (stream, isMuted) {
208 208
     APP.RTC.attachMediaStream(localVideoSelector, stream.getOriginalStream());
209 209
 
210 210
     // Add stream ended handler
211
-    stream.getOriginalStream().onended = function () {
211
+    APP.RTC.addMediaStreamInactiveHandler(
212
+        stream.getOriginalStream(), function () {
212 213
         // We have to re-select after attach when Temasys plugin is used,
213 214
         // because <video> element is replaced with <object>
214 215
         localVideo = $('#' + localVideo.id)[0];
215 216
         localVideoContainer.removeChild(localVideo);
216 217
         self.VideoLayout.updateRemovedVideo(APP.xmpp.myResource());
217
-    };
218
+    });
218 219
 };
219 220
 
220 221
 LocalVideo.prototype.joined = function (jid) {

+ 5
- 5
modules/UI/videolayout/RemoteVideo.js 查看文件

@@ -229,12 +229,12 @@ RemoteVideo.prototype.addRemoteStreamElement = function (stream) {
229 229
         APP.RTC.attachMediaStream(sel, stream);
230 230
     }
231 231
 
232
-    stream.onended = function () {
233
-        console.log('stream ended', this);
232
+    APP.RTC.addMediaStreamInactiveHandler(
233
+        stream, function () {
234
+            console.log('stream ended', this);
234 235
 
235
-        self.removeRemoteStreamElement(stream, isVideo, newElementId);
236
-
237
-    };
236
+            self.removeRemoteStreamElement(stream, isVideo, newElementId);
237
+    });
238 238
 
239 239
     // Add click handler.
240 240
     var onClickHandler = function (event) {

+ 4
- 16
modules/desktopsharing/desktopsharing.js 查看文件

@@ -54,12 +54,8 @@ function onEndedHandler(stream) {
54 54
     if (!switchInProgress && isUsingScreenStream) {
55 55
         APP.desktopsharing.toggleScreenSharing();
56 56
     }
57
-    //FIXME: to be verified
58
-    if (stream.removeEventListener) {
59
-        stream.removeEventListener('ended', onEndedHandler);
60
-    } else {
61
-        stream.detachEvent('ended', onEndedHandler);
62
-    }
57
+
58
+    APP.RTC.removeMediaStreamInactiveHandler(stream, onEndedHandler);
63 59
 }
64 60
 
65 61
 module.exports = {
@@ -113,16 +109,8 @@ module.exports = {
113 109
                     isUsingScreenStream = true;
114 110
                     // Hook 'ended' event to restore camera
115 111
                     // when screen stream stops
116
-                    //FIXME: to be verified
117
-                    if (stream.addEventListener) {
118
-                        stream.addEventListener('ended', function () {
119
-                            onEndedHandler(stream);
120
-                        });
121
-                    } else {
122
-                        stream.attachEvent('ended', function () {
123
-                            onEndedHandler(stream);
124
-                        });
125
-                    }
112
+                    APP.RTC.addMediaStreamInactiveHandler(
113
+                        stream, onEndedHandler);
126 114
                     newStreamCreated(stream);
127 115
                 },
128 116
                 getDesktopStreamFailed);

正在加载...
取消
保存