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 4cbb622  [OPENMEETINGS-1649] settings dialog made more user friendly
4cbb622 is described below

commit 4cbb622b9743dbce69ac7b069360e6e6274b07e1
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Thu Oct 11 17:31:40 2018 +0700

    [OPENMEETINGS-1649] settings dialog made more user friendly
---
 .../openmeetings/core/remote/KurentoHandler.java   |   9 +
 .../apache/openmeetings/web/room/raw-settings.js   | 240 ++++++++++++---------
 .../apache/openmeetings/web/room/raw-video-util.js |   2 +-
 .../org/apache/openmeetings/web/room/raw-video.js  |  72 ++++---
 4 files changed, 191 insertions(+), 132 deletions(-)

diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
index 616b12b..e25f80b 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
@@ -184,6 +184,15 @@ public class KurentoHandler {
                        }
                        log.debug("Incoming message from user with ID '{}': 
{}", c.getUserId(), msg);
                        switch (cmdId) {
+                               case "devicesAltered":
+                                       if (!msg.getBoolean("audio") && 
c.hasActivity(Client.Activity.broadcastA)) {
+                                               
c.remove(Client.Activity.broadcastA);
+                                       }
+                                       if (!msg.getBoolean("video") && 
c.hasActivity(Client.Activity.broadcastV)) {
+                                               
c.remove(Client.Activity.broadcastV);
+                                       }
+                                       WebSocketHelper.sendRoom(new 
TextRoomMessage(c.getRoomId(), cm.update(c), RoomMessage.Type.rightUpdated, 
c.getUid()));
+                                       break;
                                case "toggleActivity":
                                        toggleActivity(c, 
Client.Activity.valueOf(msg.getString("activity")));
                                        break;
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
index 0c43819..ead26ca 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-settings.js
@@ -53,9 +53,12 @@ var MicLevel = (function() {
        }
        function _dispose() {
                if (!!ctx) {
-                       mic.disconnect(script);
-                       script.disconnect(ctx.destination);
+                       VideoUtil.cleanStream(mic.mediaStream);
+                       mic.disconnect();
+                       ctx.destination.disconnect();
+                       script.disconnect();
                        script.onaudioprocess = null;
+                       ctx.close();
                        ctx = null;
                }
        }
@@ -65,6 +68,7 @@ var MicLevel = (function() {
        };
 });
 var VideoSettings = (function() {
+       const DEV_AUDIO = 'audioinput', DEV_VIDEO = 'videoinput';
        let vs, lm, s, cam, mic, res, o, rtcPeer, timer
                , vidScroll, vid, recBtn, playBtn, recAllowed = false
                , level;
@@ -222,38 +226,39 @@ var VideoSettings = (function() {
        }
        //each bool OR 
https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
        // min/ideal/max/exact/mandatory can also be used
-       function _constraints(c) {
-               const cnts = {};
-               //TODO add check if constraint is supported
-               if (false === o.audioOnly && VideoUtil.hasVideo(c) && 
s.video.cam > -1) {
-                       cnts.video = {
-                               width: s.video.width
-                               , height: s.video.height
-                               , frameRate: o.camera.fps
-                       };
-                       if (!!s.video.camDevice) {
-                               cnts.video.deviceId = {
-                                       ideal: s.video.camDevice
+       function _constraints(c, callback) {
+               _getDevConstraints(function(devCnts){
+                       const cnts = {};
+                       if (devCnts.video && false === o.audioOnly && 
VideoUtil.hasVideo(c) && s.video.cam > -1) {
+                               cnts.video = {
+                                       width: s.video.width
+                                       , height: s.video.height
+                                       , frameRate: o.camera.fps
                                };
+                               if (!!s.video.camDevice) {
+                                       cnts.video.deviceId = {
+                                               ideal: s.video.camDevice
+                                       };
+                               }
+                       } else {
+                               cnts.video = false;
                        }
-               } else {
-                       cnts.video = false;
-               }
-               if (VideoUtil.hasAudio(c) && s.video.mic > -1) {
-                       cnts.audio = {
-                               sampleRate: o.microphone.rate
-                               , echoCancellation: o.microphone.echo
-                               , noiseSuppression: o.microphone.noise
-                       };
-                       if (!!s.video.micDevice) {
-                               cnts.audio.deviceId = {
-                                       ideal: s.video.micDevice
+                       if (devCnts.audio && VideoUtil.hasAudio(c) && 
s.video.mic > -1) {
+                               cnts.audio = {
+                                       sampleRate: o.microphone.rate
+                                       , echoCancellation: o.microphone.echo
+                                       , noiseSuppression: o.microphone.noise
                                };
+                               if (!!s.video.micDevice) {
+                                       cnts.audio.deviceId = {
+                                               ideal: s.video.micDevice
+                                       };
+                               }
+                       } else {
+                               cnts.audio = false;
                        }
-               } else {
-                       cnts.audio = false;
-               }
-               return cnts;
+                       callback(cnts);
+               });
        }
        function _readValues(msg, func) {
                const v = cam.find('option:selected')
@@ -269,35 +274,36 @@ var VideoSettings = (function() {
                vidScroll.scrollLeft(Math.max(0, s.video.width / 2 - 150))
                        .scrollTop(Math.max(0, s.video.height / 2 - 110));
                _clear();
-               const cnts = _constraints();
-               if (cnts.video !== false || cnts.audio !== false) {
-                       const options = VideoUtil.addIceServers({
-                               localVideo: vid[0]
-                               , mediaConstraints: cnts
-                       }, msg);
-                       rtcPeer = new 
kurentoUtils.WebRtcPeer.WebRtcPeerSendonly(
-                               options
-                               , function(error) {
-                                       if (error) {
-                                               return OmUtil.error(error);
-                                       }
-                                       level = MicLevel();
-                                       level.meter(rtcPeer, _micActivity, 
OmUtil.error);
-                                       rtcPeer.generateOffer(function(error, 
_offerSdp) {
+               _constraints(null, function(cnts) {
+                       if (cnts.video !== false || cnts.audio !== false) {
+                               const options = VideoUtil.addIceServers({
+                                       localVideo: vid[0]
+                                       , mediaConstraints: cnts
+                               }, msg);
+                               rtcPeer = new 
kurentoUtils.WebRtcPeer.WebRtcPeerSendonly(
+                                       options
+                                       , function(error) {
                                                if (error) {
-                                                       return 
OmUtil.error('Error generating the offer');
-                                               }
-                                               if (typeof(func) === 
'function') {
-                                                       func(_offerSdp, cnts);
-                                               } else {
-                                                       _allowRec(true);
+                                                       return 
OmUtil.error(error);
                                                }
+                                               level = MicLevel();
+                                               level.meter(rtcPeer, 
_micActivity, OmUtil.error);
+                                               
rtcPeer.generateOffer(function(error, _offerSdp) {
+                                                       if (error) {
+                                                               return 
OmUtil.error('Error generating the offer');
+                                                       }
+                                                       if (typeof(func) === 
'function') {
+                                                               func(_offerSdp, 
cnts);
+                                                       } else {
+                                                               _allowRec(true);
+                                                       }
+                                               });
                                        });
-                               });
-               }
-               if (!msg) {
-                       _updateRec();
-               }
+                       }
+                       if (!msg) {
+                               _updateRec();
+                       }
+               });
        }
 
        function _allowRec(allow) {
@@ -313,7 +319,12 @@ var VideoSettings = (function() {
        }
        function _setLoading(el) {
                el.find('option').remove();
-               
el.append(OmUtil.tmpl('#settings-option-loading'));//!settings-option-disabled
+               el.append(OmUtil.tmpl('#settings-option-loading'));
+               el.iconselectmenu('refresh');
+       }
+       function _setDisabled(el) {
+               el.find('option').remove();
+               el.append(OmUtil.tmpl('#settings-option-disabled'));
                el.iconselectmenu('refresh');
        }
        function _setSelectedDevice(dev, devIdx) {
@@ -323,6 +334,20 @@ var VideoSettings = (function() {
                }
                o.prop('selected', true);
        }
+       function _getDevConstraints(callback) {
+               navigator.mediaDevices.enumerateDevices()
+                       .then(function(devices) {
+                               const devCnts = {audio: false, video: false};
+                               devices.forEach(function(device) {
+                                       if (DEV_AUDIO === device.kind) {
+                                               devCnts.audio = true;
+                                       } else if (DEV_VIDEO === device.kind) {
+                                               devCnts.video = true;
+                                       }
+                               });
+                               callback(devCnts);
+                       })
+       }
        function _initDevices() {
                if (!navigator.mediaDevices || 
!navigator.mediaDevices.enumerateDevices) {
                        OmUtil.error('enumerateDevices() not supported.');
@@ -330,55 +355,62 @@ var VideoSettings = (function() {
                }
                _setLoading(cam);
                _setLoading(mic);
-               navigator.mediaDevices.getUserMedia({video:true, audio:true})
-                       .then(function(stream) {
-                               const devices = 
navigator.mediaDevices.enumerateDevices()
-                                       .then(function(devices) {
-                                               _clear(stream);
-                                               return devices;
-                                       })
-                                       .catch(function(err) {
-                                               _clear(stream);
-                                               throw err;
+               _getDevConstraints(function(devCnts) {
+                       if (!devCnts.audio && !devCnts.video) {
+                               _setDisabled(cam);
+                               _setDisabled(mic);
+                               return;
+                       }
+                       navigator.mediaDevices.getUserMedia(devCnts)
+                               .then(function(stream) {
+                                       const devices = 
navigator.mediaDevices.enumerateDevices()
+                                               .then(function(devices) {
+                                                       _clear(stream);
+                                                       return devices;
+                                               })
+                                               .catch(function(err) {
+                                                       _clear(stream);
+                                                       throw err;
+                                               });
+                                       return devices;
+                               })
+                               .then(function(devices) {
+                                       let cCount = 0, mCount = 0;
+                                       _load();
+                                       _setDisabled(cam);
+                                       _setDisabled(mic);
+                                       devices.forEach(function(device) {
+                                               if (DEV_AUDIO === device.kind) {
+                                                       const o = 
$('<option></option>').attr('value', mCount).text(device.label)
+                                                               
.data('device-id', device.deviceId);
+                                                       mic.append(o);
+                                                       mCount++;
+                                               } else if (DEV_VIDEO === 
device.kind) {
+                                                       const o = 
$('<option></option>').attr('value', cCount).text(device.label)
+                                                               
.data('device-id', device.deviceId);
+                                                       cam.append(o);
+                                                       cCount++;
+                                               }
                                        });
-                               return devices;
-                       })
-                       .then(function(devices) {
-                               let cCount = 0, mCount = 0;
-                               _load();
-                               cam.find('option').remove();
-                               
cam.append(OmUtil.tmpl('#settings-option-disabled'));
-                               mic.find('option').remove();
-                               
mic.append(OmUtil.tmpl('#settings-option-disabled'));
-                               devices.forEach(function(device) {
-                                       if ('audioinput' === device.kind) {
-                                               const o = 
$('<option></option>').attr('value', mCount).text(device.label)
-                                                       .data('device-id', 
device.deviceId);
-                                               mic.append(o);
-                                               mCount++;
-                                       } else if ('videoinput' === 
device.kind) {
-                                               const o = 
$('<option></option>').attr('value', cCount).text(device.label)
-                                                       .data('device-id', 
device.deviceId);
-                                               cam.append(o);
-                                               cCount++;
-                                       }
-                               });
-                               _setSelectedDevice(cam, s.video.cam);
-                               _setSelectedDevice(mic, s.video.mic);
-                               cam.iconselectmenu('refresh');
-                               mic.iconselectmenu('refresh');
-                               res.find('option').each(function() {
-                                       const o = $(this).data();
-                                       if (o.width === s.video.width && 
o.height === s.video.height) {
-                                               $(this).prop('selected', true);
-                                               return false;
-                                       }
+                                       _setSelectedDevice(cam, s.video.cam);
+                                       _setSelectedDevice(mic, s.video.mic);
+                                       cam.iconselectmenu('refresh');
+                                       mic.iconselectmenu('refresh');
+                                       res.find('option').each(function() {
+                                               const o = $(this).data();
+                                               if (o.width === s.video.width 
&& o.height === s.video.height) {
+                                                       
$(this).prop('selected', true);
+                                                       return false;
+                                               }
+                                       });
+                                       _readValues();
+                               })
+                               .catch(function(err) {
+                                       _setDisabled(cam);
+                                       _setDisabled(mic);
+                                       OmUtil.error(err);
                                });
-                               _readValues();
-                       })
-                       .catch(function(err) {
-                               OmUtil.error(err);
-                       });
+               });
        }
        function _open() {
                Wicket.Event.subscribe('/websocket/message', _onWsMessage);
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-util.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-util.js
index 18b740f..35bed4e 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-util.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video-util.js
@@ -114,7 +114,7 @@ var VideoUtil = (function() {
        function _cleanPeer(peer) {
                if (!!peer) {
                        const pc = peer.peerConnection;
-                       if (!!pc) {
+                       if (!!pc && !!pc.getLocalStreams()) {
                                pc.getLocalStreams().forEach(function(stream) {
                                        _cleanStream(stream);
                                });
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
index 1a14d3c..b05b680 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/raw-video.js
@@ -45,28 +45,40 @@ var Video = (function() {
                }
        }
        function _createSendPeer(msg) {
-               const constraints = VideoSettings.constraints(c);
-               navigator.mediaDevices.getUserMedia(constraints)
-                       .then(function(stream) {
-                               if (stream.getAudioTracks().length !== 0) {
-                                       vol.show();
-                                       lm = vc.find('.level-meter')
-                                               .kendoProgressBar({ value: 0, 
showStatus: false, orientation: 'vertical' });
-                                       lm.height(vc.height() - 10);
-                                       aCtx = new AudioContext();
-                                       gainNode = aCtx.createGain();
-                                       aSrc = 
aCtx.createMediaStreamSource(stream);
-                                       aSrc.connect(gainNode);
-                                       gainNode.connect(aCtx.destination);
-                                       _handleVolume(lastVolume);
-                               }
-                               const options = VideoUtil.addIceServers({
-                                       localVideo: video[0]
-                                       , videoStream: stream
-                                       , mediaConstraints: constraints
-                                       , onicecandidate: self.onIceCandidate
-                               }, msg);
-                               rtcPeer = new 
kurentoUtils.WebRtcPeer.WebRtcPeerSendonly(
+               VideoSettings.constraints(c, function(cnts) {
+                       if ((VideoUtil.hasVideo(c) && !cnts.video) || 
(VideoUtil.hasAudio(c) && !cnts.audio)) {
+                               VideoManager.sendMessage({
+                                       id : 'devicesAltered'
+                                       , audio: !!cnts.audio
+                                       , video: !!cnts.video
+                               });
+                       }
+                       if (!cnts.audio && !cnts.video) {
+                               OmUtil.error("Requested devices are not 
available");
+                               VideoManager.close(c.uid)
+                               return;
+                       }
+                       navigator.mediaDevices.getUserMedia(cnts)
+                               .then(function(stream) {
+                                       if (stream.getAudioTracks().length !== 
0) {
+                                               vol.show();
+                                               lm = vc.find('.level-meter')
+                                                       .kendoProgressBar({ 
value: 0, showStatus: false, orientation: 'vertical' });
+                                               lm.height(vc.height() - 10);
+                                               aCtx = new AudioContext();
+                                               gainNode = aCtx.createGain();
+                                               aSrc = 
aCtx.createMediaStreamSource(stream);
+                                               aSrc.connect(gainNode);
+                                               
gainNode.connect(aCtx.destination);
+                                               _handleVolume(lastVolume);
+                                       }
+                                       const options = 
VideoUtil.addIceServers({
+                                               localVideo: video[0]
+                                               , videoStream: stream
+                                               , mediaConstraints: cnts
+                                               , onicecandidate: 
self.onIceCandidate
+                                       }, msg);
+                                       rtcPeer = new 
kurentoUtils.WebRtcPeer.WebRtcPeerSendonly(
                                                options
                                                , function (error) {
                                                        if (error) {
@@ -85,10 +97,11 @@ var Video = (function() {
                                                                });
                                                        });
                                                });
-                       })
-                       .catch(function(err) {
-                               OmUtil.error(err);
-                       });
+                               })
+                               .catch(function(err) {
+                                       OmUtil.error(err);
+                               });
+               });
        }
        function _createResvPeer(msg) {
                const options = VideoUtil.addIceServers({
@@ -348,13 +361,14 @@ var Video = (function() {
        }
        function _cleanup() {
                OmUtil.log('Disposing participant ' + c.uid);
-               VideoUtil.cleanPeer(rtcPeer);
                if (!!gainNode) {
                        gainNode.disconnect();
+                       gainNode = null;
                }
                if (!!aSrc) {
                        VideoUtil.cleanStream(aSrc.mediaStream);
                        aSrc.disconnect();
+                       aSrc = null;
                }
                if (!!aCtx) {
                        if (!!aCtx.destination) {
@@ -364,7 +378,10 @@ var Video = (function() {
                        aCtx = null;
                }
                if (!!video && video.length > 0) {
+                       VideoUtil.cleanStream(video[0].srcObject);
                        video[0].srcObject = null;
+                       video.remove();
+                       video = null;
                }
                if (!!lm && lm.length > 0) {
                        _micActivity(0);
@@ -374,6 +391,7 @@ var Video = (function() {
                        level.dispose();
                        level = null;
                }
+               VideoUtil.cleanPeer(rtcPeer);
                vc.find('audio,video').remove();
        }
 

Reply via email to