diff --git a/modules/RTC/LocalStream.js b/modules/RTC/LocalStream.js index bc1a2438b..bf30305f1 100644 --- a/modules/RTC/LocalStream.js +++ b/modules/RTC/LocalStream.js @@ -1,7 +1,8 @@ /* global APP */ -var StreamEventTypes = require("../../service/RTC/StreamEventTypes.js"); +var MediaStreamType = require("../../service/RTC/MediaStreamTypes"); var RTCEvents = require("../../service/RTC/RTCEvents"); var RTCBrowserType = require("./RTCBrowserType"); +var StreamEventTypes = require("../../service/RTC/StreamEventTypes.js"); /** * This implements 'onended' callback normally fired by WebRTC after the stream @@ -29,7 +30,7 @@ function LocalStream(stream, type, eventEmitter, videoType, isGUMStream) { if(isGUMStream === false) this.isGUMStream = isGUMStream; var self = this; - if(type == "audio") { + if (MediaStreamType.AUDIO_TYPE === type) { this.getTracks = function () { return self.stream.getAudioTracks(); }; @@ -60,7 +61,11 @@ LocalStream.prototype.getOriginalStream = function() }; LocalStream.prototype.isAudioStream = function () { - return this.type === "audio"; + return MediaStreamType.AUDIO_TYPE === this.type; +}; + +LocalStream.prototype.isVideoStream = function () { + return MediaStreamType.VIDEO_TYPE === this.type; }; LocalStream.prototype.setMute = function (mute) diff --git a/modules/RTC/MediaStream.js b/modules/RTC/MediaStream.js index c5e3ca7f1..fc500781e 100644 --- a/modules/RTC/MediaStream.js +++ b/modules/RTC/MediaStream.js @@ -11,7 +11,7 @@ var MediaStreamType = require("../../service/RTC/MediaStreamTypes"); * * @constructor */ -function MediaStream(data, ssrc, browser, eventEmitter, muted) { +function MediaStream(data, ssrc, browser, eventEmitter, muted, type) { // XXX(gp) to minimize headaches in the future, we should build our // abstractions around tracks and not streams. ORTC is track based API. @@ -23,18 +23,29 @@ function MediaStream(data, ssrc, browser, eventEmitter, muted) { // Also, we should be able to associate multiple SSRCs with a MediaTrack as // a track might have an associated RTX and FEC sources. + if (!type) { + console.log("Errrm...some code needs an update..."); + } + this.stream = data.stream; this.peerjid = data.peerjid; this.videoType = data.videoType; this.ssrc = ssrc; - this.type = (this.stream.getVideoTracks().length > 0)? - MediaStreamType.VIDEO_TYPE : MediaStreamType.AUDIO_TYPE; + this.type = type; this.muted = muted; this.eventEmitter = eventEmitter; } +// FIXME duplicated with LocalStream methods - extract base class +MediaStream.prototype.isAudioStream = function () { + return MediaStreamType.AUDIO_TYPE === this.type; +}; -MediaStream.prototype.getOriginalStream = function() { +MediaStream.prototype.isVideoStream = function () { + return MediaStreamType.VIDEO_TYPE === this.type; +}; + +MediaStream.prototype.getOriginalStream = function () { return this.stream; }; diff --git a/modules/RTC/RTC.js b/modules/RTC/RTC.js index 59e4e1e34..6274a6ed6 100644 --- a/modules/RTC/RTC.js +++ b/modules/RTC/RTC.js @@ -76,7 +76,7 @@ var RTC = { if(isMuted === true) localStream.setMute(true); - if(type == "audio") { + if (MediaStreamType.AUDIO_TYPE === type) { this.localAudio = localStream; } else { this.localVideo = localStream; @@ -98,16 +98,27 @@ var RTC = { muted = pres.videoMuted; } - var remoteStream = new MediaStream(data, ssrc, - RTCBrowserType.getBrowserType(), eventEmitter, muted); + var self = this; + [MediaStreamType.AUDIO_TYPE, MediaStreamType.VIDEO_TYPE].forEach( + function (type) { + var tracks = + type == MediaStreamType.AUDIO_TYPE + ? data.stream.getAudioTracks() : data.stream.getVideoTracks(); + if (!tracks || !Array.isArray(tracks) || !tracks.length) { + console.log("Not creating a(n) " + type + " stream: no tracks"); + return; + } - if(!this.remoteStreams[jid]) { - this.remoteStreams[jid] = {}; - } - this.remoteStreams[jid][remoteStream.type]= remoteStream; - eventEmitter.emit(StreamEventTypes.EVENT_TYPE_REMOTE_CREATED, - remoteStream); - return remoteStream; + var remoteStream = new MediaStream(data, ssrc, + RTCBrowserType.getBrowserType(), eventEmitter, muted, type); + + if (!self.remoteStreams[jid]) { + self.remoteStreams[jid] = {}; + } + self.remoteStreams[jid][type] = remoteStream; + eventEmitter.emit(StreamEventTypes.EVENT_TYPE_REMOTE_CREATED, + remoteStream); + }); }, getPCConstraints: function () { return this.rtcUtils.pc_constraints; @@ -218,7 +229,9 @@ var RTC = { changeLocalAudio: function (stream, callback) { var oldStream = this.localAudio.getOriginalStream(); var newStream = this.rtcUtils.createStream(stream); - this.localAudio = this.createLocalStream(newStream, "audio", true); + this.localAudio + = this.createLocalStream( + newStream, MediaStreamType.AUDIO_TYPE, true); // Stop the stream this.stopMediaStream(oldStream); APP.xmpp.switchStreams(newStream, oldStream, callback, true); diff --git a/modules/RTC/RTCUtils.js b/modules/RTC/RTCUtils.js index e8448ae7a..d316e3cb3 100644 --- a/modules/RTC/RTCUtils.js +++ b/modules/RTC/RTCUtils.js @@ -2,6 +2,7 @@ RTCPeerConnection, webkitMediaStream, webkitURL, webkitRTCPeerConnection, mozRTCIceCandidate, mozRTCSessionDescription, mozRTCPeerConnection */ /* jshint -W101 */ +var MediaStreamType = require("../../service/RTC/MediaStreamTypes"); var RTCBrowserType = require("./RTCBrowserType"); var Resolutions = require("../../service/RTC/Resolutions"); var AdapterJS = require("./adapter.screenshare"); @@ -523,10 +524,12 @@ RTCUtils.prototype.handleLocalStream = function(stream, usageOptions) { videoGUM = (!usageOptions || usageOptions.video !== false); - this.service.createLocalStream(audioStream, "audio", null, null, + this.service.createLocalStream( + audioStream, MediaStreamType.AUDIO_TYPE, null, null, audioMuted, audioGUM); - this.service.createLocalStream(videoStream, "video", null, 'camera', + this.service.createLocalStream( + videoStream, MediaStreamType.VIDEO_TYPE, null, 'camera', videoMuted, videoGUM); }; diff --git a/modules/UI/UI.js b/modules/UI/UI.js index 62bcd0a17..95e4870eb 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -26,6 +26,7 @@ var JitsiPopover = require("./util/JitsiPopover"); var CQEvents = require("../../service/connectionquality/CQEvents"); var DesktopSharingEventTypes = require("../../service/desktopsharing/DesktopSharingEventTypes"); +var MediaStreamType = require("../../service/RTC/MediaStreamTypes"); var RTCEvents = require("../../service/RTC/RTCEvents"); var RTCBrowserType = require("../RTC/RTCBrowserType"); var StreamEventTypes = require("../../service/RTC/StreamEventTypes"); @@ -111,14 +112,14 @@ function setupToolbars() { function streamHandler(stream, isMuted) { switch (stream.type) { - case "audio": + case MediaStreamType.AUDIO_TYPE: VideoLayout.changeLocalAudio(stream, isMuted); break; - case "video": + case MediaStreamType.VIDEO_TYPE: VideoLayout.changeLocalVideo(stream, isMuted); break; - case "stream": - VideoLayout.changeLocalStream(stream, isMuted); + default: + console.error("Unknown stream type: " + stream.type); break; } } diff --git a/modules/UI/videolayout/LargeVideo.js b/modules/UI/videolayout/LargeVideo.js index f3de0764a..20485c81a 100644 --- a/modules/UI/videolayout/LargeVideo.js +++ b/modules/UI/videolayout/LargeVideo.js @@ -302,7 +302,8 @@ function createLargeVideoHTML() '' + '' + '