Example #1
0
        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");
                }
            }
        }