public static void Build(AtemState state, IBMDSwitcher switcher) { #if !ATEM_v8_1 var recordingSwitcher = switcher as IBMDSwitcherRecordAV; if (recordingSwitcher == null) { return; } state.Recording = new RecordingState(); //recordingSwitcher.IsRecording(out int recording); recordingSwitcher.GetStatus(out _BMDSwitcherRecordAVState avState, out _BMDSwitcherRecordAVError error); recordingSwitcher.GetFilename(out string filename); recordingSwitcher.GetRecordInAllCameras(out int recordInAllCameras); recordingSwitcher.GetWorkingSetLimit(out uint workingSetLimit); recordingSwitcher.GetActiveDiskIndex(out uint activeDiskIndex); //recordingSwitcher.GetDuration(out ulong duration); recordingSwitcher.GetTimeCode(out byte hours, out byte minutes, out byte seconds, out byte frames, out int dropFrame); recordingSwitcher.GetWorkingSetDisk(0, out uint workingSet1Id); recordingSwitcher.GetWorkingSetDisk(1, out uint workingSet2Id); recordingSwitcher.GetTotalRecordingTimeAvailable(out uint totalRecordingTimeAvailable); state.Recording.Status.State = AtemEnumMaps.RecordingStateMap.FindByValue(avState); state.Recording.Status.Error = AtemEnumMaps.RecordingErrorMap.FindByValue(error); state.Recording.Status.TotalRecordingTimeAvailable = totalRecordingTimeAvailable; state.Recording.Status.Duration = new Timecode { Hour = hours, Minute = minutes, Second = seconds, Frame = frames, DropFrame = dropFrame != 0, }; Assert.Equal(2u, workingSetLimit); state.Recording.Properties.Filename = filename; state.Recording.Properties.WorkingSet1DiskId = workingSet1Id; state.Recording.Properties.WorkingSet2DiskId = workingSet2Id; state.Recording.Properties.RecordInAllCameras = recordInAllCameras != 0; recordingSwitcher.DoesSupportISORecording(out int supportsIso); state.Recording.CanISORecordAllInputs = supportsIso != 0; if (supportsIso != 0) { recordingSwitcher.GetRecordAllISOInputs(out int recordIso); state.Recording.ISORecordAllInputs = recordIso != 0; } var diskIterator = AtemSDKConverter.CastSdk <IBMDSwitcherRecordDiskIterator>(recordingSwitcher.CreateIterator); AtemSDKConverter.IterateList <IBMDSwitcherRecordDisk, RecordingState.RecordingDiskState>(diskIterator.Next, (sdk, id) => { sdk.GetId(out uint diskId); sdk.GetVolumeName(out string volumeName); sdk.GetRecordingTimeAvailable(out uint recordingTimeAvailable); sdk.GetStatus(out _BMDSwitcherRecordDiskStatus diskStatus); var res = new RecordingState.RecordingDiskState { DiskId = diskId, VolumeName = volumeName, RecordingTimeAvailable = recordingTimeAvailable, Status = AtemEnumMaps.RecordingDiskStatusMap.FindByValue(diskStatus), }; state.Recording.Disks.Add(diskId, res); return(res); }); // TODO DoesSupportISORecording // TODO activeDiskIndex #endif }
public static void Update(AtemState state, UpdateResultImpl result, ICommand command) { if (command is RecordingSettingsGetCommand rmsuCmd) { if (state.Recording == null) { state.Recording = new RecordingState(); } UpdaterUtil.CopyAllProperties(rmsuCmd, state.Recording.Properties); result.SetSuccess($"Recording.Properties"); } else if (command is RecordingISOCommand isoCmd) { if (state.Recording != null) { state.Recording.CanISORecordAllInputs = true; state.Recording.ISORecordAllInputs = isoCmd.ISORecordAllInputs; result.SetSuccess($"Recording.ISORecordAllInputs"); } } else if (command is RecordingStatusGetCommand statusCmd) { if (state.Recording != null) { state.Recording.Status.State = statusCmd.Status; state.Recording.Status.Error = statusCmd.Error; state.Recording.Status.TotalRecordingTimeAvailable = statusCmd.TotalRecordingTimeAvailable; result.SetSuccess($"Recording.Status"); } } else if (command is RecordingDiskInfoCommand diskCmd) { if (state.Recording != null) { if (diskCmd.Status == RecordingDiskStatus.Removed) { state.Recording.Disks.Remove(diskCmd.DiskId); } else { if (!state.Recording.Disks.TryGetValue(diskCmd.DiskId, out RecordingState.RecordingDiskState disk)) { disk = new RecordingState.RecordingDiskState(); state.Recording.Disks.Add(diskCmd.DiskId, disk); } UpdaterUtil.CopyAllProperties(diskCmd, disk); //, new []{"DiskId"}); result.SetSuccess($"Recording.Disks.{diskCmd.DiskId:D}"); } } } else if (command is RecordingDurationCommand timecodeCmd) { if (state.Recording != null) { state.Recording.Status.Duration = new Timecode { Hour = timecodeCmd.Hour, Minute = timecodeCmd.Minute, Second = timecodeCmd.Second, Frame = timecodeCmd.Frame, DropFrame = timecodeCmd.IsDropFrame, }; result.SetSuccess("Recording.Status.Duration"); } } }