Skip to content

Commit

Permalink
Merge pull request #496 from ciribob/beta
Browse files Browse the repository at this point in the history
Release 1.9.2.1
  • Loading branch information
ciribob committed Nov 1, 2020
2 parents 3270644 + d2b5920 commit 7ec7ae9
Show file tree
Hide file tree
Showing 42 changed files with 1,877 additions and 1,174 deletions.
4 changes: 2 additions & 2 deletions AutoUpdater/Properties/AssemblyInfo.cs
Expand Up @@ -51,5 +51,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.9.1.2")]
[assembly: AssemblyFileVersion("1.9.1.2")]
[assembly: AssemblyVersion("1.9.2.1")]
[assembly: AssemblyFileVersion("1.9.2.1")]
91 changes: 60 additions & 31 deletions DCS-SR-Client/Audio/Managers/AudioManager.cs
Expand Up @@ -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<string, ClientAudioProvider> _clientsBufferedAudio =
new ConcurrentDictionary<string, ClientAudioProvider>();
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
}

Expand All @@ -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);
}
}
}

Expand All @@ -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)
Expand All @@ -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);
}
}


Expand Down
5 changes: 1 addition & 4 deletions DCS-SR-Client/Audio/Managers/AudioPreview.cs
Expand Up @@ -92,11 +92,8 @@ public void StartPreview( bool windowsN)

RadioFilter filter = new RadioFilter(_buffBufferedWaveProvider.ToSampleProvider());

CachedLoopingAudioProvider natoEffect =
new CachedLoopingAudioProvider(filter.ToWaveProvider16(), new WaveFormat(AudioManager.OUTPUT_SAMPLE_RATE, 16, 1), CachedAudioEffect.AudioEffectTypes.NATO_TONE);

//add final volume boost to all mixed audio
_volumeSampleProvider = new VolumeSampleProviderWithPeak(natoEffect.ToSampleProvider(),
_volumeSampleProvider = new VolumeSampleProviderWithPeak(filter,
(peak => SpeakerMax = (float) VolumeConversionHelper.ConvertFloatToDB(peak)));
_volumeSampleProvider.Volume = SpeakerBoost;

Expand Down
188 changes: 188 additions & 0 deletions DCS-SR-Client/Audio/Managers/CachedAudioEffectProvider.cs
@@ -0,0 +1,188 @@
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;
using Ciribob.DCS.SimpleRadio.Standalone.Common;

namespace Ciribob.DCS.SimpleRadio.Standalone.Client.Audio.Managers
{
class CachedAudioEffectProvider
{
public List<CachedAudioEffect> RadioTransmissionStart { get; }
public List<CachedAudioEffect> 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; }

public CachedAudioEffect HAVEQUICKTone { get; }

public CachedAudioEffect FMNoise { get; }
public CachedAudioEffect UHFNoise { get; }
public CachedAudioEffect VHFNoise { get; }
public CachedAudioEffect HFNoise { get; }

private readonly string sourceFolder;

private CachedAudioEffectProvider()
{
sourceFolder = AppDomain.CurrentDomain.BaseDirectory + "\\AudioEffects\\";

//init lists
RadioTransmissionStart = new List<CachedAudioEffect>();
RadioTransmissionEnd = new List<CachedAudioEffect>();

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);

HAVEQUICKTone = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.HAVEQUICK_TONE);

FMNoise = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.FM_NOISE);
VHFNoise = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.VHF_NOISE);
UHFNoise = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.UHF_NOISE);
HFNoise = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.HF_NOISE);

//sort out volume (if needed)
ChangeVolumeOfEffect(HAVEQUICKTone,GlobalSettingsKeys.HQToneVolume);
ChangeVolumeOfEffect(NATOTone, GlobalSettingsKeys.NATOToneVolume);
ChangeVolumeOfEffect(FMNoise, GlobalSettingsKeys.FMNoiseVolume);
ChangeVolumeOfEffect(UHFNoise, GlobalSettingsKeys.UHFNoiseVolume);
ChangeVolumeOfEffect(VHFNoise, GlobalSettingsKeys.VHFNoiseVolume);
ChangeVolumeOfEffect(HFNoise, GlobalSettingsKeys.HFNoiseVolume);
}

private void ChangeVolumeOfEffect(CachedAudioEffect effect, GlobalSettingsKeys key)
{

if (effect.Loaded)
{

var effectShort = ConversionHelpers.ByteArrayToShortArray(effect.AudioEffectBytes);
var effectDouble = new double[effectShort.Length];

var vol = Settings.GlobalSettingsStore.Instance.GetClientSetting(key)
.FloatValue;

for (int i = 0; i < effectShort.Length; i++)
{
effectDouble[i] = ((effectShort[i]/ 32768f) * vol);
}
effect.AudioEffectDouble = effectDouble;

}

}

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));
}

}

}
}

0 comments on commit 7ec7ae9

Please sign in to comment.