first push

This commit is contained in:
Andrea Santaniello 2024-11-22 16:55:57 +01:00
commit e33164b5c2
151 changed files with 3468 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
.vs/sharpFRN/v17/.suo Normal file

Binary file not shown.

View File

@ -0,0 +1,173 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\frnwebsocket\\wsaudiostream.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|solutionrelative:frnwebsocket\\wsaudiostream.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\frnwebsocket\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|solutionrelative:frnwebsocket\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\frnwebsocket\\settingsloader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|solutionrelative:frnwebsocket\\settingsloader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\sharpfrn\\frnclient.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|solutionrelative:sharpfrn\\frnclient.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\frnwebsocket\\frnwebsocket.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
"RelativeMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|solutionrelative:frnwebsocket\\frnwebsocket.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
},
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Andrea Santaniello\\Desktop\\FRN\\web\u002B\\config\\config.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
},
{
"AbsoluteMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\sharpfrn\\sharpfrn.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|",
"RelativeMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|solutionrelative:sharpfrn\\sharpfrn.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
},
{
"AbsoluteMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\sharpfrn\\sharpfrn.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
"RelativeMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|solutionrelative:sharpfrn\\sharpfrn.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
},
{
"AbsoluteMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpfrn\\properties\\settings.settings||{6D2695F9-5365-4A78-89ED-F205C045BFE6}",
"RelativeMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|solutionrelative:sharpfrn\\properties\\settings.settings||{6D2695F9-5365-4A78-89ED-F205C045BFE6}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 3,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{e5c86464-96be-4d7c-9a8b-abcb3bbf5f92}"
},
{
"$type": "Bookmark",
"Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "config.json",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\Desktop\\FRN\\web\u002B\\config\\config.json",
"RelativeDocumentMoniker": "..\\..\\..\\Desktop\\FRN\\web\u002B\\config\\config.json",
"ToolTip": "C:\\Users\\Andrea Santaniello\\Desktop\\FRN\\web\u002B\\config\\config.json",
"RelativeToolTip": "..\\..\\..\\Desktop\\FRN\\web\u002B\\config\\config.json",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
"WhenOpened": "2024-11-02T14:57:47.741Z"
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "WSAudioStream.cs",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\WSAudioStream.cs",
"RelativeDocumentMoniker": "FRNWebSocket\\WSAudioStream.cs",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\WSAudioStream.cs*",
"RelativeToolTip": "FRNWebSocket\\WSAudioStream.cs*",
"ViewState": "AgIAACkAAAAAAAAAAAAUwDwAAAAWAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-11-01T23:17:14.816Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "SettingsLoader.cs",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\SettingsLoader.cs",
"RelativeDocumentMoniker": "FRNWebSocket\\SettingsLoader.cs",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\SettingsLoader.cs",
"RelativeToolTip": "FRNWebSocket\\SettingsLoader.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-11-01T23:16:28.575Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "FRNWebSocket.csproj",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj",
"RelativeDocumentMoniker": "FRNWebSocket\\FRNWebSocket.csproj",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj",
"RelativeToolTip": "FRNWebSocket\\FRNWebSocket.csproj",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
"WhenOpened": "2024-11-01T23:15:42.799Z"
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "sharpFRN.csproj",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\sharpFRN.csproj",
"RelativeDocumentMoniker": "sharpFRN\\sharpFRN.csproj",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\sharpFRN.csproj",
"RelativeToolTip": "sharpFRN\\sharpFRN.csproj",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAAfAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
"WhenOpened": "2024-11-01T23:15:25.225Z"
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "Program.cs",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\Program.cs",
"RelativeDocumentMoniker": "FRNWebSocket\\Program.cs",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\Program.cs",
"RelativeToolTip": "FRNWebSocket\\Program.cs",
"ViewState": "AgIAAB8AAAAAAAAAAAAQwDUAAAAlAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-11-01T23:13:24.793Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "sharpFRN",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\sharpFRN.csproj",
"RelativeDocumentMoniker": "sharpFRN\\sharpFRN.csproj",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\sharpFRN.csproj",
"RelativeToolTip": "sharpFRN\\sharpFRN.csproj",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
"WhenOpened": "2024-10-30T23:37:29.101Z"
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "FRNClient.cs",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\FRNClient.cs",
"RelativeDocumentMoniker": "sharpFRN\\FRNClient.cs",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\FRNClient.cs",
"RelativeToolTip": "sharpFRN\\FRNClient.cs",
"ViewState": "AgIAADUBAAAAAAAAAAAIwGkBAAANAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-10-30T23:30:07.344Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 8,
"Title": "Settings.settings",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\Properties\\Settings.settings",
"RelativeDocumentMoniker": "sharpFRN\\Properties\\Settings.settings",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\Properties\\Settings.settings",
"RelativeToolTip": "sharpFRN\\Properties\\Settings.settings",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.002767|",
"WhenOpened": "2024-10-30T23:37:43.824Z"
}
]
}
]
}
]
}

View File

@ -0,0 +1,190 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\bin\\Debug\\net8.0\\settings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:FRNWebSocket\\bin\\Debug\\net8.0\\settings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
},
{
"AbsoluteMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\frnwebsocket\\wsaudiostream.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|solutionrelative:frnwebsocket\\wsaudiostream.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\frnwebsocket\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|solutionrelative:frnwebsocket\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\frnwebsocket\\settingsloader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|solutionrelative:frnwebsocket\\settingsloader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\sharpfrn\\frnclient.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|solutionrelative:sharpfrn\\frnclient.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\frnwebsocket\\frnwebsocket.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
"RelativeMoniker": "D:0:0:{6E758F82-FE03-4F20-8428-3479B871E126}|FRNWebSocket\\FRNWebSocket.csproj|solutionrelative:frnwebsocket\\frnwebsocket.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
},
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Andrea Santaniello\\Desktop\\FRN\\web\u002B\\config\\config.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
},
{
"AbsoluteMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\sharpfrn\\sharpfrn.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|",
"RelativeMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|solutionrelative:sharpfrn\\sharpfrn.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
},
{
"AbsoluteMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|c:\\users\\andrea santaniello\\source\\repos\\sharpfrn\\sharpfrn\\sharpfrn.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
"RelativeMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|solutionrelative:sharpfrn\\sharpfrn.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
},
{
"AbsoluteMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpfrn\\properties\\settings.settings||{6D2695F9-5365-4A78-89ED-F205C045BFE6}",
"RelativeMoniker": "D:0:0:{14CC80EB-8543-4998-8923-1315110CDE6F}|sharpFRN\\sharpFRN.csproj|solutionrelative:sharpfrn\\properties\\settings.settings||{6D2695F9-5365-4A78-89ED-F205C045BFE6}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "settings.json",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\bin\\Debug\\net8.0\\settings.json",
"RelativeDocumentMoniker": "FRNWebSocket\\bin\\Debug\\net8.0\\settings.json",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\bin\\Debug\\net8.0\\settings.json",
"RelativeToolTip": "FRNWebSocket\\bin\\Debug\\net8.0\\settings.json",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
"WhenOpened": "2024-11-03T00:23:09.199Z",
"EditorCaption": ""
},
{
"$type": "Bookmark",
"Name": "ST:0:0:{e5c86464-96be-4d7c-9a8b-abcb3bbf5f92}"
},
{
"$type": "Bookmark",
"Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
},
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "config.json",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\Desktop\\FRN\\web\u002B\\config\\config.json",
"RelativeDocumentMoniker": "..\\..\\..\\Desktop\\FRN\\web\u002B\\config\\config.json",
"ToolTip": "C:\\Users\\Andrea Santaniello\\Desktop\\FRN\\web\u002B\\config\\config.json",
"RelativeToolTip": "..\\..\\..\\Desktop\\FRN\\web\u002B\\config\\config.json",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
"WhenOpened": "2024-11-02T14:57:47.741Z"
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "WSAudioStream.cs",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\WSAudioStream.cs",
"RelativeDocumentMoniker": "FRNWebSocket\\WSAudioStream.cs",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\WSAudioStream.cs",
"RelativeToolTip": "FRNWebSocket\\WSAudioStream.cs",
"ViewState": "AgIAACkAAAAAAAAAAAAUwDwAAAAWAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-11-01T23:17:14.816Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "SettingsLoader.cs",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\SettingsLoader.cs",
"RelativeDocumentMoniker": "FRNWebSocket\\SettingsLoader.cs",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\SettingsLoader.cs",
"RelativeToolTip": "FRNWebSocket\\SettingsLoader.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-11-01T23:16:28.575Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "FRNWebSocket.csproj",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj",
"RelativeDocumentMoniker": "FRNWebSocket\\FRNWebSocket.csproj",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj",
"RelativeToolTip": "FRNWebSocket\\FRNWebSocket.csproj",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
"WhenOpened": "2024-11-01T23:15:42.799Z"
},
{
"$type": "Document",
"DocumentIndex": 8,
"Title": "sharpFRN.csproj",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\sharpFRN.csproj",
"RelativeDocumentMoniker": "sharpFRN\\sharpFRN.csproj",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\sharpFRN.csproj",
"RelativeToolTip": "sharpFRN\\sharpFRN.csproj",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAAfAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
"WhenOpened": "2024-11-01T23:15:25.225Z"
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "Program.cs",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\Program.cs",
"RelativeDocumentMoniker": "FRNWebSocket\\Program.cs",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\Program.cs",
"RelativeToolTip": "FRNWebSocket\\Program.cs",
"ViewState": "AgIAAB8AAAAAAAAAAAAQwDUAAAAlAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-11-01T23:13:24.793Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "sharpFRN",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\sharpFRN.csproj",
"RelativeDocumentMoniker": "sharpFRN\\sharpFRN.csproj",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\sharpFRN.csproj",
"RelativeToolTip": "sharpFRN\\sharpFRN.csproj",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
"WhenOpened": "2024-10-30T23:37:29.101Z"
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "FRNClient.cs",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\FRNClient.cs",
"RelativeDocumentMoniker": "sharpFRN\\FRNClient.cs",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\FRNClient.cs",
"RelativeToolTip": "sharpFRN\\FRNClient.cs",
"ViewState": "AgIAADUBAAAAAAAAAAAIwGkBAAANAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2024-10-30T23:30:07.344Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 9,
"Title": "Settings.settings",
"DocumentMoniker": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\Properties\\Settings.settings",
"RelativeDocumentMoniker": "sharpFRN\\Properties\\Settings.settings",
"ToolTip": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\sharpFRN\\Properties\\Settings.settings",
"RelativeToolTip": "sharpFRN\\Properties\\Settings.settings",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.002767|",
"WhenOpened": "2024-10-30T23:37:43.824Z"
}
]
}
]
}
]
}

View File

@ -0,0 +1 @@
{"CustomColumnOrderings":{},"ShowValidationErrors":true,"SelectedResourceGroups":[],"VisibleColumnKeys":["name","neutral-value"]}

View File

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NAudio" Version="2.2.1" />
</ItemGroup>
<ItemGroup>
<Reference Include="sharpFRN">
<HintPath>..\sharpFRN\bin\Release\net8.0-windows\sharpFRN.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

60
FRNWebSocket/Program.cs Normal file
View File

@ -0,0 +1,60 @@
using System;
using System.IO;
using System.Threading.Tasks;
using Monoculus;
using NAudio.Wave;
namespace sharpFRN
{
class Program
{
static WebSocketAudioStreamer audioStreamer = new WebSocketAudioStreamer();
static Settings settings = new Settings();
static async Task Main(string[] args)
{
settings = SettingsLoader.Load("settings.json");
audioStreamer.StartWebSocketServerAsync(settings.WebSocketHost);
// Initialize the FRN client
var client = new FRNClient(
host: settings.FRNClient.Host,
port: settings.FRNClient.Port,
callSign: settings.FRNClient.CallSign,
name: settings.FRNClient.Name,
email: settings.FRNClient.Email,
password: settings.FRNClient.Password,
network: settings.FRNClient.Network,
country: settings.FRNClient.Country,
city: settings.FRNClient.City,
locator: settings.FRNClient.Locator,
type: settings.FRNClient.Type,
description: settings.FRNClient.Description
);
client.OnConnect += () => Console.WriteLine("Connected to the server.");
client.OnDisconnect += () => Console.WriteLine("Disconnected from the server.");
client.OnLogin += () => Console.WriteLine("Logged in successfully.");
client.OnMessageReceived += (message) => Console.WriteLine($"Message received: {message}");
client.OnClientListReceived += (clients) =>
{
Console.WriteLine("Client list updated:");
foreach (var c in clients)
{
Console.WriteLine($"- {c.CallsignAndUser} ({c.ID})");
}
};
client.OnVoiceDataReceived += (voiceData, clientIndex) =>
{
Console.WriteLine($"Voice data received at index {clientIndex}");
// Decode and play the voice data chunk
//PlayGSMChunk(voiceData);
audioStreamer.PlayGSMChunk(voiceData);
};
await client.RunAsync();
}
}
}

View File

@ -0,0 +1,42 @@
using System;
using System.IO;
using System.Text.Json;
namespace sharpFRN
{
public class Settings
{
public string WebSocketHost { get; set; }
public FRNSettings FRNClient { get; set; }
}
public class FRNSettings
{
public string Host { get; set; }
public int Port { get; set; }
public string CallSign { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string Network { get; set; }
public string Country { get; set; }
public string City { get; set; }
public string Locator { get; set; }
public string Type { get; set; }
public string Description { get; set; }
}
public static class SettingsLoader
{
public static Settings Load(string filePath)
{
if (!File.Exists(filePath))
{
throw new FileNotFoundException($"Settings file not found: {filePath}");
}
string json = File.ReadAllText(filePath);
return JsonSerializer.Deserialize<Settings>(json);
}
}
}

View File

@ -0,0 +1,134 @@
using System;
using System.IO;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NAudio.Wave;
using System.Collections.Concurrent;
namespace sharpFRN
{
public class WebSocketAudioStreamer
{
private WaveOutEvent waveOut;
private BufferedWaveProvider bufferedWaveProvider;
private HttpListener httpListener;
private ConcurrentDictionary<string, WebSocket> webSockets = new ConcurrentDictionary<string, WebSocket>();
public WebSocketAudioStreamer()
{
InitializeGsmDecoder();
}
private void InitializeGsmDecoder()
{
WaveFormat pcmFormat = new WaveFormat(8000, 16, 1);
waveOut = new WaveOutEvent();
bufferedWaveProvider = new BufferedWaveProvider(pcmFormat)
{
BufferDuration = TimeSpan.FromSeconds(5) // Adjust if needed
};
waveOut.Init(bufferedWaveProvider);
waveOut.Play();
}
public void PlayGSMChunk(byte[] voiceData)
{
if (voiceData.Length != 325)
{
Console.WriteLine($"Unexpected voice data length: {voiceData.Length}");
return;
}
int frameSize = 65; // GSM frame size
int numFrames = voiceData.Length / frameSize;
for (int i = 0; i < numFrames; i++)
{
byte[] gsmFrame = new byte[frameSize];
Array.Copy(voiceData, i * frameSize, gsmFrame, 0, frameSize);
using (var gsmStream = new RawSourceWaveStream(new MemoryStream(gsmFrame), new Gsm610WaveFormat()))
using (var pcmStream = WaveFormatConversionStream.CreatePcmStream(gsmStream))
{
byte[] buffer = new byte[pcmStream.Length];
int bytesRead = pcmStream.Read(buffer, 0, buffer.Length);
// Add the PCM data to the BufferedWaveProvider
//bufferedWaveProvider.AddSamples(buffer, 0, bytesRead);
// Send the PCM data to all connected WebSocket clients
BroadcastToWebSockets(buffer, 0, bytesRead);
}
}
}
public async Task StartWebSocketServerAsync(string urlPrefix)
{
httpListener = new HttpListener();
httpListener.Prefixes.Add(urlPrefix);
httpListener.Start();
Console.WriteLine($"WebSocket server started at {urlPrefix}");
while (true)
{
var httpContext = await httpListener.GetContextAsync();
if (httpContext.Request.IsWebSocketRequest)
{
var webSocketContext = await httpContext.AcceptWebSocketAsync(null);
var webSocket = webSocketContext.WebSocket;
string clientId = Guid.NewGuid().ToString();
webSockets.TryAdd(clientId, webSocket);
Console.WriteLine($"WebSocket client connected: {clientId}");
_ = Task.Run(() => HandleWebSocketConnectionAsync(clientId, webSocket));
}
else
{
httpContext.Response.StatusCode = 400;
httpContext.Response.Close();
}
}
}
private async Task HandleWebSocketConnectionAsync(string clientId, WebSocket webSocket)
{
var buffer = new byte[1024];
try
{
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
}
}
}
catch (Exception ex)
{
Console.WriteLine($"WebSocket error: {ex.Message}");
}
finally
{
webSockets.TryRemove(clientId, out _);
Console.WriteLine($"WebSocket client disconnected: {clientId}");
}
}
private void BroadcastToWebSockets(byte[] buffer, int offset, int count)
{
foreach (var webSocket in webSockets.Values)
{
if (webSocket.State == WebSocketState.Open)
{
webSocket.SendAsync(new ArraySegment<byte>(buffer, offset, count), WebSocketMessageType.Binary, true, CancellationToken.None).Wait();
}
}
}
}
}

View File

@ -0,0 +1,193 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"FRNWebSocket/1.0.0": {
"dependencies": {
"NAudio": "2.2.1",
"sharpFRN": "1.0.0.0"
},
"runtime": {
"FRNWebSocket.dll": {}
}
},
"Microsoft.NETCore.Platforms/3.1.0": {},
"Microsoft.Win32.Registry/4.7.0": {
"dependencies": {
"System.Security.AccessControl": "4.7.0",
"System.Security.Principal.Windows": "4.7.0"
}
},
"NAudio/2.2.1": {
"dependencies": {
"NAudio.Asio": "2.2.1",
"NAudio.Core": "2.2.1",
"NAudio.Midi": "2.2.1",
"NAudio.Wasapi": "2.2.1",
"NAudio.WinMM": "2.2.1"
},
"runtime": {
"lib/net6.0/NAudio.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.Asio/2.2.1": {
"dependencies": {
"Microsoft.Win32.Registry": "4.7.0",
"NAudio.Core": "2.2.1"
},
"runtime": {
"lib/netstandard2.0/NAudio.Asio.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.Core/2.2.1": {
"runtime": {
"lib/netstandard2.0/NAudio.Core.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.Midi/2.2.1": {
"dependencies": {
"NAudio.Core": "2.2.1"
},
"runtime": {
"lib/netstandard2.0/NAudio.Midi.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.Wasapi/2.2.1": {
"dependencies": {
"NAudio.Core": "2.2.1"
},
"runtime": {
"lib/netstandard2.0/NAudio.Wasapi.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.WinMM/2.2.1": {
"dependencies": {
"Microsoft.Win32.Registry": "4.7.0",
"NAudio.Core": "2.2.1"
},
"runtime": {
"lib/netstandard2.0/NAudio.WinMM.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"System.Security.AccessControl/4.7.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "3.1.0",
"System.Security.Principal.Windows": "4.7.0"
}
},
"System.Security.Principal.Windows/4.7.0": {},
"sharpFRN/1.0.0.0": {
"runtime": {
"sharpFRN.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
}
}
},
"libraries": {
"FRNWebSocket/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.NETCore.Platforms/3.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-z7aeg8oHln2CuNulfhiLYxCVMPEwBl3rzicjvIX+4sUuCwvXw5oXQEtbiU2c0z4qYL5L3Kmx0mMA/+t/SbY67w==",
"path": "microsoft.netcore.platforms/3.1.0",
"hashPath": "microsoft.netcore.platforms.3.1.0.nupkg.sha512"
},
"Microsoft.Win32.Registry/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==",
"path": "microsoft.win32.registry/4.7.0",
"hashPath": "microsoft.win32.registry.4.7.0.nupkg.sha512"
},
"NAudio/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-c0DzwiyyklM0TP39Y7RObwO3QkWecgM6H60ikiEnsV/aEAJPbj5MFCLaD8BSfKuZe0HGuh9GRGWWlJmSxDc9MA==",
"path": "naudio/2.2.1",
"hashPath": "naudio.2.2.1.nupkg.sha512"
},
"NAudio.Asio/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-hQglyOT5iT3XuGpBP8ZG0+aoqwRfidHjTNehpoWwX0g6KJEgtH2VaqM2nuJ2mheKZa/IBqB4YQTZVvrIapzfOA==",
"path": "naudio.asio/2.2.1",
"hashPath": "naudio.asio.2.2.1.nupkg.sha512"
},
"NAudio.Core/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-GgkdP6K/7FqXFo7uHvoqGZTJvW4z8g2IffhOO4JHaLzKCdDOUEzVKtveoZkCuUX8eV2HAINqi7VFqlFndrnz/g==",
"path": "naudio.core/2.2.1",
"hashPath": "naudio.core.2.2.1.nupkg.sha512"
},
"NAudio.Midi/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-6r23ylGo5aeP02WFXsPquz0T0hFJWyh+7t++tz19tc3Kr38NHm+Z9j+FiAv+xkH8tZqXJqus9Q8p6u7bidIgbw==",
"path": "naudio.midi/2.2.1",
"hashPath": "naudio.midi.2.2.1.nupkg.sha512"
},
"NAudio.Wasapi/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lFfXoqacZZe0WqNChJgGYI+XV/n/61LzPHT3C1CJp4khoxeo2sziyX5wzNYWeCMNbsWxFvT3b3iXeY1UYjBhZw==",
"path": "naudio.wasapi/2.2.1",
"hashPath": "naudio.wasapi.2.2.1.nupkg.sha512"
},
"NAudio.WinMM/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xFHRFwH4x6aq3IxRbewvO33ugJRvZFEOfO62i7uQJRUNW2cnu6BeBTHUS0JD5KBucZbHZaYqxQG8dwZ47ezQuQ==",
"path": "naudio.winmm/2.2.1",
"hashPath": "naudio.winmm.2.2.1.nupkg.sha512"
},
"System.Security.AccessControl/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JECvTt5aFF3WT3gHpfofL2MNNP6v84sxtXxpqhLBCcDRzqsPBmHhQ6shv4DwwN2tRlzsUxtb3G9M3763rbXKDg==",
"path": "system.security.accesscontrol/4.7.0",
"hashPath": "system.security.accesscontrol.4.7.0.nupkg.sha512"
},
"System.Security.Principal.Windows/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ojD0PX0XhneCsUbAZVKdb7h/70vyYMDYs85lwEI+LngEONe/17A0cFaRFqZU+sOEidcVswYWikYOQ9PPfjlbtQ==",
"path": "system.security.principal.windows/4.7.0",
"hashPath": "system.security.principal.windows.4.7.0.nupkg.sha512"
},
"sharpFRN/1.0.0.0": {
"type": "reference",
"serviceable": false,
"sha512": ""
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,12 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

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.

View File

@ -0,0 +1,17 @@
{
"WebSocketHost": "http://localhost:5000/",
"FRNClient": {
"Host": "server.voip-italia.net",
"Port": 10024,
"CallSign": "ZERO0",
"Name": "Test",
"Email": "your.email@example.com",
"Password": "PASSWORD",
"Network": "Nazionale",
"Country": "Internet",
"City": "Monoculus",
"Locator": "Network",
"Type": "Crosslink",
"Description": "Hi"
}
}

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,127 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FRN Websocket</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
background-color: #121212;
color: #ffffff;
}
.vu-meter {
width: 100%;
height: 20px;
background-color: #444;
position: relative;
}
.vu-meter-fill {
height: 100%;
background-color: #0f0;
width: 0%;
}
</style>
</head>
<body class="container py-5">
<h1 class="mb-4">FRN WebSocket</h1>
<button id="connectButton" class="btn btn-primary mb-3">Connect to Audio Stream</button>
<p id="status" class="mb-3">Status: Disconnected</p>
<div class="vu-meter mb-3">
<div id="vuMeterFill" class="vu-meter-fill"></div>
</div>
<script>
const connectButton = document.getElementById('connectButton');
const statusElement = document.getElementById('status');
const vuMeterFill = document.getElementById('vuMeterFill');
let audioContext;
let websocket;
let analyser;
let dataArray;
let isPlayingAudio = false;
connectButton.addEventListener('click', () => {
if (websocket && websocket.readyState === WebSocket.OPEN) {
websocket.close();
connectButton.textContent = 'Connect to Audio Stream';
statusElement.textContent = 'Status: Disconnected';
isPlayingAudio = false;
} else {
startWebSocketConnection();
}
});
function startWebSocketConnection() {
websocket = new WebSocket('ws://192.168.1.50/ws/');
websocket.binaryType = 'arraybuffer';
websocket.onopen = () => {
connectButton.textContent = 'Disconnect from Audio Stream';
statusElement.textContent = 'Status: Connected';
audioContext = new (window.AudioContext || window.webkitAudioContext)();
analyser = audioContext.createAnalyser();
analyser.fftSize = 256;
const bufferLength = analyser.frequencyBinCount;
dataArray = new Uint8Array(bufferLength);
};
websocket.onmessage = (event) => {
playAudioChunk(event.data);
};
websocket.onclose = () => {
connectButton.textContent = 'Connect to Audio Stream';
statusElement.textContent = 'Status: Disconnected';
isPlayingAudio = false;
vuMeterFill.style.width = '0%';
};
websocket.onerror = (error) => {
console.error('WebSocket error:', error);
};
}
function playAudioChunk(arrayBuffer) {
try {
const audioBuffer = audioContext.createBuffer(1, arrayBuffer.byteLength / 2, audioContext.sampleRate);
const audioData = new Float32Array(arrayBuffer.byteLength / 2);
const dataView = new DataView(arrayBuffer);
for (let i = 0; i < audioData.length; i++) {
audioData[i] = dataView.getInt16(i * 2, true) / 32768;
}
audioBuffer.copyToChannel(audioData, 0);
const source = audioContext.createBufferSource();
source.buffer = audioBuffer;
source.connect(analyser);
analyser.connect(audioContext.destination);
source.start(0);
isPlayingAudio = true;
visualizeAudio();
source.onended = () => {
isPlayingAudio = false;
vuMeterFill.style.width = '0%';
};
} catch (error) {
console.error('Error processing audio data:', error);
}
}
function visualizeAudio() {
if (isPlayingAudio) {
analyser.getByteFrequencyData(dataArray);
let sum = 0;
for (let i = 0; i < dataArray.length; i++) {
sum += dataArray[i];
}
const average = sum / dataArray.length;
const percentage = (average / 256) * 100;
vuMeterFill.style.width = percentage + '%';
requestAnimationFrame(visualizeAudio);
}
}
</script>
</body>
</html>

View File

@ -0,0 +1,193 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"FRNWebSocket/1.0.0": {
"dependencies": {
"NAudio": "2.2.1",
"sharpFRN": "1.0.0.0"
},
"runtime": {
"FRNWebSocket.dll": {}
}
},
"Microsoft.NETCore.Platforms/3.1.0": {},
"Microsoft.Win32.Registry/4.7.0": {
"dependencies": {
"System.Security.AccessControl": "4.7.0",
"System.Security.Principal.Windows": "4.7.0"
}
},
"NAudio/2.2.1": {
"dependencies": {
"NAudio.Asio": "2.2.1",
"NAudio.Core": "2.2.1",
"NAudio.Midi": "2.2.1",
"NAudio.Wasapi": "2.2.1",
"NAudio.WinMM": "2.2.1"
},
"runtime": {
"lib/net6.0/NAudio.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.Asio/2.2.1": {
"dependencies": {
"Microsoft.Win32.Registry": "4.7.0",
"NAudio.Core": "2.2.1"
},
"runtime": {
"lib/netstandard2.0/NAudio.Asio.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.Core/2.2.1": {
"runtime": {
"lib/netstandard2.0/NAudio.Core.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.Midi/2.2.1": {
"dependencies": {
"NAudio.Core": "2.2.1"
},
"runtime": {
"lib/netstandard2.0/NAudio.Midi.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.Wasapi/2.2.1": {
"dependencies": {
"NAudio.Core": "2.2.1"
},
"runtime": {
"lib/netstandard2.0/NAudio.Wasapi.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"NAudio.WinMM/2.2.1": {
"dependencies": {
"Microsoft.Win32.Registry": "4.7.0",
"NAudio.Core": "2.2.1"
},
"runtime": {
"lib/netstandard2.0/NAudio.WinMM.dll": {
"assemblyVersion": "2.2.1.0",
"fileVersion": "2.2.1.0"
}
}
},
"System.Security.AccessControl/4.7.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "3.1.0",
"System.Security.Principal.Windows": "4.7.0"
}
},
"System.Security.Principal.Windows/4.7.0": {},
"sharpFRN/1.0.0.0": {
"runtime": {
"sharpFRN.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
}
}
},
"libraries": {
"FRNWebSocket/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.NETCore.Platforms/3.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-z7aeg8oHln2CuNulfhiLYxCVMPEwBl3rzicjvIX+4sUuCwvXw5oXQEtbiU2c0z4qYL5L3Kmx0mMA/+t/SbY67w==",
"path": "microsoft.netcore.platforms/3.1.0",
"hashPath": "microsoft.netcore.platforms.3.1.0.nupkg.sha512"
},
"Microsoft.Win32.Registry/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==",
"path": "microsoft.win32.registry/4.7.0",
"hashPath": "microsoft.win32.registry.4.7.0.nupkg.sha512"
},
"NAudio/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-c0DzwiyyklM0TP39Y7RObwO3QkWecgM6H60ikiEnsV/aEAJPbj5MFCLaD8BSfKuZe0HGuh9GRGWWlJmSxDc9MA==",
"path": "naudio/2.2.1",
"hashPath": "naudio.2.2.1.nupkg.sha512"
},
"NAudio.Asio/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-hQglyOT5iT3XuGpBP8ZG0+aoqwRfidHjTNehpoWwX0g6KJEgtH2VaqM2nuJ2mheKZa/IBqB4YQTZVvrIapzfOA==",
"path": "naudio.asio/2.2.1",
"hashPath": "naudio.asio.2.2.1.nupkg.sha512"
},
"NAudio.Core/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-GgkdP6K/7FqXFo7uHvoqGZTJvW4z8g2IffhOO4JHaLzKCdDOUEzVKtveoZkCuUX8eV2HAINqi7VFqlFndrnz/g==",
"path": "naudio.core/2.2.1",
"hashPath": "naudio.core.2.2.1.nupkg.sha512"
},
"NAudio.Midi/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-6r23ylGo5aeP02WFXsPquz0T0hFJWyh+7t++tz19tc3Kr38NHm+Z9j+FiAv+xkH8tZqXJqus9Q8p6u7bidIgbw==",
"path": "naudio.midi/2.2.1",
"hashPath": "naudio.midi.2.2.1.nupkg.sha512"
},
"NAudio.Wasapi/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lFfXoqacZZe0WqNChJgGYI+XV/n/61LzPHT3C1CJp4khoxeo2sziyX5wzNYWeCMNbsWxFvT3b3iXeY1UYjBhZw==",
"path": "naudio.wasapi/2.2.1",
"hashPath": "naudio.wasapi.2.2.1.nupkg.sha512"
},
"NAudio.WinMM/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xFHRFwH4x6aq3IxRbewvO33ugJRvZFEOfO62i7uQJRUNW2cnu6BeBTHUS0JD5KBucZbHZaYqxQG8dwZ47ezQuQ==",
"path": "naudio.winmm/2.2.1",
"hashPath": "naudio.winmm.2.2.1.nupkg.sha512"
},
"System.Security.AccessControl/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JECvTt5aFF3WT3gHpfofL2MNNP6v84sxtXxpqhLBCcDRzqsPBmHhQ6shv4DwwN2tRlzsUxtb3G9M3763rbXKDg==",
"path": "system.security.accesscontrol/4.7.0",
"hashPath": "system.security.accesscontrol.4.7.0.nupkg.sha512"
},
"System.Security.Principal.Windows/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ojD0PX0XhneCsUbAZVKdb7h/70vyYMDYs85lwEI+LngEONe/17A0cFaRFqZU+sOEidcVswYWikYOQ9PPfjlbtQ==",
"path": "system.security.principal.windows/4.7.0",
"hashPath": "system.security.principal.windows.4.7.0.nupkg.sha512"
},
"sharpFRN/1.0.0.0": {
"type": "reference",
"serviceable": false,
"sha512": ""
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,13 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

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.

View File

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Il codice è stato generato da uno strumento.
// Versione runtime:4.0.30319.42000
//
// Le modifiche apportate a questo file possono provocare un comportamento non corretto e andranno perse se
// il codice viene rigenerato.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("FRNWebSocket")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("FRNWebSocket")]
[assembly: System.Reflection.AssemblyTitleAttribute("FRNWebSocket")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generato dalla classe WriteCodeFragment di MSBuild.

View File

@ -0,0 +1 @@
fae450e35fa326afed028a174c19d5b435f7e49986a2666352729b95a5af80c3

View File

@ -0,0 +1,13 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = FRNWebSocket
build_property.ProjectDir = C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@ -0,0 +1 @@
fb064c69498f477a3cd5e2be16d49e94e9e466a4972e0559dcf79488f2d696a3

View File

@ -0,0 +1,24 @@
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\FRNWebSocket.exe
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\FRNWebSocket.deps.json
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\FRNWebSocket.runtimeconfig.json
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\FRNWebSocket.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\FRNWebSocket.pdb
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\NAudio.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\NAudio.Asio.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\NAudio.Core.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\NAudio.Midi.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\NAudio.Wasapi.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\NAudio.WinMM.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\sharpFRN.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Debug\net8.0\sharpFRN.pdb
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\FRNWebSocket.csproj.AssemblyReference.cache
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\FRNWebSocket.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\FRNWebSocket.AssemblyInfoInputs.cache
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\FRNWebSocket.AssemblyInfo.cs
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\FRNWebSocket.csproj.CoreCompileInputs.cache
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\FRNWebSo.9D9585D7.Up2Date
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\FRNWebSocket.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\refint\FRNWebSocket.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\FRNWebSocket.pdb
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\FRNWebSocket.genruntimeconfig.cache
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Debug\net8.0\ref\FRNWebSocket.dll

Binary file not shown.

View File

@ -0,0 +1 @@
4c814e49796799a6801f8c0438596b1d566cc2cb3ed68e5a0b786bdee327d628

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,74 @@
{
"format": 1,
"restore": {
"C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj": {}
},
"projects": {
"C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj",
"projectName": "FRNWebSocket",
"projectPath": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj",
"packagesPath": "C:\\Users\\Andrea Santaniello\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Andrea Santaniello\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"NAudio": {
"target": "Package",
"version": "[2.2.1, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.400/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View 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\Andrea Santaniello\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.11.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\Andrea Santaniello\.nuget\packages\" />
</ItemGroup>
</Project>

View 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" />

View File

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Il codice è stato generato da uno strumento.
// Versione runtime:4.0.30319.42000
//
// Le modifiche apportate a questo file possono provocare un comportamento non corretto e andranno perse se
// il codice viene rigenerato.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("FRNWebSocket")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("FRNWebSocket")]
[assembly: System.Reflection.AssemblyTitleAttribute("FRNWebSocket")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generato dalla classe WriteCodeFragment di MSBuild.

View File

@ -0,0 +1 @@
b816b14ff92413ad1ed24840f9c9d498846ef98541a3ad64ab6b203c33f27ad7

View File

@ -0,0 +1,13 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = FRNWebSocket
build_property.ProjectDir = C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =

View File

@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@ -0,0 +1 @@
9b7ae5b731577ebceb993741f9c34fc2edb3cfa71fb60421e4275bab127df667

View File

@ -0,0 +1,24 @@
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\FRNWebSocket.csproj.AssemblyReference.cache
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\FRNWebSocket.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\FRNWebSocket.AssemblyInfoInputs.cache
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\FRNWebSocket.AssemblyInfo.cs
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\FRNWebSocket.csproj.CoreCompileInputs.cache
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\FRNWebSocket.exe
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\FRNWebSocket.deps.json
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\FRNWebSocket.runtimeconfig.json
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\FRNWebSocket.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\FRNWebSocket.pdb
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\NAudio.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\NAudio.Asio.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\NAudio.Core.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\NAudio.Midi.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\NAudio.Wasapi.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\NAudio.WinMM.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\sharpFRN.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\bin\Release\net8.0\sharpFRN.pdb
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\FRNWebSo.9D9585D7.Up2Date
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\FRNWebSocket.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\refint\FRNWebSocket.dll
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\FRNWebSocket.pdb
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\FRNWebSocket.genruntimeconfig.cache
C:\Users\Andrea Santaniello\source\repos\sharpFRN\FRNWebSocket\obj\Release\net8.0\ref\FRNWebSocket.dll

Binary file not shown.

View File

@ -0,0 +1 @@
560d4d7f825512e002fd31357d24b6b90a5e62de7de9757ef93b6977faac0714

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,522 @@
{
"version": 3,
"targets": {
"net8.0": {
"Microsoft.NETCore.Platforms/3.1.0": {
"type": "package",
"compile": {
"lib/netstandard1.0/_._": {}
},
"runtime": {
"lib/netstandard1.0/_._": {}
}
},
"Microsoft.Win32.Registry/4.7.0": {
"type": "package",
"dependencies": {
"System.Security.AccessControl": "4.7.0",
"System.Security.Principal.Windows": "4.7.0"
},
"compile": {
"ref/netstandard2.0/Microsoft.Win32.Registry.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"related": ".xml"
}
},
"runtimeTargets": {
"runtimes/unix/lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"assetType": "runtime",
"rid": "unix"
},
"runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"assetType": "runtime",
"rid": "win"
}
}
},
"NAudio/2.2.1": {
"type": "package",
"dependencies": {
"NAudio.Asio": "2.2.1",
"NAudio.Core": "2.2.1",
"NAudio.Midi": "2.2.1",
"NAudio.Wasapi": "2.2.1",
"NAudio.WinMM": "2.2.1"
},
"compile": {
"lib/net6.0/NAudio.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net6.0/NAudio.dll": {
"related": ".xml"
}
}
},
"NAudio.Asio/2.2.1": {
"type": "package",
"dependencies": {
"Microsoft.Win32.Registry": "4.7.0",
"NAudio.Core": "2.2.1"
},
"compile": {
"lib/netstandard2.0/NAudio.Asio.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/NAudio.Asio.dll": {
"related": ".xml"
}
}
},
"NAudio.Core/2.2.1": {
"type": "package",
"compile": {
"lib/netstandard2.0/NAudio.Core.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/NAudio.Core.dll": {
"related": ".xml"
}
}
},
"NAudio.Midi/2.2.1": {
"type": "package",
"dependencies": {
"NAudio.Core": "2.2.1"
},
"compile": {
"lib/netstandard2.0/NAudio.Midi.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/NAudio.Midi.dll": {
"related": ".xml"
}
}
},
"NAudio.Wasapi/2.2.1": {
"type": "package",
"dependencies": {
"NAudio.Core": "2.2.1"
},
"compile": {
"lib/netstandard2.0/NAudio.Wasapi.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/NAudio.Wasapi.dll": {
"related": ".xml"
}
}
},
"NAudio.WinMM/2.2.1": {
"type": "package",
"dependencies": {
"Microsoft.Win32.Registry": "4.7.0",
"NAudio.Core": "2.2.1"
},
"compile": {
"lib/netstandard2.0/NAudio.WinMM.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/NAudio.WinMM.dll": {
"related": ".xml"
}
}
},
"System.Security.AccessControl/4.7.0": {
"type": "package",
"dependencies": {
"Microsoft.NETCore.Platforms": "3.1.0",
"System.Security.Principal.Windows": "4.7.0"
},
"compile": {
"ref/netstandard2.0/System.Security.AccessControl.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/System.Security.AccessControl.dll": {
"related": ".xml"
}
},
"runtimeTargets": {
"runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll": {
"assetType": "runtime",
"rid": "win"
}
}
},
"System.Security.Principal.Windows/4.7.0": {
"type": "package",
"compile": {
"ref/netcoreapp3.0/System.Security.Principal.Windows.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/System.Security.Principal.Windows.dll": {
"related": ".xml"
}
},
"runtimeTargets": {
"runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"assetType": "runtime",
"rid": "unix"
},
"runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"assetType": "runtime",
"rid": "win"
}
}
}
}
},
"libraries": {
"Microsoft.NETCore.Platforms/3.1.0": {
"sha512": "z7aeg8oHln2CuNulfhiLYxCVMPEwBl3rzicjvIX+4sUuCwvXw5oXQEtbiU2c0z4qYL5L3Kmx0mMA/+t/SbY67w==",
"type": "package",
"path": "microsoft.netcore.platforms/3.1.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/netstandard1.0/_._",
"microsoft.netcore.platforms.3.1.0.nupkg.sha512",
"microsoft.netcore.platforms.nuspec",
"runtime.json",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"Microsoft.Win32.Registry/4.7.0": {
"sha512": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==",
"type": "package",
"path": "microsoft.win32.registry/4.7.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net46/Microsoft.Win32.Registry.dll",
"lib/net461/Microsoft.Win32.Registry.dll",
"lib/net461/Microsoft.Win32.Registry.xml",
"lib/netstandard1.3/Microsoft.Win32.Registry.dll",
"lib/netstandard2.0/Microsoft.Win32.Registry.dll",
"lib/netstandard2.0/Microsoft.Win32.Registry.xml",
"microsoft.win32.registry.4.7.0.nupkg.sha512",
"microsoft.win32.registry.nuspec",
"ref/net46/Microsoft.Win32.Registry.dll",
"ref/net461/Microsoft.Win32.Registry.dll",
"ref/net461/Microsoft.Win32.Registry.xml",
"ref/net472/Microsoft.Win32.Registry.dll",
"ref/net472/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/Microsoft.Win32.Registry.dll",
"ref/netstandard1.3/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/de/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/es/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/fr/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/it/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/ja/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/ko/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/ru/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/zh-hans/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/zh-hant/Microsoft.Win32.Registry.xml",
"ref/netstandard2.0/Microsoft.Win32.Registry.dll",
"ref/netstandard2.0/Microsoft.Win32.Registry.xml",
"runtimes/unix/lib/netstandard2.0/Microsoft.Win32.Registry.dll",
"runtimes/unix/lib/netstandard2.0/Microsoft.Win32.Registry.xml",
"runtimes/win/lib/net46/Microsoft.Win32.Registry.dll",
"runtimes/win/lib/net461/Microsoft.Win32.Registry.dll",
"runtimes/win/lib/net461/Microsoft.Win32.Registry.xml",
"runtimes/win/lib/netstandard1.3/Microsoft.Win32.Registry.dll",
"runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll",
"runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.xml",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"NAudio/2.2.1": {
"sha512": "c0DzwiyyklM0TP39Y7RObwO3QkWecgM6H60ikiEnsV/aEAJPbj5MFCLaD8BSfKuZe0HGuh9GRGWWlJmSxDc9MA==",
"type": "package",
"path": "naudio/2.2.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net472/NAudio.dll",
"lib/net472/NAudio.xml",
"lib/net6.0-windows7.0/NAudio.dll",
"lib/net6.0-windows7.0/NAudio.xml",
"lib/net6.0/NAudio.dll",
"lib/net6.0/NAudio.xml",
"lib/netcoreapp3.1/NAudio.dll",
"lib/netcoreapp3.1/NAudio.xml",
"license.txt",
"naudio-icon.png",
"naudio.2.2.1.nupkg.sha512",
"naudio.nuspec"
]
},
"NAudio.Asio/2.2.1": {
"sha512": "hQglyOT5iT3XuGpBP8ZG0+aoqwRfidHjTNehpoWwX0g6KJEgtH2VaqM2nuJ2mheKZa/IBqB4YQTZVvrIapzfOA==",
"type": "package",
"path": "naudio.asio/2.2.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/netstandard2.0/NAudio.Asio.dll",
"lib/netstandard2.0/NAudio.Asio.xml",
"naudio-icon.png",
"naudio.asio.2.2.1.nupkg.sha512",
"naudio.asio.nuspec"
]
},
"NAudio.Core/2.2.1": {
"sha512": "GgkdP6K/7FqXFo7uHvoqGZTJvW4z8g2IffhOO4JHaLzKCdDOUEzVKtveoZkCuUX8eV2HAINqi7VFqlFndrnz/g==",
"type": "package",
"path": "naudio.core/2.2.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/netstandard2.0/NAudio.Core.dll",
"lib/netstandard2.0/NAudio.Core.xml",
"naudio-icon.png",
"naudio.core.2.2.1.nupkg.sha512",
"naudio.core.nuspec"
]
},
"NAudio.Midi/2.2.1": {
"sha512": "6r23ylGo5aeP02WFXsPquz0T0hFJWyh+7t++tz19tc3Kr38NHm+Z9j+FiAv+xkH8tZqXJqus9Q8p6u7bidIgbw==",
"type": "package",
"path": "naudio.midi/2.2.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/netstandard2.0/NAudio.Midi.dll",
"lib/netstandard2.0/NAudio.Midi.xml",
"naudio-icon.png",
"naudio.midi.2.2.1.nupkg.sha512",
"naudio.midi.nuspec"
]
},
"NAudio.Wasapi/2.2.1": {
"sha512": "lFfXoqacZZe0WqNChJgGYI+XV/n/61LzPHT3C1CJp4khoxeo2sziyX5wzNYWeCMNbsWxFvT3b3iXeY1UYjBhZw==",
"type": "package",
"path": "naudio.wasapi/2.2.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/netstandard2.0/NAudio.Wasapi.dll",
"lib/netstandard2.0/NAudio.Wasapi.xml",
"lib/uap10.0.18362/NAudio.Wasapi.dll",
"lib/uap10.0.18362/NAudio.Wasapi.pri",
"lib/uap10.0.18362/NAudio.Wasapi.xml",
"naudio-icon.png",
"naudio.wasapi.2.2.1.nupkg.sha512",
"naudio.wasapi.nuspec"
]
},
"NAudio.WinMM/2.2.1": {
"sha512": "xFHRFwH4x6aq3IxRbewvO33ugJRvZFEOfO62i7uQJRUNW2cnu6BeBTHUS0JD5KBucZbHZaYqxQG8dwZ47ezQuQ==",
"type": "package",
"path": "naudio.winmm/2.2.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/netstandard2.0/NAudio.WinMM.dll",
"lib/netstandard2.0/NAudio.WinMM.xml",
"naudio-icon.png",
"naudio.winmm.2.2.1.nupkg.sha512",
"naudio.winmm.nuspec"
]
},
"System.Security.AccessControl/4.7.0": {
"sha512": "JECvTt5aFF3WT3gHpfofL2MNNP6v84sxtXxpqhLBCcDRzqsPBmHhQ6shv4DwwN2tRlzsUxtb3G9M3763rbXKDg==",
"type": "package",
"path": "system.security.accesscontrol/4.7.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net46/System.Security.AccessControl.dll",
"lib/net461/System.Security.AccessControl.dll",
"lib/net461/System.Security.AccessControl.xml",
"lib/netstandard1.3/System.Security.AccessControl.dll",
"lib/netstandard2.0/System.Security.AccessControl.dll",
"lib/netstandard2.0/System.Security.AccessControl.xml",
"lib/uap10.0.16299/_._",
"ref/net46/System.Security.AccessControl.dll",
"ref/net461/System.Security.AccessControl.dll",
"ref/net461/System.Security.AccessControl.xml",
"ref/netstandard1.3/System.Security.AccessControl.dll",
"ref/netstandard1.3/System.Security.AccessControl.xml",
"ref/netstandard1.3/de/System.Security.AccessControl.xml",
"ref/netstandard1.3/es/System.Security.AccessControl.xml",
"ref/netstandard1.3/fr/System.Security.AccessControl.xml",
"ref/netstandard1.3/it/System.Security.AccessControl.xml",
"ref/netstandard1.3/ja/System.Security.AccessControl.xml",
"ref/netstandard1.3/ko/System.Security.AccessControl.xml",
"ref/netstandard1.3/ru/System.Security.AccessControl.xml",
"ref/netstandard1.3/zh-hans/System.Security.AccessControl.xml",
"ref/netstandard1.3/zh-hant/System.Security.AccessControl.xml",
"ref/netstandard2.0/System.Security.AccessControl.dll",
"ref/netstandard2.0/System.Security.AccessControl.xml",
"ref/uap10.0.16299/_._",
"runtimes/win/lib/net46/System.Security.AccessControl.dll",
"runtimes/win/lib/net461/System.Security.AccessControl.dll",
"runtimes/win/lib/net461/System.Security.AccessControl.xml",
"runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll",
"runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.xml",
"runtimes/win/lib/netstandard1.3/System.Security.AccessControl.dll",
"runtimes/win/lib/uap10.0.16299/_._",
"system.security.accesscontrol.4.7.0.nupkg.sha512",
"system.security.accesscontrol.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"System.Security.Principal.Windows/4.7.0": {
"sha512": "ojD0PX0XhneCsUbAZVKdb7h/70vyYMDYs85lwEI+LngEONe/17A0cFaRFqZU+sOEidcVswYWikYOQ9PPfjlbtQ==",
"type": "package",
"path": "system.security.principal.windows/4.7.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net46/System.Security.Principal.Windows.dll",
"lib/net461/System.Security.Principal.Windows.dll",
"lib/net461/System.Security.Principal.Windows.xml",
"lib/netstandard1.3/System.Security.Principal.Windows.dll",
"lib/netstandard2.0/System.Security.Principal.Windows.dll",
"lib/netstandard2.0/System.Security.Principal.Windows.xml",
"lib/uap10.0.16299/_._",
"ref/net46/System.Security.Principal.Windows.dll",
"ref/net461/System.Security.Principal.Windows.dll",
"ref/net461/System.Security.Principal.Windows.xml",
"ref/netcoreapp3.0/System.Security.Principal.Windows.dll",
"ref/netcoreapp3.0/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/System.Security.Principal.Windows.dll",
"ref/netstandard1.3/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/de/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/es/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/fr/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/it/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/ja/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/ko/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/ru/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml",
"ref/netstandard2.0/System.Security.Principal.Windows.dll",
"ref/netstandard2.0/System.Security.Principal.Windows.xml",
"ref/uap10.0.16299/_._",
"runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.dll",
"runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.xml",
"runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll",
"runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.xml",
"runtimes/win/lib/net46/System.Security.Principal.Windows.dll",
"runtimes/win/lib/net461/System.Security.Principal.Windows.dll",
"runtimes/win/lib/net461/System.Security.Principal.Windows.xml",
"runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.dll",
"runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.xml",
"runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll",
"runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.xml",
"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll",
"runtimes/win/lib/uap10.0.16299/_._",
"system.security.principal.windows.4.7.0.nupkg.sha512",
"system.security.principal.windows.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
}
},
"projectFileDependencyGroups": {
"net8.0": [
"NAudio >= 2.2.1"
]
},
"packageFolders": {
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj",
"projectName": "FRNWebSocket",
"projectPath": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj",
"packagesPath": "C:\\Users\\Andrea Santaniello\\.nuget\\packages\\",
"outputPath": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Andrea Santaniello\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"NAudio": {
"target": "Package",
"version": "[2.2.1, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.400/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View File

@ -0,0 +1,19 @@
{
"version": 2,
"dgSpecHash": "CNZlfOUrNLo=",
"success": true,
"projectFilePath": "C:\\Users\\Andrea Santaniello\\source\\repos\\sharpFRN\\FRNWebSocket\\FRNWebSocket.csproj",
"expectedPackageFiles": [
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\microsoft.netcore.platforms\\3.1.0\\microsoft.netcore.platforms.3.1.0.nupkg.sha512",
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\microsoft.win32.registry\\4.7.0\\microsoft.win32.registry.4.7.0.nupkg.sha512",
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\naudio\\2.2.1\\naudio.2.2.1.nupkg.sha512",
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\naudio.asio\\2.2.1\\naudio.asio.2.2.1.nupkg.sha512",
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\naudio.core\\2.2.1\\naudio.core.2.2.1.nupkg.sha512",
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\naudio.midi\\2.2.1\\naudio.midi.2.2.1.nupkg.sha512",
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\naudio.wasapi\\2.2.1\\naudio.wasapi.2.2.1.nupkg.sha512",
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\naudio.winmm\\2.2.1\\naudio.winmm.2.2.1.nupkg.sha512",
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\system.security.accesscontrol\\4.7.0\\system.security.accesscontrol.4.7.0.nupkg.sha512",
"C:\\Users\\Andrea Santaniello\\.nuget\\packages\\system.security.principal.windows\\4.7.0\\system.security.principal.windows.4.7.0.nupkg.sha512"
],
"logs": []
}

31
sharpFRN.sln Normal file
View File

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35312.102
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "sharpFRN", "sharpFRN\sharpFRN.csproj", "{14CC80EB-8543-4998-8923-1315110CDE6F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FRNWebSocket", "FRNWebSocket\FRNWebSocket.csproj", "{6E758F82-FE03-4F20-8428-3479B871E126}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{14CC80EB-8543-4998-8923-1315110CDE6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{14CC80EB-8543-4998-8923-1315110CDE6F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{14CC80EB-8543-4998-8923-1315110CDE6F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{14CC80EB-8543-4998-8923-1315110CDE6F}.Release|Any CPU.Build.0 = Release|Any CPU
{6E758F82-FE03-4F20-8428-3479B871E126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6E758F82-FE03-4F20-8428-3479B871E126}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6E758F82-FE03-4F20-8428-3479B871E126}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6E758F82-FE03-4F20-8428-3479B871E126}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F5CD8BC4-8328-41D0-9831-5382E5D3EBBC}
EndGlobalSection
EndGlobal

675
sharpFRN/FRNClient.cs Normal file
View File

@ -0,0 +1,675 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Monoculus
{
// Enums for different states
public enum ClientState
{
None = 0x00,
Connecting = 0x01,
ProtoHandshake = 0x02,
LoginPhase1 = 0x03,
LoginPhase2 = 0x04,
MessageHeader = 0x05,
Message = 0x06,
Tx = 0x07,
Rx = 0x08,
ClientsHeader = 0x09,
Clients = 0x0A,
NetworksHeader = 0x0B,
Networks = 0x0C,
SndFrameIn = 0x0D,
KeepAlive = 0x0E,
Disconnected = 0x0F,
TxRequest = 0x10,
TxWaiting = 0x11,
TxApproved = 0x12,
TxRejected = 0x13,
TxComplete = 0x14,
Ping = 0x15,
BanlistHeader = 0x16,
Banlist = 0x17,
MutelistHeader = 0x18,
Mutelist = 0x19,
PttDown = 0x1A,
PttUp = 0x1B,
MessageInput = 0x1C,
MessageSend = 0x1D,
Abort = 0xFE,
Idle = 0xFF
}
// Constants for markers
public static class Markers
{
public const byte KeepAlive = 0x00;
public const byte TxApprove = 0x01;
public const byte Sound = 0x02;
public const byte Clients = 0x03;
public const byte Message = 0x04;
public const byte Networks = 0x05;
public const byte Ban = 0x08;
public const byte Mute = 0x09;
// Additional markers based on documentation
public const byte DT_IDLE = 0x00;
public const byte DT_DO_TX = 0x01;
public const byte DT_VOICE_BUFFER = 0x02;
public const byte DT_CLIENT_LIST = 0x03;
public const byte DT_TEXT_MESSAGE = 0x04;
public const byte DT_NET_NAMES = 0x05;
public const byte DT_ADMIN_LIST = 0x06;
public const byte DT_ACCESS_LIST = 0x07;
public const byte DT_BLOCK_LIST = 0x08;
public const byte DT_MUTE_LIST = 0x09;
public const byte DT_ACCESS_MODE = 0x0A;
}
// Other constants
public static class Constants
{
public const int KeepAliveTimeout = 1;
public const int FRNProtocolVersion = 2022001;
public const string FRNTypePCOnly = "PC Only";
public const string FRNTypeCrosslink = "Crosslink";
public const string FRNTypeParrot = "Parrot";
public const string FRNMessageBroadcast = "A";
public const string FRNMessagePrivate = "P";
public const int FRNStatusOnline = 0;
public const int FRNStatusAway = 1;
public const int FRNStatusNA = 2;
public const int FRNMuteOff = 0;
public const int FRNMuteOn = 1;
public const string FRNResultOK = "OK";
public const string FRNResultNOK = "NOK";
public const string FRNResultWrong = "WRONG";
}
/// <summary>
/// Represents a Free Radio Network client.
/// </summary>
public class FRNClient
{
private TcpClient _tcpClient;
private NetworkStream _networkStream;
private readonly string _host;
private readonly int _port;
private ClientState _state;
private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
// Client parameters
private readonly string _callSign;
private readonly string _name;
private readonly string _email;
private readonly string _password;
private readonly string _network;
private readonly string _country;
private readonly string _city;
private readonly string _locator;
private readonly string _type;
private readonly string _description;
// Buffers
private readonly List<byte> _inputBuffer = new List<byte>();
private readonly StringBuilder _outputBuffer = new StringBuilder();
// Last KeepAlive timestamp
private DateTime _lastKeepAlive;
// Event handlers (callbacks)
public event Action OnConnect;
public event Action OnDisconnect;
public event Action OnLogin;
public event Action<string> OnMessageReceived;
public event Action<byte[], int> OnVoiceDataReceived;
public event Action<List<ClientInfo>> OnClientListReceived;
// Additional properties and flags
private bool _isConnected;
// Variables to track voice data collection
private bool _isReceivingVoiceData = false;
private MemoryStream _voiceDataStream = new MemoryStream();
private int _currentActiveClientIndex = -1;
private readonly object _voiceDataLock = new object();
/// <summary>
/// Initializes a new instance of the FRNClient class.
/// </summary>
public FRNClient(string host, int port, string callSign, string name, string email, string password, string network, string country, string city, string locator, string type, string description)
{
_host = host;
_port = port;
_callSign = callSign;
_name = name;
_email = email;
_password = password;
_network = network;
_country = country ?? "N/A";
_city = city ?? "N/A";
_locator = locator ?? "N/A";
_type = type ?? Constants.FRNTypePCOnly;
_description = description ?? string.Empty;
_state = ClientState.None;
}
/// <summary>
/// Starts the client and connects to the server.
/// </summary>
public async Task RunAsync()
{
await ConnectAsync();
if (_isConnected)
{
await ProcessAsync(_cancellationTokenSource.Token);
}
}
/// <summary>
/// Connects to the FRN server.
/// </summary>
private async Task ConnectAsync()
{
try
{
_tcpClient = new TcpClient();
await _tcpClient.ConnectAsync(_host, _port);
_networkStream = _tcpClient.GetStream();
_state = ClientState.Connecting;
_isConnected = true;
OnConnect?.Invoke();
#if DEBUG
Console.WriteLine("Connected to server.");
#endif
// Start the login process
await SendLoginAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Connection failed: {ex.Message}");
_isConnected = false;
_state = ClientState.Disconnected;
OnDisconnect?.Invoke();
}
}
/// <summary>
/// Processes incoming and outgoing data.
/// </summary>
private async Task ProcessAsync(CancellationToken cancellationToken)
{
try
{
var readTask = ReadAsync(cancellationToken);
var writeTask = WriteAsync(cancellationToken);
var keepAliveTask = KeepAliveAsync(cancellationToken);
await Task.WhenAll(readTask, writeTask, keepAliveTask);
}
catch (Exception ex)
{
Console.WriteLine($"Processing error: {ex.Message}");
}
}
/// <summary>
/// Reads data from the network stream.
/// </summary>
private async Task ReadAsync(CancellationToken cancellationToken)
{
var buffer = new byte[8192];
while (_isConnected && !cancellationToken.IsCancellationRequested)
{
if (_networkStream.DataAvailable)
{
int bytesRead = await _networkStream.ReadAsync(buffer, 0, buffer.Length, cancellationToken);
if (bytesRead == 0)
{
// Connection closed
_isConnected = false;
_state = ClientState.Disconnected;
OnDisconnect?.Invoke();
#if DEBUG
Console.WriteLine("Disconnected from server.");
#endif
break;
}
// Process incoming data
byte[] dataReceived = new byte[bytesRead];
Array.Copy(buffer, dataReceived, bytesRead);
#if DEBUG
Console.WriteLine($"Received raw data ({bytesRead} bytes): {BitConverter.ToString(dataReceived)}");
#endif
_inputBuffer.AddRange(dataReceived);
ParseIncomingData();
}
else
{
await Task.Delay(100, cancellationToken);
}
}
}
/// <summary>
/// Parses incoming data from the server.
/// </summary>
private void ParseIncomingData()
{
while (true)
{
if (_inputBuffer.Count < 1)
{
// Not enough data
break;
}
if (_state == ClientState.LoginPhase1)
{
// We're expecting a login response
int newlineIndex = _inputBuffer.LastIndexOf((byte)'\r');
if (newlineIndex != -1)
{
byte[] lineBytes = _inputBuffer.GetRange(0, newlineIndex + 1).ToArray();
_inputBuffer.RemoveRange(0, newlineIndex + 1);
string response = Encoding.ASCII.GetString(lineBytes).Trim();
HandleLoginPhase1(response);
}
else
{
// Wait for more data
break;
}
}
else
{
byte dataType = _inputBuffer[0];
switch (dataType)
{
case Markers.DT_IDLE:
_inputBuffer.RemoveAt(0); // Remove DataType byte
HandleIdleState();
break;
case Markers.DT_DO_TX:
if (_inputBuffer.Count >= 1 + 2)
{
_inputBuffer.RemoveAt(0); // Remove DataType byte
HandleDoTx();
}
else
{
// Not enough data
return;
}
break;
case Markers.DT_VOICE_BUFFER:
if (_inputBuffer.Count >= 1 + 2 + 325)
{
_inputBuffer.RemoveAt(0); // Remove DataType byte
HandleVoiceBuffer();
}
else
{
// Not enough data
return;
}
break;
// Handle other data types similarly
default:
Console.WriteLine($"Unknown data type received: {dataType}");
_inputBuffer.RemoveAt(0); // Remove unknown DataType byte
break;
}
}
}
}
/// <summary>
/// Handles the 'DT_VOICE_BUFFER' data type.
/// </summary>
private void HandleVoiceBuffer()
{
if (_inputBuffer.Count >= 2 + 325)
{
ushort clientIndex = (ushort)((_inputBuffer[0] << 8) | _inputBuffer[1]);
_inputBuffer.RemoveRange(0, 2);
byte[] voiceData = _inputBuffer.GetRange(0, 325).ToArray();
_inputBuffer.RemoveRange(0, 325);
#if DEBUG
Console.WriteLine($"Received voice data from client index: {clientIndex}");
#endif
// Invoke the event handler to process the voice data
OnVoiceDataReceived?.Invoke(voiceData, clientIndex);
}
else
{
// Not enough data
}
}
/// <summary>
/// Handles the 'DT_DO_TX' data type.
/// </summary>
private void HandleDoTx()
{
if (_inputBuffer.Count >= 2)
{
ushort clientIndex = (ushort)((_inputBuffer[0] << 8) | _inputBuffer[1]);
_inputBuffer.RemoveRange(0, 2);
Console.WriteLine($"Server indicates you may start sending voice data. Active client index: {clientIndex}");
// Implement logic to start transmitting voice data
}
else
{
// Wait for more data
}
}
/// <summary>
/// Handles the 'DT_IDLE' data type.
/// </summary>
private void HandleIdleState()
{
#if DEBUG
Console.WriteLine("Server is idle. No new data.");
#endif
lock (_voiceDataLock)
{
if (_isReceivingVoiceData)
{
// Transmission ended
_isReceivingVoiceData = false;
// Reset active client index
_currentActiveClientIndex = -1;
_voiceDataStream.SetLength(0);
}
}
}
/// <summary>
/// Parses incoming data for login response.
/// </summary>
private void HandleLoginPhase1(string response)
{
// Extract the server version number
int index = 0;
while (index < response.Length && char.IsDigit(response[index]))
{
index++;
}
string versionString = response.Substring(0, index);
string xmlData = response.Substring(index);
#if DEBUG
Console.WriteLine($"Server version: {versionString}");
#endif
// Parse the XML-like data
var xmlTags = new Dictionary<string, string>();
int pos = 0;
while (pos < xmlData.Length)
{
if (xmlData[pos] == '<')
{
int tagStart = pos + 1;
int tagEnd = xmlData.IndexOf('>', tagStart);
if (tagEnd == -1)
break; // incomplete tag
string tagName = xmlData.Substring(tagStart, tagEnd - tagStart);
int closingTagStart = xmlData.IndexOf($"</{tagName}>", tagEnd + 1);
if (closingTagStart == -1)
{
// Some tags might be self-closing or empty; adjust as needed
closingTagStart = tagEnd;
// break; // incomplete data
}
string tagValue = xmlData.Substring(tagEnd + 1, closingTagStart - tagEnd - 1);
xmlTags[tagName] = tagValue;
pos = closingTagStart + tagName.Length + 3; // Move past the closing tag
}
else
{
pos++;
}
}
// Process the extracted tags
if (xmlTags.TryGetValue("AL", out string accessLevel))
{
Console.WriteLine($"Access Level: {accessLevel}");
if (accessLevel == "OK" || accessLevel == "OWNER" || accessLevel == "NETOWNER" || accessLevel == "ADMIN")
{
_state = ClientState.LoginPhase2;
OnLogin?.Invoke();
#if DEBUG
Console.WriteLine("Login successful.");
#endif
_state = ClientState.Idle;
// Send 'RX0' to server as per documentation
SendAsync("RX0\r\n").Wait();
}
else
{
Console.WriteLine("Login failed or access blocked.");
_state = ClientState.Abort;
_isConnected = false;
OnDisconnect?.Invoke();
}
}
else
{
Console.WriteLine("Failed to parse access level.");
_state = ClientState.Abort;
_isConnected = false;
OnDisconnect?.Invoke();
}
}
/// <summary>
/// Writes data to the network stream.
/// </summary>
private async Task WriteAsync(CancellationToken cancellationToken)
{
while (_isConnected && !cancellationToken.IsCancellationRequested)
{
if (_outputBuffer.Length > 0)
{
string dataToSend;
lock (_outputBuffer)
{
dataToSend = _outputBuffer.ToString();
_outputBuffer.Clear();
}
byte[] data = Encoding.ASCII.GetBytes(dataToSend);
#if DEBUG
Console.WriteLine($"Sending raw data ({data.Length} bytes): {BitConverter.ToString(data)}");
#endif
await _networkStream.WriteAsync(data, 0, data.Length, cancellationToken);
await _networkStream.FlushAsync(cancellationToken);
}
else
{
await Task.Delay(100, cancellationToken);
}
}
}
/// <summary>
/// Sends periodic keep-alive messages to the server.
/// </summary>
private async Task KeepAliveAsync(CancellationToken cancellationToken)
{
while (_isConnected && !cancellationToken.IsCancellationRequested)
{
if ((DateTime.Now - _lastKeepAlive).TotalSeconds > Constants.KeepAliveTimeout)
{
await SendKeepAliveAsync();
}
await Task.Delay(500, cancellationToken);
}
}
/// <summary>
/// Sends the initial login message to the server.
/// </summary>
private async Task SendLoginAsync()
{
string loginMessage = BuildLoginMessage();
await SendAsync(loginMessage);
_state = ClientState.LoginPhase1;
}
/// <summary>
/// Builds the login message.
/// </summary>
private string BuildLoginMessage()
{
var sb = new StringBuilder();
sb.Append("CT:");
sb.Append($"<VX>{Constants.FRNProtocolVersion}</VX>");
sb.Append($"<EA>{_email}</EA>");
sb.Append($"<PW>{_password}</PW>");
sb.Append($"<ON>{_callSign}</ON>");
sb.Append($"<CL>0</CL>");
sb.Append($"<BC>{_type}</BC>"); // Adjusted as per documentation
sb.Append($"<DS>{_description}</DS>");
sb.Append($"<NN>{_country}</NN>");
sb.Append($"<CT>{_city} - {_locator}</CT>");
sb.Append($"<NT>{_network}</NT>");
sb.Append("\r\n");
#if DEBUG
Console.WriteLine($"Built login message: {sb}");
#endif
return sb.ToString();
}
/// <summary>
/// Sends a keep-alive message to the server.
/// </summary>
private async Task SendKeepAliveAsync()
{
await SendAsync("P\r\n");
_lastKeepAlive = DateTime.Now;
#if DEBUG
Console.WriteLine("Sent keep-alive to server.");
#endif
}
/// <summary>
/// Sends data to the server.
/// </summary>
private async Task SendAsync(string data)
{
lock (_outputBuffer)
{
_outputBuffer.Append(data);
}
}
/// <summary>
/// Disconnects the client.
/// </summary>
public void Disconnect()
{
_isConnected = false;
_cancellationTokenSource.Cancel();
_networkStream?.Close();
_tcpClient?.Close();
_state = ClientState.Disconnected;
OnDisconnect?.Invoke();
Console.WriteLine("Client disconnected.");
}
// Other methods to handle sending messages, changing status, etc.
/// <summary>
/// Sends a text message to the server.
/// </summary>
public async Task SendMessageAsync(string recipientId, string message)
{
string messageToSend = $"TM:<ID>{recipientId}</ID><MS>{message}</MS>\r\n";
await SendAsync(messageToSend);
Console.WriteLine($"Sent message to {recipientId}: {message}");
}
/// <summary>
/// Sends a status update to the server.
/// </summary>
public async Task SendStatusAsync(int status)
{
string statusMessage = $"ST:{status}\r\n";
await SendAsync(statusMessage);
Console.WriteLine($"Sent status update: {status}");
}
/// <summary>
/// Requests to start transmitting voice data.
/// </summary>
public async Task RequestTransmitAsync()
{
await SendAsync("TX0\r\n");
Console.WriteLine("Requested to start transmitting voice data.");
}
}
/// <summary>
/// Represents client information received from the server.
/// </summary>
public class ClientInfo
{
public string Status { get; set; }
public string Muted { get; set; }
public string Country { get; set; }
public string City { get; set; }
public string BandAndChannel { get; set; }
public string ClientType { get; set; }
public string CallsignAndUser { get; set; }
public string ID { get; set; }
public string Description { get; set; }
}
// Extension method to find index of a byte in a List<byte>
public static class Extensions
{
public static int IndexOf(this List<byte> buffer, byte value)
{
for (int i = 0; i < buffer.Count; i++)
{
if (buffer[i] == value)
return i;
}
return -1;
}
}
}

26
sharpFRN/Properties/Settings.Designer.cs generated Normal file
View File

@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Il codice è stato generato da uno strumento.
// Versione runtime:4.0.30319.42000
//
// Le modifiche apportate a questo file possono provocare un comportamento non corretto e andranno perse se
// il codice viene rigenerato.
// </auto-generated>
//------------------------------------------------------------------------------
namespace sharpFRN.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,6 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
</SettingsFile>

View File

@ -0,0 +1,8 @@
{
"profiles": {
"sharpFRN": {
"commandName": "Project",
"nativeDebugging": true
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More