|
|
|
@ -38,6 +38,8 @@ using NAudio.Wave;
|
|
|
|
using WhackerLinkLib.Interfaces;
|
|
|
|
using WhackerLinkLib.Interfaces;
|
|
|
|
using WhackerLinkLib.Models.IOSP;
|
|
|
|
using WhackerLinkLib.Models.IOSP;
|
|
|
|
using Nancy;
|
|
|
|
using Nancy;
|
|
|
|
|
|
|
|
using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
|
|
|
|
|
|
|
|
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
|
|
|
|
|
|
|
|
|
|
|
|
namespace WhackerLinkConsoleV2
|
|
|
|
namespace WhackerLinkConsoleV2
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -251,6 +253,7 @@ namespace WhackerLinkConsoleV2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
channelBox.PTTButtonClicked += ChannelBox_PTTButtonClicked;
|
|
|
|
channelBox.PTTButtonClicked += ChannelBox_PTTButtonClicked;
|
|
|
|
|
|
|
|
channelBox.PageButtonClicked += ChannelBox_PageButtonClicked;
|
|
|
|
|
|
|
|
|
|
|
|
channelBox.MouseLeftButtonDown += ChannelBox_MouseLeftButtonDown;
|
|
|
|
channelBox.MouseLeftButtonDown += ChannelBox_MouseLeftButtonDown;
|
|
|
|
channelBox.MouseMove += ChannelBox_MouseMove;
|
|
|
|
channelBox.MouseMove += ChannelBox_MouseMove;
|
|
|
|
@ -347,8 +350,23 @@ namespace WhackerLinkConsoleV2
|
|
|
|
$"Selected Output Device Index: {outputDeviceIndex}",
|
|
|
|
$"Selected Output Device Index: {outputDeviceIndex}",
|
|
|
|
"Selected Devices");
|
|
|
|
"Selected Devices");
|
|
|
|
|
|
|
|
|
|
|
|
_waveIn.DeviceNumber = inputDeviceIndex.Value;
|
|
|
|
try
|
|
|
|
_waveOut.DeviceNumber = outputDeviceIndex.Value;
|
|
|
|
{
|
|
|
|
|
|
|
|
_waveIn.StopRecording();
|
|
|
|
|
|
|
|
_waveIn.DeviceNumber = inputDeviceIndex.Value;
|
|
|
|
|
|
|
|
_waveIn.StartRecording();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_waveOut.Stop();
|
|
|
|
|
|
|
|
_waveOut.DeviceNumber = outputDeviceIndex.Value;
|
|
|
|
|
|
|
|
_waveOut.Init(_waveProvider);
|
|
|
|
|
|
|
|
_waveOut.Play();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MessageBox.Show("Audio devices updated successfully.", "Success");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
MessageBox.Show($"Failed to update audio devices: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -368,6 +386,59 @@ namespace WhackerLinkConsoleV2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void ManualPage_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
QuickCallPage pageWindow = new QuickCallPage();
|
|
|
|
|
|
|
|
pageWindow.Owner = this;
|
|
|
|
|
|
|
|
if (pageWindow.ShowDialog() == true)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
foreach (ChannelBox channel in _selectedChannelsManager.GetSelectedChannels())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Codeplug.System system = Codeplug.GetSystemForChannel(channel.ChannelName);
|
|
|
|
|
|
|
|
Codeplug.Channel cpgChannel = Codeplug.GetChannelByName(channel.ChannelName);
|
|
|
|
|
|
|
|
IWebSocketHandler handler = _webSocketManager.GetWebSocketHandler(system.Name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (channel.PageState)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ToneGenerator generator = new ToneGenerator();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
byte[] toneA = generator.GenerateTone(Double.Parse(pageWindow.ToneA), 1.0);
|
|
|
|
|
|
|
|
byte[] toneB = generator.GenerateTone(Double.Parse(pageWindow.ToneB), 3.0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
byte[] combinedAudio = new byte[toneA.Length + toneB.Length];
|
|
|
|
|
|
|
|
Buffer.BlockCopy(toneA, 0, combinedAudio, 0, toneA.Length);
|
|
|
|
|
|
|
|
Buffer.BlockCopy(toneB, 0, combinedAudio, toneA.Length, toneB.Length);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int chunkSize = 1600;
|
|
|
|
|
|
|
|
int totalChunks = (combinedAudio.Length + chunkSize - 1) / chunkSize;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Task.Factory.StartNew(() =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
_waveProvider.ClearBuffer();
|
|
|
|
|
|
|
|
_waveProvider.AddSamples(combinedAudio, 0, combinedAudio.Length);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < totalChunks; i++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int offset = i * chunkSize;
|
|
|
|
|
|
|
|
int size = Math.Min(chunkSize, combinedAudio.Length - offset);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
byte[] chunk = new byte[size];
|
|
|
|
|
|
|
|
Buffer.BlockCopy(combinedAudio, offset, chunk, 0, size);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handler.SendMessage(PacketFactory.CreateVoicePacket(system.Rid, cpgChannel.Tgid, channel.VoiceChannel, chunk, system.Site));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handler.SendMessage(PacketFactory.CreateVoiceChannelRelease(system.Rid, cpgChannel.Tgid, channel.VoiceChannel, system.Site));
|
|
|
|
|
|
|
|
Dispatcher.Invoke(() =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
channel.PageSelectButton.Background = Brushes.Green;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void SelectWidgets_Click(object sender, RoutedEventArgs e)
|
|
|
|
private void SelectWidgets_Click(object sender, RoutedEventArgs e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
WidgetSelectionWindow widgetSelectionWindow = new WidgetSelectionWindow();
|
|
|
|
WidgetSelectionWindow widgetSelectionWindow = new WidgetSelectionWindow();
|
|
|
|
@ -468,6 +539,9 @@ namespace WhackerLinkConsoleV2
|
|
|
|
{
|
|
|
|
{
|
|
|
|
channel.Background = new SolidColorBrush(Colors.DarkCyan);
|
|
|
|
channel.Background = new SolidColorBrush(Colors.DarkCyan);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
} else if (channel.PageState && response.Status == (int)ResponseType.GRANT && response.Channel != null && response.SrcId == system.Rid && response.DstId == cpgChannel.Tgid)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
channel.VoiceChannel = response.Channel;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -485,6 +559,22 @@ namespace WhackerLinkConsoleV2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void ChannelBox_PageButtonClicked(object sender, ChannelBox e)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Codeplug.System system = Codeplug.GetSystemForChannel(e.ChannelName);
|
|
|
|
|
|
|
|
Codeplug.Channel cpgChannel = Codeplug.GetChannelByName(e.ChannelName);
|
|
|
|
|
|
|
|
IWebSocketHandler handler = _webSocketManager.GetWebSocketHandler(system.Name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (e.PageState)
|
|
|
|
|
|
|
|
handler.SendMessage(PacketFactory.CreateVoiceChannelRequest(system.Rid, cpgChannel.Tgid, system.Site));
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//_stopSending = true;
|
|
|
|
|
|
|
|
handler.SendMessage(PacketFactory.CreateVoiceChannelRelease(system.Rid, cpgChannel.Tgid, e.VoiceChannel, system.Site));
|
|
|
|
|
|
|
|
e.VoiceChannel = null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void ChannelBox_PTTButtonClicked(object sender, ChannelBox e)
|
|
|
|
private void ChannelBox_PTTButtonClicked(object sender, ChannelBox e)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Codeplug.System system = Codeplug.GetSystemForChannel(e.ChannelName);
|
|
|
|
Codeplug.System system = Codeplug.GetSystemForChannel(e.ChannelName);
|
|
|
|
|