public static CameraControlGetCommand BuildCommand(IBMDSwitcherCameraControl camera, uint device, uint category, uint parameter) { camera.GetParameterInfo(device, category, parameter, out _BMDSwitcherCameraControlParameterType type, out uint count); CameraControlDataType newType; switch (type) { case _BMDSwitcherCameraControlParameterType.bmdSwitcherCameraControlParameterTypeVoidBool: newType = CameraControlDataType.Bool; break; case _BMDSwitcherCameraControlParameterType.bmdSwitcherCameraControlParameterTypeSigned8Bit: newType = CameraControlDataType.SInt8; break; case _BMDSwitcherCameraControlParameterType.bmdSwitcherCameraControlParameterTypeSigned16Bit: newType = CameraControlDataType.SInt16; break; case _BMDSwitcherCameraControlParameterType.bmdSwitcherCameraControlParameterTypeSigned32Bit: newType = CameraControlDataType.SInt32; break; case _BMDSwitcherCameraControlParameterType.bmdSwitcherCameraControlParameterTypeSigned64Bit: newType = CameraControlDataType.SInt64; break; case _BMDSwitcherCameraControlParameterType.bmdSwitcherCameraControlParameterTypeUTF8: newType = CameraControlDataType.String; break; case _BMDSwitcherCameraControlParameterType.bmdSwitcherCameraControlParameterTypeFixedPoint16Bit: newType = CameraControlDataType.Float; break; default: throw new ArgumentOutOfRangeException(); } camera.GetParameterPeriodicFlushEnabled(device, category, parameter, out int flushEnabled); var cmd = new CameraControlGetCommand { Input = (VideoSource)device, Category = category, Parameter = parameter, Type = newType, PeriodicFlushEnabled = flushEnabled != 0, }; switch (cmd.Type) { case CameraControlDataType.Bool: { uint count2 = count; camera.GetFlags(device, category, parameter, ref count2, out int values); int[] intVals = Randomiser.ConvertSdkArray(count2, ref values); var sbyteVals = new sbyte[count2]; Buffer.BlockCopy(intVals, 0, sbyteVals, 0, (int)count2); cmd.BoolData = sbyteVals.Select(v => v != 0).ToArray(); break; } case CameraControlDataType.SInt8: { uint count2 = count; camera.GetInt8s(device, category, parameter, ref count2, out sbyte values); cmd.IntData = Randomiser.ConvertSdkArray(count2, ref values).Select(v => (int)v).ToArray(); break; } case CameraControlDataType.SInt16: { uint count2 = count; camera.GetInt16s(device, category, parameter, ref count2, out short values); cmd.IntData = Randomiser.ConvertSdkArray(count2, ref values).Select(v => (int)v).ToArray(); break; } case CameraControlDataType.SInt32: { uint count2 = count; camera.GetInt32s(device, category, parameter, ref count2, out int values); cmd.IntData = Randomiser.ConvertSdkArray(count2, ref values); break; } case CameraControlDataType.SInt64: { uint count2 = count; camera.GetInt64s(device, category, parameter, ref count2, out long values); cmd.LongData = Randomiser.ConvertSdkArray(count2, ref values); break; } case CameraControlDataType.String: { camera.GetString(device, category, parameter, out string value); cmd.StringData = value; break; } case CameraControlDataType.Float: { uint count2 = count; camera.GetFloats(device, category, parameter, ref count2, out double values); cmd.FloatData = Randomiser.ConvertSdkArray(count2, ref values); break; } default: throw new ArgumentOutOfRangeException(); } return(cmd); }