예제 #1
0
        protected AudioProvider()
        {
            Decoder = OpusDecoder.Create(AudioManager.InputSampleRate, 1);
            Decoder.ForwardErrorCorrection = false;

            Settings = SettingsStore.Instance;
        }
예제 #2
0
        /* static void Main(string[] args)
         * {
         *   // Display the number of command line arguments.
         *   Console.WriteLine(args.Length);
         * }*/

        static void ToWav()
        {
            var filePath = $@"C:\Users\blabla\foo\bar\";
            var fileOgg  = "testAudio.ogg";
            var fileWav  = "testAudio.wav";

            using (FileStream fileIn = new FileStream($"{filePath}{fileOgg}", FileMode.Open))
                using (MemoryStream pcmStream = new MemoryStream())
                {
                    OpusDecoder       decoder = OpusDecoder.Create(48000, 1);
                    OpusOggReadStream oggIn   = new OpusOggReadStream(decoder, fileIn);
                    while (oggIn.HasNextPacket)
                    {
                        short[] packet = oggIn.DecodeNextPacket();
                        if (packet != null)
                        {
                            for (int i = 0; i < packet.Length; i++)
                            {
                                var bytes = BitConverter.GetBytes(packet[i]);
                                pcmStream.Write(bytes, 0, bytes.Length);
                            }
                        }
                    }
                    pcmStream.Position = 0;
                    var wavStream      = new RawSourceWaveStream(pcmStream, new WaveFormat(48000, 1));
                    var sampleProvider = wavStream.ToSampleProvider();
                    WaveFileWriter.CreateWaveFile16($"{filePath}{fileWav}", sampleProvider);
                }
        }
예제 #3
0
        public void Initialize()
        {
            _wasapiOut   = new WasapiOut();
            _opusDecoder = OpusDecoder.Create(48000, 1);

            //var waveForm = new WaveFormatExtensible(48000, 16, 1, Guid.Parse("00000003-0000-0010-8000-00aa00389b71"));
            var waveForm = new WaveFormat(48000, 16, 1);

            _writeableBufferingSource = new WriteableBufferingSource(waveForm)
            {
                FillWithZeros = true
            };

            IWaveSource waveSource;

            if (_triggerSingleBlockRead)
            {
                var singleBlockNotificationStream =
                    new SingleBlockNotificationStream(_writeableBufferingSource.ToSampleSource());
                singleBlockNotificationStream.SingleBlockRead += SingleBlockNotificationStreamOnSingleBlockRead;
                waveSource = singleBlockNotificationStream.ToWaveSource();
            }
            else
            {
                waveSource = _writeableBufferingSource;
            }

            _wasapiOut.Initialize(waveSource);
            _wasapiOut.Play();
        }
        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);
                }
            }
        }
예제 #5
0
 public Opus()
 {
     _decoder                = OpusDecoder.Create(SAMPLE_RATE, CHANNEL_COUNT);
     _encoder                = OpusEncoder.Create(SAMPLE_RATE, CHANNEL_COUNT, OpusPInvoke.Application.Voip);
     _encoder.InbandFec      = true;
     _encoder.LossPercentage = 30;
 }
예제 #6
0
        public static void Start(int Device)
        {
            DeviceId = Device;
            byte[] silence = new byte[10000];
            Array.Clear(silence, 0, 5000);
            client.PlayVoice = true;
            decoder          = OpusDecoder.Create(48000, 1);
            players          = new Dictionary <int, BufferedWaveProvider>();

            foreach (ClientData data in client.ClientList())
            {
                BufferedWaveProvider player = new BufferedWaveProvider(new WaveFormat(48000, 16, 1));
                players[data.ClientId] = player;
                player.AddSamples(silence, 0, 5000);
            }

            mixer = new MixingSampleProvider(players.Select((playr) => playr.Value.ToSampleProvider()));

            Out = new WaveOut();
            Out.DeviceNumber = Device;
            Out.Init(mixer);
            Out.Play();

            Active = true;
        }
예제 #7
0
        void StartEncoding()
        {
            _startTime       = DateTime.Now;
            _bytesSent       = 0;
            _segmentFrames   = 960;
            _encoder         = OpusEncoder.Create(48000, 1, FragLabs.Audio.Codecs.Opus.Application.Voip);
            _encoder.Bitrate = 8192;
            _decoder         = OpusDecoder.Create(48000, 1);
            _bytesPerSegment = _encoder.FrameByteCount(_segmentFrames);

            _waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback());
            _waveIn.BufferMilliseconds = 50;
            _waveIn.DeviceNumber       = comboBox1.SelectedIndex;
            _waveIn.DataAvailable     += _waveIn_DataAvailable;
            _waveIn.WaveFormat         = new WaveFormat(48000, 16, 1);

            _playBuffer = new BufferedWaveProvider(new WaveFormat(48000, 16, 1));

            _waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback());
            _waveOut.DeviceNumber = comboBox2.SelectedIndex;
            _waveOut.Init(_playBuffer);

            _waveOut.Play();
            _waveIn.StartRecording();

            if (_timer == null)
            {
                _timer          = new Timer();
                _timer.Interval = 1000;
                _timer.Tick    += _timer_Tick;
            }
            _timer.Start();
        }
예제 #8
0
        public Opus()
        {
            decoder = OpusDecoder.Create(48000, 1);

            encoder         = OpusEncoder.Create(48000, 1, OpusApplication.OPUS_APPLICATION_VOIP);
            encoder.Bitrate = 12000;
        }
예제 #9
0
    public void ConvertToWave(string inputFileOgg, string outputFileWav)
    {
        using (FileStream fileIn = new FileStream(inputFileOgg, FileMode.Open))
            using (MemoryStream pcmStream = new MemoryStream())
            {
                OpusDecoder decoder = OpusDecoder.Create(48000, 1);

                OpusOggReadStream oggIn = new OpusOggReadStream(decoder, fileIn);
                while (oggIn.HasNextPacket)
                {
                    short[] packet = oggIn.DecodeNextPacket();
                    if (packet != null)
                    {
                        for (int i = 0; i < packet.Length; i++)
                        {
                            var bytes = BitConverter.GetBytes(packet[i]);
                            pcmStream.Write(bytes, 0, bytes.Length);
                        }
                    }
                }
                pcmStream.Position = 0;
                var wavStream      = new RawSourceWaveStream(pcmStream, new WaveFormat(48000, 1));
                var sampleProvider = wavStream.ToSampleProvider();
                WaveFileWriter.CreateWaveFile16(outputFileWav, sampleProvider);
            }
    }
예제 #10
0
        public void StartPreview(int mic, MMDevice speakers)
        {
            try
            {
                _waveOut = new WasapiOut(speakers, AudioClientShareMode.Shared, true, 30);

                _buffBufferedWaveProvider           = new BufferedWaveProvider(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 16, 1));
                _buffBufferedWaveProvider.ReadFully = true;

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

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

                _waveOut.Init(_volumeSampleProvider);

                _waveOut.Play();
            }
            catch (Exception ex)
            {
                Logger.Error(ex, "Error starting audio Output - Quitting! " + ex.Message);

                MessageBox.Show($"Problem Initialising Audio Output! Try a different Output device and please post your client log on the forums", "Audio Output Error", MessageBoxButton.OK,
                                MessageBoxImage.Error);

                Environment.Exit(1);
            }

            try
            {
                //opus
                _encoder = OpusEncoder.Create(AudioManager.INPUT_SAMPLE_RATE, 1, FragLabs.Audio.Codecs.Opus.Application.Voip);
                _encoder.ForwardErrorCorrection = false;
                _decoder = OpusDecoder.Create(AudioManager.INPUT_SAMPLE_RATE, 1);
                _decoder.ForwardErrorCorrection = false;

                _waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback())
                {
                    BufferMilliseconds = AudioManager.INPUT_AUDIO_LENGTH_MS,
                    DeviceNumber       = mic
                };

                _waveIn.NumberOfBuffers = 2;
                _waveIn.DataAvailable  += _waveIn_DataAvailable;
                _waveIn.WaveFormat      = new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 16, 1);

                _waveIn.StartRecording();
            }
            catch (Exception ex)
            {
                Logger.Error(ex, "Error starting audio Input - Quitting! " + ex.Message);

                MessageBox.Show($"Problem Initialising Audio Input! Try a different Input device and please post your client log on the forums", "Audio Input Error", MessageBoxButton.OK,
                                MessageBoxImage.Error);

                Environment.Exit(1);
            }
        }
예제 #11
0
        public Voice()
        {
            OnStatusChanged += EventOnStatusChanged;

            _decoder         = OpusDecoder.Create((int)SampleRate, 1);
            _encoder         = OpusEncoder.Create((int)SampleRate, 1, Application.Voip);
            _encoder.Bitrate = 8192 * 2;
            _bytesPerSegment = _encoder.FrameByteCount(StreamSize);
        }
예제 #12
0
        public ConcentusCodec()
        {
            _encoder = OpusEncoder.Create(48000, 1, OpusApplication.OPUS_APPLICATION_AUDIO);

            SetBitrate(_bitrate);
            SetComplexity(_complexity);
            SetVBRMode(_vbr, _cvbr);
            _encoder.EnableAnalysis = true;
            _decoder = OpusDecoder.Create(48000, 1);
        }
예제 #13
0
        public NetworkAudioPlayer(IAudioClient receiver)
        {
            this.receiver = receiver;
            decoder       = OpusDecoder.Create(48000, 2);
            receiver.SetReceived(OnDataReceived);

            waveOut      = new WaveOut();
            waveProvider = new BufferedWaveProvider(new WaveFormat(48000, 16, 2));
            waveOut.Init(waveProvider);
            waveOut.Play();
        }
예제 #14
0
 public void Play_OPUS(int device_num, string ip)
 {
     decoder = OpusDecoder.Create(48000, 1);
     network.Initializecon(ip);
     network.Datalisten();
     playBuffer           = new BufferedWaveProvider(new WaveFormat(48000, 16, 1));
     waveOut              = new WaveOut(WaveCallbackInfo.FunctionCallback());
     waveOut.DeviceNumber = device_num;
     waveOut.Init(playBuffer);
     waveOut.Play();
 }
예제 #15
0
        private OpusDecoder GetMusicDecoder(ushort sender)
        {
            if (musicDecoders.TryGetValue(sender, out var decoder))
            {
                return(decoder);
            }

            decoder = OpusDecoder.Create(SampleRate, 2);
            musicDecoders.Add(sender, decoder);

            return(decoder);
        }
예제 #16
0
        private OpusDecoder GetVoiceDecoder(ushort sender)
        {
            if (voiceDecoders.TryGetValue(sender, out var decoder))
            {
                return(decoder);
            }

            decoder = OpusDecoder.Create(SampleRate, 1);
            voiceDecoders.Add(sender, decoder);

            return(decoder);
        }
예제 #17
0
        public void WriteToWavFile(string outputPath)
        {
            if (Encrypted)
            {
                throw new Exception("Audio stream is encrypted! Cannot proceed!");
            }

            bool        skipMode = true;
            int         audioOffset = 0, reckonOffset = 0;
            OpusDecoder decoder = OpusDecoder.Create(SampleRate, (int)Channels);

            using (WaveFileWriter writer = new WaveFileWriter(outputPath, new WaveFormat(SampleRate, 16, (int)Channels))) // 16-bit PCM
            {
                while (reckonOffset < ReckoningSize)
                {
                    int numPackets = Reckoning[reckonOffset];

                    // Checks if first bit is 1
                    if ((numPackets & 0x80) == 0x80)
                    {
                        numPackets = ((numPackets ^ 0x80) << 8) | Reckoning[++reckonOffset];
                    }

                    if (skipMode)
                    {
                        short[] outputShorts = new short[numPackets * FrameSize * Channels];
                        writer.WriteSamples(outputShorts, 0, outputShorts.Length);
                    }
                    else
                    {
                        int     packetOffset = 0;
                        short[] outputShorts = new short[FrameSize * Channels];

                        // Decoding loop
                        while (packetOffset++ < numPackets && audioOffset < PacketStreamSize)
                        {
                            int packetSize = ((PacketStream[audioOffset++] & 0x0F) << 8) | PacketStream[audioOffset++]; // 12-bit encoding

                            // Decodes OPUS packet
                            decoder.Decode(PacketStream, audioOffset, packetSize, outputShorts, 0, FrameSize);

                            // Writes frame
                            writer.WriteSamples(outputShorts, 0, outputShorts.Length);
                            audioOffset += packetSize;
                        }
                    }

                    reckonOffset++;
                    skipMode = !skipMode;
                }
            }
        }
예제 #18
0
파일: Codec.cs 프로젝트: orf53975/VoiceUp
        public short[] OpusDecoding(byte[] compressedPacket)
        {
            OpusDecoder decoder = OpusDecoder.Create(48000, 1);

            // Decoding loop
            int frameSize = 960; // must be same as framesize used in input, you can use OpusPacketInfo.GetNumSamples() to determine this dynamically

            short[] outputBuffer = new short[frameSize];

            int thisFrameSize = decoder.Decode(compressedPacket, 0, compressedPacket.Length, outputBuffer, 0, frameSize, false);

            return(outputBuffer);
        }
예제 #19
0
        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;
        }
예제 #20
0
        public void Write(Span <byte> data, Meta meta)
        {
            if (OutStream is null || !meta.Codec.HasValue)
            {
                return;
            }

            switch (meta.Codec.Value)
            {
            case Codec.SpeexNarrowband:
                throw new NotSupportedException();

            case Codec.SpeexWideband:
                throw new NotSupportedException();

            case Codec.SpeexUltraWideband:
                throw new NotSupportedException();

            case Codec.CeltMono:
                throw new NotSupportedException();

            case Codec.OpusVoice:
            {
                opusVoiceDecoder = opusVoiceDecoder ?? OpusDecoder.Create(48000, 1);
                var decodedData = opusVoiceDecoder.Decode(data, decodedBuffer.AsSpan(0, decodedBuffer.Length / 2));
                int dataLength  = decodedData.Length;
                if (!AudioTools.TryMonoToStereo(decodedBuffer, ref dataLength))
                {
                    return;
                }
                OutStream?.Write(decodedBuffer.AsSpan(0, dataLength), meta);
            }
            break;

            case Codec.OpusMusic:
            {
                opusMusicDecoder = opusMusicDecoder ?? OpusDecoder.Create(48000, 2);
                var decodedData = opusMusicDecoder.Decode(data, decodedBuffer);
                OutStream?.Write(decodedData, meta);
            }
            break;

            default:
                // Cannot decode
                return;
            }
        }
예제 #21
0
 // Token: 0x06004C38 RID: 19512 RVA: 0x00197928 File Offset: 0x00195D28
 private void CreateEncoders()
 {
     try
     {
         this._encoder         = OpusEncoder.Create(this._frequency, 1, this._app);
         this._encoder.Bitrate = this._bitrate;
         this._bytesPerSegment = this._encoder.FrameByteCount(this._segmentFrames);
         this._decoder         = OpusDecoder.Create(this._frequency, 1, this._bytesPerSegment);
         this._encoder.ForwardErrorCorrection = false;
         this._decoder.ForwardErrorCorrection = false;
         this._encoder.ExpectedPacketLossPct  = 0;
         this.isInitialized = true;
     }
     catch (DllNotFoundException ex)
     {
         throw ex;
     }
 }
예제 #22
0
        public void StartEncoding()
        {
            BotAudioProvider.StartListening();
            StartResponseCheckLoop();

            try
            {
                //opus
                _encoder = OpusEncoder.Create(InputSampleRate, 1, Application.Voip);
                _encoder.ForwardErrorCorrection = false;
                _decoder = OpusDecoder.Create(InputSampleRate, 1);
                _decoder.ForwardErrorCorrection = false;
            }
            catch (Exception ex)
            {
                Logger.Error(ex, $"{LogClientId}| Error starting audio Output - Quitting! " + ex.Message);

                Environment.Exit(1);
            }
        }
예제 #23
0
        public ClientAudioProvider()
        {
            _filters    = new OnlineFilter[2];
            _filters[0] =
                OnlineFilter.CreateBandpass(ImpulseResponse.Finite, AudioManager.OUTPUT_SAMPLE_RATE, 560, 3900);
            _filters[1] =
                OnlineFilter.CreateBandpass(ImpulseResponse.Finite, AudioManager.OUTPUT_SAMPLE_RATE, 100, 4500);

            JitterBufferProviderInterface =
                new JitterBufferProviderInterface(new WaveFormat(AudioManager.OUTPUT_SAMPLE_RATE, 2));

            SampleProvider = new Pcm16BitToSampleProvider(JitterBufferProviderInterface);

            _decoder = OpusDecoder.Create(AudioManager.OUTPUT_SAMPLE_RATE, 1);
            _decoder.ForwardErrorCorrection = false;
            _decoder.MaxDataBytes           = AudioManager.OUTPUT_SAMPLE_RATE * 4;

            _highPassFilter = BiQuadFilter.HighPassFilter(AudioManager.OUTPUT_SAMPLE_RATE, 520, 0.97f);
            _lowPassFilter  = BiQuadFilter.LowPassFilter(AudioManager.OUTPUT_SAMPLE_RATE, 4130, 2.0f);
        }
예제 #24
0
        public static void Main(string[] args)
        {
            string opusfile = @"C:\Users\Logan Stromberg\Desktop\Prisencolinensinainciusol.opus";
            string rawFile  = @"C:\Users\Logan Stromberg\Desktop\Prisencolinensinainciusol.raw";
            string rawFile2 = @"C:\Users\Logan Stromberg\Desktop\Prisencolinensinainciusol_out.raw";

            using (FileStream fileOut = new FileStream(opusfile, FileMode.Create))
            {
                OpusEncoder encoder = OpusEncoder.Create(48000, 2, OpusApplication.OPUS_APPLICATION_AUDIO);
                encoder.Bitrate = 96000;

                OpusTags tags = new OpusTags();
                tags.Fields[OpusTagName.Title]  = "Prisencolinensinainciusol";
                tags.Fields[OpusTagName.Artist] = "Adriano Celetano";
                OpusOggWriteStream oggOut = new OpusOggWriteStream(encoder, fileOut, tags);

                byte[]  allInput = File.ReadAllBytes(rawFile);
                short[] samples  = BytesToShorts(allInput);

                oggOut.WriteSamples(samples, 0, samples.Length);
                oggOut.Finish();
            }

            using (FileStream fileIn = new FileStream(opusfile, FileMode.Open))
            {
                using (FileStream fileOut = new FileStream(rawFile2, FileMode.Create))
                {
                    OpusDecoder       decoder = OpusDecoder.Create(48000, 2);
                    OpusOggReadStream oggIn   = new OpusOggReadStream(decoder, fileIn);
                    while (oggIn.HasNextPacket)
                    {
                        short[] packet = oggIn.DecodeNextPacket();
                        if (packet != null)
                        {
                            byte[] binary = ShortsToBytes(packet);
                            fileOut.Write(binary, 0, binary.Length);
                        }
                    }
                }
            }
        }
예제 #25
0
        public void Convert(Stream inputOgg, Stream outputWav)
        {
            using MemoryStream pcmStream = new();
            OpusDecoder       decoder   = OpusDecoder.Create(INPUT_FREQUENCY, CHANNELS);
            OpusOggReadStream oggReader = new OpusOggReadStream(decoder, inputOgg);

            while (oggReader.HasNextPacket)
            {
                short[] packet = oggReader.DecodeNextPacket();
                if (packet != null)
                {
                    for (int i = 0; i < packet.Length; i++)
                    {
                        var bytes = BitConverter.GetBytes(packet[i]);
                        pcmStream.Write(bytes, 0, bytes.Length);
                    }
                }
            }
            pcmStream.Position  = 0;
            using var wavStream = new RawSourceWaveStream(pcmStream, new WaveFormat(INPUT_FREQUENCY, CHANNELS));
            using var resampler = new MediaFoundationResampler(wavStream, new WaveFormat(OUTPUT_FREQUENCY, CHANNELS));
            WaveFileWriter.WriteWavFileToStream(outputWav, resampler);
        }
예제 #26
0
 private void button1_Click(object sender, EventArgs e)
 {
     //string localFileName = "a.ogg";
     //string localFileName2 = localFileName.Replace(".ogg", ".wav");
     //var vorbisStream = new NAudio.Vorbis.VorbisWaveReader(localFileName);
     //NAudio.Wave.WaveFileWriter.CreateWaveFile(localFileName2, vorbisStream);
     try
     {
         using (FileStream fileIn = new FileStream($"{this.fileOgg}", FileMode.Open))
             using (MemoryStream pcmStream = new MemoryStream())
             {
                 OpusDecoder       decoder = OpusDecoder.Create(48000, 1);
                 OpusOggReadStream oggIn   = new OpusOggReadStream(decoder, fileIn);
                 while (oggIn.HasNextPacket)
                 {
                     short[] packet = oggIn.DecodeNextPacket();
                     if (packet != null)
                     {
                         for (int i = 0; i < packet.Length; i++)
                         {
                             var bytes = BitConverter.GetBytes(packet[i]);
                             pcmStream.Write(bytes, 0, bytes.Length);
                         }
                     }
                 }
                 pcmStream.Position = 0;
                 var wavStream      = new RawSourceWaveStream(pcmStream, new WaveFormat(48000, 1));
                 var sampleProvider = wavStream.ToSampleProvider();
                 WaveFileWriter.CreateWaveFile16($"{this.fileWav}", sampleProvider);
             }
         MessageBox.Show("success!");
         this.wavlab.Text = this.fileWav;
     }
     catch (Exception ee) {
         MessageBox.Show(ee.ToString());
     }
 }
예제 #27
0
        public void StartEncoding()
        {
            BotAudioProvider = new BotAudioProvider(Client.DcsPlayerRadioInfo.radios[0], ResponseQueue)
            {
                SpeechRecognitionListener = { VoiceHandler = Client.SrsAudioClient, SrsClient = Client }
            };

            StartResponseCheckLoop();

            try
            {
                //opus
                _encoder = OpusEncoder.Create(InputSampleRate, 1, Application.Voip);
                _encoder.ForwardErrorCorrection = false;
                _decoder = OpusDecoder.Create(InputSampleRate, 1);
                _decoder.ForwardErrorCorrection = false;
            }
            catch (Exception ex)
            {
                Logger.Error(ex, $"{LogClientId}| Error starting audio Output - Quitting! " + ex.Message);

                Environment.Exit(1);
            }
        }
예제 #28
0
        public byte[] Decode(byte[] data, int length)
        {
            if (this.decoder == null)
            {
                lock (this.codecLock) {
                    if (this.decoder == null)
                    {
                        this.decoder = OpusDecoder.Create(this.settings.SampleRate, this.settings.Channels);
                    }
                }
            }

            int decodedLength;

            byte[] decoded = this.decoder.Decode(data, length, out decodedLength);
            if (decoded.Length != decodedLength)
            {
                byte[] final = new byte[decodedLength];
                Buffer.BlockCopy(decoded, 0, final, 0, decodedLength);
                decoded = final;
            }

            return(decoded);
        }
예제 #29
0
        public void StartEncoding(int mic, MMDevice speakers, string guid, InputDeviceManager inputManager,
                                  IPAddress ipAddress, int port, MMDevice micOutput, VOIPConnectCallback voipConnectCallback)
        {
            _stop = false;


            try
            {
                _micInputQueue.Clear();

                InitMixers();

                InitAudioBuffers();

                //Audio manager should start / stop and cleanup based on connection successfull and disconnect
                //Should use listeners to synchronise all the state

                _waveOut = new WasapiOut(speakers, AudioClientShareMode.Shared, true, 40);

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

                if (speakers.AudioClient.MixFormat.Channels == 1)
                {
                    if (_volumeSampleProvider.WaveFormat.Channels == 2)
                    {
                        _waveOut.Init(_volumeSampleProvider.ToMono());
                    }
                    else
                    {
                        //already mono
                        _waveOut.Init(_volumeSampleProvider);
                    }
                }
                else
                {
                    if (_volumeSampleProvider.WaveFormat.Channels == 1)
                    {
                        _waveOut.Init(_volumeSampleProvider.ToStereo());
                    }
                    else
                    {
                        //already stereo
                        _waveOut.Init(_volumeSampleProvider);
                    }
                }
                _waveOut.Play();

                //opus
                _encoder = OpusEncoder.Create(INPUT_SAMPLE_RATE, 1, Application.Voip);
                _encoder.ForwardErrorCorrection = false;
                _decoder = OpusDecoder.Create(INPUT_SAMPLE_RATE, 1);
                _decoder.ForwardErrorCorrection = false;

                //speex
                _speex = new Preprocessor(AudioManager.SEGMENT_FRAMES, AudioManager.INPUT_SAMPLE_RATE);
            }
            catch (Exception ex)
            {
                Logger.Error(ex, "Error starting audio Output - Quitting! " + ex.Message);


                ShowOutputError("Problem Initialising Audio Output!");


                Environment.Exit(1);
            }

            if (micOutput != null) // && micOutput !=speakers
            {
                //TODO handle case when they're the same?

                try
                {
                    _micWaveOut = new WasapiOut(micOutput, AudioClientShareMode.Shared, true, 40);

                    _micWaveOutBuffer           = new BufferedWaveProvider(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 16, 1));
                    _micWaveOutBuffer.ReadFully = true;
                    _micWaveOutBuffer.DiscardOnBufferOverflow = true;

                    var sampleProvider = _micWaveOutBuffer.ToSampleProvider();

                    if (micOutput.AudioClient.MixFormat.Channels == 1)
                    {
                        if (sampleProvider.WaveFormat.Channels == 2)
                        {
                            _micWaveOut.Init(sampleProvider.ToMono());
                        }
                        else
                        {
                            //already mono
                            _micWaveOut.Init(sampleProvider);
                        }
                    }
                    else
                    {
                        if (sampleProvider.WaveFormat.Channels == 1)
                        {
                            _micWaveOut.Init(sampleProvider.ToStereo());
                        }
                        else
                        {
                            //already stereo
                            _micWaveOut.Init(sampleProvider);
                        }
                    }

                    _micWaveOut.Play();
                }
                catch (Exception ex)
                {
                    Logger.Error(ex, "Error starting mic audio Output - Quitting! " + ex.Message);

                    ShowOutputError("Problem Initialising Mic Audio Output!");


                    Environment.Exit(1);
                }
            }


            if (mic != -1)
            {
                try
                {
                    _waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback())
                    {
                        BufferMilliseconds = INPUT_AUDIO_LENGTH_MS,
                        DeviceNumber       = mic,
                    };

                    _waveIn.NumberOfBuffers = 2;
                    _waveIn.DataAvailable  += _waveIn_DataAvailable;
                    _waveIn.WaveFormat      = new WaveFormat(INPUT_SAMPLE_RATE, 16, 1);

                    _tcpVoiceHandler =
                        new TCPVoiceHandler(_clientsList, guid, ipAddress, port, _decoder, this, inputManager, voipConnectCallback);
                    var voiceSenderThread = new Thread(_tcpVoiceHandler.Listen);

                    voiceSenderThread.Start();

                    _waveIn.StartRecording();


                    MessageHub.Instance.Subscribe <SRClient>(RemoveClientBuffer);
                }
                catch (Exception ex)
                {
                    Logger.Error(ex, "Error starting audio Input - Quitting! " + ex.Message);

                    ShowInputError("Problem initialising Audio Input!");

                    Environment.Exit(1);
                }
            }
        }
        public void StartPreview(int mic, MMDevice speakers)
        {
            try
            {
                _settings = SettingsStore.Instance;
                _waveOut  = new WasapiOut(speakers, AudioClientShareMode.Shared, true, 40);

                _buffBufferedWaveProvider =
                    new BufferedWaveProvider(new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 16, 1));
                _buffBufferedWaveProvider.ReadFully = true;
                _buffBufferedWaveProvider.DiscardOnBufferOverflow = true;

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

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

                if (speakers.AudioClient.MixFormat.Channels == 1)
                {
                    if (_volumeSampleProvider.WaveFormat.Channels == 2)
                    {
                        _waveOut.Init(_volumeSampleProvider.ToMono());
                    }
                    else
                    {
                        //already mono
                        _waveOut.Init(_volumeSampleProvider);
                    }
                }
                else
                {
                    if (_volumeSampleProvider.WaveFormat.Channels == 1)
                    {
                        _waveOut.Init(_volumeSampleProvider.ToStereo());
                    }
                    else
                    {
                        //already stereo
                        _waveOut.Init(_volumeSampleProvider);
                    }
                }

                _waveOut.Play();
            }
            catch (Exception ex)
            {
                Logger.Error(ex, "Error starting audio Output - Quitting! " + ex.Message);

                ShowOutputError("Problem Initialising Audio Output!");

                Environment.Exit(1);
            }

            try
            {
                _speex = new Preprocessor(AudioManager.SEGMENT_FRAMES, AudioManager.INPUT_SAMPLE_RATE);
                //opus
                _encoder = OpusEncoder.Create(AudioManager.INPUT_SAMPLE_RATE, 1,
                                              FragLabs.Audio.Codecs.Opus.Application.Voip);
                _encoder.ForwardErrorCorrection = false;
                _decoder = OpusDecoder.Create(AudioManager.INPUT_SAMPLE_RATE, 1);
                _decoder.ForwardErrorCorrection = false;

                _waveIn = new WaveIn(WaveCallbackInfo.FunctionCallback())
                {
                    BufferMilliseconds = AudioManager.INPUT_AUDIO_LENGTH_MS,
                    DeviceNumber       = mic
                };

                _waveIn.NumberOfBuffers = 2;
                _waveIn.DataAvailable  += _waveIn_DataAvailable;
                _waveIn.WaveFormat      = new WaveFormat(AudioManager.INPUT_SAMPLE_RATE, 16, 1);

                //debug wave file
                //_waveFile = new WaveFileWriter(@"C:\Temp\Test-Preview.wav", _waveIn.WaveFormat);

                _waveIn.StartRecording();
            }
            catch (Exception ex)
            {
                Logger.Error(ex, "Error starting audio Input - Quitting! " + ex.Message);
                ShowInputError();

                Environment.Exit(1);
            }
        }