Ejemplo n.º 1
0
        public bool processBuffer(byte[] rxBuf, out byte[] pcm16)
        {
            int len;

            pcm16 = null;
            try
            {
                pcm16 = decoder.Decode(rxBuf.Skip(1).ToArray(), rxBuf.Length - 1, out len);
                pcm16 = pcm16.Take(len).ToArray();
                return(true);
            }
            catch { }
            return(false);
        }
Ejemplo n.º 2
0
        public void AudioReceived(IPPacket p)
        {
            if (_audioStream == null || IsBufferNearlyFull)
            {
                return;
            }

            p.Read(out int frames, out bool s);
            p.Read(out int l, out s);
            byte[] arr = new byte[l];
            p.Read(ref arr, out s);

            _syncContext.Post(o =>
            {
                arr = _decoder.Decode(arr, frames, out l);
                _audioStream.AddSamples(arr, 0, l);
                //_audioStream.BufferedDuration.Print();

                if (_audioStream.BufferedDuration.TotalSeconds < 0.01f)
                {
                    PauseAudio();
                }
                else if (_audioStream.BufferedDuration.TotalSeconds > fullSpeed)
                {
                    PlayAudio();
                }

                _playbackRate += Math.Min(1, Math.Max(0.75f, (float)_audioStream.BufferedDuration.TotalSeconds / fullSpeed));
                reads++;

                _speedControl.PlaybackRate = _playbackRate / reads;
                //_speedControl.PlaybackRate.Print();

                if (reads > 20)
                {
                    reads         /= 2;
                    _playbackRate /= 2;
                }
            }, null);
        }
Ejemplo n.º 3
0
        public OpusWaveProvider(Stream stream, uint length)
        {
            using (MemoryStream temp = new MemoryStream())
                using (BinaryWriter writer = new BinaryWriter(temp))
                    using (OpusDecoder decoder = OpusDecoder.Create(48000, 1))
                        using (BinaryReader reader = new BinaryReader(stream))
                        {
                            //long offset = stream.Position;
                            for (int i = 0; i < length; i++)
                            //while (stream.Position < length)
                            {
                                int    framesize = (int)reader.ReadUInt32();
                                byte[] frame     = reader.ReadBytes(framesize);

                                int    outputlen;
                                byte[] output = decoder.Decode(frame, framesize, out outputlen);
                                writer.Write(output, 0, outputlen);
                            }

                            internalstream = new MemoryStream(temp.ToArray());
                        }
        }
Ejemplo n.º 4
0
        void _waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            byte[] soundBuffer = new byte[e.BytesRecorded + _notEncodedBuffer.Length];
            for (int i = 0; i < _notEncodedBuffer.Length; i++)
            {
                soundBuffer[i] = _notEncodedBuffer[i];
            }
            for (int i = 0; i < e.BytesRecorded; i++)
            {
                soundBuffer[i + _notEncodedBuffer.Length] = e.Buffer[i];
            }

            int byteCap         = _bytesPerSegment;
            int segmentCount    = (int)Math.Floor((decimal)soundBuffer.Length / byteCap);
            int segmentsEnd     = segmentCount * byteCap;
            int notEncodedCount = soundBuffer.Length - segmentsEnd;

            _notEncodedBuffer = new byte[notEncodedCount];
            for (int i = 0; i < notEncodedCount; i++)
            {
                _notEncodedBuffer[i] = soundBuffer[segmentsEnd + i];
            }

            for (int i = 0; i < segmentCount; i++)
            {
                byte[] segment = new byte[byteCap];
                for (int j = 0; j < segment.Length; j++)
                {
                    segment[j] = soundBuffer[(i * byteCap) + j];
                }
                int    len;
                byte[] buff = _encoder.Encode(segment, segment.Length, out len);
                _bytesSent += (ulong)len;
                buff        = _decoder.Decode(buff, len, out len);
                _playBuffer.AddSamples(buff, 0, len);
            }
        }