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:
Mike Keesey 2015-04-14 16:32:47 -06:00 committed by Mike Keesey
parent adb1c572ed
commit 0fdf5e0102
3 changed files with 1283 additions and 106 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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) {

View File

@ -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": {
},