From 2ccd34690fdb64727b8e8307b1441538f43a1dbe Mon Sep 17 00:00:00 2001 From: firealarmss Date: Thu, 27 Feb 2025 02:23:06 -0600 Subject: [PATCH] Add support for per channel audio control --- .editorconfig | 4 ++ WhackerLinkConsoleV2.sln | 5 ++ WhackerLinkConsoleV2/AudioManager.cs | 48 ++++++++++---- WhackerLinkConsoleV2/ChannelBox.xaml | 6 +- WhackerLinkConsoleV2/ChannelBox.xaml.cs | 27 +++++++- WhackerLinkConsoleV2/MainWindow.xaml.cs | 66 +++++++++++-------- .../codeplugs/codeplug_mod.yml | 47 +++++++++++++ 7 files changed, 164 insertions(+), 39 deletions(-) create mode 100644 .editorconfig create mode 100644 WhackerLinkConsoleV2/codeplugs/codeplug_mod.yml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d04e9d1 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +[*.cs] + +# CS4014: Because this call is not awaited, execution of the current method continues before the call is completed +dotnet_diagnostic.CS4014.severity = none diff --git a/WhackerLinkConsoleV2.sln b/WhackerLinkConsoleV2.sln index 428a1aa..149eb69 100644 --- a/WhackerLinkConsoleV2.sln +++ b/WhackerLinkConsoleV2.sln @@ -7,6 +7,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WhackerLinkLib", "WhackerLi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WhackerLinkConsoleV2", "WhackerLinkConsoleV2\WhackerLinkConsoleV2.csproj", "{710D1FA8-2E0D-42CB-9174-FCD9EB7A718F}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B5A7CF60-CCDE-4B2B-85C1-86AE3A19FB31}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/WhackerLinkConsoleV2/AudioManager.cs b/WhackerLinkConsoleV2/AudioManager.cs index ef369da..f190322 100644 --- a/WhackerLinkConsoleV2/AudioManager.cs +++ b/WhackerLinkConsoleV2/AudioManager.cs @@ -21,7 +21,6 @@ using NAudio.Wave; using NAudio.Wave.SampleProviders; using System.Collections.Generic; -using System.Diagnostics; namespace WhackerLinkConsoleV2 { @@ -29,7 +28,8 @@ namespace WhackerLinkConsoleV2 { private WaveOutEvent _waveOut; private MixingSampleProvider _mixer; - private Dictionary _talkgroupProviders; + + private Dictionary _talkgroupProviders; /// /// Creates an instance of @@ -37,7 +37,7 @@ namespace WhackerLinkConsoleV2 public AudioManager() { _waveOut = new WaveOutEvent(); - _talkgroupProviders = new Dictionary(); + _talkgroupProviders = new Dictionary(); _mixer = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(8000, 1)) { ReadFully = true @@ -55,17 +55,43 @@ namespace WhackerLinkConsoleV2 public void AddTalkgroupStream(string talkgroupId, byte[] audioData) { if (!_talkgroupProviders.ContainsKey(talkgroupId)) + AddTalkgroupStream(talkgroupId); + + _talkgroupProviders[talkgroupId].buffer.AddSamples(audioData, 0, audioData.Length); + } + + /// + /// Internal helper to create a talkgroup stream + /// + /// + private void AddTalkgroupStream(string talkgroupId) + { + var bufferProvider = new BufferedWaveProvider(new WaveFormat(8000, 16, 1)) { - var provider = new BufferedWaveProvider(new WaveFormat(8000, 16, 1)) - { - DiscardOnBufferOverflow = true - }; + DiscardOnBufferOverflow = true + }; - _talkgroupProviders[talkgroupId] = provider; - _mixer.AddMixerInput(provider.ToSampleProvider()); - } + var volumeProvider = new VolumeSampleProvider(bufferProvider.ToSampleProvider()) + { + Volume = 1.0f + }; - _talkgroupProviders[talkgroupId].AddSamples(audioData, 0, audioData.Length); + _talkgroupProviders[talkgroupId] = (bufferProvider, volumeProvider); + _mixer.AddMixerInput(volumeProvider); + } + + /// + /// Adjusts the volume of a specific talkgroup stream + /// + public void SetTalkgroupVolume(string talkgroupId, float volume) + { + if (_talkgroupProviders.ContainsKey(talkgroupId)) + _talkgroupProviders[talkgroupId].volumeProvider.Volume = volume; + else + { + AddTalkgroupStream(talkgroupId); + _talkgroupProviders[talkgroupId].volumeProvider.Volume = volume; + } } /// diff --git a/WhackerLinkConsoleV2/ChannelBox.xaml b/WhackerLinkConsoleV2/ChannelBox.xaml index 4c5338a..62e302e 100644 --- a/WhackerLinkConsoleV2/ChannelBox.xaml +++ b/WhackerLinkConsoleV2/ChannelBox.xaml @@ -1,7 +1,7 @@  @@ -10,6 +10,7 @@ + @@ -20,6 +21,9 @@ HorizontalAlignment="Left" Grid.Row="3" Click="PTTButton_Click"/>