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); }
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!"); } }