提交 bf2654ea authored 作者: Anthony Minessale's avatar Anthony Minessale

add speaker device support (only works in canary for now)

上级 ddfea1e4
...@@ -354,6 +354,7 @@ var iceTimer; ...@@ -354,6 +354,7 @@ var iceTimer;
self.options.useCamera = params.useCamera || "any"; self.options.useCamera = params.useCamera || "any";
self.options.useMic = params.useMic || "any"; self.options.useMic = params.useMic || "any";
self.options.useSpeak = params.useSpeak || "any";
function onSuccess(stream) { function onSuccess(stream) {
self.localStream = stream; self.localStream = stream;
...@@ -486,6 +487,10 @@ var iceTimer; ...@@ -486,6 +487,10 @@ var iceTimer;
var useVideo = obj.options.useVideo; var useVideo = obj.options.useVideo;
if (useVideo && obj.options.useCamera && obj.options.useCamera !== "none") { if (useVideo && obj.options.useCamera && obj.options.useCamera !== "none") {
if (!video.optional) {
video.optional = [];
}
if (obj.options.useCamera !== "any") { if (obj.options.useCamera !== "any") {
video.optional.push({sourceId: obj.options.useCamera}); video.optional.push({sourceId: obj.options.useCamera});
} }
......
...@@ -1618,6 +1618,7 @@ ...@@ -1618,6 +1618,7 @@
screenShare: false, screenShare: false,
useCamera: "any", useCamera: "any",
useMic: "any", useMic: "any",
useSpeak: "any",
tag: verto.options.tag, tag: verto.options.tag,
localTag: verto.options.localTag, localTag: verto.options.localTag,
login: verto.options.login, login: verto.options.login,
...@@ -1626,6 +1627,7 @@ ...@@ -1626,6 +1627,7 @@
dialog.useCamera = verto.options.deviceParams.useCamera; dialog.useCamera = verto.options.deviceParams.useCamera;
dialog.useMic = verto.options.deviceParams.useMic; dialog.useMic = verto.options.deviceParams.useMic;
dialog.useSpeak = verto.options.deviceParams.useSpeak;
dialog.verto = verto; dialog.verto = verto;
dialog.direction = direction; dialog.direction = direction;
...@@ -1637,6 +1639,7 @@ ...@@ -1637,6 +1639,7 @@
dialog.screenShare = params.screenShare || false; dialog.screenShare = params.screenShare || false;
dialog.useCamera = params.useCamera; dialog.useCamera = params.useCamera;
dialog.useMic = params.useMic; dialog.useMic = params.useMic;
dialog.useSpeak = params.useSpeak;
if (dialog.params.callID) { if (dialog.params.callID) {
dialog.callID = dialog.params.callID; dialog.callID = dialog.params.callID;
...@@ -1736,7 +1739,8 @@ ...@@ -1736,7 +1739,8 @@
iceServers: verto.options.iceServers, iceServers: verto.options.iceServers,
screenShare: dialog.screenShare, screenShare: dialog.screenShare,
useCamera: dialog.useCamera, useCamera: dialog.useCamera,
useMic: dialog.useMic useMic: dialog.useMic,
useSpeak: dialog.useSpeak
}); });
dialog.rtc.verto = dialog.verto; dialog.rtc.verto = dialog.verto;
...@@ -1820,6 +1824,23 @@ ...@@ -1820,6 +1824,23 @@
} }
switch (dialog.state) { 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: case $.verto.enum.state.trying:
setTimeout(function() { setTimeout(function() {
if (dialog.state == $.verto.enum.state.trying) { if (dialog.state == $.verto.enum.state.trying) {
...@@ -2067,6 +2088,7 @@ ...@@ -2067,6 +2088,7 @@
dialog.useCamera = verto.options.deviceParams.useCamera; dialog.useCamera = verto.options.deviceParams.useCamera;
dialog.useMic = verto.options.deviceParams.useMic; dialog.useMic = verto.options.deviceParams.useMic;
dialog.useSpeak = verto.options.deviceParams.useSpeak;
if (params) { if (params) {
if (params.useVideo) { if (params.useVideo) {
...@@ -2076,6 +2098,7 @@ ...@@ -2076,6 +2098,7 @@
dialog.params.callee_id_number = params.callee_id_number; dialog.params.callee_id_number = params.callee_id_number;
dialog.useCamera = params.useCamera; dialog.useCamera = params.useCamera;
dialog.useMic = params.useMic; dialog.useMic = params.useMic;
dialog.useSpeak = params.useSpeak;
} }
dialog.rtc.createAnswer(params); dialog.rtc.createAnswer(params);
...@@ -2263,27 +2286,28 @@ ...@@ -2263,27 +2286,28 @@
}); });
$.verto.videoDevices = []; $.verto.videoDevices = [];
$.verto.audioDevices = []; $.verto.audioInDevices = [];
$.verto.audioOutDevices = [];
var checkDevices = function(runtime) { var checkDevices = function(runtime) {
console.info("enumerating devices"); 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) { MediaStreamTrack.getSources(function (media_sources) {
for (var i = 0; i < media_sources.length; i++) { for (var i = 0; i < media_sources.length; i++) {
if (media_sources[i].kind == 'video') { if (media_sources[i].kind == 'video') {
vid.push(media_sources[i]); vid.push(media_sources[i]);
} else { } else {
aud.push(media_sources[i]); aud_in.push(media_sources[i]);
} }
} }
$.verto.videoDevices = vid; $.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); console.info("Video Devices", $.verto.videoDevices);
runtime(); runtime();
}); });
...@@ -2307,16 +2331,20 @@ ...@@ -2307,16 +2331,20 @@
if (device.kind === "videoinput") { if (device.kind === "videoinput") {
vid.push({id: device.deviceId, kind: "video", label: device.label}); vid.push({id: device.deviceId, kind: "video", label: device.label});
} else { } else if (device.kind === "audioinput") {
aud.push({id: device.deviceId, kind: "audio", label: device.label}); 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.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); console.info("Video Devices", $.verto.videoDevices);
runtime(); runtime();
......
...@@ -363,6 +363,8 @@ if ($('#devices').is(':visible')) { ...@@ -363,6 +363,8 @@ if ($('#devices').is(':visible')) {
<br><br></div> <br><br></div>
<legend><b>Microphone</b>:</legend><select data-theme="a" data-overlay-theme="a" data-native-menu="false" id="usemic"></select> <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> <Br clear="all"><Br>
......
This diff was suppressed by a .gitattributes entry.
...@@ -201,6 +201,31 @@ function check_vid() { ...@@ -201,6 +201,31 @@ function check_vid() {
return use_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) { 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 // 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 = { ...@@ -437,7 +462,9 @@ var callbacks = {
callee_id_name: $("#cidname").val(), callee_id_name: $("#cidname").val(),
callee_id_number: $("#cid").val(), callee_id_number: $("#cid").val(),
useCamera: $("#usecamera").find(":selected").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'); $('#dialog-incoming-call').dialog('close');
}); });
...@@ -457,7 +484,8 @@ var callbacks = { ...@@ -457,7 +484,8 @@ var callbacks = {
useVideo: true, useVideo: true,
useStereo: $("#use_stereo").is(':checked'), useStereo: $("#use_stereo").is(':checked'),
useCamera: $("#usecamera").find(":selected").val(), 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 // the buttons in this jquery mobile wont hide .. gotta wrap them in a div as a workaround
...@@ -489,7 +517,9 @@ var callbacks = { ...@@ -489,7 +517,9 @@ var callbacks = {
} else { } else {
display("Talking to: " + d.cidString()); display("Talking to: " + d.cidString());
} }
goto_page("incall"); goto_page("incall");
break; break;
case $.verto.enum.state.hangup: case $.verto.enum.state.hangup:
$("#main_info").html("Call ended with cause: " + d.cause); $("#main_info").html("Call ended with cause: " + d.cause);
...@@ -738,6 +768,7 @@ function docall() { ...@@ -738,6 +768,7 @@ function docall() {
useStereo: $("#use_stereo").is(':checked'), useStereo: $("#use_stereo").is(':checked'),
useCamera: sessid ? "none" : $("#usecamera").find(":selected").val(), useCamera: sessid ? "none" : $("#usecamera").find(":selected").val(),
useMic: $("#usemic").find(":selected").val(), useMic: $("#usemic").find(":selected").val(),
useSpeak: $("#usespeak").find(":selected").val(),
dedEnc: $("#use_dedenc").is(':checked'), dedEnc: $("#use_dedenc").is(':checked'),
mirrorInput: $("#mirror_input").is(':checked'), mirrorInput: $("#mirror_input").is(':checked'),
userVariables: { userVariables: {
...@@ -874,14 +905,17 @@ function refresh_devices() ...@@ -874,14 +905,17 @@ function refresh_devices()
$("#useshare").selectmenu({}); $("#useshare").selectmenu({});
$("#useshare").selectmenu({}); $("#useshare").selectmenu({});
$("#usemic").selectmenu({}); $("#usemic").selectmenu({});
$("#usespeak").selectmenu({});
$("#useshare").selectmenu("enable"); $("#useshare").selectmenu("enable");
$("#useshare").selectmenu("enable"); $("#useshare").selectmenu("enable");
$("#usemic").selectmenu("enable"); $("#usemic").selectmenu("enable");
$("#usespeak").selectmenu("enable");
$("#useshare").empty(); $("#useshare").empty();
$("#usecamera").empty(); $("#usecamera").empty();
$("#usemic").empty(); $("#usemic").empty();
$("#usespeak").empty();
...@@ -889,6 +923,7 @@ function refresh_devices() ...@@ -889,6 +923,7 @@ function refresh_devices()
$("#usecamera").append(new Option("No Camera", "none")); $("#usecamera").append(new Option("No Camera", "none"));
$("#usemic").append(new Option("Do Not Specify", "any")); $("#usemic").append(new Option("Do Not Specify", "any"));
$("#usespeak").append(new Option("Do Not Specify", "any"));
for (var i in $.verto.videoDevices) { for (var i in $.verto.videoDevices) {
var source = $.verto.videoDevices[i]; var source = $.verto.videoDevices[i];
var o = new Option(source.label, source.id); var o = new Option(source.label, source.id);
...@@ -907,8 +942,8 @@ function refresh_devices() ...@@ -907,8 +942,8 @@ function refresh_devices()
x = 1; x = 1;
for (var i in $.verto.audioDevices) { for (var i in $.verto.audioInDevices) {
var source = $.verto.audioDevices[i]; var source = $.verto.audioInDevices[i];
var o = new Option(source.label, source.id); var o = new Option(source.label, source.id);
if (!x++) { if (!x++) {
o.selected = true; o.selected = true;
...@@ -916,6 +951,15 @@ function refresh_devices() ...@@ -916,6 +951,15 @@ function refresh_devices()
$("#usemic").append(o); $("#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"); var o = new Option("Screen", "screen");
o.selected = true; o.selected = true;
...@@ -925,6 +969,7 @@ function refresh_devices() ...@@ -925,6 +969,7 @@ function refresh_devices()
$("#usecamera").selectmenu('refresh', true); $("#usecamera").selectmenu('refresh', true);
$("#usemic").selectmenu('refresh', true); $("#usemic").selectmenu('refresh', true);
$("#usespeak").selectmenu('refresh', true);
$("#useshare").selectmenu('refresh', true); $("#useshare").selectmenu('refresh', true);
//$("input[type='radio']).checkboxradio({}); //$("input[type='radio']).checkboxradio({});
...@@ -945,6 +990,12 @@ function refresh_devices() ...@@ -945,6 +990,12 @@ function refresh_devices()
$('#usemic option[value=' + tmp + ']').prop('selected', 'selected').change(); $('#usemic option[value=' + tmp + ']').prop('selected', 'selected').change();
pop_select("#usemic","verto_demo_mic_selected", tmp); 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() { function init() {
...@@ -953,6 +1004,7 @@ function init() { ...@@ -953,6 +1004,7 @@ function init() {
$("#usecamera").selectmenu({}); $("#usecamera").selectmenu({});
$("#usemic").selectmenu({}); $("#usemic").selectmenu({});
$("#usespeak").selectmenu({});
$("#useshare").selectmenu({}); $("#useshare").selectmenu({});
if (!autocall) { if (!autocall) {
...@@ -1307,20 +1359,19 @@ function init() { ...@@ -1307,20 +1359,19 @@ function init() {
//localTag: $("#local_video").is(':checked') ? "local_webcam" : null, //localTag: $("#local_video").is(':checked') ? "local_webcam" : null,
ringFile: "sounds/bell_ring2.wav", ringFile: "sounds/bell_ring2.wav",
sessid: sessid, sessid: sessid,
//loginParams: {second_screen: second_screen},
videoParams: { videoParams: {
"minWidth": vid_width, "minWidth": vid_width,
"minHeight": vid_height, "minHeight": vid_height,
"maxWidth": vid_width, "maxWidth": vid_width,
"maxHeight": vid_height, "maxHeight": vid_height,
"minFrameRate": 15, "minFrameRate": 15,
"vertoBestFrameRate": 30, "vertoBestFrameRate": 30
//chromeMediaSource: 'screen',
//mediaSource: 'screen'
}, },
deviceParams: { 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: { // audioParams: {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论