public void TestDynamicsLevelsAndPeaks()
        {
            AtemMockServerWrapper.Each(_output, _pool, null, DeviceTestCases.FairlightMain, helper =>
            {
                IBMDSwitcherFairlightAudioMixer mixer = GetFairlightMixer(helper);

                var cb       = new DynamicsLevelCallback();
                var dynamics = AtemSDKConverter.CastSdk <IBMDSwitcherFairlightAudioDynamicsProcessor>(mixer.GetMasterOutEffect);
                using (new UseCallback <DynamicsLevelCallback>(cb, dynamics.AddCallback, dynamics.RemoveCallback))
                {
                    for (int i = 0; i < 5; i++)
                    {
                        cb.Reset();

                        AtemState expectedState = helper.Helper.BuildLibState();
                        FairlightAudioState.ProgramOutState pgmOutState = expectedState.Fairlight.ProgramOut;

                        var testCmd = new FairlightMixerMasterLevelsCommand
                        {
                            InputLeftLevel   = Randomiser.Range(-100, 0),
                            InputRightLevel  = Randomiser.Range(-100, 0),
                            InputLeftPeak    = Randomiser.Range(-100, 0),
                            InputRightPeak   = Randomiser.Range(-100, 0),
                            OutputLeftLevel  = Randomiser.Range(-100, 0),
                            OutputRightLevel = Randomiser.Range(-100, 0),
                            OutputLeftPeak   = Randomiser.Range(-100, 0),
                            OutputRightPeak  = Randomiser.Range(-100, 0),
                        };

                        expectedState.Fairlight.ProgramOut.Levels = new FairlightAudioState.LevelsState
                        {
                            Levels = new double[2],
                            Peaks  = new double[2],
                            DynamicsInputLevels  = new[] { testCmd.InputLeftLevel, testCmd.InputRightLevel },
                            DynamicsInputPeaks   = new[] { testCmd.InputLeftPeak, testCmd.InputRightPeak },
                            DynamicsOutputLevels = new[] { testCmd.OutputLeftLevel, testCmd.OutputRightLevel },
                            DynamicsOutputPeaks  = new[] { testCmd.OutputLeftPeak, testCmd.OutputRightPeak },
                        };

                        helper.SendAndWaitForChange(expectedState, () =>
                        {
                            helper.Server.SendCommands(testCmd);
                        }, -1, (sdkState, libState) =>
                        {
                            sdkState.Fairlight.ProgramOut.Levels = new FairlightAudioState.LevelsState
                            {
                                Levels = new double[2],
                                Peaks  = new double[2],
                                DynamicsInputLevels  = cb.InputLevels,
                                DynamicsInputPeaks   = cb.InputPeaks,
                                DynamicsOutputLevels = cb.OutputLevels,
                                DynamicsOutputPeaks  = cb.OutputPeaks,
                            };
                        });
                    }
                }
            });
        }
        public void TestDynamicsGainReduction()
        {
            AtemMockServerWrapper.Each(_output, _pool, null, DeviceTestCases.FairlightMain, helper =>
            {
                IBMDSwitcherFairlightAudioMixer mixer = GetFairlightMixer(helper);

                var cbCompressor = new DynamicEffectsLevelCallback();
                var cbLimiter    = new DynamicEffectsLevelCallback();
                var dynamics     = AtemSDKConverter.CastSdk <IBMDSwitcherFairlightAudioDynamicsProcessor>(mixer.GetMasterOutEffect);
                var limiter      = AtemSDKConverter.CastSdk <IBMDSwitcherFairlightAudioLimiter>(dynamics.GetProcessor);
                var compressor   = AtemSDKConverter.CastSdk <IBMDSwitcherFairlightAudioCompressor>(dynamics.GetProcessor);

                using (new UseCallback <DynamicEffectsLevelCallback>(cbCompressor, compressor.AddCallback, compressor.RemoveCallback))
                    using (new UseCallback <DynamicEffectsLevelCallback>(cbLimiter, limiter.AddCallback, limiter.RemoveCallback))
                    {
                        for (int i = 0; i < 5; i++)
                        {
                            cbCompressor.Reset();
                            cbLimiter.Reset();

                            AtemState expectedState = helper.Helper.BuildLibState();

                            var testCmd = new FairlightMixerMasterLevelsCommand
                            {
                                CompressorGainReduction = Randomiser.Range(-100, 0),
                                LimiterGainReduction    = Randomiser.Range(-100, 0)
                            };

                            expectedState.Fairlight.ProgramOut.Levels = new FairlightAudioState.LevelsState
                            {
                                Levels = new double[2],
                                Peaks  = new double[2],
                                DynamicsInputLevels          = new double[2],
                                DynamicsInputPeaks           = new double[2],
                                DynamicsOutputLevels         = new double[2],
                                DynamicsOutputPeaks          = new double[2],
                                CompressorGainReductionLevel = testCmd.CompressorGainReduction,
                                LimiterGainReductionLevel    = testCmd.LimiterGainReduction
                            };

                            helper.SendAndWaitForChange(expectedState, () =>
                            {
                                helper.Server.SendCommands(testCmd);
                            }, -1, (sdkState, libState) =>
                            {
                                sdkState.Fairlight.ProgramOut.Levels = new FairlightAudioState.LevelsState
                                {
                                    Levels = new double[2],
                                    Peaks  = new double[2],
                                    DynamicsInputLevels          = new double[2],
                                    DynamicsInputPeaks           = new double[2],
                                    DynamicsOutputLevels         = new double[2],
                                    DynamicsOutputPeaks          = new double[2],
                                    CompressorGainReductionLevel = cbCompressor.GainReduction.Single(),
                                    LimiterGainReductionLevel    = cbLimiter.GainReduction.Single()
                                };
                            });
                        }
                    }
            });
        }