diff --git a/html5/verto/js/src/jquery.FSRTC.js b/html5/verto/js/src/jquery.FSRTC.js
index 663f804164..d2b4bd4086 100644
--- a/html5/verto/js/src/jquery.FSRTC.js
+++ b/html5/verto/js/src/jquery.FSRTC.js
@@ -354,6 +354,7 @@ var iceTimer;
self.options.useCamera = params.useCamera || "any";
self.options.useMic = params.useMic || "any";
+ self.options.useSpeak = params.useSpeak || "any";
function onSuccess(stream) {
self.localStream = stream;
@@ -486,6 +487,10 @@ var iceTimer;
var useVideo = obj.options.useVideo;
if (useVideo && obj.options.useCamera && obj.options.useCamera !== "none") {
+ if (!video.optional) {
+ video.optional = [];
+ }
+
if (obj.options.useCamera !== "any") {
video.optional.push({sourceId: obj.options.useCamera});
}
diff --git a/html5/verto/js/src/jquery.verto.js b/html5/verto/js/src/jquery.verto.js
index 0297ff1bb6..b28d3d85be 100644
--- a/html5/verto/js/src/jquery.verto.js
+++ b/html5/verto/js/src/jquery.verto.js
@@ -1618,6 +1618,7 @@
screenShare: false,
useCamera: "any",
useMic: "any",
+ useSpeak: "any",
tag: verto.options.tag,
localTag: verto.options.localTag,
login: verto.options.login,
@@ -1626,6 +1627,7 @@
dialog.useCamera = verto.options.deviceParams.useCamera;
dialog.useMic = verto.options.deviceParams.useMic;
+ dialog.useSpeak = verto.options.deviceParams.useSpeak;
dialog.verto = verto;
dialog.direction = direction;
@@ -1637,6 +1639,7 @@
dialog.screenShare = params.screenShare || false;
dialog.useCamera = params.useCamera;
dialog.useMic = params.useMic;
+ dialog.useSpeak = params.useSpeak;
if (dialog.params.callID) {
dialog.callID = dialog.params.callID;
@@ -1736,7 +1739,8 @@
iceServers: verto.options.iceServers,
screenShare: dialog.screenShare,
useCamera: dialog.useCamera,
- useMic: dialog.useMic
+ useMic: dialog.useMic,
+ useSpeak: dialog.useSpeak
});
dialog.rtc.verto = dialog.verto;
@@ -1820,6 +1824,23 @@
}
switch (dialog.state) {
+
+ case $.verto.enum.state.early:
+ case $.verto.enum.state.active:
+
+ var speaker = dialog.useSpeak;
+ console.info("Using Speaker: ", speaker);
+
+ if (speaker && speaker !== "any") {
+ var videoElement = dialog.audioStream;
+
+ setTimeout(function() {
+ console.info("Setting speaker:", videoElement, speaker);
+ attachSinkId(videoElement, speaker);}, 500);
+ }
+
+ break;
+
case $.verto.enum.state.trying:
setTimeout(function() {
if (dialog.state == $.verto.enum.state.trying) {
@@ -2067,6 +2088,7 @@
dialog.useCamera = verto.options.deviceParams.useCamera;
dialog.useMic = verto.options.deviceParams.useMic;
+ dialog.useSpeak = verto.options.deviceParams.useSpeak;
if (params) {
if (params.useVideo) {
@@ -2076,6 +2098,7 @@
dialog.params.callee_id_number = params.callee_id_number;
dialog.useCamera = params.useCamera;
dialog.useMic = params.useMic;
+ dialog.useSpeak = params.useSpeak;
}
dialog.rtc.createAnswer(params);
@@ -2263,27 +2286,28 @@
});
$.verto.videoDevices = [];
- $.verto.audioDevices = [];
+ $.verto.audioInDevices = [];
+ $.verto.audioOutDevices = [];
var checkDevices = function(runtime) {
console.info("enumerating devices");
- var aud = [], vid = [];
+ var aud_in = [], aud_out = [], vid = [];
- if (MediaStreamTrack.getSources) {
+ if ((!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) && MediaStreamTrack.getSources) {
MediaStreamTrack.getSources(function (media_sources) {
for (var i = 0; i < media_sources.length; i++) {
if (media_sources[i].kind == 'video') {
vid.push(media_sources[i]);
} else {
- aud.push(media_sources[i]);
+ aud_in.push(media_sources[i]);
}
}
$.verto.videoDevices = vid;
- $.verto.audioDevices = aud;
+ $.verto.audioInDevices = aud_in;
- console.info("Audio Devices", $.verto.audioDevices);
+ console.info("Audio Devices", $.verto.audioInDevices);
console.info("Video Devices", $.verto.videoDevices);
runtime();
});
@@ -2307,16 +2331,20 @@
if (device.kind === "videoinput") {
vid.push({id: device.deviceId, kind: "video", label: device.label});
- } else {
- aud.push({id: device.deviceId, kind: "audio", label: device.label});
+ } else if (device.kind === "audioinput") {
+ aud_in.push({id: device.deviceId, kind: "audio_in", label: device.label});
+ } else if (device.kind === "audiooutput") {
+ aud_out.push({id: device.deviceId, kind: "audio_out", label: device.label});
}
});
$.verto.videoDevices = vid;
- $.verto.audioDevices = aud;
+ $.verto.audioInDevices = aud_in;
+ $.verto.audioOutDevices = aud_out;
- console.info("Audio Devices", $.verto.audioDevices);
+ console.info("Audio IN Devices", $.verto.audioInDevices);
+ console.info("Audio Out Devices", $.verto.audioOutDevices);
console.info("Video Devices", $.verto.videoDevices);
runtime();
diff --git a/html5/verto/video_demo/index.html b/html5/verto/video_demo/index.html
index e738f4a805..d65d891173 100644
--- a/html5/verto/video_demo/index.html
+++ b/html5/verto/video_demo/index.html
@@ -363,6 +363,8 @@ if ($('#devices').is(':visible')) {
+
+
diff --git a/html5/verto/video_demo/js/verto-min.js b/html5/verto/video_demo/js/verto-min.js
index 20633144d2..3dc05da6e4 100644
--- a/html5/verto/video_demo/js/verto-min.js
+++ b/html5/verto/video_demo/js/verto-min.js
@@ -35,13 +35,14 @@ if(self.peer){console.log("stopping peer");self.peer.stop();}};$.FSRTC.prototype
$.FSRTC.prototype.setMute=function(what){var self=this;var audioTracks=self.localStream.getAudioTracks();for(var i=0,len=audioTracks.length;i$.verto.enum.state.requesting.val&&dialog.lastState.val<$.verto.enum.state.hangup.val){dialog.sendMethod("verto.bye",{});}
+switch(dialog.state){case $.verto.enum.state.early:case $.verto.enum.state.active:var speaker=dialog.useSpeak;console.info("Using Speaker: ",speaker);if(speaker&&speaker!=="any"){var videoElement=dialog.audioStream;setTimeout(function(){console.info("Setting speaker:",videoElement,speaker);attachSinkId(videoElement,speaker);},500);}
+break;case $.verto.enum.state.trying:setTimeout(function(){if(dialog.state==$.verto.enum.state.trying){dialog.setState($.verto.enum.state.hangup);}},30000);break;case $.verto.enum.state.purge:dialog.setState($.verto.enum.state.destroy);break;case $.verto.enum.state.hangup:if(dialog.lastState.val>$.verto.enum.state.requesting.val&&dialog.lastState.val<$.verto.enum.state.hangup.val){dialog.sendMethod("verto.bye",{});}
dialog.setState($.verto.enum.state.destroy);break;case $.verto.enum.state.destroy:delete dialog.verto.dialogs[dialog.callID];if(!dialog.params.screenShare){dialog.rtc.stop();}
break;}
return true;};$.verto.dialog.prototype.processReply=function(method,success,e){var dialog=this;switch(method){case"verto.answer":case"verto.attach":if(success){dialog.setState($.verto.enum.state.active);}else{dialog.hangup();}
@@ -236,15 +238,15 @@ dialog.rtc.useVideo(dialog.videoStream,dialog.localVideo);};$.verto.dialog.proto
if(!msg.body){console.error("Missing Body");err++;}
if(err){return false;}
dialog.sendMethod("verto.info",{msg:msg});return true;};$.verto.dialog.prototype.answer=function(params){var dialog=this;if(!dialog.answered){if(!params){params={};}
-params.sdp=dialog.params.sdp;dialog.useCamera=verto.options.deviceParams.useCamera;dialog.useMic=verto.options.deviceParams.useMic;if(params){if(params.useVideo){dialog.useVideo(true);}
-dialog.params.callee_id_name=params.callee_id_name;dialog.params.callee_id_number=params.callee_id_number;dialog.useCamera=params.useCamera;dialog.useMic=params.useMic;}
+params.sdp=dialog.params.sdp;dialog.useCamera=verto.options.deviceParams.useCamera;dialog.useMic=verto.options.deviceParams.useMic;dialog.useSpeak=verto.options.deviceParams.useSpeak;if(params){if(params.useVideo){dialog.useVideo(true);}
+dialog.params.callee_id_name=params.callee_id_name;dialog.params.callee_id_number=params.callee_id_number;dialog.useCamera=params.useCamera;dialog.useMic=params.useMic;dialog.useSpeak=params.useSpeak;}
dialog.rtc.createAnswer(params);dialog.answered=true;}};$.verto.dialog.prototype.handleAnswer=function(params){var dialog=this;dialog.gotAnswer=true;if(dialog.state.val>=$.verto.enum.state.active.val){return;}
if(dialog.state.val>=$.verto.enum.state.early.val){dialog.setState($.verto.enum.state.active);}else{if(dialog.gotEarly){console.log("Dialog "+dialog.callID+" Got answer while still establishing early media, delaying...");}else{console.log("Dialog "+dialog.callID+" Answering Channel");dialog.rtc.answer(params.sdp,function(){dialog.setState($.verto.enum.state.active);},function(e){console.error(e);dialog.hangup();});console.log("Dialog "+dialog.callID+"ANSWER SDP",params.sdp);}}};$.verto.dialog.prototype.cidString=function(enc){var dialog=this;var party=dialog.params.remote_caller_id_name+(enc?" <":" <")+dialog.params.remote_caller_id_number+(enc?">":">");return party;};$.verto.dialog.prototype.sendMessage=function(msg,params){var dialog=this;if(dialog.callbacks.onMessage){dialog.callbacks.onMessage(dialog.verto,dialog,msg,params);}};$.verto.dialog.prototype.handleInfo=function(params){var dialog=this;dialog.sendMessage($.verto.enum.message.info,params.msg);};$.verto.dialog.prototype.handleDisplay=function(params){var dialog=this;if(params.display_name){dialog.params.remote_caller_id_name=params.display_name;}
if(params.display_number){dialog.params.remote_caller_id_number=params.display_number;}
dialog.sendMessage($.verto.enum.message.display,{});};$.verto.dialog.prototype.handleMedia=function(params){var dialog=this;if(dialog.state.val>=$.verto.enum.state.early.val){return;}
dialog.gotEarly=true;dialog.rtc.answer(params.sdp,function(){console.log("Dialog "+dialog.callID+"Establishing early media");dialog.setState($.verto.enum.state.early);if(dialog.gotAnswer){console.log("Dialog "+dialog.callID+"Answering Channel");dialog.setState($.verto.enum.state.active);}},function(e){console.error(e);dialog.hangup();});console.log("Dialog "+dialog.callID+"EARLY SDP",params.sdp);};$.verto.ENUM=function(s){var i=0,o={};s.split(" ").map(function(x){o[x]={name:x,val:i++};});return Object.freeze(o);};$.verto.enum={};$.verto.enum.states=Object.freeze({new:{requesting:1,recovering:1,ringing:1,destroy:1,answering:1,hangup:1},requesting:{trying:1,hangup:1},recovering:{answering:1,hangup:1},trying:{active:1,early:1,hangup:1},ringing:{answering:1,hangup:1},answering:{active:1,hangup:1},active:{answering:1,requesting:1,hangup:1,held:1},held:{hangup:1,active:1},early:{hangup:1,active:1},hangup:{destroy:1},destroy:{},purge:{destroy:1}});$.verto.enum.state=$.verto.ENUM("new requesting trying recovering ringing answering early active held hangup destroy purge");$.verto.enum.direction=$.verto.ENUM("inbound outbound");$.verto.enum.message=$.verto.ENUM("display info pvtEvent");$.verto.enum=Object.freeze($.verto.enum);$.verto.saved=[];$.verto.unloadJobs=[];$(window).bind('beforeunload',function(){for(var f in $.verto.unloadJobs){$.verto.unloadJobs[f]();}
for(var i in $.verto.saved){var verto=$.verto.saved[i];if(verto){verto.purge();verto.logout();}}
-return $.verto.warnOnUnload;});$.verto.videoDevices=[];$.verto.audioDevices=[];var checkDevices=function(runtime){console.info("enumerating devices");var aud=[],vid=[];if(MediaStreamTrack.getSources){MediaStreamTrack.getSources(function(media_sources){for(var i=0;i