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