コード例 #1
0
        private void AddRadioEffectIntercom(ClientAudio clientAudio)
        {
            var mixedAudio = clientAudio.PcmAudioShort;

            for (var i = 0; i < mixedAudio.Length; i++)
            {
                var audio = mixedAudio[i] / 32768f;

                audio = _highPassFilter.Transform(audio);

                if (float.IsNaN(audio))
                {
                    audio = _lowPassFilter.Transform(mixedAudio[i]);
                }
                else
                {
                    audio = _lowPassFilter.Transform(audio);
                }

                if (!float.IsNaN(audio))
                {
                    // clip
                    if (audio > 1.0f)
                    {
                        audio = 1.0f;
                    }
                    if (audio < -1.0f)
                    {
                        audio = -1.0f;
                    }

                    mixedAudio[i] = (short)(audio * 32767);
                }
            }
        }
コード例 #2
0
        private void AddEncryptionFailureEffect(ClientAudio clientAudio)
        {
            var mixedAudio = clientAudio.PcmAudioShort;

            for (var i = 0; i < mixedAudio.Length; i++)
            {
                mixedAudio[i] = RandomShort();
            }
        }
コード例 #3
0
        private void AdjustVolume(ClientAudio clientAudio)
        {
            var audio = clientAudio.PcmAudioShort;

            for (var i = 0; i < audio.Length; i++)
            {
                var speaker1Short = (short)(audio[i] * clientAudio.Volume);

                audio[i] = speaker1Short;
            }
        }
コード例 #4
0
        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);

            //adjust for LOS + Distance + Volume
            AdjustVolume(audio);

            if (globalSettings.GetClientSettingBool(ProfileSettingsKeys.RadioEffects))
            {
                if (audio.ReceivedRadio == 0)
                {
                    AddRadioEffectIntercom(audio);
                }
                else
                {
                    AddRadioEffect(audio);
                }
            }

            if (newTransmission)
            {
                // 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      = DateTime.Now.Ticks;

            JitterBufferProviderInterface.AddSamples(new JitterBufferAudio
            {
                Audio =
                    SeperateAudio(ConversionHelpers.ShortArrayToByteArray(audio.PcmAudioShort),
                                  audio.ReceivedRadio),
                PacketNumber = audio.PacketNumber
            });

            //timer.Stop();
        }
コード例 #5
0
        private void AddRadioEffect(ClientAudio clientAudio)
        {
            var mixedAudio = clientAudio.PcmAudioShort;

            for (var i = 0; i < mixedAudio.Length; i++)
            {
                var audio = (double)mixedAudio[i] / 32768f;

                if (globalSettings.GetClientSettingBool(ProfileSettingsKeys.RadioEffectsClipping))
                {
                    if (audio > RadioFilter.CLIPPING_MAX)
                    {
                        audio = RadioFilter.CLIPPING_MAX;
                    }
                    else if (audio < RadioFilter.CLIPPING_MIN)
                    {
                        audio = RadioFilter.CLIPPING_MIN;
                    }
                }

                //high and low pass filter
                for (int j = 0; j < _filters.Length; j++)
                {
                    var filter = _filters[j];
                    audio = filter.ProcessSample(audio);

                    if (double.IsNaN(audio))
                    {
                        audio = (double)mixedAudio[j] / 32768f;
                    }
                    else
                    {
                        // clip
                        if (audio > 1.0f)
                        {
                            audio = 1.0f;
                        }
                        if (audio < -1.0f)
                        {
                            audio = -1.0f;
                        }
                    }
                }

                var shortAudio = (short)(audio * 32767);

                if (clientAudio.Modulation == FM &&
                    natoTone != null && globalSettings.GetClientSettingBool(ProfileSettingsKeys.NATOTone))
                {
                    shortAudio += natoTone[natoPosition];
                    natoPosition++;

                    if (natoPosition == natoTone.Length)
                    {
                        natoPosition = 0;
                    }
                }

                mixedAudio[i] = shortAudio;
            }
        }