public void StartReaderWorker(RLocalClient client, RunWorkerCompletedEventHandler PacketHandler) { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandler((object sender, DoWorkEventArgs eargs) => { byte[] bytes = null; ReadBytes(client, out bytes); if (bytes == null) { return; } RLocalIncomingMessage message = new RLocalIncomingMessage(); message.bytes = bytes; message.playerId = client.playerId; message.type = BitConverter.ToInt32(bytes, 0); eargs.Result = message; }); worker.RunWorkerCompleted += PacketHandler; worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((object sender, RunWorkerCompletedEventArgs e) => { if (e.Result == null) { return; } worker.RunWorkerAsync(); }); worker.RunWorkerAsync(); }
private void PacketHandler(object sender, RunWorkerCompletedEventArgs eargs) { if (eargs.Result == null) { return; } RLocalIncomingMessage message = (RLocalIncomingMessage)eargs.Result; switch (message.type) { case 3: // Frame if (renderer == null) { break; } DecodeFrame(message.bytes, renderer.RenderBuffer); break; case 9: // Button RLocalButtonState buttonState = RLocalButtonState.FromPacket(message.bytes); vjoy.SetButtonState((uint)message.playerId, RLocalInput.MapIdToButton[buttonState.button], buttonState.value); break; case 20: // Audio Format var waveFormat = RLocalAudioCapture.WaveFormatFromPacket(message.bytes); audioPlayback = new RLocalAudioPlayback(waveFormat); break; case 21: // Audio Data if (audioPlayback == null) { break; } audioPlayback.Write(message.bytes, 8, message.bytes.Length - 8); break; case 45: // Video Format options.outWidth = BitConverter.ToInt32(message.bytes, 8); options.outHeight = BitConverter.ToInt32(message.bytes, 12); renderer = new RLocalRenderer(options.outWidth, options.outHeight); ThreadPool.QueueUserWorkItem((a) => { StartRender(); }); break; } ; }