void rarch_remote_poll(rarch_remote_t *handle) { unsigned user; settings_t *settings = config_get_ptr(); input_remote_state_t *ol_state = input_remote_get_state_ptr(); for(user = 0; user < settings->input.max_users; user++) { if (settings->network_remote_enable_user[user]) { #if defined(HAVE_NETWORK_GAMEPAD) && defined(HAVE_NETPLAY) char buf[8]; ssize_t ret; fd_set fds; struct timeval tmp_tv = {0}; if (handle->net_fd[user] < 0) return; FD_ZERO(&fds); FD_SET(handle->net_fd[user], &fds); ret = recvfrom(handle->net_fd[user], buf, sizeof(buf) - 1, 0, NULL, NULL); if (ret > 0) parse_packet(buf, sizeof(buf), user); else #endif ol_state->buttons[user] = 0; } } }
void input_state_remote(int16_t *ret, unsigned port, unsigned device, unsigned idx, unsigned id) { input_remote_state_t *ol_state = input_remote_get_state_ptr(); if (!ol_state) return; switch (device) { case RETRO_DEVICE_JOYPAD: if (input_remote_key_pressed(id, port)) *ret |= 1; break; case RETRO_DEVICE_ANALOG: { unsigned base = 0; if (idx == RETRO_DEVICE_INDEX_ANALOG_RIGHT) base = 2; if (id == RETRO_DEVICE_ID_ANALOG_Y) base += 1; if (ol_state && ol_state->analog[base][port]) *ret = ol_state->analog[base][port]; } break; } }
bool input_remote_key_pressed(int key, unsigned port) { input_remote_state_t *ol_state = input_remote_get_state_ptr(); if (!ol_state) return false; return (ol_state->buttons[port] & (UINT64_C(1) << key)); }
static void input_remote_parse_packet(struct remote_message *msg, unsigned user) { input_remote_state_t *input_state = input_remote_get_state_ptr(); /* Parse message */ switch (msg->device) { case RETRO_DEVICE_JOYPAD: input_state->buttons[user] &= ~(1 << msg->id); if (msg->state) input_state->buttons[user] |= 1 << msg->id; break; case RETRO_DEVICE_ANALOG: input_state->analog[msg->index * 2 + msg->id][user] = msg->state; break; } }
void input_remote_poll(input_remote_t *handle, unsigned max_users) { unsigned user; settings_t *settings = config_get_ptr(); input_remote_state_t *input_state = input_remote_get_state_ptr(); for(user = 0; user < max_users; user++) { if (settings->bools.network_remote_enable_user[user]) { #if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) struct remote_message msg; ssize_t ret; fd_set fds; if (handle->net_fd[user] < 0) return; FD_ZERO(&fds); FD_SET(handle->net_fd[user], &fds); ret = recvfrom(handle->net_fd[user], (char*)&msg, sizeof(msg), 0, NULL, NULL); if (ret == sizeof(msg)) input_remote_parse_packet(&msg, user); else if ((ret != -1) || ((errno != EAGAIN) && (errno != ENOENT))) #endif { input_state->buttons[user] = 0; input_state->analog[0][user] = 0; input_state->analog[1][user] = 0; input_state->analog[2][user] = 0; input_state->analog[3][user] = 0; } } } }
static void parse_packet(char *buffer, unsigned size, unsigned user) { input_remote_state_t *ol_state = input_remote_get_state_ptr(); /* todo implement parsing of input_state from the packet */ ol_state->buttons[user] = atoi(buffer); }