OK, the topic is extensive and a finished solution cannot be obtained without your own initiative. Furthermore, I have to do this in many individual steps to understand it. My idea:
Use JetBrains-DotPeek to determine the source code of SharpTV.dll. The result looks good.
Then transfer this text to Visual Studio and compile it with the DLL plugin. That doesn’t work.
Although the source code must work and is comparable to all other source codes and other SDR TV programs, errors are always displayed…
// Decompiled with JetBrains decompiler
// Type: SDRSharp.TV.TVPanel
// Assembly: SDRSharp.TV, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: B61910CA-9F13-447D-A855-75D6C2A7C66F
// Assembly location: C:\sdrsharp-x86(2)\SDRSharp.TV.dll
using SDRSharp.Common;
using SDRSharp.Radio;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Threading;
using System.Windows.Forms
#nullable disable
namespace SDRSharp.TV;
public class TVPanel : UserControl
{
private IFProcessor _ifProcessor;
private ISharpControl _control;
private int _decimationRatio;
private bool _filterEnabled;
private DownConverter _complexDDC;
private UnsafeBuffer _tvBuffer;
private unsafe Complex* _tvBufferPtr;
private UnsafeBuffer _normalizedVideo;
private unsafe float* _normalizedVideoPtr;
private UnsafeBuffer _grayScaleBuffer;
private unsafe byte* _grayScaleBufferPtr;
private UnsafeBuffer _videoWindowBuffer;
private unsafe byte* _videoWindowBufferPtr;
private int _iqBufferMaxLength;
private int _partsBuffersLength;
private int _count;
private bool _isDecoding;
private int _pictureWidth;
private double _horizontalStep;
private int _pictureHeight;
private float _countryCoeff;
private int _lineInFrame;
private float _maxSignalLevel;
private float _blackLevel;
private float _bright;
private float _contrast;
private float _coeff;
private double _sampleRate;
private VideoWindow _videoWindow;
private int _lengthOfGrayScaleArray;
private ComplexFifoStream _iqBuffer;
private float _average;
private Thread _tvThread;
private readonly SharpEvent _bufferEvent = new SharpEvent(false);
private float _lastImag;
private float _lastReal;
private bool _modulationAM;
private bool _pause;
private bool _frameReady;
private byte _lastFilter;
private bool _videoFilter;
private float _ratio = 1E-05f;
private int[] _horizontalSyncArray;
private int[] _verticalSyncArray;
private float _horizontalCorrectAverage;
private int _verticalCorrectAverage;
private bool _sync;
private bool _swapIQ;
private int _positionX;
private int _positionY;
private double _indexSource;
private int _prevHorizontalIndex;
private bool _needClose;
private IContainer components;
private System.Windows.Forms.Timer displayUpdateTimer;
private CheckBox enableCheckBox;
private Label countLabel;
private TrackBar brightnesTrackBar;
private TrackBar contrastTrackBar;
private Label label1;
private Label label2;
private CheckBox pauseCheckBox;
private CheckBox videoFilterCheckBox;
private CheckBox syncOffCheckBox;
private ComboBox palNTSCComboBox;
private ComboBox AmFmComboBox;
public TVPanel(ISharpControl control)
{
this.InitializeComponent();
VideoWindow videoWindow = new VideoWindow();
videoWindow.Visible = false;
videoWindow.TopMost = true;
this._videoWindow = videoWindow;
this._videoWindow.FormClosing += new FormClosingEventHandler(this._videoWindow_FormClosing);
this._control = control;
this._ifProcessor = new IFProcessor();
this._control.PropertyChanged += new PropertyChangedEventHandler(this.NotifyPropertyChangedHandler);
this._control.RegisterStreamHook((object) this._ifProcessor, (ProcessorType) 0);
this._ifProcessor.Enabled = false;
this._ifProcessor.IQReady += new IFProcessor.IQReadyDelegate(this.BufferAvailable);
this.brightnesTrackBar.Value = Utils.GetIntSetting(“TV.Bright”, 50);
this.brightnesTrackBar_Scroll((object) null, (EventArgs) null);
this.contrastTrackBar.Value = Utils.GetIntSetting(“TV.Contrast”, 50);
this.contrastTrackBar_Scroll((object) null, (EventArgs) null);
this.AmFmComboBox.SelectedIndex = Utils.GetIntSetting(“TV.Modulation”, 0);
this.AmFmComboBox_SelectedIndexChanged((object) null, (EventArgs) null);
this.videoFilterCheckBox.Checked = Utils.GetBooleanSetting(“TV.VideoFilter”);
this.palNTSCComboBox.SelectedIndex = Utils.GetIntSetting(“TV.Pal_NTSC”, 0);
this.syncOffCheckBox.Checked = Utils.GetBooleanSetting(“TV.ManualSync”);
this.syncOffCheckBox_CheckedChanged((object) null, (EventArgs) null);
}
private void _videoWindow_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this._needClose = true;
}
public void StoreSettings()
{
if (this._isDecoding)
this.StopDecoding();
Utils.SaveSetting(“TV.Bright”, (object) this.brightnesTrackBar.Value);
Utils.SaveSetting(“TV.Contrast”, (object) this.contrastTrackBar.Value);
Utils.SaveSetting(“TV.Modulation”, (object) this.AmFmComboBox.SelectedIndex);
Utils.SaveSetting(“TV.VideoFilter”, (object) this.videoFilterCheckBox.Checked);
Utils.SaveSetting(“TV.Pal_NTSC”, (object) this.palNTSCComboBox.SelectedIndex);
Utils.SaveSetting(“TV.ManualSync”, (object) this.syncOffCheckBox.Checked);
}
private void NotifyPropertyChangedHandler(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case “StartRadio”:
this.enableCheckBox_CheckedChanged((object) null, (EventArgs) null);
break;
case “StopRadio”:
if (!this._isDecoding)
break;
this.StopDecoding();
break;
case “SwapIq”:
this._swapIQ = this._control.SwapIq;
break;
case “CenterFrequency”:
this._horizontalCorrectAverage = 0.0f;
this._verticalCorrectAverage = 0;
break;
}
}
private void StartDecoding()
{
this._sampleRate = this._ifProcessor.SampleRate;
this.palNTSCComboBox.Enabled = false;
if (this.palNTSCComboBox.SelectedIndex == 0)
{
this._countryCoeff = 15625f;
this._lineInFrame = 625;
}
else
{
this._countryCoeff = 15734.25f;
this._lineInFrame = 525;
}
this._pictureHeight = this._lineInFrame;
this._pictureWidth = 400;
this._horizontalStep = this._sampleRate / ((double) this._countryCoeff * (double) this._pictureWidth);
if (this._sampleRate >= 8000000.0)
{
this._decimationRatio = 2;
this._complexDDC = new DownConverter(this._sampleRate, this._decimationRatio);
this._horizontalStep /= (double) this._decimationRatio;
int num = -1;
if (this._swapIQ)
num = 1;
this._complexDDC.Frequency = this.palNTSCComboBox.SelectedIndex != 0 ? this._sampleRate * 0.20000000298023224 * (double) num : this._sampleRate * 0.30000001192092896 * (double) num;
this._filterEnabled = true;
}
else
{
this._decimationRatio = 1;
this._filterEnabled = false;
}
this._lengthOfGrayScaleArray = this._pictureHeight * this._pictureWidth;
this._horizontalSyncArray = new int[this._pictureWidth];
this._verticalSyncArray = new int[this._pictureHeight];
this._horizontalCorrectAverage = 0.0f;
this._verticalCorrectAverage = 0;
this.CreateBuffers();
this._videoWindow.Visible = true;
this._ifProcessor.Enabled = true;
this._isDecoding = true;
this._count = 0;
this._tvThread = new Thread(new ThreadStart(this.TVProcess))
{
Name = “TV Process”,
Priority = ThreadPriority.Highest
};
this._tvThread.Start();
}
private void StopDecoding()
{
this._isDecoding = false;
this._bufferEvent.Set();
if (this._tvThread != null)
{
this._tvThread.Join();
this._tvThread = (Thread) null;
}
this._videoWindow.Visible = false;
this._ifProcessor.Enabled = false;
this.palNTSCComboBox.Enabled = true;
this.CloseBuffers();
}
private unsafe void TVProcess()
{
while (this._isDecoding)
{
if (this._iqBuffer.Length < this._partsBuffersLength && this._isDecoding)
{
Thread.Sleep(10);
}
else
{
this._iqBuffer.Read(this._tvBufferPtr, this._tvBuffer.Length);
if (this._filterEnabled)
this._complexDDC.Process(this._tvBufferPtr, this._tvBuffer.Length);
this._maxSignalLevel = (float) ((double) this._maxSignalLevel * 0.99000000953674316 + (!this._modulationAM ? (double) this.FmDetector(this._tvBufferPtr, this._normalizedVideoPtr, this._partsBuffersLength) : (double) this.AmDetector(this._tvBufferPtr, this._normalizedVideoPtr, this._partsBuffersLength)) * 0.0099999997764825821);
this._blackLevel = this._maxSignalLevel * 0.7f;
this._coeff = 1f / this._blackLevel;
this.VideoBufferProcess(this._normalizedVideoPtr, this._grayScaleBufferPtr, this._partsBuffersLength);
}
}
}
private unsafe void SwapIQ(Complex* buffer, int length)
{
for (int index = 0; index < length; ++index)
{
float real = buffer[index].Real;
buffer[index].Real = buffer[index].Imag;
buffer[index].Imag = real;
}
}
private unsafe void VideoFilter(byte* buffer, int length)
{
for (int index = 0; index < length; ++index)
{
buffer[index] = (byte) ((double) ((int) buffer[index] + (int) this._lastFilter) * 0.5);
this._lastFilter = buffer[index];
}
}
private unsafe float AmDetector(Complex* iqBuffer, float* videoBuffer, int length)
{
float num1 = float.MinValue;
for (int index = 0; index < length; ++index)
{
float num2 = ((Complex) (IntPtr) (iqBuffer + index)).Modulus();
videoBuffer[index] = num2;
num1 = (double) num2 > (double) num1 ? num2 : num1;
}
return num1;
}
private unsafe float FmDetector(Complex* iqBuffer, float* videoBuffer, int length)
{
float num1 = float.MinValue;
for (int index = 0; index < length; ++index)
{
float real = iqBuffer[index].Real;
float imag = iqBuffer[index].Imag;
float num2 = (float) ((double) this._lastReal * (double) imag - (double) this._lastImag * (double) real / ((double) real * (double) real + (double) imag * (double) imag));
this._lastReal = real;
this._lastImag = imag;
videoBuffer[index] = num2;
num1 = (double) num2 > (double) num1 ? num2 : num1;
}
return num1;
}
private unsafe void VideoBufferProcess(float* buffer, byte* grayBuffer, int length)
{
bool flag1 = false;
while (!flag1)
{
bool flag2 = false;
this._indexSource += this._horizontalStep + (double) this._horizontalCorrectAverage;
if (this._verticalCorrectAverage != 0)
{
this._indexSource += (this._horizontalStep + (double) this._horizontalCorrectAverage) * (double) this._pictureWidth * (double) this._verticalCorrectAverage;
this._verticalCorrectAverage = 0;
}
if (this._indexSource > (double) length)
{
this._indexSource -= (double) length;
break;
}
if (this._indexSource < 0.0)
{
this._indexSource += (double) length;
break;
}
float num1 = buffer[(int) this._indexSource];
if ((double) num1 > (double) this._blackLevel)
{
++this._horizontalSyncArray[this._positionX];
++this._verticalSyncArray[this._positionY];
}
this._average += this._ratio * (num1 - this._average);
float num2 = this._bright - (num1 - this._average) * this._contrast * this._coeff;
if ((double) num2 > (double) byte.MaxValue)
num2 = (float) byte.MaxValue;
if ((double) num2 < 0.0)
num2 = 0.0f;
int index = this._positionX + this._positionY * this._pictureWidth;
grayBuffer[index] = (byte) num2;
++this._positionX;
if (this._positionX >= this._pictureWidth)
{
this._positionY += 2;
this._positionX = 0;
}
if (this._positionY >= this._pictureHeight)
{
this._positionY &= 1;
this._positionY ^= 1;
flag2 = true;
}
if (flag2)
{
if (this._videoFilter)
this.VideoFilter(grayBuffer, this._lengthOfGrayScaleArray);
if (this._sync)
this.FrameSync();
Utils.Memcpy((void*) this._videoWindowBufferPtr, (void*) grayBuffer, this._lengthOfGrayScaleArray);
this._frameReady = true;
}
}
}
private void FrameSync()
{
int num1 = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
for (int index = 0; index < this._horizontalSyncArray.Length; ++index)
{
if (this._horizontalSyncArray[index] > num1)
{
num2 = index;
num1 = this._horizontalSyncArray[index];
}
this._horizontalSyncArray[index] = 0;
}
for (int index = 0; index < this._verticalSyncArray.Length; ++index)
{
if (this._verticalSyncArray[index] > num3)
{
num4 = index;
num3 = this._verticalSyncArray[index];
}
this._verticalSyncArray[index] = 0;
}
int num5 = this._pictureWidth / 2;
int num6 = this._pictureHeight / 2;
int num7 = num2 + num5 - (this._prevHorizontalIndex + num5);
if (num7 > num5)
num7 -= this._pictureWidth;
if (num7 < -num5)
num7 += this._pictureWidth;
int num8 = num2;
if (num8 > num5)
num8 -= this._pictureWidth;
this._horizontalCorrectAverage += (float) ((double) num7 * 9.9999999747524271E-07 + (double) num8 * 9.99999993922529E-09);
if ((double) this._horizontalCorrectAverage > 0.0099999997764825821)
this._horizontalCorrectAverage = 0.01f;
if ((double) this._horizontalCorrectAverage < -0.0099999997764825821)
this._horizontalCorrectAverage = -0.01f;
this._prevHorizontalIndex = num2;
int num9 = num4;
if (num9 > num6)
num9 -= this._pictureHeight;
this._verticalCorrectAverage = (int) ((double) num9 * 0.10000000149011612);
if (this._verticalCorrectAverage > 2)
this._verticalCorrectAverage = 2;
if (this._verticalCorrectAverage >= -2)
return;
this._verticalCorrectAverage = -2;
}
private unsafe void DisplayUpdateTimer_Tick(object sender, EventArgs e)
{
if (!this._isDecoding && !this._frameReady)
return;
this.countLabel.Text = $“Lost buffers {this._count:N0}”;
this._frameReady = false;
this._videoWindow.DrawFrame(this._videoWindowBufferPtr, this._pictureWidth, this._pictureHeight);
if (!this._needClose)
return;
this._needClose = false;
this.enableCheckBox.Checked = false;
}
private unsafe void BufferAvailable(Complex* buffer, int length)
{
if (length == 0 || this._pause)
return;
if (this._iqBuffer.Length + length <= this._iqBufferMaxLength)
this._iqBuffer.Write(buffer, length);
else
++this._count;
this._bufferEvent.Set();
}
private unsafe void CreateBuffers()
{
this._iqBufferMaxLength = (int) this._sampleRate;
this._partsBuffersLength = 65536 /*0x010000*/ / this._decimationRatio;
this._iqBuffer = new ComplexFifoStream((BlockMode) 0, this._iqBufferMaxLength);
this._tvBuffer = UnsafeBuffer.Create(this._partsBuffersLength * this._decimationRatio, sizeof (Complex));
this._tvBufferPtr = (Complex*) UnsafeBuffer.op_Implicit(this._tvBuffer);
this._normalizedVideo = UnsafeBuffer.Create(this._partsBuffersLength, 4);
this._normalizedVideoPtr = (float*) UnsafeBuffer.op_Implicit(this._normalizedVideo);
this._grayScaleBuffer = UnsafeBuffer.Create(this._lengthOfGrayScaleArray, 1);
this._grayScaleBufferPtr = (byte*) UnsafeBuffer.op_Implicit(this._grayScaleBuffer);
this._videoWindowBuffer = UnsafeBuffer.Create(this._lengthOfGrayScaleArray, 1);
this._videoWindowBufferPtr = (byte*) UnsafeBuffer.op_Implicit(this._videoWindowBuffer);
}
private unsafe void CloseBuffers()
{
this._iqBuffer.Close();
this._iqBuffer.Dispose();
this._iqBuffer = (ComplexFifoStream) null;
this._tvBuffer.Dispose();
this._tvBufferPtr = (Complex*) null;
this._normalizedVideo.Dispose();
this._normalizedVideoPtr = (float*) null;
this._grayScaleBuffer.Dispose();
this._grayScaleBufferPtr = (byte*) null;
this._videoWindowBuffer.Dispose();
this._videoWindowBufferPtr = (byte*) null;
}
private void enableCheckBox_CheckedChanged(object sender, EventArgs e)
{
if (this.enableCheckBox.Checked && !this._isDecoding)
{
this.StartDecoding();
}
else
{
if (this.enableCheckBox.Checked || !this._isDecoding)
return;
this.StopDecoding();
}
}
private void brightnesTrackBar_Scroll(object sender, EventArgs e)
{
this._bright = (float) ((this.brightnesTrackBar.Value - 50) * 10);
}
private void contrastTrackBar_Scroll(object sender, EventArgs e)
{
this._contrast = (float) (this.contrastTrackBar.Value * 10 + 100);
}
private void pauseCheckBox_CheckedChanged(object sender, EventArgs e)
{
this._pause = this.pauseCheckBox.Checked;
}
private void videoFilterCheckBox_CheckedChanged(object sender, EventArgs e)
{
this._videoFilter = this.videoFilterCheckBox.Checked;
}
private void syncOffCheckBox_CheckedChanged(object sender, EventArgs e)
{
this._sync = !this.syncOffCheckBox.Checked;
}
private void AmFmComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
this._modulationAM = this.AmFmComboBox.SelectedIndex == 0;
}
protected override void Dispose(bool disposing)
{
if (disposing && this.components != null)
this.components.Dispose();
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.components = (IContainer) new System.ComponentModel.Container();
this.displayUpdateTimer = new System.Windows.Forms.Timer(this.components);
this.enableCheckBox = new CheckBox();
this.countLabel = new Label();
this.brightnesTrackBar = new TrackBar();
this.contrastTrackBar = new TrackBar();
this.label1 = new Label();
this.label2 = new Label();
this.pauseCheckBox = new CheckBox();
this.videoFilterCheckBox = new CheckBox();
this.syncOffCheckBox = new CheckBox();
this.palNTSCComboBox = new ComboBox();
this.AmFmComboBox = new ComboBox();
this.brightnesTrackBar.BeginInit();
this.contrastTrackBar.BeginInit();
this.SuspendLayout();
this.displayUpdateTimer.Enabled = true;
this.displayUpdateTimer.Interval = 10;
this.displayUpdateTimer.Tick += new EventHandler(this.DisplayUpdateTimer_Tick);
this.enableCheckBox.AutoSize = true;
this.enableCheckBox.Location = new Point(3, 3);
this.enableCheckBox.Name = “enableCheckBox”;
this.enableCheckBox.Size = new Size(40, 17);
this.enableCheckBox.TabIndex = 0;
this.enableCheckBox.Text = “TV”;
this.enableCheckBox.UseVisualStyleBackColor = true;
this.enableCheckBox.CheckedChanged += new EventHandler(this.enableCheckBox_CheckedChanged);
this.countLabel.AutoSize = true;
this.countLabel.Location = new Point(0, 154);
this.countLabel.Name = “countLabel”;
this.countLabel.Size = new Size(70, 13);
this.countLabel.TabIndex = 1;
this.countLabel.Text = “Lost frames 0”;
this.brightnesTrackBar.AutoSize = false;
this.brightnesTrackBar.Location = new Point(102, 3);
this.brightnesTrackBar.Maximum = 100;
this.brightnesTrackBar.Name = “brightnesTrackBar”;
this.brightnesTrackBar.Orientation = Orientation.Vertical;
this.brightnesTrackBar.Size = new Size(41, 148);
this.brightnesTrackBar.TabIndex = 4;
this.brightnesTrackBar.TickFrequency = 10;
this.brightnesTrackBar.TickStyle = TickStyle.Both;
this.brightnesTrackBar.Value = 50;
this.brightnesTrackBar.Scroll += new EventHandler(this.brightnesTrackBar_Scroll);
this.contrastTrackBar.AutoSize = false;
this.contrastTrackBar.Location = new Point(162, 3);
this.contrastTrackBar.Maximum = 100;
this.contrastTrackBar.Name = “contrastTrackBar”;
this.contrastTrackBar.Orientation = Orientation.Vertical;
this.contrastTrackBar.Size = new Size(43, 148);
this.contrastTrackBar.TabIndex = 5;
this.contrastTrackBar.TickFrequency = 10;
this.contrastTrackBar.TickStyle = TickStyle.Both;
this.contrastTrackBar.Value = 50;
this.contrastTrackBar.Scroll += new EventHandler(this.contrastTrackBar_Scroll);
this.label1.AutoSize = true;
this.label1.Location = new Point(99, 154);
this.label1.Name = “label1”;
this.label1.Size = new Size(51, 13);
this.label1.TabIndex = 6;
this.label1.Text = “Brightnes”;
this.label2.AutoSize = true;
this.label2.Location = new Point(159, 154);
this.label2.Name = “label2”;
this.label2.Size = new Size(46, 13);
this.label2.TabIndex = 7;
this.label2.Text = “Contrast”;
this.pauseCheckBox.AutoSize = true;
this.pauseCheckBox.Location = new Point(3, 49);
this.pauseCheckBox.Name = “pauseCheckBox”;
this.pauseCheckBox.Size = new Size(56, 17);
this.pauseCheckBox.TabIndex = 8;
this.pauseCheckBox.Text = “Pause”;
this.pauseCheckBox.UseVisualStyleBackColor = true;
this.pauseCheckBox.CheckedChanged += new EventHandler(this.pauseCheckBox_CheckedChanged);
this.videoFilterCheckBox.AutoSize = true;
this.videoFilterCheckBox.Location = new Point(3, 26);
this.videoFilterCheckBox.Name = “videoFilterCheckBox”;
this.videoFilterCheckBox.Size = new Size(75, 17);
this.videoFilterCheckBox.TabIndex = 15;
this.videoFilterCheckBox.Text = “Video filter”;
this.videoFilterCheckBox.UseVisualStyleBackColor = true;
this.videoFilterCheckBox.CheckedChanged += new EventHandler(this.videoFilterCheckBox_CheckedChanged);
this.syncOffCheckBox.AutoSize = true;
this.syncOffCheckBox.Location = new Point(3, 72);
this.syncOffCheckBox.Name = “syncOffCheckBox”;
this.syncOffCheckBox.Size = new Size(65, 17);
this.syncOffCheckBox.TabIndex = 20;
this.syncOffCheckBox.Text = “Sync off”;
this.syncOffCheckBox.UseVisualStyleBackColor = true;
this.syncOffCheckBox.CheckedChanged += new EventHandler(this.syncOffCheckBox_CheckedChanged);
this.palNTSCComboBox.FormattingEnabled = true;
this.palNTSCComboBox.Items.AddRange(new object[2]
{
(object) “PAL/Secam”,
(object) “NTSC”
});
this.palNTSCComboBox.Location = new Point(0, 95);
this.palNTSCComboBox.Name = “palNTSCComboBox”;
this.palNTSCComboBox.Size = new Size(78, 21);
this.palNTSCComboBox.TabIndex = 21;
this.AmFmComboBox.FormattingEnabled = true;
this.AmFmComboBox.Items.AddRange(new object[2]
{
(object) “AM”,
(object) “FM”
});
this.AmFmComboBox.Location = new Point(0, 122);
this.AmFmComboBox.Name = “AmFmComboBox”;
this.AmFmComboBox.Size = new Size(78, 21);
this.AmFmComboBox.TabIndex = 22;
this.AmFmComboBox.SelectedIndexChanged += new EventHandler(this.AmFmComboBox_SelectedIndexChanged);
this.AutoScaleDimensions = new SizeF(6f, 13f);
this.AutoScaleMode = AutoScaleMode.Font;
this.Controls.Add((Control) this.AmFmComboBox);
this.Controls.Add((Control) this.palNTSCComboBox);
this.Controls.Add((Control) this.syncOffCheckBox);
this.Controls.Add((Control) this.videoFilterCheckBox);
this.Controls.Add((Control) this.pauseCheckBox);
this.Controls.Add((Control) this.label2);
this.Controls.Add((Control) this.label1);
this.Controls.Add((Control) this.contrastTrackBar);
this.Controls.Add((Control) this.brightnesTrackBar);
this.Controls.Add((Control) this.countLabel);
this.Controls.Add((Control) this.enableCheckBox);
this.Name = nameof (TVPanel);
this.Size = new Size(217, 193);
this.brightnesTrackBar.EndInit();
this.contrastTrackBar.EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
}
…but if SDRSharp, System, Private and #nullable, among others, are already displayed as errors, then it can’t work…but why? who can say anything about that?
Maybe mentioned again in passing, if the Tempest functions are integrated and then work via the Airspy server, we all benefit from it.
gruß Micha