in openmeetings-web/src/main/front/src/room/video.js [83:149]
function _getVideoStream(msg, state, callback) {
VideoSettings.constraints(sd, function(cnts) {
if (VideoUtil.hasCam(sd) !== cnts.videoEnabled || VideoUtil.hasMic(sd) !== cnts.audioEnabled) {
VideoMgrUtil.sendMessage({
id : 'devicesAltered'
, uid: sd.uid
, audio: cnts.audioEnabled
, video: cnts.videoEnabled
});
}
if (!cnts.audio && !cnts.video) {
OmUtil.error('Requested devices are not available');
VideoMgrUtil.close(sd.uid)
return;
}
navigator.mediaDevices.getUserMedia(cnts)
.then(stream => {
if (state.disposed || msg.instanceUid !== v.data('instance-uid')) {
return;
}
stream.getVideoTracks().forEach(track => track.enabled = cnts.videoEnabled);
stream.getAudioTracks().forEach(track => track.enabled = cnts.audioEnabled);
state.localStream = stream;
if (__pttEnabled(state)) {
OmUtil.alert('warning', $('#user-video').data('ptt-info'), 10000);
}
let _stream = stream;
const data = {};
if (stream.getAudioTracks().length !== 0) {
lm = vc.find('.level-meter');
lm.show();
data.aCtx = new AudioCtx();
data.gainNode = data.aCtx.createGain();
data.analyser = data.aCtx.createAnalyser();
data.aSrc = data.aCtx.createMediaStreamSource(stream);
data.aSrc.connect(data.gainNode);
data.gainNode.connect(data.analyser);
if (VideoUtil.isEdge()) {
data.analyser.connect(data.aCtx.destination);
} else {
data.aDest = data.aCtx.createMediaStreamDestination();
data.analyser.connect(data.aDest);
_stream = data.aDest.stream;
stream.getVideoTracks().forEach(track => _stream.addTrack(track));
}
}
state.data = data;
__createVideo(state);
state.stream = _stream;
callback(msg, state, cnts);
})
.catch(function(err) {
VideoMgrUtil.sendMessage({
id : 'devicesAltered'
, uid: sd.uid
, audio: false
, video: false
});
VideoMgrUtil.close(sd.uid);
if ('NotReadableError' === err.name) {
OmUtil.error('Camera/Microphone is busy and can\'t be used');
} else {
OmUtil.error(err);
}
});
});
}