Fix stream end/start race condition
We need to queue attempts to call modifySources to prevent errors in setLocalDescription, et al. We need to let the asynchronous function flow in modifySources finish before we kick off another set.
This commit is contained in:
parent
adb1c572ed
commit
0fdf5e0102
1351
libs/app.bundle.js
1351
libs/app.bundle.js
File diff suppressed because it is too large
Load Diff
|
@ -4,6 +4,7 @@ var SDPDiffer = require("./SDPDiffer");
|
|||
var SDPUtil = require("./SDPUtil");
|
||||
var SDP = require("./SDP");
|
||||
var RTCBrowserType = require("../../service/RTC/RTCBrowserType");
|
||||
var async = require("async");
|
||||
|
||||
// Jingle stuff
|
||||
function JingleSession(me, sid, connection, service) {
|
||||
|
@ -52,6 +53,7 @@ function JingleSession(me, sid, connection, service) {
|
|||
* by the application logic.
|
||||
*/
|
||||
this.videoMuteByUser = false;
|
||||
this.modifySourcesQueue = async.queue(this._modifySources.bind(this), 1);
|
||||
}
|
||||
|
||||
//TODO: this array must be removed when firefox implement multistream support
|
||||
|
@ -774,7 +776,7 @@ JingleSession.prototype.addSource = function (elem, fromJid) {
|
|||
});
|
||||
sdp.raw = sdp.session + sdp.media.join('');
|
||||
});
|
||||
this.modifySources();
|
||||
this.modifySourcesQueue.push();
|
||||
};
|
||||
|
||||
JingleSession.prototype.removeSource = function (elem, fromJid) {
|
||||
|
@ -835,11 +837,12 @@ JingleSession.prototype.removeSource = function (elem, fromJid) {
|
|||
});
|
||||
sdp.raw = sdp.session + sdp.media.join('');
|
||||
});
|
||||
this.modifySources();
|
||||
this.modifySourcesQueue.push();
|
||||
};
|
||||
|
||||
JingleSession.prototype.modifySources = function (successCallback) {
|
||||
JingleSession.prototype._modifySources = function (successCallback, queueCallback) {
|
||||
var self = this;
|
||||
|
||||
if (this.peerconnection.signalingState == 'closed') return;
|
||||
if (!(this.addssrc.length || this.removessrc.length || this.pendingop !== null || this.switchstreams)){
|
||||
// There is nothing to do since scheduled job might have been executed by another succeeding call
|
||||
|
@ -847,21 +850,7 @@ JingleSession.prototype.modifySources = function (successCallback) {
|
|||
if(successCallback){
|
||||
successCallback();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// FIXME: this is a big hack
|
||||
// https://code.google.com/p/webrtc/issues/detail?id=2688
|
||||
// ^ has been fixed.
|
||||
if (!(this.peerconnection.signalingState == 'stable' && this.peerconnection.iceConnectionState == 'connected')) {
|
||||
console.warn('modifySources not yet', this.peerconnection.signalingState, this.peerconnection.iceConnectionState);
|
||||
this.wait = true;
|
||||
window.setTimeout(function() { self.modifySources(successCallback); }, 250);
|
||||
return;
|
||||
}
|
||||
if (this.wait) {
|
||||
window.setTimeout(function() { self.modifySources(successCallback); }, 2500);
|
||||
this.wait = false;
|
||||
queueCallback();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -901,6 +890,7 @@ JingleSession.prototype.modifySources = function (successCallback) {
|
|||
|
||||
if(self.signalingState == 'closed') {
|
||||
console.error("createAnswer attempt on closed state");
|
||||
queueCallback("createAnswer attempt on closed state");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -937,23 +927,28 @@ JingleSession.prototype.modifySources = function (successCallback) {
|
|||
if(successCallback){
|
||||
successCallback();
|
||||
}
|
||||
queueCallback();
|
||||
},
|
||||
function(error) {
|
||||
console.error('modified setLocalDescription failed', error);
|
||||
queueCallback(error);
|
||||
}
|
||||
);
|
||||
},
|
||||
function(error) {
|
||||
console.error('modified answer failed', error);
|
||||
queueCallback(error);
|
||||
}
|
||||
);
|
||||
},
|
||||
function(error) {
|
||||
console.error('modify failed', error);
|
||||
queueCallback(error);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Switches video streams.
|
||||
* @param new_stream new stream that will be used as video of this session.
|
||||
|
@ -984,7 +979,7 @@ JingleSession.prototype.switchStreams = function (new_stream, oldStream, success
|
|||
}
|
||||
|
||||
self.switchstreams = true;
|
||||
self.modifySources(function() {
|
||||
self.modifySourcesQueue.push(function() {
|
||||
console.log('modify sources done');
|
||||
|
||||
success_callback();
|
||||
|
@ -1092,7 +1087,7 @@ JingleSession.prototype.setVideoMute = function (mute, callback, options) {
|
|||
|
||||
this.hardMuteVideo(mute);
|
||||
|
||||
this.modifySources(callback(mute));
|
||||
this.modifySourcesQueue.push(callback(mute));
|
||||
};
|
||||
|
||||
JingleSession.prototype.hardMuteVideo = function (muted) {
|
||||
|
|
|
@ -19,7 +19,8 @@
|
|||
"pako": "*",
|
||||
"i18next-client": "1.7.7",
|
||||
"sdp-interop": "jitsi/sdp-interop#f65fedfe57a",
|
||||
"sdp-transform": "1.3.0"
|
||||
"sdp-transform": "1.3.0",
|
||||
"async": "0.9.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue