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