From 8aaf8d1801f3c474f63090a86644f586b34911fe Mon Sep 17 00:00:00 2001 From: Ciaran Fisher Date: Sat, 24 Oct 2020 13:45:43 +0100 Subject: [PATCH 1/8] Added Configurable PTT Tones TODO add effects slider alongside global audio slider --- DCS-SR-Client/Audio/Managers/AudioManager.cs | 91 +++++++---- DCS-SR-Client/Audio/Managers/AudioPreview.cs | 4 +- .../Managers/CachedAudioEffectProvider.cs | 145 ++++++++++++++++++ .../Audio/Models/CachedAudioEffect.cs | 69 ++++++--- .../Providers/CachedLoopingAudioProvider.cs | 3 +- .../{KY-58-RX-48K.wav => KY_58_RX.wav} | Bin .../{KY-58-TX-48K.wav => KY_58_TX.wav} | Bin .../{nato-mids-tone-48K.wav => MIDS_TX.wav} | Bin ...-mids-tone-out-48k.wav => MIDS_TX_END.wav} | Bin .../{nato-tone-48k.wav => NATO_TONE.wav} | Bin .../AudioEffects/Original/Radio-RX-1600.wav | Bin 0 -> 876 bytes .../AudioEffects/Original/Radio-TX-1600.wav | Bin 0 -> 876 bytes .../{Radio-TX-48K.wav => RADIO_TRANS_END.wav} | Bin .../RADIO_TRANS_END_ALTERNATE.wav | Bin 0 -> 2540 bytes ...Radio-RX-48K.wav => RADIO_TRANS_START.wav} | Bin .../RADIO_TRANS_START_ALTERNATE.wav | Bin 0 -> 2540 bytes DCS-SR-Client/DCS-SR-Client.csproj | 21 ++- .../Settings/ProfileSettingsStore.cs | 10 +- DCS-SR-Client/UI/ClientWindow/MainWindow.xaml | 114 ++++++++------ .../UI/ClientWindow/MainWindow.xaml.cs | 30 ++++ Installer/MainWindow.xaml.cs | 11 +- .../Scripts/DCS-SimpleRadioStandalone.lua | 2 +- 22 files changed, 380 insertions(+), 120 deletions(-) create mode 100644 DCS-SR-Client/Audio/Managers/CachedAudioEffectProvider.cs rename DCS-SR-Client/AudioEffects/{KY-58-RX-48K.wav => KY_58_RX.wav} (100%) rename DCS-SR-Client/AudioEffects/{KY-58-TX-48K.wav => KY_58_TX.wav} (100%) rename DCS-SR-Client/AudioEffects/{nato-mids-tone-48K.wav => MIDS_TX.wav} (100%) rename DCS-SR-Client/AudioEffects/{nato-mids-tone-out-48k.wav => MIDS_TX_END.wav} (100%) rename DCS-SR-Client/AudioEffects/{nato-tone-48k.wav => NATO_TONE.wav} (100%) create mode 100644 DCS-SR-Client/AudioEffects/Original/Radio-RX-1600.wav create mode 100644 DCS-SR-Client/AudioEffects/Original/Radio-TX-1600.wav rename DCS-SR-Client/AudioEffects/{Radio-TX-48K.wav => RADIO_TRANS_END.wav} (100%) create mode 100644 DCS-SR-Client/AudioEffects/RADIO_TRANS_END_ALTERNATE.wav rename DCS-SR-Client/AudioEffects/{Radio-RX-48K.wav => RADIO_TRANS_START.wav} (100%) create mode 100644 DCS-SR-Client/AudioEffects/RADIO_TRANS_START_ALTERNATE.wav diff --git a/DCS-SR-Client/Audio/Managers/AudioManager.cs b/DCS-SR-Client/Audio/Managers/AudioManager.cs index c79da5688..34d3dce42 100644 --- a/DCS-SR-Client/Audio/Managers/AudioManager.cs +++ b/DCS-SR-Client/Audio/Managers/AudioManager.cs @@ -42,7 +42,7 @@ public class AudioManager private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private readonly CachedAudioEffect[] _cachedAudioEffects; + private readonly CachedAudioEffectProvider _cachedAudioEffectsProvider; private readonly ConcurrentDictionary _clientsBufferedAudio = new ConcurrentDictionary(); @@ -83,12 +83,7 @@ public AudioManager(bool windowsN) { this.windowsN = windowsN; - _cachedAudioEffects = - new CachedAudioEffect[Enum.GetNames(typeof(CachedAudioEffect.AudioEffectTypes)).Length]; - for (var i = 0; i < _cachedAudioEffects.Length; i++) - { - _cachedAudioEffects[i] = new CachedAudioEffect((CachedAudioEffect.AudioEffectTypes) i); - } + _cachedAudioEffectsProvider = CachedAudioEffectProvider.Instance; } public float MicBoost { get; set; } = 1.0f; @@ -487,16 +482,26 @@ public void PlaySoundEffectStartReceive(int transmitOnRadio, bool encrypted, flo if (encrypted && (_globalSettings.ProfileSettingsStore.GetClientSettingBool(ProfileSettingsKeys.RadioEncryptionEffects))) { _effectsBuffer.VolumeSampleProvider.Volume = volume; - _effectsBuffer.AddAudioSamples( - _cachedAudioEffects[(int) CachedAudioEffect.AudioEffectTypes.KY_58_RX].AudioEffectBytes, - transmitOnRadio); + + var effect = _cachedAudioEffectsProvider.kY58EncryptionEndTone; + if (effect.Loaded) + { + _effectsBuffer.AddAudioSamples( + effect.AudioEffectBytes, + transmitOnRadio); + } } else { _effectsBuffer.VolumeSampleProvider.Volume = volume; - _effectsBuffer.AddAudioSamples( - _cachedAudioEffects[(int) CachedAudioEffect.AudioEffectTypes.RADIO_TX].AudioEffectBytes, - transmitOnRadio); + + var effect = _cachedAudioEffectsProvider.SelectedRadioTransmissionStartEffect; + if (effect.Loaded) + { + _effectsBuffer.AddAudioSamples( + effect.AudioEffectBytes, + transmitOnRadio); + } } } @@ -514,23 +519,35 @@ public void PlaySoundEffectStartTransmit(int transmitOnRadio, bool encrypted, fl if (encrypted && (_globalSettings.ProfileSettingsStore.GetClientSettingBool(ProfileSettingsKeys.RadioEncryptionEffects))) { _effectBuffer.VolumeSampleProvider.Volume = volume; - _effectBuffer.AddAudioSamples( - _cachedAudioEffects[(int) CachedAudioEffect.AudioEffectTypes.KY_58_TX].AudioEffectBytes, - transmitOnRadio); + var effect = _cachedAudioEffectsProvider.kY58EncryptionTransmitTone; + if (effect.Loaded) + { + _effectBuffer.AddAudioSamples( + effect.AudioEffectBytes, + transmitOnRadio); + } } else if (modulation == Modulation.MIDS && midsTone) { _effectBuffer.VolumeSampleProvider.Volume = volume; - _effectBuffer.AddAudioSamples( - _cachedAudioEffects[(int)CachedAudioEffect.AudioEffectTypes.MIDS_TX].AudioEffectBytes, - transmitOnRadio); + var effect = _cachedAudioEffectsProvider.MIDSTransmitTone; + if (effect.Loaded) + { + _effectBuffer.AddAudioSamples( + effect.AudioEffectBytes, + transmitOnRadio); + } } else { _effectBuffer.VolumeSampleProvider.Volume = volume; - _effectBuffer.AddAudioSamples( - _cachedAudioEffects[(int) CachedAudioEffect.AudioEffectTypes.RADIO_TX].AudioEffectBytes, - transmitOnRadio); + var effect = _cachedAudioEffectsProvider.SelectedRadioTransmissionStartEffect; + if (effect.Loaded) + { + _effectBuffer.AddAudioSamples( + effect.AudioEffectBytes, + transmitOnRadio); + } } } @@ -554,9 +571,13 @@ public void PlaySoundEffectEndReceive(int transmitOnRadio, float volume, Modulat var _effectsBuffer = _effectsOutputBuffer[transmitOnRadio]; _effectsBuffer.VolumeSampleProvider.Volume = volume; - _effectsBuffer.AddAudioSamples( - _cachedAudioEffects[(int) CachedAudioEffect.AudioEffectTypes.RADIO_RX].AudioEffectBytes, - transmitOnRadio); + var effect = _cachedAudioEffectsProvider.SelectedRadioTransmissionEndEffect; + if (effect.Loaded) + { + _effectsBuffer.AddAudioSamples( + effect.AudioEffectBytes, + transmitOnRadio); + } } public void PlaySoundEffectEndTransmit(int transmitOnRadio, float volume, Modulation modulation) @@ -572,16 +593,24 @@ public void PlaySoundEffectEndTransmit(int transmitOnRadio, float volume, Modula if (modulation == Modulation.MIDS && midsTone) { _effectBuffer.VolumeSampleProvider.Volume = volume; - _effectBuffer.AddAudioSamples( - _cachedAudioEffects[(int)CachedAudioEffect.AudioEffectTypes.MIDS_TX_END].AudioEffectBytes, - transmitOnRadio); + var effect = _cachedAudioEffectsProvider.MIDSEndTone; + if (effect.Loaded) + { + _effectBuffer.AddAudioSamples( + effect.AudioEffectBytes, + transmitOnRadio); + } } else{ _effectBuffer.VolumeSampleProvider.Volume = volume; - _effectBuffer.AddAudioSamples( - _cachedAudioEffects[(int)CachedAudioEffect.AudioEffectTypes.RADIO_RX].AudioEffectBytes, - transmitOnRadio); + var effect = _cachedAudioEffectsProvider.SelectedRadioTransmissionEndEffect; + if (effect.Loaded) + { + _effectBuffer.AddAudioSamples( + effect.AudioEffectBytes, + transmitOnRadio); + } } diff --git a/DCS-SR-Client/Audio/Managers/AudioPreview.cs b/DCS-SR-Client/Audio/Managers/AudioPreview.cs index 535fd12c7..fb7f1bd15 100644 --- a/DCS-SR-Client/Audio/Managers/AudioPreview.cs +++ b/DCS-SR-Client/Audio/Managers/AudioPreview.cs @@ -92,8 +92,10 @@ public void StartPreview( bool windowsN) RadioFilter filter = new RadioFilter(_buffBufferedWaveProvider.ToSampleProvider()); + var audioEffect = CachedAudioEffectProvider.Instance.NATOTone; + CachedLoopingAudioProvider natoEffect = - new CachedLoopingAudioProvider(filter.ToWaveProvider16(), new WaveFormat(AudioManager.OUTPUT_SAMPLE_RATE, 16, 1), CachedAudioEffect.AudioEffectTypes.NATO_TONE); + new CachedLoopingAudioProvider(filter.ToWaveProvider16(), new WaveFormat(AudioManager.OUTPUT_SAMPLE_RATE, 16, 1),audioEffect ); //add final volume boost to all mixed audio _volumeSampleProvider = new VolumeSampleProviderWithPeak(natoEffect.ToSampleProvider(), diff --git a/DCS-SR-Client/Audio/Managers/CachedAudioEffectProvider.cs b/DCS-SR-Client/Audio/Managers/CachedAudioEffectProvider.cs new file mode 100644 index 000000000..920650c09 --- /dev/null +++ b/DCS-SR-Client/Audio/Managers/CachedAudioEffectProvider.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Ciribob.DCS.SimpleRadio.Standalone.Client.Settings; + +namespace Ciribob.DCS.SimpleRadio.Standalone.Client.Audio.Managers +{ + class CachedAudioEffectProvider + { + public List RadioTransmissionStart { get; } + public List RadioTransmissionEnd { get; } + + private static CachedAudioEffectProvider _instance; + + public static CachedAudioEffectProvider Instance + { + get + { + if (_instance == null) + { + _instance = new CachedAudioEffectProvider(); + + //stops cyclic init + + } + return _instance; + } + } + + public CachedAudioEffect SelectedRadioTransmissionStartEffect + { + get + { + var selectedTone = GlobalSettingsStore.Instance.ProfileSettingsStore + .GetClientSetting(ProfileSettingsKeys.RadioTransmissionStartSelection).RawValue.ToLowerInvariant(); + + foreach (var startEffect in RadioTransmissionStart) + { + if (startEffect.FileName.ToLowerInvariant().Equals(selectedTone)) + { + return startEffect; + } + } + + return RadioTransmissionStart[0]; + } + } + + public CachedAudioEffect SelectedRadioTransmissionEndEffect + { + get + { + var selectedTone = GlobalSettingsStore.Instance.ProfileSettingsStore + .GetClientSetting(ProfileSettingsKeys.RadioTransmissionEndSelection).RawValue.ToLowerInvariant(); + + foreach (var endEffect in RadioTransmissionEnd) + { + if (endEffect.FileName.ToLowerInvariant().Equals(selectedTone)) + { + return endEffect; + } + } + + return RadioTransmissionEnd[0]; + } + } + + public CachedAudioEffect kY58EncryptionTransmitTone { get; } + public CachedAudioEffect kY58EncryptionEndTone { get; } + + public CachedAudioEffect NATOTone { get; } + + public CachedAudioEffect MIDSTransmitTone { get; } + public CachedAudioEffect MIDSEndTone { get; } + + private readonly string sourceFolder; + + private CachedAudioEffectProvider() + { + sourceFolder = AppDomain.CurrentDomain.BaseDirectory + "\\AudioEffects\\"; + + //init lists + RadioTransmissionStart = new List(); + RadioTransmissionEnd = new List(); + + LoadRadioStartAndEndEffects(); + + kY58EncryptionTransmitTone = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.KY_58_TX); + kY58EncryptionEndTone = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.KY_58_RX); + + NATOTone = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.NATO_TONE); + + MIDSTransmitTone = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.MIDS_TX); + MIDSEndTone = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.MIDS_TX_END); + } + + private void LoadRadioStartAndEndEffects() + { + var audioEffectsList = Directory.EnumerateFiles(sourceFolder); + + //might need to split the path - we'll see + foreach (var effectPath in audioEffectsList) + { + var effect = effectPath.Split(Path.DirectorySeparatorChar).Last(); + + if (effect.ToLowerInvariant().StartsWith(CachedAudioEffect.AudioEffectTypes.RADIO_TRANS_START + .ToString().ToLowerInvariant())) + { + var audioEffect = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.RADIO_TRANS_START, effect, effectPath); + + if (audioEffect.AudioEffectBytes != null) + { + RadioTransmissionStart.Add(audioEffect); + } + + } + else if (effect.ToLowerInvariant().StartsWith(CachedAudioEffect.AudioEffectTypes.RADIO_TRANS_END + .ToString().ToLowerInvariant())) + { + var audioEffect = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.RADIO_TRANS_END, effect,effectPath); + + if (audioEffect.AudioEffectBytes != null) + { + RadioTransmissionEnd.Add(audioEffect); + } + } + } + + //IF the audio folder is missing - to avoid a crash, init with a blank one + if (RadioTransmissionStart.Count == 0) + { + RadioTransmissionStart.Add(new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.RADIO_TRANS_START)); + } + if (RadioTransmissionEnd.Count == 0) + { + RadioTransmissionEnd.Add(new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.RADIO_TRANS_END)); + } + + } + + } +} diff --git a/DCS-SR-Client/Audio/Models/CachedAudioEffect.cs b/DCS-SR-Client/Audio/Models/CachedAudioEffect.cs index 2b6ac3eda..c64edc39b 100644 --- a/DCS-SR-Client/Audio/Models/CachedAudioEffect.cs +++ b/DCS-SR-Client/Audio/Models/CachedAudioEffect.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using Ciribob.DCS.SimpleRadio.Standalone.Client.Audio.Managers; using Ciribob.DCS.SimpleRadio.Standalone.Client.Properties; using NAudio.Wave; using NLog; @@ -10,10 +11,40 @@ public class CachedAudioEffect { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private static readonly WaveFormat RequiredFormat = new WaveFormat(AudioManager.OUTPUT_SAMPLE_RATE,16,1); + + /** Needed for list view ***/ + public string Text + { + get + { + return FileName; + } + } + + /** Needed for list view ***/ + public object Value + { + get + { + return this; + } + } + + /** Needed for list view ***/ + public override string ToString() + { + return Text; + } + + public string FileName { get; } + + public bool Loaded { get; } = false; + public enum AudioEffectTypes { - RADIO_TX = 0, - RADIO_RX = 1, + RADIO_TRANS_START = 0, + RADIO_TRANS_END = 1, KY_58_TX = 2, KY_58_RX = 3, NATO_TONE=4, @@ -21,57 +52,45 @@ public enum AudioEffectTypes MIDS_TX_END = 6, } - //order must match ENUM above - private static readonly string[] FileNameLookup = new[] { "Radio-TX-48K.wav","Radio-RX-48K.wav", - "KY-58-TX-48K.wav","KY-58-RX-48K.wav","nato-tone-48k.wav", "nato-mids-tone-48K.wav", "nato-mids-tone-out-48K.wav"}; + public CachedAudioEffect(AudioEffectTypes audioEffect): this(audioEffect, audioEffect.ToString() + ".wav", AppDomain.CurrentDomain.BaseDirectory + "\\AudioEffects\\"+ audioEffect.ToString() + ".wav") { } - public CachedAudioEffect(AudioEffectTypes audioEffect) + public CachedAudioEffect(AudioEffectTypes audioEffect, string fileName, string path) { + FileName = fileName; AudioEffectType = audioEffect; - var file = GetFile(); + var file = path; AudioEffectBytes = new byte[0]; - if (file != null) + if (File.Exists(file)) { using (var reader = new WaveFileReader(file)) { // Assert.AreEqual(16, reader.WaveFormat.BitsPerSample, "Only works with 16 bit audio"); - if (reader.WaveFormat.BitsPerSample == 16 && reader.WaveFormat.Channels == 1) + if (reader.WaveFormat.BitsPerSample == RequiredFormat.BitsPerSample && reader.WaveFormat.SampleRate == reader.WaveFormat.SampleRate && reader.WaveFormat.Channels == 1) { AudioEffectBytes = new byte[reader.Length]; var read = reader.Read(AudioEffectBytes, 0, AudioEffectBytes.Length); - Logger.Info($"Read Effect {audioEffect} from {file} Successfully"); + Logger.Info($"Read Effect {audioEffect} from {file} Successfully - Format {reader.WaveFormat}"); + + Loaded = true; } else { - Logger.Info($"Unable to read Effect {audioEffect} from {file} Successfully - not 16 bits or stereo {reader.WaveFormat} !"); + Logger.Info($"Unable to read Effect {audioEffect} from {file} Successfully - {reader.WaveFormat} is not {RequiredFormat} !"); } } } else { - Logger.Info($"Unable to find file for effect {audioEffect} in AudioEffects\\{FileNameLookup[(int) audioEffect]} "); + Logger.Info($"Unable to find file for effect {audioEffect} in AudioEffects\\{FileName} "); } - } public AudioEffectTypes AudioEffectType { get; } public byte[] AudioEffectBytes { get; } - - private string GetFile() - { - var location = AppDomain.CurrentDomain.BaseDirectory+"\\AudioEffects\\"; - - if(File.Exists(location + FileNameLookup[(int)AudioEffectType])) - { - return location + FileNameLookup[(int) AudioEffectType]; - } - - return null; - } } } \ No newline at end of file diff --git a/DCS-SR-Client/Audio/Providers/CachedLoopingAudioProvider.cs b/DCS-SR-Client/Audio/Providers/CachedLoopingAudioProvider.cs index a47bf3f67..373c44baf 100644 --- a/DCS-SR-Client/Audio/Providers/CachedLoopingAudioProvider.cs +++ b/DCS-SR-Client/Audio/Providers/CachedLoopingAudioProvider.cs @@ -17,10 +17,9 @@ public class CachedLoopingAudioProvider:IWaveProvider private readonly short[] _audioEffectShort; private IWaveProvider source; - public CachedLoopingAudioProvider(IWaveProvider source, WaveFormat waveFormat, CachedAudioEffect.AudioEffectTypes effectType) + public CachedLoopingAudioProvider(IWaveProvider source, WaveFormat waveFormat, CachedAudioEffect effect) { this.WaveFormat = waveFormat; - var effect = new CachedAudioEffect(effectType); _audioEffectShort = ConversionHelpers.ByteArrayToShortArray(effect.AudioEffectBytes); var vol = Settings.GlobalSettingsStore.Instance.GetClientSetting(GlobalSettingsKeys.NATOToneVolume) diff --git a/DCS-SR-Client/AudioEffects/KY-58-RX-48K.wav b/DCS-SR-Client/AudioEffects/KY_58_RX.wav similarity index 100% rename from DCS-SR-Client/AudioEffects/KY-58-RX-48K.wav rename to DCS-SR-Client/AudioEffects/KY_58_RX.wav diff --git a/DCS-SR-Client/AudioEffects/KY-58-TX-48K.wav b/DCS-SR-Client/AudioEffects/KY_58_TX.wav similarity index 100% rename from DCS-SR-Client/AudioEffects/KY-58-TX-48K.wav rename to DCS-SR-Client/AudioEffects/KY_58_TX.wav diff --git a/DCS-SR-Client/AudioEffects/nato-mids-tone-48K.wav b/DCS-SR-Client/AudioEffects/MIDS_TX.wav similarity index 100% rename from DCS-SR-Client/AudioEffects/nato-mids-tone-48K.wav rename to DCS-SR-Client/AudioEffects/MIDS_TX.wav diff --git a/DCS-SR-Client/AudioEffects/nato-mids-tone-out-48k.wav b/DCS-SR-Client/AudioEffects/MIDS_TX_END.wav similarity index 100% rename from DCS-SR-Client/AudioEffects/nato-mids-tone-out-48k.wav rename to DCS-SR-Client/AudioEffects/MIDS_TX_END.wav diff --git a/DCS-SR-Client/AudioEffects/nato-tone-48k.wav b/DCS-SR-Client/AudioEffects/NATO_TONE.wav similarity index 100% rename from DCS-SR-Client/AudioEffects/nato-tone-48k.wav rename to DCS-SR-Client/AudioEffects/NATO_TONE.wav diff --git a/DCS-SR-Client/AudioEffects/Original/Radio-RX-1600.wav b/DCS-SR-Client/AudioEffects/Original/Radio-RX-1600.wav new file mode 100644 index 0000000000000000000000000000000000000000..222b4b1657ee96acad660479d7b9cf5a9007cb9e GIT binary patch literal 876 zcmWNPeN5G56vw~kcL^`0K~j0rkKf)Zya)b=AE}J!iu4XcFbal~!f`ytZ zW28&yk4kEGXRHy^?xYvygxaWlY139y(wr1}FTy3@cfG%JPS4Jsv$N-%opbg*pG_Oe z%6u-syYAWb+ZuOyk^qpgwqg^s0v3|stJ_ugq^U`P8_C9}AQ20U&p|FSu^eeAKsl;V z2_LHQD&D~{oWdo`oNC# znvB;yy_r8}9nOwqO?bL9hSC}yJeQiC9CClEopaycyl}03eD}@ICz~T(b1z5li4NEU z_A&cyyWiI6joXWyIKIL0x)QI^GgiIp{kX^DXBLbn+_x}zcR^Bg;h6iwJN}^w_Qsr8 zmvh`n<^x73=k1*&|nZE89*!=kh~b!JD~On)DlV(?;uzwcR>NkI)pF zjMjf?vo@+*2W3zO$iE&J00*oRW!7}`_DPr@W8xbAnrGN6$IZq&Wv!IRJoj<7gymx`F?{yZMH;0G zbe4uFNY(T^YB8^S)T8lg%XR6OSEN)Pl?1uO!#v1OnZMndgAjZaGvwxBRA15t&BPV7 fP^xv>3RvgqE~P literal 0 HcmV?d00001 diff --git a/DCS-SR-Client/AudioEffects/Original/Radio-TX-1600.wav b/DCS-SR-Client/AudioEffects/Original/Radio-TX-1600.wav new file mode 100644 index 0000000000000000000000000000000000000000..222b4b1657ee96acad660479d7b9cf5a9007cb9e GIT binary patch literal 876 zcmWNPeN5G56vw~kcL^`0K~j0rkKf)Zya)b=AE}J!iu4XcFbal~!f`ytZ zW28&yk4kEGXRHy^?xYvygxaWlY139y(wr1}FTy3@cfG%JPS4Jsv$N-%opbg*pG_Oe z%6u-syYAWb+ZuOyk^qpgwqg^s0v3|stJ_ugq^U`P8_C9}AQ20U&p|FSu^eeAKsl;V z2_LHQD&D~{oWdo`oNC# znvB;yy_r8}9nOwqO?bL9hSC}yJeQiC9CClEopaycyl}03eD}@ICz~T(b1z5li4NEU z_A&cyyWiI6joXWyIKIL0x)QI^GgiIp{kX^DXBLbn+_x}zcR^Bg;h6iwJN}^w_Qsr8 zmvh`n<^x73=k1*&|nZE89*!=kh~b!JD~On)DlV(?;uzwcR>NkI)pF zjMjf?vo@+*2W3zO$iE&J00*oRW!7}`_DPr@W8xbAnrGN6$IZq&Wv!IRJoj<7gymx`F?{yZMH;0G zbe4uFNY(T^YB8^S)T8lg%XR6OSEN)Pl?1uO!#v1OnZMndgAjZaGvwxBRA15t&BPV7 fP^xv>3RvgqE~P literal 0 HcmV?d00001 diff --git a/DCS-SR-Client/AudioEffects/Radio-TX-48K.wav b/DCS-SR-Client/AudioEffects/RADIO_TRANS_END.wav similarity index 100% rename from DCS-SR-Client/AudioEffects/Radio-TX-48K.wav rename to DCS-SR-Client/AudioEffects/RADIO_TRANS_END.wav diff --git a/DCS-SR-Client/AudioEffects/RADIO_TRANS_END_ALTERNATE.wav b/DCS-SR-Client/AudioEffects/RADIO_TRANS_END_ALTERNATE.wav new file mode 100644 index 0000000000000000000000000000000000000000..f81d2febffef161839d587322f5190a286d6bef1 GIT binary patch literal 2540 zcmW+&3s_ZE7GCRIc?kj{5~RQdL{Z5{nwd$;jL)o5LD9+-%kYu(RBX(2N_>Qwlc7jH zCMC_(Oi?K-((%i*QZzN0632X{!M!|1?&Y4nR{z)cfBT$$&bJ?Hul28g?TpbQM%)M@ znv|Y3JSTUaGn|MR_}5qHEMT%IoMud)H~lEa+(VHRN`VwW?WhC3?xl`@{fnU}AOvVb zZ7B$&BFIUxltNvo2YSiqCs8-_d*Yb@bf&K851^4WnzCpdjitxwQOcyrG#!|VcNR^e z9GXju=`C7CYiT3xqyzK~9it!V6kVnp)J!({u|J1$B**i8+>ZwX4{;ivkMk6Mk(cla zUd`*dm_OmY{5ep{JNYC0Dde|!5xH^z)TFb37R=s68$iYB}BhHcH=2S>bhI(Mv9V!kLv+KD`j_gR^(X5l*Hzc%)jDf` zb?~y~KiP+q@lW`s6GviC+L!FD9 zmz_fsN)p;6&Q1J2u}jjNq@tuvN!dv)iK7xXCfsyB>uiZHj*pFhJ?=xXaT|32q- z*Xmbl3S0&5ZM9W(-5M4&o^MKRF1&lLrP4Fo`>r?J+umE@IpEpvDffKkDfR5|Z1?Q) z?DcH)ggx8-&bG`5^S-%d#>j5*(;0eP2Y}bn zoX00Q*vhhYSPsXtjw6obHU(`W{5JTd`JeHh6;L0rIxsb;I%sp-slgpWehWF)?qKM~ zu*C3w;cLTQ4s8jU9~{y4O5pbahy2(1<+SPUsOAlnuD_el?F!!$zOlY_KA$hce#>5K z7uuWc1NM2l8T{&Jo;C&Mgt1M3nI%PXPAu)GkLgo7L8s|VE!6)iQ7ZB>g9cL!{ia)W zy56S_{X@>mK3Oi0OO*U(%FMea$2@2{m?qoUZA~xpkQr!_Oq7W*Je%H&J=LJrFzIVgK&k9;IsWhee# zmLMIbuj_7j{S;;wX|87K5FHFWpo!|i>@_l3x=V|xFePTWS%kL7{A|SBD@n-JK{7@1 zrBtfKBN3XUX_)^!Y*?a;bg{0~_4=89qbGrK^tS7!zwn`!AcNn>h*>%Yc1B^RYx1pp z1s{GXr;y=3a3KM{AA{AF>o%-$QR_4aK2N3ol#U2IOG{`w{Xo~~4)msx>gX2m2YQC0 zpep^LRepSo-hrNWg?C!@nx4@e*mbr}(t+yKdo%``ldHS5S`%m@y-i2ROAqlYe28l} z)f#K%SQD)7)@}X}+8M={pmrJLPseqcj?_@SAe&?%ypt*8@O(yQN{&pGEPRbeZ@v`E zf8gt_vRT&3d-9H~hA%&m1M(A2*HL@J&tnm%mHIJQ^^;bqTYVZvoe;}Ts39FG8Wkm+ zd|Ip5^%i&+1I|sL88n|(P%)L$MQWvR?!-wPi^f4wVYNpls}sj_yTRFr>QSB>uFu1Pa+EEvLp>li#?=GTTRK8TQ^*hArIeip9$^e_ov`N$Gd0J09 zP-VVA#k+!4y735}g_^Yh&vb6jSHOqG^bh1i4C-;co`od~bUc_mNT*=E(;7(k(-c}p zpHL-vz>+?wig~<=zvZ+19q&Rtn#)fk)>)`jX?#Cel#D9c7uBmfs+k)*zkyt<){Rhv zIK3&K%1g)rm)U8aH}{+NMr^TTOkeXP{8D5}p(ItN(S%7K@MDQ=LG~R+`viPg0e#7q z;WA7H%in+jk|53IyxC`VncDittgbjDFVIr)Ryj~7;1<2vFJxp z7$O+=R(N+OB~dbUMoS?lx#%wR?nb1b*8$IN>P9_jAPu2R8bwdgFd9r*ltU9}BHCyg zL)r8!<e2ZwSLx8@}7$`5ca?u%<*&fsDEBtOru z^L$>+OL#qR=AFEU_u{&ROL;l3;3A&QFY+|b=R8C%kLOXG$-{XtqBlnQ7k6P7w_%&E z&@n2fO|*uV(gJ#uX5qS&_5jIcxo+8h5&s5Jm&sonfZ@qVIO?vII z+Wt3p+;r8I)P>i-RUh53vLW@>?puQz&o>q|4ZQ90h54)f`#e}q79{WJM>h`naPbU1-VRB++VoT?f z&d;2!U9(&lTmzCmObT^RasTM<*l|k7wH;S>e6C}id#HOw(skFR;B>y`iLb|BbZj34fityzTN= zSLR%OzS?=c;KqE#y5#_#8 z#8%%n-+Et>Zrx7`=(FYz1y*yc^m*P9;-YzRc#)9fR5ka^TBG1tss*(xDANx#$k z=@W|OLO#k-)(EQ%dpgl^#NiHF6x1^KgWz5v{|%WGdMk86SoiQN;hS3IM8rm3iu|VK z-d3xkQlitMmq+Ed@<+~yXx-vc*zwR^A*+L*3A)E|mEWg+T5a~&m4TeV(7>udAdqPn z*-P!^_Ii7#ea3FEV@-E678*Njf}p}YSs|yz(jGcQb99W3)v3BfkE&`a{hNkUA7uMQ z-K}I=_>1s0Ylx*6V7}Le{H^a?PyyVLFA-_$~#qs6*fx9Ji6R)5g_x)W@z)A!Lf>PN`n#rP^$p8(Dn z%ydaAfba{T`a%AXMj-2;_ksH4p` z;Bv0x6f4WhMN74=@!m=RlHrmiV`LIy3fLHf=S=hq zWhpq`EM>9^Q6lfjyWn!2d@g6iC++oa?XSb2sfGG67&@gF^}33-!U~;GRy)*>Ht2_; z+FaAW^qSh5KpCh9lj$WYrgiZB3*@6HPGl#%-UU@;@JP7#e4yRWm)T$iX;ubWs+D5( zu=-iUt)bQ+E8eQ%t^6$hI71(R#ct%+6Hs=J#_7+pP#%|PsWvCfK2v6vn>WljGsq;G zNaKM^9k&nKU)sCvO8YlE(xjSfQ(#t@a&z89$p|TxThbS5`czM=M+sFj38N22-726r z=sj8nz3!k&x=k)rl{|h6SZ4rp3OCXTDy79VoAQuZsT6=7mp~hXp~Xyn70S7-57IPR zg^ITeag5HR!npY{p2`LM8dfs^dw!m_VWyGPof0U7ZtBlkrn8`+bi{b5?G*gAC+g`u z+Dd1!({X$cYSQz(i4XB`oR1FP} zgLeLs?UFC|iWf{xF+IT%8-5Lm*JT6Ly)pXW@;R;o>I(jW zPvBmKIE%LxSj!Rqh7Y5*Z-85j#0r#t0q^s1ib$t;s?%SQ1;t?GpA3)I2o2F7HPR#v znD1}-RlbKutdb&`4uqL9KpvFt(oIq%UP7hGTs0TXFXogv0+%Z{2h2Itg3j zX!<4HfqY8FNu?Co*oCvPJ0m%j{qU>JIJZoJdv--WUf1KgRo})gXCWrT4}R4YU@WCe z*qI?bi?{Pdj<-fztE{8edH7(NHQ91mKl3~MD2MYY=xGE_U0)%eyQ)_X$x5Jj6(@)} kh(ehxBf;-uSV6XomLXudH{3Z_R?F8?D@mHIYoU<;0q$JVYXATM literal 0 HcmV?d00001 diff --git a/DCS-SR-Client/DCS-SR-Client.csproj b/DCS-SR-Client/DCS-SR-Client.csproj index 0ec2c9399..366509164 100644 --- a/DCS-SR-Client/DCS-SR-Client.csproj +++ b/DCS-SR-Client/DCS-SR-Client.csproj @@ -191,6 +191,7 @@ MSBuild:Compile Designer + @@ -398,25 +399,31 @@ PreserveNewest - + Always - + Always - + Always - + Always - + Always - + Always - + + Always + + + Always + + Always diff --git a/DCS-SR-Client/Settings/ProfileSettingsStore.cs b/DCS-SR-Client/Settings/ProfileSettingsStore.cs index 2bc85a411..616c7a864 100644 --- a/DCS-SR-Client/Settings/ProfileSettingsStore.cs +++ b/DCS-SR-Client/Settings/ProfileSettingsStore.cs @@ -47,7 +47,10 @@ public enum ProfileSettingsKeys MIDSRadioEffect, //if on and Radio TX effects are on the MIDS tone is used - PTTReleaseDelay + PTTReleaseDelay, + + RadioTransmissionStartSelection, + RadioTransmissionEndSelection } public class ProfileSettingsStore @@ -66,6 +69,11 @@ public class ProfileSettingsStore {ProfileSettingsKeys.RadioRxEffects_Start.ToString(), "true"}, {ProfileSettingsKeys.RadioRxEffects_End.ToString(), "true"}, + + {ProfileSettingsKeys.RadioTransmissionStartSelection.ToString(), CachedAudioEffect.AudioEffectTypes.RADIO_TRANS_START+".wav"}, + {ProfileSettingsKeys.RadioTransmissionEndSelection.ToString(), CachedAudioEffect.AudioEffectTypes.RADIO_TRANS_END+".wav"}, + + {ProfileSettingsKeys.RadioTxEffects_Start.ToString(), "true"}, {ProfileSettingsKeys.RadioTxEffects_End.ToString(), "true"}, {ProfileSettingsKeys.MIDSRadioEffect.ToString(), "true"}, diff --git a/DCS-SR-Client/UI/ClientWindow/MainWindow.xaml b/DCS-SR-Client/UI/ClientWindow/MainWindow.xaml index a0177a5ef..d386e5ecd 100644 --- a/DCS-SR-Client/UI/ClientWindow/MainWindow.xaml +++ b/DCS-SR-Client/UI/ClientWindow/MainWindow.xaml @@ -1174,6 +1174,8 @@ + +