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

Microphone: +
+Speaker:

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