diff --git a/Vocaluxe/Screens/CScreenOptionsVideo.cs b/Vocaluxe/Screens/CScreenOptionsVideo.cs index 30928b19..fb4f3e4f 100644 --- a/Vocaluxe/Screens/CScreenOptionsVideo.cs +++ b/Vocaluxe/Screens/CScreenOptionsVideo.cs @@ -28,6 +28,8 @@ namespace Vocaluxe.Screens private SWebcamConfig _Config; Lib.Draw.STexture _WebcamTexture = new Lib.Draw.STexture(-1); + private int _DeviceNr; + private int _CapabilityNr; public CScreenOptionsVideo() { @@ -54,23 +56,6 @@ namespace Vocaluxe.Screens SelectSlides[htSelectSlides(SelectSlideVideoPreview)].SetValues((int)CConfig.VideoPreview); SelectSlides[htSelectSlides(SelectSlideVideosInSongs)].SetValues((int)CConfig.VideosInSongs); SelectSlides[htSelectSlides(SelectSlideVideosToBackground)].SetValues((int)CConfig.VideosToBackground); - - SWebcamDevice[] dev = CWebcam.GetDevices(); - foreach(SWebcamDevice d in dev) - { - SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].AddValue(d.Name); - } - int deviceNr = SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection; - for (int i = 0; i < dev[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities.Count; i++) - { - SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].AddValue(dev[deviceNr].Capabilities[i].Width.ToString() + " x " + dev[deviceNr].Capabilities[i].Height.ToString() + " @ " + dev[deviceNr].Capabilities[i].Framerate.ToString() + " FPS"); - } - SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection = 0; - - _Config.MonikerString = dev[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].MonikerString; - _Config.Width = dev[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Width; - _Config.Height = dev[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Height; - _Config.Framerate = dev[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Framerate; } public override bool HandleInput(KeyEvent KeyEvent) @@ -165,16 +150,47 @@ namespace Vocaluxe.Screens public override void OnClose() { - CWebcam.Close(); base.OnClose(); + CWebcam.Close(); } public override void OnShow() { - CWebcam.Close(); - CWebcam.Select(_Config); - CWebcam.Start(); base.OnShow(); + SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Clear(); + SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Clear(); + + _DeviceNr = -1; + _CapabilityNr = -1; + + SWebcamDevice[] devices = CWebcam.GetDevices(); + + if (devices != null) + { + _DeviceNr = 0; + _CapabilityNr = 0; + GetFirstConfiguredWebcamDevice(ref _DeviceNr, ref _CapabilityNr); + + foreach (SWebcamDevice d in devices) + { + SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].AddValue(d.Name); + } + SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection = _DeviceNr; + + foreach (SCapabilities c in devices[_DeviceNr].Capabilities) + { + SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].AddValue(c.Width.ToString() + " x " + c.Height.ToString() + " @ " + c.Framerate.ToString() + " FPS "); + } + _Config.MonikerString = devices[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].MonikerString; + _Config.Width = devices[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Width; + _Config.Height = devices[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Height; + _Config.Framerate = devices[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Framerate; + CWebcam.Close(); + CWebcam.Select(CConfig.WebcamConfig); + CWebcam.Start(); + } + SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Visible = (devices != null); + SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Visible = (devices != null); } private void SaveConfig() @@ -192,37 +208,70 @@ namespace Vocaluxe.Screens private void OnDeviceEvent() { - int deviceNr = SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection; - SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Clear(); - - SWebcamDevice[] d = CWebcam.GetDevices(); - for (int i = 0; i < d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities.Count; i++) + if (SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection != _DeviceNr) { - SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].AddValue(d[deviceNr].Capabilities[i].Width.ToString() + " x " + d[deviceNr].Capabilities[i].Height.ToString() + " @ " + d[deviceNr].Capabilities[i].Framerate.ToString()); + SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Clear(); + _DeviceNr = SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection; + _CapabilityNr = 0; + + SWebcamDevice[] d = CWebcam.GetDevices(); + for (int i = 0; i < d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities.Count; i++) + { + SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].AddValue(d[_DeviceNr].Capabilities[i].Width.ToString() + " x " + d[_DeviceNr].Capabilities[i].Height.ToString() + " @ " + d[_DeviceNr].Capabilities[i].Framerate.ToString() + "FPS"); + } + SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection = 0; + + _Config.MonikerString = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].MonikerString; + _Config.Width = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Width; + _Config.Height = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Height; + _Config.Framerate = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Framerate; + + CWebcam.Close(); + CWebcam.Select(_Config); + CWebcam.Start(); } - SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection = 0; - - _Config.MonikerString = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].MonikerString; - _Config.Width = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Width; - _Config.Height = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Height; - _Config.Framerate = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Framerate; - - CWebcam.Close(); - CWebcam.Select(_Config); - CWebcam.Start(); } private void OnCapabilitiesEvent() { - SWebcamDevice[] d = CWebcam.GetDevices(); - _Config.MonikerString = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].MonikerString; - _Config.Width = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Width; - _Config.Height = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Height; - _Config.Framerate = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Framerate; + if (SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection != _CapabilityNr) + { + _CapabilityNr = SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection; - CWebcam.Close(); - CWebcam.Select(_Config); - CWebcam.Start(); + SWebcamDevice[] d = CWebcam.GetDevices(); + _Config.MonikerString = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].MonikerString; + _Config.Width = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Width; + _Config.Height = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Height; + _Config.Framerate = d[SelectSlides[htSelectSlides(SelectSlideWebcamDevices)].Selection].Capabilities[SelectSlides[htSelectSlides(SelectSlideWebcamCapabilities)].Selection].Framerate; + + CWebcam.Close(); + CWebcam.Select(_Config); + CWebcam.Start(); + } + } + + private void GetFirstConfiguredWebcamDevice(ref int Device, ref int Capabilities) + { + SWebcamDevice[] devices = CWebcam.GetDevices(); + + if (devices == null) + return; + + for (int i = 0; i < devices.Length; i++) + { + if (devices[i].MonikerString == CConfig.WebcamConfig.MonikerString) + { + for (int j = 0; j < devices[i].Capabilities.Count; j++) + { + if (devices[i].Capabilities[j].Framerate == CConfig.WebcamConfig.Framerate && devices[i].Capabilities[j].Width == CConfig.WebcamConfig.Width && devices[i].Capabilities[j].Height == CConfig.WebcamConfig.Height) + { + Device = i; + Capabilities = j; + return; + } + } + } + } } } }