]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add speaker device support (only works in canary for now)
authorAnthony Minessale <anthm@freeswitch.org>
Tue, 21 Jul 2015 15:59:17 +0000 (10:59 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Tue, 21 Jul 2015 15:59:21 +0000 (10:59 -0500)
html5/verto/js/src/jquery.FSRTC.js
html5/verto/js/src/jquery.verto.js
html5/verto/video_demo/index.html
html5/verto/video_demo/js/verto-min.js
html5/verto/video_demo/verto.js

index 663f804164f686145fdc8ccd9e39bd499fccd065..d2b4bd40861624b9b7f96e0df934155a471e525c 100644 (file)
@@ -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});
            }
index 0297ff1bb67a3994a453e4d11d160d73d94117b1..b28d3d85be7f0e28e8b6f21c116b2241fe20bf90 100644 (file)
            screenShare: false,
            useCamera: "any",
            useMic: "any",
+           useSpeak: "any",
             tag: verto.options.tag,
             localTag: verto.options.localTag,
             login: verto.options.login,
        
        dialog.useCamera = verto.options.deviceParams.useCamera;
        dialog.useMic = verto.options.deviceParams.useMic;
+       dialog.useSpeak = verto.options.deviceParams.useSpeak;
 
         dialog.verto = verto;
         dialog.direction = direction;
        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;
             iceServers: verto.options.iceServers,
            screenShare: dialog.screenShare,
            useCamera: dialog.useCamera,
-           useMic: dialog.useMic
+           useMic: dialog.useMic,
+           useSpeak: dialog.useSpeak
         });
 
         dialog.rtc.verto = dialog.verto;
         }
 
         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.useCamera = verto.options.deviceParams.useCamera;
            dialog.useMic = verto.options.deviceParams.useMic;
+           dialog.useSpeak = verto.options.deviceParams.useSpeak;
 
             if (params) {
                 if (params.useVideo) {
                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);
     });
 
     $.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();
            });
                        
                        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();
                    
index e738f4a8056117d65787369bac931347d78f83bf..d65d89117335cb3f99f513c3ee9d7f89ed2471c5 100644 (file)
@@ -363,6 +363,8 @@ if ($('#devices').is(':visible')) {
 <br><br></div>
 
 <legend><b>Microphone</b>:</legend><select data-theme="a" data-overlay-theme="a" data-native-menu="false" id="usemic"></select>
+<br>
+<legend><b>Speaker</b>:</legend><select data-theme="a" data-overlay-theme="a" data-native-menu="false" id="usespeak"></select>
 
 <Br clear="all"><Br>
 
index 20633144d263c72d0f64d0a9da198f19f6c0bc9c..3dc05da6e4c32d37995c6fccfa5d3457daad8cf0 100644 (file)
@@ -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<len;i++){switch(what){case"on":audioTracks[i].enabled=true;break;case"off":audioTracks[i].enabled=false;break;case"toggle":audioTracks[i].enabled=!audioTracks[i].enabled;default:break;}
 self.enabled=audioTracks[i].enabled;}
 return!self.enabled;}
-$.FSRTC.prototype.createAnswer=function(params){var self=this;self.type="answer";self.remoteSDP=params.sdp;console.debug("inbound sdp: ",params.sdp);self.options.useCamera=params.useCamera||"any";self.options.useMic=params.useMic||"any";function onSuccess(stream){self.localStream=stream;self.peer=RTCPeerConnection({type:self.type,attachStream:self.localStream,onICE:function(candidate){return onICE(self,candidate);},onICEComplete:function(){return onICEComplete(self);},onRemoteStream:function(stream){return onRemoteStream(self,stream);},onICESDP:function(sdp){return onICESDP(self,sdp);},onChannelError:function(e){return onChannelError(self,e);},constraints:self.constraints,iceServers:self.options.iceServers,offerSDP:{type:"offer",sdp:self.remoteSDP}});onStreamSuccess(self);}
+$.FSRTC.prototype.createAnswer=function(params){var self=this;self.type="answer";self.remoteSDP=params.sdp;console.debug("inbound sdp: ",params.sdp);self.options.useCamera=params.useCamera||"any";self.options.useMic=params.useMic||"any";self.options.useSpeak=params.useSpeak||"any";function onSuccess(stream){self.localStream=stream;self.peer=RTCPeerConnection({type:self.type,attachStream:self.localStream,onICE:function(candidate){return onICE(self,candidate);},onICEComplete:function(){return onICEComplete(self);},onRemoteStream:function(stream){return onRemoteStream(self,stream);},onICESDP:function(sdp){return onICESDP(self,sdp);},onChannelError:function(e){return onChannelError(self,e);},constraints:self.constraints,iceServers:self.options.iceServers,offerSDP:{type:"offer",sdp:self.remoteSDP}});onStreamSuccess(self);}
 function onError(e){onStreamError(self,e);}
 var mediaParams=getMediaParams(self);console.log("Audio constraints",mediaParams.audio);console.log("Video constraints",mediaParams.video);if(self.options.useVideo&&self.options.localVideo){getUserMedia({constraints:{audio:false,video:{mandatory:self.options.videoParams,optional:[]},},localVideo:self.options.localVideo,onsuccess:function(e){self.options.localVideoStream=e;console.log("local video ready");},onerror:function(e){console.error("local video error!");}});}
 getUserMedia({constraints:{audio:mediaParams.audio,video:mediaParams.video},video:mediaParams.useVideo,onsuccess:onSuccess,onerror:onError});};function getMediaParams(obj){var audio;if(obj.options.videoParams&&obj.options.screenShare){console.error("SCREEN SHARE");audio=false;}else{audio={mandatory:obj.options.audioParams,optional:[]};if(obj.options.useMic!=="any"){audio.optional=[{sourceId:obj.options.useMic}]}}
 if(obj.options.useVideo&&obj.options.localVideo){getUserMedia({constraints:{audio:false,video:{mandatory:obj.options.videoParams,optional:[]},},localVideo:obj.options.localVideo,onsuccess:function(e){self.options.localVideoStream=e;console.log("local video ready");},onerror:function(e){console.error("local video error!");}});}
 var video={};var bestFrameRate=obj.options.videoParams.vertoBestFrameRate;delete obj.options.videoParams.vertoBestFrameRate;if(window.moz){video=obj.options.videoParams;if(!video.width)video.width=video.minWidth;if(!video.height)video.height=video.minHeight;if(!video.frameRate)video.frameRate=video.minFrameRate;}else{video={mandatory:obj.options.videoParams,optional:[]}}
-var useVideo=obj.options.useVideo;if(useVideo&&obj.options.useCamera&&obj.options.useCamera!=="none"){if(obj.options.useCamera!=="any"){video.optional.push({sourceId:obj.options.useCamera});}
+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});}
 if(bestFrameRate&&!window.moz){video.optional.push({minFrameRate:bestFrameRate});}}else{video=null;useVideo=null;}
 return{audio:audio,video:video,useVideo:useVideo};}
 $.FSRTC.prototype.call=function(profile){checkCompat();var self=this;var screen=false;self.type="offer";if(self.options.videoParams&&self.options.screenShare){screen=true;}
@@ -206,14 +207,14 @@ confMan.lastTimeout=setTimeout(function(){$(confMan.params.displayID).html(confM
 var row_callback=null;if(confMan.params.laData.role==="moderator"){row_callback=function(nRow,aData,iDisplayIndex,iDisplayIndexFull){if(!aData[5]){var $row=$('td:eq(5)',nRow);genControls($row,aData);if(confMan.params.onLaRow){confMan.params.onLaRow(verto,confMan,$row,aData);}}};}
 confMan.lt=new $.verto.liveTable(verto,confMan.params.laData.laChannel,confMan.params.laData.laName,$(confMan.params.tableID),{subParams:{callID:confMan.params.dialog?confMan.params.dialog.callID:null},"onChange":function(obj,args){$(confMan.params.statusID).text("Conference Members: "+" ("+obj.arrayLen()+" Total)");if(confMan.params.onLaChange){confMan.params.onLaChange(verto,confMan,$.verto.enum.confEvent.laChange,obj,args);}},"aaData":[],"aoColumns":[{"sTitle":"ID","sWidth":"50"},{"sTitle":"Number","sWidth":"250"},{"sTitle":"Name","sWidth":"250"},{"sTitle":"Codec","sWidth":"100"},{"sTitle":"Status","sWidth":confMan.params.hasVid?"200px":"150px"},{"sTitle":atitle,"sWidth":awidth,}],"bAutoWidth":true,"bDestroy":true,"bSort":false,"bInfo":false,"bFilter":false,"bLengthChange":false,"bPaginate":false,"iDisplayLength":1400,"oLanguage":{"sEmptyTable":"The Conference is Empty....."},"fnRowCallback":row_callback});};$.verto.confMan.prototype.modCommand=function(cmd,id,value){var confMan=this;confMan.verto.rpcClient.call("verto.broadcast",{"eventChannel":confMan.params.laData.modChannel,"data":{"application":"conf-control","command":cmd,"id":id,"value":value}});};$.verto.confMan.prototype.destroy=function(){var confMan=this;confMan.destroyed=true;if(confMan.lt){confMan.lt.destroy();}
 if(confMan.params.laData.modChannel){confMan.verto.unsubscribe(confMan.params.laData.modChannel);}
-if(confMan.params.mainModID){$(confMan.params.mainModID).html("");}};$.verto.dialog=function(direction,verto,params){var dialog=this;dialog.params=$.extend({useVideo:verto.options.useVideo,useStereo:verto.options.useStereo,screenShare:false,useCamera:"any",useMic:"any",tag:verto.options.tag,localTag:verto.options.localTag,login:verto.options.login,videoParams:verto.options.videoParams},params);dialog.useCamera=verto.options.deviceParams.useCamera;dialog.useMic=verto.options.deviceParams.useMic;dialog.verto=verto;dialog.direction=direction;dialog.lastState=null;dialog.state=dialog.lastState=$.verto.enum.state.new;dialog.callbacks=verto.callbacks;dialog.answered=false;dialog.attach=params.attach||false;dialog.screenShare=params.screenShare||false;dialog.useCamera=params.useCamera;dialog.useMic=params.useMic;if(dialog.params.callID){dialog.callID=dialog.params.callID;}else{dialog.callID=dialog.params.callID=generateGUID();}
+if(confMan.params.mainModID){$(confMan.params.mainModID).html("");}};$.verto.dialog=function(direction,verto,params){var dialog=this;dialog.params=$.extend({useVideo:verto.options.useVideo,useStereo:verto.options.useStereo,screenShare:false,useCamera:"any",useMic:"any",useSpeak:"any",tag:verto.options.tag,localTag:verto.options.localTag,login:verto.options.login,videoParams:verto.options.videoParams},params);dialog.useCamera=verto.options.deviceParams.useCamera;dialog.useMic=verto.options.deviceParams.useMic;dialog.useSpeak=verto.options.deviceParams.useSpeak;dialog.verto=verto;dialog.direction=direction;dialog.lastState=null;dialog.state=dialog.lastState=$.verto.enum.state.new;dialog.callbacks=verto.callbacks;dialog.answered=false;dialog.attach=params.attach||false;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;}else{dialog.callID=dialog.params.callID=generateGUID();}
 if(dialog.params.tag){dialog.audioStream=document.getElementById(dialog.params.tag);if(dialog.params.useVideo){dialog.videoStream=dialog.audioStream;}}
 if(dialog.params.localTag){dialog.localVideo=document.getElementById(dialog.params.localTag);}
 dialog.verto.dialogs[dialog.callID]=dialog;var RTCcallbacks={};if(dialog.direction==$.verto.enum.direction.inbound){if(dialog.params.display_direction==="outbound"){dialog.params.remote_caller_id_name=dialog.params.caller_id_name;dialog.params.remote_caller_id_number=dialog.params.caller_id_number;}else{dialog.params.remote_caller_id_name=dialog.params.callee_id_name;dialog.params.remote_caller_id_number=dialog.params.callee_id_number;}
 if(!dialog.params.remote_caller_id_name){dialog.params.remote_caller_id_name="Nobody";}
 if(!dialog.params.remote_caller_id_number){dialog.params.remote_caller_id_number="UNKNOWN";}
 RTCcallbacks.onMessage=function(rtc,msg){console.debug(msg);};RTCcallbacks.onAnswerSDP=function(rtc,sdp){console.error("answer sdp",sdp);};}else{dialog.params.remote_caller_id_name="Outbound Call";dialog.params.remote_caller_id_number=dialog.params.destination_number;}
-RTCcallbacks.onICESDP=function(rtc){if(rtc.type=="offer"){console.log("offer",rtc.mediaData.SDP);dialog.setState($.verto.enum.state.requesting);dialog.sendMethod("verto.invite",{sdp:rtc.mediaData.SDP});}else{dialog.setState($.verto.enum.state.answering);dialog.sendMethod(dialog.attach?"verto.attach":"verto.answer",{sdp:dialog.rtc.mediaData.SDP});}};RTCcallbacks.onICE=function(rtc){if(rtc.type=="offer"){console.log("offer",rtc.mediaData.candidate);return;}};RTCcallbacks.onStream=function(rtc,stream){console.log("stream started");};RTCcallbacks.onError=function(e){console.error("ERROR:",e);dialog.hangup({cause:"Device or Permission Error"});};dialog.rtc=new $.FSRTC({callbacks:RTCcallbacks,localVideo:dialog.localVideo,useVideo:dialog.videoStream,useAudio:dialog.audioStream,useStereo:dialog.params.useStereo,videoParams:dialog.params.videoParams,audioParams:verto.options.audioParams,iceServers:verto.options.iceServers,screenShare:dialog.screenShare,useCamera:dialog.useCamera,useMic:dialog.useMic});dialog.rtc.verto=dialog.verto;if(dialog.direction==$.verto.enum.direction.inbound){if(dialog.attach){dialog.answer();}else{dialog.ring();}}};$.verto.dialog.prototype.invite=function(){var dialog=this;dialog.rtc.call();};$.verto.dialog.prototype.sendMethod=function(method,obj){var dialog=this;obj.dialogParams={};for(var i in dialog.params){if(i=="sdp"&&method!="verto.invite"&&method!="verto.attach"){continue;}
+RTCcallbacks.onICESDP=function(rtc){if(rtc.type=="offer"){console.log("offer",rtc.mediaData.SDP);dialog.setState($.verto.enum.state.requesting);dialog.sendMethod("verto.invite",{sdp:rtc.mediaData.SDP});}else{dialog.setState($.verto.enum.state.answering);dialog.sendMethod(dialog.attach?"verto.attach":"verto.answer",{sdp:dialog.rtc.mediaData.SDP});}};RTCcallbacks.onICE=function(rtc){if(rtc.type=="offer"){console.log("offer",rtc.mediaData.candidate);return;}};RTCcallbacks.onStream=function(rtc,stream){console.log("stream started");};RTCcallbacks.onError=function(e){console.error("ERROR:",e);dialog.hangup({cause:"Device or Permission Error"});};dialog.rtc=new $.FSRTC({callbacks:RTCcallbacks,localVideo:dialog.localVideo,useVideo:dialog.videoStream,useAudio:dialog.audioStream,useStereo:dialog.params.useStereo,videoParams:dialog.params.videoParams,audioParams:verto.options.audioParams,iceServers:verto.options.iceServers,screenShare:dialog.screenShare,useCamera:dialog.useCamera,useMic:dialog.useMic,useSpeak:dialog.useSpeak});dialog.rtc.verto=dialog.verto;if(dialog.direction==$.verto.enum.direction.inbound){if(dialog.attach){dialog.answer();}else{dialog.ring();}}};$.verto.dialog.prototype.invite=function(){var dialog=this;dialog.rtc.call();};$.verto.dialog.prototype.sendMethod=function(method,obj){var dialog=this;obj.dialogParams={};for(var i in dialog.params){if(i=="sdp"&&method!="verto.invite"&&method!="verto.attach"){continue;}
 obj.dialogParams[i]=dialog.params[i];}
 dialog.verto.rpcClient.call(method,obj,function(e){dialog.processReply(method,true,e);},function(e){dialog.processReply(method,false,e);});};function checkStateChange(oldS,newS){if(newS==$.verto.enum.state.purge||$.verto.enum.states[oldS.name][newS.name]){return true;}
 return false;}
@@ -222,7 +223,8 @@ if(dialog.state==state||!checkStateChange(dialog.state,state)){console.error("Di
 console.info("Dialog "+dialog.callID+": state change from "+dialog.state.name+" to "+state.name);dialog.lastState=dialog.state;dialog.state=state;if(!dialog.causeCode){dialog.causeCode=16;}
 if(!dialog.cause){dialog.cause="NORMAL CLEARING";}
 if(dialog.callbacks.onDialogState){dialog.callbacks.onDialogState(this);}
-switch(dialog.state){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",{});}
+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?" &lt;":" <")+dialog.params.remote_caller_id_number+(enc?"&gt;":">");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<media_sources.length;i++){if(media_sources[i].kind=='video'){vid.push(media_sources[i]);}else{aud.push(media_sources[i]);}}
-$.verto.videoDevices=vid;$.verto.audioDevices=aud;console.info("Audio Devices",$.verto.audioDevices);console.info("Video Devices",$.verto.videoDevices);runtime();});}else{if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices){console.log("enumerateDevices() not supported.");return;}
-navigator.mediaDevices.enumerateDevices().then(function(devices){devices.forEach(function(device){console.log(device);console.log(device.kind+": "+device.label+" id = "+device.deviceId);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});}});$.verto.videoDevices=vid;$.verto.audioDevices=aud;console.info("Audio Devices",$.verto.audioDevices);console.info("Video Devices",$.verto.videoDevices);runtime();}).catch(function(err){console.log(err.name+": "+error.message);runtime();});}};$.verto.init=function(obj,runtime){checkDevices(function(){$.FSRTC.getValidRes(obj.camera,runtime);});}
+return $.verto.warnOnUnload;});$.verto.videoDevices=[];$.verto.audioInDevices=[];$.verto.audioOutDevices=[];var checkDevices=function(runtime){console.info("enumerating devices");var aud_in=[],aud_out=[],vid=[];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_in.push(media_sources[i]);}}
+$.verto.videoDevices=vid;$.verto.audioInDevices=aud_in;console.info("Audio Devices",$.verto.audioInDevices);console.info("Video Devices",$.verto.videoDevices);runtime();});}else{if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices){console.log("enumerateDevices() not supported.");return;}
+navigator.mediaDevices.enumerateDevices().then(function(devices){devices.forEach(function(device){console.log(device);console.log(device.kind+": "+device.label+" id = "+device.deviceId);if(device.kind==="videoinput"){vid.push({id:device.deviceId,kind:"video",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.audioInDevices=aud_in;$.verto.audioOutDevices=aud_out;console.info("Audio IN Devices",$.verto.audioInDevices);console.info("Audio Out Devices",$.verto.audioOutDevices);console.info("Video Devices",$.verto.videoDevices);runtime();}).catch(function(err){console.log(err.name+": "+error.message);runtime();});}};$.verto.init=function(obj,runtime){checkDevices(function(){$.FSRTC.getValidRes(obj.camera,runtime);});}
 $.verto.genUUID=function(){return generateGUID();}})(jQuery);
\ No newline at end of file
index e2ff1e438e44f7cbf4ffbc7ee4fd312a9f51fb9d..ab4faac4fb167e7b72523406d06a24cd4600a759 100644 (file)
@@ -201,6 +201,31 @@ function check_vid() {
     return use_vid;
 }
 
+// Attach audio output device to video element using device/sink ID.                                                                                            
+function attachSinkId(element, sinkId) {
+    if (typeof element.sinkId !== 'undefined') {
+       element.setSinkId(sinkId)
+           .then(function() {
+               console.log('Success, audio output device attached: ' + sinkId);
+           })
+           .catch(function(error) {
+               var errorMessage = error;
+               if (error.name === 'SecurityError') {
+                   errorMessage = 'You need to use HTTPS for selecting audio output ' +
+                       'device: ' + error;
+               }
+               console.error(errorMessage);
+               // Jump back to first output device in the list as it's the default.                                                                                      
+               //audioOutputSelect.selectedIndex = 0;
+           });
+    } else {
+       console.warn('Browser does not support output device selection.');
+    }
+}
+
+
+
+
 function messageTextToJQ(body) {
        // Builds a jQuery collection from body text, linkifies http/https links, imageifies http/https links to images, and doesn't allow script injection
        
@@ -437,7 +462,9 @@ var callbacks = {
                    callee_id_name: $("#cidname").val(),
                    callee_id_number: $("#cid").val(),
                    useCamera: $("#usecamera").find(":selected").val(),
-                   useMic: $("#usemic").find(":selected").val()
+                   useMic: $("#usemic").find(":selected").val(),
+                   useSpeak: $("#usespeak").find(":selected").val()
+
                });
                 $('#dialog-incoming-call').dialog('close');
             });
@@ -457,7 +484,8 @@ var callbacks = {
                         useVideo: true,
                        useStereo: $("#use_stereo").is(':checked'),
                        useCamera: $("#usecamera").find(":selected").val(),
-                       useMic: $("#usemic").find(":selected").val()
+                       useMic: $("#usemic").find(":selected").val(),
+                       useSpeak: $("#usespeak").find(":selected").val()
                     });
                 });
                 // the buttons in this jquery mobile wont hide .. gotta wrap them in a div as a workaround
@@ -489,7 +517,9 @@ var callbacks = {
            } else {
                display("Talking to: " + d.cidString());
            }
+
             goto_page("incall");
+
             break;
         case $.verto.enum.state.hangup:
            $("#main_info").html("Call ended with cause: " + d.cause);
@@ -738,6 +768,7 @@ function docall() {
         useStereo: $("#use_stereo").is(':checked'),
        useCamera: sessid ? "none" : $("#usecamera").find(":selected").val(),
        useMic: $("#usemic").find(":selected").val(),
+       useSpeak: $("#usespeak").find(":selected").val(),
        dedEnc: $("#use_dedenc").is(':checked'),
        mirrorInput: $("#mirror_input").is(':checked'),
         userVariables: {
@@ -874,14 +905,17 @@ function refresh_devices()
     $("#useshare").selectmenu({});
     $("#useshare").selectmenu({});
     $("#usemic").selectmenu({});
+    $("#usespeak").selectmenu({});
 
     $("#useshare").selectmenu("enable");
     $("#useshare").selectmenu("enable");
     $("#usemic").selectmenu("enable");
+    $("#usespeak").selectmenu("enable");
 
     $("#useshare").empty();
     $("#usecamera").empty();
     $("#usemic").empty();
+    $("#usespeak").empty();
     
 
 
@@ -889,6 +923,7 @@ function refresh_devices()
 
     $("#usecamera").append(new Option("No Camera", "none"));
     $("#usemic").append(new Option("Do Not Specify", "any"));
+    $("#usespeak").append(new Option("Do Not Specify", "any"));
     for (var i in $.verto.videoDevices) {
        var source = $.verto.videoDevices[i];
        var o = new Option(source.label, source.id);
@@ -907,8 +942,8 @@ function refresh_devices()
 
     x = 1;
     
-    for (var i in $.verto.audioDevices) {
-       var source = $.verto.audioDevices[i];
+    for (var i in $.verto.audioInDevices) {
+       var source = $.verto.audioInDevices[i];
        var o = new Option(source.label, source.id);
        if (!x++) {
            o.selected = true;
@@ -916,6 +951,15 @@ function refresh_devices()
        $("#usemic").append(o);
     }
 
+    for (var i in $.verto.audioOutDevices) {
+       var source = $.verto.audioOutDevices[i];
+       var o = new Option(source.label, source.id);
+       if (!x++) {
+           o.selected = true;
+       }
+       $("#usespeak").append(o);
+    }
+
 
     var o = new Option("Screen", "screen");
     o.selected = true;
@@ -925,6 +969,7 @@ function refresh_devices()
     
     $("#usecamera").selectmenu('refresh', true);
     $("#usemic").selectmenu('refresh', true);
+    $("#usespeak").selectmenu('refresh', true);
     $("#useshare").selectmenu('refresh', true);
 
     //$("input[type='radio']).checkboxradio({});
@@ -945,6 +990,12 @@ function refresh_devices()
         $('#usemic option[value=' + tmp + ']').prop('selected', 'selected').change();
         pop_select("#usemic","verto_demo_mic_selected", tmp);
     }
+
+    tmp = $.cookie("verto_demo_speak_selected") || "false";
+    if (tmp) {
+        $('#usespeak option[value=' + tmp + ']').prop('selected', 'selected').change();
+        pop_select("#usespeak","verto_demo_speak_selected", tmp);
+    }
 }
 
 function init() {
@@ -953,6 +1004,7 @@ function init() {
 
     $("#usecamera").selectmenu({});
     $("#usemic").selectmenu({});
+    $("#usespeak").selectmenu({});
     $("#useshare").selectmenu({});
 
     if (!autocall) {
@@ -1307,20 +1359,19 @@ function init() {
         //localTag: $("#local_video").is(':checked') ? "local_webcam" : null,
         ringFile: "sounds/bell_ring2.wav",
        sessid: sessid,
-       //loginParams: {second_screen: second_screen},
         videoParams: {
             "minWidth": vid_width,
             "minHeight": vid_height,
            "maxWidth": vid_width,
            "maxHeight": vid_height,
            "minFrameRate": 15,
-           "vertoBestFrameRate": 30,
-           //chromeMediaSource: 'screen',
-           //mediaSource: 'screen'
+           "vertoBestFrameRate": 30
         },
 
        deviceParams: {
-           useCamera: $("#usecamera").find(":selected").val(),                                                                                                            useMic: $("#usemic").find(":selected").val()
+           useCamera: $("#usecamera").find(":selected").val(),                                                                                                            useMic: $("#usemic").find(":selected").val(),
+            useSpeak: $("#usespeak").find(":selected").val()
+
        },
 
 //     audioParams: {