Narrows the gap between strophe.jingle and our code.
This commit is contained in:
parent
dc5d5f8436
commit
1938280e27
|
@ -7,30 +7,6 @@ function TraceablePeerConnection(ice_config, constraints) {
|
||||||
this.statsinterval = null;
|
this.statsinterval = null;
|
||||||
this.maxstats = 0; // limit to 300 values, i.e. 5 minutes; set to 0 to disable
|
this.maxstats = 0; // limit to 300 values, i.e. 5 minutes; set to 0 to disable
|
||||||
|
|
||||||
/**
|
|
||||||
* Array of ssrcs that will be added on next modifySources call.
|
|
||||||
* @type {Array}
|
|
||||||
*/
|
|
||||||
this.addssrc = [];
|
|
||||||
/**
|
|
||||||
* Array of ssrcs that will be added on next modifySources call.
|
|
||||||
* @type {Array}
|
|
||||||
*/
|
|
||||||
this.removessrc = [];
|
|
||||||
/**
|
|
||||||
* Pending operation that will be done during modifySources call.
|
|
||||||
* Currently 'mute'/'unmute' operations are supported.
|
|
||||||
*
|
|
||||||
* @type {String}
|
|
||||||
*/
|
|
||||||
this.pendingop = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flag indicates that peer connection stream have changed and modifySources should proceed.
|
|
||||||
* @type {boolean}
|
|
||||||
*/
|
|
||||||
this.switchstreams = false;
|
|
||||||
|
|
||||||
// override as desired
|
// override as desired
|
||||||
this.trace = function (what, info) {
|
this.trace = function (what, info) {
|
||||||
//console.warn('WTRACE', what, info);
|
//console.warn('WTRACE', what, info);
|
||||||
|
@ -213,232 +189,6 @@ TraceablePeerConnection.prototype.setRemoteDescription = function (description,
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
TraceablePeerConnection.prototype.hardMuteVideo = function (muted) {
|
|
||||||
this.pendingop = muted ? 'mute' : 'unmute';
|
|
||||||
};
|
|
||||||
|
|
||||||
TraceablePeerConnection.prototype.enqueueAddSsrc = function(channel, ssrcLines) {
|
|
||||||
if (!this.addssrc[channel]) {
|
|
||||||
this.addssrc[channel] = '';
|
|
||||||
}
|
|
||||||
this.addssrc[channel] += ssrcLines;
|
|
||||||
};
|
|
||||||
|
|
||||||
TraceablePeerConnection.prototype.addSource = function (elem) {
|
|
||||||
console.log('addssrc', new Date().getTime());
|
|
||||||
console.log('ice', this.iceConnectionState);
|
|
||||||
var sdp = new SDP(this.remoteDescription.sdp);
|
|
||||||
var mySdp = new SDP(this.peerconnection.localDescription.sdp);
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
$(elem).each(function (idx, content) {
|
|
||||||
var name = $(content).attr('name');
|
|
||||||
var lines = '';
|
|
||||||
tmp = $(content).find('ssrc-group[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]').each(function() {
|
|
||||||
var semantics = this.getAttribute('semantics');
|
|
||||||
var ssrcs = $(this).find('>source').map(function () {
|
|
||||||
return this.getAttribute('ssrc');
|
|
||||||
}).get();
|
|
||||||
|
|
||||||
if (ssrcs.length != 0) {
|
|
||||||
lines += 'a=ssrc-group:' + semantics + ' ' + ssrcs.join(' ') + '\r\n';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
tmp = $(content).find('source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'); // can handle both >source and >description>source
|
|
||||||
tmp.each(function () {
|
|
||||||
var ssrc = $(this).attr('ssrc');
|
|
||||||
if(mySdp.containsSSRC(ssrc)){
|
|
||||||
/**
|
|
||||||
* This happens when multiple participants change their streams at the same time and
|
|
||||||
* ColibriFocus.modifySources have to wait for stable state. In the meantime multiple
|
|
||||||
* addssrc are scheduled for update IQ. See
|
|
||||||
*/
|
|
||||||
console.warn("Got add stream request for my own ssrc: "+ssrc);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$(this).find('>parameter').each(function () {
|
|
||||||
lines += 'a=ssrc:' + ssrc + ' ' + $(this).attr('name');
|
|
||||||
if ($(this).attr('value') && $(this).attr('value').length)
|
|
||||||
lines += ':' + $(this).attr('value');
|
|
||||||
lines += '\r\n';
|
|
||||||
});
|
|
||||||
});
|
|
||||||
sdp.media.forEach(function(media, idx) {
|
|
||||||
if (!SDPUtil.find_line(media, 'a=mid:' + name))
|
|
||||||
return;
|
|
||||||
sdp.media[idx] += lines;
|
|
||||||
self.enqueueAddSsrc(idx, lines);
|
|
||||||
});
|
|
||||||
sdp.raw = sdp.session + sdp.media.join('');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
TraceablePeerConnection.prototype.enqueueRemoveSsrc = function(channel, ssrcLines) {
|
|
||||||
if (!this.removessrc[channel]){
|
|
||||||
this.removessrc[channel] = '';
|
|
||||||
}
|
|
||||||
this.removessrc[channel] += ssrcLines;
|
|
||||||
};
|
|
||||||
|
|
||||||
TraceablePeerConnection.prototype.removeSource = function (elem) {
|
|
||||||
console.log('removessrc', new Date().getTime());
|
|
||||||
console.log('ice', this.iceConnectionState);
|
|
||||||
var sdp = new SDP(this.remoteDescription.sdp);
|
|
||||||
var mySdp = new SDP(this.peerconnection.localDescription.sdp);
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
$(elem).each(function (idx, content) {
|
|
||||||
var name = $(content).attr('name');
|
|
||||||
var lines = '';
|
|
||||||
tmp = $(content).find('ssrc-group[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]').each(function() {
|
|
||||||
var semantics = this.getAttribute('semantics');
|
|
||||||
var ssrcs = $(this).find('>source').map(function () {
|
|
||||||
return this.getAttribute('ssrc');
|
|
||||||
}).get();
|
|
||||||
|
|
||||||
if (ssrcs.length != 0) {
|
|
||||||
lines += 'a=ssrc-group:' + semantics + ' ' + ssrcs.join(' ') + '\r\n';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
tmp = $(content).find('source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'); // can handle both >source and >description>source
|
|
||||||
tmp.each(function () {
|
|
||||||
var ssrc = $(this).attr('ssrc');
|
|
||||||
// This should never happen, but can be useful for bug detection
|
|
||||||
if(mySdp.containsSSRC(ssrc)){
|
|
||||||
console.error("Got remove stream request for my own ssrc: "+ssrc);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$(this).find('>parameter').each(function () {
|
|
||||||
lines += 'a=ssrc:' + ssrc + ' ' + $(this).attr('name');
|
|
||||||
if ($(this).attr('value') && $(this).attr('value').length)
|
|
||||||
lines += ':' + $(this).attr('value');
|
|
||||||
lines += '\r\n';
|
|
||||||
});
|
|
||||||
});
|
|
||||||
sdp.media.forEach(function(media, idx) {
|
|
||||||
if (!SDPUtil.find_line(media, 'a=mid:' + name))
|
|
||||||
return;
|
|
||||||
sdp.media[idx] += lines;
|
|
||||||
self.enqueueRemoveSsrc(idx, lines);
|
|
||||||
});
|
|
||||||
sdp.raw = sdp.session + sdp.media.join('');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
TraceablePeerConnection.prototype.modifySources = function(successCallback) {
|
|
||||||
var self = this;
|
|
||||||
if (this.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
|
|
||||||
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.signalingState == 'stable' && this.iceConnectionState == 'connected')) {
|
|
||||||
console.warn('modifySources not yet', this.signalingState, this.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;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset switch streams flag
|
|
||||||
this.switchstreams = false;
|
|
||||||
|
|
||||||
var sdp = new SDP(this.remoteDescription.sdp);
|
|
||||||
|
|
||||||
// add sources
|
|
||||||
this.addssrc.forEach(function(lines, idx) {
|
|
||||||
sdp.media[idx] += lines;
|
|
||||||
});
|
|
||||||
this.addssrc = [];
|
|
||||||
|
|
||||||
// remove sources
|
|
||||||
this.removessrc.forEach(function(lines, idx) {
|
|
||||||
lines = lines.split('\r\n');
|
|
||||||
lines.pop(); // remove empty last element;
|
|
||||||
lines.forEach(function(line) {
|
|
||||||
sdp.media[idx] = sdp.media[idx].replace(line + '\r\n', '');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
this.removessrc = [];
|
|
||||||
|
|
||||||
// FIXME:
|
|
||||||
// this was a hack for the situation when only one peer exists
|
|
||||||
// in the conference.
|
|
||||||
// check if still required and remove
|
|
||||||
if (sdp.media[0])
|
|
||||||
sdp.media[0] = sdp.media[0].replace('a=recvonly', 'a=sendrecv');
|
|
||||||
if (sdp.media[1])
|
|
||||||
sdp.media[1] = sdp.media[1].replace('a=recvonly', 'a=sendrecv');
|
|
||||||
|
|
||||||
sdp.raw = sdp.session + sdp.media.join('');
|
|
||||||
this.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp.raw}),
|
|
||||||
function() {
|
|
||||||
|
|
||||||
if(self.signalingState == 'closed') {
|
|
||||||
console.error("createAnswer attempt on closed state");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.createAnswer(
|
|
||||||
function(modifiedAnswer) {
|
|
||||||
// change video direction, see https://github.com/jitsi/jitmeet/issues/41
|
|
||||||
if (self.pendingop !== null) {
|
|
||||||
var sdp = new SDP(modifiedAnswer.sdp);
|
|
||||||
if (sdp.media.length > 1) {
|
|
||||||
switch(self.pendingop) {
|
|
||||||
case 'mute':
|
|
||||||
sdp.media[1] = sdp.media[1].replace('a=sendrecv', 'a=recvonly');
|
|
||||||
break;
|
|
||||||
case 'unmute':
|
|
||||||
sdp.media[1] = sdp.media[1].replace('a=recvonly', 'a=sendrecv');
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sdp.raw = sdp.session + sdp.media.join('');
|
|
||||||
modifiedAnswer.sdp = sdp.raw;
|
|
||||||
}
|
|
||||||
self.pendingop = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: pushing down an answer while ice connection state
|
|
||||||
// is still checking is bad...
|
|
||||||
//console.log(self.peerconnection.iceConnectionState);
|
|
||||||
|
|
||||||
// trying to work around another chrome bug
|
|
||||||
//modifiedAnswer.sdp = modifiedAnswer.sdp.replace(/a=setup:active/g, 'a=setup:actpass');
|
|
||||||
self.setLocalDescription(modifiedAnswer,
|
|
||||||
function() {
|
|
||||||
//console.log('modified setLocalDescription ok');
|
|
||||||
if(successCallback){
|
|
||||||
successCallback();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
function(error) {
|
|
||||||
console.error('modified setLocalDescription failed', error);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
function(error) {
|
|
||||||
console.error('modified answer failed', error);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
function(error) {
|
|
||||||
console.error('modify failed', error);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
TraceablePeerConnection.prototype.close = function () {
|
TraceablePeerConnection.prototype.close = function () {
|
||||||
this.trace('stop');
|
this.trace('stop');
|
||||||
if (this.statsinterval !== null) {
|
if (this.statsinterval !== null) {
|
||||||
|
|
|
@ -33,6 +33,11 @@ function JingleSession(me, sid, connection) {
|
||||||
|
|
||||||
this.reason = null;
|
this.reason = null;
|
||||||
|
|
||||||
|
this.addssrc = [];
|
||||||
|
this.removessrc = [];
|
||||||
|
this.pendingop = null;
|
||||||
|
this.switchstreams = false;
|
||||||
|
|
||||||
this.wait = true;
|
this.wait = true;
|
||||||
this.localStreamsSSRC = null;
|
this.localStreamsSSRC = null;
|
||||||
|
|
||||||
|
@ -680,8 +685,52 @@ JingleSession.prototype.addSource = function (elem, fromJid) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.peerconnection.addSource(elem);
|
console.log('addssrc', new Date().getTime());
|
||||||
|
console.log('ice', this.peerconnection.iceConnectionState);
|
||||||
|
var sdp = new SDP(this.peerconnection.remoteDescription.sdp);
|
||||||
|
var mySdp = new SDP(this.peerconnection.localDescription.sdp);
|
||||||
|
|
||||||
|
$(elem).each(function (idx, content) {
|
||||||
|
var name = $(content).attr('name');
|
||||||
|
var lines = '';
|
||||||
|
tmp = $(content).find('ssrc-group[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]').each(function() {
|
||||||
|
var semantics = this.getAttribute('semantics');
|
||||||
|
var ssrcs = $(this).find('>source').map(function () {
|
||||||
|
return this.getAttribute('ssrc');
|
||||||
|
}).get();
|
||||||
|
|
||||||
|
if (ssrcs.length != 0) {
|
||||||
|
lines += 'a=ssrc-group:' + semantics + ' ' + ssrcs.join(' ') + '\r\n';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
tmp = $(content).find('source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'); // can handle both >source and >description>source
|
||||||
|
tmp.each(function () {
|
||||||
|
var ssrc = $(this).attr('ssrc');
|
||||||
|
if(mySdp.containsSSRC(ssrc)){
|
||||||
|
/**
|
||||||
|
* This happens when multiple participants change their streams at the same time and
|
||||||
|
* ColibriFocus.modifySources have to wait for stable state. In the meantime multiple
|
||||||
|
* addssrc are scheduled for update IQ. See
|
||||||
|
*/
|
||||||
|
console.warn("Got add stream request for my own ssrc: "+ssrc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$(this).find('>parameter').each(function () {
|
||||||
|
lines += 'a=ssrc:' + ssrc + ' ' + $(this).attr('name');
|
||||||
|
if ($(this).attr('value') && $(this).attr('value').length)
|
||||||
|
lines += ':' + $(this).attr('value');
|
||||||
|
lines += '\r\n';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
sdp.media.forEach(function(media, idx) {
|
||||||
|
if (!SDPUtil.find_line(media, 'a=mid:' + name))
|
||||||
|
return;
|
||||||
|
sdp.media[idx] += lines;
|
||||||
|
if (!self.addssrc[idx]) self.addssrc[idx] = '';
|
||||||
|
self.addssrc[idx] += lines;
|
||||||
|
});
|
||||||
|
sdp.raw = sdp.session + sdp.media.join('');
|
||||||
|
});
|
||||||
this.modifySources();
|
this.modifySources();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -701,20 +750,165 @@ JingleSession.prototype.removeSource = function (elem, fromJid) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.peerconnection.removeSource(elem);
|
console.log('removessrc', new Date().getTime());
|
||||||
|
console.log('ice', this.peerconnection.iceConnectionState);
|
||||||
|
var sdp = new SDP(this.peerconnection.remoteDescription.sdp);
|
||||||
|
var mySdp = new SDP(this.peerconnection.localDescription.sdp);
|
||||||
|
|
||||||
|
$(elem).each(function (idx, content) {
|
||||||
|
var name = $(content).attr('name');
|
||||||
|
var lines = '';
|
||||||
|
tmp = $(content).find('ssrc-group[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]').each(function() {
|
||||||
|
var semantics = this.getAttribute('semantics');
|
||||||
|
var ssrcs = $(this).find('>source').map(function () {
|
||||||
|
return this.getAttribute('ssrc');
|
||||||
|
}).get();
|
||||||
|
|
||||||
|
if (ssrcs.length != 0) {
|
||||||
|
lines += 'a=ssrc-group:' + semantics + ' ' + ssrcs.join(' ') + '\r\n';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
tmp = $(content).find('source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]'); // can handle both >source and >description>source
|
||||||
|
tmp.each(function () {
|
||||||
|
var ssrc = $(this).attr('ssrc');
|
||||||
|
// This should never happen, but can be useful for bug detection
|
||||||
|
if(mySdp.containsSSRC(ssrc)){
|
||||||
|
console.error("Got remove stream request for my own ssrc: "+ssrc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$(this).find('>parameter').each(function () {
|
||||||
|
lines += 'a=ssrc:' + ssrc + ' ' + $(this).attr('name');
|
||||||
|
if ($(this).attr('value') && $(this).attr('value').length)
|
||||||
|
lines += ':' + $(this).attr('value');
|
||||||
|
lines += '\r\n';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
sdp.media.forEach(function(media, idx) {
|
||||||
|
if (!SDPUtil.find_line(media, 'a=mid:' + name))
|
||||||
|
return;
|
||||||
|
sdp.media[idx] += lines;
|
||||||
|
if (!self.removessrc[idx]) self.removessrc[idx] = '';
|
||||||
|
self.removessrc[idx] += lines;
|
||||||
|
});
|
||||||
|
sdp.raw = sdp.session + sdp.media.join('');
|
||||||
|
});
|
||||||
this.modifySources();
|
this.modifySources();
|
||||||
};
|
};
|
||||||
|
|
||||||
JingleSession.prototype.modifySources = function (successCallback) {
|
JingleSession.prototype.modifySources = function (successCallback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
if(this.peerconnection)
|
if (this.peerconnection.signalingState == 'closed') return;
|
||||||
this.peerconnection.modifySources(function(){
|
if (!(this.addssrc.length || this.removessrc.length || this.pendingop !== null || this.switchstreams)){
|
||||||
$(document).trigger('setLocalDescription.jingle', [self.sid]);
|
// There is nothing to do since scheduled job might have been executed by another succeeding call
|
||||||
if(successCallback) {
|
$(document).trigger('setLocalDescription.jingle', [self.sid]);
|
||||||
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;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset switch streams flag
|
||||||
|
this.switchstreams = false;
|
||||||
|
|
||||||
|
var sdp = new SDP(this.peerconnection.remoteDescription.sdp);
|
||||||
|
|
||||||
|
// add sources
|
||||||
|
this.addssrc.forEach(function(lines, idx) {
|
||||||
|
sdp.media[idx] += lines;
|
||||||
|
});
|
||||||
|
this.addssrc = [];
|
||||||
|
|
||||||
|
// remove sources
|
||||||
|
this.removessrc.forEach(function(lines, idx) {
|
||||||
|
lines = lines.split('\r\n');
|
||||||
|
lines.pop(); // remove empty last element;
|
||||||
|
lines.forEach(function(line) {
|
||||||
|
sdp.media[idx] = sdp.media[idx].replace(line + '\r\n', '');
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
this.removessrc = [];
|
||||||
|
|
||||||
|
// FIXME:
|
||||||
|
// this was a hack for the situation when only one peer exists
|
||||||
|
// in the conference.
|
||||||
|
// check if still required and remove
|
||||||
|
if (sdp.media[0])
|
||||||
|
sdp.media[0] = sdp.media[0].replace('a=recvonly', 'a=sendrecv');
|
||||||
|
if (sdp.media[1])
|
||||||
|
sdp.media[1] = sdp.media[1].replace('a=recvonly', 'a=sendrecv');
|
||||||
|
|
||||||
|
sdp.raw = sdp.session + sdp.media.join('');
|
||||||
|
this.peerconnection.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp.raw}),
|
||||||
|
function() {
|
||||||
|
|
||||||
|
if(self.signalingState == 'closed') {
|
||||||
|
console.error("createAnswer attempt on closed state");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.peerconnection.createAnswer(
|
||||||
|
function(modifiedAnswer) {
|
||||||
|
// change video direction, see https://github.com/jitsi/jitmeet/issues/41
|
||||||
|
if (self.pendingop !== null) {
|
||||||
|
var sdp = new SDP(modifiedAnswer.sdp);
|
||||||
|
if (sdp.media.length > 1) {
|
||||||
|
switch(self.pendingop) {
|
||||||
|
case 'mute':
|
||||||
|
sdp.media[1] = sdp.media[1].replace('a=sendrecv', 'a=recvonly');
|
||||||
|
break;
|
||||||
|
case 'unmute':
|
||||||
|
sdp.media[1] = sdp.media[1].replace('a=recvonly', 'a=sendrecv');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sdp.raw = sdp.session + sdp.media.join('');
|
||||||
|
modifiedAnswer.sdp = sdp.raw;
|
||||||
|
}
|
||||||
|
self.pendingop = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: pushing down an answer while ice connection state
|
||||||
|
// is still checking is bad...
|
||||||
|
//console.log(self.peerconnection.iceConnectionState);
|
||||||
|
|
||||||
|
// trying to work around another chrome bug
|
||||||
|
//modifiedAnswer.sdp = modifiedAnswer.sdp.replace(/a=setup:active/g, 'a=setup:actpass');
|
||||||
|
self.peerconnection.setLocalDescription(modifiedAnswer,
|
||||||
|
function() {
|
||||||
|
//console.log('modified setLocalDescription ok');
|
||||||
|
$(document).trigger('setLocalDescription.jingle', [self.sid]);
|
||||||
|
if(successCallback){
|
||||||
|
successCallback();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function(error) {
|
||||||
|
console.error('modified setLocalDescription failed', error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
function(error) {
|
||||||
|
console.error('modified answer failed', error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
function(error) {
|
||||||
|
console.error('modify failed', error);
|
||||||
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -755,7 +949,7 @@ JingleSession.prototype.switchStreams = function (new_stream, oldStream, success
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.peerconnection.switchstreams = true;
|
self.switchstreams = true;
|
||||||
self.modifySources(function() {
|
self.modifySources(function() {
|
||||||
console.log('modify sources done');
|
console.log('modify sources done');
|
||||||
|
|
||||||
|
@ -961,9 +1155,7 @@ JingleSession.prototype.setVideoMute = function (mute, callback, options) {
|
||||||
tracks[i].enabled = !mute;
|
tracks[i].enabled = !mute;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.peerconnection) {
|
this.hardMuteVideo(mute);
|
||||||
this.peerconnection.hardMuteVideo(mute);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.modifySources(callback(mute));
|
this.modifySources(callback(mute));
|
||||||
}
|
}
|
||||||
|
@ -975,6 +1167,10 @@ JingleSession.prototype.toggleVideoMute = function (callback) {
|
||||||
setVideoMute(isVideoMute(), callback);
|
setVideoMute(isVideoMute(), callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
JingleSession.prototype.hardMuteVideo = function (muted) {
|
||||||
|
this.pendingop = muted ? 'mute' : 'unmute';
|
||||||
|
};
|
||||||
|
|
||||||
JingleSession.prototype.sendMute = function (muted, content) {
|
JingleSession.prototype.sendMute = function (muted, content) {
|
||||||
var info = $iq({to: this.peerjid,
|
var info = $iq({to: this.peerjid,
|
||||||
type: 'set'})
|
type: 'set'})
|
||||||
|
@ -1046,3 +1242,4 @@ JingleSession.prototype.getStats = function (interval) {
|
||||||
}, interval || 3000);
|
}, interval || 3000);
|
||||||
return this.statsinterval;
|
return this.statsinterval;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue