code: public int setValue(int value) throws ControlException {
  		int v = defaultValue;
  		
  		if(type==V4L4JConstants.CTRL_TYPE_STRING)
  			throw new UnsupportedMethod("This control is a string control and does not support calls to setValue()");
  		if(type==V4L4JConstants.CTRL_TYPE_LONG)
  			throw new UnsupportedMethod("This control is a long control and does not support calls to setValue()");
  		
  		state.get();
  		if(type==V4L4JConstants.CTRL_TYPE_BUTTON)
  			value = 0;
  		else
  			value = validateValue(value);
  		
  		try { doSetValue(v4l4jObject,id, value);}
  		catch (ControlException ce){
  			state.put();
  			throw ce;
  		}
  		try {v = getValue();} catch (ControlException ce){}
  		state.put();
  		return v;
  	}
docs: This method sets a new value for this control. The returned value is the new value
  of the control, which for normal controls will be identical to the one set. However,
  some controls (for example relative values like pan or tilt) are write-only and getting
  their value does not make sense. The return value in this case is the
  control's default value (as returned by {@link #getDefaultValue()}).
  @param value the new value
  @return the new value of the control after setting it, or the control's default
  value
  @throws ControlException if the value can not be set.
  @throws UnsupportedMethod if this control is of type {@link V4L4JConstants#CTRL_TYPE_STRING}
  (and you should be using {@link #setStringValue(String)} instead) or
  if this control is of type {@link V4L4JConstants#CTRL_TYPE_LONG}
  (and you should be using {@link #setLongValue(long)} instead).
  @throws StateException if this control has been released and must not be used anymore.