You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/03/21 08:40:48 UTC
[openmeetings] branch master updated: [OPENMEETINGS-1854] recording
and volume-meter seems to work
This is an automated email from the ASF dual-hosted git repository.
solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/master by this push:
new d29279b [OPENMEETINGS-1854] recording and volume-meter seems to work
d29279b is described below
commit d29279b90c95e950d463090388ad08edc5312d9b
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Mar 21 15:40:37 2018 +0700
[OPENMEETINGS-1854] recording and volume-meter seems to work
---
.../apache/openmeetings/web/room/kurento-utils.js | 370 +++++++++++++++------
.../apache/openmeetings/web/room/settings-base.js | 10 +-
2 files changed, 269 insertions(+), 111 deletions(-)
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/kurento-utils.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/kurento-utils.js
index 815add3..3a3979b 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/kurento-utils.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/kurento-utils.js
@@ -1,4 +1,4 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.kurentoUtils = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0) [...]
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.kurentoUtils = f()}})(function(){var define,module,exports;return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)ret [...]
var freeice = require('freeice');
var inherits = require('inherits');
var UAParser = require('ua-parser-js');
@@ -30,7 +30,7 @@ var parser = new UAParser(ua);
var browser = parser.getBrowser();
var usePlanB = false;
if (browser.name === 'Chrome' || browser.name === 'Chromium') {
- logger.info(browser.name + ': using SDP PlanB');
+ logger.debug(browser.name + ': using SDP PlanB');
usePlanB = true;
}
function noop(error) {
@@ -55,7 +55,7 @@ function bufferizeCandidates(pc, onerror) {
if (this.signalingState === 'stable') {
while (candidatesQueue.length) {
var entry = candidatesQueue.shift();
- this.addIceCandidate(entry.candidate, entry.callback, entry.callback);
+ pc.addIceCandidate(entry.candidate, entry.callback, entry.callback);
}
}
});
@@ -228,7 +228,7 @@ function WebRtcPeer(mode, options, callback) {
candidategatheringdone = true;
}
});
- pc.ontrack = options.onaddstream;
+ pc.onaddstream = options.onaddstream;
pc.onnegotiationneeded = options.onnegotiationneeded;
this.on('newListener', function (event, listener) {
if (event === 'icecandidate' || event === 'candidategatheringdone') {
@@ -265,17 +265,17 @@ function WebRtcPeer(mode, options, callback) {
offerToReceiveVideo: mode !== 'sendonly' && offerVideo
};
var constraints = browserDependantConstraints;
- logger.info('constraints: ' + JSON.stringify(constraints));
+ logger.debug('constraints: ' + JSON.stringify(constraints));
pc.createOffer(constraints).then(function (offer) {
- logger.info('Created SDP offer');
+ logger.debug('Created SDP offer');
offer = mangleSdpToAddSimulcast(offer);
return pc.setLocalDescription(offer);
}).then(function () {
var localDescription = pc.localDescription;
- logger.info('Local description set', localDescription.sdp);
+ logger.debug('Local description set', localDescription.sdp);
if (multistream && usePlanB) {
localDescription = interop.toUnifiedPlan(localDescription);
- logger.info('offer::origPlanB->UnifiedPlan', dumpSDP(localDescription));
+ logger.debug('offer::origPlanB->UnifiedPlan', dumpSDP(localDescription));
}
callback(null, localDescription.sdp, self.processAnswer.bind(self));
}).catch(callback);
@@ -288,16 +288,15 @@ function WebRtcPeer(mode, options, callback) {
};
function setRemoteVideo() {
if (remoteVideo) {
- var stream = pc.getRemoteStreams()[0];
- var url = stream ? URL.createObjectURL(stream) : '';
remoteVideo.pause();
- remoteVideo.src = url;
+ var stream = pc.getRemoteStreams()[0];
+ remoteVideo.srcObject = stream;
+ logger.debug('Remote stream:', stream);
remoteVideo.load();
- logger.info('Remote URL:', url);
}
}
this.showLocalVideo = function () {
- localVideo.src = URL.createObjectURL(videoStream);
+ localVideo.srcObject = videoStream;
localVideo.muted = true;
};
this.send = function (data) {
@@ -315,10 +314,10 @@ function WebRtcPeer(mode, options, callback) {
});
if (multistream && usePlanB) {
var planBAnswer = interop.toPlanB(answer);
- logger.info('asnwer::planB', dumpSDP(planBAnswer));
+ logger.debug('asnwer::planB', dumpSDP(planBAnswer));
answer = planBAnswer;
}
- logger.info('SDP answer received, setting remote description');
+ logger.debug('SDP answer received, setting remote description');
if (pc.signalingState === 'closed') {
return callback('PeerConnection is closed');
}
@@ -335,10 +334,10 @@ function WebRtcPeer(mode, options, callback) {
});
if (multistream && usePlanB) {
var planBOffer = interop.toPlanB(offer);
- logger.info('offer::planB', dumpSDP(planBOffer));
+ logger.debug('offer::planB', dumpSDP(planBOffer));
offer = planBOffer;
}
- logger.info('SDP offer received, setting remote description');
+ logger.debug('SDP offer received, setting remote description');
if (pc.signalingState === 'closed') {
return callback('PeerConnection is closed');
}
@@ -348,22 +347,22 @@ function WebRtcPeer(mode, options, callback) {
return pc.createAnswer();
}).then(function (answer) {
answer = mangleSdpToAddSimulcast(answer);
- logger.info('Created SDP answer');
+ logger.debug('Created SDP answer');
return pc.setLocalDescription(answer);
}).then(function () {
var localDescription = pc.localDescription;
if (multistream && usePlanB) {
localDescription = interop.toUnifiedPlan(localDescription);
- logger.info('answer::origPlanB->UnifiedPlan', dumpSDP(localDescription));
+ logger.debug('answer::origPlanB->UnifiedPlan', dumpSDP(localDescription));
}
- logger.info('Local description set', localDescription.sdp);
+ logger.debug('Local description set', localDescription.sdp);
callback(null, localDescription.sdp);
}).catch(callback);
};
function mangleSdpToAddSimulcast(answer) {
if (simulcast) {
if (browser.name === 'Chrome' || browser.name === 'Chromium') {
- logger.info('Adding multicast info');
+ logger.debug('Adding multicast info');
answer = new RTCSessionDescription({
'type': answer.type,
'sdp': removeFIDFromOffer(answer.sdp) + getSimulcastInfo(videoStream)
@@ -420,13 +419,13 @@ function WebRtcPeer(mode, options, callback) {
this.on('_dispose', function () {
if (localVideo) {
localVideo.pause();
- localVideo.src = '';
+ localVideo.srcObject = null;
localVideo.load();
localVideo.muted = false;
}
if (remoteVideo) {
remoteVideo.pause();
- remoteVideo.src = '';
+ remoteVideo.srcObject = null;
remoteVideo.load();
}
self.removeAllListeners();
@@ -488,7 +487,7 @@ WebRtcPeer.prototype.getRemoteStream = function (index) {
}
};
WebRtcPeer.prototype.dispose = function () {
- logger.info('Disposing WebRtcPeer');
+ logger.debug('Disposing WebRtcPeer');
var pc = this.peerConnection;
var dc = this.dataChannel;
try {
@@ -2911,7 +2910,7 @@ exports.parse = function(sdp) {
},{"sdp-transform":14}],21:[function(require,module,exports){
/**
- * UAParser.js v0.7.12
+ * UAParser.js v0.7.17
* Lightweight JavaScript-based User-Agent string parser
* https://github.com/faisalman/ua-parser-js
*
@@ -2928,7 +2927,7 @@ exports.parse = function(sdp) {
/////////////
- var LIBVERSION = '0.7.12',
+ var LIBVERSION = '0.7.17',
EMPTY = '',
UNKNOWN = '?',
FUNC_TYPE = 'function',
@@ -2993,35 +2992,29 @@ exports.parse = function(sdp) {
var mapper = {
- rgx : function () {
+ rgx : function (ua, arrays) {
- var result, i = 0, j, k, p, q, matches, match, args = arguments;
+ //var result = {},
+ var i = 0, j, k, p, q, matches, match;//, args = arguments;
- // loop through all regexes maps
- while (i < args.length && !matches) {
+ /*// construct object barebones
+ for (p = 0; p < args[1].length; p++) {
+ q = args[1][p];
+ result[typeof q === OBJ_TYPE ? q[0] : q] = undefined;
+ }*/
- var regex = args[i], // even sequence (0,2,4,..)
- props = args[i + 1]; // odd sequence (1,3,5,..)
+ // loop through all regexes maps
+ while (i < arrays.length && !matches) {
- // construct object barebones
- if (typeof result === UNDEF_TYPE) {
- result = {};
- for (p in props) {
- if (props.hasOwnProperty(p)){
- q = props[p];
- if (typeof q === OBJ_TYPE) {
- result[q[0]] = undefined;
- } else {
- result[q] = undefined;
- }
- }
- }
- }
+ var regex = arrays[i], // even sequence (0,2,4,..)
+ props = arrays[i + 1]; // odd sequence (1,3,5,..)
+ j = k = 0;
// try matching uastring with regexes
- j = k = 0;
while (j < regex.length && !matches) {
- matches = regex[j++].exec(this.getUA());
+
+ matches = regex[j++].exec(ua);
+
if (!!matches) {
for (p = 0; p < props.length; p++) {
match = matches[++k];
@@ -3031,32 +3024,33 @@ exports.parse = function(sdp) {
if (q.length == 2) {
if (typeof q[1] == FUNC_TYPE) {
// assign modified match
- result[q[0]] = q[1].call(this, match);
+ this[q[0]] = q[1].call(this, match);
} else {
// assign given value, ignore regex match
- result[q[0]] = q[1];
+ this[q[0]] = q[1];
}
} else if (q.length == 3) {
// check whether function or regex
if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
// call function (usually string mapper)
- result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
} else {
// sanitize match using given regex
- result[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
}
} else if (q.length == 4) {
- result[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
}
} else {
- result[q] = match ? match : undefined;
+ this[q] = match ? match : undefined;
}
}
}
}
i += 2;
}
- return result;
+ // console.log(this);
+ //return this;
},
str : function (str, map) {
@@ -3171,8 +3165,8 @@ exports.parse = function(sdp) {
// Webkit/KHTML based
/(rekonq)\/([\w\.]+)*/i, // Rekonq
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\/([\w\.-]+)/i
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS
+ /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser)\/([\w\.-]+)/i
+ // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser
], [NAME, VERSION], [
/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
@@ -3184,42 +3178,55 @@ exports.parse = function(sdp) {
/(yabrowser)\/([\w\.]+)/i // Yandex
], [[NAME, 'Yandex'], VERSION], [
+ /(puffin)\/([\w\.]+)/i // Puffin
+ ], [[NAME, 'Puffin'], VERSION], [
+
+ /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i
+ // UCBrowser
+ ], [[NAME, 'UCBrowser'], VERSION], [
+
/(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
], [[NAME, /_/g, ' '], VERSION], [
/(micromessenger)\/([\w\.]+)/i // WeChat
], [[NAME, 'WeChat'], VERSION], [
+ /(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
+ ], [NAME, VERSION], [
+
+ /m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
+ ], [NAME, VERSION], [
+
/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
], [VERSION, [NAME, 'MIUI Browser']], [
+ /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
+ ], [VERSION, [NAME, 'Facebook']], [
+
+ /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
+ ], [VERSION, [NAME, 'Chrome Headless']], [
+
/\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
- /android.+samsungbrowser\/([\w\.]+)/i,
+ /((?:oculus|samsung)browser)\/([\w\.]+)/i
+ ], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
+
/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
], [VERSION, [NAME, 'Android Browser']], [
- /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,
+ /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
// Chrome/OmniWeb/Arora/Tizen/Nokia
- /(qqbrowser)[\/\s]?([\w\.]+)/i
- // QQBrowser
], [NAME, VERSION], [
- /(uc\s?browser)[\/\s]?([\w\.]+)/i,
- /ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,
- /juc.+(ucweb)[\/\s]?([\w\.]+)/i
- // UCBrowser
- ], [[NAME, 'UCBrowser'], VERSION], [
-
/(dolfin)\/([\w\.]+)/i // Dolphin
], [[NAME, 'Dolphin'], VERSION], [
/((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
], [[NAME, 'Chrome'], VERSION], [
- /;fbav\/([\w\.]+);/i // Facebook App for iOS
- ], [VERSION, [NAME, 'Facebook']], [
+ /(coast)\/([\w\.]+)/i // Opera Coast
+ ], [[NAME, 'Opera Coast'], VERSION], [
/fxios\/([\w\.-]+)/i // Firefox for iOS
], [VERSION, [NAME, 'Firefox']], [
@@ -3230,6 +3237,9 @@ exports.parse = function(sdp) {
/version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
], [VERSION, NAME], [
+ /webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
+ ], [[NAME, 'GSA'], VERSION], [
+
/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
@@ -3424,8 +3434,8 @@ exports.parse = function(sdp) {
], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
/(blackberry)[\s-]?(\w+)/i, // BlackBerry
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
- // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola/Polytron
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
+ // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
/(hp)\s([\w\s]+\w)/i, // HP iPAQ
/(asus)-?(\w+)/i // Asus
], [VENDOR, MODEL, [TYPE, MOBILE]], [
@@ -3438,8 +3448,8 @@ exports.parse = function(sdp) {
/(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
/(sony)?(?:sgp.+)\sbuild\//i
], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
- /(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i
- ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Phone'], [TYPE, MOBILE]], [
+ /android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
/\s(ouya)\s/i, // Ouya
/(nintendo)\s([wids3u]+)/i // Nintendo
@@ -3459,14 +3469,15 @@ exports.parse = function(sdp) {
/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
/(zte)-(\w+)*/i, // ZTE
- /(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
- // Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony
+ /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
+ // Alcatel/GeeksPhone/Lenovo/Nexian/Panasonic/Sony
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
/(nexus\s9)/i // HTC Nexus 9
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
- /(nexus\s6p)/i // Huawei Nexus 6P
+ /d\/huawei([\w\s-]+)[;\)]/i,
+ /(nexus\s6p)/i // Huawei
], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
/(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
@@ -3515,12 +3526,15 @@ exports.parse = function(sdp) {
/android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
+ /android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
+ ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
/(lg) netcast\.tv/i // LG SmartTV
], [VENDOR, MODEL, [TYPE, SMARTTV]], [
/(nexus\s[45])/i, // LG
- /lg[e;\s\/-]+(\w+)*/i
+ /lg[e;\s\/-]+(\w+)*/i,
+ /android.+lg(\-?[\d\w]+)\s+build/i
], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
/android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
@@ -3532,22 +3546,107 @@ exports.parse = function(sdp) {
/((pebble))app\/[\d\.]+\s/i // Pebble
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
+ /android.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
+
+ /crkey/i // Google Chromecast
+ ], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [
+
/android.+;\s(glass)\s\d/i // Google Glass
], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
+ /android.+;\s(pixel c)\s/i // Google Pixel C
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
+
+ /android.+;\s(pixel xl|pixel)\s/i // Google Pixel
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
+
/android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
- /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i // Xiaomi Mi
+ /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Mi
+ /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+)?)\s+build/i // Redmi Phones
], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
+ /android.+(mi[\s\-_]*(?:pad)?(?:[\s_]*[\w\s]+)?)\s+build/i // Mi Pad tablets
+ ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
+ /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu Tablet
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [
/android.+a000(1)\s+build/i // OnePlus
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
- /\s(tablet)[;\/]/i, // Unidentifiable Tablet
+ /android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*(Venue[\d\s]*)\s+build/i // Dell Venue Tablets
+ ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
+ ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
+
+ /android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i // Barnes & Noble Tablet
+ ], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [
+
+ /android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
+ ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*(zte)?.+(k\d{2})\s+build/i // ZTE K Series Tablet
+ ], [[VENDOR, 'ZTE'], MODEL, [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
+
+ /android.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
+ ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
+
+ /(android).+[;\/]\s+([YR]\d{2}x?.*)\s+build/i,
+ /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(.+)\s+build/i // Dragon Touch Tablet
+ ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*(NS-?.+)\s+build/i // Insignia Tablets
+ ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*((NX|Next)-?.+)\s+build/i // NextBook Tablets
+ ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*(Xtreme\_?)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
+ ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
+
+ /android.+[;\/]\s*(LVTEL\-?)?(V1[12])\s+build/i // LvTel Phones
+ ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
+
+ /android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
+ ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(.*\b)\s+build/i // Le Pan Tablets
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i // MachSpeed Tablets
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
+
+ /android.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
+
+ /android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
+
+ /android.+(Gigaset)[\s\-]+(Q.+)\s+build/i // Gigaset Tablets
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
+
+ /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
/\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
- ], [[TYPE, util.lowerize], VENDOR, MODEL]
+ ], [[TYPE, util.lowerize], VENDOR, MODEL], [
- /*//////////////////////////
+ /(android.+)[;\/].+build/i // Generic Android Device
+ ], [MODEL, [VENDOR, 'Generic']]
+
+
+ /*//////////////////////////
// TODO: move to string map
////////////////////////////
@@ -3571,17 +3670,6 @@ exports.parse = function(sdp) {
/(SM-T311)/i // Samsung Galaxy Tab 3 8.0
], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
- /(R1001)/i // Oppo R1001
- ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
- /(X9006)/i // Oppo Find 7a
- ], [[MODEL, 'Find 7a'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
- /(R2001)/i // Oppo YOYO R2001
- ], [[MODEL, 'Yoyo R2001'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
- /(R815)/i // Oppo Clover R815
- ], [[MODEL, 'Clover R815'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
- /(U707)/i // Oppo Find Way S
- ], [[MODEL, 'Find Way S'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
-
/(T3C)/i // Advan Vandroid T3C
], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
/(ADVAN T1J\+)/i // Advan Vandroid T1J+
@@ -3680,8 +3768,9 @@ exports.parse = function(sdp) {
/(haiku)\s(\w+)/i // Haiku
], [NAME, VERSION],[
- /(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
- ], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
+ /cfnetwork\/.+darwin/i,
+ /ip[honead]+(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
/(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
/(macintosh|mac(?=_powerpc)\s)/i // Mac OS
@@ -3701,35 +3790,68 @@ exports.parse = function(sdp) {
/////////////////
// Constructor
////////////////
-
-
+ /*
+ var Browser = function (name, version) {
+ this[NAME] = name;
+ this[VERSION] = version;
+ };
+ var CPU = function (arch) {
+ this[ARCHITECTURE] = arch;
+ };
+ var Device = function (vendor, model, type) {
+ this[VENDOR] = vendor;
+ this[MODEL] = model;
+ this[TYPE] = type;
+ };
+ var Engine = Browser;
+ var OS = Browser;
+ */
var UAParser = function (uastring, extensions) {
+ if (typeof uastring === 'object') {
+ extensions = uastring;
+ uastring = undefined;
+ }
+
if (!(this instanceof UAParser)) {
return new UAParser(uastring, extensions).getResult();
}
var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
+ //var browser = new Browser();
+ //var cpu = new CPU();
+ //var device = new Device();
+ //var engine = new Engine();
+ //var os = new OS();
this.getBrowser = function () {
- var browser = mapper.rgx.apply(this, rgxmap.browser);
- browser.major = util.major(browser.version);
+ var browser = { name: undefined, version: undefined };
+ mapper.rgx.call(browser, ua, rgxmap.browser);
+ browser.major = util.major(browser.version); // deprecated
return browser;
};
this.getCPU = function () {
- return mapper.rgx.apply(this, rgxmap.cpu);
+ var cpu = { architecture: undefined };
+ mapper.rgx.call(cpu, ua, rgxmap.cpu);
+ return cpu;
};
this.getDevice = function () {
- return mapper.rgx.apply(this, rgxmap.device);
+ var device = { vendor: undefined, model: undefined, type: undefined };
+ mapper.rgx.call(device, ua, rgxmap.device);
+ return device;
};
this.getEngine = function () {
- return mapper.rgx.apply(this, rgxmap.engine);
+ var engine = { name: undefined, version: undefined };
+ mapper.rgx.call(engine, ua, rgxmap.engine);
+ return engine;
};
this.getOS = function () {
- return mapper.rgx.apply(this, rgxmap.os);
+ var os = { name: undefined, version: undefined };
+ mapper.rgx.call(os, ua, rgxmap.os);
+ return os;
};
- this.getResult = function() {
+ this.getResult = function () {
return {
ua : this.getUA(),
browser : this.getBrowser(),
@@ -3744,6 +3866,11 @@ exports.parse = function(sdp) {
};
this.setUA = function (uastring) {
ua = uastring;
+ //browser = new Browser();
+ //cpu = new CPU();
+ //device = new Device();
+ //engine = new Engine();
+ //os = new OS();
return this;
};
return this;
@@ -3777,7 +3904,7 @@ exports.parse = function(sdp) {
NAME : NAME,
VERSION : VERSION
};
-
+ //UAParser.Utils = util;
///////////
// Export
@@ -3790,6 +3917,35 @@ exports.parse = function(sdp) {
if (typeof module !== UNDEF_TYPE && module.exports) {
exports = module.exports = UAParser;
}
+ // TODO: test!!!!!!!!
+ /*
+ if (require && require.main === module && process) {
+ // cli
+ var jsonize = function (arr) {
+ var res = [];
+ for (var i in arr) {
+ res.push(new UAParser(arr[i]).getResult());
+ }
+ process.stdout.write(JSON.stringify(res, null, 2) + '\n');
+ };
+ if (process.stdin.isTTY) {
+ // via args
+ jsonize(process.argv.slice(2));
+ } else {
+ // via pipe
+ var str = '';
+ process.stdin.on('readable', function() {
+ var read = process.stdin.read();
+ if (read !== null) {
+ str += read;
+ }
+ });
+ process.stdin.on('end', function () {
+ jsonize(str.replace(/\n$/, '').split('\n'));
+ });
+ }
+ }
+ */
exports.UAParser = UAParser;
} else {
// requirejs env (optional)
@@ -3797,7 +3953,7 @@ exports.parse = function(sdp) {
define(function () {
return UAParser;
});
- } else {
+ } else if (window) {
// browser env
window.UAParser = UAParser;
}
@@ -3808,11 +3964,11 @@ exports.parse = function(sdp) {
// In AMD env the global scope should be kept clean, but jQuery is an exception.
// jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
// and we should catch that.
- var $ = window.jQuery || window.Zepto;
+ var $ = window && (window.jQuery || window.Zepto);
if (typeof $ !== UNDEF_TYPE) {
var parser = new UAParser();
$.ua = parser.getResult();
- $.ua.get = function() {
+ $.ua.get = function () {
return parser.getUA();
};
$.ua.set = function (uastring) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js
index eef5ea1..3884f30 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/settings-base.js
@@ -18,7 +18,7 @@ var MicLevel = (function() {
script.connect(ctx.destination);
let t = Date.now();
script.onaudioprocess = function(event) {
- const arr = event.inputBuffer.getChannelData()
+ const arr = event.inputBuffer.getChannelData(0)
, al = arr.length;
let avg = 0.0;
for (let i = 0; i < al; ++i) {
@@ -85,6 +85,7 @@ var VideoSettings = (function() {
}
if (!!rtcPeer) {
rtcPeer.dispose();
+ rtcPeer = null;
}
if (!!level) {
level.dispose();
@@ -307,13 +308,13 @@ var VideoSettings = (function() {
cCount++;
}
});
- cam.prop('disabled', false).change(function() {
+ cam.prop('disabled', false).off().change(function() {
_readValues();
});
- mic.prop('disabled', false).change(function() {
+ mic.prop('disabled', false).off().change(function() {
_readValues();
});
- res.change(function() {
+ res.off().change(function() {
_readValues();
});
res.find('option').each(function() {
@@ -333,6 +334,7 @@ var VideoSettings = (function() {
Wicket.Event.subscribe("/websocket/message", _onWsMessage);
recAllowed = false;
timer.hide();
+ _micActivity(0);
vs.dialog('open');
_load();
_initDevices();
--
To stop receiving notification emails like this one, please contact
solomax@apache.org.