public void Serialize([NotNull] NetworkWriter writer)
        {
            writer.WriteUInt16((ushort)Data.Count);
            writer.WriteBytes(Data.Array, Data.Offset, Data.Count);

            //Recyle array now that it has been serialized
            // ReSharper disable once AssignNullToNotNullAttribute (Justification: can't be null)
            SerializationBuffers.Put(Data.Array);
        }
Beispiel #2
0
        private void SendUnreliableDataPackets()
        {
            ArraySegment <byte> buffer;

            while (_queuedUnreliableTransmissions.Read(out buffer))
            {
                SentTraffic.Update(buffer.Count);

                SendUnreliable(buffer);

                _byteBufferPool.Put(buffer.Array);
            }
        }
Beispiel #3
0
        public void Send(float[] frame)
        {
            if (!_inputQueue.Write(frame))
            {
                Log.Warn("Failed to write microphone samples into input queue");

                //Increment a counter to inform the pipeline that a frame was lost
                Interlocked.Increment(ref _droppedFrames);

                //We failed to process this frame, recycle the buffer
                _inputBufferSource.Put(frame);
            }
            _threadEvent.Set();
        }
Beispiel #4
0
        private void Recycle([NotNull] byte[] array)
        {
            if (array == null)
            {
                throw new ArgumentNullException("array");
            }

            _sendBufferPool.Put(array);
        }
Beispiel #5
0
        public static void Serialize([NotNull] this NetworkWriter writer, DissonanceNetworkMessage value)
        {
            writer.WriteUInt16((ushort)value.Data.Count);
            writer.WriteBytes(value.Data.Array, value.Data.Offset, value.Data.Count);

            //Recyle array now that it has been serialized
            // ReSharper disable once AssignNullToNotNullAttribute (Justification: can't be null)
            SerializationBuffers.Put(value.Data.Array);
        }
        protected override void Update()
        {
            if (IsInitialized)
            {
                // Network is considered active if all of:
                // - Network explicitly claims it is active
                // - Server or client explicitly claim they are active
                // - Also if the client is active only say we're active once the client is non-null and has a non-null connection
                var networkActive = NetworkManager.singleton.isNetworkActive &&
                                    (NetworkServer.active || NetworkClient.active) &&
                                    (!NetworkClient.active || (NetworkManager.singleton.client != null && NetworkManager.singleton.client.connection != null));

                if (networkActive)
                {
                    // switch to the appropriate mode if we have not already
                    var server = NetworkServer.active;
                    var client = NetworkClient.active;

                    if (Mode.IsServerEnabled() != server || Mode.IsClientEnabled() != client)
                    {
                        if (server && client)
                        {
                            RunAsHost(Unit.None, Unit.None);
                        }
                        else if (server)
                        {
                            RunAsDedicatedServer(Unit.None);
                        }
                        else if (client)
                        {
                            RunAsClient(Unit.None);
                        }
                    }
                }
                else if (Mode != NetworkMode.None)
                {
                    // stop the network if unet has shut down
                    Stop();
                }

                //Send looped back packets
                for (var i = 0; i < _loopbackQueue.Count; i++)
                {
                    if (Client != null)
                    {
                        Client.NetworkReceivedPacket(_loopbackQueue[i]);
                    }

                    // Recycle the packet into the pool of byte buffers
                    // ReSharper disable once AssignNullToNotNullAttribute (Justification: ArraySegment array is not null)
                    _loopbackBuffers.Put(_loopbackQueue[i].Array);
                }
                _loopbackQueue.Clear();
            }

            base.Update();
        }
Beispiel #7
0
        private void RecycleFrame(VoicePacket packet)
        {
            // ReSharper disable once AssignNullToNotNullAttribute (Justification: Arr segment internal array is not null)
            _bytePool.Put(packet.EncodedAudioFrame.Array);

            if (packet.Channels != null)
            {
                packet.Channels.Clear();
                _channelListPool.Put(packet.Channels);
            }
        }
        public void Update()
        {
            //Reliable traffic to server
            using (var locker = _serverReliableQueue.Lock())
            {
                var q = locker.Value;
                for (var i = 0; i < q.Count; i++)
                {
                    var item = q[i];
                    _client.SendReliable(item);
                    _tmpRecycleQueue.Add(item.Array);
                }

                q.Clear();
            }

            //Unreliable traffic to server
            using (var locker = _serverUnreliableQueue.Lock())
            {
                var q = locker.Value;
                for (var i = 0; i < q.Count; i++)
                {
                    var item = q[i];
                    _client.SendUnreliable(item);
                    _tmpRecycleQueue.Add(item.Array);
                }

                q.Clear();
            }

            //P2P reliable traffic
            using (var locker = _reliableP2PQueue.Lock())
            {
                var q = locker.Value;
                for (var i = 0; i < q.Count; i++)
                {
                    var item = q[i];

                    //Send it
                    _client.SendReliableP2P(item.Key, item.Value);

                    //Recycle
                    _tmpRecycleQueue.Add(item.Value.Array);
                    item.Key.Clear();
                    _listPool.Put(item.Key);
                }

                q.Clear();
            }

            //P2P reliable traffic
            using (var locker = _unreliableP2PQueue.Lock())
            {
                var q = locker.Value;
                for (var i = 0; i < q.Count; i++)
                {
                    var item = q[i];

                    //Send it
                    _client.SendUnreliableP2P(item.Key, item.Value);

                    //Recycle
                    _tmpRecycleQueue.Add(item.Value.Array);
                    item.Key.Clear();
                    _listPool.Put(item.Key);
                }

                q.Clear();
            }

            //Recycle all the buffers
            using (var locker = _sendBufferPool.Lock())
            {
                for (var i = 0; i < _tmpRecycleQueue.Count; i++)
                {
                    var v = _tmpRecycleQueue[i];
                    if (v != null)
                    {
                        locker.Value.Put(v);
                    }
                }
            }
            _tmpRecycleQueue.Clear();
        }
Beispiel #9
0
        public DecoderPipeline(IVoiceDecoder decoder, uint frameSize, Action <DecoderPipeline> completionHandler, bool softClip = true)
        {
            _completionHandler = completionHandler;
            _inputBuffer       = new TransferBuffer <EncodedAudio>();
            _bytePool          = new ConcurrentPool <byte[]>(12, () => new byte[frameSize * decoder.Format.Channels * 4]); // todo wrong frame size (although it should still be large enough)

            _frameDuration     = TimeSpan.FromSeconds((double)frameSize / decoder.Format.SampleRate);
            _firstFrameArrival = null;
            _firstFrameSeq     = 0;

            var source  = new BufferedDecoder(decoder, frameSize, decoder.Format, frame => _bytePool.Put(frame.Data.Array));
            var ramped  = new VolumeRampedFrameSource(source, this);
            var samples = new FrameToSampleConverter(ramped);

            ISampleSource toResampler = samples;

            if (softClip)
            {
                toResampler = new SoftClipSampleSource(samples);
            }

            var resampled = new Resampler(toResampler);

            _source = source;
            _output = resampled;
        }