private IEnumerator HostPollEvents()
    {
        while (true)
        {
            yield return(null);

            while (Parsec.HostPollEvents(0u, out Parsec.ParsecHostEvent hostEvent))
            {
                if (hostEvent.type == Parsec.ParsecHostEventType.HOST_EVENT_GUEST_STATE_CHANGE)
                {
                    Parsec.ParsecGuestState state = hostEvent.guestStateChange.guest.state;

                    switch (state)
                    {
                    case Parsec.ParsecGuestState.GUEST_CONNECTED:
                        Log($"Guest ID {hostEvent.guestStateChange.guest.id} connected.");

                        var deviceCollection = hostInput.AddGuest(hostEvent.guestStateChange.guest);
                        OnGuestConnected?.Invoke(hostEvent.guestStateChange.guest, deviceCollection);
                        break;

                    case Parsec.ParsecGuestState.GUEST_DISCONNECTED:
                        Log($"Guest ID {hostEvent.guestStateChange.guest.id} disconnected.");

                        OnGuestDisconnected?.Invoke(hostEvent.guestStateChange.guest);
                        break;

                    default:
                        break;
                    }
                }
                else if (hostEvent.type == Parsec.ParsecHostEventType.HOST_EVENT_USER_DATA)
                {
                    Log($"Received user data from {hostEvent.userData.guest.id}.");

                    string json = Parsec.HostGetUserDataString(hostEvent.userData.key);
                    OnReceiveUserData?.Invoke(hostEvent.userData.guest, json);
                }
            }
        }
    }