diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraControl.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraControl.cs
index c0a0442c..208b38de 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraControl.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraControl.cs
@@ -46,6 +46,17 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
void CameraOff();
}
+ ///
+ /// Describes the ability to mute and unmute camera video
+ ///
+ public interface IHasCameraMute
+ {
+ BoolFeedback CameraIsMutedFeedback { get; }
+ void CameraMuteOn();
+ void CameraMuteOff();
+ void CameraMuteToggle();
+ }
+
public class CameraSelectedEventArgs : EventArgs
{
public CameraBase SelectedCamera { get; private set; }
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs
index 208dd03e..4d074678 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/CiscoSparkCodec.cs
@@ -29,7 +29,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
public class CiscoSparkCodec : VideoCodecBase, IHasCallHistory, IHasCallFavorites, IHasDirectory,
IHasScheduleAwareness, IOccupancyStatusProvider, IHasCodecLayouts, IHasCodecSelfView,
- ICommunicationMonitor, IRouting, IHasCodecCameras, IHasCameraAutoMode, IHasCodecRoomPresets, IHasExternalSourceSwitching, IHasBranding
+ ICommunicationMonitor, IRouting, IHasCodecCameras, IHasCameraAutoMode, IHasCodecRoomPresets, IHasExternalSourceSwitching, IHasBranding, IHasCameraOff, IHasCameraMute
{
public event EventHandler DirectoryResultReturned;
@@ -311,6 +311,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
LocalLayoutFeedback = new StringFeedback(LocalLayoutFeedbackFunc);
LocalLayoutIsProminentFeedback = new BoolFeedback(LocalLayoutIsProminentFeedbackFunc);
FarEndIsSharingContentFeedback = new BoolFeedback(FarEndIsSharingContentFeedbackFunc);
+ CameraIsOffFeedback = new BoolFeedback(() => CodecStatus.Status.Video.Input.MainVideoMute.BoolValue);
+ CameraIsMutedFeedback = CameraIsOffFeedback;
+
PresentationViewMaximizedFeedback = new BoolFeedback(() => CurrentPresentationView == "Maximized");
@@ -376,8 +379,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
CodecStatus.Status.Video.Selfview.Mode.ValueChangedAction = SelfviewIsOnFeedback.FireUpdate;
CodecStatus.Status.Video.Selfview.PIPPosition.ValueChangedAction = ComputeSelfviewPipStatus;
CodecStatus.Status.Video.Layout.LayoutFamily.Local.ValueChangedAction = ComputeLocalLayout;
- CodecStatus.Status.Conference.Presentation.Mode.ValueChangedAction += SharingContentIsOnFeedback.FireUpdate;
- CodecStatus.Status.Conference.Presentation.Mode.ValueChangedAction += FarEndIsSharingContentFeedback.FireUpdate;
+ CodecStatus.Status.Conference.Presentation.Mode.ValueChangedAction = SharingContentIsOnFeedback.FireUpdate;
+ CodecStatus.Status.Conference.Presentation.Mode.ValueChangedAction = FarEndIsSharingContentFeedback.FireUpdate;
+ CodecStatus.Status.Video.Input.MainVideoMute.ValueChangedAction = CameraIsOffFeedback.FireUpdate;
CodecOsdIn = new RoutingInputPort(RoutingPortNames.CodecOsd, eRoutingSignalType.Audio | eRoutingSignalType.Video,
eRoutingPortConnectionType.Hdmi, new Action(StopSharing), this);
@@ -1631,6 +1635,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
public void CameraAutoModeOn()
{
SendText("xCommand Cameras SpeakerTrack Activate");
+ CameraMuteOff();
}
public void CameraAutoModeOff()
@@ -1706,6 +1711,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
_selectedCamera = value;
SelectedCameraFeedback.FireUpdate();
ControllingFarEndCameraFeedback.FireUpdate();
+ if (CameraIsOffFeedback.BoolValue)
+ CameraMuteOff();
var handler = CameraSelected;
if (handler != null)
@@ -1969,7 +1976,47 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
#endregion
- }
+
+ #region IHasCameraOff Members
+
+ public BoolFeedback CameraIsOffFeedback { get; private set; }
+
+ public void CameraOff()
+ {
+ CameraMuteOn();
+ }
+
+ #endregion
+
+ public BoolFeedback CameraIsMutedFeedback { get; private set; }
+
+ ///
+ /// Mutes the outgoing camera video
+ ///
+ public void CameraMuteOn()
+ {
+ SendText("xCommand Video InputMainVideo Mute");
+ }
+
+ ///
+ /// Unmutes the outgoing camera video
+ ///
+ public void CameraMuteOff()
+ {
+ SendText("xCommand Video InputMainVideo Unmute");
+ }
+
+ ///
+ /// Toggles the camera mute state
+ ///
+ public void CameraMuteToggle()
+ {
+ if (CameraIsMutedFeedback.BoolValue)
+ CameraMuteOff();
+ else
+ CameraMuteOn();
+ }
+ }
///
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/xStatus.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/xStatus.cs
index e3fd4dcb..7fa4e655 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/xStatus.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/CiscoCodec/xStatus.cs
@@ -1606,6 +1606,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
public string Value { get; set; }
}
+ public class MainVideoMute : ValueProperty
+ {
+ public bool BoolValue { get; private set; }
+
+ public string Value
+ {
+ set
+ {
+ // If the incoming value is "On" it sets the BoolValue true, otherwise sets it false
+ BoolValue = value == "On";
+ OnValueChanged();
+ }
+ }
+
+ }
+
public class ConnectorId
{
public string Value { get; set; }
@@ -1662,6 +1678,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
{
public List Connector { get; set; }
public MainVideoSource MainVideoSource { get; set; }
+ public MainVideoMute MainVideoMute { get; set; }
public List Source { get; set; }
}
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
index 980c7a61..84617c6d 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
@@ -23,7 +23,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{
public class ZoomRoom : VideoCodecBase, IHasCodecSelfView, IHasDirectoryHistoryStack, ICommunicationMonitor,
IRouting,
- IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraAutoMode,
+ IHasScheduleAwareness, IHasCodecCameras, IHasParticipants, IHasCameraOff, IHasCameraMute, IHasCameraAutoMode,
IHasFarEndContentStatus, IHasSelfviewPosition, IHasPhoneDialing
{
private const long MeetingRefreshTimer = 60000;
@@ -98,6 +98,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
CameraIsOffFeedback = new BoolFeedback(CameraIsOffFeedbackFunc);
+ CameraIsMutedFeedback = CameraIsOffFeedback;
+
CameraAutoModeIsOnFeedback = new BoolFeedback(CameraAutoModeIsOnFeedbackFunc);
CodecSchedule = new CodecScheduleAwareness(MeetingRefreshTimer);
@@ -1775,16 +1777,37 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public void CameraOff()
{
- SendText("zConfiguration Call Camera Mute: On");
+ CameraMuteOn();
}
#endregion
+ public BoolFeedback CameraIsMutedFeedback { get; private set; }
+
+ public void CameraMuteOn()
+ {
+ SendText("zConfiguration Call Camera Mute: On");
+ }
+
+ public void CameraMuteOff()
+ {
+ SendText("zConfiguration Call Camera Mute: Off");
+ }
+
+ public void CameraMuteToggle()
+ {
+ if (CameraIsMutedFeedback.BoolValue)
+ CameraMuteOff();
+ else
+ CameraMuteOn();
+ }
+
#region Implementation of IHasCameraAutoMode
//Zoom doesn't support camera auto modes. Setting this to just unmute video
public void CameraAutoModeOn()
{
+ CameraMuteOff();
throw new NotImplementedException("Zoom Room Doesn't support camera auto mode");
}