Example #1
0
        public void OpenStream(ushort bufferSize, NetIQSampleFormat format)
        {
            //Validate
            int maxBufferSize = NetIQUtil.GetMaxBufferSize(format);

            if (bufferSize > maxBufferSize)
            {
                throw new Exception($"Max buffer size is {maxBufferSize}. Please lower the buffer size or make the sample format smaller.");
            }

            //Set
            streamSampleFormat = format;

            //Open the incoming buffer
            streamBuffer         = new byte[((int)format / 8) * 2 * bufferSize];
            streamBufferHandle   = GCHandle.Alloc(streamBuffer, GCHandleType.Pinned);
            streamBufferPtrByte  = (byte *)streamBufferHandle.AddrOfPinnedObject();
            streamBufferPtrShort = (short *)streamBufferHandle.AddrOfPinnedObject();
            streamBufferPtrFloat = (float *)streamBufferHandle.AddrOfPinnedObject();

            //Open the outgoing buffer
            sampleBuffer = UnsafeBuffer.Create(bufferSize, out sampleBufferPtr);

            //Get port
            int port = endpoint.Port + 1;

            //Open socket
            stream = new Socket(SocketType.Dgram, ProtocolType.Udp);
            stream.Bind(new IPEndPoint(IPAddress.Any, port));
            stream.BeginReceive(streamBuffer, 0, streamBuffer.Length, SocketFlags.None, OnStreamPacket, null);

            //Send command to start streaming
            NetIQCommandOpenStream cmd = new NetIQCommandOpenStream();

            cmd.StreamPort   = (ushort)port;
            cmd.BufferSize   = bufferSize;
            cmd.SampleFormat = format;
            cmd.SendOnSocket(sock);
        }
Example #2
0
        private void OnClientCommand(NetIQServerClient ctx, byte[] data, int len)
        {
            //Get opcode
            NetIQOpcode op = (NetIQOpcode)BitConverter.ToUInt16(data, 0);

            //Switch
            switch (op)
            {
            case NetIQOpcode.OPEN_STREAM:
                //Decode command
                NetIQCommandOpenStream cmd = new NetIQCommandOpenStream(data);

                //Get endpoint to send to
                IPAddress  addr = ((IPEndPoint)ctx.sock.RemoteEndPoint).Address;
                IPEndPoint ep   = new IPEndPoint(addr, cmd.StreamPort);

                //Make stream
                NetIQServerStream stream = new NetIQServerStream(ep, cmd.BufferSize, cmd.SampleFormat);

                //Apply to list
                lock (streams)
                {
                    //Remove existing stream, if any
                    if (ctx.stream != null)
                    {
                        streams.Remove(ctx.stream);
                    }

                    //Add
                    streams.Add(stream);
                    ctx.stream = stream;
                }
                break;

            default:
                throw new Exception("Unknown opcode!");
            }
        }