/* * WhackerLink - WhackerLinkConsoleV2 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Copyright (C) 2024-2025 Caleb, K4PHP * */ using System.Windows; using System.Collections.Generic; using System.Linq; using NAudio.Wave; using System.Windows.Controls; using WhackerLinkLib.Models.Radio; namespace WhackerLinkConsoleV2 { public partial class AudioSettingsWindow : Window { private readonly SettingsManager _settingsManager; private readonly AudioManager _audioManager; private readonly List _channels; private readonly Dictionary _selectedOutputDevices = new Dictionary(); public AudioSettingsWindow(SettingsManager settingsManager, AudioManager audioManager, List channels) { InitializeComponent(); _settingsManager = settingsManager; _audioManager = audioManager; _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(); } } }