public ClientAudioProvider() { _filters = new OnlineFilter[2]; _filters[0] = OnlineFilter.CreateBandpass(ImpulseResponse.Finite, AudioManager.INPUT_SAMPLE_RATE, 560, 3900); _filters[1] = OnlineFilter.CreateBandpass(ImpulseResponse.Finite, AudioManager.INPUT_SAMPLE_RATE, 100, 4500); JitterBufferProviderInterface = new JitterBufferProviderInterface(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 2)); SampleProvider = new Pcm16BitToSampleProvider(JitterBufferProviderInterface); _decoder = OpusDecoder.Create(AudioManager.INPUT_SAMPLE_RATE, 1); _decoder.ForwardErrorCorrection = false; _highPassFilter = BiQuadFilter.HighPassFilter(AudioManager.INPUT_SAMPLE_RATE, 520, 0.97f); _lowPassFilter = BiQuadFilter.LowPassFilter(AudioManager.INPUT_SAMPLE_RATE, 4130, 2.0f); var effect = new CachedAudioEffect(CachedAudioEffect.AudioEffectTypes.NATO_TONE); if (effect.AudioEffectBytes.Length > 0) { natoTone = ConversionHelpers.ByteArrayToShortArray(effect.AudioEffectBytes); var vol = Settings.GlobalSettingsStore.Instance.GetClientSetting(GlobalSettingsKeys.NATOToneVolume) .FloatValue; for (int i = 0; i < natoTone.Length; i++) { natoTone[i] = (short)(natoTone[i] * vol); } } }
public void AddClientAudioSamples(ClientAudio audio) { //sort out volume var timer = new Stopwatch(); timer.Start(); var decrytable = audio.Decryptable || (audio.Encryption == 0); if (decrytable) { //adjust for LOS + Distance + Volume AdjustVolume(audio); ////no radio effect for intercom if (audio.ReceivedRadio != 0) { if (_settings.UserSettings[(int)SettingType.RadioEffects] != "OFF") { AddRadioEffect(audio); } } } else { AddEncryptionFailureEffect(audio); if (_settings.UserSettings[(int)SettingType.RadioEffects] != "OFF") { AddRadioEffect(audio); } } long now = Environment.TickCount; if ((now - LastUpdate) > 400) //400 ms since last update { // System.Diagnostics.Debug.WriteLine(audio.ClientGuid+"ADDED"); //append ms of silence - this functions as our jitter buffer?? var silencePad = (AudioManager.INPUT_SAMPLE_RATE / 1000) * SILENCE_PAD; var newAudio = new short[audio.PcmAudioShort.Length + silencePad]; Buffer.BlockCopy(audio.PcmAudioShort, 0, newAudio, silencePad, audio.PcmAudioShort.Length); audio.PcmAudioShort = newAudio; } _lastReceivedOn = audio.ReceivedRadio; LastUpdate = now; JitterBufferProviderInterface.AddSamples(new JitterBufferAudio { Audio = SeperateAudio(ConversionHelpers.ShortArrayToByteArray(audio.PcmAudioShort), audio.ReceivedRadio), PacketNumber = audio.PacketNumber }); timer.Stop(); }
public ClientAudioProvider() { _highPassFilter = BiQuadFilter.HighPassFilter(AudioManager.INPUT_SAMPLE_RATE, 520, 0.97f); _lowPassFilter = BiQuadFilter.LowPassFilter(AudioManager.INPUT_SAMPLE_RATE, 4130, 2.0f); JitterBufferProviderInterface = new JitterBufferProviderInterface(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 2)); SampleProvider = new Pcm16BitToSampleProvider(JitterBufferProviderInterface); }
public ClientAudioProvider() { _filters = new OnlineFilter[2]; _filters[0] = OnlineFilter.CreateBandpass(ImpulseResponse.Finite, AudioManager.INPUT_SAMPLE_RATE, 560, 3900); _filters[1] = OnlineFilter.CreateBandpass(ImpulseResponse.Finite, AudioManager.INPUT_SAMPLE_RATE, 100, 4500); JitterBufferProviderInterface = new JitterBufferProviderInterface(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 2)); SampleProvider = new Pcm16BitToSampleProvider(JitterBufferProviderInterface); }
public ClientAudioProvider() { _filters = new OnlineFilter[2]; _filters[0] = OnlineFilter.CreateBandpass(ImpulseResponse.Finite, AudioManager.INPUT_SAMPLE_RATE, 560, 3900); _filters[1] = OnlineFilter.CreateBandpass(ImpulseResponse.Finite, AudioManager.INPUT_SAMPLE_RATE, 100, 4500); JitterBufferProviderInterface = new JitterBufferProviderInterface(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 2)); SampleProvider = new Pcm16BitToSampleProvider(JitterBufferProviderInterface); _decoder = OpusDecoder.Create(AudioManager.INPUT_SAMPLE_RATE, 1); _decoder.ForwardErrorCorrection = false; _highPassFilter = BiQuadFilter.HighPassFilter(AudioManager.INPUT_SAMPLE_RATE, 520, 0.97f); _lowPassFilter = BiQuadFilter.LowPassFilter(AudioManager.INPUT_SAMPLE_RATE, 4130, 2.0f); }
public void AddClientAudioSamples(ClientAudio audio) { //sort out volume // var timer = new Stopwatch(); // timer.Start(); bool newTransmission = LikelyNewTransmission(); int decodedLength = 0; var decoded = _decoder.Decode(audio.EncodedAudio, audio.EncodedAudio.Length, out decodedLength, newTransmission); if (decodedLength <= 0) { Logger.Info("Failed to decode audio from Packet for client"); return; } // for some reason if this is removed then it lags?! //guess it makes a giant buffer and only uses a little? //Answer: makes a buffer of 4000 bytes - so throw away most of it var tmp = new byte[decodedLength]; Buffer.BlockCopy(decoded, 0, tmp, 0, decodedLength); audio.PcmAudioShort = ConversionHelpers.ByteArrayToShortArray(tmp); var decrytable = audio.Decryptable || (audio.Encryption == 0); if (decrytable) { //adjust for LOS + Distance + Volume AdjustVolumeForLoss(audio); if (audio.ReceivedRadio == 0 || audio.Modulation == (short)RadioInformation.Modulation.MIDS) { if (profileSettings.GetClientSettingBool(ProfileSettingsKeys.RadioEffects)) { AddRadioEffectIntercom(audio); } } else { AddRadioEffect(audio); } //final adjust AdjustVolume(audio); } else { AddEncryptionFailureEffect(audio); AddRadioEffect(audio); //final adjust AdjustVolume(audio); } if (newTransmission) { // System.Diagnostics.Debug.WriteLine(audio.ClientGuid+"ADDED"); //append ms of silence - this functions as our jitter buffer?? var silencePad = (AudioManager.OUTPUT_SAMPLE_RATE / 1000) * SILENCE_PAD; var newAudio = new short[audio.PcmAudioShort.Length + silencePad]; Buffer.BlockCopy(audio.PcmAudioShort, 0, newAudio, silencePad, audio.PcmAudioShort.Length); audio.PcmAudioShort = newAudio; } _lastReceivedOn = audio.ReceivedRadio; LastUpdate = DateTime.Now.Ticks; JitterBufferProviderInterface.AddSamples(new JitterBufferAudio { Audio = SeperateAudio(ConversionHelpers.ShortArrayToByteArray(audio.PcmAudioShort), audio.ReceivedRadio), PacketNumber = audio.PacketNumber }); //timer.Stop(); }
public byte[] AddClientAudioSamples(ClientAudio audio, bool skipEffects = false) { //sort out volume // var timer = new Stopwatch(); // timer.Start(); bool newTransmission = LikelyNewTransmission(); var decoded = _decoder.Decode(audio.EncodedAudio, audio.EncodedAudio.Length, out var decodedLength, newTransmission); if (decodedLength <= 0) { Logger.Info("Failed to decode audio from Packet for client"); return(null); } // for some reason if this is removed then it lags?! //guess it makes a giant buffer and only uses a little? //Answer: makes a buffer of 4000 bytes - so throw away most of it var tmp = new byte[decodedLength]; Buffer.BlockCopy(decoded, 0, tmp, 0, decodedLength); audio.PcmAudioShort = ConversionHelpers.ByteArrayToShortArray(tmp); //only get settings every 3 seconds - and cache them - issues with performance long now = DateTime.Now.Ticks; if (TimeSpan.FromTicks(now - lastRefresh).TotalSeconds > 3) //3 seconds since last refresh { lastRefresh = now; natoToneEnabled = profileSettings.GetClientSettingBool(ProfileSettingsKeys.NATOTone); hqToneEnabled = profileSettings.GetClientSettingBool(ProfileSettingsKeys.HAVEQUICKTone); radioEffectsEnabled = profileSettings.GetClientSettingBool(ProfileSettingsKeys.RadioEffects); clippingEnabled = profileSettings.GetClientSettingBool(ProfileSettingsKeys.RadioEffectsClipping); hqToneVolume = profileSettings.GetClientSettingFloat(ProfileSettingsKeys.HQToneVolume); natoToneVolume = profileSettings.GetClientSettingFloat(ProfileSettingsKeys.NATOToneVolume); fmVol = profileSettings.GetClientSettingFloat(ProfileSettingsKeys.FMNoiseVolume); hfVol = profileSettings.GetClientSettingFloat(ProfileSettingsKeys.HFNoiseVolume); uhfVol = profileSettings.GetClientSettingFloat(ProfileSettingsKeys.UHFNoiseVolume); vhfVol = profileSettings.GetClientSettingFloat(ProfileSettingsKeys.VHFNoiseVolume); } var decrytable = audio.Decryptable /* || (audio.Encryption == 0) <--- this test has already been performed by all callers and would require another call to check for STRICT_AUDIO_ENCRYPTION */; if (decrytable) { //adjust for LOS + Distance + Volume AdjustVolumeForLoss(audio); if (!skipEffects) { if (audio.ReceivedRadio == 0 || audio.Modulation == (short)RadioInformation.Modulation.MIDS) { if (profileSettings.GetClientSettingBool(ProfileSettingsKeys.RadioEffects)) { AddRadioEffectIntercom(audio); } } else { AddRadioEffect(audio); } } //final adjust AdjustVolume(audio); } else { AddEncryptionFailureEffect(audio); AddRadioEffect(audio); //final adjust AdjustVolume(audio); } if (newTransmission) { // System.Diagnostics.Debug.WriteLine(audio.ClientGuid+"ADDED"); //append ms of silence - this functions as our jitter buffer?? var silencePad = (AudioManager.OUTPUT_SAMPLE_RATE / 1000) * SILENCE_PAD; var newAudio = new short[audio.PcmAudioShort.Length + silencePad]; Buffer.BlockCopy(audio.PcmAudioShort, 0, newAudio, silencePad, audio.PcmAudioShort.Length); audio.PcmAudioShort = newAudio; } _lastReceivedOn = audio.ReceivedRadio; LastUpdate = DateTime.Now.Ticks; if (!passThrough) { JitterBufferProviderInterface.AddSamples(new JitterBufferAudio { Audio = SeperateAudio(ConversionHelpers.ShortArrayToByteArray(audio.PcmAudioShort), audio.ReceivedRadio), PacketNumber = audio.PacketNumber }); return(null); } else { //return MONO PCM 16 as bytes return(ConversionHelpers.ShortArrayToByteArray(audio.PcmAudioShort)); } //timer.Stop(); }