diff --git a/WhackerLinkConsoleV2/AudioManager.cs b/WhackerLinkConsoleV2/AudioManager.cs index 833d71c..45ee825 100644 --- a/WhackerLinkConsoleV2/AudioManager.cs +++ b/WhackerLinkConsoleV2/AudioManager.cs @@ -26,25 +26,16 @@ namespace WhackerLinkConsoleV2 { public class AudioManager { - private WaveOutEvent _waveOut; - private MixingSampleProvider _mixer; - - private Dictionary _talkgroupProviders; + private Dictionary _talkgroupProviders; + private SettingsManager _settingsManager; /// /// Creates an instance of /// - public AudioManager() + public AudioManager(SettingsManager settingsManager) { - _waveOut = new WaveOutEvent(); - _talkgroupProviders = new Dictionary(); - _mixer = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(8000, 1)) - { - ReadFully = true - }; - - _waveOut.Init(_mixer); - _waveOut.Play(); + _settingsManager = settingsManager; + _talkgroupProviders = new Dictionary(); } /// @@ -66,6 +57,13 @@ namespace WhackerLinkConsoleV2 /// private void AddTalkgroupStream(string talkgroupId) { + int deviceIndex = _settingsManager.ChannelOutputDevices.ContainsKey(talkgroupId) ? _settingsManager.ChannelOutputDevices[talkgroupId] : 0; + + var waveOut = new WaveOutEvent + { + DeviceNumber = deviceIndex + }; + var bufferProvider = new BufferedWaveProvider(new WaveFormat(8000, 16, 1)) { DiscardOnBufferOverflow = true @@ -76,8 +74,17 @@ namespace WhackerLinkConsoleV2 Gain = 1.0f }; - _talkgroupProviders[talkgroupId] = (bufferProvider, gainProvider); - _mixer.AddMixerInput(gainProvider); + var mixer = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(8000, 1)) + { + ReadFully = true + }; + + mixer.AddMixerInput(gainProvider); + + waveOut.Init(mixer); + waveOut.Play(); + + _talkgroupProviders[talkgroupId] = (waveOut, mixer, bufferProvider, gainProvider); } /// @@ -96,12 +103,30 @@ namespace WhackerLinkConsoleV2 } } + /// + /// Set stream output device + /// + /// + /// + public void SetTalkgroupOutputDevice(string talkgroupId, int deviceIndex) + { + if (_talkgroupProviders.ContainsKey(talkgroupId)) + { + _talkgroupProviders[talkgroupId].waveOut.Stop(); + _talkgroupProviders.Remove(talkgroupId); + } + + _settingsManager.UpdateChannelOutputDevice(talkgroupId, deviceIndex); + AddTalkgroupStream(talkgroupId); + } + /// /// Lop off the wave out /// public void Stop() { - _waveOut.Stop(); + foreach (var provider in _talkgroupProviders.Values) + provider.waveOut.Stop(); } } } diff --git a/WhackerLinkConsoleV2/AudioSettingsWindow.xaml b/WhackerLinkConsoleV2/AudioSettingsWindow.xaml index c82154e..ddcf399 100644 --- a/WhackerLinkConsoleV2/AudioSettingsWindow.xaml +++ b/WhackerLinkConsoleV2/AudioSettingsWindow.xaml @@ -1,22 +1,25 @@  + - - + + - - + + + + - +