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 2017/01/11 09:15:37 UTC

svn commit: r1778259 [1/2] - in /openmeetings/application: branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ branches/3.2.x/openmeetings-flash/src/main/swf/ branches/3.2.x/openmeetings-flash/src/main/swf/base/ bra...

Author: solomax
Date: Wed Jan 11 09:15:37 2017
New Revision: 1778259

URL: http://svn.apache.org/viewvc?rev=1778259&view=rev
Log:
[OPENMEETINGS-1376] AV settings are being constructed on server

Modified:
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx
    openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/RefreshIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/css/room.css

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Wed Jan 11 09:15:37 2017
@@ -990,39 +990,26 @@ public class ScopeApplicationAdapter ext
 	}
 
 	/**
-	 * this must be set _after_ the Video/Audio-Settings have been chosen (see
-	 * editrecordstream.lzx) but _before_ anything else happens, it cannot be
-	 * applied _after_ the stream has started! 
-	 * avsettings can be: 
-	 * 		av - video and audio
-	 * 		a - audio only
-	 * 		v - video only
-	 * 		n - no a/v only static image
-	 * furthermore
+	 * This method is used to set/update broadCastID of current client
 	 * 
-	 * @param avsettings
-	 * @param vWidth
-	 * @param vHeight
+	 * @param updateBroadcastId boolean flag 
 	 * 
 	 * @return BroadcastId in case of no errors, -1 otherwise
 	 */
-	public long setUserAVSettings(String avsettings, Integer vWidth, Integer vHeight, boolean updateBroadcastId) {
+	public long setUserAVSettings(boolean updateBroadcastId) {
 		try {
 			String streamid = Red5.getConnectionLocal().getClient().getId();
-			log.debug("-----------  setUserAVSettings {} {}", streamid, avsettings);
-			Client currentClient = sessionManager.getClientByStreamId(streamid, null);
-			if (currentClient == null) {
+			log.debug("-----------  setUserAVSettings {}", streamid);
+			Client rcl = sessionManager.getClientByStreamId(streamid, null);
+			if (rcl == null) {
 				log.warn("Failed to find appropriate clients");
 				return -1;
 			}
-			currentClient.setAvsettings(avsettings);
-			currentClient.setVWidth(vWidth);
-			currentClient.setVHeight(vHeight);
 			if (updateBroadcastId) {
-				currentClient.setBroadCastID(nextBroadCastId());
+				rcl.setBroadCastID(nextBroadCastId());
+				sessionManager.updateAVClientByStreamId(streamid, rcl, null);
 			}
-			sessionManager.updateAVClientByStreamId(streamid, currentClient, null);
-			return currentClient.getBroadCastID();
+			return rcl.getBroadCastID();
 		} catch (Exception err) {
 			log.error("[setUserAVSettings]", err);
 		}

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/hibernate/hibRtmpConnection.lzx Wed Jan 11 09:15:37 2017
@@ -561,7 +561,7 @@
 			canvas.commonVideoViewContent.closeScreenSharing(value);
 		} else {
 			//free the VideoContainer
-			canvas.commonVideoViewContent.closeStreamclient(value.publicSID);
+			canvas.commonVideoViewContent.removeVideoByUser(value.publicSID);
 		}
 	</method>
 
@@ -854,6 +854,7 @@
 			} else {
 				canvas.commonVideoViewContent.removeVideoByUser(canvas.publicSID);
 			}
+		} else {
 		}
 	]]>
 	</method>

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/base/mainMethods.lzx Wed Jan 11 09:15:37 2017
@@ -7,16 +7,16 @@
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
-  
+
       http://www.apache.org/licenses/LICENSE-2.0
-  
+
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-  
+
 -->
 
 <!-- methods for main.lzx -->
@@ -35,7 +35,7 @@
 
 	<attribute name="colorArray" value="null" />
 	<attribute name="errorLoader" />
-	
+
 	<method name="getColorForUser">
 		<![CDATA[
 			var colorArray = [0x92E8A4,0xC2F1FF,0xFFFCAE,0xE8C792,0xFF8073,
@@ -43,7 +43,7 @@
 			return colorArray[Math.round(Math.random()*10)];
 		]]>
 	</method>
-	
+
 	<method name="remoteLogWrite" args="message">
 		if ($debug) Debug.warn("remoteLogWrite:: ", message);
 		if (!errorLoader) {
@@ -56,7 +56,7 @@
 		vars.message = message;
 		errorLoader.load(vars);
 	</method>
-	
+
 	<method name="getHttpHost">
 	<![CDATA[
 		if (canvas.httphostlocal != null && canvas.httphostlocal.length > 0) {
@@ -65,13 +65,13 @@
 		return canvas.rtmphostlocal;
 	]]>
 	</method>
-	
+
 	<method name="getUrl">
 	<![CDATA[
 		return canvas.protocol + '://' + getHttpHost() + ':' + canvas.red5httpport + canvas.httpRootKey;
 	]]>
 	</method>
-	
+
 	<method name="getServicesUrl">
 	<![CDATA[
 		return getUrl() + 'services/';
@@ -82,87 +82,92 @@
 	<![CDATA[
 		canvas.mediaerrortimeout = 30000;
 		canvas.medialoadtimeout = 30000;
-		
+
 		if($debug) Debug.write("main.lzx/config.xml ondata",this);
-		
+
 		//Set Config-values by public/config.xml, see comments on public/config.xml
 		if (!canvas.isCluster) {
 			this.setAttribute('rtmphostlocal',canvas.myConfigSet.getPointer().xpathQuery('config/rtmphostlocal/text()'));
 		}
-		this.setAttribute('rtmpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpport/text()')));  
-		this.setAttribute('rtmpsslport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpsslport/text()'))); 
-		
+		this.setAttribute('rtmpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpport/text()')));
+		this.setAttribute('rtmpsslport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/rtmpsslport/text()')));
+
 		var userSSLString = canvas.myConfigSet.getPointer().xpathQuery('config/useSSL/text()');
 		if ($debug) Debug.write("userSSLString",userSSLString)
 		if (userSSLString == "yes") {
 			this.setAttribute('useSSL',true);
 		}
-		
+
 		this.setAttribute('red5httpport',Number(canvas.myConfigSet.getPointer().xpathQuery('config/red5httpport/text()')));
-		
+
 		this.setAttribute('loudnessAcitviation',canvas.myConfigSet.getPointer().xpathQuery('config/loudnessAcitviation/text()'));
 		this.setAttribute('webAppRootKey',canvas.myConfigSet.getPointer().xpathQuery('config/webAppRootKey/text()'));
 		this.setAttribute('showWindowEffect',canvas.myConfigSet.getPointer().xpathQuery('config/showWindowEffect/text()'));
-		
+
 		//Audio-Video-Settings
 		this.setAttribute('loudnessAcitviation',canvas.myConfigSet.getPointer().xpathQuery('config/loudnessAcitviation/text()'));
 		this.setAttribute('codecType',canvas.myConfigSet.getPointer().xpathQuery('config/codecType/text()'));
-		this.setAttribute('framesPerSecond',Number(canvas.myConfigSet.getPointer().xpathQuery('config/framesPerSecond/text()')));  
-		this.setAttribute('bandwidthNeededNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededNormal/text()')));  
-		this.setAttribute('bandwidthNeededBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededBest/text()')));  
-		this.setAttribute('camQualityNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityNormal/text()')));  
+		this.setAttribute('framesPerSecond',Number(canvas.myConfigSet.getPointer().xpathQuery('config/framesPerSecond/text()')));
+		this.setAttribute('bandwidthNeededNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededNormal/text()')));
+		this.setAttribute('bandwidthNeededBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/bandwidthNeededBest/text()')));
+		this.setAttribute('camQualityNormal',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityNormal/text()')));
 		this.setAttribute('camQualityBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/camQualityBest/text()')));
-		this.setAttribute('microphoneRateBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/microphoneRateBest/text()')));  
+		this.setAttribute('microphoneRateBest',Number(canvas.myConfigSet.getPointer().xpathQuery('config/microphoneRateBest/text()')));
 		this.setAttribute('echoPath',Number(canvas.myConfigSet.getPointer().xpathQuery('config/echoPath/text()')));
-		this.setAttribute('echoSuppression',canvas.myConfigSet.getPointer().xpathQuery('config/echoSuppression/text()'));  
-		
-		this.setAttribute('defaultWhiteboardWidth',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardWidth/text()')));  
-		this.setAttribute('defaultWhiteboardHeight',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardHeight/text()')));  
-		
-		
+		this.setAttribute('echoSuppression',canvas.myConfigSet.getPointer().xpathQuery('config/echoSuppression/text()'));
+
+		this.setAttribute('defaultWhiteboardWidth',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardWidth/text()')));
+		this.setAttribute('defaultWhiteboardHeight',Number(canvas.myConfigSet.getPointer().xpathQuery('config/defaultWhiteboardHeight/text()')));
+
+
 		this.setAttribute('httpRootKey',canvas.myConfigSet.getPointer().xpathQuery('config/httpRootKey/text()'));
 		this.setAttribute('httphostlocal',canvas.myConfigSet.getPointer().xpathQuery('config/httphostlocal/text()'));
-		this.setAttribute('protocol',canvas.myConfigSet.getPointer().xpathQuery('config/protocol/text()'));  
+		this.setAttribute('protocol',canvas.myConfigSet.getPointer().xpathQuery('config/protocol/text()'));
 		this.setAttribute('proxyType',canvas.myConfigSet.getPointer().xpathQuery('config/proxyType/text()'));
 
+		canvas.commonVideoViewContent.ensureAVsettings(
+				canvas.myConfigSet.getPointer().xpathQuery('config/availableCameraResolutions/resolution[@isDefault="true"]/@width')
+				, canvas.myConfigSet.getPointer().xpathQuery('config/availableCameraResolutions/resolution[@isDefault="true"]/@height')
+			);
+
 		//set user color
 		canvas.currentusercolor = canvas.getColorForUser();
 
 		var _url = this.getDisplayObject().loaderInfo.url;
 		if($debug) Debug.write("_url: ",_url);
 		var cleanUrl = _url;
-		
+
 		var hasParams = _url.indexOf("?");
 		if (hasParams != -1) {
 			cleanUrl = _url.substr(0, hasParams);
 		}
-		
+
 		if ($debug) Debug.write("_url ",_url,cleanUrl);
 		var doubleSlash = cleanUrl.indexOf("//");
 		var isNotPort80 = cleanUrl.indexOf(":", doubleSlash+2);
 		if ($debug) Debug.write("isNotPort80: ",isNotPort80,doubleSlash);
 		if (isNotPort80!=-1){
 			//Debug.write("isNotPort80: ",doubleSlash+2, _url.indexOf(":", doubleSlash+2)-doubleSlash-2);
-			var server = cleanUrl.substr(doubleSlash+2, _url.indexOf(":", doubleSlash+2)-doubleSlash-2); 
+			var server = cleanUrl.substr(doubleSlash+2, _url.indexOf(":", doubleSlash+2)-doubleSlash-2);
 		} else {
-			var server = cleanUrl.substr(doubleSlash+2, _url.indexOf("/", doubleSlash+2)-doubleSlash-2); 
+			var server = cleanUrl.substr(doubleSlash+2, _url.indexOf("/", doubleSlash+2)-doubleSlash-2);
 		}
-		
+
 		if ($debug) Debug.write("this zielnr: ",this,server);
-		
+
 		this.setAttribute('rtmphost',server);
-	
+
 		if (this.rtmphostlocal.length==0){
 			this.setAttribute('rtmphostlocal',server);
 		}
-		
+
 		if ($debug) Debug.info("###################### -2 ");
-		
+
 		var language = lz.Browser.getInitArg('language');
 		if (language != undefined) {
 			canvas.language_id = Number(language);
 		}
-	
+
 		var wicketroomid = lz.Browser.getInitArg('wicketroomid');
 		if (wicketroomid != undefined && !isNaN(wicketroomid)) {
 			canvas.setAttribute('wicketroomid', Number(wicketroomid));
@@ -206,7 +211,7 @@
 		} else {
 			hib.userScope = canvas.wicketroomid;
 			var src = hib.getUrl();
-			
+
 			canvas.thishib.setAttribute('src',src);
 			canvas.thishib.loaderVar = new lz.autoLoader(canvas);
 			canvas.thishib.loaderVar._src.setAttribute('text',src);
@@ -219,11 +224,11 @@
 		//if($debug) Debug.write("main.lzx/getLabelName()",id);
 		return getLabelTag(id);
 	</method>
-	
+
 	<!--
 		exportFilePNG exportFileJPG exportFilePDF exportFileSVG exportFileTIF
 	 -->
-	 
+
 	<method name="doWhiteboardActionmenu" args="action">
 		if (action == "exportFilePNG") {
 			canvas._drawarea.confirmSaveAsImageTypeExport("image","png");
@@ -248,7 +253,7 @@
 		}
 		ExternalInterface.call("roomExit");
 	</method>
-	
+
 	<method name="setRoomValues" args="roomObj">
 	<![CDATA[
 		if ($debug) Debug.warn("setRoomValues ",roomObj);
@@ -261,7 +266,7 @@
 			canvas.isConference = roomObj.type == 'conference';
 			canvas.isInterview = roomObj.type == 'interview';
 			canvas.main_content.setAttribute('visible', true);
-		
+
 			if (roomObj.type == 'conference') {
 				new lz.flexibleConferenceRoom(canvas.main_content._content.inner, {roomobj:roomObj});
 			} else if (roomObj.type == 'restricted') {
@@ -274,7 +279,7 @@
 	</method>
 
 	<method name="parseLanugageObject" args="obj">
-	
+
 		////Debug.write('parseLanugageObject: ',obj);
 		////Debug.write('parseLanugageObject: ',obj.childNodes);
 		<![CDATA[
@@ -293,17 +298,17 @@
 		//Debug.write(t);
 		]]>
 	</method>
-	
+
 	<!---
-	@doc The function does compare the new moderator list with the old and prepares the list 
-		the removeModeratorList is used in the performance optimized user list of the restricted 
-		room type to re-render the list items only if really something has changed in any 
+	@doc The function does compare the new moderator list with the old and prepares the list
+		the removeModeratorList is used in the performance optimized user list of the restricted
+		room type to re-render the list items only if really something has changed in any
 		of the user list items
 	 -->
 	<method name="analyzeModerationList" args="newList">
 	<![CDATA[
 		canvas.removeModeratorList = new Array();
-		
+
 		if (canvas.currentModeratorList != null) {
 			for (var i = 0; i < canvas.currentModeratorList.length; ++i) {
 				canvas.currentModeratorList[i].found = false;
@@ -321,14 +326,14 @@
 				}
 			}
 		}
-		
+
 		if ($debug) Debug.write("removeModeratorList :: ",canvas.removeModeratorList);
 	]]>
 	</method>
-	
+
 	<!---
 		Updates the "ismoderator" flag
-		the setAttribute method will broadcast an event to all event listeners that 
+		the setAttribute method will broadcast an event to all event listeners that
 		did subscribe using the "onismoderator" handler with reference to canvas !
 	 -->
 	<method name="updateModerationFlag">
@@ -348,7 +353,7 @@
 				isCurrentModerator = true;
 			}
 		}
-		
+
 		// do always spread this event, we need to broadcast the "onismoderator" event
 		// so that we can update the status of other users in the user list
 		try {
@@ -359,7 +364,7 @@
 		}
 	]]>
 	</method>
-	
+
 	<!---
 		Checks if a certain publicSID is a moderator
 	 -->
@@ -374,9 +379,9 @@
 		return false;
 	]]>
 	</method>
-	 
+
 	<!---
-		Sets the flag for the isAllowedToGiveExclusiveAudio status and broadcasts it to the 
+		Sets the flag for the isAllowedToGiveExclusiveAudio status and broadcasts it to the
 		SWF10 container
 	 -->
 	<method name="setExclusiveAudioAllowStatus" args="roomClientObj">
@@ -388,22 +393,22 @@
 		}
 	]]>
 	</method>
-	
+
 	<method name="setMuteStatus" args="roomClientObj">
 	<![CDATA[
-		if ($debug) Debug.write("setMuteStatus changes ###### ",roomClientObj.micMuted);
+		if ($debug) Debug.write("setMuteStatus changes ###### ", roomClientObj.micMuted);
 		//Check for self status
 		if (roomClientObj.publicSID == canvas.publicSID) {
 			canvas.setAttribute("micMuted",roomClientObj.micMuted);
 		}
-		
-		canvas._videocontainer.updateMuteStatusVideoView(roomClientObj);
-		
+
+		canvas.commonVideoViewContent.updateMuteStatusVideoView(roomClientObj);
+
 		//Notify all Listeners for change of the item
 		canvas.setAttribute("micMutedStatusChangedItem", roomClientObj);
 	]]>
 	</method>
-	
+
 	<method name="addFolderSequence" args="foldername">
 	<![CDATA[
 		this.uploadmoduleimgfolder = '/';
@@ -411,8 +416,8 @@
 		this.setAttribute('uploadmoduleimgfolder',this.uploadmoduleimgfolder);
 	]]>
 	</method>
-		
-		
+
+
 	<handler name="onmousewheeldelta" reference="lz.Keys" args="d">
 	<![CDATA[
 		var obj = getCurrentMouseWheelObject();
@@ -421,8 +426,8 @@
 			obj.step(-d);
 		}
 	]]>
-	</handler>	
-	
+	</handler>
+
 	<method name="reverseWordingsBySplit" args="str">
 	<![CDATA[
 		var words_arr = str.split( " " ); // an array of chars
@@ -434,23 +439,23 @@
 			}
 		}
 		return str;
-		
+
 	]]>
-	</method> 
-	
+	</method>
+
 	<method name="reverseAll" args="str">
 	<![CDATA[
 		var words_arr = str.split( "" ); // an array of chars
 		for ( var i = 0, str = ""; i < words_arr.length; i++ ) // reverse their order
 		{
 			str += words_arr[ words_arr.length - i - 1 ];
-			
+
 		}
 		return str;
-		
+
 	]]>
-	</method> 
-		
+	</method>
+
 	<method name="reverseWords" args="str">
 	<![CDATA[
 		if ( str == "" || str == null ) return ""; // undefined
@@ -462,19 +467,19 @@
 		return str;
 	]]>
 	</method>
-		
+
 	<method name="isLTR" args="c">
 	<![CDATA[
 		return ( c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122 );
 	]]>
 	</method>
-	
+
 	<method name="isHEB" args="c">
 	<![CDATA[
 		return ( c >= 224 && c <= 250 );
 	]]>
-	</method>	
-	
+	</method>
+
 	<method name="setTextAlign" args="obj,type">
 		switch ( type ) {
 			case "left" :
@@ -487,8 +492,8 @@
 				obj.setX( this.parent.width - this.getTextWidth() );
 			break;
 		}
-	</method>  
-	
+	</method>
+
 	<method name="getUserData">
 		var so:SharedObject = SharedObject.getLocal('userdata');
 		var g = so.data;
@@ -498,7 +503,7 @@
 		}
 		return g;
 	</method>
-	
+
 	<method name="setUserData" args="g">
 		var so:SharedObject = SharedObject.getLocal('userdata');
 		for (var i in g) {
@@ -507,7 +512,7 @@
 		}
 		so.flush();
 	</method>
-	
+
 	<method name="getThemeImage" args="tName">
 		//if ($debug) Debug.write("load Image by Name: ",tName);
 		var tPath = canvas.mainTheme.getPointer().xpathQuery("theme/resource[@name='"+tName+"']/@src");
@@ -515,11 +520,11 @@
 		if (tPath == null) {
 			if ($debug) Debug.warn("getThemeImage - No Image found for config: ",tName);
 		} else {
-			tPath = canvas.getUrl() + 'public/' + tPath; 
+			tPath = canvas.getUrl() + 'public/' + tPath;
 		}
 		return tPath;
 	</method>
-	
+
 	<method name="getThemeColor" args="tColor">
 		//if ($debug) Debug.write("load Color by Name: ",tColor);
 		var tResColor = canvas.mainTheme.getPointer().xpathQuery("theme/color[@name='"+tColor+"']/@value");
@@ -529,7 +534,7 @@
 		}
 		return tResColor;
 	</method>
-	
+
 	<method name="setColors">
 		defaultstyle.setAttribute("basecolor",canvas.getThemeColor('basebgcolorizer'));
 		itemStyle.setAttribute("basecolor",canvas.getThemeColor('basebgcolorizer'));
@@ -552,7 +557,7 @@
 	<method name="getNotNullString" args="value">
 		return value == null ? '' : value;
 	</method>
-	
+
 	<method name="loadImgBySrc" args="cmp, imgUrl, completeCallback">
 		cmp.sprite.resource = imgUrl;
 		if (!cmp.sprite.imgLoader) {

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/commonVideoViewContentSWF10.lzx Wed Jan 11 09:15:37 2017
@@ -7,16 +7,16 @@
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
-  
+
       http://www.apache.org/licenses/LICENSE-2.0
-  
+
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-  
+
 -->
 <library>
 
@@ -40,12 +40,12 @@
 	<attribute name="videoHeight" type="number" value="132"/>
 	<attribute name="SIDEPANEL_WIDTH" type="number" value="270" />
 	<attribute name="baseVideoStream" value="null" />
-	
+
 	<method name="toggleVideo" args="value">
 		if($debug) Debug.info("toggleVideo ", canvas.currentClient, value);
 		canvas.currentClient.canVideo = value;
 	</method>
-	
+
 	<method name="createEditRecordStream" args="isInterview">
 		if($debug) Debug.info("createEditRecordStream,", isInterview);
 		new lz.editRecordStreamSWF10(canvas, {
@@ -68,9 +68,9 @@
 		}
 	]]>
 	</method>
-	
-	<!-- 
-		Method that creates the video views when another user enters a room and his 
+
+	<!--
+		Method that creates the video views when another user enters a room and his
 		item in the list of participants is created.
 		The method to "play" the stream is invoked later, when the user
 		really starts to stream and not only when he just enters the room.
@@ -116,8 +116,8 @@
 		obj.setAttribute('chatpartnername', dispName);
 	</method>
 
-	<!-- 
-		
+	<!--
+
 		Method that creates the video views when user(self) initially entering a room.
 		Creates the video-view AND starts to stream/play the video
 	 -->
@@ -161,7 +161,7 @@
 		return vidContainer;
 	]]>
 	</method>
-	
+
 	<method name="getVideoObjectByPublicSID" args="publicSID">
 	<![CDATA[
 		//if ($debug) Debug.write("getVideoObjectByPublicSid SEARCH: ", publicSID);
@@ -288,9 +288,9 @@
 
 	<method name="closeStreamclient" args="publicSID">
 	<![CDATA[
-		if ($debug) Debug.write("closeStreamthis: ", publicSID);
+		if ($debug) Debug.write("closeStream this: ", publicSID);
 		var obj = this.getVideoObjectByPublicSID(publicSID);
-		if ($debug) Debug.write("closeStreamthis obj: ", obj);
+		if ($debug) Debug.write("closeStream this obj: ", obj);
 		if (obj != null) {
 			obj.resetValues();
 		}
@@ -357,7 +357,7 @@
 	<method name="startStream" args="value">
 	<![CDATA[
 		//value.publicSID,value.broadCastID,value.firstname,value.lastname,value.interviewPodId,value.VWidth,value.VHeight
-		
+
 		if ($debug) Debug.write("startStream: ", value);
 		var obj = null;
 		if (!!value.securityCode) {
@@ -387,7 +387,7 @@
 		return;
 	]]>
 	</method>
-	
+
 	<method name="setExclusiveAudioAllowStatus" args="canGiveAudio">
 		<![CDATA[
 			if ($debug) Debug.write("setExclusiveAudioAllowStatus :: ",canGiveAudio);
@@ -468,8 +468,8 @@
 			width:width,
 			height:height
 		});
-	</method> 
-	
+	</method>
+
 	<!---
 		plays a recorded stream
 	 -->
@@ -486,10 +486,10 @@
 		this.baseVideoStream.setAttribute("visibility","visible");
 		this.baseVideoStream.playRecordingStream(streamName,delay);
 	</method>
-	
+
 	<!---
-		Updates the width/height property of the recording playback video 
-	 -->	
+		Updates the width/height property of the recording playback video
+	 -->
 	<method name="updateRecordingVideoPosition" args="width,height">
 		if (this.baseVideoStream == null) {
 			if ($debug) Debug.warn("baseVideoStream is NULL");
@@ -498,7 +498,7 @@
 		this.baseVideoStream.setAttribute("width",width);
 		this.baseVideoStream.setAttribute("height",height);
 	</method>
-	
+
 	<!---
 		stops and hides the recording playback video
 	 -->
@@ -512,8 +512,8 @@
 		this.baseVideoStream.stopRecording();
 		this.baseVideoStream.setAttribute("visibility","hidden");
 	</method>
-	
-	<!--- 
+
+	<!---
 		pauses the current video or continue at the same position
 	 -->
 	<method name="pauseRecordingPlayback" args="pauseBool">
@@ -524,7 +524,7 @@
 		}
 		this.baseVideoStream.pause(pauseBool);
 	</method>
-	
+
 	<method name="seekRecordingPlayback" args="flvTime">
 		if($debug) Debug.write("seekRecordingPlayback ",flvTime);
 		if (this.baseVideoStream == null) {
@@ -533,7 +533,7 @@
 		}
 		this.baseVideoStream.seekStream(flvTime);
 	</method>
-	
+
 	<method name="stopAndCloseRecordingConnection">
 		if($debug) Debug.write("stopAndCloseRecordingConnection ");
 		if (this.baseVideoStream == null) {
@@ -544,12 +544,12 @@
 		this.baseVideoStream.destroy();
 		this.baseVideoStream = null;
 	</method>
-	
+
 	<!---
 	   #################################
 	   Methods to handle screen sharing video playback and cursor
 	 -->
-	 
+
 	<!---
 		Adds a new screen sharing playback video
 	 -->
@@ -560,15 +560,15 @@
 				canvas.screenSharingDialogContainer = new lz.screenSharingDialogContainer(canvas);
 			}
 			if ($debug) Debug.warn("New Screen Sharing", value);
-			new lz.screenSharingDialog(canvas.screenSharingDialogContainer, {initObject: value}); 
+			new lz.screenSharingDialog(canvas.screenSharingDialogContainer, {initObject: value});
 		} else {
 			if ($debug) Debug.warn("Self Screen Sharing");
 		}
 	]]>
-	</method> 
-	
+	</method>
+
 	<!---
-		Add a list of screen sharing playback videos 
+		Add a list of screen sharing playback videos
 		(initially when entering the room invoked)
 	 -->
 	<method name="newScreenSharings" args="value">
@@ -581,7 +581,7 @@
 
 	<!---
 		Close a single screen sharing playback video
-	 --> 
+	 -->
 	<method name="closeScreenSharing" args="value">
 	<![CDATA[
 		if (canvas.screenSharingDialogContainer != null) {
@@ -594,7 +594,7 @@
 	</method>
 
 	<!---
-	   Closes all screen sharing playback videos, whiteboard videos, user videos 
+	   Closes all screen sharing playback videos, whiteboard videos, user videos
 	   and closes the rtmp connection
 	 -->
 	<method name="closeAllScreenSharings">
@@ -608,9 +608,9 @@
 		canvas.commonVideoViewContent.clearAll();
 	]]>
 	</method>
-	
+
 	<!---
-		change Screen Sharing frame height 
+		change Screen Sharing frame height
 	 -->
 	<method name="hideChatContent" args="hide">
  	<![CDATA[
@@ -620,7 +620,7 @@
 		}
  	]]>
 	</method>
-	
+
 	<!---
 		Update the position of the cursor from the sharing screen
 	 -->
@@ -635,9 +635,9 @@
 		}
 	]]>
 	</method>
-	
+
 	<!---
-		Make regExpTest 
+		Make regExpTest
 	 -->
 	<method name="regExpTest" args="fieldValue,regExStr">
 	<![CDATA[
@@ -655,7 +655,7 @@
 			valMic = 0; //select first one by default
 		}
 		var _micro = canvas.echoPath == 0 ? Microphone.getMicrophone(valMic) : Microphone.getEnhancedMicrophone(valMic);
-		
+
 		if (_micro != null) {
 			if (canvas.echoPath == 256) {
 				var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions();
@@ -682,7 +682,7 @@
 		return _micro;
 	]]>
 	</method>
-	
+
 	<method name="getCam" args="valCam, videoview">
 	<![CDATA[
 		if ($debug) Debug.write("Entering getCam ...", valCam);
@@ -692,7 +692,7 @@
 		var _camera = Camera.getCamera(valCam);
 		if (_camera != null) {
 			if ($debug) Debug.write("videoview: ", videoview);
-			
+
 			if ($debug) Debug.write("_camera.setQuality BEST: ", canvas.isInterview, (canvas.bandwidthNeededBest * 2), canvas.camQualityBest);
 			if (canvas.isInterview) {
 				//we need a fixed frame rate for the videos to merge them later on
@@ -711,6 +711,25 @@
 	]]>
 	</method>
 
+	<method name="syncAVsettings" args="g">
+		ExternalInterface.call("avSettings", JSON.stringify(g));
+	</method>
+
+	<method name="storeAVsettings" args="cam, mic, w, h">
+	<![CDATA[
+		//if ($debug) Debug.write("sharedobject store::  [width, height] : [" + w + ", " + h + "]");
+		var t:SharedObject = SharedObject.getLocal('userdata');
+		var g = t.data;
+		if (!g) g = new Array();
+		g["cam"] = cam;
+		g["mic"] = mic;
+		g["width"] = w;
+		g["height"] = h;
+		t.flush();
+		syncAVsettings(g);
+	]]>
+	</method>
+
 	<method name="loadAVsettings">
 	<![CDATA[
 		var t:SharedObject = SharedObject.getLocal('userdata');
@@ -724,6 +743,16 @@
 	]]>
 	</method>
 
+	<method name="ensureAVsettings" args="w, h">
+		if ($debug) Debug.write("ensureAVsettings::  [width, height] : [" + w + ", " + h + "]");
+		var g = loadAVsettings();
+		if (!g) {
+			storeAVsettings(Camera.names.length > 0 ? 0 : -1, Microphone.names.length > 0 ? 0 : -1, w, h);
+		} else {
+			syncAVsettings(g);
+		}
+	</method>
+
 	<method name="getAvSetting" args="prop, g=null, def=null">
 		//Initialize and get eventually stored property
 		if (!g) {
@@ -733,37 +762,18 @@
 		return val != null ? val : def;
 	</method>
 
-	<method name="getAVmode" args="g">
+	<method name="getAVmode">
 		var settings = canvas.currentClient.avsettings;
-		if (!settings) {
-			settings = getAvSetting('avstored', g, 'av'); //stored av settings are overriden by HTML5 (need to be merged)
-			if (!settings) {
-				settings = 'n';
-			}
-		}
-		return settings;
+		return !settings ? 'n' : settings;
 	</method>
 
 	<method name="_startAvBroadcast" args="restart=false">
-		var g = canvas.commonVideoViewContent.loadAVsettings();
-		var vWidth = canvas.isInterview ? 320 : getAvSetting('width', g, 120);
-		var vHeight = canvas.isInterview ? 260 : getAvSetting('height', g, 90);
-		setUserAVSettings.avsetting = getAVmode(g);
-		setUserAVSettings.vWidth = vWidth;
-		setUserAVSettings.vHeight = vHeight;
-		setUserAVSettings.vHeight = vHeight;
 		setUserAVSettings.updateBroadcastId = restart;
 		setUserAVSettings.doCall();
 	</method>
 
 	<netRemoteCallHib name="setUserAVSettings" funcname="setUserAVSettings" remotecontext="$once{ canvas.thishib }" >
-		<attribute name="avsetting" value="" type="string" />
-		<attribute name="vWidth" value="0" type="number" />
-		<attribute name="vHeight" value="0" type="number" />
 		<attribute name="updateBroadcastId" value="false" type="boolean" />
-		<netparam><method name="getValue">return parent.avsetting;</method></netparam>
-		<netparam><method name="getValue">return parent.vWidth;</method></netparam>
-		<netparam><method name="getValue">return parent.vHeight;</method></netparam>
 		<netparam><method name="getValue">return parent.updateBroadcastId;</method></netparam>
 		<handler name="ondata" args="value">
 			if ($debug) Debug.write("setUserAVSettings:: done", value);
@@ -779,10 +789,10 @@
 		var g = canvas.commonVideoViewContent.loadAVsettings();
 		var myvideocontainer = createVideoObject(canvas.publicSID, true, canvas.currentClient.interviewPodId, canvas.currentClient);
 		if ($debug) Debug.write("startAvBroadcast::doninitalize");
-		var settings = getAVmode(g);
+		var settings = getAVmode();
 		if ($debug) Debug.write("startAvBroadcast::mode, ", settings, canvas.currentClient.avsettings);
-		var vWidth = canvas.isInterview ? 320 : getAvSetting('width', g, 120);
-		var vHeight = canvas.isInterview ? 260 : getAvSetting('height', g, 90);
+		var vWidth = canvas.currentClient.VWidth;
+		var vHeight = canvas.currentClient.VHeight;
 		if (!canvas.isInterview) {
 			myvideocontainer.setDefaultVideoSize(vWidth, vHeight);
 		}
@@ -792,8 +802,8 @@
 		myvideocontainer.setAttribute('isremote', false);
 		var _micro = getMic(getAvSetting('mic', g, 0));
 		var _camera = getCam(getAvSetting('cam', g, 0), videoview);
-		if ($debug) Debug.write(_camera , _micro, settings);
-		
+		if ($debug) Debug.write("startAvBroadcast", _camera, _micro, settings, videoview);
+
 		if ($debug) Debug.write("BroadcastId: ", canvas.currentClient.broadCastID);
 		switch (settings){
 			case "av":

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/main.lzx Wed Jan 11 09:15:37 2017
@@ -7,16 +7,16 @@
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
-  
-	  http://www.apache.org/licenses/LICENSE-2.0
-		  
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-  
+
 -->
 <canvas width="100%" height="100%" title="OpenMeetings">
 	<switch>
@@ -41,7 +41,7 @@
 	</switch>
 
 	<include href="base/" /><!-- attributes,methods,datasets,are moved into /base -->
-	<include href="resources/" /> 
+	<include href="resources/" />
 	<include href="modules/" />
 	<include href="video/" />
 	<include href="screensharing/" />
@@ -66,23 +66,23 @@
 		canvas.currentModeratorList = [];
 		canvas.removeModeratorList = [];
 	]]></handler>
-	
+
 	<handler name="onerror" args="errmsg">
 		canvas.remoteLogWrite("error " + errmsg);
 	</handler>
-	
+
 	<!-- View for Contents. All Windows will be loaded on this view. -->
-	<view name="main_content" y="0" width="${canvas.width}" 
+	<view name="main_content" y="0" width="${canvas.width}"
 					height="${ canvas.height }"
 					visibility="hidden" showhandcursor="false">
-		
+
 		<handler name="onmouseover">
 			setCurrentMouseWheelObject(this._scrollbar);
 		</handler>
 		<handler name="onmouseout">
 			disableCurrentMouseWheelObject();
 		</handler>
-		
+
 		<view x="0" name="_content" >
 			<view name="inner" />
 			<method name="clearAll">
@@ -104,10 +104,10 @@
 		</view>
 		<om_hscrollbar name="_scrollbarH" id="_mainScrollHBar" visibility="hidden" />
 		<om_vscrollbar name="_scrollbar" id="_mainScrollBar" />
-	</view>  
-	  
+	</view>
+
 	<!-- View for Conference menu bar at the top side. Visible on conference -->
-	<view name="_conferencemenu" y="0" x="0" width="100%" height="20" visible="false" > 
+	<view name="_conferencemenu" y="0" x="0" width="100%" height="20" visible="false" >
 		<method name="removeAll">
 		<![CDATA[
 			if($debug) Debug.write("main.lzx/_coferencemenu.removeAll(): ");
@@ -117,8 +117,8 @@
 			parent._moderatormenu.removeAll();
 		]]>
 		</method>
-	</view> 
-	
+	</view>
+
 	<view name="_moderatormenu" y="0" x="0" width="100%" height="20">
 		<method name="removeAll">
 		<![CDATA[
@@ -128,11 +128,11 @@
 			}
 		]]>
 		</method>
-	</view>  
-		
+	</view>
+
 	<!-- View for "Loading" -->
-	<view name="_loadingAll" visible="false" opacity="0.7" 
-		width="${ canvas.width }" height="${ canvas.height }" 
+	<view name="_loadingAll" visible="false" opacity="0.7"
+		width="${ canvas.width }" height="${ canvas.height }"
 		bgcolor="0xFFFFFF" clickable="true" showhandcursor="false">
 		<method name="hideContentOnly">
 			this.showLoadingAnni.setAttribute('started', true);
@@ -147,7 +147,7 @@
 		<method name="hideLoading">
 			this.setAttribute("visibility","hidden");
 		</method>
-		<animator name="showLoadingAnni" attribute="opacity" 
+		<animator name="showLoadingAnni" attribute="opacity"
 				from="0" to="0.7" started="false" duration="250" />
 		<text name="_text" align="right" y="56" fontsize="14" fgcolor="red">Loading...</text>
 	</view>

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/modules/conference/flexibleConferenceRoom/roomSidebar/baseRoomSidebar.lzx Wed Jan 11 09:15:37 2017
@@ -144,7 +144,6 @@
 	]]>
 	</method>
 
-
 	<method name="addItem" args="connectedSince,isMod,streamid,username,userroom,formatedDate,position,color,object">
 	<![CDATA[
 		if ($debug) Debug.write("initializeStreams addItem: ",connectedSince,isMod,streamid,username,formatedDate);
@@ -165,18 +164,6 @@
 		}
 	]]>
 	</method>
-		
-	<method name="closeStreamClient" args="publicSID">
-		canvas.commonVideoViewContent.closeStreamClient(publicSID);
-	</method>
-
-	<method name="resetAllValues">
-		canvas.commonVideoViewContent.resetAllValues();
-	</method>
-
-	<method name="updateMuteStatusVideoView" args="roomClient">
-		canvas.commonVideoViewContent.updateMuteStatusVideoView(roomClient);
-	</method>
 </class>
 
 </library>

Modified: openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-flash/src/main/swf/video/editRecordStreamSWF10.lzx Wed Jan 11 09:15:37 2017
@@ -7,31 +7,31 @@
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
-  
+
       http://www.apache.org/licenses/LICENSE-2.0
-  
+
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-  
+
 -->
 <library>
 
 <!-- #######################
 	Class editRecordStream
-	
+
 	Description:
 	This Class shows a window where you can alter you Video-/Microphone- Input-Resources
 	and start to stream. The app could also use the default values for Cam/Mic but
 	most users don't know how to alter this (weather in System-Control-Panel or by Right Clicking
 	on the Flash-Screen and *>Preferences>Camera* )
 	So I think it is better if Users are forced to choose something from this list
-	
+
  -->
- 
+
 <class name="editRecordStreamSWF10" extends="labelExplorerBox" labelid="51"
 		width="680" height="540" x="14" y="-540" >
 	<switch>
@@ -40,7 +40,6 @@
 				import flash.events.StatusEvent;
 				import flash.media.Camera;
 				import flash.media.Microphone;
-				import flash.net.SharedObject;
 			</passthrough>
 		</when>
 	</switch>
@@ -59,18 +58,18 @@
 	<attribute name="timerIsRunning" value="false" type="boolean" />
 	<attribute name="counterDelegate" value="null" />
 	<attribute name="executeAttachCamera" value="false" type="boolean" />
-	
+
 	<method name="startTimer">
 		this.timerIsRunning = true;
 		this.timerWasUnmutedTheFirstTime = true;
 		lz.Timer.addTimer( this.counterDelegate, 1000 );
 	</method>
-	
+
 	<method name="count" args="calleeObj">
 		if (this.recordingsCounter != 0){
 			this.recordingsCounter -= 1;
 			lz.Timer.resetTimer(this.counterDelegate, 1000);
-			
+
 			this._text._info.setAttribute("text",""+this.recordingsCounter+" sec");
 		} else {
 			this._text.setAttribute("visibility","hidden");
@@ -80,20 +79,20 @@
 			this.doPlay();
 		}
 	</method>
-	
+
 	<method name="startTimerToCount">
 		if (!this.timerIsRunning) {
 			this.startTimer();
 		}
 	</method>
-	
+
 	<handler name="oninit">
 	<![CDATA[
 		if (canvas.editRecordStream != null) {
 			canvas.editRecordStream.destroy();
 		}
 		canvas.editRecordStream = this;
-		
+
 		this.counterDelegate = new LzDelegate(this, "count");
 
 		if ($debug) Debug.write("editrecordstream ###################### ");
@@ -118,17 +117,12 @@
 	</handler>
 
 	<method name="storeAVsettings">
-	<![CDATA[
-		//if ($debug) Debug.write("sharedobject store::  [width, height] : [" + this.cam_default_width + ", " + this.cam_default_height + "]");
-		var t:SharedObject = SharedObject.getLocal('userdata');
-		var g = t.data;
-		if (g==null) g = new Array();
-		g["cam"] = this.availableCams.getValue();
-		g["mic"] = this.availableMics.getValue();
-		g["width"] = this.cam_default_width;
-		g["height"] = this.cam_default_height;
-		t.flush();
-	]]>
+		canvas.commonVideoViewContent.storeAVsettings(
+				this.availableCams.getValue()
+				, this.availableMics.getValue()
+				, this.cam_default_width
+				, this.cam_default_height
+			);
 	</method>
 
 	<method name="doStartRecording">
@@ -139,18 +133,18 @@
 		this._text.setAttribute("visibility","visible");
 		this._text._info.setAttribute("text","5 sec");
 		this.isRunning = true;
-		
+
 		var videoview = this._video.content._publisher._chatvideoinner._videostream;
 		var _micro = canvas.commonVideoViewContent.getMic(this.availableMics.getValue());
 		var _camera = canvas.commonVideoViewContent.getCam(this.availableCams.getValue(), videoview);
 		if ($debug) Debug.write(_camera, _micro);
-		
+
 		if ($debug && _camera != null) Debug.warn("_camera.muted ", _camera.muted);
 		if ($debug && _micro != null) Debug.warn("_micro.muted ", _micro.muted);
 		if ((_camera != null && !_camera.muted) || (_micro != null && !_micro.muted)) {
 			this.startTimer();
 		}
-		
+
 		//start recording of client stream
 		var t = new Date();
 		this.lastRecorded = "TEST_SETUP_"+t.getTime();
@@ -159,7 +153,7 @@
 		videoview.record(this.lastRecorded,_camera,_micro);
 	]]>
 	</method>
-	
+
 	<method name="doPlay">
 	<![CDATA[
 		if (this.lastRecorded == "") {
@@ -174,7 +168,7 @@
 		}
 	]]>
 	</method>
-	
+
 	<method name="doStop">
 		if (this.isRunning) {
 			this.isRunning = false;
@@ -188,14 +182,14 @@
 	</method>
 
 	<animator name="_chooseDeviceAnimation" started="false" attribute="y" to="40" duration="750" />
-	
+
 	<labelText fontstyle="bold" labelid="758" width="${ parent.width-2 }" height="30" multiline="true" y="20" />
 
 	<method name="fillDeviceList" args="list,combo,prop">
 	<![CDATA[
 		//Initialize and get eventually stored property
 		var dev = canvas.commonVideoViewContent.getAvSetting(prop);
-		
+
 		//Get all availible devices
 		var foundStoredDev = null;
 		combo.addItem(canvas.getLabelName(159), -1);
@@ -209,7 +203,7 @@
 		return foundStoredDev;
 	]]>
 	</method>
-	
+
 	<method name="selectListItem" args="combo, selected, select">
 		if (selected != null) {
 			combo.selectItem(selected);
@@ -217,9 +211,9 @@
 			combo.selectItemAt(0);
 		}
 	</method>
-	
-	<!-- 
-		Initialize the default settings for cam and resolution and attach the camera 
+
+	<!--
+		Initialize the default settings for cam and resolution and attach the camera
 		after we have made sure the values are there one time
 	 -->
 	<method name="initItems">
@@ -228,7 +222,7 @@
 		var cameras = Camera.names;
 		var foundStoredCam = fillDeviceList(cameras, availableCams, "cam");
 		selectListItem(availableCams, foundStoredCam, cameras.length > 0);
-		
+
 		//fill list of Mics
 		var mics = Microphone.names;
 		var foundStoredMic = fillDeviceList(mics, availableMics, "mic");
@@ -239,7 +233,7 @@
 		var addMics = mics.length > 0;
 	]]>
 	</method>
-	
+
 	<method name="attachCamera">
 	<![CDATA[
 		//Don't execute before combobox items are not initialized
@@ -310,14 +304,14 @@
 	<labelText name="infoTextNoAV" labelid="452" multiline="true" width="280"
 			fontsize="11" x="10" y="164" visibility="hidden" />
 
-	<labelText name="availibleResolutionsLabel" labelid="1429" 
+	<labelText name="availibleResolutionsLabel" labelid="1429"
 			fontsize="11" x="10" y="164" width="$once{ parent.width-20 }" />
 
-	<view name="availibleResolutionsWarning" x="272" y="164" 
+	<view name="availibleResolutionsWarning" x="272" y="164"
 			resource="warning_icon_popup_devices_rsc" clickable="true">
 		<labelTooltip multiline="true" labelid="1430" />
 	</view>
-	
+
 	<resetCombobox fontsize="11" name="availibleResolutions" x="10" shownitems="10"
 			y="184" width="280" editable="false">
 		<!--- @keywords private -->
@@ -338,7 +332,7 @@
 				if ($debug) Debug.write("availibleResolutions::onselect cam [W x H] ", item.cam_width, item.cam_height);
 				parent.setAttribute("cam_default_width", item.cam_width);
 				parent.setAttribute("cam_default_height", item.cam_height);
-				
+
 				var py = parent.y < 0 ? 5 : parent.y;
 				var maxWidth = Math.min(600, canvas.width - parent.x - 10)
 					, maxHeight = Math.min(500, canvas.height - py - 10)
@@ -349,7 +343,7 @@
 				if (item.cam_height > 180) {
 					newHeight = maxHeight + item.cam_height - 180;
 				}
-				
+
 				if (newWidth + parent.x + 10 > canvas.width) {
 					newWidth = maxWidth;
 				}
@@ -373,7 +367,7 @@
 				this.cam_height = Number(this.datapath.xpathQuery('@height'));
 				this.setAttribute("text", "" + this.cam_width + "x" + this.cam_height + " [" + type + "]");
 				var isDefault = this.datapath.xpathQuery('@isDefault') == "true";
-				
+
 				var width = canvas.commonVideoViewContent.getAvSetting("width");
 				var height = canvas.commonVideoViewContent.getAvSetting("height");
 				if (!!width && !!height && width == this.cam_width && height == this.cam_height) {
@@ -390,7 +384,7 @@
 			</handler>
 		</textlistitem>
 	</resetCombobox>
-	
+
 	<simpleLabelButton name="_btnStartRecording" labelid="775" width="140" x="150" y="220" height="28">
 		<handler name="onclick">
 			parent._level_meter.startLevel();
@@ -398,11 +392,11 @@
 		</handler>
 	</simpleLabelButton>
 
-	<view x="340" y="60" name="_video" clip="true" 
-			width="${ parent.width-this.x-10 }" height="${ parent.height-260 }"> 
+	<view x="340" y="60" name="_video" clip="true"
+			width="${ parent.width-this.x-10 }" height="${ parent.height-260 }">
 		<view name="content">
-			<videoObjectTestBroadcast name="_publisher"  
-					width="${ parent.parent.parent.cam_default_width }" 
+			<videoObjectTestBroadcast name="_publisher"
+					width="${ parent.parent.parent.cam_default_width }"
 					height="${ parent.parent.parent.cam_default_height }">
 				<handler name="sendCameraStatus" args="camStatus">
 					if ($debug) Debug.write("sendCameraStatus -1- ",camStatus);
@@ -410,7 +404,7 @@
 						parent.parent.parent.startTimerToCount();
 					}
 				</handler>
-				
+
 				<handler name="sendMicroStatus" args="micStatus">
 					if ($debug) Debug.write("sendMicroStatus -1- ",micStatus);
 					if (micStatus == "Microphone.Unmuted") {
@@ -418,20 +412,20 @@
 					}
 				</handler>
 			</videoObjectTestBroadcast>
-			
-			<videoObjectPlayTestBroadcast name="_viewer" visibility="hidden" 
-					width="${ parent.parent.parent.cam_default_width }" 
+
+			<videoObjectPlayTestBroadcast name="_viewer" visibility="hidden"
+					width="${ parent.parent.parent.cam_default_width }"
 					height="${ parent.parent.parent.cam_default_height }" />
 		</view>
-		
+
 		<om_vscrollbar />
 		<om_hscrollbar />
 	</view>
-	
+
 	<view name="_text" x="340" y="60" width="240" height="180" visibility="hidden">
 		<text name="_info" resize="true" bgcolor="0xFFFFFF" align="right" fontsize="12" fontstyle="bold" />
 	</view>
-	
+
 	<simpleLabelButton name="_play" y="${ parent.height-166 }" x="490" enabled="false" width="90" labelid="764">
 		<handler name="onclick">
 			parent.doPlay();
@@ -442,7 +436,7 @@
 		 <!--- Level delegate, used to track level changes.
 			@keywords private -->
 		<attribute name="_leveldel" value="$once{new LzDelegate(this, '_updateLevel')}"/>
-		
+
 		<method name="_updateLevel" args="no">
 			<![CDATA[
 				if (parent._video.content._publisher._chatvideoinner._videostream.micro == null) {
@@ -451,16 +445,16 @@
 				this.setNewLevel(parent._video.content._publisher._chatvideoinner._videostream.micro.activityLevel);
 			]]>
 		</method>
-		
+
 		<method name="startLevel">
 			this._leveldel.register(lz.Idle, "onidle");
 		</method>
-		
+
 		<method name="resetNewLevel">
 			this._leveldel.unregisterAll();
 			this.setNewLevel(0);
 		</method>
-		
+
 		<method name="setNewLevel" args="no">
 		<![CDATA[
 			var newLevel = (238 / 100) * no;
@@ -468,15 +462,15 @@
 			this._over.setAttribute("x", 1 + newLevel);
 		]]>
 		</method>
-		
+
 		<view name="_bg" width="238" height="18" x="1" y="1" bgcolor="0xFFFFFF" />
 		<view name="_grip" resource="level_meter_rsc" x="1" y="1" />
 		<view name="_over" width="238" height="18" x="1" y="1" bgcolor="0xFFFFFF" />
 		<labelText labelid="767" x="2" y="2" height="16" width="236" resize="false" />
 	</view>
-	
+
 	<view y="${ parent.height-98 }" resource="test_setup_info_rsc" x="16" />
-	
+
 	<labelText fontstyle="bold" labelid="765" x="39" y="${ parent.height-100 }"
 			width="${ parent.width-50 }" multiline="true" />
 

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java Wed Jan 11 09:15:37 2017
@@ -232,9 +232,11 @@ public class Application extends Authent
 			rcl.setIsSuperModerator(client.hasRight(Right.superModerator));
 			rcl.setIsMod(client.hasRight(Right.moderator));
 			rcl.setIsBroadcasting(client.hasRight(Right.audio));
-			rcl.setCanVideo(client.hasRight(Right.video) && client.hasActivity(Activity.broadcastV));
+			rcl.setCanVideo(client.hasRight(Right.video) && client.isCamEnabled() && client.hasActivity(Activity.broadcastV));
 			rcl.setCanDraw(client.hasRight(Right.whiteBoard));
 			if (client.hasActivity(Activity.broadcastA) || client.hasActivity(Activity.broadcastV)) {
+				rcl.setVWidth(client.getWidth());
+				rcl.setVHeight(client.getHeight());
 				if (client.getPod() != Pod.none) {
 					rcl.setInterviewPodId(client.getPod() == Pod.left ? 1 : 2);
 				}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Client.java Wed Jan 11 09:15:37 2017
@@ -61,11 +61,15 @@ public class Client implements IDataProv
 	private final Set<Activity> activities = new HashSet<>();
 	private final Date connectedSince;
 	private Pod pod;
+	private int cam = -1;
+	private int mic = -1;
+	private int width = 0;
+	private int height = 0;
 
 	public Client(String sessionId, Long userId) {
 		this(sessionId, 0, userId);
 	}
-	
+
 	public Client(String sessionId, int pageId, Long userId) {
 		this.sessionId = sessionId;
 		this.pageId = pageId;
@@ -196,6 +200,46 @@ public class Client implements IDataProv
 		}
 	}
 
+	public boolean isCamEnabled() {
+		return cam > -1;
+	}
+
+	public int getCam() {
+		return cam;
+	}
+
+	public void setCam(int cam) {
+		this.cam = cam;
+	}
+
+	public boolean isMicEnabled() {
+		return mic > -1;
+	}
+
+	public int getMic() {
+		return mic;
+	}
+
+	public void setMic(int mic) {
+		this.mic = mic;
+	}
+
+	public int getWidth() {
+		return width;
+	}
+
+	public void setWidth(int width) {
+		this.width = width;
+	}
+
+	public int getHeight() {
+		return height;
+	}
+
+	public void setHeight(int height) {
+		this.height = height;
+	}
+
 	@Override
 	public int hashCode() {
 		final int prime = 31;

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Wed Jan 11 09:15:37 2017
@@ -38,6 +38,7 @@ import org.apache.openmeetings.web.room.
 import org.apache.openmeetings.web.room.RoomPanel.Action;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.json.JSONObject;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.extensions.markup.html.tabs.ITab;
 import org.apache.wicket.markup.head.IHeaderResponse;
@@ -50,6 +51,7 @@ import org.apache.wicket.markup.html.pan
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -62,11 +64,13 @@ public class RoomSidebar extends Panel {
 	public static final String FUNC_TOGGLE_RIGHT = "toggleRight";
 	public static final String FUNC_TOGGLE_ACTIVITY = "toggleActivity";
 	public static final String FUNC_ACTION = "roomAction";
+	public static final String FUNC_SETTINGS = "avSettings";
 	public static final String PARAM_ACTION = "action";
 	public static final String PARAM_ACTIVITY = "activity";
 	public static final String PARAM_RIGHT = "right";
 	public static final String PARAM_UID = "uid";
 	public static final String PARAM_POD = "pod";
+	public static final String PARAM_SETTINGS = "s";
 	private final RoomPanel room;
 	private final TabbedPanel tabs;
 	private final ITab userTab;
@@ -91,12 +95,12 @@ public class RoomSidebar extends Panel {
 		@Override
 		protected void respond(AjaxRequestTarget target) {
 			try {
-				String uid = getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString(); 
+				String uid = getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString();
 				if (Strings.isEmpty(uid)) {
 					return;
 				}
 				if (room.getClient().hasRight(Right.moderator)) {
-					Action a = Action.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_ACTION).toString()); 
+					Action a = Action.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_ACTION).toString());
 					kickedClient = getOnlineClient(uid);
 					if (kickedClient == null) {
 						return;
@@ -121,11 +125,11 @@ public class RoomSidebar extends Panel {
 		@Override
 		protected void respond(AjaxRequestTarget target) {
 			try {
-				String uid = getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString(); 
+				String uid = getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString();
 				if (Strings.isEmpty(uid)) {
 					return;
 				}
-				Right right = Right.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_RIGHT).toString()); 
+				Right right = Right.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_RIGHT).toString());
 				if (room.getClient().hasRight(Right.moderator)) {
 					Client client = getOnlineClient(uid);
 					if (client == null) {
@@ -158,11 +162,11 @@ public class RoomSidebar extends Panel {
 		@Override
 		protected void respond(AjaxRequestTarget target) {
 			try {
-				String uid = getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString(); 
+				String uid = getRequest().getRequestParameters().getParameterValue(PARAM_UID).toString();
 				if (Strings.isEmpty(uid)) {
 					return;
 				}
-				Activity a = Activity.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_ACTIVITY).toString()); 
+				Activity a = Activity.valueOf(getRequest().getRequestParameters().getParameterValue(PARAM_ACTIVITY).toString());
 				Client c = getOnlineClient(uid);
 				if (c == null) {
 					return;
@@ -176,6 +180,15 @@ public class RoomSidebar extends Panel {
 					}
 				}
 				if (activityAllowed(c, a, room.getRoom())) {
+					if (a == Activity.broadcastA && !c.isMicEnabled()) {
+						return;
+					}
+					if (a == Activity.broadcastV && !c.isCamEnabled()) {
+						return;
+					}
+					if (a == Activity.broadcastAV && !c.isMicEnabled() && !c.isCamEnabled()) {
+						return;
+					}
 					Pod pod = c.getPod();
 					c.setPod(getRequest().getRequestParameters().getParameterValue(PARAM_POD).toOptionalInteger());
 					if (pod != Pod.none && pod != c.getPod()) {
@@ -191,6 +204,23 @@ public class RoomSidebar extends Panel {
 			}
 		}
 	};
+	private final AbstractDefaultAjaxBehavior avSettings = new AbstractDefaultAjaxBehavior() {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void respond(AjaxRequestTarget target) {
+			StringValue s = getRequest().getRequestParameters().getParameterValue(PARAM_SETTINGS);
+			if (!s.isEmpty()) {
+				JSONObject o = new JSONObject(s.toString());
+				room.getClient().setCam(o.getInt("cam"));
+				room.getClient().setMic(o.getInt("mic"));
+				boolean interview = Room.Type.interview == room.getRoom().getType();
+				room.getClient().setWidth(interview ? 320 : o.getInt("width"));
+				room.getClient().setHeight(interview ? 260 : o.getInt("height"));
+				room.broadcast(target, room.getClient());
+			}
+		}
+	};
 
 	public RoomSidebar(String id, final RoomPanel room) {
 		super(id);
@@ -204,12 +234,12 @@ public class RoomSidebar extends Panel {
 			public boolean isVisible() {
 				return true;
 			}
-			
+
 			@Override
 			public IModel<String> getTitle() {
 				return Model.of(getString("613"));
 			}
-			
+
 			@Override
 			public WebMarkupContainer getPanel(String containerId) {
 				return new UserFragment(containerId, "user-panel");
@@ -222,12 +252,12 @@ public class RoomSidebar extends Panel {
 			public boolean isVisible() {
 				return showFiles;
 			}
-			
+
 			@Override
 			public IModel<String> getTitle() {
 				return Model.of(getString("614"));
 			}
-			
+
 			@Override
 			public WebMarkupContainer getPanel(String containerId) {
 				return new FileFragment(containerId, "file-panel");
@@ -245,23 +275,24 @@ public class RoomSidebar extends Panel {
 				room.kickUser(target, kickedClient);
 			}
 		});
-		add(toggleRight, toggleActivity, roomAction);
+		add(toggleRight, toggleActivity, roomAction, avSettings);
 	}
-	
+
 	@Override
 	public void renderHead(IHeaderResponse response) {
 		super.renderHead(response);
 		response.render(new PriorityHeaderItem(getNamedFunction(FUNC_TOGGLE_RIGHT, toggleRight, explicit(PARAM_RIGHT), explicit(PARAM_UID))));
 		response.render(new PriorityHeaderItem(getNamedFunction(FUNC_TOGGLE_ACTIVITY, toggleActivity, explicit(PARAM_ACTIVITY), explicit(PARAM_UID), explicit(PARAM_POD))));
 		response.render(new PriorityHeaderItem(getNamedFunction(FUNC_ACTION, roomAction, explicit(PARAM_ACTION), explicit(PARAM_UID))));
+		response.render(new PriorityHeaderItem(getNamedFunction(FUNC_SETTINGS, avSettings, explicit(PARAM_SETTINGS))));
 	}
-	
+
 	private ListView<Client> updateUsers() {
 		//TODO do we need sort??
 		users.setList(getRoomClients(room.getRoom().getId()));
 		return users;
 	}
-	
+
 	public class UserFragment extends Fragment {
 		private static final long serialVersionUID = 1L;
 
@@ -271,7 +302,7 @@ public class RoomSidebar extends Panel {
 			add(updateUsers());
 		}
 	}
-	
+
 	public class FileFragment extends Fragment {
 		private static final long serialVersionUID = 1L;
 
@@ -300,7 +331,7 @@ public class RoomSidebar extends Panel {
 	public boolean isShowFiles() {
 		return showFiles;
 	}
-	
+
 	public void showUpload(IPartialPageRequestHandler handler) {
 		upload.open(handler);
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/ClientIcon.java Wed Jan 11 09:15:37 2017
@@ -72,6 +72,8 @@ public abstract class ClientIcon extends
 			//request/remove
 			cls.append(CLS_CLICKABLE);
 			add(AttributeAppender.replace("onclick", getScript()));
+		} else {
+			add(AttributeAppender.replace("onclick", ""));
 		}
 		internalUpdate();
 		add(AttributeAppender.replace("title", getTitle()));

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/CamActivityIcon.java Wed Jan 11 09:15:37 2017
@@ -37,7 +37,7 @@ public class CamActivityIcon extends Roo
 	}
 
 	@Override
-	protected boolean isClickable() {
-		return true;
+	public boolean isEnabled() {
+		return client.isCamEnabled();
 	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/MicActivityIcon.java Wed Jan 11 09:15:37 2017
@@ -37,7 +37,7 @@ public class MicActivityIcon extends Roo
 	}
 
 	@Override
-	protected boolean isClickable() {
-		return true;
+	public boolean isEnabled() {
+		return client.isMicEnabled();
 	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/icon/activity/RoomActivityIcon.java Wed Jan 11 09:15:37 2017
@@ -31,6 +31,7 @@ import org.apache.openmeetings.web.room.
 public abstract class RoomActivityIcon extends ClientIcon {
 	private static final long serialVersionUID = 1L;
 	private static final String CLS_ENABLED = "enabled ";
+	private static final String CLS_DISABLED = "disabled";
 	protected final Activity activity;
 	protected final Pod pod = Pod.none;
 
@@ -50,9 +51,16 @@ public abstract class RoomActivityIcon e
 	}
 
 	@Override
+	protected boolean isClickable() {
+		return isEnabled();
+	}
+
+	@Override
 	protected void internalUpdate() {
 		setVisible(visible());
-		if (client.hasActivity(activity)) {
+		if (!isEnabled()) {
+			cssClass.append(CLS_DISABLED);
+		} else if (client.hasActivity(activity)) {
 			cssClass.append(CLS_ENABLED);
 		}
 	}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css Wed Jan 11 09:15:37 2017
@@ -228,6 +228,10 @@
 .activity.mic.ui-icon {
 	background-image: url(images/microphone_enable.png);
 }
+.activity.ui-icon.disabled {
+	-webkit-filter: grayscale(100%); /* Safari 6.0 - 9.0 */
+	filter: grayscale(100%);
+}
 .activity.mic.enabled.ui-icon {
 	background-image: url(images/microphone_disable.png);
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/config.xml Wed Jan 11 09:15:37 2017
@@ -7,46 +7,46 @@
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
-  
+
       http://www.apache.org/licenses/LICENSE-2.0
-    	  
+
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
-  
+
 -->
-<config 
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-    xsi:noNamespaceSchemaLocation="config.xsd">
+<config
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:noNamespaceSchemaLocation="config.xsd">
 
 <!-- URL/IP to use for the Server for RTMP and RTMPT traffic.
-    If this value is empty it will try to connect to the 
-    domain-name the OpenMeetings-Client has been loading from
-    
-    Can be either and IP or a domain name. 
-    For example: 
-    <rtmphostlocal>192.168.254.182</rtmphostlocal>
-    or
-    <rtmphostlocal>mysubdomain.streaming.to</rtmphostlocal>
-    -->
+	If this value is empty it will try to connect to the
+	domain-name the OpenMeetings-Client has been loading from
+
+	Can be either and IP or a domain name.
+	For example:
+	<rtmphostlocal>192.168.254.182</rtmphostlocal>
+	or
+	<rtmphostlocal>mysubdomain.streaming.to</rtmphostlocal>
+-->
 <rtmphostlocal></rtmphostlocal>
 
 <!-- URL/IP to use for the Server for HTTP and HTTPS traffic.
-    If this value is empty it will use the rtmphostlocal 
-    variable (and in that way try to connect to the 
-    domain-name the OpenMeetings-Client has been loading from)
-    -->
+	If this value is empty it will use the rtmphostlocal
+	variable (and in that way try to connect to the
+	domain-name the OpenMeetings-Client has been loading from)
+	-->
 <httphostlocal></httphostlocal>
 
-<!--  
+<!--
 Port to use for the Server
 To this port the default server lookup is done
 
 You can find all this configuration in your red5-Config in: $RED5_HOME/conf/red5.properties
- -->
+-->
 <rtmpport>1935</rtmpport>
 
 <rtmpsslport>8443</rtmpsslport>
@@ -56,177 +56,175 @@ Valid values: yes / no
 
 NOTE: The OSx and Linux Flash Player are NOT able to connect via rtmps
 The support for Windows is experimental
- -->
+-->
 <useSSL>no</useSSL>
 
-<!-- 
+<!--
 Port to use for the Server
 This port is used to connect to the http-servlet
 of the red5-servlet
- -->
+-->
 <red5httpport>5080</red5httpport>
 
 <!--
-    The protocol to use for the http connections
-    for example upload/download of files 
- -->
+	The protocol to use for the http connections
+	for example upload/download of files
+-->
 <protocol>http</protocol>
 
 <!--
-    The setting for the NetConnection
-    default settings is "none"
-    set to value "best" if you are trying to use rtmp over native SSL
-    see: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetConnection.html#proxyType
- -->
+	The setting for the NetConnection
+	default settings is "none"
+	set to value "best" if you are trying to use rtmp over native SSL
+	see: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetConnection.html#proxyType
+-->
 <proxyType>none</proxyType>
-	
+
+<!--
+	Video-Settings
+
+	Number that specifies the amount of sound required to activate the microphone
+	Acceptable values from 0 to 100.
+	this value is used in Audio_Streaming, at which the *activity-meter* will
+	send a notification for all connected hosts of a conference
+	the result of this notification is that you see the green-light highlighted if
+	a remote user is speaking
+-->
+<loudnessAcitviation>0</loudnessAcitviation>
+
+<!--
+	OpenMeetings-Webapp Name
+	This is the name of the WebApp the Client will try to connect
+	in former versions (till 0.5 Beta7) the name was xmlcrm
+	the same param kann be find in the webapp in the Red5-Webapp
+	red5-web.properties
+	web.xml
+-->
+<webAppRootKey>openmeetings</webAppRootKey>
+
 <!--
-    Video-Settings
-    
-    Number that specifies the amount of sound required to activate the microphone 
-	Acceptable values from 0 to 100.	
-    this value is used in Audio_Streaming, at which the *activity-meter* will
-    send a notification for all connected hosts of a conference
-    the result of this notification is that you see the green-light highlighted if
-    a remote user is speaking
- -->
-<loudnessAcitviation>0</loudnessAcitviation>  
-    
-<!--
-    OpenMeetings-Webapp Name
-    This is the name of the WebApp the Client will try to connect
-    in former versions (till 0.5 Beta7) the name was xmlcrm
-    the same param kann be find in the webapp in the Red5-Webapp
-    red5-web.properties
-    web.xml
- -->
-<webAppRootKey>openmeetings</webAppRootKey>  
-
-<!--
-    We need this additional ROOT-Key as we have to deploy the application 
-    as Global Contex Root. 
-    
-    If the rtmpt issues is solved sothat several Webapps can use different RTMPT connection
-    we might change this value again to its origin / webapp-context
-
- -->
-<httpRootKey>/openmeetings/</httpRootKey>  
-    
-<!--
-    Window-Effect Settings
-    showWindowEffect-values:
-    y = yes
-    n = no
-    showWindowEffectOpacity-values
-    between 0 and 1
- -->
-<showWindowEffect>n</showWindowEffect> 
-
-<!--
-    #############################################################################
-    Audio and Video Settings
-    Before you change settings here,
-    you should first Play and learn how the Settings work in the Documentation:
-    http://code.google.com/p/openmeetings/wiki/AudioVideoTestingApplication
-    #############################################################################
- -->
- 
+	We need this additional ROOT-Key as we have to deploy the application
+	as Global Contex Root.
+
+	If the rtmpt issues is solved sothat several Webapps can use different RTMPT connection
+	we might change this value again to its origin / webapp-context
+
+-->
+<httpRootKey>/openmeetings/</httpRootKey>
+
+<!--
+	Window-Effect Settings
+	showWindowEffect-values:
+	y = yes
+	n = no
+	showWindowEffectOpacity-values
+	between 0 and 1
+-->
+<showWindowEffect>n</showWindowEffect>
+
+<!--
+	#############################################################################
+	Audio and Video Settings
+	Before you change settings here,
+	you should first Play and learn how the Settings work in the Documentation:
+	http://code.google.com/p/openmeetings/wiki/AudioVideoTestingApplication
+	#############################################################################
+-->
+
 <!-- Camera Settings for codecType
 
-    codecType possible values:
-    h263
-    h264
-    If you want to use red5sip, set value to "h264"
- -->
-<codecType>h263</codecType>
- 
+	codecType possible values:
+	h263
+	h264
+	If you want to use red5sip, set value to "h264"
+-->
+<codecType>h264</codecType>
+
 <!-- Camera Settings for the FramesPerSecond
-    
-    fps:Number [optional] - The requested rate at which the camera should capture 
-    data, in frames per second. The default value is 15.
- -->    
+
+	fps:Number [optional] - The requested rate at which the camera should capture
+	data, in frames per second. The default value is 15.
+-->
 <framesPerSecond>30</framesPerSecond>
-    
-    
+
 <!-- Camera Settings for the Bandwidth:
-    
-    bandwidth:Number [optional] - An integer that specifies the maximum amount 
-    of bandwidth that the current outgoing video feed can use, in bytes per second. 
-    To specify that Flash video can use as much bandwidth as needed to maintain 
-    the value of frameQuality, pass 0 for bandwidth. The default value is 16384.
- -->
+
+	bandwidth:Number [optional] - An integer that specifies the maximum amount
+	of bandwidth that the current outgoing video feed can use, in bytes per second.
+	To specify that Flash video can use as much bandwidth as needed to maintain
+	the value of frameQuality, pass 0 for bandwidth. The default value is 16384.
+-->
 <!-- These are the settings for the Quality-Modus *normal*
-    The Quality-Modus can be chosen in the Login-Box --> 
-<bandwidthNeededNormal>16384</bandwidthNeededNormal>    
-<!-- These are the settings for the Quality-Modus *best* -->    
+	The Quality-Modus can be chosen in the Login-Box -->
+<bandwidthNeededNormal>16384</bandwidthNeededNormal>
+<!-- These are the settings for the Quality-Modus *best* -->
 <bandwidthNeededBest>0</bandwidthNeededBest>
-    
-    
+
 <!-- Camera Settings for the Quality
-    
-    quality:Number [optional] - An integer that specifies the required level of 
-    picture quality, as determined by the amount of compression being applied to 
-    each video frame. Acceptable values range from 1 (lowest quality, maximum 
-    compression) to 100 (highest quality, no compression). To specify that picture 
-    quality can vary as needed to avoid exceeding bandwidth, pass 0 for quality. 
-    The default value is 0.
- --> 
-<!-- These are the settings for the Quality-Modus *normal* -->  
-<camQualityNormal>85</camQualityNormal>     
-<!-- These are the settings for the Quality-Modus *best* -->       
-<camQualityBest>90</camQualityBest> 
-    
-    
+
+	quality:Number [optional] - An integer that specifies the required level of
+	picture quality, as determined by the amount of compression being applied to
+	each video frame. Acceptable values range from 1 (lowest quality, maximum
+	compression) to 100 (highest quality, no compression). To specify that picture
+	quality can vary as needed to avoid exceeding bandwidth, pass 0 for quality.
+	The default value is 0.
+-->
+<!-- These are the settings for the Quality-Modus *normal* -->
+<camQualityNormal>85</camQualityNormal>
+<!-- These are the settings for the Quality-Modus *best* -->
+<camQualityBest>90</camQualityBest>
+
+
 <!-- Microphone Settings for the Rate:
-    
-    rate:Number - 
-    The rate at which the microphone should capture sound, in kHz. 
-    Acceptable values are 5, 8, 11, 22, and 44. 
-    The default value is 8 kHz if your sound capture 
-    device supports this value. Otherwise, the default value 
-    is the next available capture level above 8 kHz that your sound 
-    capture device supports, usually 11 kHz.
- -->
+
+	rate:Number -
+	The rate at which the microphone should capture sound, in kHz.
+	Acceptable values are 5, 8, 11, 22, and 44.
+	The default value is 8 kHz if your sound capture
+	device supports this value. Otherwise, the default value
+	is the next available capture level above 8 kHz that your sound
+	capture device supports, usually 11 kHz.
+-->
 <!-- Microphone Settings Quality-Modus -->
 <microphoneRateBest>22</microphoneRateBest>
 
 <!-- AEC configuration value
-Specifies the echo path length (in milliseconds). A longer echo path means better 
-echo cancellation but also introduces longer delays and requires more processing power. 
+Specifies the echo path length (in milliseconds). A longer echo path means better
+echo cancellation but also introduces longer delays and requires more processing power.
 The default value is 128; the only other possible value is 256.
 To disable AEC please specify 0.
- -->
+-->
 <echoPath>128</echoPath>
 
 <!--
-    Set "true" or "false" to enable/disable microphone echo suppression
- -->
+	Set "true" or "false" to enable/disable microphone echo suppression
+-->
 <echoSuppression>true</echoSuppression>
 
 <!--
-    The Size of the Whiteboard
-    The Whiteboard has scrollbars so you may increase the size without problems
- -->
-<defaultWhiteboardWidth>2400</defaultWhiteboardWidth>  
-<defaultWhiteboardHeight>1200</defaultWhiteboardHeight>  
+	The Size of the Whiteboard
+	The Whiteboard has scrollbars so you may increase the size without problems
+-->
+<defaultWhiteboardWidth>2400</defaultWhiteboardWidth>
+<defaultWhiteboardHeight>1200</defaultWhiteboardHeight>
 
 <!-- Available Configurations -->
 
 <availableCameraResolutions>
-    <resolution type="4:3 (~6 KByte/sec)" width="40" height="30" isDefault="false" />
-    <resolution type="4:3 (~12 KByte/sec)" width="80" height="60" isDefault="false" />
-    <resolution type="4:3 (~20 KByte/sec)" width="120" height="90" isDefault="true" />
-    <resolution type="QQVGA 4:3 (~36 KByte/sec)" width="160" height="120" isDefault="false" />
-    <resolution type="4:3 (~40 KByte/sec)" width="240" height="180" isDefault="false" />
-    <resolution type="HVGA 4:3 (~56 KByte/sec)" width="320" height="240" isDefault="false" />
-    <resolution type="4:3  (~60 KByte/sec)" width="480" height="360" isDefault="false" />
-    <resolution type="4:3 (~68 KByte/sec)" width="640" height="480" isDefault="false" />
-    <resolution type="XGA 4:3" width="1024" height="768" isDefault="false" />
-    <resolution type="16:9" width="256" height="150" isDefault="false" />
-    <resolution type="WQVGA 9:5" width="432" height="240" isDefault="false" />
-    <resolution type="pseudo 16:9" width="480" height="234" isDefault="false" />
-    <resolution type="16:9" width="512" height="300" isDefault="false" />
-    <resolution type="nHD 16:9" width="640" height="360" isDefault="false" />
-    <resolution type="16:9" width="1024" height="600" isDefault="false" />
+	<resolution type="4:3 (~6 KByte/sec)" width="40" height="30" isDefault="false" />
+	<resolution type="4:3 (~12 KByte/sec)" width="80" height="60" isDefault="false" />
+	<resolution type="4:3 (~20 KByte/sec)" width="120" height="90" isDefault="true" />
+	<resolution type="QQVGA 4:3 (~36 KByte/sec)" width="160" height="120" isDefault="false" />
+	<resolution type="4:3 (~40 KByte/sec)" width="240" height="180" isDefault="false" />
+	<resolution type="HVGA 4:3 (~56 KByte/sec)" width="320" height="240" isDefault="false" />
+	<resolution type="4:3  (~60 KByte/sec)" width="480" height="360" isDefault="false" />
+	<resolution type="4:3 (~68 KByte/sec)" width="640" height="480" isDefault="false" />
+	<resolution type="XGA 4:3" width="1024" height="768" isDefault="false" />
+	<resolution type="16:9" width="256" height="150" isDefault="false" />
+	<resolution type="WQVGA 9:5" width="432" height="240" isDefault="false" />
+	<resolution type="pseudo 16:9" width="480" height="234" isDefault="false" />
+	<resolution type="16:9" width="512" height="300" isDefault="false" />
+	<resolution type="nHD 16:9" width="640" height="360" isDefault="false" />
+	<resolution type="16:9" width="1024" height="600" isDefault="false" />
 </availableCameraResolutions>
 </config>

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java?rev=1778259&r1=1778258&r2=1778259&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java Wed Jan 11 09:15:37 2017
@@ -990,39 +990,26 @@ public class ScopeApplicationAdapter ext
 	}
 
 	/**
-	 * this must be set _after_ the Video/Audio-Settings have been chosen (see
-	 * editrecordstream.lzx) but _before_ anything else happens, it cannot be
-	 * applied _after_ the stream has started! 
-	 * avsettings can be: 
-	 * 		av - video and audio
-	 * 		a - audio only
-	 * 		v - video only
-	 * 		n - no a/v only static image
-	 * furthermore
+	 * This method is used to set/update broadCastID of current client
 	 * 
-	 * @param avsettings
-	 * @param vWidth
-	 * @param vHeight
+	 * @param updateBroadcastId boolean flag 
 	 * 
 	 * @return BroadcastId in case of no errors, -1 otherwise
 	 */
-	public long setUserAVSettings(String avsettings, Integer vWidth, Integer vHeight, boolean updateBroadcastId) {
+	public long setUserAVSettings(boolean updateBroadcastId) {
 		try {
 			String streamid = Red5.getConnectionLocal().getClient().getId();
-			log.debug("-----------  setUserAVSettings {} {}", streamid, avsettings);
-			Client currentClient = sessionManager.getClientByStreamId(streamid, null);
-			if (currentClient == null) {
+			log.debug("-----------  setUserAVSettings {}", streamid);
+			Client rcl = sessionManager.getClientByStreamId(streamid, null);
+			if (rcl == null) {
 				log.warn("Failed to find appropriate clients");
 				return -1;
 			}
-			currentClient.setAvsettings(avsettings);
-			currentClient.setVWidth(vWidth);
-			currentClient.setVHeight(vHeight);
 			if (updateBroadcastId) {
-				currentClient.setBroadCastID(nextBroadCastId());
+				rcl.setBroadCastID(nextBroadCastId());
+				sessionManager.updateAVClientByStreamId(streamid, rcl, null);
 			}
-			sessionManager.updateAVClientByStreamId(streamid, currentClient, null);
-			return currentClient.getBroadCastID();
+			return rcl.getBroadCastID();
 		} catch (Exception err) {
 			log.error("[setUserAVSettings]", err);
 		}