internal static void EachRandomSource(AtemMockServerWrapper helper, Action <AtemState, FairlightAudioState.InputSourceState, long, IBMDSwitcherFairlightAudioSource, int> fcn, int maxIterations = 5, bool useAll = false) { List <long> useIds = helper.Helper.BuildLibState().Fairlight.Inputs.Keys.ToList(); if (!useAll) { useIds = Randomiser.SelectionOfGroup(useIds, 2).ToList(); } foreach (long id in useIds) { helper.Helper.SyncStates(); IBMDSwitcherFairlightAudioSource src = GetSource(helper, id); src.GetId(out long sourceId); AtemState stateBefore = helper.Helper.BuildLibState(); FairlightAudioState.InputSourceState srcState = stateBefore.Fairlight.Inputs[id].Sources.Single(s => s.SourceId == sourceId); for (int i = 0; i < maxIterations; i++) { fcn(stateBefore, srcState, id, src, i); } } }
private static FairlightAudioState.InputSourceState BuildSource(IBMDSwitcherFairlightAudioSource props, AudioSource inputId, Dictionary <Tuple <AudioSource, long>, bool> tally) { var state = new FairlightAudioState.InputSourceState(); props.IsActive(out int active); if (active == 0) { return(null); } props.GetId(out long id); state.SourceId = id; props.GetSupportedMixOptions(out _BMDSwitcherFairlightAudioMixOption supportedMixOptions); state.SupportedMixOptions = (FairlightAudioMixOption)supportedMixOptions; props.GetSourceType(out _BMDSwitcherFairlightAudioSourceType sourceType); state.SourceType = AtemEnumMaps.FairlightAudioSourceTypeMap.FindByValue(sourceType); props.GetMaxDelayFrames(out ushort maxDelay); state.MaxFramesDelay = maxDelay; props.GetDelayFrames(out ushort delay); state.FramesDelay = delay; props.GetInputGain(out double inputGain); state.Gain = inputGain; props.GetPan(out double pan); state.Balance = pan; props.GetFaderGain(out double faderGain); state.FaderGain = faderGain; props.GetMixOption(out _BMDSwitcherFairlightAudioMixOption mixOption); state.MixOption = AtemEnumMaps.FairlightAudioMixOptionMap.FindByValue(mixOption); props.HasStereoSimulation(out int hasStereoSimulation); state.HasStereoSimulation = hasStereoSimulation != 0; props.GetStereoSimulationIntensity(out double stereoSimulation); state.StereoSimulation = stereoSimulation; props.IsMixedIn(out int mixedIn); tally[Tuple.Create(inputId, id)] = mixedIn != 0; var dynamics = AtemSDKConverter.CastSdk <IBMDSwitcherFairlightAudioDynamicsProcessor>(props.GetEffect); dynamics.GetMakeupGain(out double makeupGain); state.Dynamics.MakeUpGain = makeupGain; var compressor = AtemSDKConverter.CastSdk <IBMDSwitcherFairlightAudioCompressor>(dynamics.GetProcessor); FairlightAudioBuilderCommon.ApplyCompressor(compressor, state.Dynamics.Compressor = new FairlightAudioState.CompressorState()); var limiter = AtemSDKConverter.CastSdk <IBMDSwitcherFairlightAudioLimiter>(dynamics.GetProcessor); FairlightAudioBuilderCommon.ApplyLimiter(limiter, state.Dynamics.Limiter = new FairlightAudioState.LimiterState()); var expander = AtemSDKConverter.CastSdk <IBMDSwitcherFairlightAudioExpander>(dynamics.GetProcessor); FairlightAudioBuilderCommon.ApplyExpander(expander, state.Dynamics.Expander = new FairlightAudioState.ExpanderState()); var eq = AtemSDKConverter.CastSdk <IBMDSwitcherFairlightAudioEqualizer>(props.GetEffect); FairlightAudioBuilderCommon.ApplyEqualizer(eq, state.Equalizer); return(state); }
public void TestAddRemoveSources() { AtemMockServerWrapper.Each(_output, _pool, null, DeviceTestCases.FairlightMain, helper => { IEnumerable <long> useIds = Randomiser.SelectionOfGroup(helper.Helper.BuildLibState().Fairlight.Inputs.Keys.ToList()); foreach (long id in useIds) { helper.Helper.SyncStates(); IBMDSwitcherFairlightAudioInput input = GetInput(helper, id); AtemState stateBefore = helper.Helper.BuildLibState(); FairlightAudioState.InputState inputState = stateBefore.Fairlight.Inputs[id]; inputState.Sources.Add(new FairlightAudioState.InputSourceState { SourceId = 944, MixOption = FairlightAudioMixOption.Off, Gain = -23.7, }); int sourceId = 944; void mangleState(AtemState sdkState, AtemState libState) { FairlightAudioState.InputSourceState srcState = sdkState.Fairlight.Inputs[id].Sources.Single(s => s.SourceId == sourceId); srcState.Dynamics.Limiter = null; srcState.Dynamics.Compressor = null; srcState.Dynamics.Expander = null; } helper.SendAndWaitForChange(stateBefore, () => { helper.Server.SendCommands(new FairlightMixerSourceGetCommand { Index = (AudioSource)id, SourceId = sourceId, MixOption = FairlightAudioMixOption.Off, Gain = -23.7, }); }, -1, mangleState); var removeSourceId = inputState.Sources[0].SourceId; inputState.Sources.RemoveAt(0); helper.SendAndWaitForChange(stateBefore, () => { helper.Server.SendCommands(new FairlightMixerSourceDeleteCommand { Index = (AudioSource)id, SourceId = removeSourceId, }); }, -1, mangleState); } }); }
public static void Update(AtemState state, UpdateResultImpl result, ICommand command) { if (command is FairlightAudioMixerConfigCommand confCmd) { state.Fairlight = new FairlightAudioState { Monitors = UpdaterUtil.CreateList(confCmd.Monitors, i => new FairlightAudioState.MonitorOutputState()), }; result.SetSuccess("Fairlight.Monitors"); } else if (state.Fairlight != null) { if (command is FairlightMixerMasterGetCommand masterCmd) { var pgmState = state.Fairlight.ProgramOut; UpdaterUtil.CopyAllProperties(masterCmd, pgmState, new[] { "EqualizerGain", "EqualizerEnabled", "MakeUpGain", "EqualizerBands" }, new[] { "Dynamics", "Equalizer", "AudioFollowVideoCrossfadeTransitionEnabled", "Levels", "Peaks" }); pgmState.Dynamics.MakeUpGain = masterCmd.MakeUpGain; pgmState.Equalizer.Enabled = masterCmd.EqualizerEnabled; pgmState.Equalizer.Gain = masterCmd.EqualizerGain; if (masterCmd.EqualizerBands != pgmState.Equalizer.Bands.Count) { pgmState.Equalizer.Bands = pgmState.Equalizer.Bands.RebuildToLength(masterCmd.EqualizerBands, (i) => new FairlightAudioState.EqualizerBandState()); } result.SetSuccess(new[] { "Fairlight.ProgramOut", "Fairlight.ProgramOut.Dynamics", "Fairlight.ProgramOut.Equalizer" }); } else if (command is FairlightMixerMasterLimiterGetCommand masterLimCmd) { var pgmDynamics = state.Fairlight.ProgramOut.Dynamics; if (pgmDynamics.Limiter == null) { pgmDynamics.Limiter = new FairlightAudioState.LimiterState(); } UpdaterUtil.CopyAllProperties(masterLimCmd, pgmDynamics.Limiter, null, new[] { "GainReductionLevel" }); result.SetSuccess("Fairlight.ProgramOut.Dynamics.Limiter"); } else if (command is FairlightMixerMasterCompressorGetCommand masterCompCmd) { var pgmDynamics = state.Fairlight.ProgramOut.Dynamics; if (pgmDynamics.Compressor == null) { pgmDynamics.Compressor = new FairlightAudioState.CompressorState(); } UpdaterUtil.CopyAllProperties(masterCompCmd, pgmDynamics.Compressor, null, new[] { "GainReductionLevel" }); result.SetSuccess("Fairlight.ProgramOut.Dynamics.Compressor"); } else if (command is FairlightMixerInputGetCommand inpCmd) { if (!state.Fairlight.Inputs.TryGetValue((long)inpCmd.Index, out var inputState)) { inputState = state.Fairlight.Inputs[(long)inpCmd.Index] = new FairlightAudioState.InputState(); } if (inpCmd.SupportsRcaToXlr) { inputState.Analog = new FairlightAudioState.AnalogState { SupportedInputLevel = FairlightAnalogInputLevel.ConsumerLine | FairlightAnalogInputLevel.ProLine, InputLevel = inpCmd.RcaToXlrEnabled ? FairlightAnalogInputLevel.ConsumerLine : FairlightAnalogInputLevel.ProLine }; } UpdaterUtil.CopyAllProperties(inpCmd, inputState, new[] { "Index", "SupportsRcaToXlr", "RcaToXlrEnabled" }, new[] { "Sources", "Analog", "Xlr" }); result.SetSuccess(new[] { $"Fairlight.Inputs.{inpCmd.Index:D}.ExternalPortType", $"Fairlight.Inputs.{inpCmd.Index:D}.ActiveConfiguration", $"Fairlight.Inputs.{inpCmd.Index:D}.Analog" }); } else if (command is FairlightMixerInputGetV811Command inp811Cmd) { if (!state.Fairlight.Inputs.TryGetValue((long)inp811Cmd.Index, out var inputState)) { inputState = state.Fairlight.Inputs[(long)inp811Cmd.Index] = new FairlightAudioState.InputState(); } UpdaterUtil.CopyAllProperties(inp811Cmd, inputState, new[] { "Index", "SupportedInputLevels", "ActiveInputLevel" }, new[] { "Sources", "Analog", "Xlr" }); if (inp811Cmd.SupportedInputLevels != 0) { inputState.Analog = new FairlightAudioState.AnalogState { SupportedInputLevel = inp811Cmd.SupportedInputLevels, InputLevel = inp811Cmd.ActiveInputLevel }; } result.SetSuccess(new[] { $"Fairlight.Inputs.{inp811Cmd.Index:D}.ExternalPortType", $"Fairlight.Inputs.{inp811Cmd.Index:D}.ActiveConfiguration", $"Fairlight.Inputs.{inp811Cmd.Index:D}.Analog" }); } else if (command is FairlightMixerSourceGetCommand srcCmd) { UpdaterUtil.TryForKey(result, state.Fairlight.Inputs, (long)srcCmd.Index, inputState => { FairlightAudioState.InputSourceState srcState = inputState.Sources.FirstOrDefault(s => s.SourceId == srcCmd.SourceId); if (srcState == null) { srcState = new FairlightAudioState.InputSourceState(); inputState.Sources.Add(srcState); } srcState.Dynamics.MakeUpGain = srcCmd.MakeUpGain; srcState.Equalizer.Enabled = srcCmd.EqualizerEnabled; srcState.Equalizer.Gain = srcCmd.EqualizerGain; if (srcCmd.EqualizerBands != srcState.Equalizer.Bands.Count) { srcState.Equalizer.Bands = srcState.Equalizer.Bands.RebuildToLength(srcCmd.EqualizerBands, (i) => new FairlightAudioState.EqualizerBandState()); } UpdaterUtil.CopyAllProperties(srcCmd, srcState, new[] { "Index", "EqualizerBands", "EqualizerEnabled", "EqualizerGain", "MakeUpGain" }, new[] { "Dynamics", "Equalizer", "Levels" }); result.SetSuccess($"Fairlight.Inputs.{srcCmd.Index:D}.Sources.{srcCmd.SourceId:D}"); }); } else if (command is FairlightMixerSourceDeleteCommand delCmd) { UpdaterUtil.TryForKey(result, state.Fairlight.Inputs, (long)delCmd.Index, inputState => { inputState.Sources.RemoveAll(src => src.SourceId == delCmd.SourceId); result.SetSuccess($"Fairlight.Inputs.{delCmd.Index:D}.Sources.{delCmd.SourceId:D}"); }); } else if (command is FairlightMixerSourceCompressorGetCommand compCmd) { UpdaterUtil.TryForKey(result, state.Fairlight.Inputs, (long)compCmd.Index, inputState => { FairlightAudioState.InputSourceState srcState = inputState.Sources.FirstOrDefault(s => s.SourceId == compCmd.SourceId); if (srcState != null) { if (srcState.Dynamics.Compressor == null) { srcState.Dynamics.Compressor = new FairlightAudioState.CompressorState(); } UpdaterUtil.CopyAllProperties(compCmd, srcState.Dynamics.Compressor, new[] { "Index", "SourceId" }, new[] { "GainReductionLevel" }); result.SetSuccess($"Fairlight.Inputs.{compCmd.Index:D}.Sources.{compCmd.SourceId:D}.Dynamics.Compressor"); } }); } else if (command is FairlightMixerSourceLimiterGetCommand limCmd) { UpdaterUtil.TryForKey(result, state.Fairlight.Inputs, (long)limCmd.Index, inputState => { FairlightAudioState.InputSourceState srcState = inputState.Sources.FirstOrDefault(s => s.SourceId == limCmd.SourceId); if (srcState != null) { if (srcState.Dynamics.Limiter == null) { srcState.Dynamics.Limiter = new FairlightAudioState.LimiterState(); } UpdaterUtil.CopyAllProperties(limCmd, srcState.Dynamics.Limiter, new[] { "Index", "SourceId" }, new[] { "GainReductionLevel" }); result.SetSuccess($"Fairlight.Inputs.{limCmd.Index:D}.Sources.{limCmd.SourceId:D}.Dynamics.Limiter"); } }); } else if (command is FairlightMixerSourceExpanderGetCommand expandCmd) { UpdaterUtil.TryForKey(result, state.Fairlight.Inputs, (long)expandCmd.Index, inputState => { FairlightAudioState.InputSourceState srcState = inputState.Sources.FirstOrDefault(s => s.SourceId == expandCmd.SourceId); if (srcState != null) { if (srcState.Dynamics.Expander == null) { srcState.Dynamics.Expander = new FairlightAudioState.ExpanderState(); } UpdaterUtil.CopyAllProperties(expandCmd, srcState.Dynamics.Expander, new[] { "Index", "SourceId" }, new[] { "GainReductionLevel" }); result.SetSuccess($"Fairlight.Inputs.{expandCmd.Index:D}.Sources.{expandCmd.SourceId:D}.Dynamics.Expander"); } }); } else if (command is FairlightMixerAnalogAudioGetCommand analogCmd) { UpdaterUtil.TryForKey(result, state.Fairlight.Inputs, (long)analogCmd.Index, inputState => { if (inputState.Analog == null) { inputState.Analog = new FairlightAudioState.AnalogState(); } UpdaterUtil.CopyAllProperties(analogCmd, inputState.Analog, new[] { "Index" }); result.SetSuccess($"Fairlight.Inputs.{analogCmd.Index:D}.Analog"); }); } else if (command is FairlightMixerMonitorGetCommand monCmd) { UpdaterUtil.TryForIndex(result, state.Fairlight.Monitors, 0, monState => { UpdaterUtil.CopyAllProperties(monCmd, monState, new[] { "Index" }); result.SetSuccess($"Fairlight.Monitors.{0:D}"); }); } else if (command is FairlightMixerMasterPropertiesGetCommand master2Cmd) { state.Fairlight.ProgramOut.AudioFollowVideoCrossfadeTransitionEnabled = master2Cmd.AudioFollowVideoCrossfadeTransitionEnabled; result.SetSuccess($"Fairlight.ProgramOut"); } else if (command is FairlightMixerMasterLevelsCommand pgmLevelCmd) { FairlightAudioState.ProgramOutState pgmOutState = state.Fairlight.ProgramOut; pgmOutState.Levels = new FairlightAudioState.LevelsState { Levels = new[] { pgmLevelCmd.LeftLevel, pgmLevelCmd.RightLevel }, Peaks = new[] { pgmLevelCmd.LeftPeak, pgmLevelCmd.RightPeak }, DynamicsInputLevels = new[] { pgmLevelCmd.InputLeftLevel, pgmLevelCmd.InputRightLevel }, DynamicsInputPeaks = new[] { pgmLevelCmd.InputLeftPeak, pgmLevelCmd.InputRightPeak }, DynamicsOutputLevels = new[] { pgmLevelCmd.OutputLeftLevel, pgmLevelCmd.OutputRightLevel }, DynamicsOutputPeaks = new[] { pgmLevelCmd.OutputLeftPeak, pgmLevelCmd.OutputRightPeak }, CompressorGainReductionLevel = pgmLevelCmd.CompressorGainReduction, LimiterGainReductionLevel = pgmLevelCmd.LimiterGainReduction, }; result.SetSuccess($"Fairlight.ProgramOut.Levels"); } else if (command is FairlightMixerSourceLevelsCommand srcLevelCmd) { UpdaterUtil.TryForKey(result, state.Fairlight.Inputs, (long)srcLevelCmd.Index, inputState => { FairlightAudioState.InputSourceState srcState = inputState.Sources.FirstOrDefault(s => s.SourceId == srcLevelCmd.SourceId); if (srcState != null) { srcState.Levels = new FairlightAudioState.LevelsState { Levels = new[] { srcLevelCmd.LeftLevel, srcLevelCmd.RightLevel }, Peaks = new[] { srcLevelCmd.LeftPeak, srcLevelCmd.RightPeak }, DynamicsInputLevels = new[] { srcLevelCmd.InputLeftLevel, srcLevelCmd.InputRightLevel }, DynamicsInputPeaks = new[] { srcLevelCmd.InputLeftPeak, srcLevelCmd.InputRightPeak }, DynamicsOutputLevels = new[] { srcLevelCmd.OutputLeftLevel, srcLevelCmd.OutputRightLevel }, DynamicsOutputPeaks = new[] { srcLevelCmd.OutputLeftPeak, srcLevelCmd.OutputRightPeak }, CompressorGainReductionLevel = srcLevelCmd.CompressorGainReduction, LimiterGainReductionLevel = srcLevelCmd.LimiterGainReduction, ExpanderGainReductionLevel = srcLevelCmd.ExpanderGainReduction, }; result.SetSuccess($"Fairlight.Inputs.{srcLevelCmd.Index:D}.Sources.{srcLevelCmd.SourceId:D}.Levels"); } }); } else if (command is FairlightMixerTallyCommand tallyCmd) { state.Fairlight.Tally = tallyCmd.Tally; result.SetSuccess("Fairlight.Tally"); } else if (command is FairlightMixerSourceEqualizerBandGetCommand srcBandCmd) { UpdaterUtil.TryForKey(result, state.Fairlight.Inputs, (long)srcBandCmd.Index, inputState => { FairlightAudioState.InputSourceState srcState = inputState.Sources.FirstOrDefault(s => s.SourceId == srcBandCmd.SourceId); if (srcState != null) { UpdaterUtil.TryForIndex(result, srcState.Equalizer.Bands, (int)srcBandCmd.Band, band => { UpdaterUtil.CopyAllProperties(srcBandCmd, band, new[] { "Index", "SourceId", "Band" }); result.SetSuccess($"Fairlight.Inputs.{srcBandCmd.Index:D}.Sources.{srcBandCmd.SourceId:D}.Equalizer.Bands.{srcBandCmd.Band:D}"); }); } }); } else if (command is FairlightMixerMasterEqualizerBandGetCommand pgmBandCmd) { UpdaterUtil.TryForIndex(result, state.Fairlight.ProgramOut.Equalizer.Bands, (int)pgmBandCmd.Band, band => { UpdaterUtil.CopyAllProperties(pgmBandCmd, band, new[] { "Band" }); result.SetSuccess($"Fairlight.ProgramOut.Equalizer.Bands.{pgmBandCmd.Band:D}"); }); } } }