mirror of
https://github.com/adrigongv23/G26---Telemetry-Software.git
synced 2026-08-25 11:33:17 +02:00
Radio subida
This commit is contained in:
parent
5f81e54793
commit
f0db3a8aeb
147 changed files with 11343 additions and 0 deletions
BIN
Radio/App_radio/.vs/App_radio.slnx/DesignTimeBuild/.dtbcache.v2
Normal file
BIN
Radio/App_radio/.vs/App_radio.slnx/DesignTimeBuild/.dtbcache.v2
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Radio/App_radio/.vs/App_radio.slnx/v18/.futdcache.v2
Normal file
BIN
Radio/App_radio/.vs/App_radio.slnx/v18/.futdcache.v2
Normal file
Binary file not shown.
BIN
Radio/App_radio/.vs/App_radio.slnx/v18/.suo
Normal file
BIN
Radio/App_radio/.vs/App_radio.slnx/v18/.suo
Normal file
Binary file not shown.
|
|
@ -0,0 +1,85 @@
|
||||||
|
{
|
||||||
|
"Version": 1,
|
||||||
|
"WorkspaceRootPath": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\",
|
||||||
|
"Documents": [
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|c:\\users\\alvar\\desktop\\barcelona_software\\aaradio_bluetooth\\app_radio\\audioengine.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|solutionrelative:audioengine.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|c:\\users\\alvar\\desktop\\barcelona_software\\aaradio_bluetooth\\app_radio\\radioserialservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|solutionrelative:radioserialservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|c:\\users\\alvar\\desktop\\barcelona_software\\aaradio_bluetooth\\app_radio\\radiocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|solutionrelative:radiocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|c:\\users\\alvar\\desktop\\barcelona_software\\aaradio_bluetooth\\app_radio\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"DocumentGroupContainers": [
|
||||||
|
{
|
||||||
|
"Orientation": 0,
|
||||||
|
"VerticalTabListWidth": 256,
|
||||||
|
"DocumentGroups": [
|
||||||
|
{
|
||||||
|
"DockedWidth": 200,
|
||||||
|
"SelectedChildIndex": 1,
|
||||||
|
"Children": [
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 1,
|
||||||
|
"Title": "RadioSerialService.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\RadioSerialService.cs",
|
||||||
|
"RelativeDocumentMoniker": "RadioSerialService.cs",
|
||||||
|
"ToolTip": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\RadioSerialService.cs",
|
||||||
|
"RelativeToolTip": "RadioSerialService.cs",
|
||||||
|
"ViewState": "AgIAAPIAAAAAAAAAAAAswAcBAAAJAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-07-23T17:01:10.725Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 0,
|
||||||
|
"Title": "AudioEngine.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\AudioEngine.cs",
|
||||||
|
"RelativeDocumentMoniker": "AudioEngine.cs",
|
||||||
|
"ToolTip": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\AudioEngine.cs",
|
||||||
|
"RelativeToolTip": "AudioEngine.cs",
|
||||||
|
"ViewState": "AgIAAE0AAAAAAAAAAAAgwGEAAAASAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-07-23T16:52:37.679Z",
|
||||||
|
"EditorCaption": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 3,
|
||||||
|
"Title": "Program.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\Program.cs",
|
||||||
|
"RelativeDocumentMoniker": "Program.cs",
|
||||||
|
"ToolTip": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\Program.cs",
|
||||||
|
"RelativeToolTip": "Program.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAFAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-07-23T16:51:47.037Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 2,
|
||||||
|
"Title": "RadioController.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\RadioController.cs",
|
||||||
|
"RelativeDocumentMoniker": "RadioController.cs",
|
||||||
|
"ToolTip": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\RadioController.cs",
|
||||||
|
"RelativeToolTip": "RadioController.cs",
|
||||||
|
"ViewState": "AgIAAPAAAAAAAAAAAAAawAIBAAAlAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-07-23T16:51:43.945Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
85
Radio/App_radio/.vs/App_radio.slnx/v18/DocumentLayout.json
Normal file
85
Radio/App_radio/.vs/App_radio.slnx/v18/DocumentLayout.json
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
{
|
||||||
|
"Version": 1,
|
||||||
|
"WorkspaceRootPath": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\",
|
||||||
|
"Documents": [
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|c:\\users\\alvar\\desktop\\barcelona_software\\aaradio_bluetooth\\app_radio\\audioengine.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|solutionrelative:audioengine.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|c:\\users\\alvar\\desktop\\barcelona_software\\aaradio_bluetooth\\app_radio\\radioserialservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|solutionrelative:radioserialservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|c:\\users\\alvar\\desktop\\barcelona_software\\aaradio_bluetooth\\app_radio\\radiocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|solutionrelative:radiocontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|c:\\users\\alvar\\desktop\\barcelona_software\\aaradio_bluetooth\\app_radio\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{7CFA4CBA-C3C7-53E8-BAB7-F6260C1F73C8}|App_radio.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"DocumentGroupContainers": [
|
||||||
|
{
|
||||||
|
"Orientation": 0,
|
||||||
|
"VerticalTabListWidth": 256,
|
||||||
|
"DocumentGroups": [
|
||||||
|
{
|
||||||
|
"DockedWidth": 200,
|
||||||
|
"SelectedChildIndex": 1,
|
||||||
|
"Children": [
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 1,
|
||||||
|
"Title": "RadioSerialService.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\RadioSerialService.cs",
|
||||||
|
"RelativeDocumentMoniker": "RadioSerialService.cs",
|
||||||
|
"ToolTip": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\RadioSerialService.cs",
|
||||||
|
"RelativeToolTip": "RadioSerialService.cs",
|
||||||
|
"ViewState": "AgIAAPIAAAAAAAAAAAAswAcBAAAJAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-07-23T17:01:10.725Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 0,
|
||||||
|
"Title": "AudioEngine.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\AudioEngine.cs",
|
||||||
|
"RelativeDocumentMoniker": "AudioEngine.cs",
|
||||||
|
"ToolTip": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\AudioEngine.cs",
|
||||||
|
"RelativeToolTip": "AudioEngine.cs",
|
||||||
|
"ViewState": "AgIAAE0AAAAAAAAAAAAgwGEAAAASAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-07-23T16:52:37.679Z",
|
||||||
|
"EditorCaption": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 3,
|
||||||
|
"Title": "Program.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\Program.cs",
|
||||||
|
"RelativeDocumentMoniker": "Program.cs",
|
||||||
|
"ToolTip": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\Program.cs",
|
||||||
|
"RelativeToolTip": "Program.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAFAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-07-23T16:51:47.037Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 2,
|
||||||
|
"Title": "RadioController.cs",
|
||||||
|
"DocumentMoniker": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\RadioController.cs",
|
||||||
|
"RelativeDocumentMoniker": "RadioController.cs",
|
||||||
|
"ToolTip": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\RadioController.cs",
|
||||||
|
"RelativeToolTip": "RadioController.cs",
|
||||||
|
"ViewState": "AgIAAPAAAAAAAAAAAAAawAIBAAAlAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-07-23T16:51:43.945Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
Radio/App_radio/.vs/ProjectEvaluation/app_radio.metadata.v10.bin
Normal file
BIN
Radio/App_radio/.vs/ProjectEvaluation/app_radio.metadata.v10.bin
Normal file
Binary file not shown.
BIN
Radio/App_radio/.vs/ProjectEvaluation/app_radio.projects.v10.bin
Normal file
BIN
Radio/App_radio/.vs/ProjectEvaluation/app_radio.projects.v10.bin
Normal file
Binary file not shown.
BIN
Radio/App_radio/.vs/ProjectEvaluation/app_radio.strings.v10.bin
Normal file
BIN
Radio/App_radio/.vs/ProjectEvaluation/app_radio.strings.v10.bin
Normal file
Binary file not shown.
18
Radio/App_radio/App_radio.csproj
Normal file
18
Radio/App_radio/App_radio.csproj
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>net10.0-windows</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<AssemblyName>App_radio</AssemblyName>
|
||||||
|
<RootNamespace>App_radio</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="NAudio" Version="2.3.0" />
|
||||||
|
<PackageReference Include="System.IO.Ports" Version="10.0.9" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
9
Radio/App_radio/App_radio.csproj.user
Normal file
9
Radio/App_radio/App_radio.csproj.user
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup />
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Update="RadioMain.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
3
Radio/App_radio/App_radio.slnx
Normal file
3
Radio/App_radio/App_radio.slnx
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<Solution>
|
||||||
|
<Project Path="App_radio.csproj" />
|
||||||
|
</Solution>
|
||||||
410
Radio/App_radio/AudioEngine.cs
Normal file
410
Radio/App_radio/AudioEngine.cs
Normal file
|
|
@ -0,0 +1,410 @@
|
||||||
|
using NAudio.Wave;
|
||||||
|
|
||||||
|
namespace App_radio;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Captura el micrófono del PC y reproduce el audio recibido por la radio.
|
||||||
|
/// Conserva el formato del programa C++ original: 8000 Hz, mono, PCM signed 8-bit por radio.
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class AudioEngine : IDisposable
|
||||||
|
{
|
||||||
|
private const int SampleRate = 8000;
|
||||||
|
private const int Channels = 1;
|
||||||
|
private const int MicrophoneFrameSamples = 1600;
|
||||||
|
|
||||||
|
private readonly object _stateLock = new();
|
||||||
|
private readonly object _captureLock = new();
|
||||||
|
private readonly MicrophoneFilter _microphoneFilter = new();
|
||||||
|
private readonly sbyte[] _microphoneFrame = new sbyte[MicrophoneFrameSamples];
|
||||||
|
|
||||||
|
private WaveInEvent? _capture;
|
||||||
|
private WaveOutEvent? _playback;
|
||||||
|
private BufferedWaveProvider? _playbackBuffer;
|
||||||
|
|
||||||
|
private int _microphoneFrameIndex;
|
||||||
|
private bool _started;
|
||||||
|
private bool _pttActive;
|
||||||
|
private float _microphoneGain = 1.0f;
|
||||||
|
private float _playbackGain = 1.0f;
|
||||||
|
|
||||||
|
public event EventHandler<sbyte[]>? MicrophoneFrameReady;
|
||||||
|
public event EventHandler<string>? Error;
|
||||||
|
|
||||||
|
public bool IsStarted
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
return _started;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool PttActive
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (_captureLock)
|
||||||
|
{
|
||||||
|
return _pttActive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Start()
|
||||||
|
{
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
if (_started)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var playbackBuffer = new BufferedWaveProvider(new WaveFormat(SampleRate, 16, Channels))
|
||||||
|
{
|
||||||
|
BufferDuration = TimeSpan.FromSeconds(2),
|
||||||
|
DiscardOnBufferOverflow = true,
|
||||||
|
ReadFully = true
|
||||||
|
};
|
||||||
|
|
||||||
|
var playback = new WaveOutEvent
|
||||||
|
{
|
||||||
|
DesiredLatency = 100,
|
||||||
|
NumberOfBuffers = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
var capture = new WaveInEvent
|
||||||
|
{
|
||||||
|
WaveFormat = new WaveFormat(SampleRate, 16, Channels),
|
||||||
|
BufferMilliseconds = 20,
|
||||||
|
NumberOfBuffers = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
capture.DataAvailable += Capture_DataAvailable;
|
||||||
|
capture.RecordingStopped += Capture_RecordingStopped;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
playback.Init(playbackBuffer);
|
||||||
|
playback.Play();
|
||||||
|
|
||||||
|
_playbackBuffer = playbackBuffer;
|
||||||
|
_playback = playback;
|
||||||
|
_capture = capture;
|
||||||
|
_started = true;
|
||||||
|
|
||||||
|
ResetMicrophoneState();
|
||||||
|
//capture.StartRecording();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
capture.DataAvailable -= Capture_DataAvailable;
|
||||||
|
capture.RecordingStopped -= Capture_RecordingStopped;
|
||||||
|
capture.Dispose();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
playback.Stop();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// No hay nada más que limpiar si el dispositivo no llegó a arrancar.
|
||||||
|
}
|
||||||
|
|
||||||
|
playback.Dispose();
|
||||||
|
_playbackBuffer = null;
|
||||||
|
_playback = null;
|
||||||
|
_capture = null;
|
||||||
|
_started = false;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Stop()
|
||||||
|
{
|
||||||
|
WaveInEvent? capture;
|
||||||
|
WaveOutEvent? playback;
|
||||||
|
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
if (!_started && _capture is null && _playback is null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_started = false;
|
||||||
|
capture = _capture;
|
||||||
|
playback = _playback;
|
||||||
|
_capture = null;
|
||||||
|
_playback = null;
|
||||||
|
_playbackBuffer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetPtt(false);
|
||||||
|
|
||||||
|
if (capture is not null)
|
||||||
|
{
|
||||||
|
capture.DataAvailable -= Capture_DataAvailable;
|
||||||
|
capture.RecordingStopped -= Capture_RecordingStopped;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
capture.StopRecording();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// El dispositivo puede estar ya detenido si se desconectó físicamente.
|
||||||
|
}
|
||||||
|
|
||||||
|
capture.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (playback is not null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
playback.Stop();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// El dispositivo puede estar ya detenido si se desconectó físicamente.
|
||||||
|
}
|
||||||
|
|
||||||
|
playback.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
ResetMicrophoneState();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetPtt(bool active)
|
||||||
|
{
|
||||||
|
lock (_captureLock)
|
||||||
|
{
|
||||||
|
if (_pttActive == active)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_pttActive = active;
|
||||||
|
_microphoneFrameIndex = 0;
|
||||||
|
_microphoneFilter.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// No se vacia ni se detiene la reproduccion al cambiar el PTT.
|
||||||
|
// Captura y salida permanecen activas de forma simultanea.
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetMicrophoneGain(float gain)
|
||||||
|
{
|
||||||
|
lock (_captureLock)
|
||||||
|
{
|
||||||
|
_microphoneGain = Math.Clamp(gain, 0.0f, 2.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetPlaybackGain(float gain)
|
||||||
|
{
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
_playbackGain = Math.Clamp(gain, 0.0f, 2.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PushReceivedFrame(sbyte[] frame)
|
||||||
|
{
|
||||||
|
if (frame.Length == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
if (!_started || _playbackBuffer is null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si se ha acumulado demasiado audio, vaciamos para no escuchar voz atrasada.
|
||||||
|
if (_playbackBuffer.BufferedDuration > TimeSpan.FromMilliseconds(900))
|
||||||
|
{
|
||||||
|
_playbackBuffer.ClearBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
var pcm16 = new byte[frame.Length * 2];
|
||||||
|
float gain = _playbackGain;
|
||||||
|
|
||||||
|
for (int i = 0; i < frame.Length; i++)
|
||||||
|
{
|
||||||
|
int sample = (int)MathF.Round(frame[i] * 256.0f * gain);
|
||||||
|
sample = Math.Clamp(sample, short.MinValue, short.MaxValue);
|
||||||
|
|
||||||
|
short sample16 = (short)sample;
|
||||||
|
pcm16[i * 2] = (byte)(sample16 & 0xFF);
|
||||||
|
pcm16[i * 2 + 1] = (byte)((sample16 >> 8) & 0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
_playbackBuffer.AddSamples(pcm16, 0, pcm16.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearPlaybackBuffer()
|
||||||
|
{
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
_playbackBuffer?.ClearBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Capture_DataAvailable(object? sender, WaveInEventArgs e)
|
||||||
|
{
|
||||||
|
List<sbyte[]>? completedFrames = null;
|
||||||
|
|
||||||
|
lock (_captureLock)
|
||||||
|
{
|
||||||
|
if (!_pttActive)
|
||||||
|
{
|
||||||
|
_microphoneFrameIndex = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float gain = _microphoneGain;
|
||||||
|
|
||||||
|
// El formato solicitado a NAudio es signed 16-bit, mono, little-endian.
|
||||||
|
for (int i = 0; i + 1 < e.BytesRecorded; i += 2)
|
||||||
|
{
|
||||||
|
short inputSample = (short)(e.Buffer[i] | (e.Buffer[i + 1] << 8));
|
||||||
|
short filteredSample = _microphoneFilter.Process(inputSample);
|
||||||
|
|
||||||
|
int amplified = (int)MathF.Round(filteredSample * gain);
|
||||||
|
amplified = Math.Clamp(amplified, short.MinValue, short.MaxValue);
|
||||||
|
|
||||||
|
_microphoneFrame[_microphoneFrameIndex] = (sbyte)(amplified >> 8);
|
||||||
|
_microphoneFrameIndex++;
|
||||||
|
|
||||||
|
if (_microphoneFrameIndex >= MicrophoneFrameSamples)
|
||||||
|
{
|
||||||
|
var frame = new sbyte[MicrophoneFrameSamples];
|
||||||
|
Array.Copy(_microphoneFrame, frame, MicrophoneFrameSamples);
|
||||||
|
|
||||||
|
completedFrames ??= new List<sbyte[]>();
|
||||||
|
completedFrames.Add(frame);
|
||||||
|
_microphoneFrameIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (completedFrames is null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (sbyte[] frame in completedFrames)
|
||||||
|
{
|
||||||
|
MicrophoneFrameReady?.Invoke(this, frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Capture_RecordingStopped(object? sender, StoppedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Exception is not null)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, $"El micrófono se detuvo: {e.Exception.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResetMicrophoneState()
|
||||||
|
{
|
||||||
|
lock (_captureLock)
|
||||||
|
{
|
||||||
|
_microphoneFrameIndex = 0;
|
||||||
|
_microphoneFilter.Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Filtro trasladado del programa C++: pasa-altos, pasa-bajos y noise gate.
|
||||||
|
/// </summary>
|
||||||
|
private sealed class MicrophoneFilter
|
||||||
|
{
|
||||||
|
private const int NoiseGateOpenThreshold = 800;
|
||||||
|
private const int NoiseGateCloseThreshold = 400;
|
||||||
|
private const int NoiseGateHoldSamples = 640;
|
||||||
|
|
||||||
|
private const int HighPassRQ8 = 250;
|
||||||
|
private const int LowPassAlphaQ8 = 170;
|
||||||
|
private const int GateAttackQ8 = 24;
|
||||||
|
private const int GateReleaseQ8 = 6;
|
||||||
|
|
||||||
|
private int _highPassPreviousInput;
|
||||||
|
private int _highPassPreviousOutput;
|
||||||
|
private int _lowPassOutput;
|
||||||
|
private int _gateHold;
|
||||||
|
private int _gateLevelQ8;
|
||||||
|
|
||||||
|
public short Process(short sample)
|
||||||
|
{
|
||||||
|
int input = sample;
|
||||||
|
|
||||||
|
int highPass = input - _highPassPreviousInput
|
||||||
|
+ ((_highPassPreviousOutput * HighPassRQ8) / 256);
|
||||||
|
|
||||||
|
_highPassPreviousInput = input;
|
||||||
|
_highPassPreviousOutput = highPass;
|
||||||
|
highPass = Math.Clamp(highPass, short.MinValue, short.MaxValue);
|
||||||
|
|
||||||
|
_lowPassOutput += ((highPass - _lowPassOutput) * LowPassAlphaQ8) / 256;
|
||||||
|
_lowPassOutput = Math.Clamp(_lowPassOutput, short.MinValue, short.MaxValue);
|
||||||
|
|
||||||
|
int amplitude = Math.Abs(_lowPassOutput);
|
||||||
|
|
||||||
|
if (amplitude >= NoiseGateOpenThreshold)
|
||||||
|
{
|
||||||
|
_gateHold = NoiseGateHoldSamples;
|
||||||
|
}
|
||||||
|
else if (_gateHold > 0)
|
||||||
|
{
|
||||||
|
_gateHold--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_gateHold > 0 || amplitude >= NoiseGateOpenThreshold)
|
||||||
|
{
|
||||||
|
_gateLevelQ8 = Math.Min(256, _gateLevelQ8 + GateAttackQ8);
|
||||||
|
}
|
||||||
|
else if (amplitude <= NoiseGateCloseThreshold)
|
||||||
|
{
|
||||||
|
_gateLevelQ8 = Math.Max(0, _gateLevelQ8 - GateReleaseQ8);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_gateLevelQ8 = Math.Max(0, _gateLevelQ8 - GateReleaseQ8);
|
||||||
|
}
|
||||||
|
|
||||||
|
int output = (_lowPassOutput * _gateLevelQ8) / 256;
|
||||||
|
|
||||||
|
// Elimina los últimos residuos digitales cuando la puerta está casi cerrada.
|
||||||
|
if (_gateLevelQ8 == 0 || Math.Abs(output) < 16)
|
||||||
|
{
|
||||||
|
output = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
output = Math.Clamp(output, short.MinValue, short.MaxValue);
|
||||||
|
return (short)output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset()
|
||||||
|
{
|
||||||
|
_highPassPreviousInput = 0;
|
||||||
|
_highPassPreviousOutput = 0;
|
||||||
|
_lowPassOutput = 0;
|
||||||
|
_gateHold = 0;
|
||||||
|
_gateLevelQ8 = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Radio/App_radio/Backup/App_radio.slnx
Normal file
3
Radio/App_radio/Backup/App_radio.slnx
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
<Solution>
|
||||||
|
<Project Path="App_radio.csproj" />
|
||||||
|
</Solution>
|
||||||
17
Radio/App_radio/Program.cs
Normal file
17
Radio/App_radio/Program.cs
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
namespace App_radio
|
||||||
|
{
|
||||||
|
internal static class Program
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The main entry point for the application.
|
||||||
|
/// </summary>
|
||||||
|
[STAThread]
|
||||||
|
static void Main()
|
||||||
|
{
|
||||||
|
// To customize application configuration such as set high DPI settings or default font,
|
||||||
|
// see https://aka.ms/applicationconfiguration.
|
||||||
|
ApplicationConfiguration.Initialize();
|
||||||
|
Application.Run(new RadioMain());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
402
Radio/App_radio/RadioController.cs
Normal file
402
Radio/App_radio/RadioController.cs
Normal file
|
|
@ -0,0 +1,402 @@
|
||||||
|
using System.Threading.Channels;
|
||||||
|
|
||||||
|
namespace App_radio;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Une la interfaz, el audio y el puerto serie.
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class RadioController : IDisposable
|
||||||
|
{
|
||||||
|
private const int MaxQueuedMicrophoneFrames = 2;
|
||||||
|
|
||||||
|
private readonly RadioSerialService _serial = new();
|
||||||
|
private readonly AudioEngine _audio = new();
|
||||||
|
private readonly object _stateLock = new();
|
||||||
|
private readonly object _pttSessionLock = new();
|
||||||
|
|
||||||
|
private Channel<TransmitItem>? _transmitChannel;
|
||||||
|
private CancellationTokenSource? _transmitCancellation;
|
||||||
|
private Task? _transmitTask;
|
||||||
|
private bool _connected;
|
||||||
|
private int _pttActive;
|
||||||
|
private int _pttSessionId;
|
||||||
|
private int _queuedMicrophoneFrames;
|
||||||
|
private bool _disposed;
|
||||||
|
|
||||||
|
public event EventHandler<string>? Error;
|
||||||
|
public event EventHandler? PilotAudioReceived;
|
||||||
|
public event EventHandler? ConnectionFaulted;
|
||||||
|
|
||||||
|
public RadioController()
|
||||||
|
{
|
||||||
|
_serial.AudioFrameReceived += Serial_AudioFrameReceived;
|
||||||
|
_serial.Error += Serial_Error;
|
||||||
|
_audio.MicrophoneFrameReady += Audio_MicrophoneFrameReady;
|
||||||
|
_audio.Error += Audio_Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsConnected => Volatile.Read(ref _connected) && _serial.IsOpen;
|
||||||
|
|
||||||
|
public bool IsPttActive => Volatile.Read(ref _pttActive) != 0;
|
||||||
|
|
||||||
|
public void Connect(string portName)
|
||||||
|
{
|
||||||
|
ThrowIfDisposed();
|
||||||
|
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
if (_connected)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var channel = Channel.CreateUnbounded<TransmitItem>(new UnboundedChannelOptions
|
||||||
|
{
|
||||||
|
SingleReader = true,
|
||||||
|
SingleWriter = false,
|
||||||
|
AllowSynchronousContinuations = false
|
||||||
|
});
|
||||||
|
|
||||||
|
var cancellation = new CancellationTokenSource();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_serial.Open(portName);
|
||||||
|
_audio.Start();
|
||||||
|
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
_transmitChannel = channel;
|
||||||
|
_transmitCancellation = cancellation;
|
||||||
|
Volatile.Write(ref _connected, true);
|
||||||
|
Volatile.Write(ref _pttActive, 0);
|
||||||
|
Volatile.Write(ref _queuedMicrophoneFrames, 0);
|
||||||
|
_pttSessionId = 0;
|
||||||
|
_transmitTask = Task.Run(() => TransmitLoopAsync(channel.Reader, cancellation.Token), cancellation.Token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
cancellation.Cancel();
|
||||||
|
cancellation.Dispose();
|
||||||
|
_audio.Stop();
|
||||||
|
_serial.Close();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DisconnectAsync()
|
||||||
|
{
|
||||||
|
Channel<TransmitItem>? channel;
|
||||||
|
CancellationTokenSource? cancellation;
|
||||||
|
Task? transmitTask;
|
||||||
|
|
||||||
|
bool alreadyDisconnected;
|
||||||
|
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
alreadyDisconnected = !_connected && _transmitTask is null;
|
||||||
|
Volatile.Write(ref _connected, false);
|
||||||
|
|
||||||
|
channel = _transmitChannel;
|
||||||
|
cancellation = _transmitCancellation;
|
||||||
|
transmitTask = _transmitTask;
|
||||||
|
|
||||||
|
_transmitChannel = null;
|
||||||
|
_transmitCancellation = null;
|
||||||
|
_transmitTask = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alreadyDisconnected)
|
||||||
|
{
|
||||||
|
_audio.Stop();
|
||||||
|
_serial.Close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetPtt(false);
|
||||||
|
_audio.Stop();
|
||||||
|
|
||||||
|
channel?.Writer.TryComplete();
|
||||||
|
cancellation?.Cancel();
|
||||||
|
|
||||||
|
if (transmitTask is not null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await transmitTask.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
// Cancelación normal al desconectar.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellation?.Dispose();
|
||||||
|
Volatile.Write(ref _queuedMicrophoneFrames, 0);
|
||||||
|
_serial.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool SetPtt(bool active)
|
||||||
|
{
|
||||||
|
if (active && !IsConnected)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (_pttSessionLock)
|
||||||
|
{
|
||||||
|
int requestedState = active ? 1 : 0;
|
||||||
|
int previousState = Volatile.Read(ref _pttActive);
|
||||||
|
|
||||||
|
if (previousState == requestedState)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Channel<TransmitItem>? channel;
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
channel = _transmitChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (active)
|
||||||
|
{
|
||||||
|
unchecked
|
||||||
|
{
|
||||||
|
++_pttSessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// START y el modo de transmisión se activan bajo el mismo lock
|
||||||
|
// de escritura. Así no puede cruzarse un STOP de la pulsación anterior.
|
||||||
|
_serial.BeginTransmitSession();
|
||||||
|
Volatile.Write(ref _pttActive, 1);
|
||||||
|
_audio.SetPtt(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Se deja de capturar inmediatamente, pero NO se vacía la cola ni se
|
||||||
|
// desactiva el puerto. El marcador END se procesa después de todos los
|
||||||
|
// frames ya grabados y solo entonces envía STOP al piloto.
|
||||||
|
Volatile.Write(ref _pttActive, 0);
|
||||||
|
_audio.SetPtt(false);
|
||||||
|
|
||||||
|
if (channel is not null)
|
||||||
|
{
|
||||||
|
channel.Writer.TryWrite(TransmitItem.EndPtt(_pttSessionId));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_serial.EndTransmitSession();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (ex is IOException
|
||||||
|
or InvalidOperationException
|
||||||
|
or UnauthorizedAccessException
|
||||||
|
or TimeoutException)
|
||||||
|
{
|
||||||
|
_audio.SetPtt(false);
|
||||||
|
_serial.SetTransmitMode(false);
|
||||||
|
Volatile.Write(ref _pttActive, 0);
|
||||||
|
Error?.Invoke(this, $"Error cambiando el PTT: {ex.Message}");
|
||||||
|
ConnectionFaulted?.Invoke(this, EventArgs.Empty);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetBoxVolume(int percent, bool muted)
|
||||||
|
{
|
||||||
|
float gain = muted ? 0.0f : PercentToGain(percent);
|
||||||
|
_audio.SetPlaybackGain(gain);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetPilotVolume(int percent, bool muted)
|
||||||
|
{
|
||||||
|
float gain = muted ? 0.0f : PercentToGain(percent);
|
||||||
|
_audio.SetMicrophoneGain(gain);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float PercentToGain(int percent)
|
||||||
|
{
|
||||||
|
// 0 -> 0.00x, 50 -> 1.00x y 100 -> 2.00x.
|
||||||
|
// Así el control no multiplica directamente por 50 ni por 100.
|
||||||
|
return Math.Clamp(percent, 0, 100) / 50.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task TransmitLoopAsync(ChannelReader<TransmitItem> reader, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await foreach (TransmitItem item in reader.ReadAllAsync(cancellationToken))
|
||||||
|
{
|
||||||
|
if (item.Kind == TransmitItemKind.Audio)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (IsConnected && item.Audio is not null)
|
||||||
|
{
|
||||||
|
// Los frames que ya estaban en la cola se envían aunque el
|
||||||
|
// usuario haya soltado PTT. Eso conserva el final del mensaje.
|
||||||
|
_serial.SendAudioFrame(item.Audio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (ex is IOException
|
||||||
|
or InvalidOperationException
|
||||||
|
or UnauthorizedAccessException
|
||||||
|
or TimeoutException)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, $"Error enviando audio: {ex.Message}");
|
||||||
|
ConnectionFaulted?.Invoke(this, EventArgs.Empty);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Interlocked.Decrement(ref _queuedMicrophoneFrames);
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (_pttSessionLock)
|
||||||
|
{
|
||||||
|
// Si el usuario volvió a pulsar antes de llegar aquí, este END es
|
||||||
|
// antiguo y no debe mandar STOP ni cerrar la nueva transmisión.
|
||||||
|
if (!IsConnected || IsPttActive || item.SessionId != _pttSessionId)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_serial.EndTransmitSession();
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (ex is IOException
|
||||||
|
or InvalidOperationException
|
||||||
|
or UnauthorizedAccessException
|
||||||
|
or TimeoutException)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, $"Error terminando el envío de audio: {ex.Message}");
|
||||||
|
ConnectionFaulted?.Invoke(this, EventArgs.Empty);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
// Cancelación normal al desconectar.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Audio_MicrophoneFrameReady(object? sender, sbyte[] frame)
|
||||||
|
{
|
||||||
|
lock (_pttSessionLock)
|
||||||
|
{
|
||||||
|
Channel<TransmitItem>? channel;
|
||||||
|
int sessionId;
|
||||||
|
|
||||||
|
lock (_stateLock)
|
||||||
|
{
|
||||||
|
if (!_connected || !IsPttActive)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
channel = _transmitChannel;
|
||||||
|
sessionId = _pttSessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel is null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int queued = Interlocked.Increment(ref _queuedMicrophoneFrames);
|
||||||
|
if (queued > MaxQueuedMicrophoneFrames)
|
||||||
|
{
|
||||||
|
Interlocked.Decrement(ref _queuedMicrophoneFrames);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!channel.Writer.TryWrite(TransmitItem.AudioFrame(frame, sessionId)))
|
||||||
|
{
|
||||||
|
Interlocked.Decrement(ref _queuedMicrophoneFrames);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Serial_AudioFrameReceived(object? sender, sbyte[] frame)
|
||||||
|
{
|
||||||
|
// La recepción no depende del PTT: el box puede transmitir y escuchar
|
||||||
|
// al piloto simultáneamente.
|
||||||
|
if (!IsConnected)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_audio.PushReceivedFrame(frame);
|
||||||
|
PilotAudioReceived?.Invoke(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Serial_Error(object? sender, string message)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Audio_Error(object? sender, string message)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, message);
|
||||||
|
ConnectionFaulted?.Invoke(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ThrowIfDisposed()
|
||||||
|
{
|
||||||
|
if (_disposed)
|
||||||
|
{
|
||||||
|
throw new ObjectDisposedException(nameof(RadioController));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (_disposed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_disposed = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DisconnectAsync().GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_audio.MicrophoneFrameReady -= Audio_MicrophoneFrameReady;
|
||||||
|
_audio.Error -= Audio_Error;
|
||||||
|
_serial.AudioFrameReceived -= Serial_AudioFrameReceived;
|
||||||
|
_serial.Error -= Serial_Error;
|
||||||
|
_audio.Dispose();
|
||||||
|
_serial.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum TransmitItemKind
|
||||||
|
{
|
||||||
|
Audio,
|
||||||
|
EndPtt
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly record struct TransmitItem(TransmitItemKind Kind, sbyte[]? Audio, int SessionId)
|
||||||
|
{
|
||||||
|
public static TransmitItem AudioFrame(sbyte[] audio, int sessionId) => new(TransmitItemKind.Audio, audio, sessionId);
|
||||||
|
public static TransmitItem EndPtt(int sessionId) => new(TransmitItemKind.EndPtt, null, sessionId);
|
||||||
|
}
|
||||||
|
}
|
||||||
348
Radio/App_radio/RadioMain.Designer.cs
generated
Normal file
348
Radio/App_radio/RadioMain.Designer.cs
generated
Normal file
|
|
@ -0,0 +1,348 @@
|
||||||
|
namespace App_radio
|
||||||
|
{
|
||||||
|
partial class RadioMain
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
PuertoLabel = new Label();
|
||||||
|
PuertoBox = new ComboBox();
|
||||||
|
ActualizarButton = new Button();
|
||||||
|
ConectarButton = new Button();
|
||||||
|
PuertosTab = new TabControl();
|
||||||
|
ComunicacionTab = new TabPage();
|
||||||
|
label2 = new Label();
|
||||||
|
EstadoRadioLabel = new Label();
|
||||||
|
PttButton = new Button();
|
||||||
|
tabPage1 = new TabPage();
|
||||||
|
ConectadoPilotoLabel = new Label();
|
||||||
|
ConectadoBoxLabel = new Label();
|
||||||
|
EstadoPilotoLabel = new Label();
|
||||||
|
EstadoBoxLabel = new Label();
|
||||||
|
VolumenTab = new TabPage();
|
||||||
|
SilenciarPilotoCheck = new CheckBox();
|
||||||
|
SilenciarBoxCheck = new CheckBox();
|
||||||
|
VolumenPilotoUpdown = new NumericUpDown();
|
||||||
|
VolumenBoxUpdown = new NumericUpDown();
|
||||||
|
VolumenPilotoLabel = new Label();
|
||||||
|
VolumenBoxLabel = new Label();
|
||||||
|
RegistrosTab = new TabPage();
|
||||||
|
RegistrosTextBox = new RichTextBox();
|
||||||
|
PuertosTab.SuspendLayout();
|
||||||
|
ComunicacionTab.SuspendLayout();
|
||||||
|
tabPage1.SuspendLayout();
|
||||||
|
VolumenTab.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)VolumenPilotoUpdown).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)VolumenBoxUpdown).BeginInit();
|
||||||
|
RegistrosTab.SuspendLayout();
|
||||||
|
SuspendLayout();
|
||||||
|
//
|
||||||
|
// PuertoLabel
|
||||||
|
//
|
||||||
|
PuertoLabel.AutoSize = true;
|
||||||
|
PuertoLabel.Location = new Point(17, 46);
|
||||||
|
PuertoLabel.Name = "PuertoLabel";
|
||||||
|
PuertoLabel.Size = new Size(98, 15);
|
||||||
|
PuertoLabel.TabIndex = 0;
|
||||||
|
PuertoLabel.Text = "Selección puerto:";
|
||||||
|
//
|
||||||
|
// PuertoBox
|
||||||
|
//
|
||||||
|
PuertoBox.FormattingEnabled = true;
|
||||||
|
PuertoBox.Location = new Point(143, 43);
|
||||||
|
PuertoBox.Name = "PuertoBox";
|
||||||
|
PuertoBox.Size = new Size(121, 23);
|
||||||
|
PuertoBox.TabIndex = 1;
|
||||||
|
//
|
||||||
|
// ActualizarButton
|
||||||
|
//
|
||||||
|
ActualizarButton.Location = new Point(298, 42);
|
||||||
|
ActualizarButton.Name = "ActualizarButton";
|
||||||
|
ActualizarButton.Size = new Size(75, 23);
|
||||||
|
ActualizarButton.TabIndex = 2;
|
||||||
|
ActualizarButton.Text = "Actualizar";
|
||||||
|
ActualizarButton.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// ConectarButton
|
||||||
|
//
|
||||||
|
ConectarButton.Location = new Point(389, 42);
|
||||||
|
ConectarButton.Name = "ConectarButton";
|
||||||
|
ConectarButton.Size = new Size(75, 23);
|
||||||
|
ConectarButton.TabIndex = 3;
|
||||||
|
ConectarButton.Text = "Conectar\r\n";
|
||||||
|
ConectarButton.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// PuertosTab
|
||||||
|
//
|
||||||
|
PuertosTab.Controls.Add(ComunicacionTab);
|
||||||
|
PuertosTab.Controls.Add(tabPage1);
|
||||||
|
PuertosTab.Controls.Add(VolumenTab);
|
||||||
|
PuertosTab.Controls.Add(RegistrosTab);
|
||||||
|
PuertosTab.Dock = DockStyle.Fill;
|
||||||
|
PuertosTab.Location = new Point(0, 0);
|
||||||
|
PuertosTab.Name = "PuertosTab";
|
||||||
|
PuertosTab.SelectedIndex = 0;
|
||||||
|
PuertosTab.Size = new Size(500, 248);
|
||||||
|
PuertosTab.TabIndex = 4;
|
||||||
|
//
|
||||||
|
// ComunicacionTab
|
||||||
|
//
|
||||||
|
ComunicacionTab.Controls.Add(label2);
|
||||||
|
ComunicacionTab.Controls.Add(EstadoRadioLabel);
|
||||||
|
ComunicacionTab.Controls.Add(PttButton);
|
||||||
|
ComunicacionTab.Location = new Point(4, 24);
|
||||||
|
ComunicacionTab.Name = "ComunicacionTab";
|
||||||
|
ComunicacionTab.Padding = new Padding(3);
|
||||||
|
ComunicacionTab.Size = new Size(492, 220);
|
||||||
|
ComunicacionTab.TabIndex = 3;
|
||||||
|
ComunicacionTab.Text = "Comunicacion";
|
||||||
|
ComunicacionTab.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// label2
|
||||||
|
//
|
||||||
|
label2.AutoSize = true;
|
||||||
|
label2.ForeColor = Color.Gray;
|
||||||
|
label2.Location = new Point(248, 174);
|
||||||
|
label2.Name = "label2";
|
||||||
|
label2.Size = new Size(87, 15);
|
||||||
|
label2.TabIndex = 2;
|
||||||
|
label2.Text = "● Desconectada";
|
||||||
|
//
|
||||||
|
// EstadoRadioLabel
|
||||||
|
//
|
||||||
|
EstadoRadioLabel.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||||
|
EstadoRadioLabel.AutoSize = true;
|
||||||
|
EstadoRadioLabel.Location = new Point(146, 174);
|
||||||
|
EstadoRadioLabel.Name = "EstadoRadioLabel";
|
||||||
|
EstadoRadioLabel.Size = new Size(75, 15);
|
||||||
|
EstadoRadioLabel.TabIndex = 1;
|
||||||
|
EstadoRadioLabel.Text = "Estado radio:";
|
||||||
|
//
|
||||||
|
// PttButton
|
||||||
|
//
|
||||||
|
PttButton.Font = new Font("Segoe UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 0);
|
||||||
|
PttButton.Location = new Point(98, 26);
|
||||||
|
PttButton.Name = "PttButton";
|
||||||
|
PttButton.Size = new Size(273, 126);
|
||||||
|
PttButton.TabIndex = 0;
|
||||||
|
PttButton.Text = "Pulsar para hablar";
|
||||||
|
PttButton.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// tabPage1
|
||||||
|
//
|
||||||
|
tabPage1.Controls.Add(ConectadoPilotoLabel);
|
||||||
|
tabPage1.Controls.Add(ConectadoBoxLabel);
|
||||||
|
tabPage1.Controls.Add(EstadoPilotoLabel);
|
||||||
|
tabPage1.Controls.Add(EstadoBoxLabel);
|
||||||
|
tabPage1.Controls.Add(PuertoLabel);
|
||||||
|
tabPage1.Controls.Add(ConectarButton);
|
||||||
|
tabPage1.Controls.Add(PuertoBox);
|
||||||
|
tabPage1.Controls.Add(ActualizarButton);
|
||||||
|
tabPage1.Location = new Point(4, 24);
|
||||||
|
tabPage1.Name = "tabPage1";
|
||||||
|
tabPage1.Padding = new Padding(3);
|
||||||
|
tabPage1.Size = new Size(492, 220);
|
||||||
|
tabPage1.TabIndex = 0;
|
||||||
|
tabPage1.Text = "Puertos";
|
||||||
|
tabPage1.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// ConectadoPilotoLabel
|
||||||
|
//
|
||||||
|
ConectadoPilotoLabel.AutoSize = true;
|
||||||
|
ConectadoPilotoLabel.ForeColor = Color.Gray;
|
||||||
|
ConectadoPilotoLabel.Location = new Point(143, 146);
|
||||||
|
ConectadoPilotoLabel.Name = "ConectadoPilotoLabel";
|
||||||
|
ConectadoPilotoLabel.Size = new Size(75, 15);
|
||||||
|
ConectadoPilotoLabel.TabIndex = 7;
|
||||||
|
ConectadoPilotoLabel.Text = "● Desconectado";
|
||||||
|
//
|
||||||
|
// ConectadoBoxLabel
|
||||||
|
//
|
||||||
|
ConectadoBoxLabel.AutoSize = true;
|
||||||
|
ConectadoBoxLabel.ForeColor = Color.Gray;
|
||||||
|
ConectadoBoxLabel.Location = new Point(143, 111);
|
||||||
|
ConectadoBoxLabel.Name = "ConectadoBoxLabel";
|
||||||
|
ConectadoBoxLabel.Size = new Size(75, 15);
|
||||||
|
ConectadoBoxLabel.TabIndex = 6;
|
||||||
|
ConectadoBoxLabel.Text = "● Desconectado";
|
||||||
|
//
|
||||||
|
// EstadoPilotoLabel
|
||||||
|
//
|
||||||
|
EstadoPilotoLabel.AutoSize = true;
|
||||||
|
EstadoPilotoLabel.Location = new Point(17, 146);
|
||||||
|
EstadoPilotoLabel.Name = "EstadoPilotoLabel";
|
||||||
|
EstadoPilotoLabel.Size = new Size(109, 15);
|
||||||
|
EstadoPilotoLabel.TabIndex = 5;
|
||||||
|
EstadoPilotoLabel.Text = "Estado radio piloto:";
|
||||||
|
//
|
||||||
|
// EstadoBoxLabel
|
||||||
|
//
|
||||||
|
EstadoBoxLabel.AutoSize = true;
|
||||||
|
EstadoBoxLabel.Location = new Point(17, 111);
|
||||||
|
EstadoBoxLabel.Name = "EstadoBoxLabel";
|
||||||
|
EstadoBoxLabel.Size = new Size(97, 15);
|
||||||
|
EstadoBoxLabel.TabIndex = 4;
|
||||||
|
EstadoBoxLabel.Text = "Estado radio box:";
|
||||||
|
//
|
||||||
|
// VolumenTab
|
||||||
|
//
|
||||||
|
VolumenTab.Controls.Add(SilenciarPilotoCheck);
|
||||||
|
VolumenTab.Controls.Add(SilenciarBoxCheck);
|
||||||
|
VolumenTab.Controls.Add(VolumenPilotoUpdown);
|
||||||
|
VolumenTab.Controls.Add(VolumenBoxUpdown);
|
||||||
|
VolumenTab.Controls.Add(VolumenPilotoLabel);
|
||||||
|
VolumenTab.Controls.Add(VolumenBoxLabel);
|
||||||
|
VolumenTab.Location = new Point(4, 24);
|
||||||
|
VolumenTab.Name = "VolumenTab";
|
||||||
|
VolumenTab.Padding = new Padding(3);
|
||||||
|
VolumenTab.Size = new Size(492, 220);
|
||||||
|
VolumenTab.TabIndex = 1;
|
||||||
|
VolumenTab.Text = "Volumen";
|
||||||
|
VolumenTab.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// SilenciarPilotoCheck
|
||||||
|
//
|
||||||
|
SilenciarPilotoCheck.AutoSize = true;
|
||||||
|
SilenciarPilotoCheck.Location = new Point(309, 91);
|
||||||
|
SilenciarPilotoCheck.Name = "SilenciarPilotoCheck";
|
||||||
|
SilenciarPilotoCheck.Size = new Size(70, 19);
|
||||||
|
SilenciarPilotoCheck.TabIndex = 5;
|
||||||
|
SilenciarPilotoCheck.Text = "Silenciar";
|
||||||
|
SilenciarPilotoCheck.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// SilenciarBoxCheck
|
||||||
|
//
|
||||||
|
SilenciarBoxCheck.AutoSize = true;
|
||||||
|
SilenciarBoxCheck.Location = new Point(309, 43);
|
||||||
|
SilenciarBoxCheck.Name = "SilenciarBoxCheck";
|
||||||
|
SilenciarBoxCheck.Size = new Size(70, 19);
|
||||||
|
SilenciarBoxCheck.TabIndex = 4;
|
||||||
|
SilenciarBoxCheck.Text = "Silenciar";
|
||||||
|
SilenciarBoxCheck.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// VolumenPilotoUpdown
|
||||||
|
//
|
||||||
|
VolumenPilotoUpdown.Location = new Point(155, 87);
|
||||||
|
VolumenPilotoUpdown.Name = "VolumenPilotoUpdown";
|
||||||
|
VolumenPilotoUpdown.Size = new Size(120, 23);
|
||||||
|
VolumenPilotoUpdown.TabIndex = 3;
|
||||||
|
VolumenPilotoUpdown.Value = new decimal(new int[] { 50, 0, 0, 0 });
|
||||||
|
//
|
||||||
|
// VolumenBoxUpdown
|
||||||
|
//
|
||||||
|
VolumenBoxUpdown.Location = new Point(155, 39);
|
||||||
|
VolumenBoxUpdown.Name = "VolumenBoxUpdown";
|
||||||
|
VolumenBoxUpdown.Size = new Size(120, 23);
|
||||||
|
VolumenBoxUpdown.TabIndex = 2;
|
||||||
|
VolumenBoxUpdown.Value = new decimal(new int[] { 50, 0, 0, 0 });
|
||||||
|
//
|
||||||
|
// VolumenPilotoLabel
|
||||||
|
//
|
||||||
|
VolumenPilotoLabel.AutoSize = true;
|
||||||
|
VolumenPilotoLabel.Location = new Point(29, 89);
|
||||||
|
VolumenPilotoLabel.Name = "VolumenPilotoLabel";
|
||||||
|
VolumenPilotoLabel.Size = new Size(91, 15);
|
||||||
|
VolumenPilotoLabel.TabIndex = 1;
|
||||||
|
VolumenPilotoLabel.Text = "Volumen piloto:";
|
||||||
|
//
|
||||||
|
// VolumenBoxLabel
|
||||||
|
//
|
||||||
|
VolumenBoxLabel.AutoSize = true;
|
||||||
|
VolumenBoxLabel.Location = new Point(29, 41);
|
||||||
|
VolumenBoxLabel.Name = "VolumenBoxLabel";
|
||||||
|
VolumenBoxLabel.Size = new Size(79, 15);
|
||||||
|
VolumenBoxLabel.TabIndex = 0;
|
||||||
|
VolumenBoxLabel.Text = "Volumen box:";
|
||||||
|
//
|
||||||
|
// RegistrosTab
|
||||||
|
//
|
||||||
|
RegistrosTab.Controls.Add(RegistrosTextBox);
|
||||||
|
RegistrosTab.Location = new Point(4, 24);
|
||||||
|
RegistrosTab.Name = "RegistrosTab";
|
||||||
|
RegistrosTab.Padding = new Padding(3);
|
||||||
|
RegistrosTab.Size = new Size(492, 220);
|
||||||
|
RegistrosTab.TabIndex = 2;
|
||||||
|
RegistrosTab.Text = "Registros";
|
||||||
|
RegistrosTab.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// RegistrosTextBox
|
||||||
|
//
|
||||||
|
RegistrosTextBox.Dock = DockStyle.Fill;
|
||||||
|
RegistrosTextBox.Location = new Point(3, 3);
|
||||||
|
RegistrosTextBox.Name = "RegistrosTextBox";
|
||||||
|
RegistrosTextBox.ReadOnly = true;
|
||||||
|
RegistrosTextBox.Size = new Size(486, 214);
|
||||||
|
RegistrosTextBox.TabIndex = 0;
|
||||||
|
RegistrosTextBox.Text = "";
|
||||||
|
//
|
||||||
|
// RadioMain
|
||||||
|
//
|
||||||
|
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||||
|
AutoScaleMode = AutoScaleMode.Font;
|
||||||
|
ClientSize = new Size(500, 248);
|
||||||
|
Controls.Add(PuertosTab);
|
||||||
|
Name = "RadioMain";
|
||||||
|
Text = "Radio - Formula Gades";
|
||||||
|
PuertosTab.ResumeLayout(false);
|
||||||
|
ComunicacionTab.ResumeLayout(false);
|
||||||
|
ComunicacionTab.PerformLayout();
|
||||||
|
tabPage1.ResumeLayout(false);
|
||||||
|
tabPage1.PerformLayout();
|
||||||
|
VolumenTab.ResumeLayout(false);
|
||||||
|
VolumenTab.PerformLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)VolumenPilotoUpdown).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)VolumenBoxUpdown).EndInit();
|
||||||
|
RegistrosTab.ResumeLayout(false);
|
||||||
|
ResumeLayout(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private Label PuertoLabel;
|
||||||
|
private ComboBox PuertoBox;
|
||||||
|
private Button ActualizarButton;
|
||||||
|
private Button ConectarButton;
|
||||||
|
private TabControl PuertosTab;
|
||||||
|
private TabPage tabPage1;
|
||||||
|
private TabPage VolumenTab;
|
||||||
|
private Label VolumenBoxLabel;
|
||||||
|
private Label VolumenPilotoLabel;
|
||||||
|
private NumericUpDown VolumenPilotoUpdown;
|
||||||
|
private NumericUpDown VolumenBoxUpdown;
|
||||||
|
private CheckBox SilenciarBoxCheck;
|
||||||
|
private CheckBox SilenciarPilotoCheck;
|
||||||
|
private TabPage RegistrosTab;
|
||||||
|
private Label EstadoPilotoLabel;
|
||||||
|
private Label EstadoBoxLabel;
|
||||||
|
private Label ConectadoPilotoLabel;
|
||||||
|
private Label ConectadoBoxLabel;
|
||||||
|
private TabPage ComunicacionTab;
|
||||||
|
private Button PttButton;
|
||||||
|
private Label label2;
|
||||||
|
private Label EstadoRadioLabel;
|
||||||
|
private RichTextBox RegistrosTextBox;
|
||||||
|
}
|
||||||
|
}
|
||||||
458
Radio/App_radio/RadioMain.cs
Normal file
458
Radio/App_radio/RadioMain.cs
Normal file
|
|
@ -0,0 +1,458 @@
|
||||||
|
using System.IO.Ports;
|
||||||
|
|
||||||
|
namespace App_radio;
|
||||||
|
|
||||||
|
public partial class RadioMain : Form
|
||||||
|
{
|
||||||
|
private readonly RadioController _radioController = new();
|
||||||
|
|
||||||
|
private bool _pilotConfirmed;
|
||||||
|
private bool _disconnectingAfterFault;
|
||||||
|
private bool _closing;
|
||||||
|
private bool _closeReady;
|
||||||
|
private bool _pttTransitionInProgress;
|
||||||
|
|
||||||
|
public RadioMain()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
ConfigureControls();
|
||||||
|
SubscribeEvents();
|
||||||
|
LoadPorts();
|
||||||
|
ApplyVolumes();
|
||||||
|
ShowDisconnectedState();
|
||||||
|
AddLog("Aplicación iniciada.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ConfigureControls()
|
||||||
|
{
|
||||||
|
PuertoBox.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||||
|
|
||||||
|
VolumenBoxUpdown.Minimum = 0;
|
||||||
|
VolumenBoxUpdown.Maximum = 100;
|
||||||
|
VolumenBoxUpdown.Increment = 1;
|
||||||
|
|
||||||
|
VolumenPilotoUpdown.Minimum = 0;
|
||||||
|
VolumenPilotoUpdown.Maximum = 100;
|
||||||
|
VolumenPilotoUpdown.Increment = 1;
|
||||||
|
|
||||||
|
PttButton.Enabled = false;
|
||||||
|
PttButton.Cursor = Cursors.Hand;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SubscribeEvents()
|
||||||
|
{
|
||||||
|
ActualizarButton.Click += ActualizarButton_Click;
|
||||||
|
ConectarButton.Click += ConectarButton_Click;
|
||||||
|
|
||||||
|
PttButton.MouseDown += PttButton_MouseDown;
|
||||||
|
PttButton.MouseUp += PttButton_MouseUp;
|
||||||
|
PttButton.MouseCaptureChanged += PttButton_MouseCaptureChanged;
|
||||||
|
|
||||||
|
VolumenBoxUpdown.ValueChanged += VolumeControl_Changed;
|
||||||
|
VolumenPilotoUpdown.ValueChanged += VolumeControl_Changed;
|
||||||
|
SilenciarBoxCheck.CheckedChanged += VolumeControl_Changed;
|
||||||
|
SilenciarPilotoCheck.CheckedChanged += VolumeControl_Changed;
|
||||||
|
|
||||||
|
Deactivate += RadioMain_Deactivate;
|
||||||
|
FormClosing += RadioMain_FormClosing;
|
||||||
|
|
||||||
|
_radioController.Error += RadioController_Error;
|
||||||
|
_radioController.PilotAudioReceived += RadioController_PilotAudioReceived;
|
||||||
|
_radioController.ConnectionFaulted += RadioController_ConnectionFaulted;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadPorts()
|
||||||
|
{
|
||||||
|
string? previousSelection = PuertoBox.SelectedItem?.ToString();
|
||||||
|
|
||||||
|
PuertoBox.Items.Clear();
|
||||||
|
string[] availablePorts = SerialPort.GetPortNames();
|
||||||
|
Array.Sort(availablePorts, ComparePortNames);
|
||||||
|
PuertoBox.Items.AddRange(availablePorts);
|
||||||
|
|
||||||
|
if (previousSelection is not null && PuertoBox.Items.Contains(previousSelection))
|
||||||
|
{
|
||||||
|
PuertoBox.SelectedItem = previousSelection;
|
||||||
|
}
|
||||||
|
else if (PuertoBox.Items.Count > 0)
|
||||||
|
{
|
||||||
|
PuertoBox.SelectedIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PuertoBox.Items.Count == 0)
|
||||||
|
{
|
||||||
|
AddLog("No se ha encontrado ningún puerto COM.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int ComparePortNames(string? left, string? right)
|
||||||
|
{
|
||||||
|
int leftNumber = ExtractPortNumber(left);
|
||||||
|
int rightNumber = ExtractPortNumber(right);
|
||||||
|
|
||||||
|
int numberComparison = leftNumber.CompareTo(rightNumber);
|
||||||
|
return numberComparison != 0
|
||||||
|
? numberComparison
|
||||||
|
: string.Compare(left, right, StringComparison.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int ExtractPortNumber(string? portName)
|
||||||
|
{
|
||||||
|
if (portName is not null
|
||||||
|
&& portName.StartsWith("COM", StringComparison.OrdinalIgnoreCase)
|
||||||
|
&& int.TryParse(portName.AsSpan(3), out int number))
|
||||||
|
{
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
|
||||||
|
return int.MaxValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActualizarButton_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
LoadPorts();
|
||||||
|
AddLog($"Puertos actualizados: {PuertoBox.Items.Count} encontrado(s).");
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void ConectarButton_Click(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (_radioController.IsConnected)
|
||||||
|
{
|
||||||
|
await DisconnectRadioAsync("Desconectado por el usuario.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string? selectedPort = PuertoBox.SelectedItem?.ToString();
|
||||||
|
if (string.IsNullOrWhiteSpace(selectedPort))
|
||||||
|
{
|
||||||
|
MessageBox.Show(
|
||||||
|
this,
|
||||||
|
"Selecciona un puerto COM antes de conectar.",
|
||||||
|
"Puerto no seleccionado",
|
||||||
|
MessageBoxButtons.OK,
|
||||||
|
MessageBoxIcon.Warning);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetConnectionControlsEnabled(false);
|
||||||
|
SetStatus(ConectadoBoxLabel, "● Conectando...", Color.DarkOrange);
|
||||||
|
SetGeneralRadioStatus("● Conectando...", Color.DarkOrange);
|
||||||
|
AddLog($"Abriendo {selectedPort} a 115200 baudios...");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Task.Run(() => _radioController.Connect(selectedPort));
|
||||||
|
|
||||||
|
_pilotConfirmed = false;
|
||||||
|
SetStatus(ConectadoBoxLabel, "● Conectado", Color.Green);
|
||||||
|
SetStatus(ConectadoPilotoLabel, "● Sin confirmar", Color.Gray);
|
||||||
|
SetGeneralRadioStatus("● Escuchando", Color.Green);
|
||||||
|
|
||||||
|
ConectarButton.Text = "Desconectar";
|
||||||
|
PttButton.Enabled = true;
|
||||||
|
PuertoBox.Enabled = false;
|
||||||
|
ActualizarButton.Enabled = false;
|
||||||
|
ConectarButton.Enabled = true;
|
||||||
|
|
||||||
|
ApplyVolumes();
|
||||||
|
AddLog($"Radio del box conectada en {selectedPort}.");
|
||||||
|
AddLog("Mantén pulsado el botón PTT para hablar.");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ShowDisconnectedState();
|
||||||
|
AddLog($"No se pudo conectar: {ex.Message}");
|
||||||
|
|
||||||
|
MessageBox.Show(
|
||||||
|
this,
|
||||||
|
$"No se pudo iniciar la radio.\n\n{ex.Message}",
|
||||||
|
"Error de conexión",
|
||||||
|
MessageBoxButtons.OK,
|
||||||
|
MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PttButton_MouseDown(object? sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Button != MouseButtons.Left || !_radioController.IsConnected)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PttButton.Capture = true;
|
||||||
|
|
||||||
|
if (_radioController.SetPtt(true))
|
||||||
|
{
|
||||||
|
PttButton.Text = "HABLANDO...\nEscucha simultánea activa";
|
||||||
|
PttButton.UseVisualStyleBackColor = false;
|
||||||
|
PttButton.BackColor = Color.IndianRed;
|
||||||
|
SetGeneralRadioStatus("● Transmitiendo y escuchando", Color.Red);
|
||||||
|
AddLog("PTT activado: transmitiendo y manteniendo activa la escucha.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PttButton_MouseUp(object? sender, MouseEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Button == MouseButtons.Left)
|
||||||
|
{
|
||||||
|
StopPtt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PttButton_MouseCaptureChanged(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (!PttButton.Capture && _radioController.IsPttActive)
|
||||||
|
{
|
||||||
|
StopPtt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RadioMain_Deactivate(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
StopPtt();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StopPtt()
|
||||||
|
{
|
||||||
|
if (_pttTransitionInProgress)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_pttTransitionInProgress = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
bool wasActive = _radioController.IsPttActive;
|
||||||
|
|
||||||
|
// El controlador corta la transmisión de forma inmediata y el
|
||||||
|
// servicio serie deja de enviar al terminar como máximo el fragmento
|
||||||
|
// actual de 200 bytes.
|
||||||
|
_radioController.SetPtt(false);
|
||||||
|
|
||||||
|
PttButton.Capture = false;
|
||||||
|
PttButton.Text = "Pulsar para hablar";
|
||||||
|
PttButton.UseVisualStyleBackColor = true;
|
||||||
|
PttButton.BackColor = SystemColors.Control;
|
||||||
|
|
||||||
|
if (_radioController.IsConnected)
|
||||||
|
{
|
||||||
|
SetGeneralRadioStatus("● Escuchando", Color.Green);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetGeneralRadioStatus("● Desconectada", Color.Gray);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fuerza el repintado antes de añadir el registro, para que el botón
|
||||||
|
// nunca parezca quedarse pulsado mientras se actualiza el RichTextBox.
|
||||||
|
PttButton.Invalidate();
|
||||||
|
PttButton.Update();
|
||||||
|
|
||||||
|
if (wasActive)
|
||||||
|
{
|
||||||
|
AddLog("PTT desactivado: escuchando la radio del piloto.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_pttTransitionInProgress = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void VolumeControl_Changed(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ApplyVolumes();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ApplyVolumes()
|
||||||
|
{
|
||||||
|
int boxPercent = Decimal.ToInt32(VolumenBoxUpdown.Value);
|
||||||
|
int pilotPercent = Decimal.ToInt32(VolumenPilotoUpdown.Value);
|
||||||
|
|
||||||
|
_radioController.SetBoxVolume(boxPercent, SilenciarBoxCheck.Checked);
|
||||||
|
_radioController.SetPilotVolume(pilotPercent, SilenciarPilotoCheck.Checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RadioController_PilotAudioReceived(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
RunOnUiThread(() =>
|
||||||
|
{
|
||||||
|
if (_pilotConfirmed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_pilotConfirmed = true;
|
||||||
|
SetStatus(ConectadoPilotoLabel, "● Conectado", Color.Green);
|
||||||
|
AddLog("Se ha recibido un frame de audio válido de la radio del piloto.");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RadioController_Error(object? sender, string message)
|
||||||
|
{
|
||||||
|
AddLog(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RadioController_ConnectionFaulted(object? sender, EventArgs e)
|
||||||
|
{
|
||||||
|
RunOnUiThread(async () =>
|
||||||
|
{
|
||||||
|
if (_disconnectingAfterFault || !_radioController.IsConnected)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_disconnectingAfterFault = true;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await DisconnectRadioAsync("La conexión se ha cerrado por un error.");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_disconnectingAfterFault = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task DisconnectRadioAsync(string logMessage)
|
||||||
|
{
|
||||||
|
StopPtt();
|
||||||
|
SetConnectionControlsEnabled(false);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _radioController.DisconnectAsync();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
AddLog($"Error al cerrar la conexión: {ex.Message}");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
ShowDisconnectedState();
|
||||||
|
AddLog(logMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ShowDisconnectedState()
|
||||||
|
{
|
||||||
|
_pilotConfirmed = false;
|
||||||
|
SetStatus(ConectadoBoxLabel, "● Desconectado", Color.Gray);
|
||||||
|
SetStatus(ConectadoPilotoLabel, "● Desconectado", Color.Gray);
|
||||||
|
SetGeneralRadioStatus("● Desconectada", Color.Gray);
|
||||||
|
|
||||||
|
ConectarButton.Text = "Conectar";
|
||||||
|
ConectarButton.Enabled = true;
|
||||||
|
PuertoBox.Enabled = true;
|
||||||
|
ActualizarButton.Enabled = true;
|
||||||
|
PttButton.Enabled = false;
|
||||||
|
PttButton.Text = "Pulsar para hablar";
|
||||||
|
PttButton.UseVisualStyleBackColor = true;
|
||||||
|
PttButton.BackColor = SystemColors.Control;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetConnectionControlsEnabled(bool enabled)
|
||||||
|
{
|
||||||
|
ConectarButton.Enabled = enabled;
|
||||||
|
PuertoBox.Enabled = enabled;
|
||||||
|
ActualizarButton.Enabled = enabled;
|
||||||
|
PttButton.Enabled = enabled && _radioController.IsConnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetStatus(Label label, string text, Color color)
|
||||||
|
{
|
||||||
|
label.Text = text;
|
||||||
|
label.ForeColor = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetGeneralRadioStatus(string text, Color color)
|
||||||
|
{
|
||||||
|
label2.Text = text;
|
||||||
|
label2.ForeColor = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddLog(string message)
|
||||||
|
{
|
||||||
|
RunOnUiThread(() =>
|
||||||
|
{
|
||||||
|
if (RegistrosTextBox.TextLength > 100_000)
|
||||||
|
{
|
||||||
|
RegistrosTextBox.Select(0, 20_000);
|
||||||
|
RegistrosTextBox.SelectedText = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegistrosTextBox.AppendText(
|
||||||
|
$"[{DateTime.Now:HH:mm:ss}] {message}{Environment.NewLine}");
|
||||||
|
RegistrosTextBox.SelectionStart = RegistrosTextBox.TextLength;
|
||||||
|
RegistrosTextBox.ScrollToCaret();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunOnUiThread(Action action)
|
||||||
|
{
|
||||||
|
if (IsDisposed || Disposing)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InvokeRequired)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
BeginInvoke(action);
|
||||||
|
}
|
||||||
|
catch (InvalidOperationException)
|
||||||
|
{
|
||||||
|
// La ventana se está cerrando.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void RadioMain_FormClosing(object? sender, FormClosingEventArgs e)
|
||||||
|
{
|
||||||
|
if (_closeReady)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Cancel = true;
|
||||||
|
|
||||||
|
if (_closing)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_closing = true;
|
||||||
|
|
||||||
|
// La ventana desaparece al instante. La limpieza del audio y del puerto
|
||||||
|
// se realiza después, con un límite de tiempo para que la X nunca deje la
|
||||||
|
// aplicación bloqueada en pantalla.
|
||||||
|
StopPtt();
|
||||||
|
Enabled = false;
|
||||||
|
Hide();
|
||||||
|
|
||||||
|
Task disconnectTask = Task.Run(async () => await _radioController.DisconnectAsync());
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await disconnectTask.WaitAsync(TimeSpan.FromSeconds(2));
|
||||||
|
}
|
||||||
|
catch (TimeoutException)
|
||||||
|
{
|
||||||
|
// Cerramos igualmente la interfaz. La tarea de limpieza podrá acabar
|
||||||
|
// en segundo plano sin impedir que termine la aplicación.
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
// Durante el cierre no mostramos cuadros de error que puedan volver a
|
||||||
|
// bloquear la salida de la aplicación.
|
||||||
|
}
|
||||||
|
_closeReady = true;
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
120
Radio/App_radio/RadioMain.resx
Normal file
120
Radio/App_radio/RadioMain.resx
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
609
Radio/App_radio/RadioSerialService.cs
Normal file
609
Radio/App_radio/RadioSerialService.cs
Normal file
|
|
@ -0,0 +1,609 @@
|
||||||
|
using System.IO.Ports;
|
||||||
|
|
||||||
|
namespace App_radio;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Comunicación USB-serie con el ESP32 y protocolo de audio heredado del programa C++.
|
||||||
|
/// </summary>
|
||||||
|
internal sealed class RadioSerialService : IDisposable
|
||||||
|
{
|
||||||
|
private const int BaudRate = 115200;
|
||||||
|
private const int AudioFrameMax = 1600;
|
||||||
|
private const int AudioChunkMax = 200;
|
||||||
|
private const int AudioChunkTotalMax = 8;
|
||||||
|
private const int HeaderSize = 11;
|
||||||
|
private const byte ControlMagic1 = 0xE5;
|
||||||
|
private const byte ControlMagic2 = 0x5F;
|
||||||
|
private const byte ControlCommandBoxPtt = 0x01;
|
||||||
|
|
||||||
|
private readonly object _portLock = new();
|
||||||
|
private readonly object _writeLock = new();
|
||||||
|
private readonly object _parserLock = new();
|
||||||
|
private readonly AudioPacketParser _parser = new();
|
||||||
|
|
||||||
|
private SerialPort? _port;
|
||||||
|
private int _transmitMode;
|
||||||
|
private byte _txFrameSequence;
|
||||||
|
|
||||||
|
public event EventHandler<sbyte[]>? AudioFrameReceived;
|
||||||
|
public event EventHandler<string>? Error;
|
||||||
|
|
||||||
|
public bool IsOpen
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (_portLock)
|
||||||
|
{
|
||||||
|
return _port?.IsOpen == true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string? PortName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
lock (_portLock)
|
||||||
|
{
|
||||||
|
return _port?.PortName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Open(string portName)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(portName))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Debes seleccionar un puerto COM.", nameof(portName));
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (_portLock)
|
||||||
|
{
|
||||||
|
if (_port?.IsOpen == true)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("El puerto serie ya está abierto.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var port = new SerialPort(portName, BaudRate, Parity.None, 8, StopBits.One)
|
||||||
|
{
|
||||||
|
Handshake = Handshake.None,
|
||||||
|
DtrEnable = true,
|
||||||
|
RtsEnable = true,
|
||||||
|
ReadBufferSize = 8192,
|
||||||
|
WriteBufferSize = 8192,
|
||||||
|
ReadTimeout = 100,
|
||||||
|
// Se escriben fragmentos de 200 bytes. Un timeout corto evita que
|
||||||
|
// soltar PTT o cerrar la ventana deje bloqueada la interfaz.
|
||||||
|
WriteTimeout = 150
|
||||||
|
};
|
||||||
|
|
||||||
|
port.DataReceived += Port_DataReceived;
|
||||||
|
port.ErrorReceived += Port_ErrorReceived;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
port.Open();
|
||||||
|
port.DiscardInBuffer();
|
||||||
|
port.DiscardOutBuffer();
|
||||||
|
|
||||||
|
lock (_parserLock)
|
||||||
|
{
|
||||||
|
_parser.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
Volatile.Write(ref _transmitMode, 0);
|
||||||
|
_txFrameSequence = 0;
|
||||||
|
_port = port;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
port.DataReceived -= Port_DataReceived;
|
||||||
|
port.ErrorReceived -= Port_ErrorReceived;
|
||||||
|
port.Dispose();
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
SerialPort? port;
|
||||||
|
|
||||||
|
// Primero apartamos el puerto para impedir escrituras nuevas.
|
||||||
|
lock (_portLock)
|
||||||
|
{
|
||||||
|
port = _port;
|
||||||
|
_port = null;
|
||||||
|
|
||||||
|
if (port is not null)
|
||||||
|
{
|
||||||
|
port.DataReceived -= Port_DataReceived;
|
||||||
|
port.ErrorReceived -= Port_ErrorReceived;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Volatile.Write(ref _transmitMode, 0);
|
||||||
|
|
||||||
|
lock (_parserLock)
|
||||||
|
{
|
||||||
|
_parser.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port is null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si había un fragmento de audio escribiéndose, solo esperamos a que
|
||||||
|
// termine ese fragmento (máximo el WriteTimeout), no un frame completo.
|
||||||
|
lock (_writeLock)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (port.IsOpen)
|
||||||
|
{
|
||||||
|
port.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (ex is IOException
|
||||||
|
or InvalidOperationException
|
||||||
|
or UnauthorizedAccessException)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, $"Error cerrando el puerto serie: {ex.Message}");
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
port.Dispose();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// El dispositivo ya no está disponible; no queda ningún recurso útil que cerrar.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTransmitMode(bool transmitting)
|
||||||
|
{
|
||||||
|
Volatile.Write(ref _transmitMode, transmitting ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Abre una sesión de transmisión y envía START sin permitir que se cruce
|
||||||
|
/// con el STOP de una pulsación anterior.
|
||||||
|
/// </summary>
|
||||||
|
public void BeginTransmitSession()
|
||||||
|
{
|
||||||
|
lock (_writeLock)
|
||||||
|
{
|
||||||
|
SerialPort port = GetOpenPort();
|
||||||
|
Volatile.Write(ref _transmitMode, 1);
|
||||||
|
WritePttControlLocked(port, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Envía STOP después de que el bucle de transmisión haya vaciado todos los
|
||||||
|
/// frames grabados. Solo entonces desactiva el envío de audio.
|
||||||
|
/// </summary>
|
||||||
|
public void EndTransmitSession()
|
||||||
|
{
|
||||||
|
lock (_writeLock)
|
||||||
|
{
|
||||||
|
SerialPort port = GetOpenPort();
|
||||||
|
WritePttControlLocked(port, false);
|
||||||
|
Volatile.Write(ref _transmitMode, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Envía un control corto y separado del audio. Formato: E5 5F 01 estado.
|
||||||
|
/// </summary>
|
||||||
|
public void SendPttControl(bool active)
|
||||||
|
{
|
||||||
|
lock (_writeLock)
|
||||||
|
{
|
||||||
|
SerialPort port = GetOpenPort();
|
||||||
|
WritePttControlLocked(port, active);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SerialPort GetOpenPort()
|
||||||
|
{
|
||||||
|
lock (_portLock)
|
||||||
|
{
|
||||||
|
SerialPort port = _port
|
||||||
|
?? throw new InvalidOperationException("El puerto serie no está abierto.");
|
||||||
|
|
||||||
|
if (!port.IsOpen)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("El puerto serie no está abierto.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void WritePttControlLocked(SerialPort port, bool active)
|
||||||
|
{
|
||||||
|
byte[] packet =
|
||||||
|
{
|
||||||
|
ControlMagic1,
|
||||||
|
ControlMagic2,
|
||||||
|
ControlCommandBoxPtt,
|
||||||
|
active ? (byte)1 : (byte)0
|
||||||
|
};
|
||||||
|
|
||||||
|
port.Write(packet, 0, packet.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendAudioFrame(sbyte[] samples)
|
||||||
|
{
|
||||||
|
ArgumentNullException.ThrowIfNull(samples);
|
||||||
|
|
||||||
|
if (samples.Length == 0 || samples.Length > AudioFrameMax)
|
||||||
|
{
|
||||||
|
throw new ArgumentOutOfRangeException(
|
||||||
|
nameof(samples),
|
||||||
|
$"El frame debe contener entre 1 y {AudioFrameMax} muestras.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Volatile.Read(ref _transmitMode) == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int frameLength = samples.Length;
|
||||||
|
int chunkTotal = (frameLength + AudioChunkMax - 1) / AudioChunkMax;
|
||||||
|
|
||||||
|
if (chunkTotal <= 0 || chunkTotal > AudioChunkTotalMax)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("El frame genera un número de fragmentos no válido.");
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (_writeLock)
|
||||||
|
{
|
||||||
|
SerialPort port;
|
||||||
|
byte frameSequence;
|
||||||
|
|
||||||
|
lock (_portLock)
|
||||||
|
{
|
||||||
|
port = _port
|
||||||
|
?? throw new InvalidOperationException("El puerto serie no está abierto.");
|
||||||
|
|
||||||
|
if (!port.IsOpen)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("El puerto serie no está abierto.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Una vez iniciado, el frame se envía completo. El STOP se coloca
|
||||||
|
// detrás de la cola de audio y nunca corta un frame a la mitad.
|
||||||
|
frameSequence = _txFrameSequence++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
for (int chunkIndex = 0; chunkIndex < chunkTotal; chunkIndex++)
|
||||||
|
{
|
||||||
|
int chunkLength = Math.Min(AudioChunkMax, frameLength - offset);
|
||||||
|
var packet = new byte[HeaderSize + chunkLength];
|
||||||
|
|
||||||
|
packet[0] = 0xE5;
|
||||||
|
packet[1] = 0x5E;
|
||||||
|
packet[2] = frameSequence;
|
||||||
|
packet[3] = (byte)chunkIndex;
|
||||||
|
packet[4] = (byte)chunkTotal;
|
||||||
|
packet[5] = (byte)(frameLength & 0xFF);
|
||||||
|
packet[6] = (byte)((frameLength >> 8) & 0xFF);
|
||||||
|
packet[7] = (byte)(offset & 0xFF);
|
||||||
|
packet[8] = (byte)((offset >> 8) & 0xFF);
|
||||||
|
packet[9] = (byte)(chunkLength & 0xFF);
|
||||||
|
packet[10] = (byte)((chunkLength >> 8) & 0xFF);
|
||||||
|
|
||||||
|
for (int i = 0; i < chunkLength; i++)
|
||||||
|
{
|
||||||
|
packet[HeaderSize + i] = unchecked((byte)samples[offset + i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
port.Write(packet, 0, packet.Length);
|
||||||
|
offset += chunkLength;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is not SerialPort port)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
byte[] buffer;
|
||||||
|
int bytesRead;
|
||||||
|
|
||||||
|
// El lock del puerto solo se mantiene mientras se extraen los bytes.
|
||||||
|
lock (_portLock)
|
||||||
|
{
|
||||||
|
if (!ReferenceEquals(port, _port) || !port.IsOpen)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int available = port.BytesToRead;
|
||||||
|
if (available <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer = new byte[available];
|
||||||
|
bytesRead = port.Read(buffer, 0, buffer.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<sbyte[]>? completedFrames = null;
|
||||||
|
|
||||||
|
lock (_parserLock)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < bytesRead; i++)
|
||||||
|
{
|
||||||
|
_parser.ProcessByte(buffer[i], frame =>
|
||||||
|
{
|
||||||
|
completedFrames ??= new List<sbyte[]>();
|
||||||
|
completedFrames.Add(frame);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (completedFrames is not null)
|
||||||
|
{
|
||||||
|
foreach (sbyte[] frame in completedFrames)
|
||||||
|
{
|
||||||
|
AudioFrameReceived?.Invoke(this, frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (ex is IOException
|
||||||
|
or InvalidOperationException
|
||||||
|
or UnauthorizedAccessException
|
||||||
|
or TimeoutException)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, $"Error leyendo el puerto serie: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Port_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, $"Error del puerto serie: {e.EventType}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum ReceiveState
|
||||||
|
{
|
||||||
|
WaitE5,
|
||||||
|
Wait5E,
|
||||||
|
ReadFrameSequence,
|
||||||
|
ReadChunkIndex,
|
||||||
|
ReadChunkTotal,
|
||||||
|
ReadFrameLengthLow,
|
||||||
|
ReadFrameLengthHigh,
|
||||||
|
ReadOffsetLow,
|
||||||
|
ReadOffsetHigh,
|
||||||
|
ReadChunkLengthLow,
|
||||||
|
ReadChunkLengthHigh,
|
||||||
|
ReadAudio
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class AudioPacketParser
|
||||||
|
{
|
||||||
|
private readonly sbyte[] _frameBuffer = new sbyte[AudioFrameMax];
|
||||||
|
private readonly bool[] _receivedChunks = new bool[AudioChunkTotalMax];
|
||||||
|
|
||||||
|
private ReceiveState _state = ReceiveState.WaitE5;
|
||||||
|
private byte _frameSequence;
|
||||||
|
private byte _chunkIndex;
|
||||||
|
private byte _chunkTotal;
|
||||||
|
private ushort _frameLength;
|
||||||
|
private ushort _offset;
|
||||||
|
private ushort _chunkLength;
|
||||||
|
private byte[] _audio = Array.Empty<byte>();
|
||||||
|
private int _audioIndex;
|
||||||
|
|
||||||
|
private bool _frameActive;
|
||||||
|
private byte _currentFrameSequence;
|
||||||
|
private byte _currentChunkTotal;
|
||||||
|
private ushort _currentFrameLength;
|
||||||
|
private int _receivedChunkCount;
|
||||||
|
|
||||||
|
public void ProcessByte(byte value, Action<sbyte[]> onFrameCompleted)
|
||||||
|
{
|
||||||
|
switch (_state)
|
||||||
|
{
|
||||||
|
case ReceiveState.WaitE5:
|
||||||
|
if (value == 0xE5)
|
||||||
|
{
|
||||||
|
_state = ReceiveState.Wait5E;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.Wait5E:
|
||||||
|
if (value == 0x5E)
|
||||||
|
{
|
||||||
|
ResetPacket();
|
||||||
|
_state = ReceiveState.ReadFrameSequence;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_state = value == 0xE5
|
||||||
|
? ReceiveState.Wait5E
|
||||||
|
: ReceiveState.WaitE5;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadFrameSequence:
|
||||||
|
_frameSequence = value;
|
||||||
|
_state = ReceiveState.ReadChunkIndex;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadChunkIndex:
|
||||||
|
_chunkIndex = value;
|
||||||
|
_state = ReceiveState.ReadChunkTotal;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadChunkTotal:
|
||||||
|
_chunkTotal = value;
|
||||||
|
_state = ReceiveState.ReadFrameLengthLow;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadFrameLengthLow:
|
||||||
|
_frameLength = value;
|
||||||
|
_state = ReceiveState.ReadFrameLengthHigh;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadFrameLengthHigh:
|
||||||
|
_frameLength |= (ushort)(value << 8);
|
||||||
|
_state = ReceiveState.ReadOffsetLow;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadOffsetLow:
|
||||||
|
_offset = value;
|
||||||
|
_state = ReceiveState.ReadOffsetHigh;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadOffsetHigh:
|
||||||
|
_offset |= (ushort)(value << 8);
|
||||||
|
_state = ReceiveState.ReadChunkLengthLow;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadChunkLengthLow:
|
||||||
|
_chunkLength = value;
|
||||||
|
_state = ReceiveState.ReadChunkLengthHigh;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadChunkLengthHigh:
|
||||||
|
_chunkLength |= (ushort)(value << 8);
|
||||||
|
|
||||||
|
if (!HeaderIsValid())
|
||||||
|
{
|
||||||
|
_state = ReceiveState.WaitE5;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
_audio = new byte[_chunkLength];
|
||||||
|
_audioIndex = 0;
|
||||||
|
_state = ReceiveState.ReadAudio;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ReceiveState.ReadAudio:
|
||||||
|
_audio[_audioIndex++] = value;
|
||||||
|
|
||||||
|
if (_audioIndex >= _audio.Length)
|
||||||
|
{
|
||||||
|
CompletePacket(onFrameCompleted);
|
||||||
|
_state = ReceiveState.WaitE5;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Reset()
|
||||||
|
{
|
||||||
|
_state = ReceiveState.WaitE5;
|
||||||
|
_frameActive = false;
|
||||||
|
ResetPacket();
|
||||||
|
Array.Clear(_frameBuffer, 0, _frameBuffer.Length);
|
||||||
|
Array.Clear(_receivedChunks, 0, _receivedChunks.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool HeaderIsValid()
|
||||||
|
{
|
||||||
|
if (_chunkTotal == 0 || _chunkTotal > AudioChunkTotalMax)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_chunkIndex >= _chunkTotal || _chunkIndex >= AudioChunkTotalMax)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_frameLength == 0 || _frameLength > AudioFrameMax)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_chunkLength == 0 || _chunkLength > AudioChunkMax)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _offset + _chunkLength <= _frameLength
|
||||||
|
&& _offset + _chunkLength <= AudioFrameMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CompletePacket(Action<sbyte[]> onFrameCompleted)
|
||||||
|
{
|
||||||
|
if (!_frameActive || _frameSequence != _currentFrameSequence)
|
||||||
|
{
|
||||||
|
StartFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_frameLength != _currentFrameLength || _chunkTotal != _currentChunkTotal)
|
||||||
|
{
|
||||||
|
_frameActive = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < _audio.Length; i++)
|
||||||
|
{
|
||||||
|
_frameBuffer[_offset + i] = unchecked((sbyte)_audio[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_receivedChunks[_chunkIndex])
|
||||||
|
{
|
||||||
|
_receivedChunks[_chunkIndex] = true;
|
||||||
|
_receivedChunkCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_receivedChunkCount < _currentChunkTotal)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var completedFrame = new sbyte[_currentFrameLength];
|
||||||
|
Array.Copy(_frameBuffer, completedFrame, _currentFrameLength);
|
||||||
|
_frameActive = false;
|
||||||
|
onFrameCompleted(completedFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartFrame()
|
||||||
|
{
|
||||||
|
Array.Clear(_frameBuffer, 0, _frameBuffer.Length);
|
||||||
|
Array.Clear(_receivedChunks, 0, _receivedChunks.Length);
|
||||||
|
|
||||||
|
_currentFrameSequence = _frameSequence;
|
||||||
|
_currentChunkTotal = _chunkTotal;
|
||||||
|
_currentFrameLength = _frameLength;
|
||||||
|
_receivedChunkCount = 0;
|
||||||
|
_frameActive = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResetPacket()
|
||||||
|
{
|
||||||
|
_frameSequence = 0;
|
||||||
|
_chunkIndex = 0;
|
||||||
|
_chunkTotal = 0;
|
||||||
|
_frameLength = 0;
|
||||||
|
_offset = 0;
|
||||||
|
_chunkLength = 0;
|
||||||
|
_audio = Array.Empty<byte>();
|
||||||
|
_audioIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
275
Radio/App_radio/UpgradeLog.htm
Normal file
275
Radio/App_radio/UpgradeLog.htm
Normal file
|
|
@ -0,0 +1,275 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<!-- saved from url=(0014)about:internet -->
|
||||||
|
<html xmlns:msxsl="urn:schemas-microsoft-com:xslt"><head><meta content="en-us" http-equiv="Content-Language" /><meta content="text/html; charset=utf-16" http-equiv="Content-Type" /><title _locID="ConversionReport0">
|
||||||
|
Informe de migración
|
||||||
|
</title><style>
|
||||||
|
/* Body style, for the entire document */
|
||||||
|
body
|
||||||
|
{
|
||||||
|
background: #F3F3F4;
|
||||||
|
color: #1E1E1F;
|
||||||
|
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header1 style, used for the main title */
|
||||||
|
h1
|
||||||
|
{
|
||||||
|
padding: 10px 0px 10px 10px;
|
||||||
|
font-size: 21pt;
|
||||||
|
background-color: #E2E2E2;
|
||||||
|
border-bottom: 1px #C1C1C2 solid;
|
||||||
|
color: #201F20;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header2 style, used for "Overview" and other sections */
|
||||||
|
h2
|
||||||
|
{
|
||||||
|
font-size: 18pt;
|
||||||
|
font-weight: normal;
|
||||||
|
padding: 15px 0 5px 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header3 style, used for sub-sections, such as project name */
|
||||||
|
h3
|
||||||
|
{
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 15pt;
|
||||||
|
margin: 0;
|
||||||
|
padding: 15px 0 5px 0;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Color all hyperlinks one color */
|
||||||
|
a
|
||||||
|
{
|
||||||
|
color: #1382CE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table styles */
|
||||||
|
table
|
||||||
|
{
|
||||||
|
border-spacing: 0 0;
|
||||||
|
border-collapse: collapse;
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
table th
|
||||||
|
{
|
||||||
|
background: #E7E7E8;
|
||||||
|
text-align: left;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
padding: 3px 6px 3px 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table td
|
||||||
|
{
|
||||||
|
vertical-align: top;
|
||||||
|
padding: 3px 6px 5px 5px;
|
||||||
|
margin: 0px;
|
||||||
|
border: 1px solid #E7E7E8;
|
||||||
|
background: #F7F7F8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Local link is a style for hyperlinks that link to file:/// content, there are lots so color them as 'normal' text until the user mouse overs */
|
||||||
|
.localLink
|
||||||
|
{
|
||||||
|
color: #1E1E1F;
|
||||||
|
background: #EEEEED;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.localLink:hover
|
||||||
|
{
|
||||||
|
color: #1382CE;
|
||||||
|
background: #FFFF99;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Center text, used in the over views cells that contain message level counts */
|
||||||
|
.textCentered
|
||||||
|
{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The message cells in message tables should take up all avaliable space */
|
||||||
|
.messageCell
|
||||||
|
{
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Padding around the content after the h1 */
|
||||||
|
#content
|
||||||
|
{
|
||||||
|
padding: 0px 12px 12px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The overview table expands to width, with a max width of 97% */
|
||||||
|
#overview table
|
||||||
|
{
|
||||||
|
width: auto;
|
||||||
|
max-width: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The messages tables are always 97% width */
|
||||||
|
#messages table
|
||||||
|
{
|
||||||
|
width: 97%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* All Icons */
|
||||||
|
.IconSuccessEncoded, .IconInfoEncoded, .IconWarningEncoded, .IconErrorEncoded
|
||||||
|
{
|
||||||
|
min-width:18px;
|
||||||
|
min-height:18px;
|
||||||
|
background-repeat:no-repeat;
|
||||||
|
background-position:center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Success icon encoded */
|
||||||
|
.IconSuccessEncoded
|
||||||
|
{
|
||||||
|
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
|
||||||
|
/* [---XsltValidateInternal-Base64EncodedImage:IconSuccess#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABcElEQVR4Xq2TsUsCURzHv15g8ZJcBWlyiYYgCIWcb9DFRRwMW5TA2c0/QEFwFkxxUQdxVlBwCYWOi6IhWgQhBLHJUCkhLr/BW8S7gvrAg+N+v8/v+x68Z8MGy+XSCyABQAXgBgHGALoASkIIDWSLeLBetdHryMjd5IxQPWT4rn1c/P7+xxp72Cs9m5SZ0Bq2vPnbPFafK2zDvmNHypdC0BPkLlQhxJsCAhQoZwdZU5mwxh720qGo8MzTxTTKZDPCx2HoVzp6lz0Q9tKhyx0kGs8Ny+TkWRKk8lCROwEduhyg9l/6lunOPSfmH3NUH6uQ0KHLAe7JYvJjevm+DAMGJHToKtigE+vwvIidxLamb8IBY9e+C5LiXREkfho3TSd06HJA13/oh6T51MTsfQbHrsMynQ5dDihFjiK8JJAU9AKIWTp76dCVN7HWHrajmUEGvyF9nkbAE6gLIS7kTUyuf2gscLoJrElZo/Mvj+nPz/kLTmfnEwP3tB0AAAAASUVORK5CYII=);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Information icon encoded */
|
||||||
|
.IconInfoEncoded
|
||||||
|
{
|
||||||
|
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
|
||||||
|
/* [---XsltValidateInternal-Base64EncodedImage:IconInformation#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHElEQVR4Xs2TsUoDQRRF7wwoziokjZUKadInhdhukR9YP8DMX1hYW+QvdsXa/QHBbcXC7W0CamWTQnclFutceIQJwwaWNLlwm5k5d94M76mmaeCrrmsLYOocY12FcxZFUeozCqKqqgYA8uevv1H6VuPxcwlfk5N92KHBxfFeCSAxxswlYAW/Xr989x/mv9gkhtyMDhcAxgzRsp7flj8B/HF1RsMXq+NZMkopaHe7lbKxQUEIGbKsYNoGn969060hZBkQex/W8oRQwsQaW2o3Ago2SVcJUzAgY3N0lTCZZm+zPS8HB51gMmS1DEYyOz9acKO1D8JWTlafKIMxdhvlfdyT94Vv5h7P8Ky7nQzACmhvKq3zk3PjW9asz9D/1oigecsioooAAAAASUVORK5CYII=);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Warning icon encoded */
|
||||||
|
.IconWarningEncoded
|
||||||
|
{
|
||||||
|
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
|
||||||
|
/* [---XsltValidateInternal-Base64EncodedImage:IconWarning#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAx0lEQVR4XpWSMQ7CMAxFf4xAyBMLCxMrO8dhaBcuwdCJS3RJBw7SA/QGTCxdWJgiQYWKXJWKIXHIlyw5lqr34tQgEOdcBsCOx5yZK3hCCKdYXneQkh4pEfqzLfu+wVDSyyzFoJjfz9NB+pAF+eizx2Vruts0k15mPgvS6GYvpVtQhB61IB/dk6AF6fS4Ben0uIX5odtFe8Q/eW1KvFeH4e8khT6+gm5B+t3juyDt7n0jpe+CANTd+oTUjN/U3yVaABnSUjFz/gFq44JaVSCXeQAAAABJRU5ErkJggg==);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Error icon encoded */
|
||||||
|
.IconErrorEncoded
|
||||||
|
{
|
||||||
|
/* Note: Do not delete the comment below. It is used to verify the correctness of the encoded image resource below before the product is released */
|
||||||
|
/* [---XsltValidateInternal-Base64EncodedImage:IconError#Begin#background-image: url(data:image/png;base64,#Separator#);#End#] */
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABQElEQVR4XqWTvUoEQRCE6wYPZUA80AfwAQz23uCMjA7MDRQEIzPBVEyNTQUFIw00vcQTTMzuAh/AxEQQT8HF/3G/oGGnEUGuoNnd6qoZuqltyKEsyzVJq5I6rnUp6SjGeGhESikzzlc1eL7opfuVbrqbU1Zw9NCgtQMaZpY0eNnaaL2fHusvTK5vKu7sjSS1Y4y3QUA6K3e3Mau5UFDyMP7tYF9o8cAHZv68vipoIJg971PZIZ5HiwdvYGGvFVFHmGmZ2MxwmQYPXubPl9Up0tfoMQGetXd6mRbvhBw+boZ6WF7Mbv1+GsHRk0fQmPAH1GfmZirbCfDJ61tw3Px8/8pZsPAG4jlVhcPgZ7adwNWBB68lkRQWFiTgFlbnLY3DGGM7izIJIyT/jjIvEJw6fdJTc6krDzh6aMwMP9bvDH4ADSsa9uSWVJkAAAAASUVORK5CYII=);
|
||||||
|
}
|
||||||
|
</style><script type="text/javascript" language="javascript">
|
||||||
|
|
||||||
|
// Startup
|
||||||
|
// Hook up the the loaded event for the document/window, to linkify the document content
|
||||||
|
var startupFunction = function() { linkifyElement("messages"); };
|
||||||
|
|
||||||
|
if(window.attachEvent)
|
||||||
|
{
|
||||||
|
window.attachEvent('onload', startupFunction);
|
||||||
|
}
|
||||||
|
else if (window.addEventListener)
|
||||||
|
{
|
||||||
|
window.addEventListener('load', startupFunction, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
document.addEventListener('load', startupFunction, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggles the visibility of table rows with the specified name
|
||||||
|
function toggleTableRowsByName(name)
|
||||||
|
{
|
||||||
|
var allRows = document.getElementsByTagName('tr');
|
||||||
|
for (i=0; i < allRows.length; i++)
|
||||||
|
{
|
||||||
|
var currentName = allRows[i].getAttribute('name');
|
||||||
|
if(!!currentName && currentName.indexOf(name) == 0)
|
||||||
|
{
|
||||||
|
var isVisible = allRows[i].style.display == '';
|
||||||
|
isVisible ? allRows[i].style.display = 'none' : allRows[i].style.display = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrollToFirstVisibleRow(name)
|
||||||
|
{
|
||||||
|
var allRows = document.getElementsByTagName('tr');
|
||||||
|
for (i=0; i < allRows.length; i++)
|
||||||
|
{
|
||||||
|
var currentName = allRows[i].getAttribute('name');
|
||||||
|
var isVisible = allRows[i].style.display == '';
|
||||||
|
if(!!currentName && currentName.indexOf(name) == 0 && isVisible)
|
||||||
|
{
|
||||||
|
allRows[i].scrollIntoView(true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linkifies the specified text content, replaces candidate links with html links
|
||||||
|
function linkify(text)
|
||||||
|
{
|
||||||
|
if(!text || 0 === text.length)
|
||||||
|
{
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find http, https and ftp links and replace them with hyper links
|
||||||
|
var urlLink = /(http|https|ftp)\:\/\/[a-zA-Z0-9\-\.]+(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9\-\._\?\,\/\\\+&%\$#\=~;\{\}])*/gi;
|
||||||
|
|
||||||
|
return text.replace(urlLink, '<a href="$&">$&</a>') ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Linkifies the specified element by ID
|
||||||
|
function linkifyElement(id)
|
||||||
|
{
|
||||||
|
var element = document.getElementById(id);
|
||||||
|
if(!!element)
|
||||||
|
{
|
||||||
|
element.innerHTML = linkify(element.innerHTML);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ToggleMessageVisibility(projectName)
|
||||||
|
{
|
||||||
|
if(!projectName || 0 === projectName.length)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleTableRowsByName("MessageRowClass" + projectName);
|
||||||
|
toggleTableRowsByName('MessageRowHeaderShow' + projectName);
|
||||||
|
toggleTableRowsByName('MessageRowHeaderHide' + projectName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ScrollToFirstVisibleMessage(projectName)
|
||||||
|
{
|
||||||
|
if(!projectName || 0 === projectName.length)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// First try the 'Show messages' row
|
||||||
|
if(!scrollToFirstVisibleRow('MessageRowHeaderShow' + projectName))
|
||||||
|
{
|
||||||
|
// Failed to find a visible row for 'Show messages', try an actual message row
|
||||||
|
scrollToFirstVisibleRow('MessageRowClass' + projectName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script></head><body><h1 _locID="ConversionReport">
|
||||||
|
Informe de migración - </h1><div id="content"><h2 _locID="OverviewTitle">Información general</h2><div id="overview"><table><tr><th></th><th _locID="ProjectTableHeader">Proyecto</th><th _locID="PathTableHeader">Ruta de acceso</th><th _locID="ErrorsTableHeader">Errores</th><th _locID="WarningsTableHeader">Advertencias</th><th _locID="MessagesTableHeader">Mensajes</th></tr><tr><td class="IconWarningEncoded" /><td><strong><a href="#Solution"><span _locID="OverviewSolutionSpan">Solución</span></a></strong></td><td>App_radio.slnx</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#SolutionWarning">1</a></td><td class="textCentered"><a href="#" onclick="ScrollToFirstVisibleMessage('Solution'); return false;">2</a></td></tr><tr><td class="IconSuccessEncoded" /><td><strong><a href="#App_radio">App_radio</a></strong></td><td>App_radio.csproj</td><td class="textCentered"><a>0</a></td><td class="textCentered"><a>0</a></td><td class="textCentered"><a href="#">0</a></td></tr></table></div><h2 _locID="SolutionAndProjectsTitle">Solución y proyectos</h2><div id="messages"><a name="Solution" /><h3 _locID="ProjectDisplayNameHeader">Solución</h3><table><tr id="SolutionHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">Mensaje</th></tr><tr name="WarningRowClassSolution"><td class="IconWarningEncoded"><a name="SolutionWarning" /></td><td class="messageCell"><strong>App_radio.slnx:
|
||||||
|
</strong><span>Visual Studio debe hacer cambios no funcionales en este proyecto para poder abrirlo en versiones posteriores a Visual Studio 2010 SP1 sin que su comportamiento se vea afectado.</span></td></tr><tr name="MessageRowHeaderShowSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="ShowAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
|
||||||
|
Mostrar 2 mensajes adicionales
|
||||||
|
</a></td></tr><tr name="MessageRowClassSolution" style="display: none"><td class="IconInfoEncoded"><a name="SolutionMessage" /></td><td class="messageCell"><strong>App_radio.slnx:
|
||||||
|
</strong><span>Se realizó correctamente la copia de seguridad del archivo C:\Users\alvar\Desktop\Pruebas\App_radio\Backup\App_radio.slnx</span></td></tr><tr name="MessageRowClassSolution" style="display: none"><td class="IconInfoEncoded"><a name="SolutionMessage" /></td><td class="messageCell"><strong>App_radio.slnx:
|
||||||
|
</strong><span>La solución se migró correctamente</span></td></tr><tr style="display: none" name="MessageRowHeaderHideSolution"><td class="IconInfoEncoded" /><td class="messageCell"><a _locID="HideAdditionalMessages" href="#" name="SolutionMessage" onclick="ToggleMessageVisibility('Solution'); return false;">
|
||||||
|
Ocultar 2 mensajes adicionales
|
||||||
|
</a></td></tr></table><a name="App_radio" /><h3>App_radio</h3><table><tr id="App_radioHeaderRow"><th></th><th class="messageCell" _locID="MessageTableHeader">Mensaje</th></tr><tr><td class="IconInfoEncoded" /><td class="messageCell" _locID="NoMessagesRow">App_radio no registró mensajes.
|
||||||
|
</td></tr></table></div></div></body></html>
|
||||||
470
Radio/App_radio/bin/Debug/net10.0-windows/App_radio.deps.json
Normal file
470
Radio/App_radio/bin/Debug/net10.0-windows/App_radio.deps.json
Normal file
|
|
@ -0,0 +1,470 @@
|
||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v10.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v10.0": {
|
||||||
|
"App_radio/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio": "2.3.0",
|
||||||
|
"System.IO.Ports": "10.0.9"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"App_radio.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Asio": "2.3.0",
|
||||||
|
"NAudio.Core": "2.3.0",
|
||||||
|
"NAudio.Midi": "2.3.0",
|
||||||
|
"NAudio.Wasapi": "2.3.0",
|
||||||
|
"NAudio.WinForms": "2.3.0",
|
||||||
|
"NAudio.WinMM": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0-windows7.0/NAudio.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.Asio/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Core": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0-windows7.0/NAudio.Asio.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.Core/2.3.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/NAudio.Core.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.Midi/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Core": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/NAudio.Midi.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.Wasapi/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Core": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/NAudio.Wasapi.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.WinForms/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.WinMM": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/NAudio.WinForms.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.WinMM/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Core": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/NAudio.WinMM.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.android-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/android-arm/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "android-arm",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.android-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/android-arm64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "android-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.android-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/android-x64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "android-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.android-x86.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/android-x86/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "android-x86",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-arm/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-arm",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-arm64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-bionic-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-bionic-arm64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-bionic-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-bionic-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-bionic-x64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-bionic-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-musl-arm/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-musl-arm",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-musl-arm64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-musl-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-musl-x64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-musl-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-x64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.maccatalyst-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/maccatalyst-arm64/native/libSystem.IO.Ports.Native.dylib": {
|
||||||
|
"rid": "maccatalyst-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.maccatalyst-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/maccatalyst-x64/native/libSystem.IO.Ports.Native.dylib": {
|
||||||
|
"rid": "maccatalyst-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"dependencies": {
|
||||||
|
"runtime.android-arm.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.android-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.android-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.android-x86.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-arm.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-bionic-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-bionic-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-musl-arm.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-musl-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-musl-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.maccatalyst-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.maccatalyst-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.osx-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.osx-x64.runtime.native.System.IO.Ports": "10.0.9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.osx-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/osx-arm64/native/libSystem.IO.Ports.Native.dylib": {
|
||||||
|
"rid": "osx-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.osx-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/osx-x64/native/libSystem.IO.Ports.Native.dylib": {
|
||||||
|
"rid": "osx-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.IO.Ports/10.0.9": {
|
||||||
|
"dependencies": {
|
||||||
|
"runtime.native.System.IO.Ports": "10.0.9"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net10.0/System.IO.Ports.dll": {
|
||||||
|
"assemblyVersion": "10.0.0.9",
|
||||||
|
"fileVersion": "10.0.926.27113"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/unix/lib/net10.0/System.IO.Ports.dll": {
|
||||||
|
"rid": "unix",
|
||||||
|
"assetType": "runtime",
|
||||||
|
"assemblyVersion": "10.0.0.9",
|
||||||
|
"fileVersion": "10.0.926.27113"
|
||||||
|
},
|
||||||
|
"runtimes/win/lib/net10.0/System.IO.Ports.dll": {
|
||||||
|
"rid": "win",
|
||||||
|
"assetType": "runtime",
|
||||||
|
"assemblyVersion": "10.0.0.9",
|
||||||
|
"fileVersion": "10.0.926.27113"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"App_radio/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"NAudio/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-xN+Lzlu9DmXqBiL6XkP0VZmgTxZPdSGjVSWtKG9HKuar3LhIYNOIYQETieigS+QDS+nrs1QmHbBWWOru0nWA5A==",
|
||||||
|
"path": "naudio/2.3.0",
|
||||||
|
"hashPath": "naudio.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.Asio/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-I+rAAPT8vmSEw4d4ie+AoSkrvNK6ylRrXznnjQKS+qZgTA9Jnt1Pxe0EaU8nXxOOq5h8ucBSWccBEw6I/J0nkQ==",
|
||||||
|
"path": "naudio.asio/2.3.0",
|
||||||
|
"hashPath": "naudio.asio.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.Core/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-jMd7r6dB6tAtXhOYL58ntPqwERNm1/Rhw5MKOIYvsnXzuX+PTGsa2VMam6n0npZYSwlSidKa4GAm4bFcXFUlcg==",
|
||||||
|
"path": "naudio.core/2.3.0",
|
||||||
|
"hashPath": "naudio.core.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.Midi/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-t8wvPFPHHQOHhoNMCaDE8OiYZoJuxmY4H6UPBtmnf+xx7oQuajFCqlG4Q00ID+tiEyj471WeVb4Nkylr4tDoow==",
|
||||||
|
"path": "naudio.midi/2.3.0",
|
||||||
|
"hashPath": "naudio.midi.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.Wasapi/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-y5K2BxrLnvohgu5znzg5wRsai3YcuNXfrpo68i7PmCQqpK5MC/R24e5aO3OyN/XhfRr12e0QYV0OnUWEHi5SzA==",
|
||||||
|
"path": "naudio.wasapi/2.3.0",
|
||||||
|
"hashPath": "naudio.wasapi.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.WinForms/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vyKqFUlAZrZ0QPcCM1T+zimjYgC1cNDloHaiOdtV4S1eK4AGu3Dz1EE4yy/WgcneJwQNjGFaELY7b2TsL+g56w==",
|
||||||
|
"path": "naudio.winforms/2.3.0",
|
||||||
|
"hashPath": "naudio.winforms.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.WinMM/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-5G1dRjsZm50T3luyuqcmI2BSvj3K4ZJaD/x776/0Epj88qOsOryDZG40+MufwIk1UFJSFWhRobBqtJYFc8Ss4g==",
|
||||||
|
"path": "naudio.winmm/2.3.0",
|
||||||
|
"hashPath": "naudio.winmm.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.android-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-7QwWCqZ4hRpmSySAFslZD5oFhV8ib/FhO2eGgPrImEI3V8U5P1FtIc5M4pB+5xOBfzW5VzjmItKFezkB8MGDqw==",
|
||||||
|
"path": "runtime.android-arm.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.android-arm.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.android-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-mOZanUMgwxreyyoZRHaeLbfaevCgaadM4RafsRclY0I+cwV/QbYhzjELYc6C68acd+4z/Fj9zh66u6nu3evP0A==",
|
||||||
|
"path": "runtime.android-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.android-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.android-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-rUvnhurQfEkaduyDlESUgttOjAjMniC38B9IMVfx2480OvBWzhy5vzvcg2WIlTCJErb4sCN+QTzhHBpOYFRoxw==",
|
||||||
|
"path": "runtime.android-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.android-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.android-x86.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ykG02K8zQqj8VcWfyjsvG9+lT2ODaqjF17Sid2/s7Kgp+ugn9eh4V2FZpzV0qa+JfVH5eohB4JaF7K/XpdTHCQ==",
|
||||||
|
"path": "runtime.android-x86.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.android-x86.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-DHRGpEI+51UCQR74jrkA30s7luDaUw3NC4Jp3MNLTnseuCVTRQ5ocbjpApt7mM9quoP7YZKMG+iUA+xJ6yJW8Q==",
|
||||||
|
"path": "runtime.linux-arm.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-arm.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-G67fx6Vv/z5DFvfa5MiqAa9lONQv0d+WGxICW+Nvp+LNA6iJvv4j6/GTjGXtK44T/n+8sYk9dho7pKtuCoMZWQ==",
|
||||||
|
"path": "runtime.linux-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-bionic-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-E08Eipi4Iiq3+JV/mpNxS+loN68ZJlrlaHCfiXmUL3Qlcpq9slGXyw5N97v4nL9dzpCIBnLstQEFC32HTpCduw==",
|
||||||
|
"path": "runtime.linux-bionic-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-bionic-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-bionic-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FaATvKgabe3xHU9aYnj2h4Pp4DeY91SwMmHdv4/+Wmzp6fqwGT25xCNBzJ2FOHEdJLNO52raXcL3Xwo2/eLXKg==",
|
||||||
|
"path": "runtime.linux-bionic-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-bionic-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-OsROr3mGvkb4U/cizz5s3y+Oa8OBjGCCo8QWEmuUEdM40wp0JbWMEwaqOmScxVCZNzobHHfHeuX/o3oTGj3OmA==",
|
||||||
|
"path": "runtime.linux-musl-arm.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-musl-arm.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vDGYpx/8dAAMlJccGLCWLaJ20AzASKax33suoHw7s/alEjwYp1mpD6Vso4qbX5QJLonE+lnx3vfB+maKV4CtAA==",
|
||||||
|
"path": "runtime.linux-musl-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-musl-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-JwGn9azjl7+AuwzgEdeJLghTcK8nCqKCf7h/gq7Pzi2HMuv6D2EBzDZpl95qKkdBCT6bsWdv3flZQJZf2uY2ew==",
|
||||||
|
"path": "runtime.linux-musl-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-musl-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-01ppayPym92n42VR74iSt/MNw5UoltX0tQOVvA5P0bUszvtDRPkAM5SEkujIVBs6+kERZ2OgZN8mMDPJKTfh2Q==",
|
||||||
|
"path": "runtime.linux-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.maccatalyst-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-z9OvFgFoV9jScx7pmjasXvmixG8qK8QdN3fcsP2TptMbfU+/4bz/SKjpgw3MRROJcfiTQWdJE4Cdx4vG86bulA==",
|
||||||
|
"path": "runtime.maccatalyst-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.maccatalyst-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.maccatalyst-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-45LNikgDcVaFWkVxUr1h5ZaM6o0LT05TdKzmFI1OnZIEaT4/yWJukrouzsEZfm2kyN05EA/U686HSnuqMS7+6A==",
|
||||||
|
"path": "runtime.maccatalyst-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.maccatalyst-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-PoZf6+MaLVHqj37ozGdAc98w+UtwGLJGqQ4QeKT+qvQaX9EqpKmrhmImoGI68wrkJkRbwGCP1jIsFKpMu4iBKg==",
|
||||||
|
"path": "runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.osx-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-fW857DfzCX6QsEuVH1/WohiHh1BphhHcGsjpLX5h3sgm0Y67QVWijykrJSZC4Ct9Gfm40pfmSo+L53deIQ9MZQ==",
|
||||||
|
"path": "runtime.osx-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.osx-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.osx-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-Ugf+Hlb6dJB1tXLZqU/q4iXclQ/lojiJWtLCFqmRiE2bXA8fOnUHz9U40dJxHdqPO9BEyfzWEliRCUtZCblNmQ==",
|
||||||
|
"path": "runtime.osx-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.osx-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-JHijtblIg7c1wCxBtuPjqWK+BxTlO0qTE3Y5PSety2NGkZRL5LFL6JoabbGebmO1PuOtUqlvAc+6hbLvlLSTqQ==",
|
||||||
|
"path": "system.io.ports/10.0.9",
|
||||||
|
"hashPath": "system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Radio/App_radio/bin/Debug/net10.0-windows/App_radio.dll
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/App_radio.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Debug/net10.0-windows/App_radio.exe
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/App_radio.exe
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Debug/net10.0-windows/App_radio.pdb
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/App_radio.pdb
Normal file
Binary file not shown.
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"runtimeOptions": {
|
||||||
|
"tfm": "net10.0",
|
||||||
|
"frameworks": [
|
||||||
|
{
|
||||||
|
"name": "Microsoft.NETCore.App",
|
||||||
|
"version": "10.0.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Microsoft.WindowsDesktop.App",
|
||||||
|
"version": "10.0.0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configProperties": {
|
||||||
|
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
|
||||||
|
"CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.Asio.dll
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.Asio.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.Core.dll
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.Core.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.Midi.dll
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.Midi.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.Wasapi.dll
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.Wasapi.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.WinForms.dll
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.WinForms.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.WinMM.dll
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.WinMM.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.dll
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/NAudio.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Debug/net10.0-windows/System.IO.Ports.dll
Normal file
BIN
Radio/App_radio/bin/Debug/net10.0-windows/System.IO.Ports.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
470
Radio/App_radio/bin/Release/net10.0-windows/App_radio.deps.json
Normal file
470
Radio/App_radio/bin/Release/net10.0-windows/App_radio.deps.json
Normal file
|
|
@ -0,0 +1,470 @@
|
||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v10.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v10.0": {
|
||||||
|
"App_radio/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio": "2.3.0",
|
||||||
|
"System.IO.Ports": "10.0.9"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"App_radio.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Asio": "2.3.0",
|
||||||
|
"NAudio.Core": "2.3.0",
|
||||||
|
"NAudio.Midi": "2.3.0",
|
||||||
|
"NAudio.Wasapi": "2.3.0",
|
||||||
|
"NAudio.WinForms": "2.3.0",
|
||||||
|
"NAudio.WinMM": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0-windows7.0/NAudio.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.Asio/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Core": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net8.0-windows7.0/NAudio.Asio.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.Core/2.3.0": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/NAudio.Core.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.Midi/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Core": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/NAudio.Midi.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.Wasapi/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Core": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/NAudio.Wasapi.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.WinForms/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.WinMM": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netcoreapp3.1/NAudio.WinForms.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NAudio.WinMM/2.3.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio.Core": "2.3.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net6.0/NAudio.WinMM.dll": {
|
||||||
|
"assemblyVersion": "2.3.0.0",
|
||||||
|
"fileVersion": "2.3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.android-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/android-arm/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "android-arm",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.android-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/android-arm64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "android-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.android-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/android-x64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "android-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.android-x86.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/android-x86/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "android-x86",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-arm/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-arm",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-arm64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-bionic-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-bionic-arm64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-bionic-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-bionic-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-bionic-x64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-bionic-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-musl-arm/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-musl-arm",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-musl-arm64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-musl-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-musl-x64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-musl-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.linux-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/linux-x64/native/libSystem.IO.Ports.Native.so": {
|
||||||
|
"rid": "linux-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.maccatalyst-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/maccatalyst-arm64/native/libSystem.IO.Ports.Native.dylib": {
|
||||||
|
"rid": "maccatalyst-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.maccatalyst-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/maccatalyst-x64/native/libSystem.IO.Ports.Native.dylib": {
|
||||||
|
"rid": "maccatalyst-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"dependencies": {
|
||||||
|
"runtime.android-arm.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.android-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.android-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.android-x86.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-arm.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-bionic-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-bionic-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-musl-arm.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-musl-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-musl-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.linux-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.maccatalyst-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.maccatalyst-x64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.osx-arm64.runtime.native.System.IO.Ports": "10.0.9",
|
||||||
|
"runtime.osx-x64.runtime.native.System.IO.Ports": "10.0.9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.osx-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/osx-arm64/native/libSystem.IO.Ports.Native.dylib": {
|
||||||
|
"rid": "osx-arm64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtime.osx-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/osx-x64/native/libSystem.IO.Ports.Native.dylib": {
|
||||||
|
"rid": "osx-x64",
|
||||||
|
"assetType": "native",
|
||||||
|
"fileVersion": "0.0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.IO.Ports/10.0.9": {
|
||||||
|
"dependencies": {
|
||||||
|
"runtime.native.System.IO.Ports": "10.0.9"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/net10.0/System.IO.Ports.dll": {
|
||||||
|
"assemblyVersion": "10.0.0.9",
|
||||||
|
"fileVersion": "10.0.926.27113"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeTargets": {
|
||||||
|
"runtimes/unix/lib/net10.0/System.IO.Ports.dll": {
|
||||||
|
"rid": "unix",
|
||||||
|
"assetType": "runtime",
|
||||||
|
"assemblyVersion": "10.0.0.9",
|
||||||
|
"fileVersion": "10.0.926.27113"
|
||||||
|
},
|
||||||
|
"runtimes/win/lib/net10.0/System.IO.Ports.dll": {
|
||||||
|
"rid": "win",
|
||||||
|
"assetType": "runtime",
|
||||||
|
"assemblyVersion": "10.0.0.9",
|
||||||
|
"fileVersion": "10.0.926.27113"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"App_radio/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"NAudio/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-xN+Lzlu9DmXqBiL6XkP0VZmgTxZPdSGjVSWtKG9HKuar3LhIYNOIYQETieigS+QDS+nrs1QmHbBWWOru0nWA5A==",
|
||||||
|
"path": "naudio/2.3.0",
|
||||||
|
"hashPath": "naudio.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.Asio/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-I+rAAPT8vmSEw4d4ie+AoSkrvNK6ylRrXznnjQKS+qZgTA9Jnt1Pxe0EaU8nXxOOq5h8ucBSWccBEw6I/J0nkQ==",
|
||||||
|
"path": "naudio.asio/2.3.0",
|
||||||
|
"hashPath": "naudio.asio.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.Core/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-jMd7r6dB6tAtXhOYL58ntPqwERNm1/Rhw5MKOIYvsnXzuX+PTGsa2VMam6n0npZYSwlSidKa4GAm4bFcXFUlcg==",
|
||||||
|
"path": "naudio.core/2.3.0",
|
||||||
|
"hashPath": "naudio.core.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.Midi/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-t8wvPFPHHQOHhoNMCaDE8OiYZoJuxmY4H6UPBtmnf+xx7oQuajFCqlG4Q00ID+tiEyj471WeVb4Nkylr4tDoow==",
|
||||||
|
"path": "naudio.midi/2.3.0",
|
||||||
|
"hashPath": "naudio.midi.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.Wasapi/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-y5K2BxrLnvohgu5znzg5wRsai3YcuNXfrpo68i7PmCQqpK5MC/R24e5aO3OyN/XhfRr12e0QYV0OnUWEHi5SzA==",
|
||||||
|
"path": "naudio.wasapi/2.3.0",
|
||||||
|
"hashPath": "naudio.wasapi.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.WinForms/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vyKqFUlAZrZ0QPcCM1T+zimjYgC1cNDloHaiOdtV4S1eK4AGu3Dz1EE4yy/WgcneJwQNjGFaELY7b2TsL+g56w==",
|
||||||
|
"path": "naudio.winforms/2.3.0",
|
||||||
|
"hashPath": "naudio.winforms.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NAudio.WinMM/2.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-5G1dRjsZm50T3luyuqcmI2BSvj3K4ZJaD/x776/0Epj88qOsOryDZG40+MufwIk1UFJSFWhRobBqtJYFc8Ss4g==",
|
||||||
|
"path": "naudio.winmm/2.3.0",
|
||||||
|
"hashPath": "naudio.winmm.2.3.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.android-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-7QwWCqZ4hRpmSySAFslZD5oFhV8ib/FhO2eGgPrImEI3V8U5P1FtIc5M4pB+5xOBfzW5VzjmItKFezkB8MGDqw==",
|
||||||
|
"path": "runtime.android-arm.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.android-arm.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.android-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-mOZanUMgwxreyyoZRHaeLbfaevCgaadM4RafsRclY0I+cwV/QbYhzjELYc6C68acd+4z/Fj9zh66u6nu3evP0A==",
|
||||||
|
"path": "runtime.android-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.android-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.android-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-rUvnhurQfEkaduyDlESUgttOjAjMniC38B9IMVfx2480OvBWzhy5vzvcg2WIlTCJErb4sCN+QTzhHBpOYFRoxw==",
|
||||||
|
"path": "runtime.android-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.android-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.android-x86.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ykG02K8zQqj8VcWfyjsvG9+lT2ODaqjF17Sid2/s7Kgp+ugn9eh4V2FZpzV0qa+JfVH5eohB4JaF7K/XpdTHCQ==",
|
||||||
|
"path": "runtime.android-x86.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.android-x86.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-DHRGpEI+51UCQR74jrkA30s7luDaUw3NC4Jp3MNLTnseuCVTRQ5ocbjpApt7mM9quoP7YZKMG+iUA+xJ6yJW8Q==",
|
||||||
|
"path": "runtime.linux-arm.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-arm.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-G67fx6Vv/z5DFvfa5MiqAa9lONQv0d+WGxICW+Nvp+LNA6iJvv4j6/GTjGXtK44T/n+8sYk9dho7pKtuCoMZWQ==",
|
||||||
|
"path": "runtime.linux-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-bionic-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-E08Eipi4Iiq3+JV/mpNxS+loN68ZJlrlaHCfiXmUL3Qlcpq9slGXyw5N97v4nL9dzpCIBnLstQEFC32HTpCduw==",
|
||||||
|
"path": "runtime.linux-bionic-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-bionic-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-bionic-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-FaATvKgabe3xHU9aYnj2h4Pp4DeY91SwMmHdv4/+Wmzp6fqwGT25xCNBzJ2FOHEdJLNO52raXcL3Xwo2/eLXKg==",
|
||||||
|
"path": "runtime.linux-bionic-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-bionic-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-arm.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-OsROr3mGvkb4U/cizz5s3y+Oa8OBjGCCo8QWEmuUEdM40wp0JbWMEwaqOmScxVCZNzobHHfHeuX/o3oTGj3OmA==",
|
||||||
|
"path": "runtime.linux-musl-arm.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-musl-arm.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-vDGYpx/8dAAMlJccGLCWLaJ20AzASKax33suoHw7s/alEjwYp1mpD6Vso4qbX5QJLonE+lnx3vfB+maKV4CtAA==",
|
||||||
|
"path": "runtime.linux-musl-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-musl-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-musl-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-JwGn9azjl7+AuwzgEdeJLghTcK8nCqKCf7h/gq7Pzi2HMuv6D2EBzDZpl95qKkdBCT6bsWdv3flZQJZf2uY2ew==",
|
||||||
|
"path": "runtime.linux-musl-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-musl-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.linux-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-01ppayPym92n42VR74iSt/MNw5UoltX0tQOVvA5P0bUszvtDRPkAM5SEkujIVBs6+kERZ2OgZN8mMDPJKTfh2Q==",
|
||||||
|
"path": "runtime.linux-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.linux-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.maccatalyst-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-z9OvFgFoV9jScx7pmjasXvmixG8qK8QdN3fcsP2TptMbfU+/4bz/SKjpgw3MRROJcfiTQWdJE4Cdx4vG86bulA==",
|
||||||
|
"path": "runtime.maccatalyst-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.maccatalyst-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.maccatalyst-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-45LNikgDcVaFWkVxUr1h5ZaM6o0LT05TdKzmFI1OnZIEaT4/yWJukrouzsEZfm2kyN05EA/U686HSnuqMS7+6A==",
|
||||||
|
"path": "runtime.maccatalyst-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.maccatalyst-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-PoZf6+MaLVHqj37ozGdAc98w+UtwGLJGqQ4QeKT+qvQaX9EqpKmrhmImoGI68wrkJkRbwGCP1jIsFKpMu4iBKg==",
|
||||||
|
"path": "runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.osx-arm64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-fW857DfzCX6QsEuVH1/WohiHh1BphhHcGsjpLX5h3sgm0Y67QVWijykrJSZC4Ct9Gfm40pfmSo+L53deIQ9MZQ==",
|
||||||
|
"path": "runtime.osx-arm64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.osx-arm64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"runtime.osx-x64.runtime.native.System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-Ugf+Hlb6dJB1tXLZqU/q4iXclQ/lojiJWtLCFqmRiE2bXA8fOnUHz9U40dJxHdqPO9BEyfzWEliRCUtZCblNmQ==",
|
||||||
|
"path": "runtime.osx-x64.runtime.native.system.io.ports/10.0.9",
|
||||||
|
"hashPath": "runtime.osx-x64.runtime.native.system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"System.IO.Ports/10.0.9": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-JHijtblIg7c1wCxBtuPjqWK+BxTlO0qTE3Y5PSety2NGkZRL5LFL6JoabbGebmO1PuOtUqlvAc+6hbLvlLSTqQ==",
|
||||||
|
"path": "system.io.ports/10.0.9",
|
||||||
|
"hashPath": "system.io.ports.10.0.9.nupkg.sha512"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Radio/App_radio/bin/Release/net10.0-windows/App_radio.dll
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/App_radio.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Release/net10.0-windows/App_radio.exe
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/App_radio.exe
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Release/net10.0-windows/App_radio.pdb
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/App_radio.pdb
Normal file
Binary file not shown.
|
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"runtimeOptions": {
|
||||||
|
"tfm": "net10.0",
|
||||||
|
"frameworks": [
|
||||||
|
{
|
||||||
|
"name": "Microsoft.NETCore.App",
|
||||||
|
"version": "10.0.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Microsoft.WindowsDesktop.App",
|
||||||
|
"version": "10.0.0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"configProperties": {
|
||||||
|
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
|
||||||
|
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
|
||||||
|
"CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.Asio.dll
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.Asio.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.Core.dll
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.Core.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.Midi.dll
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.Midi.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.Wasapi.dll
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.Wasapi.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.WinForms.dll
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.WinForms.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.WinMM.dll
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.WinMM.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.dll
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/NAudio.dll
Normal file
Binary file not shown.
BIN
Radio/App_radio/bin/Release/net10.0-windows/System.IO.Ports.dll
Normal file
BIN
Radio/App_radio/bin/Release/net10.0-windows/System.IO.Ports.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
374
Radio/App_radio/obj/App_radio.csproj.nuget.dgspec.json
Normal file
374
Radio/App_radio/obj/App_radio.csproj.nuget.dgspec.json
Normal file
|
|
@ -0,0 +1,374 @@
|
||||||
|
{
|
||||||
|
"format": 1,
|
||||||
|
"restore": {
|
||||||
|
"C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\App_radio.csproj": {}
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\App_radio.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\App_radio.csproj",
|
||||||
|
"projectName": "App_radio",
|
||||||
|
"projectPath": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\App_radio.csproj",
|
||||||
|
"packagesPath": "C:\\Users\\alvar\\.nuget\\packages\\",
|
||||||
|
"outputPath": "C:\\Users\\alvar\\Desktop\\Barcelona_software\\AARadio_bluetooth\\App_radio\\obj\\",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"C:\\Users\\alvar\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||||
|
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net10.0-windows"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net10.0-windows": {
|
||||||
|
"framework": "net10.0-windows7.0",
|
||||||
|
"targetAlias": "net10.0-windows",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"restoreAuditProperties": {
|
||||||
|
"enableAudit": "true",
|
||||||
|
"auditLevel": "low",
|
||||||
|
"auditMode": "all"
|
||||||
|
},
|
||||||
|
"SdkAnalysisLevel": "10.0.300"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net10.0-windows": {
|
||||||
|
"framework": "net10.0-windows7.0",
|
||||||
|
"targetAlias": "net10.0-windows",
|
||||||
|
"dependencies": {
|
||||||
|
"NAudio": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2.3.0, )"
|
||||||
|
},
|
||||||
|
"System.IO.Ports": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[10.0.9, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48",
|
||||||
|
"net481"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
},
|
||||||
|
"Microsoft.WindowsDesktop.App.WindowsForms": {
|
||||||
|
"privateAssets": "none"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.302/PortableRuntimeIdentifierGraph.json",
|
||||||
|
"packagesToPrune": {
|
||||||
|
"Microsoft.CSharp": "(,4.7.32767]",
|
||||||
|
"Microsoft.VisualBasic": "(,10.4.32767]",
|
||||||
|
"Microsoft.Win32.Primitives": "(,4.3.32767]",
|
||||||
|
"Microsoft.Win32.Registry": "(,5.0.32767]",
|
||||||
|
"Microsoft.Win32.Registry.AccessControl": "(,10.0.32767]",
|
||||||
|
"Microsoft.Win32.SystemEvents": "(,10.0.32767]",
|
||||||
|
"runtime.any.System.Collections": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Diagnostics.Tools": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Globalization": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Globalization.Calendars": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.IO": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Reflection": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Reflection.Extensions": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Reflection.Primitives": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Resources.ResourceManager": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Runtime": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Runtime.Handles": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Runtime.InteropServices": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Text.Encoding": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Threading.Tasks": "(,4.3.32767]",
|
||||||
|
"runtime.any.System.Threading.Timer": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Collections": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Globalization": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Globalization.Calendars": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.IO": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Reflection": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Reflection.Extensions": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Reflection.Primitives": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Runtime": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Runtime.Handles": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Text.Encoding": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Threading.Tasks": "(,4.3.32767]",
|
||||||
|
"runtime.aot.System.Threading.Timer": "(,4.3.32767]",
|
||||||
|
"runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]",
|
||||||
|
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||||
|
"runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||||
|
"runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]",
|
||||||
|
"runtime.unix.System.Console": "(,4.3.32767]",
|
||||||
|
"runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]",
|
||||||
|
"runtime.unix.System.IO.FileSystem": "(,4.3.32767]",
|
||||||
|
"runtime.unix.System.Net.Primitives": "(,4.3.32767]",
|
||||||
|
"runtime.unix.System.Net.Sockets": "(,4.3.32767]",
|
||||||
|
"runtime.unix.System.Private.Uri": "(,4.3.32767]",
|
||||||
|
"runtime.unix.System.Runtime.Extensions": "(,4.3.32767]",
|
||||||
|
"runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]",
|
||||||
|
"runtime.win.System.Console": "(,4.3.32767]",
|
||||||
|
"runtime.win.System.Diagnostics.Debug": "(,4.3.32767]",
|
||||||
|
"runtime.win.System.IO.FileSystem": "(,4.3.32767]",
|
||||||
|
"runtime.win.System.Net.Primitives": "(,4.3.32767]",
|
||||||
|
"runtime.win.System.Net.Sockets": "(,4.3.32767]",
|
||||||
|
"runtime.win.System.Runtime.Extensions": "(,4.3.32767]",
|
||||||
|
"runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]",
|
||||||
|
"runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]",
|
||||||
|
"runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]",
|
||||||
|
"runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"runtime.win7.System.Private.Uri": "(,4.3.32767]",
|
||||||
|
"runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"System.AppContext": "(,4.3.32767]",
|
||||||
|
"System.Buffers": "(,5.0.32767]",
|
||||||
|
"System.CodeDom": "(,10.0.32767]",
|
||||||
|
"System.Collections": "(,4.3.32767]",
|
||||||
|
"System.Collections.Concurrent": "(,4.3.32767]",
|
||||||
|
"System.Collections.Immutable": "(,10.0.32767]",
|
||||||
|
"System.Collections.NonGeneric": "(,4.3.32767]",
|
||||||
|
"System.Collections.Specialized": "(,4.3.32767]",
|
||||||
|
"System.ComponentModel": "(,4.3.32767]",
|
||||||
|
"System.ComponentModel.Annotations": "(,4.3.32767]",
|
||||||
|
"System.ComponentModel.EventBasedAsync": "(,4.3.32767]",
|
||||||
|
"System.ComponentModel.Primitives": "(,4.3.32767]",
|
||||||
|
"System.ComponentModel.TypeConverter": "(,4.3.32767]",
|
||||||
|
"System.Configuration.ConfigurationManager": "(,10.0.32767]",
|
||||||
|
"System.Console": "(,4.3.32767]",
|
||||||
|
"System.Data.Common": "(,4.3.32767]",
|
||||||
|
"System.Data.DataSetExtensions": "(,4.4.32767]",
|
||||||
|
"System.Diagnostics.Contracts": "(,4.3.32767]",
|
||||||
|
"System.Diagnostics.Debug": "(,4.3.32767]",
|
||||||
|
"System.Diagnostics.DiagnosticSource": "(,10.0.32767]",
|
||||||
|
"System.Diagnostics.EventLog": "(,10.0.32767]",
|
||||||
|
"System.Diagnostics.FileVersionInfo": "(,4.3.32767]",
|
||||||
|
"System.Diagnostics.PerformanceCounter": "(,10.0.32767]",
|
||||||
|
"System.Diagnostics.Process": "(,4.3.32767]",
|
||||||
|
"System.Diagnostics.StackTrace": "(,4.3.32767]",
|
||||||
|
"System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]",
|
||||||
|
"System.Diagnostics.Tools": "(,4.3.32767]",
|
||||||
|
"System.Diagnostics.TraceSource": "(,4.3.32767]",
|
||||||
|
"System.Diagnostics.Tracing": "(,4.3.32767]",
|
||||||
|
"System.DirectoryServices": "(,10.0.32767]",
|
||||||
|
"System.Drawing.Common": "(,10.0.32767]",
|
||||||
|
"System.Drawing.Primitives": "(,4.3.32767]",
|
||||||
|
"System.Dynamic.Runtime": "(,4.3.32767]",
|
||||||
|
"System.Formats.Asn1": "(,10.0.32767]",
|
||||||
|
"System.Formats.Nrbf": "(,10.0.32767]",
|
||||||
|
"System.Formats.Tar": "(,10.0.32767]",
|
||||||
|
"System.Globalization": "(,4.3.32767]",
|
||||||
|
"System.Globalization.Calendars": "(,4.3.32767]",
|
||||||
|
"System.Globalization.Extensions": "(,4.3.32767]",
|
||||||
|
"System.IO": "(,4.3.32767]",
|
||||||
|
"System.IO.Compression": "(,4.3.32767]",
|
||||||
|
"System.IO.Compression.ZipFile": "(,4.3.32767]",
|
||||||
|
"System.IO.FileSystem": "(,4.3.32767]",
|
||||||
|
"System.IO.FileSystem.AccessControl": "(,4.4.32767]",
|
||||||
|
"System.IO.FileSystem.DriveInfo": "(,4.3.32767]",
|
||||||
|
"System.IO.FileSystem.Primitives": "(,4.3.32767]",
|
||||||
|
"System.IO.FileSystem.Watcher": "(,4.3.32767]",
|
||||||
|
"System.IO.IsolatedStorage": "(,4.3.32767]",
|
||||||
|
"System.IO.MemoryMappedFiles": "(,4.3.32767]",
|
||||||
|
"System.IO.Packaging": "(,10.0.32767]",
|
||||||
|
"System.IO.Pipelines": "(,10.0.32767]",
|
||||||
|
"System.IO.Pipes": "(,4.3.32767]",
|
||||||
|
"System.IO.Pipes.AccessControl": "(,5.0.32767]",
|
||||||
|
"System.IO.UnmanagedMemoryStream": "(,4.3.32767]",
|
||||||
|
"System.Linq": "(,4.3.32767]",
|
||||||
|
"System.Linq.AsyncEnumerable": "(,10.0.32767]",
|
||||||
|
"System.Linq.Expressions": "(,4.3.32767]",
|
||||||
|
"System.Linq.Parallel": "(,4.3.32767]",
|
||||||
|
"System.Linq.Queryable": "(,4.3.32767]",
|
||||||
|
"System.Memory": "(,5.0.32767]",
|
||||||
|
"System.Net.Http": "(,4.3.32767]",
|
||||||
|
"System.Net.Http.Json": "(,10.0.32767]",
|
||||||
|
"System.Net.NameResolution": "(,4.3.32767]",
|
||||||
|
"System.Net.NetworkInformation": "(,4.3.32767]",
|
||||||
|
"System.Net.Ping": "(,4.3.32767]",
|
||||||
|
"System.Net.Primitives": "(,4.3.32767]",
|
||||||
|
"System.Net.Requests": "(,4.3.32767]",
|
||||||
|
"System.Net.Security": "(,4.3.32767]",
|
||||||
|
"System.Net.ServerSentEvents": "(,10.0.32767]",
|
||||||
|
"System.Net.Sockets": "(,4.3.32767]",
|
||||||
|
"System.Net.WebHeaderCollection": "(,4.3.32767]",
|
||||||
|
"System.Net.WebSockets": "(,4.3.32767]",
|
||||||
|
"System.Net.WebSockets.Client": "(,4.3.32767]",
|
||||||
|
"System.Numerics.Vectors": "(,5.0.32767]",
|
||||||
|
"System.ObjectModel": "(,4.3.32767]",
|
||||||
|
"System.Private.DataContractSerialization": "(,4.3.32767]",
|
||||||
|
"System.Private.Uri": "(,4.3.32767]",
|
||||||
|
"System.Reflection": "(,4.3.32767]",
|
||||||
|
"System.Reflection.DispatchProxy": "(,6.0.32767]",
|
||||||
|
"System.Reflection.Emit": "(,4.7.32767]",
|
||||||
|
"System.Reflection.Emit.ILGeneration": "(,4.7.32767]",
|
||||||
|
"System.Reflection.Emit.Lightweight": "(,4.7.32767]",
|
||||||
|
"System.Reflection.Extensions": "(,4.3.32767]",
|
||||||
|
"System.Reflection.Metadata": "(,10.0.32767]",
|
||||||
|
"System.Reflection.Primitives": "(,4.3.32767]",
|
||||||
|
"System.Reflection.TypeExtensions": "(,4.3.32767]",
|
||||||
|
"System.Resources.Extensions": "(,10.0.32767]",
|
||||||
|
"System.Resources.Reader": "(,4.3.32767]",
|
||||||
|
"System.Resources.ResourceManager": "(,4.3.32767]",
|
||||||
|
"System.Resources.Writer": "(,4.3.32767]",
|
||||||
|
"System.Runtime": "(,4.3.32767]",
|
||||||
|
"System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]",
|
||||||
|
"System.Runtime.CompilerServices.VisualC": "(,4.3.32767]",
|
||||||
|
"System.Runtime.Extensions": "(,4.3.32767]",
|
||||||
|
"System.Runtime.Handles": "(,4.3.32767]",
|
||||||
|
"System.Runtime.InteropServices": "(,4.3.32767]",
|
||||||
|
"System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]",
|
||||||
|
"System.Runtime.Loader": "(,4.3.32767]",
|
||||||
|
"System.Runtime.Numerics": "(,4.3.32767]",
|
||||||
|
"System.Runtime.Serialization.Formatters": "(,4.3.32767]",
|
||||||
|
"System.Runtime.Serialization.Json": "(,4.3.32767]",
|
||||||
|
"System.Runtime.Serialization.Primitives": "(,4.3.32767]",
|
||||||
|
"System.Runtime.Serialization.Xml": "(,4.3.32767]",
|
||||||
|
"System.Security.AccessControl": "(,6.0.32767]",
|
||||||
|
"System.Security.Claims": "(,4.3.32767]",
|
||||||
|
"System.Security.Cryptography.Algorithms": "(,4.3.32767]",
|
||||||
|
"System.Security.Cryptography.Cng": "(,5.0.32767]",
|
||||||
|
"System.Security.Cryptography.Csp": "(,4.3.32767]",
|
||||||
|
"System.Security.Cryptography.Encoding": "(,4.3.32767]",
|
||||||
|
"System.Security.Cryptography.OpenSsl": "(,5.0.32767]",
|
||||||
|
"System.Security.Cryptography.Pkcs": "(,10.0.32767]",
|
||||||
|
"System.Security.Cryptography.Primitives": "(,4.3.32767]",
|
||||||
|
"System.Security.Cryptography.ProtectedData": "(,10.0.32767]",
|
||||||
|
"System.Security.Cryptography.X509Certificates": "(,4.3.32767]",
|
||||||
|
"System.Security.Cryptography.Xml": "(,10.0.32767]",
|
||||||
|
"System.Security.Permissions": "(,10.0.32767]",
|
||||||
|
"System.Security.Principal": "(,4.3.32767]",
|
||||||
|
"System.Security.Principal.Windows": "(,5.0.32767]",
|
||||||
|
"System.Security.SecureString": "(,4.3.32767]",
|
||||||
|
"System.Text.Encoding": "(,4.3.32767]",
|
||||||
|
"System.Text.Encoding.CodePages": "(,10.0.32767]",
|
||||||
|
"System.Text.Encoding.Extensions": "(,4.3.32767]",
|
||||||
|
"System.Text.Encodings.Web": "(,10.0.32767]",
|
||||||
|
"System.Text.Json": "(,10.0.32767]",
|
||||||
|
"System.Text.RegularExpressions": "(,4.3.32767]",
|
||||||
|
"System.Threading": "(,4.3.32767]",
|
||||||
|
"System.Threading.AccessControl": "(,10.0.32767]",
|
||||||
|
"System.Threading.Channels": "(,10.0.32767]",
|
||||||
|
"System.Threading.Overlapped": "(,4.3.32767]",
|
||||||
|
"System.Threading.Tasks": "(,4.3.32767]",
|
||||||
|
"System.Threading.Tasks.Dataflow": "(,10.0.32767]",
|
||||||
|
"System.Threading.Tasks.Extensions": "(,5.0.32767]",
|
||||||
|
"System.Threading.Tasks.Parallel": "(,4.3.32767]",
|
||||||
|
"System.Threading.Thread": "(,4.3.32767]",
|
||||||
|
"System.Threading.ThreadPool": "(,4.3.32767]",
|
||||||
|
"System.Threading.Timer": "(,4.3.32767]",
|
||||||
|
"System.ValueTuple": "(,4.5.32767]",
|
||||||
|
"System.Windows.Extensions": "(,10.0.32767]",
|
||||||
|
"System.Xml.ReaderWriter": "(,4.3.32767]",
|
||||||
|
"System.Xml.XDocument": "(,4.3.32767]",
|
||||||
|
"System.Xml.XmlDocument": "(,4.3.32767]",
|
||||||
|
"System.Xml.XmlSerializer": "(,4.3.32767]",
|
||||||
|
"System.Xml.XPath": "(,4.3.32767]",
|
||||||
|
"System.Xml.XPath.XDocument": "(,5.0.32767]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
15
Radio/App_radio/obj/App_radio.csproj.nuget.g.props
Normal file
15
Radio/App_radio/obj/App_radio.csproj.nuget.g.props
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||||
|
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||||
|
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||||
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
||||||
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\alvar\.nuget\packages\</NuGetPackageFolders>
|
||||||
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<SourceRoot Include="C:\Users\alvar\.nuget\packages\" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
2
Radio/App_radio/obj/App_radio.csproj.nuget.g.targets
Normal file
2
Radio/App_radio/obj/App_radio.csproj.nuget.g.targets
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")]
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// Este código fue generado por una herramienta.
|
||||||
|
// Versión de runtime:4.0.30319.42000
|
||||||
|
//
|
||||||
|
// Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si
|
||||||
|
// se vuelve a generar el código.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("App_radio")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("App_radio")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("App_radio")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")]
|
||||||
|
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]
|
||||||
|
|
||||||
|
// Generated by the MSBuild WriteCodeFragment class.
|
||||||
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
0b160f71b5bcbec8190dec27628788a44df803979ca593b8f6d546503376aba5
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
is_global = true
|
||||||
|
build_property.ApplicationManifest =
|
||||||
|
build_property.StartupObject =
|
||||||
|
build_property.ApplicationDefaultFont =
|
||||||
|
build_property.ApplicationHighDpiMode =
|
||||||
|
build_property.ApplicationUseCompatibleTextRendering =
|
||||||
|
build_property.ApplicationVisualStyles =
|
||||||
|
build_property.TargetFramework = net10.0-windows
|
||||||
|
build_property.TargetFrameworkIdentifier = .NETCoreApp
|
||||||
|
build_property.TargetFrameworkVersion = v10.0
|
||||||
|
build_property.TargetPlatformMinVersion = 7.0
|
||||||
|
build_property.UsingMicrosoftNETSdkWeb =
|
||||||
|
build_property.ProjectTypeGuids =
|
||||||
|
build_property.InvariantGlobalization =
|
||||||
|
build_property.PlatformNeutralAssembly =
|
||||||
|
build_property.EnforceExtendedAnalyzerRules =
|
||||||
|
build_property.EntryPointFilePath =
|
||||||
|
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||||
|
build_property.RootNamespace = App_radio
|
||||||
|
build_property.ProjectDir = C:\Users\alvar\Desktop\Barcelona_software\AARadio_bluetooth\App_radio\
|
||||||
|
build_property.EnableComHosting =
|
||||||
|
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||||
|
build_property.CsWinRTUseWindowsUIXamlProjections = false
|
||||||
|
build_property.EffectiveAnalysisLevelStyle = 10.0
|
||||||
|
build_property.EnableCodeStyleSeverity =
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
// <auto-generated/>
|
||||||
|
global using System;
|
||||||
|
global using System.Collections.Generic;
|
||||||
|
global using System.Drawing;
|
||||||
|
global using System.IO;
|
||||||
|
global using System.Linq;
|
||||||
|
global using System.Net.Http;
|
||||||
|
global using System.Threading;
|
||||||
|
global using System.Threading.Tasks;
|
||||||
|
global using System.Windows.Forms;
|
||||||
Binary file not shown.
BIN
Radio/App_radio/obj/Debug/net10.0-windows/App_radio.assets.cache
Normal file
BIN
Radio/App_radio/obj/Debug/net10.0-windows/App_radio.assets.cache
Normal file
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
af1fac5e31db0abbecb2c2e167742d7f8beddfc09491e12036d53f4d9eafa81f
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue