// SPDX-License-Identifier: AGPL-3.0-only
/**
* Digital Voice Modem - Desktop Dispatch Console
* AGPLv3 Open Source. Use is subject to license terms.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* @package DVM / Desktop Dispatch Console
* @license AGPLv3 License (https://opensource.org/licenses/AGPL-3.0)
*
* Copyright (C) 2025 Caleb, K4PHP
*
*/
using System.Windows;
using System.Windows.Controls;
using NAudio.Wave;
namespace dvmconsole
{
///
/// Interaction logic for AudioSettingsWindow.xaml.
///
public partial class AudioSettingsWindow : Window
{
private readonly SettingsManager settingsManager;
private readonly AudioManager audioManager;
private readonly List channels;
private readonly Dictionary selectedOutputDevices = new Dictionary();
/*
** Methods
*/
///
/// Initializes a new instance of the class.
///
///
///
///
public AudioSettingsWindow(SettingsManager settingsManager, AudioManager audioManager, List channels)
{
InitializeComponent();
this.settingsManager = settingsManager;
this.audioManager = audioManager;
this.channels = channels;
LoadAudioDevices();
LoadChannelOutputSettings();
}
///
///
///
private void LoadAudioDevices()
{
List inputDevices = GetAudioInputDevices();
List outputDevices = GetAudioOutputDevices();
InputDeviceComboBox.ItemsSource = inputDevices;
InputDeviceComboBox.SelectedIndex = settingsManager.ChannelOutputDevices.ContainsKey("GLOBAL_INPUT")
? settingsManager.ChannelOutputDevices["GLOBAL_INPUT"] : 0;
}
///
///
///
private void LoadChannelOutputSettings()
{
List outputDevices = GetAudioOutputDevices();
foreach (var channel in channels)
{
TextBlock channelLabel = new TextBlock
{
Text = channel.Name,
FontWeight = FontWeights.Bold,
Margin = new Thickness(0, 5, 0, 0)
};
ComboBox outputDeviceComboBox = new ComboBox
{
Width = 350,
ItemsSource = outputDevices,
SelectedIndex = settingsManager.ChannelOutputDevices.ContainsKey(channel.Tgid)
? settingsManager.ChannelOutputDevices[channel.Tgid]
: 0
};
outputDeviceComboBox.SelectionChanged += (s, e) =>
{
int selectedIndex = outputDeviceComboBox.SelectedIndex;
selectedOutputDevices[channel.Tgid] = selectedIndex;
};
ChannelOutputStackPanel.Children.Add(channelLabel);
ChannelOutputStackPanel.Children.Add(outputDeviceComboBox);
}
}
///
///
///
///
private List GetAudioInputDevices()
{
List inputDevices = new List();
for (int i = 0; i < WaveIn.DeviceCount; i++)
{
var deviceInfo = WaveIn.GetCapabilities(i);
inputDevices.Add(deviceInfo.ProductName);
}
return inputDevices;
}
///
///
///
///
private List GetAudioOutputDevices()
{
List outputDevices = new List();
for (int i = 0; i < WaveOut.DeviceCount; i++)
{
var deviceInfo = WaveOut.GetCapabilities(i);
outputDevices.Add(deviceInfo.ProductName);
}
return outputDevices;
}
///
///
///
///
///
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
int selectedInputIndex = InputDeviceComboBox.SelectedIndex;
settingsManager.UpdateChannelOutputDevice("GLOBAL_INPUT", selectedInputIndex);
foreach (var entry in selectedOutputDevices)
{
settingsManager.UpdateChannelOutputDevice(entry.Key, entry.Value);
audioManager.SetTalkgroupOutputDevice(entry.Key, entry.Value);
}
DialogResult = true;
Close();
}
///
///
///
///
///
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
Close();
}
} // public partial class AudioSettingsWindow : Window
} // namespace dvmconsole